File: INCLUDE\MOTRSTRG\M_MOTCOM.H

    1 //#############################################################################
    2 //                                                                           //
    3 // M_MOTCOM.H                                                                //
    4 // Subsystem: Motorsteuerung                                                 //
    5 // Benutzung durch andere Subsysteme erforderlich: JA                        //
    6 // Implementation: MOTORS.CPP                                                //
    7 //                                                                           //
    8 //---------------------------------------------------------------------------//
    9 // Autoren: Heiko Damerow MPG AG "Roentgenbeugung" (C) 1993,94               //
   10 // Stand:   05.08.2002                                                       //
   11 //                                                                           //
   12 //#############################################################################
   13 
   14 //-----------------------------------------------------------------------------
   15 // ÄNDERUNGEN : Kullmann, Reinecker (04.08.02) TMotor, TMList
   16 //
   17 // - einheitlich strukturiert, formatiert und kommentiert
   18 // - Sinneinheiten zusammengefaßt
   19 // - stärkere Datenkapselung und neue Methoden für Memberzugriff in TMotor
   20 // - explizite inline Deklaration
   21 // - unnötige friend Deklarationen und Toten Code auskommentiert
   22 // - Klasse TMotor exportiert
   23 //-----------------------------------------------------------------------------
   24 
   25 #ifndef __M_MOTCOM_H
   26 #define __M_MOTCOM_H
   27 
   28 #include "internls\evrythng.h" // TUnitType
   29 
   30 #if defined (Build_Motors)
