Wago: UDINT über Modbus auslesen

Servus!

Ich möchte gerne eine UDINT Variable über Modbus auslesen, welche die Sekundenlaufzeit meiner Pelletförderschnecke enthält.

Meine Frage vorweg -> ist das überhaupt möglich?
Ich gehe mal grundsätzlich davon aus dass es möglich ist, da mir aber der wirkliche Durchblick bei den Datentypen fehlt dachte ich dass mir vielleicht jemand aus dem Forum weiterhelfen kann. Muss ich den Datentyp ggf. in der Wago konvertieren? Ich komme nicht weiter.

Schönen Gruß
Daniel

Hat vielleicht jemand einen Ansatzpunkt für mich?

Grüße

Int64 kann PHP nicht - Deswegen würdest du den Wert nicht richtig auswerten können.

Du musst ihn in einen INT pressen und gucken, wie du den Überlauf abfängst.

paresy

Danke Paresy, ich versuchs mal!

Gruß
Daniel

PHP hat BC Math (PHP: BC Math Funktionen - Manual) und GMP (PHP: GMP Funktionen - Manual), um mit Strings von beliebiger Länge zu rechnen.

Hallo Daniel,

also ich würde die „Sekundenlaufzeit“ in jeweils ein WORD für Stunden/Minuten/Sekunden splitten und die drei Worte einzeln übertragen.

Viele Grüße
Roland

Hallo Roland,

ich steh leider etwas auf dem Schlauch. Ich verwende als Baustein derzeit „ONTIME“ der Oscat Bibliothek. Kennst du vielleicht einen anderen Baustein?

Ich kann zwar UDINT in WORD konvertieren - aber wie bekomme ich WORD in IPS? Wenn ich in IPS eine Variable anlegen will geht nur Integer, String, Boolean oder Float. Oder stehe ich noch mehr auf dem Schlauch als ich denke?

Schöne Grüße
Daniel

Hallo Daniel,

der ONTIME-Baustein ist ok.
Wie sieht denn die Konvertierung von UDINT nach WORD aus?
Wenn Du einfach nur mit „DWORD_TO_WORD“ konvertierst, dann geht es wohl eine Zeit lang gut, aber nach 65535 Sekunden bekommst Du einen Überlauf.

WORD/UINT = 0 bis 65535
DWORD/UDINT = 0 bis 4294967295
INTEGER mit VZ = −32768 bis +32768

Kleine Hilfestellung für Konvertierung in „WORD“ für Stunde/Minute/Sekunde:


Stunden = Gesamtsekunden DIV 3600
Restsekunden = Gesamtsekunden MOD 3600 (MOD liefert den ganzzahligen Rest der Division)
Minuten = Restsekunden DIV 60
Sekunden =  Restsekunden MOD 60

Dafür reicht auch der Wertebereich einer Integer-Variable in IPS aus. (32768 Stunden)

Viele Grüße
Roland

Danke Roland. Habe jetzt einiges ausprobiert… aber es klappt nicht so ganz…
Fällt die Verwendung eines Konvertierungsbausteins flach mit den von dir angegebenen Rechenoperationen? Oder muss ich UDINT nach INT Konvertieren und auf INT die Operationen anwenden?

Im Anhang siehst du was ich bisher gemacht habe… aber die Restsekunden ändern sich irgendwie nicht wie sie sollen glaube ich.

Schöne Grüße
Daniel

hat jetzt wahrscheinlich nix mit der Lösung zu tun, aber vom Ablauf fänd ichs schöner wenn du 28 und 29 vertauschen würdest…

Christian

Hallo Daniel,

sieht doch schon mal nicht schlecht aus! :wink:

