TIA TIA SCL Schleifen simulieren

Martin2XK

Level-2
Beiträge
116
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich verwende TAI V16 und WinCC Advanced V16. Mit SCL habe ich mehrere Anweisungen erstellt. Diese wollte ich über PLC sim simulieren. Das klappt auch, aber mir ist aufgefallen, dass beim Beobachten einer For Schleife immer nur der erste Wert, bei mir die 1, angezeigt wird. Die For Schleife geht von 1 bis 10. Die Bits kann ich forcen um so zu sehen, ob mein Ergebnis auch immer True wird. Das trifft auch zu, setze ich Bit[1] auf 0 und Bit[2] auf 1, so ist mein Ergebnis ebenfalls true (so wie gewünscht). Stimmt es, dass man immer nur das erste Bit sieht? Es handelt sich um ein Array of Bool.

Meine zweite Frage bezieht sich auf das kombinieren von Schleifen. Ist es möglich, eine For Schleife mit einer While Do zu kombinieren? Das ganze sieht in etwa so aus:

For XX := 1 To 10 Do
While YC[XX] = 1 Do
If CC[XX] = 1 Then
XC = 1;
End_If;
End While;
End For ;

Anmerkung: YC ist ein Array of Bool. Das ist mit Sensoren verknüpft und es kann immer nur einer logisch 1 sein. Wenn das der Fall ist, dann soll XC TRUE sein, aber nur falls CC auch TRUE ist.

Simulieren kann ich diese Funktion leider nicht. Ich freue mich über ein paar Tipps.

Gruß
 
Zuletzt bearbeitet:
Warum kannst du das nicht Simulieren? Du kannst natürlich nicht sehen was in deiner Schleife passiert aber du kannst dir doch das Endergebnis angucken.

Gibt es die Haltepunkte schon ab V16 oder erst ab V17, da muss man auch die FW auf die passende Version stellen? Hab die selber aber noch nicht genutzt damit solltest du dir auch die Ergebnisse innerhalb der Schleife angucken können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann das debuggen, wenn ich richtig erinnere, indem man einen breakpoint setzt. Die SPS geht dann in STOP. Das ist also an einer lfd. Anlage eher schlecht. In PLCSIM kann man seine Funktionen so gut testen.

Du kannst das kombinieren. Bedenke aber, dass eine SPS die max. Zykluszeit kontrolliert und bei Überschreitung in Stop geht. Man sollte also Anweisungen vermeiden, die in einer Endlosschleife enden können oder Sorge tragen, dass das nicht passieren kann.
 
Ich verstehe den Sinn der While-Schleife nicht. In dieser Schleife ändert sich von Durchlauf zu Durchlauf rein gar nichts.
Entweder wird sie nicht durchlaufen (wenn YC[XX] = 0) oder sie findet kein Ende (wenn YC[XX] = 1).
 
Zuletzt bearbeitet:
Sie findet kein Ende? Solange einer der Sensoren YC auf logisch eins ist, soll die IF Abfrage durchgeführt werden. Aber wäre, falls das von mir nicht gut gelöst wurde, auch If ... mit ELseIF möglich?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist es möglich, eine For Schleife mit einer While Do zu kombinieren?
Möglich ist alles. Auch alle möglichen Kombinationen von Schleifen. Auch "unlogische" Kombinationen - da geht die SPS notfalls in Stop wegen Zykluszeitüberschreitung. Aber ob das immer sinnvoll ist steht auf einem anderen Blatt. Z.B. warten auf einen Zustand eines Eingangs im Prozessabbild der Eingänge führt zu endlosem Warten bzw. CPU-Stop, weil sich das PAE während der Warteschleife nicht ändert.

Simulieren kann ich diese Funktion leider nicht.
Simulieren von selbstgeschriebenem Code ist immer möglich. Auch Anlagenzustände kann man simulieren, notfalls kann man Simulationscode schreiben, mit dem die SPS sich selber Eingangszustände simuliert.

Bei Schleifen sieht man "naturgemäß" nur die Werte vom ersten oder letzten Durchlauf. Wenn man die Werte der Durchläufe sehen will, dann muß man die geeignet wegspeichern und kann sie danach anschauen.

Eine SPS mit realen E/A kann man nicht (bzw. nicht sinnvoll) mit Haltepunkten und Einzelschrittbetrieb betreiben. Solche Tests sollte man nur mit simulierten CPU oder mit Test-CPU ohne E/A machen.

Harald
 
Es war ungeschickt formuliert von mir, ja simulieren kann ich es natürlich und ich kann mir das Endergebnis anschauen (das passt und bezieht sich auf beispiel 1).

Beispiel 2 ist der Code der oben steht. Ok, ich verstehe. An dieser Stelle ist eine While Schleife weniger gut geeignet.
 
