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

Modbus庫開發筆記之五:Modbus RTU Slave開發

edm hold 還需 add rtu 需要 man access 服務器端

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、生成從機響應

處理完還需要生成從機的相應信息,無論是讀操作命令還是寫操作命令,我們均在對應的功能碼處理時生成響應報文。這麽一來在開發應用時,只需要調用解析函數據可以實現全部的功能了。

Modbus庫開發筆記之五:Modbus RTU Slave開發