Wago 750-871 <-> Modbus <-> Wago 750-342

XX5198

Level-1
Beiträge
28
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin,
ich hab ein kleines Verständnisproblem mit dem Modbus-Kommunikation.

Zunächst mein Aufbau:
Wago 750-871 mit einigen digitalen Ein- und Ausgängen
Dieser ist mittels Ethernetkabel mit einem Wago 750-342 verbunden, an dem auch wieder digitale Ein- und Ausgangskarten stecken (Reihenfolge: 2DI 750-410, 4DI 750-402, 4DO 750-504).

Ich möchte jetzt über Modbus UTP Eingänge lesen und Ausgänge ansteuern können.
Letzteres habe ich auch hinbekommen. Dafür habe ich FunctionCode 5 benutz und steuer die Ausgänge einzeln an (es sind nur wenige, die auch selten gleichzeitig angesteuert werden sollen)

Mein Problem ist jetzt, dass ich die Eingänge gerne alle auf einmal auslesen muss. Dafür hatte ich FunctionCode 2 gewählt, jedoch liefert der Funktionsblock aus der Modus-Lib immer den Error Code 153 und es passiert nichts.

Ich hab mal ein Screenshot vom Baustein gemacht:

Bildschirmfoto.png


IP-Adresse usw ist klar, funktioniert bei den Ausgängen ja wunderbar.
FC:=2;
StartReadAddr:=0 (so wie ich das verstanden hab geht das, weil ich digital arbeite und nur digitale Karten verbaut sind)
RegsToRead:=6 (da 6 Eingänge)
ADR(InData):= Zeiger auf meine Datei, in der ich das Ergebnis speichern will (als WORD deklariert)
Naja der Rest wäre dann zum Zugriff auf Ausgänge, was ja funktioniert...

So weit ich das verstanden habe muss ich die Adresse angeben, ab der die Eingänge ausgelesen werden sollen, wie weit soll gelesen werden und das
Ergebnis der Zustände sollte dann in meiner Datei InData landen. Diese bleibt aber leider Null und ErrCode=153?

Wo liegt mein Fehler?

Ich danke schon mal für eure Hilfe.

Gruß
Andtreas
 
Was passiert wenn du tTime_OUT mal massiv verlängerst? (Vorausgesetzt IP Adress + wPort ist korrekt)
153 = 0x99 = Time Out, siehe Doku zur Lib

Mfg
Manuel
 
So ich glaub ich hab meinen Fehler gefunden bzw. das ganze jetzt richtig kapiert:
Mein Fehler war offensichtlich, dass meine Funktion den wert der Eingänge an eine Variable auserhalb übergeben sollte, auf die sie nicht schreiben konnte.
Jetzt nutze ich eine Variable innerhalb der Funktion.

Aber ein Problem hab ich noch:
Um die Ausgänge zu setzten und die Eingänge aus zu lesen werden ja dezimale Werte benutzt, also OutData=1 schaltet den ersten Ausgang, OutData=3 schaltet Ausgang 1 und 2 usw.
Ich möchte im Programm aber natürlich gerne binär arbeiten, also wollte ich eine Konvertierung von Dual in Binär bzw. für die Eingänge anders rum machen.

Wie das von der Mathematik geht weis ich aber irgendwie funktioniert das noch nicht ganz.

Oder gibt es einen einfacheren Weg?
Kann Codesys zb 54 direkt in entsprechenden Dual-Wert konvertieren?


EDIT:
So Umwandlung funktioniert jetzt von Binär zu Dezimal und umgekehrt. Ich mach das jetzt mit einer While-Schleife. Meine Frage wäre jetzt nur ob jemand einen weg kennt, der einfacher und evtl Ressourcen sparender ist?
 
Zuletzt bearbeitet:
Zurück
Oben