> Projekt: Software-Sanierung > Entwicklerdokumentation > Tabelle zu den Entwicklerdokumenten > Motorsteuerung > Fehler

Motorsteuerung

Fehler



Erkannte und evtl. korrigierte Fehler in den Quellfiles durch die Entwickler

(Jeder erkannte Fehler in den Quellfiles ist hier zu dokumentieren. Ist darüber hinaus eine 'problemlose' Fehlerbehebung möglich (ohne Seiteneffekte, ...), so kann diese am Quelltext vorgenommen werden. Sie ist dort kenntlich zu machen und außerdem hier als vorgenommene Korrektur zu erwähnen.)

Statusarten:

jeder dieser Stati sollte mit Datum und Userkennung in der Liste auftauchen.
Die Spalte Beschreibung kann die Abschnitte: Charakterisierung, Ursache und Behebung beinhalten.

Nr. Datum Status Wer? Beschreibung
1 19.06.2000 
20.06.2000
1ST
FIX
luetzken
luetzken
Charakterisierung:
mlGetIdByName(Monochromator) liefert Zahl != -1 auch wenn kein Monochromator vorhanden ist (i.e. keiner im ini-File eingetragen)
Ursache:

Initialisierung der member-Variablen AD_Monochromator in Konstruktor von TMList fehlte. Alle anderen AD_???-Member werden auf -1 initialisiert. 
Behebung:
motors.cpp: TMList::TMList(int maxn,HINSTANCE inst) korrigiert. 
2 19.06.2000
20.06.2000
1ST
FIX
luetzken
luetzken
Behebung:
m_layer.cpp: BOOL _export WINAPI mlIsAxisValid(TAxisType type)

Zeile
case Monochromator: return (lpMList->AD_Encoder > -1);
muss
case Monochromator: return (lpMList->AD_Monochromator > -1);
lauten
3 20.09.2000
07.02.2001
1ST
FIX
luetzken
luetzken
Charakterisierung:
ini-Eintrag Upwards wird nicht gelesen
Beschreibung:
Die Richtung der letzten Bewegung wird zwar im ini-File gespeichert aber bei der Initialisierung nicht ausgelesen. Das führt zu Positionierungsfehlern in der Größe der Hysteresis.
Behebung:
in TMotor::TMotor(void) Zeile fürs Einlesen (dort wird auch Hysteresis eingelesen)
4 20.09.2000 1ST
FEA
luetzken
kullmann,
reinecker
Charakterisierung:
ini-Eintrag AngleBias wird nicht gelesen
Beschreibung:
Das Offset der Relativen Null zur Absoluten wird zwar im ini-File gespeichert aber bei der Initialisierung nicht ausgelesen.
AngleBias wird nach der Initialisierung stets auf Null gesetzt, scheinbar soll die relative Null also nach dem Neustart nicht wiederhergestellt werden.
Behebung:
entfernen von AngleBias aus Sicherungs-Methode TMotor::SaveSettings(BOOL LastSave)
Bemerkung (Reinecker):
Nach Rücksprache mit Herrn Panzner hat sich herausgestellt, dass dies so gewünscht wird. Wenn das Programm ordnungsgemäß beendet wird, soll AngleBias beim Neustart wieder 0 sein.
WUNSCH: Jedes Mal wenn AngleBias geändert wird, ist dies im ini-File zu speichern ... falls das Programm abstürzt, soll AngleBias nämlich wieder zur Verfügung stehen.
5 18.1.2001
29.9.2001
1ST
FIX
luetzken
luetzken
Charakterisierung:
Endlos-Schleife beim Anfahren des Index-Punktes (C-832)
Beschreibung:
In motors.dll: BOOL TC_832::IsIndexArrived(void) :
IsIndexArrived
wird von TCalibrate::Dlg_OnTimer gerufen; wenn der Index erreicht wurde stoppt die Methode den Motor ermittelt die Index-Position (an der der Motor vorbeigefahren ist) und startet eine Bewegung zum Index-Punkt ein Delay(150) soll scheinbar zusichern, dass der Motor genug Zeit hatte die Position zu erreichen und stehen zu bleiben, dann wird die Methode mit FALSE verlassen (i.e. Index not arrived!!). Beim nächsten Aufruf von (Timer gesteuert) ist aber der Motor (wegen sehr kleiner Beschleunigung, 80, bzw. zu kurzem Delay auf schnellerer Maschine) noch nicht stehen geblieben, da (in der Simulation) der SIGS-Reg. immer noch das Erreichen der Indexposition signalisiert, startet die Methode erneut eine Bewegung zu zum Index-Punkt die aber wiederum nicht in der Zeit bis zum nächsten Test erreicht wird ... (LOOP) wird eine höhere Beschleunigung gewählt tritt der Fehler nicht auf
Behebung:

