Designbeschreibung

 

Achtung: 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

1.Einleitung

2. Abgrenzung der Implementation der Komponente

3. Dokumentation des vorgefundenen Zustandes

3.1. Modularität

3.2. Typen und Strukturen

3.3. globale Variablen und Konstanten

3.4. Klassen

3.4.1. TCurve

3.4.2. TDataBase

3.4.3. TScanCmd

3.4.4. TAreaScanCmd

3.4.5. TAreaScanParameters

3.4.6. TAreaScan

3.4.7. TSetupAreaScan

3.4.8. TCalibratePsd

3.4.9. TChooseScan

3.4.10. TPsdRemoteSync

3.4.11. TScanParameters

3.4.12. TScan

3.4.13. TSetupContinuousScan

3.4.14. TSetupStepScan

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.1. Vorbemerkung

7.2. Dateistruktur

7.3. Typen und Strukturen

7.4. Globale Variablen und Konstanten

7.5. Neue Klassen

7.5.1. Klasse TSetupDynamicStep

7.5.2. Klasse TSetOffset

7.5.3. Klasse TComposeDB

7.5.4. Klasse TDismantleDB

7.6. Änderungen an Klassen

7.7. Interaktionsbeziehungen

7.8. Interaktionsdiagramm ContinuousScan

 

1.Einleitung

 

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.

 

2. Abgrenzung der Implementation der Komponente

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
TScan
TSetupStepScan
TSetupContinuousScan

Parameterinitialisierung für Linescan
Behandelt Funktionalität von Linescan
Einstellungsdialogbox: StepScan
Einstellungsdialogbox: Cont.Scan

3232

m_arscan

TAreaScanParameters
TAreaScan
TSetupAreaScan
TPsdRemoteSync
TCalibratePsd
TChooseScan
TAquisition

Parameterinitialisierung für Areascan
Behandelt Funktionalität von Areascan
Einstellungsdialogbox: Areascan
Dialogbox: Psd extern synchronisieren
Dialogbox: Psd kalibrieren
Dialogbox: Kurvenauswahl
Dialogbox: Schnitt der Datenbasis erstellen

324

m_steerg

TCmd
TScanCmd
TAreaScanCmd

Basisklasse aller Kommandos
Kommando für Linescan(außer Cont.Scan) sowie Areascans mit Psd
Kommando für Areascan mit 0-dim.
Detektor

791

m_curve

TCurve
TDataBase

zum Ablegen und zum Verändern einer Folge von Meßwerten
zum Ablegen und zum Verändern einer Folge von Kurven

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 .

3. Dokumentation des vorgefundenen Zustandes

3.1. Modularität

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.

3.2. Typen und Strukturen

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

8. Ressourcen

CONTROL
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

PUSHBUTTON
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 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, 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 Psd

7. 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

8. Ressourcen

CONTROL
ID Typ Beschriftung
id_Bar Scrollbar
id_Angle Textfeld Winkel 2Theta
id_NewAngle Eingabefeld(EDIT) :
id_Unit Textfeld
id_StepWidth Eingabefeld Winkel je Kanal

PUSHBUTTON
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 TModelessDlg

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 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 Datenbasis

7. 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

8. Ressourcen

CONTROL
ID Typ Beschriftung
id_Limit Textfeld Max.ScanId
id_Omega Textfeld Omega
id_PeakIntensity Textfeld Maximum
id_ScanNumber Eingabefeld(EDIT) ScanId
id_Bar Scrollbar

PUSHBUTTON
ID Beschriftung
id_CurveShow Update
IDOK OK
IDCANCEL Abbruch

3.4.10 TPsdRemoteSync

1. UML-Klassendiagramm

2. Klassenhierarchie

abgeleitet von TModalDlg

3. Friends

keine

4. Files

Klassendeklaration: m_xscan.h Implementation: m_scan.cpp

5. 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.

8. Ressourcen

CONTROL
ID Typ Beschriftung
IDC_Extension Textfeld
IDC_TargetName Eingabefeld(EDIT)
IDC_DirPsdCycle Eingabefeld(EDIT) Datafiles
IDC_Messages Textfeld

PUSHBUTTON
ID Beschriftung
IDC_StartPsdCycle Start
IDC_InterruptPsdCycle Interrupt
IDC_StopPsdCycle Stop
IDOK Leave

3.4.11 TScanParameters

1. UML-Klassendiagramm

2. Klassenhierarchie

ist nicht abgeleitet

3. Friends

keine

4. Files

Klassendeklaration: m_xscan.h Implementation: m_scan.cpp

5. 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, TPlotData

3. Friends

friend class TSetScanParameters friend class TSteering friend class TScanCmd friend class TSetupScanCmd friend class TSaveDataCmd

4. Files

Klassendeklaration: m_xscan.h Implementation: m_scan.cpp

5. 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 verwendet

7. 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 verwendet

3.4.13 TSetupContinuousScan

1. UML-Klassendiagramm

2. Klassenhierarchie

abgeleitet von TModalDlg

3. Friends

keine

4. Files

Klassendeklaration: m_xscan.h Implementation: m_scan.cpp

5. 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 ContinuousScan

7. 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

8. Ressourcen

CONTROL
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

PUSHBUTTON
ID Beschriftung
IDCANCEL Abbrechen
IDOK OK

3.4.14 TSetupStepScan

1. UML-Klassendiagramm

2. Klassenhierarchie

abgeleitet von TModalDlg

3. Friends

keine

4. Files

Klassendeklaration: m_xscan.h Implementation: m_scan.cpp

5. 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[ ] Sicherungsverzeichnis

7. 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

8. Ressourcen

CONTROL
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

PUSHBUTTON
ID Beschriftung
cm_RotateDevice
IDCANCEL Abbrechen
IDOK OK

4. Vererbungs- und Interaktionsbeziehungen der Klassen

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.

5.  Beschreibung wichtiger dynamischer Abläufe

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

 

6.  Bewertung des vorgefundenen Designs

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.


7. Änderungen am Design durch die Erweiterungen

 

7.1. Vorbemerkung

 

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.

 

7.2. Dateistruktur

 

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.

 

7.3. Typen und Strukturen

 

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;

 

7.4. Globale Variablen und Konstanten

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

 

 

7.5. Neue Klassen

 

7.5.1. Klasse TSetupDynamicStep


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

 

 

7.5.2. Klasse TSetOffset

 

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

 

7.5.3. Klasse TComposeDB

 

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

 

 

7.5.4. Klasse TDismantleDB

 

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

 

 

7.6. Änderungen an Klassen

 

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. 

 

7.7. Interaktionsbeziehungen

 

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

 

7.8. Interaktionsdiagramm ContinuousScan

 

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

 






zuletzt geändert 12.11.2001 Jens Ullrich/Stephan Berndt