...
ELSIF "DeckDB".data[#deck].state = 9 THEN // Belt referencing
IF "DeckmoveRef"(belt := #deck) THEN
"stateChange"(p_dst_state := 3,
p_state := "DeckDB".data[#deck].state);
"DeckOutfeedDB".deck[#deck].h_doorClose := true;
END_IF;
...
Und ich glaube hier befindet sich der Hänger, denn diese Funktion wird nicht aufgerufen obwohl sie aufgerufen werden sollte.
6ES7 516-3AN01-0AB mit V2.6Was für eine Firmware hat die CPU denn?
Die Anlage musste halt wieder in Betrieb gehen daher konnte ich da nicht 10 Minuten rumspielen.. Aber #deck kann eigentlich nur 1..6 sein da die übergeordnete Funktion in einer Schleife 1 to 6 aufgerufen wird.mach doch mal n Zähler rein nach dem Elsif um zu sehen obs da überhaupt reingeht. und speichere #deck dann gleich mal weg.
Aber #deck kann eigentlich nur 1..6 sein da die übergeordnete Funktion in einer Schleife 1 to 6 aufgerufen wird
Ist das eine FOR Schleife?
Wenn ja, eine For Schleife "z.B. FOR 1 TO 6" wird verlassen mit "7"
Daher würde ich die Werte mal sichern, welche da aufgerufen werden.
Evtl. habe ich dich auch missverstanden und der Code befindet sich innerhalb der Schleife
FOR #i := 1 TO "GlobalDB".amountOfDecks DO
Wenn das Programm sicht aufhängt, bekommst du keine Einträge in Diagnosepuffer ?
IF "DeckmoveRef"(belt := #deck) THEN
Ist den eine Zuweisung in einer „IF“ Anweisung möglich,
oder hängt sich die Steuerung deshalb auf.
Meiner Ansicht nach kein üblicher Syntax
SPS ist im Run und keine Störung
mach doch mal n Zähler rein nach dem Elsif um zu sehen obs da überhaupt reingeht. und speichere #deck dann gleich mal weg.
Wenn das Programm sich aufhängt, warum nicht einfach online gehen um zu checken warum es nicht weiter geht.
Es steht in irgendeiner Zustand und will nicht weiter. Sollte möglich sein zu finden ohne grossen Aufwand.
Schwierig ist wenn das Programm weiter läuft, und die Zustände und bedingungen nicht mehr zu sehen sind. Dann hilft nur loggen von die verdächtige Variabeln.
ouh mann. „Programm hängt sich auf“ liest sich für sps programmer als „cpu geht in stop“.
nichtsdestotrotz dafür sorgen das du die werte direkt vor dem „aufhängen“ wegsicherst um nachzuvollziehen was da abgeht.
Wenn das Programm sich aufhängt, warum nicht einfach online gehen um zu checken warum es nicht weiter geht.
Es steht in irgendeiner Zustand und will nicht weiter. Sollte möglich sein zu finden ohne grossen Aufwand.
Schwierig ist wenn das Programm weiter läuft, und die Zustände und bedingungen nicht mehr zu sehen sind. Dann hilft nur loggen von die verdächtige Variabeln.
Dein Vorteil ist, das Du sie wieder zum Laufen bringen kannst. Also erstell während sie läuft nen DB in welchem Die Zustände einmal gesichert werden per Merker. Den Merker triggern wenn sie das nächste Mal "hängt", nur einmalig, DB Aktual->Startwerte, Anlage neustarten und anschließend schauen was los war.
Wenn die Produktion so wichtig ist (ja, ist sie immer), dann bleibt kaum was anderes übrig. Der Schnipsel hilft leider nicht so arg viel.
Ja gut, die Anlage rennt und rennt und nun kommt Variable X und schiesst dazwischen. Plötzlich geht nichts mehr. Aber wenn Du es weder mal eben reproduzieren kannst noch eine Beobachtung aufstellst kommst nur mit Glück dahinter.
Wenn Du die Bedingung manuell hergestellt hast das DeckmoveRef ein True hätte zurückgeben müssen es aber nicht tut, dann tipp ich schlicht darauf das der Teil nicht aufgerufen wurde, sonst hätte er es ja gemacht. Kann man das irgendwie prüfen?
Wenn man im state 9 ist wird die Funktion unweigerlich aufgerufen. Das passiert ja nicht nur einmal sondern durchs Band - die state machine wird in einer FOR-Schlaufe abgearbeitet und wird zwingend immer durchlaufen.
Die Schlaufe selbst wird ja von 1 bis 6 durchlaufen und daher hatte ich 6 sogenannte "Decks" die alle im state 9 hängen geblieben sind.
Für mich sah es so aus als würde es die Funktion DeckmoveRef einfach nicht geben für die SPS. Das konnte man ja mit Step7 machen mit dem Teilladen von Bausteinen. Aber mit dem konsistenten Laden von TIA ist das nicht mehr möglich.
Merker1:=false;
Merker2:=false;
ELSIF "DeckDB".data[#deck].state = 9 THEN // Belt referencing
Merker1:=true; // Wurde dieser Zustand wahr?
IF DeckmoveRef"(belt := #deck) THEN
Merker2:=true; // Wurde dieser Zustand wahr?
"stateChange"(p_dst_state := 3,
p_state := "DeckDB".data[#deck].state);
"DeckOutfeedDB".deck[#deck].h_doorClose := true;
END_IF;
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?