Sie findet kein Ende? Solange einer der Sensoren YC auf logisch eins ist, soll die IF Abfrage durchgeführt werden.
Egal, ob die Logik der Schleife korrekt ist oder nicht: Eine SPS "wartet" nicht auf Sensor-Zustände, sondern fragt zyklisch immer wieder den Eingang ab und macht dazwischen auch noch gaaanz viele andere Sachen. Mit einer Schleife "auf der Stelle treten" und nur noch den einen Eingang beobachten wollen (und sonst nichts mehr weiter tun!) führt zum Stop der SPS.

Harald
 
Code:
For XX := 1 To 10 Do
    While YC[XX] = 1 Do
        If CC[XX] = 1 Then
            XC = 1; // hier fehlt der DoppelPunkt vor dem =
        End_If;
    End While;
End For ;

Meinst Du evtl. so etwas:
Code:
For XX := 1 To 10 Do
    YY := 0 ;
    While YY < 10 Do
        YY := YY + 1 ;
        If YC[YY] = 1 AND CC[XX] = 1 Then
//      If YC[YY] AND CC[XX] Then // alternativ, wenn YC[] und CC[] Array Of Bool sind
            XC := 1;
        End_If;
    End_While;
End_For ;
 
Verstanden. Man soll keine direkten Zuweisungen verwenden wie z. B. While X = 1 damit tritt man auf der Stelle und das führt zum Stop.
Besser man schreibt While YY < 10 damit betrachtet man nicht nur den einen Eingang, sondern einen Bereich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe insgesamt 10 Sensoren. Wenn einer davon 1 ist, dann soll etwas ausgeführt werden.
Dafür muß die SPS jeden Sensor einmal abfragen (zumindest bis sie einen gefunden hat der 1 ist). Und das ganze zyklisch immer wieder.
(Du musst noch entscheiden, ob das was ausgeführt werden soll, immer ausgeführt werden soll, oder nur wenn ein Sensor "kommt")

Kannst du mir noch ein Gegenbeispiel nennen wann eine While Do sinnvoll sein kann? Ich möchte es nur besser verstehen.
Die Aufgabenstellung kannst Du so lösen:
Code:
IF Sensor_1
  OR Sensor_2
  OR Sensor_3
...
  OR Sensor_9
  OR Sensor_10
THEN
  TueWas();
END_IF;

Wenn die Werte der Sensoren in einem BOOL-Array liegen:
Code:
IF Sensor[1]
  OR Sensor[2]
  OR Sensor[3]
...
  OR Sensor[9]
  OR Sensor[10]
THEN
  TueWas();
END_IF;
... dann kannst Du die Werte auch in einer Schleife verarbeiten:
Code:
sensor_x := FALSE;
FOR i := 1 TO 10 DO
  IF Sensor[i] THEN
    sensor_x := TRUE;
    EXIT;
  END_IF;
END_FOR;

IF sensor_x THEN
  TueWas();
END_IF;
Code:
i := 1;
WHILE (i <= 10) AND NOT(Sensor[i]) DO
  i := i + 1;
END_WHILE;

IF i <= 10 THEN
  TueWas();
END_IF;

Harald
 
Du mußt dir vorstellen, dass die SPS ohnehin schon in einer Endlosschleife läuft.
Kurz:

1. Sie liest die Eingänge ein
2. Sie arbeitet den Code ab
3. sie schreibt die Ergebnisse auf die Ausgänge
4. sie springt wieder zu 1.

Wenn du also willst, das mit einem True am Eingang eine Aktion ausgeführt wird, dann kannst du einfach im Programm schreiben:

If MeinEingang = True then //= True kann man bei der Schreibweise auch weglassen

Hier steht dein Code

End_if;

Der Code in der IF...Then-Abfrage wird solange ausgeführt, wie MeinEingang True ist.
 
Verstanden. Man soll keine direkten Zuweisungen verwenden wie z. B. While X = 1 damit tritt man auf der Stelle und das führt zum Stop.
Nein. Das = ist keine Zuweisung sondern ein Vergleich. Man darf durchaus in der WHILE-Bedingung vergleichen ob eine Variable gleich (=) 1 ist, doch wenn sich die Variable nicht ändert während die Schleife läuft, dann ändert sich auch nicht das Ergebnis des Vergleichs und der Vergleich ist nie oder immer (endlos!) erfüllt.
Merke1: Das Ergebnis des Vergleichs muß sich innerhalb des Zyklus ändern können.
Merke2: In einer Schleife kann man nicht auf das Ändern eines Zustands aus dem Prozessabbild der Eingänge (PAE) warten, weil das PAE ändert sich nicht während der Schleife sondern wird außerhalb der Laufzeit des OB1 aktualisiert.

Harald
 
Zuletzt bearbeitet:
Zurück
Oben