Designbeschreibung
Seit Juli 2003 gibt es eine neue Architektur des Diff.-/Refl.-Subsystems (siehe dort)
Komponente:
Diffraktometrie/Reflektometrie Ablauf und Einstellungen
Jens Ullrich, Stephan Berndt
Status: beendet
Gliederung
2. Abgrenzung der Implementation der Komponente
3. Dokumentation des vorgefundenen Zustandes
3.3. globale Variablen und Konstanten
4. Vererbungs- und Interaktionsbeziehungen der Klassen
5. Beschreibung
wichtiger dynamischer Abläufe
6. Bewertung des
vorgefundenen Designs
7. Änderungen am Design durch die Erweiterungen
7.4. Globale Variablen und Konstanten
7.5.1.
Klasse TSetupDynamicStep
7.8. Interaktionsdiagramm ContinuousScan
Die hier
vorliegende Designbeschreibung wurde auf der Grundlage der erstellten Dokumente
‚Verhaltensspezifikation Linescan’ und ‚Verhaltensspezifikation Areascan’ sowie
der von uns kommentierten Quelltexte angefertigt. Diese Dokumente beschäftigen
sich mit den Funktionen des Linescan-Fensters bzw. Areascan-Fensters.
Die Designbeschreibung gliedert sich dabei
in 5 Teile. Die ersten 4 Kapitel beschäftigen sich mit dem Ausgangszustand, im
letzten Kapitel wird auf die Programmerweiterungen näher eingegangen.
Im ersten Teil werden die für die
Diffraktometrie/Reflektometrie relevanten Quelltextdateien und die darin
definierten Klassen und deren Funktionen innerhalb des XCTL-Programms kurz
aufgeführt und deren Umfang in LOC angegeben.
Der nächste Abschnitt beschäftigt sich mit
der Dokumentation des IST-Zustandes. Darin findet sich eine Beschreibung aller
verwendeten Typen, Strukturen, globalen Variablen sowie Konstanten. Der größte
Teil des Abschnitts beschäftigt sich mit den für die
Diffraktometrie/Reflektometrie relevanten Klassen, ihren Attributen und
Methoden.
Der dritte Teil enthält eine Beschreibung
der Veerbungs- und Interaktionsbeziehungen der Klassen.
Im Abschnitt "Beschreibung wichtiger
dynamischer Abläufe" wird der dynamische Ablauf am Beispiel eines
Linescans im Standardmodus mit Hilfe von Sequenzdiagrammen gezeigt.
Im folgenden Abschnitt findet eine
Bewertung der vorgefundenen Quellen bzgl. OOP aus unserer Sicht statt.
Im letzten Abschnitt werden Änderungen am
Design betrachtet, die im Zusammenhang mit unseren Änderungen an den Quellen
stehen.
Durch das Nachvollziehen der Vorgänge während des
Ablaufs des XCTL-Programms haben wir die für uns wichtigen Klassen und damit
die für uns wichtigen Dateien ermittelt. Dabei haben uns die in den meisten
Fällen recht aussagekräftigen Dateinamen weitergeholfen. Die für die
Diffraktometrie/Reflektometrie wesentlichen Dateien sind m_steerg.cpp, m_steerg.h,
m_scan.cpp, m_arscan.cpp , m_xscan.h, m_curve.cpp,
m_curve.h, m_data.cpp und m_data.h, wobei nur die Dateien m_xscan.h,
m_scan.cpp und m_arscan.cpp exklusiv von der
Diffraktometrie/Reflektometrie verwendet werden.
Außer der Borland C++ 4.5 Umgebung und den
integrierten Werkzeugen kamen keine weiteren Tools zum Einsatz. In der folgenden
Tabelle sind die in den jeweiligen Dateien für die
Diffraktometrie/Reflektometrie wichtigen Klassen sowie wesentliche ihrer
Teilfunktionen beschrieben:
|
LOC |
Datei |
Klassen |
Beschreibung |
|
1223 |
m_scan |
TScanParameters |
Parameterinitialisierung
für Linescan |
|
3232 |
m_arscan |
TAreaScanParameters |
Parameterinitialisierung
für Areascan |
|
324 |
m_steerg |
TCmd |
Basisklasse
aller Kommandos |
|
791 |
m_curve |
TCurve |
zum Ablegen und
zum Verändern einer Folge von Meßwerten |
|
100 |
m_data |
TPlotData |
(Teilfunktionen)Kurve
fixieren, fix. Kurve löschen, speichern |
|
520 |
Headerdateien |
Weis |
m_xscan.h,
m_curve.h, m_data.h, m_steerg.h |
Tab. 4.1: Betrachtete Dateien
und ihre Funktionen
Insgesamt beläuft sich der von
uns bearbeitete Quelltext auf ca. 6000 LOC .
Der Großteil
der Implementation zur Diff./Refl. befindet sich im Modul Develop.exe, wobei
sich in m_scan.cpp die Linescan-Steuerung, in m_arscan.cpp die
Areascan-Steuerung und in m_steerg.cpp die zugehörigen
Hardwaresteuerungs-Kommandos befinden. Außer der bildnerischen Darstellung
(m_data.cpp, m_main.cpp) sind in diesen Dateien alle für den Line- bzw.
Areascan wichtigen Funktionalitäten enthalten.
In der Splib.dll befindet sich
die Datei m_curve.cpp, welche die Meßwerte der Scans verwaltet. Da diese auch
von anderen Modulen, z.B. Counters.dll, benutzt wird, ist die Unterbringung
dieser Datei in einem Extra-Modul sinnvoll.
comhead.h
TPsdDataTyp
Beschreibung:
Dieser Typ dient zur Identifizierung der Art der kontinuierlichen
Anzeige eines Psd-Spektrums.
Definition:
typedef enum
{
PsdEnergyData = 3000, // Energiespektrum
PsdPositionData // Impulsspektrum
} TPsdDataTyp;
TNotifyValue
Beschreibung:
Dieser Typ dient zur Festlegung der Zusatzinformation, die zu jedem
Spektrum einer Datenbasis angelegt werden soll.
Definition:
typedef enum
{
MonitorIntensity = 1, // Monitor-Intensitaet
AbsorberPosition, // Position des Absorbers
PeakPosition, // Position der hoechsten Intensitaet
IntegralIntensity, // Integrale Intensitaet
MeasurementTime // reale Messzeit
} TNotifyValue;
TSaveFormat
Beschreibung:
Dieser Typ gibt an, in welchem Format und welche der Messdaten abgelegt
werden sollen.
Definition:
typedef enum
{
StandardFile = 1, // als einziges implementiert
// bei LineScan Wertetripel,
// bei AreaScan nur Intensitaeten
ShiftedStandard,
Tripel, Tupel,
Bitmap, ShiftedBitmap,
Tiff8, Tiff12, RAW8, RAW12
} TSaveFormat;
TxScanType
Beschreibung:
Dieser Typ gibt an, welcher Scan-Modus gewählt ist und was für eine Art von Scan
demzufolge durchgeführt werden soll, gerade durchgeführt wird oder durchgeführt
wurde.
Definition:
typedef enum
{
StandardScan = 1, //! Schrittw. Scan ueber eine ausgewaehlte Achse
//! (Line- und Areascan)
Omega2ThetaScan, //! Schrittw. Scan ueber die Omega- und Thetaachse
//! Gleichzeitig (Line- und Areascan)
ContinuousScan, //! Kontinuierl. Scan ueber eine Achse mit 0-dim.
//! Detektor (nur LineScan)
PsdEnergyScan, //! nicht verwendet
PsdPositionScan, //! nicht verwendet
Omega2ThetaScanList, //! nicht verwendet
ScanList//! nicht verwendet
} TxScanType;
THowReadOutPsd
Beschreibung:
Gibt Art des Auslesens für den Psd-Detektor an.
Definition:
typedef enum
{
FinalRead = 1,//! auslesen am Ende der Messzeit
FirstRead, //! erstes Auslesen waehrend der Messzeit
AccumulationRead,//! akkumuliertes Auslesen
IntermediateRead//! auslesen waehrend der Messzeit
} THowReadOutPsd;
m_curve.h
TOrder
Beschreibung:
Gibt an nach welchem Kriterium die Kurve sortiert ist.
Definition:
typedef enum{
X_Sorted = 1,
Y_Sorted,
Z_Sorted,
Incoming
} TOrder;
TCFault
Beschreibung:
Fehlertype bei Datenbasis:
MaxScanExceeded gibt dabei an, ob die max. Anzahl speicherbarer
Kurven erreicht ist und NoMemory, dass kein ausreichender
Speicherplatz verfügbar ist.
Definition:
typedef enum{
MaxScanExceeded = 1,
NoMemory
}TCFault;
CPoint
Beschreibung:
Gibt die Struktur eines Elements der Kurve an.
Definition:
struct CPoint{
float Pt[ 3 ]; //enthaelt x,y und z-Wert
BOOL Valid; // gibt an, ob Wert gueltig
};
LPCPoint
Beschreibung:
Definiert einen Zeiger auf ein Element der Kurve.
Definition:
typedef CPoint * LPCPoint
LPCurve
Beschreibung:
Definiert einen Zeiger auf eine Kurve der Datenbasis.
Definition:
typedef TCurve FAR * LPCurve
LPDataBase
Beschreibung:
Definiert einen Zeiger auf eine Datenbasis.
Definition:
typedef TDataBase FAR * LPDataBase
m_arscan.cpp
TData
Beschreibung:
Dieser Typ dient der Speicherung der Punkte eines Schnittes durch
die Datenbasis.
Definition:
typedef struct
{
double dX,dY, // Positionsunterschied
dOmega,dTheta; // Omega-/ Thetaposition
float fDelta, // Intensitaetsunterschied
fIntensity; // Intensitaetswert
} TData;
3.3. globale Variablen und Konstanten
m_steerg.cpp
TDevice* Monitor
Zeiger auf den ausgewählten Monitordetektor.
BOOL bMonitorUsed = FALSE
Zeigt an, ob ein Monitor-Detektor benutzt werden soll.
Zunächst erst einmal auf FALSE gesetzt.
static DWORD dwStartTimeTicks
Variable gibt den Zeitpunkt des ersten Scan-Schritts an.
Sie wird zur Bestimmung der Scan-Zeit(Scan-Dauer) verwendet.
m_xscan.h
const int NoAskForSave = 0x9900
Konstante für Speichern unter aktuellem Dateinamen
const int SaveWithNewName = 0x9901
Konstante für Speichern mit vorherigem Aufruf der 'Sichern unter ...'-Box
const int nMaxScaleIdx = 10
Anzahl der maximal unterschiedlichen Schrittweiten
(dynamische Schrittweitensteuerung)
m_scan.cpp
int TMDIWindow::WindowId = 0
Gehört eigentlich in die m_main.cpp.
Gibt die Anzahl der geöffneten RTK-Fenster an.
extern TMain Main
Hiermit wird das Objekt Main bekannt gemacht.
extern LPDList lpDList
Hierbei handelt es sich um einen Zeiger auf das TDList-Objekt
(Liste aller verfügbaren Detektoren).
extern TSteering Steering
Hiermit wird das Objekt Steering bekannt gemacht.
static int nScanTask
Variable fuer ContinuousScan, bisher nicht benutzt
static BOOL bScanSetupOk = FALSE
zeigt an, ob eine Einstellungsbox aufgerufen wurde
(Voraussetzung zum Start eines Stepscan)
m_curve.cpp
#define CINT const int
const int TDataBase::nMaxCurve = 1000
Konstante, die die maximale Anzahl der zu verwaltenden Kurven in einer
Datenbasis anzeigt.
Der Wert wird auf 1000 festgelegt.
static CINT GrowUnit = 50
Gibt die Anzahl der Punkte an, um die eine Kurve erweitert wird, wenn der
bereits reservierte Speicher zu klein wird. Dementsprechend wird neuer
Speicher reserviert.
int TCurve::LastId = -1
Gibt den aktuell höchsten Kurvenindex an (aktuelle Anzahl der Kurven
in der Datenbasis).
Der Wert wird bei Initialisierung auf -1 gesetzt.
extern BOOL bModulLoaded
Diese Variable wird scheinbar nicht verwendet.
LPDataBase lpDataBase
Zeiger auf Datenbasis
m_arscan.cpp
extern TMain Main
Hiermit wird das Objekt Main bekannt gemacht.
extern LPDList lpDList
Hierbei handelt es sich um einen Zeiger auf das TDList-Objekt
(Liste aller verfügbaren Detektoren).
extern TSteering Steering
Hiermit wird das Objekt Steering bekannt gemacht.
extern LPDataBase lpDBase
Definiert einen Zeiger auf die Datenbasis.
extern TModelessDlg* TheModeless
Definiert einen Zeiger auf eine nichtmodale Dialogbox (z.B. ChooseScan)
char szMsgFailure[] = "Failure"
char szMessage[] = "Message"
char szMsgLine001[] ...016[] = "..."
Hierbei handelt es sich um einige Fehlermeldungs- und Informationstexte.
char aTempPath[120] = {0}
Enthält den Datenpfad für die Speicherung der Spektren bei externer
Synchronisation.
char aTempName[12] = {0}
Enthält den Dateinamen für die Speicherung der Spektren bei externer
Synchronisation.
static int nLinePoints = 100
Wird bei DataAquisition verwendet.
Enthält die Anzahl der Punkte auf der Linie des Schnittes.
static int nEnvironment = 0
Wird bei DataAquisition verwendet.
Wert zwischen 0 und 3, der angibt, wieviele Punkte in der Umgebung des
Schnittes mitberücksichtigt werden sollen.
static char DataFile[40]
Wird bei DataAquisition verwendet.
Gibt Namen der Datei an, unter dem der Schnitt gespeichert werden soll.
float PointX[2],PointY[2]
Wird bei DataAquisition verwendet.
Gibt den Anfangs- bzw. Endpunkt des Schnittes an.
int nMouseAction = 0
Gibt an, ob linker Maustastenklick Intensität (=0) angeben oder
Anfangspunkt des Schnittes (=100) festlegen soll.
static TData* lpData
Wird bei DataAquisition verwendet.
Zeiger auf den Datenbereich, der die Werte des Schnittes enthält.
static BOOL bAquisitionActive = FALSE
Wird bei DataAquisition verwendet.
Gibt an, ob gerade ein Schnitt ermittelt werden soll.
static int nSetMarker = 0
Wird bei DataAquisition verwendet.
Bedeutung unklar, wird einmal auf 0 gesetzt und nie wieder benutzt.
static BOOL bSetDXZero = FALSE
Wird bei DataAquisition verwendet.
Gibt an, ob ein vertikaler Schnitt bestimmt werden soll.
static BOOL bSetDYZero = FALSE
Wird bei DataAquisition verwendet.
Gibt an, ob ein horizontaler Schnitt bestimmt werden soll.
static int nFirstReadColumn = 0
Gibt den ersten Wert des Spektrums an (entspricht Kanalnummer des Psd).
static int nLastReadColumn = 0
Gibt den letzten Wert des Spektrums an (entspricht Kanalnummer des Psd).
static float fPsdRange
Gibt den Winkelbereich an, den alle Kanäle des Psd abdecken.
static char szODF[7],szOWF[7],szTDF[7],szTWF[7]
Gibt Formatstrings für Genauigkeit der Winkelangaben des jeweiligen
Motors (Omega/Theta) an.
static TUnitType eThetaUnitType = Grad
Gibt Einheit des Theta-Motors an.
3.4. Klassen
3.4.1 TCurve
1. UML-Klassendiagramm
2. Klassenhierarchie
von keiner Klasse abgeleitet
3. Friends
keine
4. Files
Klassendeklaration: m_curve.h
Implementation: m_curve.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse ist zum Verwalten einer Folge von Messwerten zuständig. In
dieser Datenstruktur werden außer bei der Scanreportkurve immer eine
Folge von Motorpositionen mit den dazugehörigen Intensitätswerten
abgelegt. Die Klasse liefert mehrere Methoden zur Ein-/Ausgabe der
Kurvenwerte sowie zur Manipulation und Informationssuche.
6. Beschreibung der Attribute
Min[ 3 ]
enthält die Minima der 3 Achsen [0=x,1=y,2=z]
Max[ 3 ]
enthält die Maxima der 3 Achsen [0=x,1=y,2=z]
hMemX
Handle auf Speicherobjekt (x-Werte)
hMemY
Handle auf Speicherobjekt (y-Werte)
hMemZ
Handle auf Speicherobjekt (z-Werte)
hMemV
Handle auf Speicherobjekt (valid)
eOrder
Gibt an in welcher Ordnung die Kurve vorliegt.
(X_sorted/Y_sorted/Z_sorted oder Incoming)
bStreamOpen
Zeigt an, ob diese Kurve gerade im Speicher fixiert ist. Nur
dann sind Zugriffe auf einzelne Werte der Kurve möglich.
Id
bezeichnet diese Kurve
bEnd
Ende-Erkennung der Kurve
Sie gibt an, ob man das letzte Wertetripel der Kurve erreicht
hat.
LastId
Anzahl der genutzten Kurven im Programm
MaxPointIdx
indiziert den letzten Eintrag(Wertetripel) der Kurve
MaxMemIdx
Indiziert den maximal möglichen Eintrag der Kurve, für den
bereits Speicher reserviert wurde.
ActualIdx
indiziert den aktuellen Eintrag
lpPX
Zeiger auf Datenfeld von X
Hier sind alle X-Werte der Kurve abgelegt.
lpPY
Zeiger auf Datenfeld von Y
Hier sind alle Y-Werte der Kurve abgelegt.
lpPZ
Zeiger auf Datenfeld von Z
Hier sind alle Z-Werte der Kurve abgelegt.
lpPV
Zeiger auf Datenfeld von Validate
Hier sind alle Valid-Werte der Kurve abgelegt.
Zeigt an, ob die X,Y und Z Werte mit gleichem Index in ihrem
jeweiligen Datenfeld gültig ist oder nicht.
lpFastPX
Zeiger auf Datenfeld von X
(wird nicht verwendet)
lpFastPY
Zeiger auf Datenfeld von Y
(wird nicht verwendet)
lpFastPZ
Zeiger auf Datenfeld von Z
(wird nicht verwendet)
lpFastPV
(wird nicht verwendet)
7. Beschreibung der Methoden
TCurve( int )
Der Parameter gibt die Anzahl der Messpunkte der Kurve an, die
'vorläufig' geplant sind (kann später noch geändert werden).
~TCurve
PAdd
hängt einen Punkt(Tripel) an die Kurve an
PGet
liest das Wertetripel der Kurve aus, das durch den ActuelIdx
indiziert wird
FastPAdd
wie PAdd (um schneller hintereinander Punkte anzuhängen)
z.B. beim Laden einer Kurve aus einer Datei
Diese Methode darf nur verwendet werden, wenn zu einem früheren
Zeitpunkt FastOpen aufgerufen wurde. Seitdem darf FastClose
nicht aufgerufen worden sein.
FastPGet
wie PGet (für schnellen Zugriff)
z.B. beim Speichern der Kurve in eine Datei
Diese Methode darf nur verwendet werden, wenn zu einem früheren
Zeitpunkt FastOpen aufgerufen wurde. Seitdem darf FastClose
nicht aufgerufen worden sein.
FastOpen
'Öffnet' Kurve, macht Zugriffe auf Kurvenwerte
erst möglich. Es werden die X,Y,Z,V Datenbereiche im Hauptspeicher
fixiert.
FastClose( void );
'schließt' Kurve, kein Zugriff auf die Punkte möglich
Die X,Y,Z,V Datenbereiche im Hauptspeicher können wieder vom
Betriebssystem verschoben werden.
ValueAdd
Addiert einen Wert zum Y-Wert des Wertetripels dazu, welches
durch ActuelIdx indiziert wird.
BackStep
geht in der Kurve einen Punkt zurück
Verringert den ActuelIdx um eins, wenn möglich.
New
setzt Kurve auf Initialwerte zurück
DeleteUnderGround
Markiert alle Punkte der Kurve als ungültig, deren
Y-Wert kleiner gleich (Level*100) Prozent von der maximaler
Intensität der Kurve sind.(Level wird als Parameter übergeben)
DeleteFlanks
Markiert alle Punkte der Kurve als ungültig, lässt nur lokale
Maxima übrig
(Methode nicht fertig impl.)
Save(LPCSTR)
legt alle (x,y,z)-Tripel der Kurve in Datei mit angegebenen
Namen(Parameter) ab
(wird nicht verwendet)
Save( LPCSTR, int, int );
Speichert Kurve in angegebene Datei (1.Parameter). 2. Parameter gibt
Art der Speicherung an (nur eine Option implementiert, diese speichert
nur die Y-Werte), 3. Parameter nicht benutzt
SetLastPoint
(nicht implementiert)
SetOrder
Setzt Ordnung, nach welcher die Kurve geordnet ist
(x,y,z oder Messreihenfolge)
SetPP
Setzt den aktuellen Punktindex(ActuelIdx) auf den angegebenen
Wert, falls möglich.
bei unzulässiger Position auf 1. bzw. letzten zulässigen Wert
GetId
liefert Id (Nr.) der Kurve als Rückkehrcode
(wird nicht verwendet)
GetPP
liefert aktuelle Position des aktuellen Punktindex der Kurve
als Rückkehrcode (wird nicht verwendet)
GetLastId
liefert die Anzahl der aktuell im Speicher befindlichen Kurven
als Rückkehrcode (wird nicht verwendet)
GetPNumber
liefert die Anzahl der Wertetripel der Kurve als Rückkehrcode
GetGravityCenter
berechnet eine durch den letzen Parameter bestimmte Funktion
(max. Intensität/Schwerpunkt)
1.Param(Ausgabe) x
enthält nach Aufruf je nach Funktion berechneten Wert
2.Param(Ausgabe) y
enthält nach Aufruf je nach Funktion berechneten Wert
3.Param(Ausgabe) z
enthält nach Aufruf je nach Funktion berechneten Wert
4.Param(Eingabe) func
ermöglicht verschiedene Funktionen aufzurufen
(nur 2 implementiert)
func=2 dann x,y,z-Tripel ermitteln, für das y (die
Intensität) maximal ist
func<>2 dann x,y,z Schwerpunkt der Kurve ermitteln
(diese Funktion wird nicht benutzt)
GetValueByValue( float, float&, float& )
liefert den in der Kurve vorhandenen dem Parameter 'search'
nähsten X-Wert(den Indexwert) als Rückkehrcode zurück und den
zugehörigen Y-Wert sowie den Abstand zwischen X-Wert und search
1.Parameter (Eingabe) search
in der Kurve soll nach einem X-Punkt gesucht werden, der zu
search den geringsten Abstand besitzt
2.Parameter (Ausgabe) delta
enthält nach dem Aufruf den Abstand von search zum nähsten X-
Wert
3.Parameter (Ausgabe) value
enthält nach dem Aufruf den zum nähsten X-Wert gehörigen Y-
Wert(Intensität)
Rückkehrcode ist der Index für den gilt X[Index] ist nähster X-
Wert zum 1.Parameter, wenn search im Inneren des X-Bereiches
der Kurve ist sonst (wenn außerhalb dieses Bereiches oder bei
Fehler) den Wert 0
Voraussetzung ist, dass die X-Werte der Kurve von klein nach
groß sortiert sind
GetPeakProperties( float&, float&, float& )
liefert die Breite des 1.Bereiches, in dem alle y-Werte des
Tripels die Hälfte des Intensitätsbereichs(Y(max)-Y(min))
übersteigen, sowie aus diesem Bereich x-Wert, y-Wert des
Tripels für das der Y-Wert (Intensität) maximal ist
1.Bereich bedeutet der am weitesten links liegende Bereich der
obige Eigenschaften erfüllt
1.Parameter(Ausgabe) hw
enthält nach Aufruf die Breite des Bereichs
2.Parameter(Ausgabe) pos
enthält nach Aufruf den zum maximalen Y-Wert (Intensität) in
diesem Bereich gehörigen X-Wert
3.Parameter(Ausgabe) intens
enthält nach Aufruf max. Y-Wert(Intensität) in diesem Bereich
Anmerkung: dieser Bereich darf nicht bis ans Ende der Kurve
reichen d.h. kurve darf nicht monoton wachsend sein (sonst
return false)
(wird nicht benutzt)
operator=( const TCurve& )
Zuweisungsoperator für Kurven, kopiert alle x,y,z,v Werte sowie
die Maxima und Minima für x,y,z
3.4.2 TDataBase
1. UML-Klassendiagramm
2. Klassenhierarchie
von keiner Klasse abgeleitet
3. Friends
keine
4. Files
Klassendeklaration: m_curve.h
Implementation: m_curve.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse dient der Verwaltung einer Menge von Messkurven. Wird nur beim
AreaScan benutzt.
6. Beschreibung der Attribute
nMaxCurve
Anzahl maximal speicherbarer Kurven (def.=1000)
eFault
zuletzt aufgetretenen Fehler
nMaxCurveIdx
indiziert die letzte Kurve der Datenbasis
nActualIdx
indiziert die aktuelle Kurve der Datenbasis
CurveList
Liste der Messwertekurven der Datenbasis
ScanReport
Kurve enthält Werte zu jeder Kurve der Datenbasis
Omegawinkel, Thetawinkel (absoluten Winkel) und je nach
Modus(siehe Areascan (eNotifyValue) einen dritten Wert
(Monitorintensität, Absorberposition, integrale Intensität,
...)
7. Beschreibung der Methoden
TDataBase
initialisieren der Attribute
~TDataBase
löscht alle Kurven der Datenbasis
Reset
reset der Datenbasis
setzt Kurvenindex(nActuelIdx) auf 0
GetCNumber
bestimmt Anzahl der Kurven die in der Datenbasis sind
GetCurve
liefert die Kurve als Rückkehrcode, deren Nummer gleich dem
übergebenen Parameter ist
GetScanReport
liefert als Rückkehrcode die Scanreportcurve
GetCIdx
liefert als Rückkehrcode aktuellen Kurvenindex
SetCIdx
setzt Index, der die aktuelle Kurve indiziert (nActualIdx),
auf den angegebenen Wert(Parameter)
AddCurve
fügt eine Kurve der angegebenen Größe(Parameter gibt Punktezahl
der neuen Kurve an) zur Datenbasis hinzu
New
löscht alle Kurven der Datenbasis und setzt Indizes zurück
GetMaxScanNumber
liefert als Rückkehrcode die Anzahl maximal speicherbarer
Kurven pro Datenbasis (default=999)
GetFault
liefert als Rückkehrcode den zuletzt aufgetretenen Fehler
3.4.3 TScanCmd
1. UML-Klassendiagramm
2. Klassenhierarchie
ist abgeleitet von TCmd
3. Friends
keine (TSteering über TCmd)
4. Files
Klassendeklaration: m_steerg.h
Implementation: m_steerg.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse ist verantwortlich für die Steuerung der Motoren und
Detektoren während eines Linescan bzw. Areascans mit einem PSD.
6. Beschreibung der Attribute
eCaller
gibt Scan-Art an (ForScan = StepScan/ ForAreaScan = AreaScan)
eScanType
gibt Scan-Typ (Modus) an (Standard,Omega2Theta)
ScanW
Pointer auf zugehöriges Scanfenster
AreaScanW
Pointer auf zugehöriges AreaScanfenster
nPointIdx
Anzahl schon gemessener Punkte
nPointNumber
voraussichtliche Gesamtanzahl der zu messenden Punkte
nMotor
Nummer des aktuellen Motors bei einem Standard-Scan
Nummer des Omegamotors bei einem Omega2Theta-Scan
nTheta
Nummer vom Thetamotor (nur bei Omega2Theta verwendet)
nAbsorber
Nummer des Motors für den Absorber
(nur bei Areascan verwendet)
dArgumentMin
Startwinkel des Scans
dArgumentMax
Endwinkel des Scans
dArgumentWidth
normale Schrittweite während des Scans
dThetaMin
Startwinkel des Thetamotors
(nur bei Areascan)
dThetaMax
Endwinkel des Thetamotors
(nur bei Areascan)
dThetaWidth
Schrittweite des Thetamotors
(nur bei Areascan)
dStartPointTheta
Winkel von Theta bei Scanstart (nur bei Omega2Theta verwendet)
Auf diesen Winkel wird Theta nach Beendigung des Scans
zurückbewegt.
dStartPointAbsorber
Winkel des Absorber bei Scanstart
(nur bei Areascan verwendet)
bOmega2Theta
gibt an, ob ein Omega2Theta-Scan durchgeführt wird
bAbsorberUsed
gibt an, ob ein Absorber benutzt wird
(nur bei Areascan verwendet)
dMoveRelation
gibt Verhältnis an, um das der Thetamotor bewegt werden soll,
wenn sich der Omegamotor um einen Schritt bewegt
(nur bei Omega2Theta verwendet)
dArgument
gibt während des Scans den nächsten anzufahrenden Winkel an
fDriveInIntensity
wird nicht verwendet
fDriveOutIntensity
wird nicht verwendet
fIntensityRelation
wird nicht verwendet
bAbsorberActivated
wird nicht verwendet
bAbsorberMovedIn
wird nicht verwendet
bDynamicStepWidth
gibt an, ob dynamische Schrittweitensteuerung aktiv
(nur bei Stepscan verwendet)
nStepScaleLevels
Anzahl der verschiedenen Schrittweiten, die bei der dynamischen
Schrittweitensteuerung benutzt werden
(nur bei Stepscan verwendet)
Scaler
Zeiger auf Liste mit Intensitäten und zugehörigen
Schrittweitenfaktoren für die dynamische Schrittweitensteuerung
(nur bei Stepscan verwendet)
7. Beschreibung der Methoden
TScanCmd
Initialisierung und Anfahren der Startposition
FirstStep
setzt Initialwerte in erstem Schritt des Scans
ControlStep
wird vom 2. bis zum letztem Schritt des Scans aufgerufen
Realisiert auch das Zurückfahren der Motoren auf ihre
Startpositionen nachdem der Endpunkt des Scans erreicht wurde.
ReadyStep
wird nach letztem Schritt aufgerufen
GetShowData
tätigt Ausgaben in die Statusleiste während und bei Ende des
Scans
3.4.4 TAreaScanCmd
1. UML-Klassendiagramm
2. Klassenhierarchie
ist abgeleitet von TCmd
3. Friends
keine(TSteering über TCmd)
4. Files
Klassendeklaration: m_steerg.h
Implementation: m_steerg.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse ist verantwortlich für die Steuerung der Motoren und
Detektoren während eines Areascan mit einem 0-dimensionalen
Detektor.
6. Beschreibung der Attribute
AreaScanW
Pointer auf zugehöriges Areascanfenster
nOmega
Nummer des Omegamotors in der Motorliste
nTheta
Nummer des Thetamotors in der Motorliste
dThetaWindow
Größe des Thetabereiches für ein Spektrum
dThetaWidth
Thetaschrittweite innerhalb des Thetabereiches(dThetaWindow)
dOmegaMin
Omegastartposition
dOmegaMax
Omegaendposition
dOmegaWidth
Omegaschrittweite
dStartPointTheta
Thetaposition vor Scanstart
Auf diese Position wird Theta nach absolviertem Scan
zurückgefahren.
dStartPointOmega
Omegaposition vor Scanstart
Auf diese Position wird Omega nach absolviertem Scan
zurückgefahren.
dMoveRelation
gibt Verhältnis an, um das der Thetamotor bewegt werden soll,
wenn sich der Omegamotor um einen Schritt bewegt
dOmega
Omegaposition der nächsten Messung
dTheta
Thetaposition der nächsten Messung
nMaxThetaPoint
letzter Schritt für Theta
nThetaPoint
aktueller Schritt für Theta
nMaxOmegaPoint
letzter Schritt für Omega
nOmegaPoint
aktueller Schritt für Omega
7. Beschreibung der Methoden
TScanCmd
Initialisierung und Anfahren der Startposition
FirstStep
setzt Initialwerte in erstem Schritt des Scans
ControlStep
wird vom 2. bis zum letztem Schritt des Scans aufgerufen
Realisiert auch das Zurückfahren der Motoren auf ihre
Startpositionen nachdem der Endpunkt des Scans erreicht wurde.
ReadyStep
wird nach letztem Schritt aufgerufen
GetShowData
tätigt Ausgaben in die Statusleiste während und bei Ende des
Scans
3.4.5 TAreaScanParameters
1. UML-Klassendiagramm
2. Klassenhierarchie
ist nicht abgeleitet
3. Friends
keine
4. Files
Klassendeklaration: m_xscan.h
Implementation: m_arscan.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse wird zum Aufbau des Areascan-Fensters genutzt. Hier
werden Areascan-spezifische Parameter gesetzt und einzelne
Werte aus dem ini-File übernommen.
Weiterhin wird auf Vorhandensein eines PSD getestet sowie der
aktuelle Detektor gesetzt.
6. Beschreibung der Attribute
nOmega
enthält Nummer des Omegamotors in der Motorenliste
nTheta
enthält Nummer des Thetamotors in der Motorenliste
dOmegaMin
enthält Anfangswinkel des Omegamotors für einen Areascan
dOmegaMax
enthält Endwinkel des Omegamotors für einen Areascan
dOmegaWidth
enthält Schrittweite des Omegamotors für einen Areascan
dThetaMin
enthält Anfangswinkel des Thetamotors für einen Areascan
dThetaMax
enthält Endwinkel des Thetamotors für einen Areascan
dThetaWidth
enthält die Schrittweite des Thetamotors für einen Areascan
Bedeutung abhängig vom Scandetektor. Entspricht bei Psd dem
Wert dMoveRelation * dOmegaWidth . Entspricht bei 0-
dimensionalem Detektor der Schrittgröße innerhalb des
dThetaWindow .
dThetaOffset
enthält den Offset des Thetamotors für einen Areascan
dMoveRelation
gibt das Schrittverhältnis zwischen Omega und Theta an
(nur bei Omega2Theta-Scan verwendet)
dThetaWindow
gibt den Thetabereich eines Spektrums an
(nur bei 0-dimensionalem Scandetektor verwendet)
eScanType
gibt den Scantyp (Modus)an (Omega2Theta/StandardScan)
eSaveFormat
gibt an in welcher Form die Messwerte in Datei abgelegt werden
sollen
(nur StandardFile verwendet)
bSaveOnReady
Speichern nach Beendigung der Messung
bSaveContinuous
Speichern während der Messung
bPsdDevice
gibt an ob ein Psd angeschlossen ist
bThetaAddsPsd
bisher nicht verwendet
(bei anderen Speicherformaten verwendet)
Device
gibt ausgewählten Detektor an
bAbsorberUsed
zeigt an ob Areascan mit Absorber durchzuführen ist
nAddedChannels
gibt an wie viele Kanäle des Psd zu einem zusammenzufassen sind
fFailure
Genaue Bedeutung unklar.
zur Konfiguration des Zählers
fMaxTime
Maximale Messzeit pro Messpunkt.
dwMaxCounts
Maximale Anzahl Impulse (Impulsbegrenzung)
Hat nur für 0-dimensionale Detektoren eine Bedeutung.
Monitor
gibt ausgewählten Monitordetektor an
(ist bisher nicht auswählbar)
bMonitorUsed
zeigt an, ob Areascan mit Monitordetektor durchzuführen ist
(zur Zeit überflüssig siehe Monitor)
eNotifyValue
gibt an, welche Zusatzdaten zu einem Spektrum im Scanreport zu
speichern sind
(zur Zeit nur IntegralIntensity möglich)
7. Beschreibung der Methoden
TAreaScanParameters
Die Klasse wird zum Aufbau des Areascan-Fensters genutzt. Hier
werden Areascan-spezifische Parameter gesetzt und einzelne
Werte aus dem ini-File übernommen.
SetDevice
Es wird getestet, ob ein PSD angeschlossen ist, und der
aktuelle Detektor gesetzt.
3.4.6 TAreaScan
1. UML-Klassendiagramm
2. Klassenhierarchie
abgeleitet von TAreaScanParameters, TPlotData
3. Friends
friend class TSteering
friend class TSetupScanCmd
friend class TScanCmd
friend class TSetupAreaScanCmd
friend class TAreaScanCmd
friend class TSaveDataCmd
friend class TChooseScan
friend class TAquisition
4. Files
Klassendeklaration: m_xscan.h
Implementation: m_arscan.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse dient der Vorbereitung, der Durchführung ,der
Darstellung und der Speicherung von Areascans. Weiterhin dient
sie der kontinuierlichen Anzeige von Psd-Spektren und sie
ermöglicht den Zugriff auf alle Dialogboxen, die für den
AreaScan von Bedeutung sind.
6. Beschreibung der Attribute
bThetaScanCompleted
nur bei Benutzung von 0-dimensionalem Detektoren von Bedeutung
Zeigt an, ob der Detektor den Thetabereich eines Spektrums
durchlaufen hat. Wird nur benutzt, um während des Scans zu
ermitteln, wann eine neue Kurve in die Datenbasis hinzugefügt
werden muß.
nActiveScan
gibt Nummer der Kurve in Datenbasis an, die gerade aktiv ist
hOldControlWnd
wird nicht verwendet
bShowPsdContinuous
zeigt an, ob kontinuierliche Spektrumsanzeige aktiv ist
bCalibrationActive
zeigt an, ob die Psdkalibrierung gerade durchgeführt wird
bMacroRunning
wird nicht verwendet
bNewCurveNeeded
wird nicht verwendet
bFirstScan
zeigt während des Scans an, ob gerade das erste Spektrum eines
Areascans aktiv ist
wird benutzt, da die Datenbasis bereits mit einer Kurve
initialisiert wird, aber in den folgenden Schritten immer eine
neue Kurve anlegen muss
ScanReport
Kurve enthält zu jedem Spektrum der Datenbasis die Omega-
,Thetapos. und einen Reportwert
7. Beschreibung der Methoden
TAreaScan
Erstellen des Scanfenster-Menüs und Anlegen einer neuen
Datenbasis
~TAreaScan
Scanfenster-Menü löschen
Fensterkoordinaten und andere Variablen in das ini-File
schreiben eine eventuell laufende Messung unterbrechen
CanOpen
Funktion wird bei WM_CREATE aus WndProc aufgerufen
testet ob weniger als 5 Fenster geöffnet sind
überflüssig (identische Methode wird geerbt)
CanClose
test ob Fenster geschlossen werden kann
-test ob Messung aktiv, wenn ja, dann zuerst Messung
unterbrechen
-test ob geänderte Datenbasis, wenn ja, dann Speicher-Anfrage
überflüssig (identische Methode wird geerbt)
LoadOldData
liest gespeicherte Kurve (.psd)
Create
Darstellen des Areascan-Fenster
DrawMenu
überflüssig (identische Methode wird geerbt)
CallLocalAction
Funktion behandelt Fenstermenüpunkte
rButtonDown
Aufruf wenn rechte Maustaste gedrückt
Fenstermenü an aktueller Mausposition ausgeben
lButtonUp
Aufruf, wenn linke Maustaste losgelassen wurde
wird in 2 Fällen aktiv
- messen von Entfernung zwischen zwei Punkten über TPlotData
- bei Dataaquisition(nMouseAction==100) zusätzlich Kommando
senden (d.h. Endpunkt erreicht)
lButtonDown
Aufruf, wenn linke Maustaste gedrückt wurde
wird in 2 Fällen aktiv
- messen von Entfernung zwischen zwei Punkten
(nMouseAction=0)
- bei Dataaquisition (nMouseAction=100) (d.h. Startpunkt
wurde gewählt)
InitializeTask
wird aufgerufen aus m_main.cpp bei cm_InitializeScan
startet den Scanvorgang
InitializeDlg
behandelt die Kommandos 'Setup Measurement...' und 'Inquire
Data' des Kindfenster-menü
Aufruf aus m_main.cpp DoCommandsChild()
StopMeasurement
wird nicht verwendet
Interrupt
Funktion wird bei Unterbrechen/Fortsetzen eines Areascans
aufgerufen oder zum Ausschalten einer kontinuierlichen
Spektrumsanzeige
ExternSychronized
Aufruf aus CallLocalAction bei ExternalSync
Dialogbox unvollständig + gesamte Funktionalität ExternalSync
nur in Ansätzen implementiert
CalibratePsd
Methode realisiert die PsdCalibrierung
SetMeasurementArea
bildnerische Darstellung ausschließlich in TPlotData verwendet
New
löscht aktuelle Datenbasis + baut Areascanfenster neu auf
SaveFile
Funktion speichert einen Messdatensatz
1.Parameter gibt an, ob neuer Dateiname zu wählen ist
(SaveWithNewName) oder ob automatisch unter altem Namen
(NoAskForSave) gespeichert werden soll
SaveReport
speichert die zur Datenbasis gehörige Scanreportkurve in einer
Datei unter dem aktuellen Dateinamen mit der Extension .rep ab
LoadReport
Funktion lädt die zu einer psd-Datei gehörige Scanreportkurve
(wird nicht verwendet)
UpdateWnd
zeichnet in Abhängigkeit des eingestellten Darstellungstyps das
Areascanfenster neu
UpdateFile
hängt aktuelle gemessene Kurve während des Scans an Datei mit
FileName an
Aufruf nur bei kontinuierlichem Speichern
SetRanges
setzt die Achsenminima und Achsenmaxima abhängig von der
Darstellungsart
GetThetaOffset
Funktion liefert den absoluten Thetawert als Rückkehrcode
1.Parameter scid
gibt Kurvennummer an, deren absoluter Thetawert gesucht ist
(nur bei RL-Bitmap benutzt)
ClassName
liefert den Klassennamen zurück
GetCharacteristic
liefert Klassencharakteristik
(wird nicht verwendet)
CounterSetRequest
behandelt eigentlichen Scanablauf sowie die kontinuierliche
Spektrenanzeige , Psdkalibrierung ...
ShowSensorContinuous
diese Funktion schaltet die kontinuierliche Spektrenanzeige für
Psd an oder aus
1.Param. type==
PsdEnergyData(3000) => kont. EnergieSpektrum an/aus
PsdPositionData(3001) => kont. ImpulsSpekrum an/aus
(99) => schaltet kont. Spektrum aus
(0) => schaltet kont.Spektrum aus und dieses
später wieder ein (nicht implementiert aber benutzt)
SteeringReady
wird aufgerufen, nachdem ein Scan abgeschlossen wurde
GetArgumentMin
liefert Omegastartwinkel
(wird nicht verwendet)
GetArgumentMax
liefert Omegaendwinkel
(wird nicht verwendet)
SetTitle
setzt Titel des AreascanFensters
SaveMeasurementInfo
Funktion speichert Headerinformationen zu einem Areascan in
einer Datei; 1.Parameter gibt an, ob die Datei neu erstellt(=0)
werden soll oder nur aktualisiert (ungleich 0) werden soll
LoadMeasurementInfo
Laden einiger Headerinformationen (Messungsinfos) aus einer
psd-Datei
GetAdditionalColumns
liefert abhängig von eSaveFormat
bei ShiftedStandard ist die Anzahl der Psd-Kanäle, die
benötigt werden, um den Thetabereich zu überdecken,
sonst immer 0
GetShift
Funktion liefert zur Anzahl der Scans (1.Parameter) die Anzahl
der Psd-Kanäle, die benötigt werden, um den Thetabereich zu
überdecken(nur bei ShiftedStandard)
sonst 0
3.4.7 TSetupAreaScan
1. UML-Klassendiagramm
2. Klassenhierarchie
abgeleitet von TModalDlg
3. Friends
keine
4. Files
Klassendeklaration: m_xscan.h
Implementation: m_arscan.cpp
5. Verantwortlichkeiten der Klasse
Die Klasse dient der Steuerung eines Dialogs für
Einstellungsparameter eines Areascan. Diese Dialogbox findet
sich im Areascanfenster unter dem Menüpunkt "Einstellungen
AreaScan"
6. Beschreibung der Attribute
nOmega
enthält Nummer des Omegamotors in der Motorenliste
nTheta
enthält Nummer des Thetamotors in der Motorenliste
hDeviceList
Handle auf Detektor-Combobox
nOldMotor
wird nicht verwendet
Device
aktueller Detektor für Messung
Scan
Pointer auf zugehöriges Areascan-Fenster, von dem aus die
Dialogbox aufgerufen wurde
7. Beschreibung der Methoden
TSetupAreaScan
Setzen einzelner Variablen aus dem Scanfenster
Dlg_OnInit
Setzen der Defaultwerte der Dialogbox
Dlg_OnCommand
behandelt alle Kommandos der Dialogbox
CanClose
realisiert Test der Dialogboxinhalte auf ihre Konsistenz vor
Verlassen der Dialogbox (durch OK-Button)
LeaveDialog
wird bei Verlassen der Dialogbox aufgerufen
hat in dieser Dialogbox keine Bedeutung, da identische Methode
auch geerbt
| ID | Typ | Beschriftung |
|---|---|---|
| id_AngleMin | Eingabefeld(EDIT) | Minimum |
| id_AngleMax | Eingabefeld(EDIT) | Maximum |
| id_AngleWidth | Eingabefeld(EDIT) | Schritt |
| id_ThetaWidth | Eingabefeld(EDIT) | Schritt |
| id_Relation | Eingabefeld(EDIT) | Relation |
| id_ThetaWindow | Eingabefeld(EDIT) | Bereich |
| id_FixThetaAxis | Checkbox | Theta-Achse fixieren |
| id_ChooseDevice | Combobox | Detektor |
| id_MaxTime | Eingabefeld(EDIT) | Meßzeit |
| id_MaxCounts | Eingabefeld(EDIT) | Impulse |
| id_AbsorberUsed | Checkbox | Absorber benutzen |
| id_Unit | Textfeld | Motor-Einheiten in |
| id_Standard | Schaltfeld | Standard |
| id_DIB_Format | Schaltfeld | Device Ind.Bitmap |
| id_SaveContinuous | Checkbox | Kontinuierlich sichern |
| id_SaveOnReady | Checkbox | Bei Beenden speichern |
| id_Catalog | Eingabefeld(EDIT) | Sicherungsverzeichniss |
| ID | Beschriftung |
|---|---|
| cm_SpecificParameters | Geräte-Einstellungen |
| cm_SetupParameters | Parameter aktualisieren |
| IDOK | OK |
| IDCANCEL | Abbrechen |
3.4.8 TCalibratePsd
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
abgeleitet von TModalDlg3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_arscan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse dient der Steuerung eines Dialogs, mit dessen Hilfe man einen angeschlossenen Psd kalibrieren kann(d.h. den Winkel bestimmen, der einem Psd-Kanal entspricht). Diese Dialogbox findet sich im Areascan-Fenster unter dem Menüpunkt "PSD Kalibrierung".6. Beschreibung der Attribute
nAskTime Zeitintervall zur Aktualisierung der Winkeleinträge in der Dialogbox bMoveActive gibt an ob Motor in Bewegung fRelationFactor gibt Umrechnungsfaktor an, um Winkelsekunden in die jeweilige Einheit umzurechnen bCalibrationOk wird nicht verwendet Curve aktuell im Scanfenster angezeigte Kurve LeftPeak Position für Peak am linken Rand RightPeak Position für Peak am rechten Rand bGetRightPeak gibt an, ob Peak am rechten Rand schon bestimmt wurde bGetLeftPeak gibt an, ob Peak am linken Rand schon bestimmt wurde bLongMove gibt an ob Motor über grössere Distanz fährt (z.B. bei Eingabe eines anzusteuernden Winkelwertes) fOldPsdStep wird nicht verwendet dOldMotorWidth wird nicht verwendet hDlgItem Handle auf Dialogelement hBar Handle des Scrollbars BarFactor gibt an, ob Anzahl der Scrollbarschritte kleiner als 20000 ist (1) oder nicht (2) nMotor enthält Nummer des Thetamotors in der Motorenliste dStepWidth wird nicht verwendet Device Pointer auf einen Psd7. Beschreibung der Methoden
TCalibrate zeichnet Dialogbox und sorgt für die Übernahme und das Setzen einiger wichtiger Parameter aus dem Areascan-Fenster GetBarEgde ermittelt Anzahl der Scrollbarschritte links bzw. rechts von der absoluten Null 1. Parameter ==LEFT Anzahl der Scrollbarschritte links von der absoluten Null sonst Anzahl der Scrollbarschritte rechts von der absoluten Null diese Funktion muss mit LEFT zuerst aufgerufen werden GetBarPos liefert die Position des Scrollbar anhand der akt. Motorposition Dlg_OnHScrollBar behandelt alle Scrollbarereignisse Dlg_OnTimer behandelt Timersignale zur Aktualisierung der Winkelwerte in der Dialogbox Dlg_OnInit Setzen der Defaultwerte der Dialogbox Dlg_OnCommand behandelt Kommandos der Dialogbox CanClose realisiert Test der Dialogboxinhalte auf ihre Konsistenz vor Verlassen der Dialogbox (durch Beenden-Button) LeaveDialog wird bei Verlassen der Dialogbox aufgerufen loescht alle Timer und stoppt die Messung
| ID | Typ | Beschriftung |
|---|---|---|
| id_Bar | Scrollbar | |
| id_Angle | Textfeld | Winkel 2Theta |
| id_NewAngle | Eingabefeld(EDIT) | : |
| id_Unit | Textfeld | |
| id_StepWidth | Eingabefeld | Winkel je Kanal |
| ID | Beschriftung |
|---|---|
| cm_LeftPositionReached | Linke Position erreicht |
| cm_RightPositionReached | Rechte Position erreicht |
| IDOK | Beenden |
| IDCANCEL | Abbrechen |
3.4.9 TChooseScan
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
ist abgeleitet von TModelessDlg3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_arscan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse dient der Steuerung eines Dialogs für die Auswahl einer Meßkurve eines AreaScans. Diese Dialogbox findet sich im Areascanfenster unter dem Menüpunkt "Scan-Auswahl".6. Beschreibung der Attribute
AScan Pointer auf das zugehörige Areascanfenster Curve Pointer auf aktuell angezeigte Kurve Report Pointer auf Scanreportkurve der Datenbasis BarHandle Handle des Scrollbars nMaxScan enthält Nummer des letzten Scans in Datenbasis7. Beschreibung der Methoden
TChooseScan Setzen einzelner Variablen aus dem Scanfenster Dlg_OnInit setzt Defaultwerte der Dialogbox bei Aufruf der Box Dlg_OnCommand behandelt Kommandos in der Dialogbox Dlg_OnVScrollBar wird aufgerufen, wenn Scrollbar angeclickt wurde Dlg_OnLButtonUp wird aufgerufen, wenn in der Dialogbox die linke Maustaste nach Drücken wieder losgelassen wird (sinnvoll wenn Dialogbox während eines Areascans aktiv ist) CanClose wird aufgerufen beim Drücken des OK-Buttons
| ID | Typ | Beschriftung |
|---|---|---|
| id_Limit | Textfeld | Max.ScanId |
| id_Omega | Textfeld | Omega |
| id_PeakIntensity | Textfeld | Maximum |
| id_ScanNumber | Eingabefeld(EDIT) | ScanId |
| id_Bar | Scrollbar |
| ID | Beschriftung |
|---|---|
| id_CurveShow | Update |
| IDOK | OK |
| IDCANCEL | Abbruch |
3.4.10 TPsdRemoteSync
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
abgeleitet von TModalDlg3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_scan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse dient der Steuerung eines Dialogs für die externe Steuerung eines Psd. Diese Dialogbox findet sich im Areascanfenster unter dem Menüpunkt "PSD-Measurements under remote Control".6. Beschreibung der Attribute
Keine genaueren Angaben möglich, da Klasse unvollständig implementiert ist und somit die Bedeutung der Attribute nicht nachvollzogen werden kann.7. Beschreibung der Methoden
Keine genaueren Angaben möglich, da Klasse unvollständig implementiert ist. Es finden sich die üblichen Dialogbox- Methoden wie z.B. CanClose, Dlg_OnInit, .. die aber nur in Ansätzen implementiert sind.
| ID | Typ | Beschriftung |
|---|---|---|
| IDC_Extension | Textfeld | |
| IDC_TargetName | Eingabefeld(EDIT) | |
| IDC_DirPsdCycle | Eingabefeld(EDIT) | Datafiles |
| IDC_Messages | Textfeld |
| ID | Beschriftung |
|---|---|
| IDC_StartPsdCycle | Start |
| IDC_InterruptPsdCycle | Interrupt |
| IDC_StopPsdCycle | Stop |
| IDOK | Leave |
3.4.11 TScanParameters
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
ist nicht abgeleitet3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_scan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse wird zum Aufbau des Scan-Fensters genutzt. Hier werden Linescan-spezifische Parameter gesetzt und einzelne Werte aus dem ini-File übernommen.6. Beschreibung der Attribute
nMotor beinhaltet die Motorlistennummer der aktuell ausgewählten Motorachse eSaveFormat Speicherformat für Kurven eScanType Art(Modus) des aktuellen Scan ( StandardScan, Omega2Theta oder ContinuousScan) bSaveOnReady Speichern nach Beendigung der Messung nCollectionAmount Anzahl der Messpunkte (nur bei ContinuousScan verwendet) dArgumentMin Startwinkel des Scans dArgumentMax Endwinkel des Scans dArgumentWidth Schrittweite während des Scans dSpeed Geschwindigkeit des aktuellen Motors Device aktueller Detektor zum Messen nMFunctionId Typ der Mess-Funktion nNumberCycle Anzahl der Mess-Zyklen fFailure genaue Bedeutung unklar Zur Konfiguration des Zählers fMaxTime Maximale Messzeit (Zeitbegrenzung) dwMaxCounts Maximale Anzahl Impulse (Impulsbegrenzung) Monitor Detektor der als Monitordetektor gewählt wurde bSaveContinuous Speichern während der Messung bMonitorUsed Monitor-Detektor benutzen bDynamicStepWidth gibt an, ob dynamische Schrittweitensteuerung aktiv nStepScaleLevels Anzahl der verschiedenen Schrittweiten während der dynamischen Schrittweitensteuerung Scaler[] Liste enthält in den ersten 10 Werten die Intensitäten und in den zweiten 10 Werten den zugehörigen Schrittweitenfaktor für die dynamische Schrittweitensteuerung.7. Beschreibung der Methoden
TScanParameters Die Klasse wird zum Aufbau des Scan-Fensters genutzt. Hier werden Linescan-spezifische Parameter gesetzt und einzelne Werte aus dem ini-File übernommen.3.4.12 TScan
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
abgeleitet von TScanparameters, TPlotData3. Friends
friend class TSetScanParameters friend class TSteering friend class TScanCmd friend class TSetupScanCmd friend class TSaveDataCmd4. Files
Klassendeklaration: m_xscan.h Implementation: m_scan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse dient der Vorbereitung, der Durchführung , der Darstellung und der Speicherung von Linescans. Weiterhin ermöglicht sie den Zugriff auf alle Dialogboxen, die für den Linescan von Bedeutung sind.6. Beschreibung der Attribute
bMacroRunning wird nicht verwendet7. Beschreibung der Methoden
TScan Erstellen des Scanfenster-Menüs und Anlegen einer neuen Kurve ~TScan Scanfenster-Menü löschen Fensterkoordinaten und andere Variablen in das ini-File schreiben, eine eventuell laufende Messung unterbrechen LoadOldData Laden einer gespeicherten Kurve (.crv/.bk/.dtn) SaveFile speichern einer .crv Datei UpdateFile hängt während des Scans aktuelles Tripel der Messkurve an Datei an, Aufruf erfolgt nur bei kontinuierlichem Speichern SaveDataBase wird nicht verwendet Create Darstellen des Stepscanfenster CounterSetRequest behandelt Aktivitäten während des Scanablaufes erhält Meßpunkt, stellt ihn dar, speichert ihn ggf. SteeringReady behandelt Ende des Messvorgangs SetRanges passt X und Y-Achse des Koordinatensystems an neue Werte an DrawMenu wird nicht verwendet New löscht aktuelle Kurve + baut Stepscanfenster neu auf LoadMeasurementInfo Laden der Messungsdaten(Headerinformationen) aus einer crv-, dtn- bzw. bk-Datei, SaveMeasurementInfo Speichern bzw. Aktualisieren der Headerinformation InitializeTask behandelt den Start eines Linescanvorgangs InitializeDlg behandelt einige Menükommandos Interrupt wird bei unterbrechen bzw. fortsetzen eines Scanvorganges aufgerufen, aktualisiert Menüs und gibt Meldung in Statuszeile aus. StopMeasurement wird nicht verwendet SetTitle setzt Titel im Linescanfenster NewFile wird nicht verwendet ExecuteNextCmd wird nicht verwendet CanClose testet, ob Linescanfenster geschlossen werden kann rButtonDown setzt Scanfenstermenü an Mausposition ClassName liefert Klassennamen zurück GetCharacteristic wird nicht verwendet GetArgumentMin wird nicht verwendet GetArgumentMax wird nicht verwendet3.4.13 TSetupContinuousScan
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
abgeleitet von TModalDlg3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_scan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse dient der Steuerung eines Dialogs für Einstellungsparameter eines kontinuierlichen LineScan. Diese Dialogbox findet sich im Linescanfenster unter dem Menüpunkt "Einstellungen ContinuousScan". Diese Klasse ist scheinbar in der Entwicklung (viele überflüssige Attribute und Methoden). Außerdem existieren einige Fehler in der Implementation.6. Beschreibung der Attribute
hDeviceList Handle auf Detektor-Combobox hMotorList Handle auf Motor-Combobox nMotor Motorlistennummer des aktuellen Motors nOldMotor wird nicht verwendet Device aktueller Detektor Scan Zeiger auf zugehöriges Linescanfenster dArgumentMin Startpunkt des Scans dArgumentMax überflüssig, in dieser Dialogbox ohne Bedeutung dSpeed Geschwindigkeit, mit der sich der Motor während des Scans bewegen soll nMotorOld wird nicht verwendet DeviceOld wird nicht verwendet dwMaxCounts wird nicht verwendet nCollectionAmount Anzahl der Messpunkte fMaxTime Messzeit pro Messbereich bSaveOnReady wird nicht verwendet eSaveFormat wird nicht verwendet eScanType gibt eingestellten Scan-Modus an in diesem Fall immer ContinuousScan7. Beschreibung der Methoden
TSetupContinuousScan Setzen einzelner Variablen aus dem Scanfenster Dlg_OnInit Setzen der Defaultwerte der Dialogbox Dlg_OnCommand behandelt alle Kommandos der Dialogbox CanClose realisiert Test der Dialogboxinhalte auf ihre Konsistenz vor Verlassen der Dialogbox (durch OK-Button) LeaveDialog überflüssig, da identische Methode auch geerbt
| ID | Typ | Beschriftung |
|---|---|---|
| id_ChooseMotor | Combobox | Scan-Achse |
| id_Unit | Textfeld | Einheit |
| id_AngleMin | Eingabefeld(EDIT) | Startpunkt |
| id_Velocity | Eingabefeld(EDIT) | Geschwindigkeit |
| id_ChooseDevice | Combobox | Sensor |
| id_MaxTime | Eingabefeld(EDIT) | Meßzeit |
| id_NumberSteps | Eingabefeld(EDIT) | Meßpunkte |
| ID | Beschriftung |
|---|---|
| IDCANCEL | Abbrechen |
| IDOK | OK |
3.4.14 TSetupStepScan
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
abgeleitet von TModalDlg3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_scan.cpp5. Verantwortlichkeiten der Klasse
Die Klasse dient der Steuerung eines Dialogs für Einstellungsparameter eines LineScan mit bestimmter Schrittweite. Diese Dialogbox findet sich im Linescanfenster unter dem Menüpunkt "Einstellungen StepScan".6. Beschreibung der Attribute
hDeviceList Handle auf Detektorauswahlbox hMotorList Handle auf Motorauswahlbox hScanTypeList Handle auf ScanTyp-Auswahlbox nMotor aktueller Motor( Nummer in Motorliste) nOldMotor wird nicht verwendet Device aktueller Detektor für Messung Monitor aktueller Detektor für Monitor Scan Zeiger zugehöriges Linescanfenster dArgumentMin Startwinkel(Minimum ) des StepScan dArgumentMax Endwinkel(Maximum) des StepScan dArgumentWidth Schrittweite, mit der während des Scans der Motor bewegt werden soll nMotorOld wird nicht verwendet DeviceOld wird nicht verwendet MonitorOld wird nicht verwendet dwMaxCounts Impulse (Impulsbegrenzung) fMaxTime Zeit (Zeitbegrenzung) bMonitor hat für die Dialogbox keine Bedeutung bSaveOnReady Bei Beenden speichern eSaveFormat in dieser Dialogbox ohne Bedeutung eScanType Scan-Typ (Modus) Mögliche Werte sind Omega2ThetaScan bzw. StandardScan. bSaveContinuous Ständig Sichern bMonitorUsed Monitor-Signal verwenden szPath[ ] Sicherungsverzeichnis7. Beschreibung der Methoden
TSetupStepScan Setzen einzelner Variablen aus dem Scanfenster Dlg_OnInit Setzen der Defaultwerte der Dialogbox Dlg_OnCommand behandelt alle Kommandos der Dialogbox CanClose realisiert Test der Dialogboxinhalte auf ihre Konsistenz vor Verlassen der Dialogbox (durch OK-Button) LeaveDialog Überflüssig, da identische Methode auch geerbt
| ID | Typ | Beschriftung |
|---|---|---|
| id_ChooseMotor | Combobox | Scan-Achse |
| id_Unit | Textfeld | Einheit |
| id_AngleMin | Eingabefeld(EDIT) | Minimum |
| id_AngleWidth | Eingabefeld(EDIT) | Schrittweite |
| id_AngleMax | Eingabefeld(EDIT) | Maximum |
| id_ChooseScanType | Combobox | Scan-Typ |
| id_ChooseDevice | Combobox | Detektor |
| id_MaxTime | Eingabefeld(EDIT) | Zeit |
| id_MaxCounts | Eingabefeld(EDIT) | Impulse |
| id_MonitorUsed | Checkbox | Monitor-Signal |
| id_SaveContinuous | Checkbox | Ständig Sichern |
| id_SaveOnReady | Checkbox | Bei Beenden speichern |
| id_Catalog | Eingabefeld(EDIT) | Sicherungs-Verzeichnis |
| ID | Beschriftung |
|---|---|
| cm_RotateDevice | |
| IDCANCEL | Abbrechen |
| IDOK | OK |
Klassendiagramm von Linescan

Abb. 4.1: Klassendiagramm Linescan
Die nicht angegebenen Klassen für die
Motoren werden nicht nur über das angegebene Kommando (TScanCmd) angesprochen,
sondern es erfolgt teilweise auch ein Zugriff aus TScan (z.B. bei
Continuousscan) sowie den Dialogboxen.
Die Klasse TCurve wird außer bei der Diffraktometrie/Reflektometrie auch
von anderen Klassen, wie z.B. TPsd, verwendet. Die Klasse ist für die
Verwaltung einer Menge von Meßwerten verantwortlich.
Ansonsten übernimmt die Klasse TScanCmd die Hardwaresteuerung während
eines Scans. Mit der Detektorklasse wird außerdem von TScan aus kommuniziert
(um z.B. während des Scans die gemessenen Intensitäten zu bekommen).
Die Klasse TScanParameters hat die Aufgabe, beim Öffnen eines
Scanfensters die für den Linescan wichtigen Parameter aus dem zugehörigen
Ini-File-Abschnitt auszulesen und sonstige Defaultwerte für das Scanfenster zu
setzen. Die Klasse hat keine Methoden und da sie nur von TScan benutzt wird,
könnte man sie im Fall des Linescans in TScan integrieren. Sie macht in dieser
Form keinen Sinn, könnte aber für eventuelle Erweiterungen von Bedeutung sein.
Bei den Dialogboxklassen TSetup... handelt es sich um modale Dialogboxen
(von TModalDlg). Sie greifen teilweise direkt auf TScan-Variablen zu und
verändern diese. Sie werden für die Eingabe der Linescan-Parameter benutzt. Die
Klasse TPlotData ist für die Darstellung der Meßwerte im Scanfenster
verantwortlich.
Eine weitere wichtige Klasse für den
Scanablauf ist die Klasse TSteering, die aber nicht von uns beschrieben wurde,
da sie auch außerhalb der Diffraktometrie/Reflektometrie verwendet wird.
Klassendiagramm von Areascan

Abb. 4.2: Klassendiagramm Areascan
Die nicht angegebenen Klassen für die
Motoren werden nicht nur über die angegebenen Kommandos (TAreaScanCmd,
TScanCmd) angesprochen, sondern es erfolgt teilweise auch ein Zugriff aus
TAreaScan sowie den Dialogboxen, z.B. aus TCalibratePsd .
Die Klasse TCurve wird außer bei der Diffraktometrie/Reflektometrie auch
von anderen Klassen, wie z.B. TPsd, verwendet. Die Klasse ist für die
Verwaltung einer Menge von Meßwerten verantwortlich.
Die Klasse TDataBase hat die Aufgabe der Verwaltung einer Menge von
Meßkurven. Ansonsten übernehmen die Klassen TAreaScanCmd, TScanCmd (je nach Art
des Scans) die Hardwaresteuerung während eines Scans. Mit der Detektorklasse
wird außerdem von TAreaScan aus kommuniziert (um z.B. während des Scans die
gemessenen Intensitäten zu bekommen).
Die Klasse TAreaScanParameters hat die
Aufgabe, beim Öffnen eines Scanfensters die für den Areascan wichtigen
Parameter aus dem zugehörigen Ini-File-Abschnitt auszulesen und sonstige Defaultwerte
für das Scanfenster zu setzen. Außerdem wird durch die Methode dieser Klasse
ein Detektor eingestellt.
Bei den Dialogboxklassen TSetupAreaScan, TPsdRemoteSync, TCalibratePsd
und TAquisition handelt es sich um
modale Dialogboxen (von TModalDlg). Dagegen ist die Dialogboxklasse TChooseScan
nicht modal (von TModelessDlg). Viele Dialogboxklassen greifen direkt auf
TAreaScan-Variablen zu und verändern diese. Die Klasse TPlotData ist für die
Darstellung der Meßwerte im Scanfenster verantwortlich.
Eine weitere wichtige Klasse für den
Scanablauf ist die Klasse TSteering, die aber nicht von uns beschrieben wurde,
da sie auch außerhalb der Diffraktometrie/Reflektometrie verwendet wird.
Der für die Funktionalitäten Diffr./Refl.
bedeutendste Vorgang ist der Linescan bzw. Areascan. Zum besseren Verständnis
des zeitlichen Ablaufs der Interaktion der an einem Scanvorgang beteiligten
Objekte sollen die folgenden Interaktionsdiagramme (Sequenzdiagramme) beitragen.
Die Diagramme zeigen den Ablauf eines Linescan im Modus Standardscan ohne
gewählte Speicheroptionen, ohne Benutzung eines Monitordetektors sowie mit
deaktivierter Schrittweitensteuerung. Diese Punkte wurden nicht betrachtet, da
sie zum Verständnis des Ablaufes nicht notwendig sind und die Diagramme nur
unnötig verkomplizieren. Der Linescan im Omega2Theta-Modus unterscheidet sich
im Grunde nur in dem Punkt, daß bei jedem Bewegen des Omegamotors in diesem
Diagramm nun noch zusätzlich der Thetamotor bewegt wird. Auch der Areascan (mit
Psd) kann durch dieses Diagramm nachvollzogen werden, da sich die
grundsätzlichen Abläufe beim Line- und beim Areascan (mit Psd) gleichen. Beim
Areascan mit Psd werden statt nur einem Meßwert pro Meßpunkt immer gleich eine
Menge von Meßwerten (ein Meßwert pro Psdkanal) zurückgeliefert. Der einzige
Scanvorgang, der etwas abweicht, ist der Areascan mit einem 0-dim. Detektor.
Hier wird statt TScanCmd ein Objekt vom Typ TAreaScanCmd erzeugt. Das Ermitteln
eines Psd-Spektums an einer Omegaposition entspricht dann in etwa dem
dargestellten vollständigen Linescan-Ablauf. Der vollständige Ablauf entspricht
dann also im Prinzip einer wiederholten Durchführung von Linescans.
Die vorliegenden Diagramme sollen nur einen groben Überblick über den
Ablauf geben. Sie sollen kein Ersatz für den Quelltext sein. Aus diesem Grund
wurde darauf verzichtet, Interaktionen darzustellen, die für den eigentlichen
Scanvorgang keine bzw. nur geringe Bedeutung haben (z.B. Ausgaben in der
Statusleiste, Einzeichnen der Werte im Fenster).
Der Ablauf wird durch 3 Sequenzdiagramme dargestellt. Dabei zeigt das 1.
den Verlauf vom Klicken auf den Scan-Menüpunkt "Scan execute"
bis zum Messen der Intensität am 1. Meßpunkt. Das 2. Diagramm zeigt den Ablauf
vom 2. Meßpunkt bis zum vorletzten. Im 3. Diagramm wird dann der Verlauf vom
letzten Meßpunkt bis zum Beenden des Scanvorgangs dargestellt. In den
Diagrammen wurde ein Objekt global:GLOBAL eingeführt, welches für alle
globalen Funktionen steht. Des weiteren wurde das Objekt Win-Api:WIN-API
eingeführt, welches für alle Win-Api-Funktionen steht. Diese beiden Objekte
existieren im Programm selbst nicht.
Scanstart
Das 1. Diagramm zeigt den Verlauf vom Klicken auf den Scan-Menüpunkt "Scan
execute" (was dem Aufruf von TScan:InitializeTask() entspricht) bis zu
dem Punkt, an dem die Intensität am ersten Meßpunkt ermittelt wurde (was dem
Zeitpunkt kurz vor Aufruf der Methode TScan:CounterSetRequest() entspricht).

Abb. 4.3: Interaktionsdiagramm Scanstart
Nachdem die Motor- sowie die
Detektorparameter gesetzt wurden, wird durch Steering:Reset() ein eventuell
noch vorhandenes TScanCmd-Objekt gelöscht. Anschließend wird der
Scanfenster-Inhalt gelöscht und die Scan- und Hauptfenstermenüpunkte werden
aktualisiert. Nun wird der Omegamotor in Bewegung gesetzt (StartMove()), um die
Startposition (1.Meßpos.) anzufahren. Da dies eine Weile dauern kann, wird ein
Timer gesetzt (StartTimer()), nach dessen Ablaufen durch TScanCmd:WakeUp()
überprüft wird, ob der Motor seine Zielposition bereits erreicht hat. Ist dies
nicht der Fall wird erneut StartTimer() aufgerufen. Dabei wird das
Zeitintervall des Timers (von 200ms beginnend) in jedem neuen Aufruf
verringert. In unserem Diagramm wird vereinfachend davon ausgegangen, daß der
Motor schon auf seiner Zielposition angekommen ist. Es folgt durch
Device:MeasureStart() der Start der Intensitätsmessung an dieser Position.
Dabei wird ein Timer der Länge der eingestellten Meßzeit gesetzt. Nach Ablauf
des Timers wird durch den Aufruf von Device->PollDevice() der
Intensitätswert als gültig gekennzeichnet. Abschließend wird über das Kommando cm_CounterSet
die Funktion TScan: CounterSetRequest aufgerufen, die für die Ermittlung,
Speicherung und Darstellung der Werte verantwortlich ist.
Scanablauf
Abb. 4.4: Interaktionsdiagramm Scanablauf
Dieses Diagramm beschreibt den Scanablauf
für alle Meßpunkte zwischen erster und letzter Messung. Der Vorgang beginnt mit
dem Aufruf von CounterSetRequest (also kurz vor Ermittlung der Werte) und endet
auch bei diesem Aufruf (für die nächste Position). Nachdem geprüft wurde, ob
die Motorposition korrekt ist, wird der entsprechende Winkelwert vom Motor
ermittelt. Anschließend wird der an dieser Position gemessene (und als gültig
gekennzeichnete) Intensitätswert vom Detektor geholt. Dieses Wertepaar wird an
die aktuelle ScanCurve (MainCurve:TCurve) per PAdd() angehängt und danach
eventuell gespeichert sowie im Scanfenster dargestellt. Jetzt wird nach Aufruf
der Methode Steering->DeviceRequest() geprüft, ob bereits die letzte
Meßposition erreicht ist. Da dies nicht der Fall ist (Diagramm nur für innere
Meßpunkte), wird die nächste anzufahrende Omegaposition berechnet und
anschließend durch StartMove() wie unter Scanstart-Diagramm angefahren. Nun
erfolgt wie im Scanstart-Diagramm das Messen der Intensität an dieser neuen
Position. Der in diesem Diagramm angegebene Vorgang wiederholt sich solange,
bis der letzte Meßpunkt erreicht wird.
Scanende
Dieses Diagramm beschreibt den Ablauf
beginnend bei Ermittlung des Wertepaars für den letzten Meßpunkt (d.h., der
Omegamotor befindet sich bereits auf der letzten Position und der Detektor hat
bereits an dieser Position gemessen). Es folgt nun der bereits im Scanablauf-Diagramm
beschriebene Vorgang, nur das diesmal nicht die nächste Position, sondern die
Ausgangsposition (vor Scanstart) angefahren wird. Danach wird in
TScanCmd->ReadyStep() die Messung als abgeschlossen gekennzeichnet und
darauf folgend in NotifyCmdReady() die Detektormessung gestoppt sowie alle
ursprünglichen Detektorparameter wieder hergestellt. Abschließend werden in
TScan->SteeringReady() eventuell noch zu speichernde Werte gespeichert sowie
die Meldung Die Messung wurde abgeschlossen angezeigt. Der Scanablauf
ist hiermit beendet.

Abb. 4.5: Interaktionsdiagramm Scanende
Die von uns untersuchten Quellen sind
objektorientiert implementiert. Die Klassen (TScan, TAreaScan) enthalten
jeweils nur alle Methoden/Attribute, die mit dem jeweiligen Fenster und seinen
Funktionalitäten zu tun haben. Sie sind nach unserer Auffassung gut gewählt und
ein weiteres Zerlegen dieser Klassen würde keine Vorteile bringen, sondern eher
die Übersichtlichkeit verringern. Außerdem wurde dies durch das Einbringen der
Klassen (TScanParameters, TAreaScanParameters) für den Bereich der Werte und
Parameter, die für den Scan eine Rolle spielen, schon getan, obgleich man
hierbei Fehler begangen hat, die sich teilweise nur durch hohen Zeitdruck des
Programmierers erklären lassen. So wurden in diesen Klassen grundsätzlich alle
Attribute und Methoden als public deklariert, obwohl es sich hierbei um
sensible Daten handelt. Da diese Klassen ausschließlich Attribute (bis auf eine
Methode in TAreaScanParameters) enthalten, hätte man sie theoretisch auch als
Struktur definieren können. Die bessere Lösung wäre unserer Meinung nach, alle
Attribute als protected zu deklarieren, sowie das Einfügen von Methoden, die
den Zugriff auf diese Attribute zulassen. Unter objektorientierten
Gesichtspunkten ist diese Klasse nicht notwendig, da sie eine abstrakte Klasse
ist, es also keine Objekte dieses Typs gibt und sie andererseits ihre Attribute
nur an genau eine andere Klasse vererbt. Deshalb wäre das Einfügen der
Attribute und Methoden in die Tochterklasse vorzuziehen. Wie oben bereits
erwähnt, fördert die gewählte Herangehensweise die Übersichtlichkeit, was
unserer Meinung nach wichtiger ist. Beispiele für unüberlegte
public-Deklarationen finden sich an verschiedenen Stellen. So wurde in TScan
eine Methode als Private deklariert (GetArgumentMin()), obwohl das darin
auszulesende Attribut (dArgumentMin) als public deklariert wurde.
Ein Beispiel für besseren Zugriffsschutz
der Attribute sind die Klassen TCurve und TDataBase. Bei diesen Klassen sind
fast alle Attribute nur über Methoden manipulierbar. Gleiches gilt auch für
sämtliche Dialogbox-Klassen sowie TScanCmd und TAreaScanCmd.
Bei vielen Programmteilen hat man das
Gefühl, daß bestimmter Code einfach kopiert wurde. Ein Indiz ist das häufige
Auftreten von überflüssigen Variablen. Das führt zum Teil dazu, daß an
verschiedenen Stellen die gleichen Bezeichner auftreten. Dies erschwert neben
dem Nachvollziehen bestimmter Programmabläufe zusätzlich das Auffinden von
Stellen im Programm, an denen eine bestimmte Variable manipuliert wird, da
dies, wie oben erwähnt, nicht über Methoden geschieht.
Das Ansteuern der Hardware ist sowohl für
die Detektoren als auch für die Motoren ausschließlich über jeweilige
Objektmethoden realisiert, wobei bei den Motoren der Weg über die
Schnittstellenfunktionen ml... und m... abläuft.
Dennoch empfinden wir den vorliegenden
Klassenentwurf (was die Diffraktometrie/Reflektometrie betrifft) als gelungen.
Beim Entwickeln der Erweiterungen war es
unser Bestreben, das existierende Design durch das Einbringen neuer Klassen
soweit wie möglich unverändert zu lassen. Wir haben uns bemüht, bestehende
Strukturen beizubehalten, und wenn möglich, sie wiederzubenutzen. So wurden zum
Beispiel alle neuen Dialogklassen so wie die bereits existierenden von der
vorhandenen Dialogklasse ‚TModalDlg' abgeleitet. Auch bei der Benennung der
neuen Klassen sowie der Methoden und Attribute wurde versucht, dem bestehenden
Stil zu folgen, um so die Lesbarkeit des Quelltextes erhalten zu können.
Abgesehen von den Änderungen im Zuge der
Dateirestrukturierung durch K. Schützler im Rahmen seiner Diplomarbeit gab es
nur eine Änderung in der Dateistruktur, die unseren Arbeitsbereich betrifft. So
wurde bis auf den Dialog ‚Daten-Erhebung’ (TAquisition) die Implementation
aller Dialogklassen in die Datei ‚m_dlgdiff.cpp’ verlagert. Dieser Schritt war
nötig geworden, da die zulässige Größe einer *.cpp-Datei von 64KB durch das
Einbringen der Erweiterungen überschritten worden war.
m_xscan.h
TReportUse
Beschreibung:
Struktur enthält Info zu Reportkurven. Die
jeweiligen Variablen der Struktur zeigen an,
welche Zusatzinformationen existieren bzw.
anzulegen sind und welche nicht.
Definition:
typedef struct
{
BOOL
bMonitor; //! Monitorintensitaet
BOOL bAbsorber;//! Absorberposition
BOOL bTime; //! reale Messzeit
BOOL bIntegral; //! integrale Intensitaet
}
TReportUse;
m_data.h
TDisplay
Beschreibung:
Diese Struktur enthält für die Darstellung einer Datenbasis als RAW- oder
RL-Bitmap wichtige Parameter. Früher wurden die entsprechenden Werte direkt vom
Detektor oder aus den aktuellen Einstellungen entnommen, was bei nachgeladenen
Datenbasen zur Falschdarstellung führte.
Definition:
typedef struct
{
double dThetaWindow, //!
Winkelbereich eines Spektrums bei SLD-Scan
dMoveRelation, //!
Schrittweitenverhaeltniss Omega zu Theta
dOmegaMin,
//! Omegastartposition
dOmegaMax; //! Omegaendposition
double dThetaMinFirst,//! Winkelwert fuer Beginn des 1. Spektrums
//! der
Datenbasis
dThetaMaxFirst,//!
Winkelwert fuer Ende des 1. Spektrums der
//! Datenbasis
dThetaMinLast, //!
Winkelwert fuer Beginn des letzten
//! Spektrums
der Datenbasis
dThetaMaxLast; //!
Winkelwert fuer Ende des letzten
//!
Spektrums der Datenbasis
float fAngleRange, //!
Winkelbereich eines Spektrums bei Psd-Scan
fAngleStep; //! Winkelbereich eines Psd-Kanals
BOOL bPsd; //! Gibt an ob Psd oder nicht(SLD)
}
TDisplay;
Für die Dialogelemente der neuen bzw. veränderten Dialogboxen wurden
automatisch definierte ID’s in der Datei rc_def.h erstellt.
Weiterhin wurde beim
Überarbeiten des Use-Case ‚Diffraktometrie/Reflektometrie’ bezüglich einer
vollständigen Zweisprachigkeit in allen Meldungen, Hinweisen und Dialogboxen
der größte Teil der Meldungen bzw. Hinweise im Kopfteil der Dateien
m_arscan.cpp, m_scan.cpp und m_dlgdif.cpp als Variablen definiert.
Bsp.: m_dlgdiff.cpp
#ifdef GermanVersion
char szDlgFailure[] = "Fehler";
char szDlgMessage[] = "Meldung";
char szInfoType0[] = "
Meßdetektor";
char szInfoType1[] = "Integrale Intensität";
char szInfoType2[] = "
Absorberposition";
char szInfoType3[] = "
Monitor-Intensität";
char szInfoType4[] = "
reale Meßzeit";
char szDlgMsgLine001[] = "Kein gültiger Scantyp";
char szDlgMsgLine002[] = "Vorgang bitte wiederholen !";
char szDlgMsgLine003[] = "kein Absorber verfügbar";
char szDlgMsgLine004[] = "gültige Kanalnummern: 0 bis %d";
char szDlgMsgLine005[] = "Bereichsüberschreitung(Omega)";
char szDlgMsgLine006[] = "Bereichsüberschreitung(Theta)";
#else
char szDlgFailure[] =
"Failure";
char szDlgMessage[] =
"Message";
char szInfoType0[] =
" Detector-type";
char szInfoType1[] =
" Integral Intensity";
char szInfoType2[] =
" Absorberposition";
char szInfoType3[] =
" Monitor-Intensity";
char szInfoType4[] =
" real Measure-Time ";
char szDlgMsgLine001[] =
"No valid Scan Type";
char szDlgMsgLine002[] =
"Please repeat the procedure !";
char szDlgMsgLine003[] =
"no absorber available";
char szDlgMsgLine004[] =
"valid Channelnumber: 0 to %d";
char szDlgMsgLine005[] =
"area-overstepping(Omega)";
char szDlgMsgLine006[] =
"area-overstepping(Theta)";
#endif
Abgesehen davon wurden die folgenden neuen Variablen bzw. Konstanten
eingeführt:
m_arscan.cpp
char DismantleFile[ 40 ];
Hilfsvariable zum Zerlegen bzw. Zusammenfassen einer Datenbasis
enthält Dateinamen
1.1 UML-Klassendiagramm

1.2
Klassenhierarchie
Die Klasse
ist abgeleitet von TModalDlg.
1.3
Friend-Klassen
keine
1.4
Files
Deklaration
in m_xscan.h
Implementation
der Methoden in m_scan.cpp
1.5 Verantwortlichkeiten
der Klasse
Dialogbox-Klasse
für die Eingabe und das Verändern der Parameter für die Dynamische
Schrittweitensteuerung.
1.6
Beschreibung der Attribute
Scan
Pointer auf zugehöriges LineScanfenster
ScalerDummy[20]
Feld
zur Sicherung der Dialogbox-Einstellungen, um sie bei Reset auf die
ursprünglichen Werte vom Zeitpunkt des Aufrufs der Dialogbox zurücksetzen zu
können.
int IntensityId[10]
int FactorId[10]
int StaticId[10]
Hilfsfelder
zur komfortableren Arbeit mit Ressourcen-Id's
1.7
Beschreibung der Methoden
TSetupDynamicStep
Im
Konstruktor werden die Resourcen-ID’s
den Hilfsfeldern zugeordnet.
Dlg_OnInit
Setzt
Defaultwerte der Dialogbox bei Aufruf der Box.
Dlg_OnCommand
Behandelt
alle Dialogereignisse.
CanClose
Realisiert Test der Dialogboxinhalte auf ihre Konsistenz vor dem Verlassen
der
Dialogbox (durch den OK-Button). Hier werden die eingegebenen Werte, wenn
nötig, sortiert und geändert.
1.8 Ressourcen
CONTROL
|
ID |
Type |
Beschriftung |
|
Id_Static_0 |
Textfeld |
0: von |
|
… |
… |
… |
|
Id_Static_9 |
Textfeld |
9: von |
|
Id_Intensity_0 |
Eingabefeld(EDIT) |
bis |
|
… |
… |
… |
|
Id_Intensity_9 |
Eingabefeld(EDIT) |
bis |
|
Id_Factor_0 |
Eingabefeld(EDIT) |
mit |
|
… |
… |
… |
|
id_Factor_9 |
Eingabefeld(EDIT) |
mit |
PUSHBUTTON
|
ID |
Beschriftung |
|
IDRESET |
Zurücksetzen |
|
IDOK |
OK |
|
IDCANCEL |
Abbruch |
2.1
UML-Klassendiagramm

2.2
Klassenhierarchie
Die
Klasse ist abgeleitet von TModalDlg.
2.3
Friend-Klassen
keine
2.4
Files
Deklaration
in m_xscan.h
Implementation
der Methoden in m_dlgdif.cpp
2.5 Verantwortlichkeiten
der Klasse
Dialog
zur Eingabe des Omega- und Thetaoffset.
2.6
Beschreibung der Attribute
bOnlyOmega
Gibt
an, ob die Thetaachse im Areascan-dialog fixiert war;
in
diesem Fall soll nur Omegaoffset eingebbar sein
dOmegaOffset
Enthält
Wert von OmegaOffset.
dThetaOffset
Enthält
Wert von ThetaOffset
dIdealOmega
Enthält
Wert von Wunschwinkel(Theta). In der Dialogbox repräsentiert durch Eingabefeld
‚entspricht:’ im Gruppenfeld Omega.
dIdealTheta
Enthält Wert von Wunschwinkel (Theta). In der Dialogbox repräsentiert durch
Eingabefeld ‚entspricht:’ im Gruppenfeld Theta.
bOmegaDirect
Gibt
an, ob direkt der Omega-Offset eingegeben wurde (True) oder ob über die
Winkelwerte eine Berechnung erfolgen muß (False).
bThetaDirect
Gibt
an ob direkt der Theta-Offset eingegeben wurde (True) oder ob über die
Winkelwerte eine Berechnung erfolgen muß (False).
dialog
Pointer
auf Areascan-Dialog
2.7
Beschreibung der Methoden
TSetOffset
Zeichnet
Dialogbox und sorgt für die Übernahme einiger wichtiger Parameter aus dem
Linescan-Fenster.
CanClose
Schließt
Dialog ohne Überprüfung der Werte. Eine Überprüfung der Werte erfolgt im
Areascan-Einstellungs-Dialog.
Dlg_OnCommand
Behandelt alle Dialogereignisse.
Dlg_OnInit
Setzt
Defaultwerte der Dialogbox bei Aufruf der Box.
2.8 Ressourcen
CONTROL
|
ID |
Type |
Beschriftung |
|
id_RealOmega |
Eingabefeld(EDIT) |
Winkel: |
|
id_IdealOmega |
Eingabefeld(EDIT) |
entspricht
Winkel: |
|
id_OmegaOffset |
Eingabefeld(EDIT) |
Winkel-Offset: |
|
id_ThetaOffset |
Eingabefeld(EDIT) |
Winkel: |
|
id_IdealTheta |
Eingabefeld(EDIT) |
entspricht
Winkel: |
|
id_RealTheta |
Eingabefeld(EDIT) |
Winkel-Offset: |
PUSHBUTTON
|
ID |
Beschriftung |
|
cm_SetOmegaOffset |
Winkel berechnen |
|
|
Offset berechnen |
|
cm_SetThetaOffset |
Winkel berechnen |
|
|
Offset berechnen |
|
IDOK |
OK |
|
IDCANCEL |
Abbruch |
3.1
UML-Klassendiagramm

3.2
Klassenhierarchie
Die
Klasse ist abgeleitet von TModalDlg.
3.3
Friend-Klassen
keine
3.4
Files
Deklaration
in m_xscan.h
Implementation
der Methoden in m_dlgdif.cpp
3.5 Verantwortlichkeiten
der Klasse
Dialogbox-Klasse
für die Einstellungen ‚Datenbasis zusammensetzen’
3.6
Beschreibung der Attribute
Areascan
Pointer
auf zugehöriges Areascanfenster
oldMaxFiles
oldFirstFile[ MaxString ], oldLastFile[ MaxString ]
Hilfsvariablen
zur Speicherung von Werten der Dialogbox, die beim Aufruf eingestellt waren.
3.7
Beschreibung der Methoden
TComposeDB
Zeichnet
Dialogbox und sorgt für die Übernahme einiger wichtiger Parameter aus dem
Areascan-Fenster.
CanClose
Realisiert
Test der Dialogboxinhalte auf ihre Konsistenz vor Verlassen
der
Dialogbox (durch OK-Button).
Dlg_OnCommand
Behandelt
alle Dialogereignisse.
Dlg_OnInit
Setzt
Defaultwerte der Dialogbox bei Aufruf der Box.
3.8 Ressourcen
CONTROL
|
ID |
Type |
Beschriftung |
|
id_LastFile |
Textfeld |
Beendet bei
: |
|
id_NumberSpectrum |
Textfeld |
Anzahl
Spektren : |
PUSHBUTTON
|
ID |
Beschriftung |
|
cm_StartFile |
Beginnen bei : |
|
IDOK |
OK |
|
IDCANCEL |
Abbruch |
4.1
UML-Klassendiagramm

4.2
Klassenhierarchie
Die
Klasse ist abgeleitet von TModalDlg.
4.3
Friend-Klassen
keine
4.4
Files
Deklaration
in m_xscan.h
Implementation
der Methoden in m_dlgdif.cpp
4.5 Verantwortlichkeiten
der Klasse
Dialogbox-Klasse
für die Einstellungen ‚Datenbasis zerlegen’
4.6
Beschreibung der Attribute
Areascan
Pointer
auf zugehöriges Areascan-Fenster
4.7 Beschreibung
der Methoden
TDismantleDB
Zeichnet
Dialogbox und sorgt für die Übernahme einiger wichtiger Parameter aus dem
Areascan-Fenster.
CanClose
Realisiert
Test der Dialogboxinhalte auf ihre Konsistenz vor Verlassen
der
Dialogbox (durch OK-Button).
Dlg_OnCommand
Behandelt
alle Dialogereignisse.
Dlg_OnInit
Setzt
Defaultwerte der Dialogbox bei Aufruf der Box.
4.8 Ressourcen
CONTROL
|
ID |
Type |
Beschriftung |
|
Id_Filename |
Eingabefeld(EDIT) |
Dateiname : |
|
Id_Catalog |
Eingabefeld(EDIT) |
Datenpfad : |
PUSHBUTTON
|
ID |
Beschriftung |
|
IDOK |
OK |
|
IDCANCEL |
Abbruch |
Der Umfang der Änderungen, die durch die
Erweiterungen an den existierenden Klassen vorgenommen wurden, ist von Klasse
zu Klasse unterschiedlich. Aus diesem Grund wird hier die Dialogboxklasse
‚ContinuousScan’ mit umfangreichen Änderungen noch einmal vollständig
dargestellt.
Klasse
TSetupContinuousScan
UML-Klassendiagramm

Klassenhierarchie
Die
Klasse ist abgeleitet von TModalDlg.
Friend-Klassen
keine
Files
Deklaration
in m_xscan.h
Implementation
der Methoden in m_scan.cpp
Verantwortlichkeiten
der Klasse
Dialogbox-Klasse
für die Einstellung der Parameter für einen kontinuierlichen Scan
Beschreibung
der Attribute
dArgumentMin
enthält
Wert für den Startpunkt des kont. Scans in Dlg.box
dArgumentMax
enthält
Wert für den Endpunkt des kont. Scans in Dlg.box
dSpeed
enthält
Wert für die voraussichtliche Geschwindigkeit des Motors während des kont.
Scans
dArgumentWidth
enthält
Wert für die Größe eines Messbereichs
nCollectionAmount
enthält
die Anzahl der zu erwartenden Meßpunkte
während des kont. Scans
fMaxTime
enthält
die Meßzeit, die für einen Meßbereich verwendet werden soll
bSaveOnReady
zeigt
an, ob automatisches Speichern nach Beendigung der Messung erfolgen soll
hDeviceList
handle
auf Detektoren-Auswahlbox in der Dlg.box
hMotorList
handle
auf Motoren-Auswahlbox in der Dlg.box
nMotor
enthält
die Motorlistennummer des aktuell ausgewählten Motors
Device
enthält
Zeiger auf aktuell ausgewählten Detektor
Scan
enthält
Zeiger auf zugehöriges Linescan-Fenster
Beschreibung
der Methoden
TSetupContinuousScan
zeichnet
Dialogbox und sorgt für die Übernahme einiger wichtiger Parameter aus dem
LineScan-Fenster
CanClose
realisiert
den Test der Dialogboxinhalte auf ihre Konsistenz vor dem Verlassen
der
Dialogbox (durch OK-Button)
Rückkehrcode
False
wenn die Dlg.box aufgrund von inkonsistenten Werten nicht geschlossen werden
kann (in diesem Fall werden die Werte nicht ans Linescan-Fenster übergeben)
True sonst
Dlg_OnCommand
behandelt
alle Kommandos der Dialogbox
Dlg_OnInit
setzen
der Defaultwerte der Dialogbox
Rückkehrcode:
immer True
Ressourcen
CONTROL
|
ID |
Type |
Beschriftung |
|
id_ChooseMotor |
Combobox |
Scan-Achse |
|
id_Unit |
Eingabefeld(EDIT) |
Einheit: |
|
id_AngleMin |
Eingabefeld(EDIT) |
Startpunkt: |
|
id_AngleMax |
Eingabefeld(EDIT) |
Endpunkt: |
|
id_StepWidth |
Eingabefeld(EDIT) |
Bereichsgröße: |
|
id_Velocity |
Textfeld |
Geschwindigkeit: |
|
id_ChooseDevice |
Combobox |
Sensor |
|
id_MaxTime |
Eingabefeld(EDIT) |
Messzeit: |
|
id_NumberSteps |
Textfeld |
Meßpunkte: |
|
id_SaveOnReady |
Checkbox |
Bei Beenden
speichern |
|
id_Path |
Eingabefeld(EDIT) |
Sicherung-Verzeichnis |
PUSHBUTTON
|
ID |
Beschriftung |
|
cm_SetupParameters |
Parameter aktualisieren |
|
IDOK |
OK |
|
IDCANCEL |
Abbrechen |
Bei den restlichen Klassen werden nur die
neuen bzw. veränderten Attribute, Methoden oder Eigenschaften aufgeführt.
TCurve
Veränderte Attribute:
HGLOBAL
FAR hMemX;
Nun Handle auf Speicherobjekt (x, y,
z-Werte und valid-Werte),
dafür sind die Handle hMemY, hMemZ und
hMemV entfernt worden.
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’ um Datenbasis auf 5000 Kurven erhöhen zu können)
CPoint FAR * lpPX;
Nun Zeiger auf Datenfeld von X,Y,Z und V,
dafür sind die Pointer lpPY, lpPZ, lpPV,
lpFastPX, lpFastPY, lpFastPZ und lpFastPV entfernt worden.
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’, um Datenbasis auf 5000 Kurven erhöhen zu können)
TDataBase
Neue Methode:
BOOL
DelCurve( void);
entfernt die letzte Kurve in der
Datenbasis
Rückkehrcode FALSE wenn Datenbasis leer
sonst TRUE
(für Erweiterung ‚Akkumulierte
Darstellung’)
TCmd
Neue Attribute:
BOOL bRestart;
Zeigt für Area- und Stepscan an, ob der
Scanvorgang nach einer Unterbrechung fortgesetzt werden soll.
(Fehlerbehebung)
TScanCmd
Neue Attribute:
double dArgument2;
Gibt während des Scans den nächsten
anzufahrenden Winkel (Theta bei O2T-Scan) an
(für Erweiterung ‚2Theta-Minumum’ ).
BOOL bChannelOffset;
Gibt für den Areascan im Standard-Modus
an, ob ein Psd-Offset verwendet werden soll. In diesem Fall muss für Theta eine
Startposition angefahren werden
(für Erweiterung ‚Omega-, Theta- und
Psd-Kanal-Offset’).
TAreaScanCmd
Neue Attribute:
double d2ThetaStart;
Enthält Wert für 2Theta-Startposition des
aktuellen Spektrums
(für Erweiterung ‚2Theta-Minimum’ ).
TAreaScanParameters
Neue Attribute:
double d2ThetaStart;
Gibt die gewünschte Theta-Startposition
bei Omega2Theta-Scans bzw. die feste Position beim Standardscan an (für
Erweiterung ‚2Theta-Minimum’ ).
char
FirstFile[ MaxString ],
LastFile[ MaxString ];
int MaxFiles;
Geben Namen der Start- bzw. End-Datei
sowie Anzahl der zusammenzufassenden Dateien bei der Datenbasis-Bildung an
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’ ).
double dOffsetOmega,dOffsetTheta;
Gibt den Omega- bzw. Thetaoffset an
(Differenz zwischen gewünschtem und
realem Winkel; für Erweiterung ‚Omega- , Theta- und
Psd-Kanal-Offset’ ).
double dPsdOffset;
Gibt Winkelwert an, der sich aus der
Nummer des Messkanals und der Breite eines Psd-kanals ergibt. Um diesen
Winkelwert muss man verschieben, um den Messkanal auf der 2Thetaposition zu
positionieren (für Erweiterung ‚Omega-, Theta- und Psd-Kanal-
Offset’ ).
int
nMeasurementChannel;
Gibt Nummer des Messkanal des Psd an, der
sich immer auf der 2Thetaposition
befinden soll (für Erweiterung ‚Omega-,
Theta- und Psd-Kanal-Offset’ ).
TReportUse ReportUse;
Gibt an welche Zusatzinfos zu der
Datenbasis anzulegen sind bzw. (bei
nachgeladenen) welche Infos existieren
(für Erweiterung ‚Zusatzinformation’ ).
BOOL bAccumulatedDisplay;
Gibt Art der Darstellung während eines
Areascans mit Psd an.
akkumulierte Anzeige (TRUE) oder Anzeige
am Ende der Messzeit (FALSE)
(für Erweiterung ‚Akkumulierte
Darstellung’ )
TAreaScan
Neue Methoden:
BOOL
DismantleDB( void );
Zerlegt vorhandene Datenbasis in einzelne
Dateien.
Liefert TRUE, wenn alle Dateien angelegt
wurden, sonst FALSE
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’ )
BOOL
ComposeDB( void );
Setzt Datenbasis aus einzelnen Spektren
zusammen.
Liefert immer TRUE
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’ )
BOOL
SaveDismantleCurve( int );
Speichert aktuelle Kurve in Crv-Datei ab.
liefert TRUE, wenn Datei korrekt angelegt,
sonst FALSE
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’ )
Neue Attribute:
LPCurve ScanReport2;
Kurve enthält weitere Zusatzinformationen
zu den Kurven der Datenbasis.
Absorberposition, Monitorintensität, reale
Messzeit
(für Erweiterung ‚Zusatzinformationen’ )
BOOL bScanSetupOk;
Soll Start eines Areascan vor Aufruf einer
Einstellungsbox verhindern.
Zeigt an, ob die Einstellungsbox bereits
aufgerufen wurde.
( Fehlerbehebung )
BOOL bComposeDB;
Gibt an, ob DB-Zusammensetzung gerade
aktiv.
(für Erweiterung ‚Datenbasis zerlegen und
zusammensetzen’ )
TSetupAreaScan
Hat die neue Klasse TSetOffset als friend.
Neue Attribute:
char
szOWF[ 7 ], szTWF[ 7 ];
Formatstrings für die Motorwerte
(Dateizerlegung m_arscan.cpp)
LPDevice Monitor;
Identifiziert Monitordetektor
(für Erweiterung ‚Zusatzinformationen’ )
double d2ThetaStart;
Beinhaltet den Wert des Feldes Minimum im
Gruppenfeld Einstellungen2Theta.
(für Erweiterung ‚2Theta-Minimum’ )
double
dOmegaOffset;
double
dThetaOffset;
Beinhaltet den Wert für Omega- bzw.
Thetaoffset.
(für Erweiterung ‚Omega-, Theta und
Psd-Kanal-Offset’ )
TChooseScan
Neue Attribute:
HWND hInfoList;
Handle der Info-Combobox.
(für Erweiterung ‚Zusatzinformationen’ )
int InfoField[5];
Beinhaltet die Zuordnung von Nummer des
Comboxeintrages zu Zusatzinformation.
(für Erweiterung ‚Zusatzinformationen’ )
TCurve* Report2;
Pointer auf 2.Scanreportkurve welche die
Zusatzinformationen enthält.
(für Erweiterung ‚Zusatzinformationen’ )
int nInfoNumber;
Enthält die Nummer der aktuell
ausgewählten Zusatzinformation.
0-Messdetektor / 1-integr.Int. /
2-Absorberposition / 3-Monitorintensität / 4-Meßzeit
(für Erweiterung ‚Zusatzinformationen’ )
TScanParameters
Neue Attribute:
double d2ThetaStart;
Gibt 2Theta-Startposition für einen zu
fahrenden Stepscan im Omega2Theta-Modus an.
(für Erweiterung ‚2Theta-Minimum’ )
TScan
Hat die neue Klasse TSetupDynamicStep als
friend.
Neue Attribute:
BOOL
bScanSetupOk;
Soll Scanstart vor Aufruf einer
Einstellungsbox verhindern.
Zeigt an, ob die Einstellungsbox bereits
aufgerufen wurde.
( Fehlerbehebung )
TSetupStepScan
Neue Attribute:
double d2ThetaStart;
Enthält Wert von 2Theta.
(für Erweiterung ‚2Theta-Minimum’ )
TDevice
Neue Methoden:
virtual BOOL GetEventIntensity( float& );
Liefert die (seit dem letzten Event)
gemessene Intensität in dem Parameter zurück.
void SetEventHost(HWND);
Setzt das Fenster, das nach dem Auftreten
eines Events mittels Senden von Kommandos (cm_CounterSet oder cm_SteeringReady)
informiert werden soll.
void KillEvent( void );
Löscht alle Detektor-Events aus der
Warteschlange von Windows.
Neben den hier aufgeführten neuen Klassen,
Attributen und Methoden, die neu hinzugekommen sind, wurden auch zahlreiche
existierende Methoden erweitert bzw. verändert. Das Aufführen und das
Beschreiben aller dieser Änderungen in den Methoden würde den Rahmen dieser
Arbeit sprengen. Um dennoch einen groben Überblick zu erhalten, sei auf das
Kapitel 5 ‚Implementation’ verwiesen. Dort befindet sich zu jeder Erweiterung
eine Auflistung aller neuen und veränderten Klassenmethoden bzw.
-attribute.
An den Interaktionsbeziehungen der
existierenden Klassen, wie sie im Kapitel 4.4 beschrieben und dargestellt sind,
hat sich nichts geändert. Es sind nur die neuen modalen Dialogboxen
hinzugekommen.

