1. 程式人生 > >Modbus協議棧開發筆記之五:Modbus RTU Slave開發

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

歡迎關注: