Modbus庫開發筆記之九:利用協議棧開發Modbus TCP Server應用
前面我們已經完成了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應用