Modbus協議棧開發筆記之五:Modbus RTU Slave開發
Modbus在序列鏈路上分為Slave和Master,這一節我們就來開發Slave。對於Modbus RTU從站來說,需要實現的功能其實與Modbus TCP的伺服器端是一樣的。其操作過程也是一樣的。首先接收到主站的訪問命令,對該命令報文進行解析,這裡我們也只是實現前面提到的8種功能碼。其次我們根據解析的結果進行對應的操作,具體的軟體訪問結構如下:
從上圖中不難發現實際是3步:
第1步、接到命令後先解析。解析的方式與前面幾節中的類式。
第2步、根據解析結果進行操作。包括更具命令修改或者獲取變數的值。
第3步、生成響應並返回給主機。
1、解析主機命令
從機在接收到主機的命令報文後,對其進行解析,我們暫且支援上圖所示的8種功能碼。
/*解析接收到的資訊,並返回合成的回覆資訊和資訊的位元組長度,通過回撥函式*/
uint16_t ParsingMasterAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes,uint16_t rxLength)
該函式接收接受到的報文,並生成響應資訊報文,返回值是響應報文的長度。在開發應用是將接收到的報文傳送個該函式,並將生成的響應資訊返回個客戶端就可以了。
2、結果操作
解析之後無論是讀命令還是寫命令都需要進行相應的操作。我們根據不同的功能碼封裝不同的操作:
/*處理讀線圈狀態命令*/
static uint16_t HandleReadCoilStatusCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理讀輸入狀態命令*/
static uint16_t HandleReadInputStatusCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理讀保持暫存器命令*/
static uint16_t HandleReadHoldingRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理讀輸入暫存器命令*/
static uint16_t HandleReadInputRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理寫單個線圈命令*/
static uint16_t HandleWriteSingleCoilCommand(uint16_t coilAddress,uint16_t coilValue,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理寫單個暫存器命令*/
static uint16_t HandleWriteSingleRegisterCommand(uint16_t registerAddress,uint16_t registerValue,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理寫多個線圈狀態*/
static uint16_t HandleWriteMultipleCoilCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
/*處理寫多個暫存器狀態*/
static uint16_t HandleWriteMultipleRegisterCommand(uint16_t startAddress,uint16_t quantity,uint8_t *receivedMessage,uint8_t *respondBytes)
同樣我們也是定義一個函式指標陣列來實現這8個函式的呼叫:
uint16_t (*HandleMasterCommand[])(uint16_t,uint16_t,uint8_t *,uint8_t *)={HandleReadCoilStatusCommand,
HandleReadInputStatusCommand,
HandleReadHoldingRegisterCommand,
HandleReadInputRegisterCommand,
HandleWriteSingleCoilCommand,
HandleWriteSingleRegisterCommand,
HandleWriteMultipleCoilCommand,
HandleWriteMultipleRegisterCommand};
3、生成從機響應
處理完還需要生成從機的相應資訊,無論是讀操作命令還是寫操作命令,我們均在對應的功能碼處理時生成響應報文。這麼一來在開發應用時,只需要呼叫解析函資料可以實現全部的功能了。
原始碼網址是:https://github.com/foxclever/Modbus
歡迎關注: