(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 ) { if( ang < dAngleMin ) { |
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: ... |