1. 程式人生 > >Modbus庫開發筆記之四:Modbus TCP Client開發

Modbus庫開發筆記之四:Modbus TCP Client開發

creat 需要 修改 status command 協議格式 sin 服務器端 這一

這一次我們封裝Modbus TCP Client應用。同樣的我們也不是做具體的應用,而是實現TCP客戶端的基本功能。我們將TCP客戶端的功能封裝為函數,以便在開發具體應用時調用。

對於TCP客戶端我們主要實現的功能有兩個:其一是生成訪問TCP服務器的命令,總共支持8中功能碼。其二是對TCP服務器端返回的信息進行解析並根據結果進行各種操作,同樣也是支持8中功能嗎的操作。具體軟件訪問結構如下:

技術分享

1、訪問命令的生成

客戶端作為主動交互端,需要向服務器發各種操作請求命令。所以對於TCP客戶端來說,首先要生成訪問服務器的命令。生成命令只需要按標準的協議格式來生成即可,目前我們只支持前面提到的8個功能碼。

/*生成訪問服務器的命令*/

uint16_t CreateAccessServerCommand(ObjAccessInfo objInfo,void *dataList,uint8_t *commandBytes)

這樣在開發具體的客戶端應用時只需要調用這個函數來生成訪問服務器的命令就可以了。

2、響應信息的解析

如前一節所述,服務器收到命令後,根據命令進行處理並生成響應信息返回給客戶端。客戶端接到命令後首先要對響應信息進行解析,解析的過程其實與服務器端是一致的。所不同的是,不需要再根據解析結果生成響應信息了。

/*解析收到的服務器相應信息*/

void ParsingServerRespondMessage(uint8_t *recievedMessage)

這樣在開發客戶端應用時,我們調用這一函數來解析響應信息就可以了。

3、響應處理

對於解析出來的信息,我們需要根據情況實現操作,比如修改變量的值等,應為主要支持的操作碼是8個,理論上對應的每種功能碼都會有不同的操作,但事實上,由於寫操作命令已經不需要做任何操作了,所以對應的操作實際上只有讀操作的4種功能碼。

/*處理讀從站狀態量返回信息,讀線圈狀態位0x01功能碼*/

static void HandleReadCoilStatusRespond(uint8_t *receivedMessage,uint16_t startAddress,uint16_t quantity)

/*處理讀從站狀態量返回信息,讀輸入狀態位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)

同樣的,我們也定義一個函數指針數組來實現這些函數的調用:

void (*HandleServerRespond[])(uint8_t *,uint16_t,uint16_t)={HandleReadCoilStatusRespond, HandleReadInputStatusRespond, HandleReadHoldingRegisterRespond, HandleReadInputRegisterRespond};

如此,TCP客戶端的封裝就完成了,當然具體的數據處理部分需要在開發具體應用是才能確定。

Modbus庫開發筆記之四:Modbus TCP Client開發