Modbus協議棧開發筆記之八:Modbus ASCII Master開發
這一節我們來封裝Modbus ASCII Master應用,Modbus ASCII主站的開發與RTU主站的開發是一致的。同樣的我們也不是做具體的應用,而是實現ASCII主站的基本功能。我們將ASCII主站的功能封裝為函式,以便在開發具體應用時呼叫。
對於ASCII主站我們主要實現的功能有兩個:其一是生成訪問RTU從站的命令,總共支援8中功能碼。其二是對ASCII從站端返回的資訊進行解析並根據結果進行各種操作,同樣也是支援8中功能嗎的操作。具體軟體訪問結構如下:
1、訪問命令的生成
客戶端作為主動互動端,需要向伺服器發各種操作請求命令。所以對於ASCII主站來說,首先要生成訪問伺服器的命令。生成命令只需要按標準的協議格式來生成即可,目前我們只支援前面提到的8個功能碼。
/*生成訪問從站的命令*/
uint16_t CreateAccessAsciiSlaveCommand(ObjAccessInfo objInfo, void *dataList, uint8_t *commandBytes)
這樣在開發具體的客戶端應用時只需要呼叫這個函式來生成訪問伺服器的命令就可以了。
2、響應資訊的解析
如前一節所述,伺服器收到命令後,根據命令進行處理並生成響應資訊返回給客戶端。客戶端接到命令後首先要對響應資訊進行解析,解析的過程其實與伺服器端是一致的。所不同的是,不需要再根據解析結果生成響應資訊了。
/*解析收到的從站相應資訊*/
void ParsingAsciiSlaveRespondMessage(uint8_t *recievedMessage, uint8_t *command,uint16_t rxLength)
這樣在開發客戶端應用時,我們呼叫這一函式來解析響應資訊就可以了。
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};
到這裡,ASCII主站的封裝就完成了,當然具體的資料處理部分需要在開發具體應用是才能確定。
原始碼可上Github下載:https://github.com/foxclever/Modbus
歡迎關注: