Jump to content

RS485 Matlab API - Modbus read holding registers


Recommended Posts

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

Link to post
Share on other sites

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.

Link to post
Share on other sites
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?

Link to post
Share on other sites

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.

Link to post
Share on other sites

Join the conversation

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

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...