Interrupts S7-200

com

Level-1
Beiträge
155
Reaktionspunkte
28
Zuviel Werbung?
-> 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
 
Hallo com,

wie du schon ausgerechnet hast kann ja sowas immer passieren. Ist mir in der Praxis leider auch schon passiert, dass ein Interrupt genau in so einem Punkt das laufende Programm unterbrochen hat, obwohl ich immer darauf schaue das sowas nicht vorkommen soll. Aber jeder macht mal einen kleinen Fehler.
Also ich denke mal, dass der laufende Befehl erst abgearbeitet wird und erst dann in das Interrupt gesprungen wird, d.h. Wenn er zwischen Zeile 1 und 2 hineinspring und der Befehl "uw<>" noch nicht angefangen hat, dann hast du auf jedenfall keine unterschiedenlichen Wert in P_Reg_ein_Stelle und P_Reg_aus_Stelle, wenn das vor dem Interrupt nicht der Fall war. Oder was meinen meine anderen Kollegen dazu? Kannst ja mal das Prog reinstellen, dann könnte man es genauer analysieren.

Gruß Hubert
 
Zuviel Werbung?
-> Hier kostenlos registrieren
du kannst doch vor deiner "kritischen Position" im Programm alle Interrupts sperren und danach wieder freigeben.
Wenn während dieser Zeit ein Interrupt auftritt wird er nach der Freigabe nachgeholt.
 
Hallo Jungs,

:) ja ich kann natürlich die interrupts abschalten oder ich mache es mit einem Merker, der mir das Rücksetzen der Werte an dieser Stelle verhindert. Das Problem ist, ich bin darauf wirklich durch ausgiebige tests gekommen. :eek:

Fall1:

.....
1. UW<= Z_Prd_Register, 0
2. UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
3. S M_Fehler_Register, 1
......
Wahrscheinlichkeit 0.05 % dass der Vergleichsoperator (Stelle 2) unterbrochen wird und es zum Registerfehler kommt.

Fall2: (Zeile 1 und 2 vertauscht!)
.....
1. UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
2. UW<= Z_Prd_Register, 0
3. S M_Fehler_Register, 1
......
hier passiert nichts! Alles läuft super stabil und es kommt nie zum Fehler (habe 1.300.000 mal gewürfelt, mit meinem Testprogramm)

Es ist erstaunlich aber wahr. Siemens support hatte ich eben am Telefon, der gute Mann meinte, es könnte auf keinen Fall der Vergleichsbefehl unterbrochen werden. Na ja ich bleibe dran und mache weitere diagnosen.

Vielen Dank für Eure Hilfe!
com
 
Hallo Experten,

wenn Ihr Zeit habt, könnt Ihr mir eine einfache Frage beantworten?
Im Anhang ist ein pdf Dokument (SPS Programm) bestehend aus 3 Seiten. (sehr einfach)
1 und 2 Seite Hauptprogramm und 3-te Seite das Interruptunterprogramm.

Frage:
wird der Zähler Z_Error incrementiert? Wenn ja, warum? :cool:

Vielen Dank!


Gruß
com
 

Anhänge

  • S7_200_Interrupted_Compair_Order.pdf
    16,4 KB · Aufrufe: 14
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo com,

hab mir mal ein bisschen dein Programm angeschaut. Der Z_Error wird erhöht, sobald W_Stelle_ein und W_Stelle_aus unterschiedlich sind, aber du schreinst ja in jedem Zylus in W_Stelle_ein und W_Stelle_aus 4275. Deshalb kann kein unterschied nicht auftreten und deshalb wird Z_Error nicht erhöht.
Was machst du in deinem Interruptprogramm mit den Pointern D_Stelle_ein und D_Stelle_aus, außer, dass du sich auf das gleich VB4250 initialisiert?
Das Interrupt rufst du ja alle 10ms auf, aber was machst du sonst nach damit? Es wäre noch etwas mehr Informationen nötig, um dir etwas besser helfen zu können.
 
Hallo,

danke für deine Mühe!
Also die Werte 4275 werden jeden Zyklus in die VW's reingeschrieben. Ich schalte mit dem Merker die Bearbeitung des Interrupts aus, sodass immer die gleiche Werte in den VW's stehen.
Im Interrupt ändere ich einfach diese VW's indem ich den beiden Pointer die Adressen &VB4250 zuweise. (es steht dann in dem W_Stelle_ein=4250 und im W_Stelle_aus=4250, also die gleichen Werte).
Das ganze sollte eigentlich beweisen, dass ein Interrupt ein Operator (sei es Vergleicher/Multiplizierer usw.). Siemens wehrt sich dagegen. :)

Es passiert folgendes:
der Programmcounter lädt den ersten Wert W_Stelle_ein in den Akku1(Netzwerk 3 im Main). Danach sollte der zweite Wert (W_Stelle_aus) geladen werden, um die beiden zu vergleichen. Bevor er aber den zweiten lädt kommt ein Interrupt und der erste Wert (4250) ist immer noch im Akku und wird auf den Stack geschrieben, damit das Programm dann nach dem Interrupt weiter arbeiten kann. Interrupt wird ausgeführt, im Interrupt werden beide Werte W_Stelle_ein und ..aus auf 4275 gesetzt. Der Programmcounter kehrt zum Main wieder zurück und lädt den zweiten Wert (der jetzt anders ist als vorher, nämlich 4250).
Vergleichsoperation sieht so aus: 4250<>4275) und das Fehlerbit wird gesetzt. SCHRECKLICH ODER?


Gruß
com

PS:
Siemens Support probiert alles mögliche seit gestern. Das Programm wurde an die Entwickler weitergegeben. In ca. 4 Wochen kommt eine Antwort. Bin gespannt.

Übrigens, im Handbuch steht:
dass ein Interrupt nur zwischen den Codezeilen bearbeitet wird (....)
also:
UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
......
UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
.....
UW<> P_Reg_ein_Stelle, P_Reg_aus_Stelle
.....

Es sieht aber so aus, dass der auch hier (....) abgearbeitet/aufgerufen wird.

UW<> P_Reg_ein_Stelle, .... P_Reg_aus_Stelle

deswegen bekomme ich das Fehlerbit gesetzt, obwohl die Diagnose zeigt, dass die VW's gleiche Werte aufweisen.
 
Zuletzt bearbeitet:
Zurück
Oben