日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Modbus协议栈开发笔记之五:Modbus RTU Slave开发

發布時間:2024/7/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。