Abb. 4.6: Neues Klassendiagramm
Areascan

Abb. 4.7: Neues Klassendiagramm Linescan
Für das folgende Interaktionsdiagramm
gelten bzgl. der beteiligten Klassen (Global, Win-API) die gleichen
Anmerkungen, wie für den Stepscan. Weiterhin wurden aus Platzgründen einige
Methoden nur bei ihrem 1. Aufruf vollständig verfolgt. Der deutlichste
Unterschied zum Stepscan liegt im Verzicht auf die Verwendung von
Steering-Kommandos. Diese waren aufgrund der festgelegten Abfolge der Schritte
und der damit einhergehenden Motor- und Detektorsteuerung nicht geeignet. Das
Diagramm ist durch horizontale Hilfslinien in 3 Abschnitte unterteilt.
Der 1. Abschnitt reicht vom Punkt unmittelbar nach dem Starten eines
kont. Scans über den gleichnamigen Fenstermenüpunkt in der Funktion
TScan::InitializeTask(). Es wird in einem 1. Schritt dem Nutzer die Möglichkeit
zum Abbruch des Scanstarts gegeben. Wurde dies nicht getan, so erscheint nun
bei eingestellter Speicheroption ein ‚Sichern unter...’-Dialog. Außerdem wird
eine eventuell dargestellte Kurve aus dem Fenster und aus dem Speicher
gelöscht. Als nächstes wird die aktuelle Motorposition gespeichert, der
laufende Detektor gestoppt und wichtige Parameter (wie Meßzeit) an den
Meßdetektor übermittelt. Nachdem dies erfolgt ist, werden alle gerade aktiven
Steeringkommandos mittels Steering.Reset() deaktiviert und der Motor wird auf
seine Startposition bewegt. Die Startposition berechnet sich dabei aus dem
eingegebenen Startpunkt und dem Beschleunigungsweg des Motors (abh. von Geschwindigkeit
und Beschleunigung). Wurde die Startposition erreicht, wird die
Motorgeschwindigkeit für den Scan gesetzt und der Motor beginnt die Bewegung
zur Zielposition. Ist eine gewisse Beschleunigungszeit vergangen, wird über den
Befehl InitializeEvent die periodische Benachrichtigung des Linescan-Fensters
durch den Detektor initiiert. Im letzten Schritt des Scanstarts wird das
Fenster inklusive der Menüpunkte aktualisiert.
Im 2.Abschnitt des Diagramms, der nun beginnt, wird der Scanablauf dargestellt.
Hierbei wird nachdem der Detektor eine Messung abgeschlossen hat, daß
Scanfenster mittels cm_CounterSet informiert. In der Methode CounterSetRequest
wird daraufhin die Motorposition und die gemessene Intensität ermittelt, zur
Kurve hinzugefügt und in das Scanfenster eingezeichnet. Der Vorgang wiederholt
sich nun bis alle Scanbereiche abgefahren wurden.
Nachdem der letzte Scanbereich abgefahren wurde sendet der Detektor das
Kommando cm_SteeringReady. An diese Stelle beginnt der 3. Abschnitt des Diagramms,
der das Scanende zeigt. Als Folge des Kommandos wird in der Methode
SteeringReady() der Motor gestoppt und der Detektor auf seine ursprünglichen
Werte gesetzt. Es werden alle Meßwerte gespeichert (sofern dies im Dialog
eingestellt worden war) und es erfolgt eine Meldung. Gleichzeitig bewegt sich
der Motor auf seine ursprüngliche Position zurück.

Abb. 4.8: Interaktionsdiagramm
Continuousscan