Datum und Zeit als DT mit Modbus TCP übertragen

Spsmatze

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute!

Ich möchte das Datum und die Zeit ohne großen Aufwand per MODBUS-TCP zwischen Wago Geräten übertragen.
(SPS 8212 und einem TP600).
Leider finde ich keine Hinweise, wie ich die den Datentyp DT (Date_and_Time) in ein MODBUS-taugliches Format umwandeln kann,
und danach natürlich wieder zurück in Date_And Time.
Warum ich das machen möchte, würde zu weit führen.
Wichtig ist erst einmal nur, wie ich das machen kann.

Vielen Dank im Voraus für die Hilfe.
Spsmatze
 
Wo ist das Problem?
Du hast eine Variable im DT-Format. Dessen Größe in Byte kannst Du mit SIZEOF ermitteln.
Dann legst Du Dir z.B. ein Array of Byte in der gleichen Größe so an, dass dieses per Modbus übertragen werden kann. Wie das geht weiß ich leider nicht.
Auf der anderen Seite legst Du auch ein Array of Byte mit der Größe an, diesmal aber so, dass dieses per Modbus beschreibbar ist und wieder eine Variable im Format DT.
Auf der einen Seite kopierst Du mit MEMCPY den Inhalt der DT-Variablen ins Array, auf der anderen Seite eben umgekehrt.
Da es beides WAGO Geräte sind sollte es keine Probleme mit unterschiedlichen Endians geben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei Codesys und vermutlich auch Wago ist ein DATE_AND_TIME (DT) ein DWORD, belegt in MODBUS also 2 aufeinanderfolgende Register.
Da brauchst Du gar nichts umwandeln, sondern musst nur das DWORD auf 2 WORD legen/kopieren und der Empfänger legt/kopiert die 2 WORD wieder auf das DWORD mit seinem DATE_AND_TIME. Bei Codesys 3 kann man dafür schön eine UNION verwenden. Möglicherweise gibt es auch schon fertige Funktionen um 2 WORD in DWORD und zurück zu kopieren, notfalls tuts auch MEMCPY. Die Endianess mußt Du da nicht beachten.

Harald
 
Bei Codesys und vermutlich auch Wago ist ein DATE_AND_TIME (DT) ein DWORD, belegt in MODBUS also 2 aufeinanderfolgende Register.
Da brauchst Du gar nichts umwandeln, sondern musst nur das DWORD auf 2 WORD legen/kopieren und der Empfänger legt/kopiert die 2 WORD wieder auf das DWORD mit seinem DATE_AND_TIME. Bei Codesys 3 kann man dafür schön eine UNION verwenden. Möglicherweise gibt es auch schon fertige Funktionen um 2 WORD in DWORD und zurück zu kopieren.

Harald
Stimmt, Modbus arbeitet ja mit Word und nicht mit Bytes.
 
Der Compiler ist da anderer Meinung.
Wenn ich den Datentap DT aus einer globalen Variable im Modbus-Konfigurator auf ein DWORD legen möchte,
klappt zwar die Übersetzung, aber beim Übertragen des Projektes kommt die Meldung, dass die Datentypen nicht überein stimmen.
Da ist ja die Sackgasse.
Beim "Sender" wandele ich ich DT in DWORD einfach vorher in einem PLC-Task um.
Das TP als Empfänger darf aber keinen PLC-Task haben, da nur für das Datum bereits eine zusätzliche Lizenz fällig wäre.
Darum muss ich irgendwie - ohne PLC-Task - in der Modbus-Konfiguration die Sache hin bekommen.
Nur wie?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich den Datentap DT aus einer globalen Variable im Modbus-Konfigurator auf ein DWORD legen möchte,
klappt zwar die Übersetzung, aber beim Übertragen des Projektes kommt die Meldung, dass die Datentypen nicht überein stimmen.
Wo genau kommt die Meldung?
Notfalls kopiere den DT im SPS-Programm in eine DWORD-Variable und im Modbus-Konfigurator verwende die DWORD-Variable.

