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
歡迎關注:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Modbus协议栈开发笔记之五:Modbus RTU Slave开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux配置网卡自动获取的命令,lin
- 下一篇: 嵌入式IAP开发笔记之一:面向STM32