Modbus协议栈开发笔记之八:Modbus ASCII Master开发
這一節(jié)我們來封裝Modbus ASCII Master應(yīng)用,Modbus ASCII主站的開發(fā)與RTU主站的開發(fā)是一致的。同樣的我們也不是做具體的應(yīng)用,而是實現(xiàn)ASCII主站的基本功能。我們將ASCII主站的功能封裝為函數(shù),以便在開發(fā)具體應(yīng)用時調(diào)用。
對于ASCII主站我們主要實現(xiàn)的功能有兩個:其一是生成訪問RTU從站的命令,總共支持8中功能碼。其二是對ASCII從站端返回的信息進(jìn)行解析并根據(jù)結(jié)果進(jìn)行各種操作,同樣也是支持8中功能嗎的操作。具體軟件訪問結(jié)構(gòu)如下:
1、訪問命令的生成
客戶端作為主動交互端,需要向服務(wù)器發(fā)各種操作請求命令。所以對于ASCII主站來說,首先要生成訪問服務(wù)器的命令。生成命令只需要按標(biāo)準(zhǔn)的協(xié)議格式來生成即可,目前我們只支持前面提到的8個功能碼。
/*生成訪問從站的命令*/
uint16_t CreateAccessAsciiSlaveCommand(ObjAccessInfo objInfo, void *dataList, uint8_t *commandBytes)
這樣在開發(fā)具體的客戶端應(yīng)用時只需要調(diào)用這個函數(shù)來生成訪問服務(wù)器的命令就可以了。
2、響應(yīng)信息的解析
如前一節(jié)所述,服務(wù)器收到命令后,根據(jù)命令進(jìn)行處理并生成響應(yīng)信息返回給客戶端。客戶端接到命令后首先要對響應(yīng)信息進(jìn)行解析,解析的過程其實與服務(wù)器端是一致的。所不同的是,不需要再根據(jù)解析結(jié)果生成響應(yīng)信息了。
/*解析收到的從站相應(yīng)信息*/
void ParsingAsciiSlaveRespondMessage(uint8_t *recievedMessage, uint8_t *command,uint16_t rxLength)
這樣在開發(fā)客戶端應(yīng)用時,我們調(diào)用這一函數(shù)來解析響應(yīng)信息就可以了。
3、響應(yīng)處理
對于解析出來的信息,我們需要根據(jù)情況實現(xiàn)操作,比如修改變量的值等,應(yīng)為主要支持的操作碼是8個,理論上對應(yīng)的每種功能碼都會有不同的操作,但事實上,由于寫操作命令已經(jīng)不需要做任何操作了,所以對應(yīng)的操作實際上只有讀操作的4種功能碼。
/*處理讀從站狀態(tài)量返回信息,讀線圈狀態(tài)位0x01功能碼*/
static void HandleReadCoilStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)
/*處理讀從站狀態(tài)量返回信息,讀輸入狀態(tài)位0x02功能碼*/
static void HandleReadInputStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)
/*處理讀從站寄存器值的返回信息,讀保持寄存器0x03功能碼)*/
static void HandleReadHoldingRegisterRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)
/*處理讀從站寄存器值的返回信息,讀輸入寄存器0x04功能碼*/
static void HandleReadInputRegisterRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)
同樣的,我們也定義一個函數(shù)指針數(shù)組來實現(xiàn)這些函數(shù)的調(diào)用:
void (*HandleServerRespond[])(uint8_t *,uint16_t,uint16_t)={HandleReadCoilStatusRespond, HandleReadInputStatusRespond, HandleReadHoldingRegisterRespond, HandleReadInputRegisterRespond};
到這里,ASCII主站的封裝就完成了,當(dāng)然具體的數(shù)據(jù)處理部分需要在開發(fā)具體應(yīng)用是才能確定。
源代碼可上Github下載:https://github.com/foxclever/Modbus
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的Modbus协议栈开发笔记之八:Modbus ASCII Master开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探索比特币源码2-配置Bitcoin C
- 下一篇: 一个基于STM32实现的多组分气体分析仪