Harald
 
Der Compiler ist da anderer Meinung.
Wenn ich den Datentap DT aus einer globalen Variable im Modbus-Konfigurator auf ein DWORD legen möchte,
klappt zwar die Übersetzung, aber beim Übertragen des Projektes kommt die Meldung, dass die Datentypen nicht überein stimmen.
Da ist ja die Sackgasse.
Beim "Sender" wandele ich ich DT in DWORD einfach vorher in einem PLC-Task um.
Das TP als Empfänger darf aber keinen PLC-Task haben, da nur für das Datum bereits eine zusätzliche Lizenz fällig wäre.
Darum muss ich irgendwie - ohne PLC-Task - in der Modbus-Konfiguration die Sache hin bekommen.
Nur wie?
Direkt geht das ja auch nicht. Entweder musst Du die DT Variable per MEMCPY auf 2 WORD Variablen kopieren oder wie @PN/DP schon schrieb UNION verwenden und die WORDs in der UNION dann an Deine zwei Words im Modbusbereich geben.
 
Beim Übersetzen kommt erst einmal keine Meldung!
Wenn ich aber auf "Verbinden" gehe, um das Projekt auf dem TP zu aktualisieren, dann folt die Meldung:
"! Local Device Modbus Der Datentyp des Kanals und der abgebildeten Variable [Name der Variablen] stimmen nicht überein" (Stimmt ja!)
Ein Konvertierung in einem PLC (SPS-Programm) kommt ja aus oben genannten Gründen nicht in Frage.

Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Beim "Sender" wandele ich ich DT in DWORD einfach vorher in einem PLC-Task um.
Das TP als Empfänger darf aber keinen PLC-Task haben, da nur für das Datum bereits eine zusätzliche Lizenz fällig wäre.
Darum muss ich irgendwie - ohne PLC-Task - in der Modbus-Konfiguration die Sache hin bekommen.
Nur wie?
Gar nicht, MODBUS arbeitet mit WORD und BOOL und das war es, Du wirst auf Empfängerseite immer einen Zwischenschritt brauchen.
 
Wenn ich aber auf "Verbinden" gehe, um das Projekt auf dem TP zu aktualisieren, dann folt die Meldung:
"! Local Device Modbus Der Datentyp des Kanals und der abgebildeten Variable [Name der Variablen] stimmen nicht überein"
Mit Wago kenne ich mich nicht aus. Falls da DWORD auch nicht akzeptiert wird, dann versuche es mal mit einem ARRAY [0..1] OF WORD.

Harald
 
Mit Wago kenne ich mich nicht aus. Falls da DWORD auch nicht akzeptiert wird, dann versuche es mal mit einem ARRAY [0..1] OF WORD.

Harald
Das wird dem TE aber leider nicht helfen. Wenn ich ihn richtig verstehe darf aus Lizenzgründen auf der Empfängerseite keine PLC Task laufen und er möchte direkt im Modbus Bereich eine DT-Variable nutzen, was aber nicht gehen wird, bin aber auch nicht so der WAGO Experte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aha.
Aber wie will der Empfänger da den DATE_AND_TIME verarbeiten? Oder die zwei WORD? Welches Gerät ist der Empfänger? Was kann es überhaupt?
Reicht es nicht, wenn der Sender den DATE_AND_TIME in ein DWORD oder zwei WORD legt und der Empfänger nimmt einfach die WORDs und macht damit was auch immer er damit machen will/kann?

Harald
 
Aha.
Aber wie will der Empfänger da den DATE_AND_TIME verarbeiten? Oder die zwei WORD? Welches Gerät ist der Empfänger? Was kann es überhaupt?
Reicht es nicht, wenn der Sender den DATE_AND_TIME in ein DWORD oder zwei WORD legt und der Empfänger nimmt einfach die WORDs und macht damit was auch immer er damit machen will/kann?

