Fehlerhaftes Einloggen nach durchlaufenem Programm

Gloria

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin's wieder mit meiner Wago 750-871. Sie ist über Ethernet direkt mit dem Rechner verbunden, und ich schreibe gerade eine kleine Verbesserung fürs Programm. Die sieht so aus, dass zuerst ein Programmteil durchläuft, eine Variable verändert und mit der dann danach weiter"gerechnet" wird.

Ich verbinde ... ich lade ... Wago macht und tut ... alles ist prima ...

Aber sobald der erste Programmteil abgelaufen ist, reagiert sie auf einmal nicht mehr. Es soll einer der Eingänge ansprechen, aber er bleibt tot, obwohl er vor Programmstart noch "lebte". Alles, was ich noch tun kann, ist ausloggen, und selbst wieder einloggen geht dann nicht mehr. Scheinbar braucht die Verbindung zu lange zum Aufbauen, denn nach ca. 1 min bekomme ich die Fehlermeldung "Es wird ausgeloggt."

Vorher funktionierte das aber schon! Also vorher bedeutet ... vor heute. ^^

Ich muss jetzt jedesmal die Wago neu starten und komme nicht dazu, meinen FB zu testen, weil ja nach Programmdurchlauf Teil 1 nichts mehr anspricht. Kennt das jemand?

Gruß

Gloria

Nachtrag: NS blinkt grün. Sowohl vor und während des ersten Durchlaufs als auch danach. Heißt zwar laut Wago Fehlercode "nicht verbunden", war aber bisher kein Problem ... :confused:
 
Zuletzt bearbeitet:
Mein erster Tip wäre ein "Deadlock", also z.Bsp. Schleife, aus der es für das Programm "kein Entrinnen" mehr gibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmm, ich will als 2. Teil tatsächlich eine While-Schleife aufrufen, aber bis dahin bin ich ja noch nie gekommen. Sie würde laufen, solange der bewusste Eingang 1 liefert. Momentan kommt aber kein Signal durch und es bleibt bei 0.

Und naja, der FB ist ja in dem Sinne nicht mal ein zweiter Teil, weil er in der Mastertask von Anfang an mitläuft. Das heißt, die Variablen werden jeden Zyklus gecheckt, und etwas anderes macht er ja "hinterher" auch nicht...
 
Test ist mein Eingang. Vari ist jetzt nur vorübergehend, damit die Schleife was zum Ausführen hat, wenn der Rest auskommentiert ist.

Das ganze sollte den Sinn haben, dass für die Dauer des 1-Signals an Test hochgezählt wird, bis 3s erreicht sind (Zykluszeit 50 ms), und dann die anderen Variablen gesetzt werden. Fällt Test in der Zwischenzeit ab, soll er wieder von vorne beginnen.

So ... es liegt wohl an der ersten While-Schleife. Wenn ich die rausnehme, passiert alles wie gewohnt. Aber warum? Was ist denn an der so schlimm? :confused:

Code:
IF STATUS1=FALSE THEN

vari:=TRUE;

    WHILE test=TRUE DO

        WHILE i <60 DO

        i := i + 1;

        END_WHILE;


        IF i=59 THEN

        RESET1:=TRUE;
        END1:=FALSE;

        END_IF;

    END_WHILE;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gloria,

es liegt ganz sicher an der ersten While-Schleife!
Die ist in deinem Fall immer „TRUE“ und wird deshalb „nie“ beendet.
Somit rennt deine Steuerung in dieser While-Schleife im Kreis...

Gruß
Chräshe
 
Ich muss gestehen, dass ich mir fast den Kopf zerbrochen habe, wie ich diese Tastschaltung am besten hinbekomme, und fast verrückt geworden bin, weil ich mir dachte, das kann doch so schwer nicht sein :D Jetzt verbringe ich erstmal meine Zeit damit, die IEC-Sprachen zu büffeln ...

Wenn es also mit der While-Schleife nicht klappt, sollte ich lieber eine If-Schleife nehmen? Aber wie sage ich der, dass sie bei vorzeitigem Loslassen wieder i=0 setzen soll?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Gloria,

