com
Level-1
- Beiträge
- 155
- Reaktionspunkte
- 28
-> Hier kostenlos registrieren
hallo zusammen,
habe heute einen kleinen Bug in meiner Software entdeckt, dachte mir es sollte eigentlich kein Bug sein, doch ist es (bin fest davon überzeugt). Siemens antwortet nicht (nocht nicht), deswegen wollte ich die profis hier mal kurz fragen. Dieser Fehler hat mir 2 tage gekostet.
Ich habe einen Flanken-Interrupt an einem Eingang. Dieser inkrementiert den Produktzähler und setzt die Pointer für das Einlesen und Auslesen (Register) auf deren Anfangswerte. Die beiden Pointer (ein und auslesen) werden ständig inkrementiert sobald es einen kameratrigger gibt, auswurf, usw. Ist mein Produktregister = 0, also Produkte kommen nicht mehr, bänder fahren leer.
Bedingung: Wenn Produktzähler=0 ist müssen auch Pointer_einlesen und Pointer_auslesen beide den gleichen wert aufweisen. Ich habe im programm trozdem eine Sicherheit reinprogrammiert, dass wenn das nicht der fall sein sollte, ein Fehler angezeigt wird und die Bänder müssen geleert werden. Beim n. Start ist wieder alles initialisiert. So jezz:
Sicherheitsfunktion:
das ist die böse stelle im programm:
.....
1. UW<= Z_Prd_Register, 0
2. UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
3. S M_Fehler_Register, 1
......
Meine Frage wäre:
Wenn das Interruptereignis (negative flanke am Eingang) auftritt (zwischen ... ...), dann wird mein Z_Prd_Register incrementiert (=>1) und die VW's P_Reg_ein_Stelle und P_Reg_aus_Stelle werden auf die Anfangswerte gesetzt (vor der flanke waren diese Werte gleich, nur unterschiedlich zu deren Anfangswerten!)
Meine Vermutung wäre, dass das Interruptereignis genau zwischen P_Reg_ein_Stelle und P_Reg_aus_Stelle auftritt (ich habe gezählt/ausgerechnet, Wahrscheinlichkeit liegt bei 0.05%). Das heisst der Wert P_Reg_ein_Stelle wird in den Akku geladen, dann kommt Interrupt (Werte werden zurückgesetzt) danach wird der geladene wert mit dem Wert P_Reg_aus_Stelle vergliechen (das jezz natürlich einen anderen Wert hat, Anfangswert) somit kommt es zum Fehler Register.
Was meint Ihr, könnte sowas ekliges passieren? oder wird die Vergleichs-Operation (Zeile 2) erst ausgeführt und danach erst das Auftreten des Interruptereignises quasi bearbeitet/freigegeben?
vielen Dank
com
file:///C:/Dokumente und Einstellungen/PCE/Eigene Dateien/Eigene Bilder/Register_Fehler.bmp
habe heute einen kleinen Bug in meiner Software entdeckt, dachte mir es sollte eigentlich kein Bug sein, doch ist es (bin fest davon überzeugt). Siemens antwortet nicht (nocht nicht), deswegen wollte ich die profis hier mal kurz fragen. Dieser Fehler hat mir 2 tage gekostet.
Ich habe einen Flanken-Interrupt an einem Eingang. Dieser inkrementiert den Produktzähler und setzt die Pointer für das Einlesen und Auslesen (Register) auf deren Anfangswerte. Die beiden Pointer (ein und auslesen) werden ständig inkrementiert sobald es einen kameratrigger gibt, auswurf, usw. Ist mein Produktregister = 0, also Produkte kommen nicht mehr, bänder fahren leer.
Bedingung: Wenn Produktzähler=0 ist müssen auch Pointer_einlesen und Pointer_auslesen beide den gleichen wert aufweisen. Ich habe im programm trozdem eine Sicherheit reinprogrammiert, dass wenn das nicht der fall sein sollte, ein Fehler angezeigt wird und die Bänder müssen geleert werden. Beim n. Start ist wieder alles initialisiert. So jezz:
Sicherheitsfunktion:
das ist die böse stelle im programm:
.....
1. UW<= Z_Prd_Register, 0
2. UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
3. S M_Fehler_Register, 1
......
Meine Frage wäre:
Wenn das Interruptereignis (negative flanke am Eingang) auftritt (zwischen ... ...), dann wird mein Z_Prd_Register incrementiert (=>1) und die VW's P_Reg_ein_Stelle und P_Reg_aus_Stelle werden auf die Anfangswerte gesetzt (vor der flanke waren diese Werte gleich, nur unterschiedlich zu deren Anfangswerten!)
Meine Vermutung wäre, dass das Interruptereignis genau zwischen P_Reg_ein_Stelle und P_Reg_aus_Stelle auftritt (ich habe gezählt/ausgerechnet, Wahrscheinlichkeit liegt bei 0.05%). Das heisst der Wert P_Reg_ein_Stelle wird in den Akku geladen, dann kommt Interrupt (Werte werden zurückgesetzt) danach wird der geladene wert mit dem Wert P_Reg_aus_Stelle vergliechen (das jezz natürlich einen anderen Wert hat, Anfangswert) somit kommt es zum Fehler Register.
Was meint Ihr, könnte sowas ekliges passieren? oder wird die Vergleichs-Operation (Zeile 2) erst ausgeführt und danach erst das Auftreten des Interruptereignises quasi bearbeitet/freigegeben?
vielen Dank
com
file:///C:/Dokumente und Einstellungen/PCE/Eigene Dateien/Eigene Bilder/Register_Fehler.bmp