Harald
Hallo Harald,
genau da wird das Problem liegen. Der Empfänger ist ein TP600, also ein HMI-Panel. Auf diesem möchte der TE sicher das DT direkt anzeigen lassen, dafür muss es aber auch als solches vorliegen und nicht als zwei WORD und das geht ohne Wandlung durch ein SPS Programm sicher nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also grundsätzlich brauchst du wie schon erwähnt, die DT Variable und ein Array of Word in eine Union packen, mit SizeOf vorher noch die Grösse ermitteln.
Dann hast du Words im Array, diese kannst du dann per MB auf dein Panel schicken.
Wenn du jetzt am Panel nicht von Words auf DT wandeln kannst, wird es nicht klappen, da muss schon etwas Code her um in DT zu wandeln.
 
Wenn du jetzt am Panel nicht von Words auf DT wandeln kannst, wird es nicht klappen, da muss schon etwas Code her um in DT zu wandeln.
Es ist ein TrauerSpiel, wenn man für zwei aufgezwungene TypeCasts von DT in DWORD und zurück von DWORD in DT eine Lizenz oder auch nur einen einzigen Befehl in einem ProgrammStückchen benötigt, zumal das ProgrammStückchen auch nur deshalb erforderlich wird, um diesen TypeCast "auszuführen". Ein Ausführen einer Konvertierung im Sinne einer Umwandlung des Inhalts der Variablen ist es ja nicht einmal.
Eine "Umwandlung" per Script stelle ich mir gar nicht so einfach vor. Woher sollte man in VBS den DatenTyp DWORD nehmen? Und woher den DatenTyp DT? Einen zu DINT passenden DatenTyp findet man bei VBS, aber nix vorzeichenloses, das 32-Bit belegt. Es geht doch wieder nur darum, auf "Siemens-Ebene" 1:1 eine vorzeichenlose 32-Bit-Ganzzahl-Variable in eine andere vorzeichenlose 32-Bit-Ganzzahl-Variable zu kopieren.
Der vermeintliche Vorteil der Benutzung von DatenTypen, nämlich den Compiler (versehentliche?) Irrtümer eines inkompetenten Programmierers aufspürem zu lassen, wird doch hier nicht nur ad absurdum geführt, sondern ins Gegenteil verkehrt. Der Programmierer wird gezwungen, nicht-symbolisch zu adressieren und abenteuerliche WorkArounds zu ersinnen.
Ein TypeCast à la 'AT' (DoppelBelegung desselben SpeicherBereichs durch zwei Variablen unterschiedlichen DatenTyps) ist im HMI wirklich nicht möglich?
Soll die Information "bidirektional" verwendet werden? Zum einen in Richtung SPS->HMI und zu anderen in Richtung HMI->SPS?
Dann müsste sowieso "2-kanalig" gearbeitet werden. Der eine informiert die HMI über Änderungen durch die SPS und der andere informiert die SPS über Änderungen durch die HMI.
Aber das Problem bliebe, sinnlose weil eigentlich überflüssige TypeCasts einfügen zu müssen.

Ergo: früher war doch so manches besser bzw. zumindest einfacher. 😅
 
Bin nicht sicher ob der Compiler meckert, aber kannst du nicht einfach als DWORD übertragen, als DWORD in der Visu einbinden und mit dem Platzhalter %t[hh:mm] formatieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Annahme da keine Angabe
e!Cockpit
Advance Panel TP600
Protokoll Modbus TCP
Steuerung Slave
Panel Master
beides in einem Projekt

Variable als dt definieren (egal wo in der PLC)
im Server veröffentlichen (erfolgt automatisch als Byte Array 0..3)
Im Konfigurator der Kommunikation für das Panel bereitstellen (wird automatisch in dt bereitgestellt)
in der Visu verwenden

Ohne Programm in dem Panel und somit auch ohne Lizenzkosten
 
Zuletzt bearbeitet:
Zurück
Oben