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 abgeleitet3. Friends
keine4. Files
Klassendeklaration: m_curve.h Implementation: m_curve.cpp5. 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,z3.4.2 TDataBase
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
von keiner Klasse abgeleitet3. Friends
keine4. Files
Klassendeklaration: m_curve.h Implementation: m_curve.cpp5. 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 Fehler3.4.3 TScanCmd
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
ist abgeleitet von TCmd3. Friends
keine (TSteering über TCmd)4. Files
Klassendeklaration: m_steerg.h Implementation: m_steerg.cpp5. 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 Scans3.4.4 TAreaScanCmd
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
ist abgeleitet von TCmd3. Friends
keine(TSteering über TCmd)4. Files
Klassendeklaration: m_steerg.h Implementation: m_steerg.cpp5. 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 Omega7. 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 Scans3.4.5 TAreaScanParameters
1. UML-Klassendiagramm
![]()
2. Klassenhierarchie
ist nicht abgeleitet3. Friends
keine4. Files
Klassendeklaration: m_xscan.h Implementation: m_arscan.cpp5. 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, TPlotData3. Friends
friend class TSteering friend class TSetupScanCmd friend class TScanCmd friend class TSetupAreaScanCmd friend class TAreaScanCmd friend class TSaveDataCmd friend class TChooseScan friend class TAquisition4. Files
Klassendeklaration: m_xscan.h Implementation: m_arscan.cpp5. 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 Reportwert7. 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 03.4.7 TSetupAreaScan
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 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 wurde7. 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