Delay durch DelayTime ersetzen, oder besser noch durch Schleife "do ... while (! MoveFinished() );"
Anmerkung:
der Fehler ist durch einen Fehler in der Motorensimulation hervorgerufen worden; dieser ist beseitigt worden
6 21.2.2001
21.3.2001
1ST
FIX
luetzken
luetzken
Charakterisierung:
Absturz (Schutzverletzung) wenn kein Motor im INI-File, bzw. wenn der erste Motor keine Type-Angabe hat
Behebung:
In TMList::InitializeModule; im Fall dass kein Motor im ini-File spezifiziert wird, sollte automatisch ein Motor vom Typ TMotor in die Motorenliste eingetragen werden; damit ist dann die Voraussetzung von der überall im Programm ausgegangen wird erfüllt; andernfalls müsste man überall Tests einbauen ob es einen Motor gibt, und sich auch noch überlegen wie man reagieren soll, falls es keinen gibt; diese Änderung war also relativ einfach und nur an einer Stelle durchzuführen.
7 08.08.2002
21.10.2002
1ST
FIX
hanisch
hanisch
Charakterisierung:
Das Objekt der Klasse TMList wird in den Methoden BOOL DllEntryPoint(HANDLE,DWORD,LPVOID) bzw. int WINAPI LibMain(HINSTANCE,WORD,WORD,LPSTR) erzeugt aber nirgendwo gelöscht. (lpMList=(LPMList) new TMList(10,NULL);))
Ursache:
Fehlendes delete lpMList;
Behebung:
Löschen des Objekts in der Methode int CALLBACK WEP(int) mit delete lpMList; (Datei M_LAYER.CPP)
8 19.06.2000
20.06.2000
1ST
FIX
sacklows
sacklows
Charakterisierung: ...
Ursache: ...
Behebung: ...
9 04.01.2003 FIX kullmann,
reinecker
Charakterisierung:
Die Anweisungen friend TMList, friend TPositionControl und friend TMotorParam sind sinnlose Friend-Relationen.
Behebung:
auskommentiert
10 04.01.2003 FIX kullmann,
reinecker
Charakterisierung:
Für den Parameter bei virtual BOOL StopDrive( int ) ist der Wertebereich BOOL ausreichend.
Behebung:
bei TMotor, TC_812 und TC_832 korrigiert
11 04.01.2003 FIX kullmann,
reinecker
Charakterisierung:
Die Methode virtual int ExecuteCmd( LPSTR ) ist mit dieser falschen Signatur bei TC_832 implementiert. Der Rückgabewert muss BOOL sein.
Behebung:
bei TC_832 korrigiert
12 04.01.2003 FIX kullmann,
reinecker
Charakterisierung:
Die Methode TAxisType ParsingAxis( LPSTR ) TMList sollte static sein.
Behebung:
korrigiert
13 04.01.2003 FIX kullmann,
reinecker
Charakterisierung:
Für den Parameter der Methode void InquireReferencePointDlg( int ) in TMList ist der Wertebereich BOOL  ausreichend.
Wenn hier alle Antriebe kalibriert werden sollen ist task == 99. Das ist schlechtes Design
Behebung:
Der Parameter ist korrigiert und  task == 99 ist in task == TRUE geändert.
14 04.01.2003 FIX kullmann,
reinecker
Charakterisierung:
Ein Teil der Attribute in TMotor sind public deklariert, was schlechtes Design ist. Die Zugriffsbeschränkung sollte mindestens protected sein.
Behebung:
Zugriffsbeschränkung für alle Attribute in TMotor ist jetzt mindestens protected. Zur externen Benutzung sind da wo nötig neue Accessor- und Mutatormethoden hinzugefügt.
15 04.01.2003 1ST
FIX
Physiker
kullmann,
reinecker
Charakterisierung:
Das Verhältnis  von Encoderschritten zu Winkelwerten wird durch den INI-Eintrag Koeff1 bestimmt. Zur Umkehrung des Winkelwert-Intervalls (AngleMax < AngleMin) muss dieser Koeffizient  aber negativ sein. Die Folge ist, dass sich der Antrieb von einer kleineren Winkelposition zu einer Größeren nicht mehr nach links (bzw. links herum) sondern nach rechts (bzw. rechts herum) bewegt. Dieser Fall wurde in der Motorsteuerung überhaupt nicht beachtet. Die Folge waren unkontrollierte Motorbewegungen oder Stillstand.
Behebung:
BOOL TMotor::SetAngleRange( void ) {
  ...
  dAngleMin = a1; // alter Code: min( a1,a2 );
  dAngleMax = a2; // alter Code: max( a1,a2 );
  ...
};

