File: INCLUDE\MANJUST\MJ_FUNK.H

    1 //##############################################################################
    2 //                                                                            //
    3 // MJ_FUNK.H                                                                  //
    4 //                                                                            //
    5 // Subsystem : neue Manuelle Justage / Funktionalität                         //
    6 // Benutzung durch andere Subsysteme erforderlich: NEIN                       //
    7 //----------------------------------------------------------------------------//
    8 // Autoren: Thomas Kullmann, Günther Reinecker                                //
    9 // Stand  : 23.11.2002                                                        //
   10 // letzter vollständiger Test: 20.08.2002                                     //
   11 //                                                                            //
   12 //##############################################################################
   13 
   14 #ifndef _MJ_FUNK_H
   15 #define _MJ_FUNK_H
   16 
   17 #include "motrstrg\motrstrg.h" // Motorsteuerung
   18 #include "detecuse\detecuse.h" // Detektornutzung
   19 
   20 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--
   21 
   22 //##############################################################################
   23 // globale Typdeklarationen
   24 //##############################################################################
   25 
   26 enum EMotionType { mtDirect= 1, mtDrive= 2, mtStep= 3 }; // 0 zur Kennzeichnung einer unbekannten Betriebsart
   27 enum EDirection { dUp= 1, dDown= 2 };
   28 typedef double TAngle;
   29 typedef double TSpeed;
   30 typedef int TChannel;
   31 
   32 //##############################################################################
   33 // TManJustage
   34 //##############################################################################
   35 
   36 class TManJustage
   37 { // Klasse für die Funktionalität der Manuellen Justage
   38 
   39         //------------------------------------------------------------------------------
   40         // TMotorData
   41         //------------------------------------------------------------------------------
   42 
   43 private:
   44 
   45         struct TMotorData
   46         { // Informationen für jeweils einen Antrieb der Manuelle Justage
   47                 
   48                 TMotor *m_lnkMotor; // Antrieb dessen Daten hier verwaltet werden
   49                 EAxisType m_AxisType; // zugeordneter Antriebstyp
   50                 char m_MotorId[50]; // "MOTOR<Index>" Name der INI-Sektion in der HARDWARE.INI
   51         
   52                 EMotionType m_MotionType; // aktuelle Betriebsart 
   53 
   54                 // aktuelle Bewegungsparameter
   55                 TAngle m_AngleDest;  // SollPosition
   56                 TSpeed m_Speed;      // Geschwindigkeit
   57                 TAngle m_AngleWidth; // Schrittweite
   58 
   59                 // Info's über die Bewegung
   60                 BOOL m_KzMoving; // OnTimer(): wenn m_KzMoving!= IsMoving(), dann hat Bewegung gestartet oder gestoppt
   61 
   62                 // Speeding (zwischenspeichern der Daten zwischen BeginUpdate und EndUpdate erspart das ständige/ langsame Auslesen beim Antrieb)
   63                 TAngle m_SpAngle;  // letzte Antriebsposition
   64                 BOOL   m_HasAngle; // FALSE wenn die letzte Antriebsposition seit BeginUpdate noch NICHT in m_SpAngle zwischengespeichert wurde
   65                 BOOL m_SpMoving;  // letzter Antriebsstatus (in Bewegung?)
   66                 BOOL m_HasMoving; // FALSE wenn der letzte Antriebsstatus seit BeginUpdate noch NICHT in m_SpMoving zwischengespeichert wurde
   67         };
   68 
   69         //------------------------------------------------------------------------------
   70         // Konstruktor/Destruktor
   71 public:
   72 
   73         TManJustage( void );
   74         virtual  ~TManJustage( void );
   75 
   76         //------------------------------------------------------------------------------
   77         // Antriebssteuerung
   78 public:
   79 
   80         BOOL DoDirect ( const int ); // Bewegung im Direktbetrieb
   81         BOOL DoDrive ( const int, const EDirection ); // Bewegung im Fahrbetrieb
   82         BOOL DoStep ( const int, const EDirection ); // Bewegung im Schrittbetrieb
   83         BOOL DoStop ( const int ); // stoppen der Bewegung, unabhängig von der Betriebsart
   84         void DoStopEverything ( void ); // Stoppen aller Antriebe, der Halbwertsbreitenmessung und der Detektormessung
   85 
   86         //------------------------------------------------------------------------------
   87         // Statusinformationen
   88 public:
   89 
   90         BOOL IsIndexValid ( const int ) const; // gültiger Index der Antriebsliste ?
   91         BOOL HasOffset ( const int, BOOL& ) const; // Offset gesetzt, d.h. (Offset != 0) ?
   92         BOOL IsMoving ( const int, BOOL& ); // Antrieb in Bewegung ?
   93         BOOL IsCalibrated ( const int, BOOL& ) const; // Antrieb kalibriert?
   94 
   95         //------------------------------------------------------------------------------
   96         // GET-Methoden
   97 public:
   98 
   99         // lesen der aktuellen Betriebsart und der Bewegungsparameter
  100         EMotionType GetMotionType ( const int, BOOL& ) const; // Betriebsart
  101         TAngle GetAngleDest ( const int, BOOL& ) const; // Sollposition
  102         TSpeed GetSpeed ( const int, BOOL& ) const; // Geschwindigkeit
  103         TAngle GetAngleWidth ( const int, BOOL& ) const; // Schrittweite
  104         BOOL GetKzMoving ( const int, BOOL& ) const; // OnTimer() will auf Start/ Stop der Bewegung reagiert
  105         TAngle GetOffset ( const int, BOOL& ) const; // aktuellen Offset für <Antrieb>
  106         UINT GetMotorCount ( void ) const; // Anzahl der Antriebe in der Antriebsliste
  107         LPCSTR GetMotorName ( const int, BOOL& ) const; // Antriebsbezeichnung per standardisierter Antriebsbezeichnung
  108         int GetMotorIdx ( const LPCSTR ) const; // Index des angegebenen Antriebs; ggf. -1
  109         int GetMotorIdx ( const EAxisType ) const; // Index des angegebenen Antriebs; ggf. -1
  110 
  111         // lesen der relativen Positionsdaten als Winkelangabe
  112         TAngle GetAngle ( const int, BOOL& ); // aktuelle Antriebsposition
  113         TAngle GetAngleMin ( const int, BOOL& ) const; // minimale Antriebsposition
  114         TAngle GetAngleMax ( const int, BOOL& ) const; // maximale Antriebsposition
  115 
  116         UINT GetDigits ( const int, BOOL& ) const; // lesen der Nachkommastellen
  117         LPCSTR GetUnit ( const int, BOOL& ) const; // lesen der Einheit
  118 
  119         EAxisType GetHwbAxis(); // Antrieb der zur Halbwertsbreitenmessung verwendet wird
  120         static UINT ParsingAxis( const LPCSTR ); // lesen der standardisierten Antriebsbezeichnung
  121 
  122         //------------------------------------------------------------------------------
  123         // SET-Methoden
  124 public:
  125 
  126         // setzen der aktuellen Betriebsart und der Bewegungsparameter
  127         BOOL SetMotionType ( const int, EMotionType& ); // Betriebsart
  128         BOOL SetAngleDest ( const int, TAngle& ); // Sollposition
  129         BOOL SetSpeed ( const int, TSpeed& ); // Geschwindigkeit
  130         BOOL SetAngleWidth ( const int, TAngle& ); // Schrittweite
  131         BOOL SetKzMoving ( const int, const BOOL ); // OnTimer() hat auf Start/ Stop der Bewegung reagiert
  132 
  133         //------------------------------------------------------------------------------
  134         // Offset bzw relative Null
  135 public:
  136 
  137         BOOL SetRelativeZero ( const int ); // setzen der relativen Null
  138         BOOL ResetRelativeZero ( const int ); // aufheben der relativen Null
  139         BOOL SetOffset ( const int, TAngle& ); // setzen des Offset für <Antrieb>
  140 
  141         // Berechnungen zum Offset für <Antrieb>
  142         TAngle CalcOffsetFromAngle ( const int, TAngle& ) const; // Berechnung des Offset aus einer Position
  143         TAngle CalcAngleFromOffset ( const int, TAngle& ) const; // Berechnung der Position aus dem Offset
  144 
  145         //------------------------------------------------------------------------------
  146         // Kanal-Offset
  147 public:
  148 
  149         int GetDetectorAxisIdx ( void ) const; // Index DES PSD-Antriebs; ggf. -1
  150         LPCSTR GetDetectorName ( BOOL& ) const; // gibt die Bezeichnung des Detektors zurück; ggf. "PSD"
  151         BOOL HasDetectorAxis ( void ) const; //  angeschlossen?
  152         UINT GetDetectorDigits ( BOOL& ) const; // Nachkommastellen der Kanalbreite
  153 
  154         int GetChannel ( void ) const;
  155         TAngle GetAnglePerChannel ( void ) const; // lesen des aktuellen Verhältnis: Winkel pro Kanal
  156         BOOL SetChannel ( int& ); // setzen des Kanals
  157 
  158         // Berechnungen zum PSD-Offset
  159         TAngle CalcChannelOffset ( TChannel& ) const;
  160         TAngle CalcChannelAngle ( TChannel& ) const;
  161 private:
  162         BOOL ResetChannelOffset( const int ); // aufheben des Kanaloffsets
  163 
  164         //------------------------------------------------------------------------------
  165         // Halbwertsbreitenmessung
  166 public:
  167 
  168         BOOL DoStartMeasure ( const HWND ); // starten
  169         BOOL DoStopMeasure ( void ); // stoppen
  170 
  171         BOOL IsMeasuring ( void ) const; // ==> TRUE <--> Messung aktiv
  172         BOOL IsMeasureReset ( void ) const; // Messung abgebrochen?
  173         BOOL GetKzMeasuring ( void ) const; // OnTimer() will auf Start/ Stop der Makroverarbeitung reagiert
  174         BOOL GetMeasureProgress ( int&, LPSTR, int& ) const; //Index und Anzahl der Kommandos und Statusinformationen bzw. Kommandonamne werden per Parameter zurückgegeben; ==> TRUE <--> Messung aktiv
  175         double GetMeasureHwb ( void ) const; // ==> HWB oder 0.0
  176         TDetector *GetDetector ( void ) const; // Zeiger für den ausgewählten Detektor, der für die Halbwertsbreitenmessung benötigt wird
  177         void SetKzMeasuring ( const BOOL ); // OnTimer() hat auf Start/ Stop der Makroverarbeitung reagiert
  178         void UpdateDetector ( void ) const; // informiert die Makroverarbeitung, dass neue Messwerte vorliegen
  179 
  180         //------------------------------------------------------------------------------
  181         // Zustand für Bewegung ermitteln
  182 public:
  183 
  184         // können die folgenden Funktionalitäten durchgeführt werden?
  185         // das freigeben bzw. sperren und ausgrauen von Steuerelementen
  186         BOOL CanDoDirect ( const int ); // Direktbetrieb möglich ?
  187         BOOL CanDoDrive ( const int, const EDirection ); // Fahrbetrieb möglich ?
  188         BOOL CanDoStep ( const int, const EDirection ); // Schrittbetrieb möglich ?
  189         BOOL CanDoStop ( const int ); // kann Bewegung gestoppt werden ?
  190 
  191         //------------------------------------------------------------------------------
  192         // Zustand zum Setzen von Parametern
  193 public:
  194 
  195         BOOL CanSetMotionType ( const int ); // setzen der Betriebsart möglich ?
  196         BOOL CanSetAngleDest ( const int ); // setzen der Sollposition möglich ?
  197         BOOL CanSetSpeed ( const int ); // setzen der Geschwindigkeit möglich ?
  198         BOOL CanSetAngleWidth ( const int ); // setzen der Schrittweite möglich ?
  199         BOOL CanResetRelativeZero ( const int ); // aufheben der Relativen Null möglich ?
  200         BOOL CanSetOffset ( const int ); // setzen des Offset und der rel.Null für <Antrieb> möglich ?
  201 
  202         BOOL CanDoStartMeasure ( void ); // starten der Halbwertsbreitenmessung möglich ?
  203         BOOL CanDoStopMeasure ( void ) const; // stoppen der Halbwertsbreitenmessung möglich ?
  204 
  205         //------------------------------------------------------------------------------
  206         // Speeding beginnen bzw. beenden
  207 public:
  208         UINT  BeginUpdate ( void ); // m_UpdateCount erhöhen 
  209         UINT  EndUpdate   ( void ); //               verringern
  210 
  211         //------------------------------------------------------------------------------
  212         // Auslesen der wirklichen Antriebsdaten ohne Speeding (Aquäivalent zu GetAngle und IsMoving)
  213 private:
  214         TAngle DetermineAngle  ( const int, BOOL& ) const; // aktuelle Antriebsposition beim Antrieb auslesen
  215         BOOL   DetermineMoving ( const int, BOOL& ) const; // Antriebsstatus (in Bewegung?) beim Antrieb auslesen
  216 
  217         //------------------------------------------------------------------------------
  218         // Attribute
  219 private:
  220         TMotorData *m_MotorList;   // Liste der verfügbaren Antriebe
  221 
  222         TOneDimDetector *m_lnkDetector; // Detektor für den PSD-Offset
  223         char m_DetectorId[50]; // // "DEVICE<Index>" Name der INI-Sektion in der HARDWARE.INI
  224         int m_Channel;  // PSD-Kanal für den Offset
  225 
  226         BOOL m_IsMeasuring; // Status der HWB-Messung
  227         UINT m_MotorCount;  // Anzahl der Motoren in m_MotorList
  228         BOOL m_KzMeasuring; // OnTimer(): wenn m_IsMeasuring!= IsMeasuring(), dann hat Makroverarbeitung gestartet oder gestoppt
  229 
  230         UINT m_UpdateCount; // Speeding
  231 };
  232 
  233 #endif //__MJ_FUNK.H
  234 
  235 //#############################################################################
  236 // LastLine
  237 //#############################################################################
  238 
  239