sobald deine Steuerung in der ersten while-Schleife steckt, werden die Eingänge deiner SPS vermutlich gar nicht mehr abgefragt und dein Programm befindet sich somit in einer Endlosschleife. Daher wäre eine if-Abfrage auf jedenfall die bessere Variante!

Zu deiner zweiten Frage: Setze "i=0" im else-Zweig deiner if-Bedingung, wenn "End1" noch wahr ist.

Gruß snej
 
Ein SPS Programm wird grundsätzlich zyklisch abgearbeitet. D.h. die While-Schleifen sind vollkommen unnötig und wie schon bemerkt wurde in diesem Fall sogar die Ursache für den Crash der SPS.Es wird dir sehr helfen, wenn du dich nochmal mit den Grundlagen eines Programmablaufes in einer Industriesteuerung auseinandersetzt. Dann wird dir sicher einiges klarer.
(Stichwort: Peripherie Abbild der Eingänge lesen, Programmzyklus durchlauf, Abbild der Ausgänge schalten)

Was du in deinem Programm erreichen willst, ist das verzögerte durchleiten eines Eingangssignals. Genau für solche Fälle gibt es verschiedene Timer, die genau sowas machen. Hier passt perfekt eine Einschaltverzögerung (TON).
Dieser Timer läuft solange hoch wie sein Startsignal gesetzt ist (hier dein Test-Eingang). Erreicht er seinen vorgegebenen Endwert (3s) setzt einen einen Ausgang auf True, bis das Startsignal wieder false ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es funktioniert so weit ... Danke euch! Nur scheint sich der TON-Ausgang bei Wegfall des IN-Eingangs nicht zurückzusetzen. Den Effekt habe ich schon vorher an anderer Stelle beobachtet. So ist der Programmieraufwand nur unwesentlich geringer als mit einer Zählschleife...
 
Es funktioniert so weit ... Danke euch! Nur scheint sich der TON-Ausgang bei Wegfall des IN-Eingangs nicht zurückzusetzen. Den Effekt habe ich schon vorher an anderer Stelle beobachtet. So ist der Programmieraufwand nur unwesentlich geringer als mit einer Zählschleife...

Wie rufst du den Timer denn auf?
Ein TON sollte eigentlich IMMER seinen Ausgang (Q) auf False setzen, wenn das IN-Signal False ist. Vorraussetztung ist natürlich das die Instanz des TON-FBs auch aufgerufen wird.
Wenn es bei dir also nicht so ist, hast du einen Fehler in deinem Programm.

Stell doch einfach mal den Code-Ausschnitt mit dem Timer hier rein, damit man einen Blick drauf werfen kann.

Hier noch schnell ein Bsp. wie ein Signal "Ausgang" 3s verzögert gesetz wird nachdem das Signal "Eingang" True wurde. Und wieder zurückgesetzt wird, wenn Eingang False ist.

Code:
Timer :TON;
Eingang, Ausgang :Bool;

Timer(IN := Eingang, PT := T#3s, Q=> Ausgang);
 
Es funktioniert so weit ... Danke euch! Nur scheint sich der TON-Ausgang bei Wegfall des IN-Eingangs nicht zurückzusetzen. Den Effekt habe ich schon vorher an anderer Stelle beobachtet. So ist der Programmieraufwand nur unwesentlich geringer als mit einer Zählschleife...

Dein Timer darf natürlich nicht auch in der If-Anweisung stehen, sonst wird bei Wegschalten des Eingangs, der Timer ja nicht mehr abgearbeitet. Also den Timer an eine Stelle des Programms, die immer abgearbeitet wird und den Starteingang des Timers mit der entsprechenden Variablen belegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Timer darf natürlich nicht auch in der If-Anweisung stehen
Danke .. das wars. Jetzt wo ihr es sagt, macht es Sinn. Vielen Dank für eure Hilfe ... ich wünschte, ich hätte meinen Professor all diese Sachen fragen können, aber der hielt leider nicht so viel von Lehre ... Da hieß es meistens, ich schick Ihnen was zu, lesen Sie sich das zu hause durch :(
 
Zurück
Oben