Step 7 PCS7 Zeitsynchronisierung SFC1 auf MODBUS

Turbo-IBS

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

zuerst einmal danke schon einmal für die Hilfe. Ich muss jetzt erst einmal erwähnen, dass ich noch kein Spezialist in PCS7 bin, sondern bis jetzt nur die IBS typischen Arbeiten durchgeführt habe. Logikänderungen im CFC, neue Blöcke verschaltet, zusätzliches Faceplate in WinCC etc etc. Jetzt habe ich eine Aufgabe erhalten, von der ich denke, dass ich bereits einen Lösungsweg habe. Es handelt sich um die Zeitsynchronisierung über MODBUS von meiner S7 400, welche der Master wäre und einem System von einem Unterlieferenten als Slave, welcher die gleiche Systemzeit benötigt.

Ob letztendlich die Synchronisierung nur über ein Bit zu einer vorher fest definierten Zeit erfolgt, oder ob wir einfach alle Daten auf den Bus legen, so das der Unterlieferant dann in seinem Rhythmus selbst immer synchronisiert, kann ich noch nicht sagen. So oder so, muss ich erst einmal die Zeit an meiner S7 400 auslesen. Das wäre ja über die SIMATIC Methode möglich, also mit dem SFC1. Diesen im OB1 aufrufen und den Ausgang CDT im Format Date_and_Time in einen vorher definierten DB schreiben. Dann mit einem Pointer in die einzelne Informationen zerlegen und z.B. direkt in den DB mit den Modbusdaten legen.

Dafür wäre aber am Schluss ein Gesamtladen notwendig, was ich gerne verhindern möchte. Da der SFC1 auch als CFC Block vorhanden ist, frage ich mich, ob es ohne Eingriff in den Bausteincontainer möglich ist, sonder ales über die CFC Pläne realisiert werden kann? Gibt es in der Bibliothek einen Baustein, der nach dem SFC Block (Ausgang CDT -> gesuchter Baustein) verschaltet wird, so dass das nicht händisch in AWL erstellt werden muss. Davon erhoffe ich mir, dass ich mit einem Änderungsladen das ganze realisieren kann.

Danke und viele Grüsse
Daniel
 
Du kannst den SFC1 direkt im CFC aufrufen (am besten nicht im OB1 sondern in einem Weckalarm).
Besser finde ich es allerdings den Aufruf + Rangierung + Zerlegung in einen selbsterstellten FC zu packen und diesen in einem CFC-Plan einzubauen.
Wenn Du den FC neu erstellst, sollte kein Gesamtladen notwendig sein - das ist eigentlich nur gefordert, wenn sich die Schnittstelle eines FBs ändert - d.h. wenn die Instanz-DBs angepasst werden müssen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke StP.

Bei einem Aufruf des SFC1 im CFC wird dieser im OB34 aufgerufen, was ja passen würde. Gibt es nicht schon einen fertigen CFC Block, welchen ich direkt an den SFC1 Ausgang CDT verschalten kann, welcher dann die Rangierung übernimmt? Das mit dem FC selber bauen würde ich eventuell hinbekommen, dauert aber wegen mangelnder Übung auch seine Zeit.
 
Für die Zerlegung ist mir nichts fertiges bekannt.
Allerdings ist DATE_AND_TIME mit ein paar Zeilen AWL schnell zerlegt - ich bin mir fast sicher, daß dazu auch ein paar Codeschnipsel hier herumgeistern.
Alternativ kannst Du auch einfach den SFC1 in einem CFC aufrufen, den CDT-Ausgang mit einer DATE_AND_TIME - Variable in einem DB verschalten und die Daten dann aus diesem auslesen.
 
Alle OB liefern in den Startinformationen (TEMP) wann sie gestartet wurden - also die aktuelle Uhrzeit zu Beginn des OB. SFC1 muß nicht unbedingt aufgerufen werden.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Den Code habe ich aus der Anleitung für das Auslesen der Systemzeit bereits. Siehe hier.

[FONT=Verdana,Arial,Tahoma,Calibri,Geneva,sans-serif]https://support.industry.siemens.com/cs/document/21222026/wie-kann-das-datum-und-die-uhrzeit-mit-der-sfc1-(read_clk)-ausgelesen-und-mit-der-sfc0-(set_clk)-eingestellt-werden-?dti=0&lc=de-CH

Ok, ich probiere das einmal mit dem selbstgebauten FC. Den Aufruf von SFC1 in NW1, die Zerlegung in NW2. Als Zwischenspeicher für das komplette Datum vom SFC1 kann ich ja dann den Pfad TEMP im FC verwenden, die Zeit wird ja sowieso mit jedem Aufruf aktualisiert. Die zerlegten Informationen wie Jahr, Monat usw. lege ich mir auf verschiedene Ausgänge, von dort kann ich es dann entsprechend mit dem MODBUS DB verschalten und dort in die Freien Register legen. Richtig?
[/FONT]
 
Guten Morgen zusammen,

ich hatte wieder etwas Zeit um mich um die Zeitsynchronisierung zu kümmern. Dazu habe ich jetzt den AWL Code von Siemens in einen FC gepackt.

Wo ich jetzt noch etwas hänge, ist der Puls, der zu einer fest definierten Zeit generiert werden soll. Dazu habe ich eine Eingangsvariable erzeug, mit dem Zeitformat #TOD. Diese eingestellte Zeit, z.B. 23:59:59 (Millisekunden können an meinem Eingang nicht eingestellt werden, warum nicht?) soll dann mit der aktuellen CPU Zeit verglichen werden. Dazu müsste ich aber das Format DateAndTime entsprechend umwandeln. Wie kann das in AWL realisiert werden, ohne das ich wieder mit einem Pointer die Stunden, Minuten und Sekunden extrahieren muss. Gibt es dazu nicht schon etwas fertiges, mit dem ich das einfach umwandeln kann?

Danke für die Hilfe
Daniel
 
Zurück
Oben