Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: Interrupts S7-200

  1. #1
    Registriert seit
    27.04.2009
    Ort
    Frankfurt am Main
    Beiträge
    155
    Danke
    50
    Erhielt 28 Danke für 14 Beiträge

    Standard


    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







    Nothing is easier than being busy and nothing more difficult than being effective. (R. Alec Mackenzie)

    Zitieren Zitieren Interrupts S7-200  

  2. #2
    Registriert seit
    17.09.2003
    Ort
    Zell bei Dietfurt a.d. Altmühl
    Beiträge
    358
    Danke
    8
    Erhielt 27 Danke für 25 Beiträge

    Standard

    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
    MfG

    Hubert

    \"Never change a running system. \"

  3. Folgender Benutzer sagt Danke zu hubert für den nützlichen Beitrag:

    com (15.07.2009)

  4. #3
    Registriert seit
    03.11.2006
    Ort
    Niedersachsen
    Beiträge
    1.126
    Danke
    170
    Erhielt 303 Danke für 259 Beiträge

    Standard

    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.
    Gruß
    crash

    Ich bin nicht bekloppt,
    ich bin verhaltensoriginell!

  5. Folgender Benutzer sagt Danke zu crash für den nützlichen Beitrag:

    com (15.07.2009)

  6. #4
    Avatar von com
    com ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2009
    Ort
    Frankfurt am Main
    Beiträge
    155
    Danke
    50
    Erhielt 28 Danke für 14 Beiträge

    Standard

    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.

    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
    Nothing is easier than being busy and nothing more difficult than being effective. (R. Alec Mackenzie)


  7. #5
    Avatar von com
    com ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2009
    Ort
    Frankfurt am Main
    Beiträge
    155
    Danke
    50
    Erhielt 28 Danke für 14 Beiträge

    Standard

    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?

    Vielen Dank!


    Gruß
    com
    Angehängte Dateien Angehängte Dateien
    Geändert von com (16.07.2009 um 09:08 Uhr)
    Nothing is easier than being busy and nothing more difficult than being effective. (R. Alec Mackenzie)


  8. #6
    Registriert seit
    17.09.2003
    Ort
    Zell bei Dietfurt a.d. Altmühl
    Beiträge
    358
    Danke
    8
    Erhielt 27 Danke für 25 Beiträge

    Standard

    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.
    MfG

    Hubert

    \"Never change a running system. \"

  9. #7
    Avatar von com
    com ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    27.04.2009
    Ort
    Frankfurt am Main
    Beiträge
    155
    Danke
    50
    Erhielt 28 Danke für 14 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.
    Geändert von com (16.07.2009 um 15:59 Uhr)
    Nothing is easier than being busy and nothing more difficult than being effective. (R. Alec Mackenzie)


Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 16.10.2012, 23:27
  2. Interrupts der CPU 222
    Von **melli** im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 17.09.2009, 16:48
  3. Zeitgesteuerte Interrupts.
    Von Anonymous im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 05.09.2003, 15:03

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •