CODESYS 3 + Modbus TCP + Real Werte lesen (Janitzer)

Kieler

Level-2
Beiträge
764
Reaktionspunkte
86
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe ein Verständnis Problem.

In CODESYS ist es doch eigentlich so, das Merkerregister 0 enthält die Merkerbyte 0 und 1. Das Register %MW1 dann die Byte 1 und 2. Soweit so gut. Wenn ich jetzt jetzt aber einen Modbus TCP Slave an meiner Steuerung projektiere, welcher 2 Wörter ab der Adresse 0 beinhaltet, dann beginnt das zweite Wort nicht etwa bei "1" sondern bei "2". Das erste Wort beinhaltet dann die Bits 0.1 ... 1.7. Warum? Werden aus dem Register %IW0 dann nur 8 Bits anstelle von 16 genutzt? Was mir bei Bits ja noch relativ egal sein kann, stößt mir aber jetzt bei Doppelwörter auf.

Ich lese aus einem Janitzer Energiemessgerät einen Realwert auf die Adresse %IW100 aus. Jetzt kann ich aber in meinen Programm nicht einfach

STROM AT %ID100 : REAL;

sagen. Da kommt nichts vernünftiges raus. Für mich auch klar, %ID100 ja die Register 100 und 101 enthält. In Wirklichkeit liegt aber ein Teil des Messwertes in %IW102 und %IW103. Wie kann man das lösen??
 
Hallo,
In CODESYS ist es doch eigentlich so, das Merkerregister 0 enthält die Merkerbyte 0 und 1. Das Register %MW1 dann die Byte 1 und 2.
Nein, das ist so bei Siemens, aber nicht Codesys (zumindest in 2.3, s. Hilfe Merker)
Soweit so gut. Wenn ich jetzt jetzt aber einen Modbus TCP Slave an meiner Steuerung projektiere, welcher 2 Wörter ab der Adresse 0 beinhaltet, dann beginnt das zweite Wort nicht etwa bei "1" sondern bei "2". Das erste Wort beinhaltet dann die Bits 0.1 ... 1.7. Warum? Werden aus dem Register %IW0 dann nur 8 Bits anstelle von 16 genutzt? Was mir bei Bits ja noch relativ egal sein kann, stößt mir aber jetzt bei Doppelwörter auf.

Aus der Hilfe (2.3)
Mit %MX5.0 etwa greift man auf das erste Bit im fünften Wort zu (Bits werden in der Regel Wort weise abgelegt)
Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke, dass du geantwortet hast. Aber warum eigentlich? Du hast erkannt, dass ich mich im ersten Satz vertippt habe. Wenn das MW0 das Byte 0 und 1 enthält, dann enthält das MW 1 die Byte 2 und 3. Klar. Das alles hat aber jetzt mit meinem Doppelwortzugriff auf Eingangswörter nur am Rande zu tun.

Aber vielleicht hast du mich aber trotzdem auf die richtige Spur gebracht. Wenn ich ein Real über %IW100 einlesen möchte, dann muss ich vermutlich auf %ID50 zugreifen. Das muss mich morgen gleich ausprobieren.
 
Zuletzt bearbeitet:
Direkt auf das %ID... eine REAL-Variable deklarieren ist eher ungünstig, weil ich glaube, von Modbus zu Codesys müssen noch die Bytes getauscht werden.

Besser:
Code:
MB_STROM AT %ID50 : DWORD; (* %IW100 + %IW101 *)
Vom DWord die Byte-Reihenfolge umdrehen (ReverseBYTEsInDWORD) und das Ergebnis auf eine REAL-Variable ablegen.

Oder
Code:
MB_STROM_1 AT %IW100;
MB_STROM_2 AT %IW101;
und die beiden Word in ein DWord packen (PackWordsToDword), die Byte-Reihenfolge umdrehen (ReverseBYTEsInDWORD), und das Ergebnis auf eine REAL-Variable ablegen.

Harald
 
Direkt auf das %ID... eine REAL-Variable deklarieren ist eher ungünstig, weil ich glaube, von Modbus zu Codesys müssen noch die Bytes getauscht werden.

Harald

Hallo Harald,

vielen Dank für deine Unterstützung. Ich habe die Zeit am Wochenende genutzt, um auch diesen kleinen Restpunkt vor dem morgigen Kundeneinsatz zu lösen. Das Problem lag im Wesentlichen darin, dass ich die beiden Wörter des Real vertauschen musste. Ich habe immer versucht, die Byte zu drehen. Das war aber Quatsch. Bei einem Doppelwort muss man offensichtlich nicht die Byte, sondern die Wörter drehen. Da ich die von dir angegebenen Funktionen nicht gefunden habe, habe ich die Vertauschung halt von Hand programmiert. Wenn man das Ziel kennt, findet sich auch immer ein Weg. Trotzdem muss ich mich an den ruhigen Tagen einmal intensiv mit dem Thema Bibliotheken beschäftigen. Zum einen habe ich konkret noch das Problem, dass ich bei meiner CODESYS SPS die Uhr über mein Programm stellen möchte und da fehlen mir noch die konkreten Funktionen. Zum anderen fehlt mir auch ein gewisses Grundverständnis beim Thema Bibliotheken. Werden diese vollständig in mein Programm eingebunden? Auch die Bausteine, welche ich nicht verwende? Wie ist es mit Speicherplatz? Wie stelle ich sicher, dass sie bei einer Programmsicherung dabei sind?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es gibt zwei Möglichkeiten:
entweder gibt es von der Bibliothek eine binäre Version, die wird in das SPS Programm mit eingebunden und als Bibliothek geladen
oder es wird nur der benötigte Code der Bibliothek mit in das Programm einkompiliert.

Ist ist glaube ich zwischen den Herstellern verschieden.

Zur Sicherung: das native CoDeSys sichert meines Wissens die Bibliotheken mit. Archivier einfach mal das Projekt und guck dann in die ZIP. Dann siehst Du das.

Gruß
Jens
 
Zurück
Oben