Modbus协议栈开发笔记之八:Modbus ASCII Master开发
這一節(jié)我們來(lái)封裝Modbus ASCII Master應(yīng)用,Modbus ASCII主站的開發(fā)與RTU主站的開發(fā)是一致的。同樣的我們也不是做具體的應(yīng)用,而是實(shí)現(xiàn)ASCII主站的基本功能。我們將ASCII主站的功能封裝為函數(shù),以便在開發(fā)具體應(yīng)用時(shí)調(diào)用。
對(duì)于ASCII主站我們主要實(shí)現(xiàn)的功能有兩個(gè):其一是生成訪問(wèn)RTU從站的命令,總共支持8中功能碼。其二是對(duì)ASCII從站端返回的信息進(jìn)行解析并根據(jù)結(jié)果進(jìn)行各種操作,同樣也是支持8中功能嗎的操作。具體軟件訪問(wèn)結(jié)構(gòu)如下:
1、訪問(wèn)命令的生成
客戶端作為主動(dòng)交互端,需要向服務(wù)器發(fā)各種操作請(qǐng)求命令。所以對(duì)于ASCII主站來(lái)說(shuō),首先要生成訪問(wèn)服務(wù)器的命令。生成命令只需要按標(biāo)準(zhǔn)的協(xié)議格式來(lái)生成即可,目前我們只支持前面提到的8個(gè)功能碼。
/*生成訪問(wèn)從站的命令*/
uint16_t CreateAccessAsciiSlaveCommand(ObjAccessInfo objInfo, void *dataList, uint8_t *commandBytes)
這樣在開發(fā)具體的客戶端應(yīng)用時(shí)只需要調(diào)用這個(gè)函數(shù)來(lái)生成訪問(wèn)服務(wù)器的命令就可以了。
2、響應(yīng)信息的解析
如前一節(jié)所述,服務(wù)器收到命令后,根據(jù)命令進(jìn)行處理并生成響應(yīng)信息返回給客戶端。客戶端接到命令后首先要對(duì)響應(yīng)信息進(jìn)行解析,解析的過(guò)程其實(shí)與服務(wù)器端是一致的。所不同的是,不需要再根據(jù)解析結(jié)果生成響應(yīng)信息了。
/*解析收到的從站相應(yīng)信息*/
void ParsingAsciiSlaveRespondMessage(uint8_t *recievedMessage, uint8_t *command,uint16_t rxLength)
這樣在開發(fā)客戶端應(yīng)用時(shí),我們調(diào)用這一函數(shù)來(lái)解析響應(yīng)信息就可以了。
3、響應(yīng)處理
對(duì)于解析出來(lái)的信息,我們需要根據(jù)情況實(shí)現(xiàn)操作,比如修改變量的值等,應(yīng)為主要支持的操作碼是8個(gè),理論上對(duì)應(yīng)的每種功能碼都會(huì)有不同的操作,但事實(shí)上,由于寫操作命令已經(jīng)不需要做任何操作了,所以對(duì)應(yīng)的操作實(shí)際上只有讀操作的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)
同樣的,我們也定義一個(gè)函數(shù)指針數(shù)組來(lái)實(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开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 探索比特币源码2-配置Bitcoin C
- 下一篇: 一个基于STM32实现的多组分气体分析仪