BOOL TMotor::Translate( long &pos,double ang ) {
  ...
  // erzeugten RangeHit sobald dAngleMin > dAngleMax war
  /* if( l_ang > dAngleMax ) {
       bRangeHit = TRUE;
       l_ang = dAngleMax; }

     if( ang < dAngleMin ) {
       bRangeHit = TRUE;
       l_ang = dAngleMin; } */
  temp = l_ang;
  // neue Funktion, dort beliebige Intervalle möglich
  bRangeHit= SetInRange( temp, dAngleMin, dAngleMax );
  ...
};

16 30.01.2003 FIX reinecke Charakterisierung:
Beim Areascan wird bei Verletzung des Wertebereichs der Omega-Start- und -Endposition der maximale Wertebereich vorgeschlagen. Hierbei wurden die Werte aber vertauscht in die Eingabefelder für Minimum (max. Winkel) und Maximum (min. Winkel) eingetragen!
Ursache:
Vermutlich durch den Wunsch der Physiker (AngleMin auf einen größeren Wert als AngleMax setzen zu dürfen) hervorgerufen. Da dieser Fehler auch beim LineScan auftrat und auch in anderen Subsystemen vermutet wird ist die Korrektur im Subsystem Motor durchzuführen.
Behebung:
Das C-Interface das, außer in der Neuen Manuellen Justage, überall eingesetzt wird, gibt nun als minimalen Winkel nicht AngleMin, sondern das Minimum aus AngleMin und AngleMax zurück ... maximaler Winkel analog.
17 15.1.2001 1ST luetzken Charakterisierung:
Implementation für C-832 verwendet control word für "Stop Smoothly" anstatt von "Stop Abruptly"
Beschreibung:
das control-word zum command LTRJ für 'Stop Abruptly' muss bei Bit 9 eine 1 haben (0x200), für 'Stop Smoothly' bei bit 10 (0x400) (s. Doc. S. 29). In motors.cpp: TC_832::IsIndexArrived ; TC_832::IsLimitHit und öfter (?): Überall wo der Motor gestoppt wird wird 0x400 verwendet; selbst da wo 'stop abruplty' als Kommentar steht. Das hat die FATALE Wirkung, das der Motor am LimitSwitch nicht unmittelbar gestoppt wird, sondern mit der programmierten Beschleunigung angehalten wird; d.h. je größer die Geschwindigkeit ist mit der der Motor auf den LimitSwitch fährt um so weiter fährt der Motor noch - gegen den Schalter.
Bemerkung (Reinecker):
Die betroffenen Stellen sind zu identifizieren und nach Rücksprache mit den Physikern ggf. zu korrigieren.
18 18.1.2001 1ST
 
