Jump to content

Recommended Posts

Geschrieben

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

Matlab_modbus.thumb.PNG.c1af1a28fa9dc5597d3d0a85bf49686b.PNG

Viele Grüße,
Alex

Geschrieben

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.

Geschrieben
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?

Geschrieben

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.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...