Modbus RTU in Twincat, wie anfangen?

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Tobias5,

kannst Du mir bitte auch dein ST-Programm zur Modbus RTU schicken?
Ich wühle mich schon Tage durch und bekomme es nicht hin.

Vielen Dank und Gruß
Thomas
 
Ich habe weiterhin ein Problem mit dem ModBus.
Und zwar wenn ich die Funktion ReadRegs mit folgenden Parametern ausführe:

ModbusMaster.ReadInputRegs(
UnitID:=1 <- Adress of the Slave
Quantity:=2 <- How many coils i want to read
MBAddr:=30001 <- Modbus Adress (Also wo zB der Messwert liegt)

cbLength:=SIZEOF(???) <- i read something like it hast to be 2 times of Quantity and i would think its the length of the value i read out of the regs ?
pMemoryAddr:=ADR(???) <- this is probably the address of the value read ?
Execute:= TRUE <- to start reading ?
cbRead=>ocbRead <- Probably what was read ?

Bei den Fragezeichen müsste theoretisch stehen wo das gelesene abgelegt wird oder ?

Habe auch ein paar Tests durchgeführt und frage mich, wenn cih diese Funktion ausführe müsste in den Ausgängen der seriellen Schnittstelle nicht ein paar bytes liegen ?

MfG

Christian
 
Also greife ich mit Inputs[0] auf die Adresse 30001 im Gerät zu ?
Und MBaddr:= Inputs[0] oder wie ?
Habe die Doku des öfteren gelesen werde da aber nicht ganz schlau draus
 
So wie ich das lese ist bei dem Baustein die Adresse 0 die Modbus Adresse 30001. In der Dokumentation der RS485 Modbusklemme ist auch ein Link auf ein Beispielprogramm enthalten.
Such mal im Google nach CAS Modbus Scanner , ist ein Windows Programm, eignet sich hervorragend zum Testen von Modbus Slaves. Gruß, Wollvieh.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wollte mir das Beispiel mal anschauen von diesem Link: https://infosys.beckhoff.com/englis...usrtubc/html/tcplclibmodbusrtu_common.htm&id=
Die Datei ist jedoch ein *.pr6 und ich weiß nicht wie ich diese mit TwinCat3 öffnen soll.

Ich habe mir zu dem auch mal das Video: https://www.youtube.com/watch?v=-wIu1eaS0vs&t=440s angeschaut. Ohne ein Wort zu verstehen sehe ich aber das die auch keinen Array wie Inputs benutzen. Sondern unter MBAddr nur die 0 und bei cbLength und pMemoryAddr die Variable in der der Wert gespeichert werden soll.

Bin ein bisschen verwirrt von dem ganzen wenn ich ehrlich bin. Mir fehlt irgendwie aktuell das Verständnis was ich genau womit verknüpfen soll. Ich habe die Eingänge der seriellen Schnittstelle mit Modbus.InData verbunden. Ist das richtig ??

Mit dem Scanner werde ich mich die Tage mal ausprobieren vielleicht finde ich da die Lösung.

Danke für die Hilfe:)
 
Zuletzt bearbeitet:
Also mittlerweile habe ich dieVerlinkung mit den Ausgängen der seriellen Schnittstelle und dem ModbusMaster hinbekommen. Man muss die ModbusMaster.InData mit den Eingängen verbinden. Außerdem ist die Adresse 30001 in ReadInputRegs 0. Außerdem muss man darauf achten wie viel Bit das empfange hat und die in einer Variable speichern, die auch ausreichend groß ist.

Das Bild was du weiter oben geschickt hast mit den Inputs[0] z.B. ist für einen ModbusSlave. Falls jemand die gleichen Probleme hat.

Aktuell muss ich nur noch die empfangenen Bytes in ein Real umwandeln nach dem 32 bit floating point format. Da hänge ich aktuell noch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Soweit die Bytes ein Real darstellen und die Ausrichtung (Stichwort: Little-Endian, Big-Endian) passt brauchst Du die Bytes nur per MEMCPY in eine REAL Variable zu kopieren oder Du erstellst eine UNION mit einem ARRAY von 4 Bytes und einer REAL-Variable.
 
Also die Reihenfolge ist falsch. Das habe ich gestern schon festgestellt. Daraufhin habe ich die Bytes in einen Array in der richtigen Reihenfolge gepackt. Und diese dann versucht mit folgendem Code:
FUNCTION B_IEEE32_TO_REAL : REAL

VAR_INPUT
IN : ARRAY[0..3] OF BYTE;
END_VAR
VAR
PTREAL:pOINTER TO REAL;
END_VAR



PTREAL:=ADR(IN);
B_IEEE32_TO_REAL := PTREAL^;


in eine Real Variable zulegen. Aber der Wert der mir angezeigt wird ist nicht der richtige. In Hexadezimal bekomme ich die Bytes in der Reihenfolge 16#0B2141A8 übergeben. Dann packe ich sie in der Reihenfolge 16#41A80B21, dass einen Wert von ca. 21 ergeben müsste. Die Variable hat aber einen Wert der sehr schwankt und immer mit e^-12 oder e^17 belegt ist. Also sehr weit vom erwarteten Wert entfernt ist.