freund/
hepp/
luetzken
Charakterisierung:
l_layer.cpp
: Delay()
Beschreibung:
die Funktion Delay() verbraucht Rechenzeit um eine Verzögerung zu erreichen; sie wird z.T. in der Art einer Zusicherung verwendet das "hinreichend Zeit" vergangen ist; ABER die Funktion verzögert auf unterschiedlich schnellen Rechnern unterschiedlich lang; s. z.B. Fehler 6.
Behebung:
JEDE Verwendung von Delay() überprüfen. Als mindestens durch DelayTime() ersetzen.
19 21.2.2001 1ST luetzken Charakterisierung:
Fehler bei der Hysteresisbehandlung
Beschreibung:
Die Behandlung des Motorenspiels ist insgesamt fehlerhaft. Vgl. Fehler 4.
Behebung:
20 21.3.2001 1ST luetzken Charakterisierung:
Fehlende Überprüfung der Konfigurationsparameter aus dem ini-File.
Beschreibung:
so gut wie keiner der Konf.-Parameter wird beim Auslesen aus dem ini-File überprüft, auch solche nicht für die die manuelle Eingabe im ini-File die einzige Quelle ist - also z.B. die Hardwareansteuerungs-Parameter
Behebung:
die eingelesenen Parameter sind in den Initialisierungsroutinen zu prüfen:
●   TMotor::TMotor()
●   TDC_Drive::TDC_Drive( void )
●   TC_812::TC_812( void )
●   TC_812GPIB::TC_812GPIB( void )
●   TC_812ISA::TC_812ISA( void )
●   TC_832::TC_832( void )
●   TMotor::Initialize( void )
●   TDC_Drive::Initialize( void )
●   TC_812GPIB::Initialize( void )
21 16.11.2001 1ST Diff./Refl.-gruppe Charakterisierung:
Uns wurde von den Physikern ein Fehler gemeldet, der unserer Meinung nach mit der Motorsteuerung zutun hat. Eine Beschreibung ist in der Diffr./Refl.-Fehlerliste unter Fehler 60 zu finden.
Behebung:
22 29.10.2001 1ST luetzken Charakterisierung:
Endlosschleife bei RPL falls IndexLine=1 aber kein Indexsignal gefunden wird.
Beschreibung:
Wenn ein C-832er Motor zwar laut ini-File eine IndexLine hat diese aber nicht anspricht oder nicht vorhanden ist, gerät der Referenzpunktlauf in eine Schleife, die aber über Cancel abgebrochen werden kann. s. Testfall RPL022
Behebung: ...
23 15.01.2002 1ST hanisch Charakterisierung:
Im Dialog "Grundstellung anfahren" werden Optionen "Position beibehalten" und "Grundstellung für alle Antriebe" ausgegraut, wenn die Option "Gültige Kalibrierungsdaten" deaktiviert wird. Trotzdem wird beim Referenzpunktlauf der Zustand der ausgegrauten Optionen berücksichtigt.
Ursache:
In TCalibrateDlg::Dlg_OnCommand() werden in Abhängigkeit von id_ValidCalibrationData die Elemente id_HoldPosition und id_AllMotorsReset nur ausgegraut. Die Zustände der Variablen bHoldPosition und bAllMotors bleiben davon unberührt und beeinflussen den Referenzpunktlauf.
Behebung: ...
24 29.08.2002 1ST hanisch Charakterisierung:
Beim Überschreiten des Endlage-Schalters (nur C-832 Antriebe) erscheinen mehrere Messageboxen "Motor-Steuerung" mit einer Warnung. Es sollte eigentlich nur eine einzige Messagebox erscheinen.
Ursache:
In der Funktion CALLBACK TC_832::LimitWatch() wird die Variable MessageIsPosted definiert, die wahrscheinlich für diesen Zweck vorgesehen wurde aber nirgends gesetzt oder ausgelesen wird.
Behebung: ...
25 08.08.2002 1ST hanisch
kullmann,
reinecker
Charakterisierung:
Die Methoden zur polynomialen Umrechnung TMotor::funcd() und TMotor::rtsave() werden niemals aufgerufen, obwohl im ini-File die jeweiligen Parameter dafür gesetzt sind.
Ursache:
Diese Methoden werden nur aufgerufen, wenn gilt eCorrStatus=CorrPolynom in TMotor::Translate(long&,double). An dieser Stelle ist jedoch immer eCorrStatus==CorrLinear, unabhängig von den Einstellungen in der INI-Datei.
Behebung:
Hierfür ist eine umfangreiche Analyse des Quellcodes nötig. Außerdem müssen Rücksprachen mit den Physikern gehalten werden, um die Bedeutung der Umrechnungsarten in Erfahrung zu bringen. Die Dokumente im Web-Repository reichen zur Klärung dieser Problematik nicht aus.
Bemerkung (Reinecker):
Die Rücksprache mit den Physikern ergab, dass nur lineare Abhängigkeiten benutzt werden. Der Hauptgrund ist vermutlich, dass die Bestimmung der Parameter zu kompliziert ist und dass Keiner weiß wie diese zu bestimmen sind. Probleme gab es schon bei der Justierung der linearen Antriebe.
26 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Inkonsistente Mehrfachverwendung von TMotor::wPositionWidth, siehe F4 und F6 in Verhaltensspezifikation.
27 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
TMotor::dSpeed, TMotor::dAngle, TMotor::dAngleMin, TMotor::dAngleMax und TMotor::dAngleWidth sind redundant zu ihren Äquivalenten in Encoderschritten.
Bemerkung (Reinecker):
Aus dem ini-File sollten die Winkelwerte (Speed, Angle, AngleMin, AngleMax und AngleWidth) gelesen und in Encoderschritte umgerechnet werden.
Die Verwendung von dAngle, dAngleMin, dAngleMax und dAngleWidth darf nur lesend erfolgen und sollte durch Get-Methoden realisiert werden, diese sollten den Winkel- aus den Encoderwerten berechnen! GetSpeed und SetSpeed sind bereits richtig implementiert worden.
28 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
TMotor::PopSettings und TMotor::PushSettings sind nicht als virtuell deklariert, daher wird die Überladung in TDC_Drive nie wirksam.
29 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
TMList::InitializeModule ist problematisch implementiert. Wenn mehrere Antriebe für dieselbe Achse erzeugt werden, kann nur der zuletzt erzeugte Antrieb verwendet werden. U.u. kann dadurch ein falscher Antrieb bewegt werden - siehe RE-Engineering des OO-Subsystems Motor.
30 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Der HARDWARE.INI Eintrag  [MOTOR<M>] −> DeltaPosition für die aktuelle Antriebsposition
wird mit dem Inhalt von long lPosition nur geschrieben und in long lDeltaPosition nur gelesen.
Es sollte nur eine sollte nur ein einziges Attribute geben, das die DeltaPosition liest und schreibt.
Behebung:
31 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Die Indizies für Antriebe, die sich mittels TMotor in lpMList von registriert und wie sie die Methode BOOL InitializeModule( void ) in TMList vergibt, können erheblich variieren. Das kann im Programm zu schwerwiegenden Zuordnungsfehlen führen. Abstürzen oder das Bewegen eines falschen Antrieb können die Folge sein!
Das ist bereits der Fall wenn:
●   ein Motorabschnitt in der ini-Datei gelöscht wird
●   wenn ein TMotor-Objekt entsteht, das nicht von lpMList erzeugt wurde
●   wenn mehr Antriebe erzeugt werden, als aMotor aufnehmen kann
Behebung:
32 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Bei der Methode void funcd( double, double, double*, double* ) sollte für den erster Parameter der Wertebereich long ausreichen. Dieser ist für die Antriebsposition in Encoderschritten und die ist stets ganzzahlig.
Behebung:
33 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Bei der Methode int rtsave( double, double, double, double, double* ) sollte für den letzten Parameter der Wertebereich long ausreichen. Dieser ist für die Antriebsposition in Encoderschritten und die ist stets ganzzahlig.
Behebung:
34 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
In der Methode virtual int SaveSettings( BOOL ) werden einige Attribute in der HARDWARE.INI gespeichert. Hier wird aber nicht geprüft, ob die MOTORS.DLL überhaupt erfolgreich initialisiert wurde.
Behebung:
35 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Weder Konstruktor von TMotor noch in der Methode virtual int Initialize( void ) werden das Attribut dSpeed und die Settings initialisiert.
Behebung:
36 04.01.2003 1ST kullmann,
reinecker
Charakterisierung:
Der Referenzpunktlauf beim C-832 ist nicht anwendbar. Die linke Hardwareschranke wird gefunden, der Indexschalter wird (falls vorhanden) überfahren, der Motor fährt in die rechte Hardwareschranke und muss per Hand zurückbewegt werden (Steuerung per Programm nicht möglich).
37 03.05.2003 1ST
FIX
picard,
kullmann,
reinecker
Charakterisierung:
Das Statusfenster 'Motorsimulation' wird unter Win3.1x/ 9x/ Me nicht gezeichnet (kein Inhalt).
Ursache:
Der Inhalt wurde über ein mehrzeiliges Eingabefeld realisiert, das unter den genannten Betriebsystemen anders angesprochen wird, als unter WinNT/ 2000/ XP.
Behebung:
Das Eingabefeld wurde entfernt, die Botschafterbehandlung geändert und das Fenster wird nun selbst gezeichnet.
38 17.02.2004   kullmann,
reinecker
Viele, die Motorsteuerung betreffende Fehler, werden im Dokument beschrieben. (.doc)
Nr 19.06.2000
20.06.2000
1ST
FIX
sacklows
sacklows
Charakterisierung: ...
Ursache: ... 
Behebung: ...


. Projekt: Software-Sanierung
erstellt am 19.06.00 (Sacklowski)
geändert am 17.02.2004 (Sacklowski)