Ausgehend vom Dialog "Manuelle Justage" - Eingabe "Neuer Winkel"
wird der Informationsfluß im Programm nachverfolgt und erklärt.
Betrachtung Manuelle Justage
Dialogitem: "Neuer Winkel"
1. Eingabe des neuen Winkels
m_dlg.cpp (TAngleControl::Dlg_OnCommand)
:
:
case id_NewAngle:
hDlgItem = GetDlgItem( hwnd, id_NewAngle
);
break;
:
:
-> aktuelles Dialogelement wird auf id_NewAngle gesetzt
2. Betätigung von ENTER
-> IDOK-Event wird ausgeloest
3. Event-Verarbeitung
m_dlg.cpp
case IDOK:
if (!hDlgItem)
{
TModalDlg::Dlg_OnCommand( hwnd,
id, hwndCtl, codeNotify );
break;
}
// Der Nutzer hat mit
Return eine neue Position, eine neue Geschwindigkeit
// oder eine neue Schrittweite
eingegeben
for (;;)
{
:
:
:
if (hDlgItem == GetDlgItem( hwnd,
id_NewAngle )) //
akt. Dialogitem=NewAngle
{
if (!bMoveActive)
// Motor nicht in Fahrt
{
GetDlgItemText(
hwnd, id_NewAngle, (LPSTR)buf, 10 ); // Winkelwert
aus Textfeld lesen
bMoveActive
= TRUE;
// Motor-aktiv setzen
bLongMove
= TRUE;
// Fahrbetrieb setzen
mMoveToDistance(
atof( buf ) );
// Aufruf der c-Call-Funktion
FORWARD_WM_COMMAND(
hwnd, cm_MoveButton, 0, 0, PostMessage );
}
break;
}
:
:
:
}
hDlgItem = NULL;
SetFocus( BarHandle );
//"Winkelbalken"
bekommt Fokus
break;
-> bei eingegebenem Winkel (aus Dialogelement in Puffer
gelesen)
wird bei inaktivem Motor
(bMoveActive == FALSE)
auf Fahrbetrieb gestellt
(bMoveActive = TRUE; bLongMove = TRUE)
4. Aufruf von
BOOL mMoveToDistance( atof (buf))
(buf = aus Textfeld gelesener Winkelwert)
m_layer.cpp
BOOL _export
WINAPI mMoveToDistance(double angle)
{
if(!bModulLoaded) return FALSE;
// wurde motors.dll korrekt initialisiert ?
lpMList->MP()->MoveToAngle(angle); //
Vorsicht: keine Fehlerkontrolle
return TRUE;
// Fkt. gibt immer TRUE zurueck - Fehler ??
};
5. Aufruf von
TMotor* TMList::MP(void)(motors.cpp:
Rückgabe des aktiven Motors (nActiveDrive) )
und BOOL
TMotor::MoveToAngle(double angle)
motors.cpp
BOOL
TMotor::MoveToAngle(double ang)
{
long lpos;
if(Translate(lpos,ang))
// Umwandlung von Winkel- in Positionsangaben
if(MoveToPosition(lpos)) return
TRUE; // Aufruf der DC-Motor-Funktion mit Pos.angabe
return FALSE;
// bei Fehlschlag: FALSE
};
-> Umrechnung von Winkelmass in Motorposition (motorspezifisch):
BOOL
TMotor::Translate(long &pos,double ang)
- Berücksichtigung
von dAngleBias, dAngleMax, fCorrBias
- Unterscheidung von
Sekunden- und Grad-Werten (abhängig von eUnit)
- abhängig von
eCorrStatus:
Berechnung
durch Polynomberechnung (Newton-Verfahren)
(Benutzung
von motors.cpp:
int
TMotor::rtsave(double offset,double x1,double x2, double xacc, double *ret))
oder einfache Umrechnung in MotorPos. ( l_pos = l_ang / dKoeff_1 )
----> Übergang zur Motorhardwareebene
6. Aufruf von
TDCDrive::MoveToPosition(position)
(position ist der vom Winkelmass umgerechnete Positionswert)
BOOL TDC_Drive::MoveToPosition(long
position)
{
if(bUpwards && (position < lPosition))
// Test, ob Motor noch vor Endlage
{
lDeltaPosition += dwHysteresis;
bUpwards = FALSE;
}
else if(!bUpwards && (position > lPosition))
//
Testen, ob Motor noch vor Endlage
{
lDeltaPosition -= dwHysteresis;
bUpwards = TRUE;
};
// Beruecksichtigen der relativen
Position nach Programm-Start
// und Richtungswechsel
position -= lDeltaPosition + lCorrPos;
return MoveAbsolute(position);
// Aufruf der C-812 bzw. C-832-Fkt.
};
7. Aufruf der motorabhängigen Hardware-Funktion mit umgerechneter
Positionsangabe
(unter Berücksichtigung von Richtung, Spiel
und relativer Position)
TC_812::MoveAbsolute(position)
bzw. TC832::MoveAbsolute(position)
a)
BOOL TC_812::MoveAbsolute(long
pos)
{
char cmd[MaxString+1];
sprintf(cmd,"%uMA%ld\r",nOnBoardId,pos); //
Zusammensetzung des Motorkommandos
if(R_OK == ExecuteCmd(cmd))
// Aufruf der Hardwarefkt.
return TRUE;
// korrekte Ausfuehrung des Kommandos: TRUE
return FALSE;
// wenn Fehler bei Kommandoausfuehrg.: FALSE
};
--> Erzeugung des Motorkommandos
[boardID] MA [Position] [RETURN] (Move Absolute - Kommando für C-812-Karte)
--> Aufruf der Hardwarezugriffsfunktionen
BOOL
TC_812ISA::ExecuteCmd(char *pString) bzw.
BOOL TC_812GPIB::ExecuteCmd(char *pString)
kommentiertes BOOL TC_812ISA::ExecuteCmd(char
*pString)
********** zur weiteren Betrachtung
->TC_812ISA::PutChar / TC_812ISA::GetChar / Delay
->TC_812GPIB --> gTransmit, gReceive, gSPoll
**********
b)
BOOL TC_832::MoveAbsolute(long
pos)
{
Drive628(LTRJ,LD_POS,pos); //
Motorkommando: Load Trajectory Parameter
Drive628(STT,0,0);
// Motorkommando: Start Motion Control
return TRUE;
// Rueckgabewert immer TRUE (Wieso ?)
};
--> Aufruf der Hardwarezugriffsfkt. TC_832::Drive628
und Drive628c
mit Motorkommandos (LTRJ -> Load Trajectory
Parameters (pos, velo, accel, operation mode, etc.)
STT -> Start Motion Control: (execute selected Trajectory)
)
********** zur weiteren Betrachtung
->PutWord /PutDWord / GetWord / GetDWord / LM628Ready
**********
Zusammenfassung
Der Informationsfluß verläuft durch folgende Klassen:
TModalDialog -> TMList -> TMotor -> TDC_Drive -> Motor-Instanzen (TC_812ISA, TC_812GPIB, TC_832)
Die zugehörigen Programmabschnitte befinden sich in folgenden Files:
m_dialog.cpp -> m_layer.cpp -> motors.cpp