Wenn ich die Bytes aber zB hier eintrage https://www.h-schmidt.net/FloatConverter/IEEE754de.html bekomme ich das richtige Ergebnis.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Top genau das war das Problem. Bekomme nun die richtigen Messwerte.

Kann man ein gelesenes REAL in seine Bytes auf Teilen um die in die richtige Reihenfolge zu bekommen ?

Hat sich erledigt. Danke für die Hilfe soweit klappt alles.
 
Zuletzt bearbeitet:
Ich habe ein ähnliches Problem wie die vorherigen Nutzer. Ich versuche Momentan eine Verbindung über einen PcCom aufzubauen. Dazu habe ich eine serielle Schnittstelle hinzugefügt. Die Ein- und Ausgänge der Schnittstelle habe ich mit der Modbus.InData bzw Modbus.OutData Instanz verknüpft. Folgendermaßen wird die Funktion ReadRegs vom Master ausgeführt:
MB.ReadRegs(
UnitID:=1,
Quantity:=SIZEOF(Data)/2 ,
MBAddr:=0,
cbLength:=SIZEOF(Data),
pMemoryAddr:=ADR(Data),
... );
(allen nicht aufgeführten Variablen habe ich eine lokale Variable zugewiesen)

Den Salve habe ich so eingestellt:
VAR_INPUT
MS : ModbusRtuSlave_PcCOM;
Inputs AT %IW0 : ARRAY[0..63] OF WORD;
Outputs AT %QW0 : ARRAY[0..63] OF WORD;
Memory AT %MW0 : ARRAY[0..63] OF WORD;
END_VAR

MS(
UnitID :=1,
AdrInputs := ADR(Inputs),
SizeInputBytes := SIZEOF(Inputs),
AdrOutputs := ADR(Outputs),
SizeOutputBytes := SIZEOF(Outputs),
AdrMemory := ADR(Memory),
SizeMemoryBytes := SIZEOF(Memory),
ErrorId => );


Mein Problem ist nun dass ich beim Versuch eine Verbindung aufzubauen immer folgende ErrorId beim Master erhalte: MODBUSERROR_NO_RESPONSE
Kann mir da jemand weiterhelfen? Ich konnte im infosys von Beckhoff und auch auf sonstigen Internetseiten nichts genaues finden.
 
@Hüpf3R : ein neuer Threat wäre prinzipiell schön gewesen.

So ganz verstehe ich nicht was du machst.
Du hast einen Baustein für den Master erstellt vom Typ
ModbusRtuMaster_PcCom und die Eingänge/Ausgänge auf die Com-Schnittstelle verlinkt.
Was willst du dann mit dem Slave und das auch noch als Baustein wo die als VAR_INPUT ... END_VAR mit Speicheradressen versiehst? Speicheradressen gibt es physikalisch nur 1x im Gerät.

Aaaalso, bitte einmal strukturiert von Anfang an beschreiben was du machst, sonst wird das nichts.

Guga
 
Der eher mäßige Beckhoffsupport und die Tatsache, dass es einfach nicht ging 2 PCs über den COM-Port mit Modbus RTU zu verbinden, bzw. einfahc nicht die Zeit ist noch länger daran rumzuprobieren.
Das hat 2 gründe. Zum einen der eher mäßige Beckhoffsupport. Zum anderen die Tatsache dass es einfach nicht ging 2 PCs über den COM-Port mit Modbus RTU zu verbinden, bzw. einfach nicht die Zeit ist noch länger daran rum zuprobieren und die Doku leider auch nicht weiterhilft.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hatte das eine oder andere mal auch schon meine Probleme mit dem Beckhoff Support, bin aber ansonsten sehr zufrieden mit deren Leistung.
Ich bin mir nicht sicher ob es bei Modbus RTU überhaupt möglich ist, dass Master und Slave über die selbe Schnittstelle laufen. Sowohl der Master als auch der Slave müssten ja über die Schnittstelle gleichzeitig senden und empfangen können. Habt Ihr das mit einer anderen Steuerung denn schon am Laufen?

Von irgendwas mit Internetzugang gesendet.
 
Zuletzt bearbeitet:
Naja Modbus RTU funktioniert ja so, dass der Master ein Telegramm sendet worauf der Slave antwortet. D.h. es ist immer nur einer der sendet. Das Problem bei uns war, dass TwinCAT zwar die COM-Schnittstelle blockier hat, aber keine Daten darüber gesendet hat, obwohl der Master ein Telegramm gesendet hat.
Mit der anderen Steuerung wird es erst die nächsten Tage getestet.
 
Bin jetzt von FUP auf ST umgestiegen und damit haben sich einige Probleme von oben selbst gelöst.
Gerne kann ich das Programm mal hochladen.
Wenn man noch daran dennkt am 9-Pol Stecker Tx und Rx zu Brücken, dann läuft es (hatte ich erst vergessen).
Hallo Tobias,

ich weiß, der Eintrag ist schon ein wenig älter, ich habe jedoch ganz ähnliche Probleme.
Könntest Du Dein Programm bitte nochmal hochladen?

Vielen Dank im voraus

MfG

Björn
 
Zurück
Oben