as1408 Posted April 19, 2021 at 08:37 PM Posted April 19, 2021 at 08:37 PM Hallo zusammen, Ich habe zwei RS485 Bricklets und möchte gerne mittels Modbus Protokoll die "holding register" eines der Bricklets auslesen. Das ganze implementiere ich objektorientiert in Matlab. Leider wird mir aus der API Doku nicht klar wie das zweite Argument der "modbusSlaveAnswerReadHoldingRegistersRequest" Funktion lautet? In der Doku steht "int[] holdingRegisters". Die Funktion wird jedoch von dem "ModbusSlaveReadHoldingRegistersRequestCallback" Callback aufgerufen. Der besitzt aber nur die Event-Objekte requestID, startingAddress und count und nicht das Event holdingRegisters. Hier der spannende Teil vom Code... Viele Grüße, Alex Quote
photron Posted April 20, 2021 at 09:16 AM Posted April 20, 2021 at 09:16 AM Das RS485 Bricklet sendet dir den ModbusSlaveReadHoldingRegistersRequestCallback weil es selbst eine Modbus Anfrage für das Lesen von Holding Registers bekommen hat. In diesem Callback bekommst du jetzt mitgeteilt von welcher Adresse (startingAddress) aus wie viele Register (count) zu lesen sind. Du musst jetzt also bestimmen welche Werte du dem Bricklet geben willst (holdingRegisters), damit es mit diesen Daten die offenen Anfrage beantwortet. Quote
as1408 Posted April 21, 2021 at 07:11 AM Author Posted April 21, 2021 at 07:11 AM vor 21 Stunden schrieb photron: Du musst jetzt also bestimmen welche Werte du dem Bricklet geben willst (holdingRegisters), damit es mit diesen Daten die offenen Anfrage beantwortet. Ist hiermit gemeint die Adressen der holding Register in Form eines Arrays anzugeben oder eine eins-basierte Holding-Register-Nummer zwischen 1 und 65536, wie es beispielsweise in der Beschreibung zur "modbusMasterReadHoldingRegisters" steht? Mit beiden Varianten bekomme ich die Fehlermeldung "unable to resolve...". Kannst du ein Beispiel geben wie das Argument korrekt lauten muss? Quote
photron Posted April 21, 2021 at 11:20 AM Posted April 21, 2021 at 11:20 AM Ich glaube hier liegt ein grundsätzliches Verständnisproblem vor. Das RS485 Bricklet kann als Modbus Master oder Slave arbeiten. Als Modbus Master kannst du über das RS485 Bricklet Modbus Lese- und Schreibbefehle an angeschlossene Modbus Slaves schicken. Du rufst dazu z.B. modbusMasterReadHoldingRegisters auf, um einen Lesebefehl zu schicken. Das Ergebnis des Lesebefehls wird dir dann per ModbusMasterReadHoldingRegistersResponseCallback mitgeteilt. Als Modbus Slave kannst du über das RS485 Bricklet auf Modbus Lese- und Schreibbefehle eines angeschlossenen Modbus Masters antworten. Sprich du simulierst da also einen Modbus Slave. Das RS485 Bricklet teilt dir über den ModbusSlaveReadHoldingRegistersRequestCallback mit für welche Register ein Lesebefehl eingegangen ist. Du musst jetzt darauf mit modbusSlaveAnswerReadHoldingRegistersRequest dem RS485 Bricklet sagen mit welchen Werten der Lesebefehl beantwortet werden soll. Das Bricklet speichert sich keine Registerwerte, sondern reicht sie nur durch. Du musst also bestimmen welche Werte (nicht Adressen) die angefragten Register haben und sie dem Bricklet mitteilen. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.