TC3: Alles zurück auf Anfang (Variablen und FBs resetten)

Beiträge
6.636
Reaktionspunkte
1.607
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich erstelle gerade ein Programm mit dem der Kunde seine SPS Software testen kann. Jetzt gibt es eine Anforderung wo ich noch nicht weiß wie ich sie lösen kann. Mein Programm simuliert die reale Hardware, so das das eigentliche SPS-Programm denkt es würde eine echte Anlage steuern. Über eine Visu kann jetzt die Simulation bedient werden und Fehler ausgelöst werden, z.B. ein Füllstandssensor hat ausgelöst, ein Türschalter meldet Tür ist offen und ähnliches. Die Betätigung erfolgt entweder manuell oder automatisiert über eine spezielle Steuersoftware. In beiden Fällen ist es aber so, das nach einem Test über einen Tastendruck alles auf Anfang gehen sollte. Also alle Buttons auf Startposition, die FBs für die Simulation komplexere Komponenten auf Anfang und so weiter. Ich hätte jetzt einfach in MAIN explizit die Methode FB_init aufgerufen, aber Beckhoff warnt im Infosys davor. Hat hier einer eine bessere Idee? Ich könnte jetzt natürlich eine Methode erstellen und in dieser alle Variablen "von Hand" zurücksetzen, aber die Simulation ist nicht für eine Anlage und da ändern sich dann die Variablen und verwendeten FBs.
 
FB_init per se setzt ja auch nichts zurück. FB_init hat einen Codeteil der einfach nur ausgeführt wird. Ob dieser Codeteil Datren initialisiert oder nicht liegt in Programmiergotteshand.

Wenn Du ein rücksetzen möchtest, dann kannst Du kalt/warm Reset nutzen, aber dadruch würde dann die Runtime gestoppt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
FB_init per se setzt ja auch nichts zurück. FB_init hat einen Codeteil der einfach nur ausgeführt wird. Ob dieser Codeteil Datren initialisiert oder nicht liegt in Programmiergotteshand.

Wenn Du ein rücksetzen möchtest, dann kannst Du kalt/warm Reset nutzen, aber dadruch würde dann die Runtime gestoppt werden.
Das Ganze soll über einen Button in der Visu erfolgen ohne das die Entwicklungsumgebung offen ist, daher scheidet Reset warm/kalt aus.
Übrigens liegst Du leider falsch, durch den expliziten Aufruf von FB_init werden alle Variablen und alle FBs auf Anfang gesetzt, was man hier im Infosys auch nachlesen (grüne Markierung) kann.
FB_init.png
Das wusste ich aber auch schon, Sorgen mache ich mir halt nur wegen der Warnungen (rote Markierung).
 
Zuletzt bearbeitet:
Ich könnte jetzt natürlich eine Methode erstellen und in dieser alle Variablen "von Hand" zurücksetzen, aber die Simulation ist nicht für eine Anlage und da ändern sich dann die Variablen und verwendeten FBs.
Hi Oliver,

den Teil habe ich nocht nicht verstanden.

Die Schnittstelle zwischen dem realen Programm und dem Simulationsprogramm ist doch sicher eine EtherCAT-Simulations-Adapter mit einer TE1111-Simulation, oder?

Insofern hätte doch das Simulations-SPS-Programm keine Berührungspunkte mit dem echten SPS-Programm?

Also ich würde das schon "von Hand" machen. Wo liegt mein Fehler?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@asci25
Ja, das Ganze erfolgt mit der TE1111 nur halt teilweise automatisiert und Eggplant jetzt beizubringen, wie er das Visual Studio aufmacht und wo er klicken muss ist da deutlich komplizierter als wenn ich einfach einen Button in der Simulation-Visu habe über den ich alles zurücksetzen kann.

@StructuredTrash
Das ginge auch, aber FB_init ist da halt etwas eleganter und auch schneller. Wie gesagt, ich mache mir halt nur Sorgen wegen der Warnungen im Infosys. An einem Teststand wird mit FB_init auch schon ein Reset durchgeführt, aber der ist wesentlich weniger aufwendig wie meiner.
 
ich mache mir halt nur Sorgen wegen der Warnungen im Infosys
In einer Simulation wirst ja nichts kaputt gehen. Insofern würde ich es ausprobieren.

Wobei ich mit "von Hand", nicht meinte das über das Visual Studio zu machen. Das war wahrscheinlich das Verständnisproblem. Aus Erfahrung weiß ich, dass die Simulations-SPS mit einem Bruchteil des Quellcodes im Gegensatz zur Automatisierungs-SPS auskommt.

Warum nicht einen globalen Bool anlegen, der vom HMI-Reset gesetzt wird und diesen an alle FB's über einen ix_Reset und einer If-Bedingung alles auf Init setzen.

Alternativ würde mir noch einfallen, von jeder FB-Implementierung (FB-Typ) einen zusätzliche Instanz (Init-Baustein) zu deklarieren, die nicht aufgerufen wird. Über den Adresspointer und Dereferenzierer könntest Du den gesamten Speicher mit den Werten des Init-Bausteins überschreiben:

Code:
fbInit             : FB_Irgendwas;
fbComponent1     : FB_Irgendwas;
fbComponent2     : FB_Irgendwas;
pAdrInit        : POINTER TO FB_Irgendwas
pAdrCompn1        : POINTER TO FB_Irgendwas
pAdrCompn2        : POINTER TO FB_Irgendwas

pAdrInit    := ADR(fbInit);
pAdrCompn1    := ADR(fbComponent1);
pAdrCompn2    := ADR(fbComponent2);
IF bReset THEN
    pAdrCompn1^ := pAdrInit^;
    pAdrCompn2^ := pAdrInit^;
END_IF

So was habe ich aber nie ausprobiert.
Eventuell geht das aber auch nur mit Memcpy.
 
Zurück
Oben