天天看點

freeModbus流程分析

ADU 》 應用資料單元,每個MODBUS幀

PDU 》 協定資料單元,除裝置位址及CRC校驗碼的資料

Modbus從裝置

字元接收:

序列槽字元中斷 》RTUReceiveFSM 》讀取一個位元組 》儲存至接收緩沖區,同時啟動T3.5定時器(幀與幀之間需間隔至少3.5個字元傳輸時間);

每次收到新字元,定時器都會被重置,直至T3.5逾時,表示一個MODBUS幀結束

定時器逾時後:

發出FRAME_RECEIVED事件

主線程:

收到FRAME_RECEIVED事件後,對幀進行CRC校驗,并從中擷取到從機位址、幀資料起始位址以及幀資料長度,當幀位址為本機位址或廣播位址時,發出EV_EXECUTE事件

收到EV_EXECUTE事件後,從幀資料中取得功能碼,并依據功能碼調用相應的處理函數,相同的幀資料位址用于儲存處理結果資料,并傳回結果資料的長度,然後調用RTUSend函數,通知發送任務進行資料發送

注意:

  1. T3.5逾時到函數被處理這段時間内,如果有新的幀進來,因共享緩沖區的原因,資料幀将會被破壞,需要注意
  2. MODBUS-RTU是按照資料傳輸間的空閑時間作為幀與幀之間區分的依據,是以序列槽接收不能使用緩沖區,必須實時處理,以滿足時序要求

Modbus主裝置

主裝置功能是由從裝置移植而來,是以基本流程與從裝置一緻,流程如下:

  1. 應用任務填充PDU資料至發送緩沖區中,然後發送MASTER_FRAME_SENT事件,等待發送完成
  2. 主功能線程收到MASTER_FRAME_SENT事件後,調用MasterRTUSend函數,添加CRC校驗碼後,啟動發送線程
  3. 發送線程調用MasterRTUTransmitFSM函數,送出所有資料,然後判斷如果為廣播模式,則啟動廣播指令固定延時定時器,否則啟動等待從裝置響應定時器
  4. 接收到從裝置資料後,停止等待接收定時器,啟動T3.5定時器
  5. T3.5定時器逾時後,發送MASTER_FRAME_RECEIVED事件,通知主線程資料接收完成
  6. 主線程解析幀并擷取從機位址、資料等資訊,發送MASTER_EXECUTE事件
  7. 主線程收到MASTER_EXECUTE事件,根據功能碼最高位判斷是否發生異常,并解析出異常碼
  8. 如果資料正常,則調用對應處理函數進行資料處理
  1. 主模式下定時器不再是單一的T3.5定時器,還有等待從裝置響應逾時定時,以及廣播指令固定延時定時功能
  2. 定時器逾時函數中,判斷逾時原因為接收等待逾時,則發送MASTER_ERROR_PROCESS事件,主線程中根據逾時類型調用對應的錯誤回調函數處理各種錯誤

繼續閱讀