31 #define _MOTORCLASS __declspec(dllexport)
32 #elif defined(Use_Motors)
33 #define _MOTORCLASS __declspec(dllimport)
34 #else 35 #define _MOTORCLASS 36 #endif 37 38 //--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||--//--||--\\--||-- 39 40 const UINT _MAXLENCHARACTERISTIC= 50; //max. 50 Zeichen als Motorbezeichnung 41 const UINT _MAXLENUNIT= 20; //max. 20 Zeichen als Einheit eines Antriebs 42 const UINT _MAXLENFORMAT= 5; //max. 6 Zeichen als Zahlenformat (z.B. "%f:3") 43 44 //----------------------------------------------------------------------------- 45 46 /* Benutzt in m_layer.h/cpp, m_steerg.cpp, m_motcom.h, motors.cpp */ 47 enum EAxisType 48 { 49 X= 1, Y, Z, Omega, Theta, Phi, Psi, Encoder, Absorber, Tilt, Collimator, 50 Rotation, Monochromator, DC, DF 51 }; 52 53 //----------------------------------------------------------------------------- 54 /* Benutzt in m_motcom.h, m_layer.h/cpp, motors.cpp */ 55 enum EMParameter 56 { 57 ThisPosition= 1, OldPosition, WaitExecution, NoWait 58 }; 59 60 //----------------------------------------------------------------------------- 61 62 enum ECorrect 63 { 64 CorrLinear= 1, CorrPolynom 65 }; 66 //----------------------------------------------------------------------------- 67 68 enum ETrans 69 { 70 ToAngle= 1, ToPosition 71 }; 72 //----------------------------------------------------------------------------- 73 74 struct TMSettings 75 { 76 double dAngleMin, dAngleMax, dAngle, dSpeed, dAngleWidth; 77 }; 78 79 //---------------------------------------------------------------------------------------- 80 // TMotor 81 //---------------------------------------------------------------------------------------- 82 class _MOTORCLASS TMotor 83 { 84 //friend class TMList; 85 //friend class TCalibrateDlg; 86 //friend class TPositionControl; war sowieso TPosControlDlg gemeint 87 //friend class TMotorParamDlg; 88 //---------------------------------------------------------------------------------------- 89 public: 90 TMotor( void ); 91 virtual ~TMotor( void ) 92 {} 93 ; 94 //---------------------------------------------------------------------------------------- 95 public: 96 int GetId ( void ) // Index in der Antriebsliste (TMList) 97 { 98 return nId; 99 }; 100 static int GetMaxId ( void ) 101 { 102 return nMaxId; 103 }; 104 LPCSTR pCharacteristic ( void ) // Antriebsbezeichnung 105 { 106 return (LPCSTR)szCharacteristic; 107 }; 108 // aktuelle Antriebsposition in Nutzereinheiten 109 BOOL GetAngle ( BOOL ); // aktualisiert NUR bei Stillstand den Wert in dAngle um dAngleBias korrigiert 110 double GetAngle ( BOOL, BOOL& ); // ruft GetAngle( BOOL ) und gibt dAngle zurück 111 double GetAngle ( void ) // zu zuletzt mit GetAngle( BOOL ) ausgelesenen (und um dAngleBias korrigierten) Wert zurückgeben 112 { 113 return dAngle; 114 }; 115 double GetAngleAbs ( BOOL, BOOL& ); // aktualisiert NUR bei Stillstand den Wert in dAngle OHNE Korrektur 116 // minimale Antriebsposition in Nutzereinheiten 117 double GetAngleMin ( void ) 118 { 119 return dAngleMin; 120 }; 121 void SetAngleMin ( double aAngle ) 122 { 123 dAngleMin= aAngle; 124 }; 125 double GetAngleRelativeMin ( void ); 126 // maximale Antriebsposition in Nutzereinheiten 127 double GetAngleMax ( void ) 128 { 129 return dAngleMax; 130 }; 131 void SetAngleMax ( double aAngle ) 132 { 133 dAngleMax= aAngle; 134 }; 135 double GetAngleRelativeMax ( void ); 136 // Schrittweite in Nutzereinheiten 137 double GetAngleWidth ( void ) 138 { 139 return dAngleWidth; 140 }; 141 BOOL SetAngleWidth ( double ); 142 // minimale / maximale Schrittweite in Nutzereinheiten 143 double GetMinAngleWidth( void ); 144 double GetMaxAngleWidth( void ); 145 // Bewegung durchführen 146 BOOL MoveToAngle ( double ); 147 BOOL MoveByAngle ( double ); 148 // Offset und relative Null in Nutzereinheiten 149 double GetAngleBias ( void ) 150 { 151 return dAngleBias; 152 }; 153 BOOL SetAngleBias ( double ); 154 BOOL SetRelativeZero ( void ); 155 BOOL ResetRelativeZero ( void ); 156 BOOL IsDistanceRelative ( void ); 157 158 double GetMinSpeed ( void ); // Minimalgeschwindigkeit in Nutzereinheiten 159 double GetMaxSpeed ( void ); // Maximalgeschwindigkeit in Nutzereinheiten 160 double GetAcceleration ( void ); // Beschleunigung in Nutzereinheiten 161 // Einstellungen lesen / schreiben 162 BOOL PushSettings ( void ); 163 BOOL PopSettings ( EMParameter ); 164 165 UINT GetDigits ( void ); // Anzahl der Nachkommastellen (nDigits) 166 LPCSTR pSF ( void ) // Format für Nachkommastellengenauigkeit der Schrittweiten 167 { 168 return (LPCSTR)SFmt; 169 }; 170 LPCSTR pDF ( void ) // Format für Nachkommastellengenauigkeit der Winkelwerte 171 { 172 return (LPCSTR)DFmt; 173 }; 174 175 BOOL IsRangeHit ( void ) 176 { 177 return bRangeHit; 178 }; 179 BOOL SetAngleRange ( void ); 180 DWORD GetLimit ( void ) 181 { 182 return dwRemoveLimit; 183 }; 184 // aktuelle Position in Encoderschritten 185 long GetPosition ( void ) 186 { 187 return lPosition; 188 }; 189 void SetDeltaPosition ( long aPos ) 190 { 191 lDeltaPosition= aPos; 192 }; 193 // minimale Position in Encoderschritten 194 long GetPositionMin ( void ) 195 { 196 return lPositionMin; 197 }; 198 void SetPositionMin ( long aPos) 199 { 200 lPositionMin= aPos; 201 }; 202 // maximale Position in Encoderschritten 203 long GetPositionMax ( void ) 204 { 205 return lPositionMax; 206 }; 207 void SetPositionMax ( long aPos) 208 { 209 lPositionMax= aPos; 210 }; 211 float GetMinPrecision(bool stepWidth=false) 212 { 213 UINT digits= GetDigits(); 214 if ( stepWidth ) digits++; 215 return ( 1 / (float)pow((float)10, (float)digits) ); 216 }; 217 // Schrittweite in Encoderschritten 218 WORD GetPositionWidth () 219 { 220 return max( wPositionWidth, GetMinPrecision(true) ); // verhindert die Rückgabe von 0 und damit das leidige div 0 221 }; 222 void SetPositionWidth ( WORD aWidth ) 223 { 224 wPositionWidth= max( aWidth, GetMinPrecision(true) ); 225 }; 226 // Einheit des Antriebs 227 EUnitType GetUnit ( void ) 228 { 229 return eUnit; 230 }; 231 LPCSTR GetUnitName ( void ) 232 { 233 return szUnit; 234 }; 235 236 long GetDistanceToZero ( void ) 237 { 238 return lDistanceToZero; 239 }; 240 void SetDistanceToZero ( long aDist) 241 { 242 lDistanceToZero= aDist; 243 }; 244 245 double GetInitialAngle ( void ) 246 { 247 return dInitialAngle; 248 }; 249 BOOL IsInitialMoveReady ( void ) 250 { 251 return bInitialMoveReady; 252 } 253 // Status des Refrenzpunktlaufs 254 BOOL IsCalibrated ( void ) 255 { 256 return bIsCalibrated; 257 } 258 void SetCalibrationState ( BOOL state ) 259 { 260 bIsCalibrated= state; 261 } 262 void SetCorrectionState ( BOOL ); 263 264 //long PreviousPosition( void ) { return lPreviousPosition; }; (Toter Code, am 02.08.02 auskommentiert) 265 //---------------------------------------------------------------------------------------- 266 public: 267 virtual void OptimizingDlg( void ) 268 { 269 return; 270 } 271 virtual void StartCheckScan( void ) 272 { 273 return; 274 } 275 virtual BOOL SetLimit( DWORD ) 276 { 277 return TRUE; 278 } 279 virtual BOOL SetLine( int, BOOL ) 280 { 281 return TRUE; 282 } 283 284 virtual BOOL StartLimitWatch( void ) 285 { 286 return R_OK; 287 } 288 virtual BOOL StopLimitWatch( void ) 289 { 290 return R_OK; 291 } 292 293 virtual int ExecuteCmd( LPSTR ) 294 { 295 return R_OK; 296 } 297 virtual BOOL ActivateDrive( void ) 298 { 299 return TRUE; 300 } 301 302 virtual BOOL IsMoveFinish( void ) 303 { 304 return TRUE; 305 } 306 virtual BOOL IsLimitHit( void ) 307 { 308 return TRUE; 309 } 310 virtual BOOL IsIndexArrived( void ) 311 { 312 return TRUE; 313 } 314 315 virtual BOOL StartToIndex( long & ) 316 { 317 return TRUE; 318 } 319 virtual BOOL StopDrive( BOOL ) 320 { 321 return TRUE; 322 } //Parameter geändert int -> BOOL (08.08.02) 323 virtual BOOL GetPosition( BOOL ) 324 { 325 return TRUE; 326 } 327 virtual long GetFailure( void ) 328 { 329 return 0; 330 } 331 // Bewegung in Encoderschritten 332 virtual BOOL MoveByPosition( long ); 333 virtual BOOL MoveToPosition( long ); 334 335 virtual BOOL SetHome( void ); 336 // Speed: Geschwindigkeit in Nutzereinheiten 337 virtual double GetSpeed( void ) 338 { 339 return 1.0; 340 } 341 virtual BOOL SetSpeed( double ) 342 { 343 return TRUE; 344 } 345 346 virtual int SaveSettings( BOOL ); 347 virtual int Initialize( void ); 348 virtual WORD GetStatus( void ) 349 { 350 return 0xFF; 351 } 352 353 //virtual float GetMoment( void ) { return 1.0; }; (Toter Code, am 02.08.02 auskommentiert) 354 //virtual BOOL SetMoment( float ) { return TRUE; }; (Toter Code, am 02.08.02 auskommentiert) 355 //---------------------------------------------------------------------------------------- 356 // ANFANG: Zugriff auf folgende Member eingeschränkt 357 protected: 358 int nId; 359 // Antriebsdaten in Encoderschritten 360 long lPosition; 361 long lDeltaPosition; 362 long lPositionMax; 363 long lPositionMin; 364 WORD wPositionWidth; 365 WORD wPositionMinWidth; 366 WORD wPositionMaxWidth; 367 // Antriebsdaten in Nutzereinheiten 368 double dAngle; 369 double dAngleBias; 370 double dAngleWidth; 371 double dAngleMin; 372 double dAngleMax; 373 double dInitialAngle; 374 // Geschwindigkeit in Nutzereinheiten 375 double dSpeed; 376 float fSpeedScale; 377 378 EUnitType eUnit; 379 UINT nDigits; // Kullmann, Reinecker: neuer Member 380 BOOL bUpwards; 381 BOOL bInquireStatus; 382 BOOL bRangeHit; 383 BOOL bIndexLine; 384 BOOL bMoveFirstToLimit; 385 BOOL bIndexDetected; 386 BOOL bLimitWatchActive; 387 BOOL bControlBoardOk; 388 long lDistanceToZero; 389 long lCorrPos; 390 DWORD dwRemoveLimit; 391 DWORD dwHysteresis; 392 // Geschwindigkeit in Encoderschritten 393 DWORD dwVelocity; 394 DWORD dwMaxVelocity; 395 DWORD dwAcceleration; 396 char szUnit[ _MAXLENUNIT + 1 ]; 397 char SFmt[ _MAXLENFORMAT + 1 ]; 398 char DFmt[ _MAXLENFORMAT + 1 ]; 399 //long lPreviousPosition; (Toter Code, am 02.08.02 auskommentiert) 400 401 // ENDE: Einschränkung 402 //---------------------------------------------------------------------------------------- 403 private: 404 BOOL Translate( long&, double ); // Umrechnung von Nutzereinheiten(Angle) in Encoderschritte(Position) 405 BOOL Translate( double&, long ); // Umrechnung von Encoderschritte(Position) in Nutzereinheiten(Angle um den Offset korrigiert) 406 BOOL TranslateAbs( double&, long ); // Umrechnung von Encoderschritte(Position) in Nutzereinheiten 407 void funcd( double arg, double offset, double* f, double* df ); 408 int rtsave( double offset, double x1, double x2, double xacc, double* ret ); 409 //---------------------------------------------------------------------------------------- 410 private: 411 BOOL bIsCalibrated; 412 BOOL bInitialMoveReady; 413 static int nMaxId; 414 double dKoeff_3; 415 double dKoeff_2; 416 double dKoeff_1; 417 DWORD dwInterval; 418 BOOL bCorrection; 419 float fCorrBias; 420 ECorrect eCorrStatus; 421 char szCharacteristic[ _MAXLENCHARACTERISTIC + 1 ]; 422 TMSettings Settings; 423 }; 424 425 //---------------------------------------------------------------------------------------- 426 // TMList 427 //---------------------------------------------------------------------------------------- 428 class _MOTORCLASS TMList 429 { 430 public: 431 TMList( int ); // zweiten Parameter HINSTANCE entfernt (08.08.02) 432 virtual ~TMList( void ); 433 434 private: 435 TMList( const TMList& ) {} // Copy-Konstruktor nicht nutzbar 436 437 //---------------------------------------------------------------------------------------- 438 public: 439 int AD_Z, AD_Y, AD_X; 440 int AD_Tilt, AD_DC, AD_Collimator, AD_DF; 441 int AD_Encoder; 442 int AD_Phi; 443 int AD_Psi; 444 int AD_Rotation; 445 int AD_Absorber, AD_Monochromator; 446 int AD_Theta; 447 int AD_Omega; 448 //---------------------------------------------------------------------------------------- 449 public: 450 TMotor *MP( void ); 451 TMotor *MP( int ); 452 void SetAngleDefault( void ); 453 void PositionControlDlg( void ); 454 void SetParametersDlg( void ); 455 void InquireReferencePointDlg( BOOL ); 456 BOOL InitializeModule( void ); 457 BOOL SaveModuleSettings( void ); 458 BOOL SetAxis( int ); 459 int GetAxis( void ) 460 { 461 return nActiveDrive; 462 }; 463 int LastId( void ) 464 { 465 return nLastDrive; 466 }; 467 //HINSTANCE GetModuleHandle( void ) { return hMInstance; }; (Toter Code, am 08.08.02 auskommentiert) 468 int GetAxisNumber( void ) 469 { 470 return ( nLastDrive + 1 ); 471 }; 472 473 static EAxisType ParsingAxis( LPCSTR ); 474 //---------------------------------------------------------------------------------------- 475 private: 476 //HINSTANCE hMInstance; (Toter Code, am 08.08.02 auskommentiert) 477 int nMaxNumber; 478 int nLastDrive; // points the last axis 479 int nActiveDrive; // points the actual axis 480 TMotor** aMotor; 481 }; 482 //---------------------------------------------------------------------------------------- 483 484 typedef TMList FAR * LPMList; 485 typedef TMotor FAR * LPMotor; 486 #endif 487 // __LastLine__ 488 489