# Wago als Modbus Master soll mehrere Register schnell abrufen



## Gog (7 August 2016)

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


----------



## HMIman (8 August 2016)

Hi,

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

IF (temp < 17) THEN

Gruß
HMIman


----------



## Dr.MirakulixX (8 August 2016)

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.


----------



## ChickenWingZ (8 August 2016)

Hallöchen,



Gog schrieb:


> 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ß


----------



## Gog (8 August 2016)

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


----------



## ChickenWingZ (9 August 2016)

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.


```
Case ZyklusNr OF
1:READ_ADDRESS :=1008;
READ_QUANTITY:=4;
read_buffer :=read_buffer2;
2: usw..
...
n:
ELSE
 ....
END_CASE
```


----------

