CoDeSys 2.3 - Wiederholtes Auslesen eines Modbus Slaves in einer for-Schleife

L

Luk-11

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe in FUP ein Programm geschrieben, das mittels Modbus TCP bestimmte Register eines Slaves ausliest. Ursprünglich hatte ich die naive Hoffnung so einfach einen Block von 7000 Datenpunkten auslesen zu können. Wie ich nun festgestellt habe, kann ich in einem Lese-Schritt leider nur um die 120 Register auslesen - vrmtl. sind es dann genau 128.
Nun möchte ich das Programm gerne so abändern, dass die Variable Mw_StartReadAddress sich innerhalb einer Schleife befindet und mit jedem Schleifen-Durchgang um 120 hochgezählt wird (von 0 bis 7000 etwa). Ich nehme an, dass dies nur mit strukturiertem Text möglich ist. Müsste ich dann also ein Programm in ST schreiben, welches innerhalb einer Schleife Mw_StartReadAddress ändert und danach dann das Programm modbusMaster aufruft? Oder muss ich modbusMaster in einen Funktionsbaustein ändern?

So in etwa:
Code:
FOR i:=0 TO 60 DO:
    modbusMaster(PRG);
    Mw_StartReadAddress := Mw_StartReadAddress + 120;
END_FOR
 
Zuletzt bearbeitet von einem Moderator:
Wie lange dauert es, eine Anfrage an den ModbusTCP-Server zu senden und die Antwort zu erhalten? Und wie lange dauert es dann, wenn Du versuchst das innerhalb einer Schleife 61 mal zu machen? Auf welche Zeit ist die Zykluszeitüberwachung eingestellt? Was passiert wenn der Modbus-Server mal nicht in der erwarteten Zeit antwortet? Braucht Dein modbusMaster-Programm womöglich immer einen Durchgang durch einen Zykluskontrollpunkt?

Ich vermute, Dein Vorhaben kann nicht in einer FOR-Schleife realisiert werden, sondern braucht eine Schrittkette bzw. einen zyklischen Aufruf mit Schrittzähler/Adresszähler.

PS: Ich meine, die maximale Anzahl in einem Request lesbarer Register ist 125

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einen Ausschnitt des FUP Programms siehst du hier:

screen1.PNG

Wie du siehst, rufe ich ein zweites Programm Increment_ReadAddress auf:

Code:
IF modbusMaster.Mx_StartSend THEN
    modbusMaster.Mw_StartReadAddress := modbusMaster.Mw_StartReadAddress + 100;
END_IF

Und hier erhalte ich jetzt leider die Fehlermeldung: "Operanden von ST müssen Variablen mit Schreibzugriff sein"
... das ist echt schade, dass ich diese Adresse nicht ändern kann. Also, da muss es doch einen (einfachen) Weg geben!
 
Du kannst in einer Funktion nicht auf eine Variable schreiben, welche in einem anderen PRG, FB oder FC deklariert wurde. Wird Mw_StartReadAddress global deklariert kannst du diese Variable auch in der Funktion manipulieren.
Wie PN/DP aber schon richtig geschrieben hat, brauchst du einen definierten Ablauf.

1. lesen starten
2. warten bis lesen erfolgreich
3. lesen stoppen und Adresse erhöhen... zurück zu 1
 
Zurück
Oben