1. 程式人生 > >Modbus庫開發筆記之九:利用協議棧開發Modbus TCP Server應用

Modbus庫開發筆記之九:利用協議棧開發Modbus TCP Server應用

數根 網絡 received ant getc multiple 利用 這不 tar

前面我們已經完成了Modbus協議棧的開發,但這不是我們的目的。我們開發它的目的當然是要使用它來解決我們的實際問題。接下來我們就使用剛開發的Modbus協議棧開發一個Modbus TCP Server應用。

開發Modbus TCP Server首先需要有TCP Server的支持以及網絡的配置等,但這些與Modbus本身沒有什麽關系,我們再次不作討論。我們規定網絡和TCP Server已經配置妥當。接下來我們討論Modbus TCP Server的實現過程。

根據前面對協議棧的封裝,我們需要引用Modbus TCP Server的相關封裝。在接收到命令後調用解析函數進行解析,解析函數的原型:

uint16_t ParsingClientAccessCommand(uint8_t *receivedMessage,uint8_t *respondBytes);

該函數作為函數指針傳遞給TCP Server,並回調解析接收到的信息列表。

除此之外,我們要根據具體的需要實現8個回調函數,以完成真正的對Modbus對象的操作,這8個函數的原型如下:

/*獲取想要讀取的Coil量的值*/

void GetCoilStatus(uint16_t startAddress,uint16_t quantity,bool *statusList);

/*獲取想要讀取的InputStatus量的值*/

void GetInputStatus(uint16_t startAddress,uint16_t quantity,bool *statusValue);

/*獲取想要讀取的保持寄存器的值*/

void GetHoldingRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue);

/*獲取想要讀取的輸入寄存器的值*/

void GetInputRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue);

/*設置單個線圈的值*/

void SetSingleCoil(uint16_t coilAddress,bool coilValue);

/*設置單個寄存器的值*/

void SetSingleRegister(uint16_t registerAddress,uint16_t registerValue);

/*設置多個線圈的值*/

void SetMultipleCoil(uint16_t startAddress,uint16_t quantity,bool *statusValue);

/*設置多個寄存器的值*/

void SetMultipleRegister(uint16_t startAddress,uint16_t quantity,uint16_t *registerValue);

這8個函數根據應用的具體需求來實現數據對象的操作,實現幾個如何實現根據各自的應用需求和數據結構來確定。

Modbus庫開發筆記之九:利用協議棧開發Modbus TCP Server應用