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)
32 #elif defined(Use_Motors)
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