Ein paar Sachen:

  1. „Gesamtsekunden“ sollte die 32Bit UDINT Ausgangsvariable des TIMEON sein und kein 16Bit Integer (Falls „Sekunden_int“ Integer ist?)
  2. Gerechnet wird mit 32Bit, aber Ausgangsvariablen sind 16Bit Word --> Ausgangsvariablen vorher konvertieren DWORD_TO_WORD
  3. Die Sekunden beziehen sich auf den Rest der Minutendivision. --> „Restsekunden MOD 60“ und nicht „Minuten MOD 60“

@Ferengi: Sehe ich genauso. Wenn die Reihenfolge stimmt ist es auch „verständlicher“.

Viel Erfolg! :smiley:
Roland

Ich hab’s jetzt korrigiert, vielen Dank!
Mein größtes Problem ist jetzt noch, wie ich die Variablen in IPS bekomme.

Alle Variablen haben jetzt als Datentyp UDINT.

Du schreibst ich soll DWord in Word konvertieren… ich habe aber doch gar keine DWord Variablen… :confused:
Ich weiß dass ich Word in ips übernehmen soll…

Ich habe jetzt UDINT -> WORD konvertiert… und die Variable Minuten_ips genannt. Aber irgendwas sagt mir dass das wohl nicht richtig ist.

Ich weiß ja auch nicht - bei dem Hellikeitssensor fiel es mir leichter, die Werte habe ich schon in IPS (thnx!)

Ich bin echt viel am rumprobieren, aber ich komme schon wieder nicht weiter :frowning:

Schöne Grüße
Daniel

[Edit: habe die Variablen jetzt in IPS]

Danke RWN, schneller als die Polizei erlaubt!
Irgendwie hat die Forensoft gerade nicht so gewollt wie ich.

Roland, ich habe die Variablen jetzt in IPS. Hatte wie gesagt UDINT -> Word konvertiert und die Word-Variable per Merker in IPS (Integer) eingelesen.

Ich würde gern den Code heute abend nochmal reinstellen - wäre dir sehr dankbar wenn du nochmal drüberschauen könntest.

Schöne Grüße
Daniel
(der sich seinem Pelletbunker widmen muss, da am Freitag die Pellets kommen :rolleyes:)

Ja kein Problem. Kann im Moment nicht nachvollziehen was Du wie gemacht hast.

Draussen wird es ganz schön schattig. Da muss man Prioritäten setzen! :wink:

Was man für eine Zeit vor dem Computer verbringen kann :rolleyes:
Aber das brauche ich in diesem Forum niemandem zu erzählen :slight_smile:

Ich habe nochmal 3 Screenshots angehängt.
Bild 1 und 2 sind der Programmteil, Bild 3 die Variablen.

Ich möchte gern wissen ob das mit den Datentypen jetzt so passt und das da nix überläuft :smiley:

Ich muss mal schauen wie ich die Daten dann von IPS (schöner noch wäre ja direkt von der Wago) in eine Datei schreiben kann. Das ist dann wieder ein anderes Thema…

Schönen Abend noch!
Daniel

sc2.jpg

Wichtig ist, dass die Quellvariable (Gesamtsekunden) remanent gehalten wird. Alle anderen Variablen werden von dieser abgeleitet und brauchen keine Remanenz.
Hab mal ein Beispiel in CFC angehängt - ist etwas kompakter als FUP. :wink:

Der Rest sieht ok aus!

Viele Grüße
Roland

Hallo Roland,

nochmals vielen Dank für deine Hilfe! Dann werde ich nur die Sekunden remanent definieren.

Was die Schreibzyklen des internen Flashs betrifft - ist das tatsächlich so das man den nur ca. 90tsd mal Beschreiben kann? Je nach Ungeschicktheit kann das ja ganz schnell gehen…

Naja, jetzt erstmal in die Kiste!

Schöne Grüße
Daniel

Hallo Daniel,

der Flash-Speicher für das Filesystem ermöglicht beim 841 bis zu 1 Million Schreibzyklen.
Ich persönlich vermeide den direkten Zugriff auf das Filesystem. Dafür gibt es ja beispielsweise IPS… :wink:

Viele Grüße
Roland