Wago als Modbus Master soll mehrere Register schnell abrufen

Gog

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

bin gerade dabei einen Modbus Slave über die Wago mit den ETHERNET_MODBUSMASTER_TCP Baustein auszulesen
Es geht hier um Messwerte daher heißt es um so schneller um so besser.
Jedoch ist das slave Register mit 30000 Einträgen bestückt und der Slave lässt nur ca. 50 Einträge in einen schwung zu??

Somit habe ich Anfangs mit 3 Bausteinen die verschiedenen Bereiche die benötigt werden ausgelesen alle paar minuten kommt es dann aber zur kollision zwischen den Baustenen wenn sie auf den gleichen slave zugreifen.

dann habe ich mir gedacht ich mache nur einen Modbus Baustein und wechsle nur noch die Adresse, die Quantity und den Kopierort des Poiner Arrays,
(wollte auch gleichzeitig das erneute Verbinden über TCP verhindern)
dann habe ich bei jedem Ready vom Modbus baustein einen Zähler hochgezählt und wollte dann eigentlich in einer Codesys Aktion in ST mit einer IF Anweisung die Variablen für die entsprechenden Register anpassen. jedoch erlaubt die Codesys bei IF nur Boolische Werte???
in der Hilfe steht das auch jedoch im Beispiel dann ==> IF temp<17 da kann doch was nicht stimmen...

Hat einer eine Lösung für eine schnelle Modbus Abfrage
und hat einer eine Lösung für was man anstelle von IF Then nehmen kann?

Vielen Dank
 
Hi,

probier mal die Bedingung in der IF in Klammern () zu setzen.

IF (temp < 17) THEN

Gruß
HMIman
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also IF xy<17 oder ähnliches geht auf jeden Fall. Ich habe aber festgestellt das bspw =< oder Ähnliches zu Fehlermeldungen führen kann.
Lag damals glaube ich nur an der Reihenfolge wie die Zeichen hintereinander standen.
 
Hallöchen,

in der Hilfe steht das auch jedoch im Beispiel dann ==> IF temp<17 da kann doch was nicht stimmen...

Das stimmt schon. IF kann nur nach Bool abgefragt werden. "temp < 17" liefter ja auch schließlich TRUE oder FALSE zurück.

Du kannst auch z.B. AND und OR einbauen in die Abfrage. Letztendlich muss aber TRUE oder FALSE rauskommen.

Ich kenne zwar deinen Code nicht, aber neben IF kann sich auch die CASE-Abfrage als nützlich erweisen.

Gruß
 
Danke!

jetzt bin ich drauf gekommen ich hatte immer nach der Variablen einen Doppelpunkt ==> IF ZyklusNr: = 0 THEN

so geht es jetzt zumindest mal weiter:
IF ZyklusNr = 0 THEN
READ_ADDRESS :=1008;
READ_QUANTITY:=4;
read_buffer :=read_buffer2;
ELSIF ZyklusNr = 1 THEN
usw.
ELSE
ZyklusNr:=0;

ob der Rest geht schau ich jetzt mal.
Falls einer ein vorschlag hat um die geschwindigkeit zu erhöhen bitte melden.

Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

den Doppelpunkt benötigst du nur, wenn du eine Variable beschreiben möchtest.

Je nachdem wie hoch dein Wert ZyklusNr wird, errachte ich an dieser Stelle die von mir genannte Case-Anwendung für sinniger.

Code:
Case ZyklusNr OF
1:READ_ADDRESS :=1008;
READ_QUANTITY:=4;
read_buffer :=read_buffer2;
2: usw..
...
n:
ELSE
 ....
END_CASE
 
Zurück
Oben