早在2008年左右,我就使用Modbus協議與產品中的其他設備進行通信。
請記住,第一個是智能電動機保護器,它充當Modbus從站并與Modbus主站設備通信。
這么多年來,一直沒有使用開源的Modbus協議代碼,但是我自己編寫的Modbus協議代碼一直在不斷優化,發現并解決了問題。
自己編寫的代碼更易于使用。
可以針對不同平臺優化該應用程序,以最大化處理器的性能。
在此期間,我踩了一些坑,現在我將得出一些結論:接收到串行端口數據后,將重新使用從通過IO端口接收數據的時間間隔。
發送后切換接收的延遲時間。
如上圖所示,Td根據Modbus協議的規定,在接收到數據之后,發送之前必須有3.5個字符的間隔。
如果波特率為9600bps,8個數據位,1個起始位,1個停止位且沒有奇偶校驗位,則1個字符為10位(對應于1.04ms)和3.5個字符(對應于3.5ms)。
考慮到總線上的電容對傳輸延遲的影響,建議在發送1.7個字符的數據后啟用接收。
這次可能會犯一些錯誤,例如:在發送完最后一個字節后的發送完成中斷中,直接控制IO端口以使能485芯片的接收。
眾所周知,由于電容器引起的信號延遲,串口數據沒有完全發送到總線,并且485芯片被設置為接收狀態,導致最后幾位數據錯誤;不能正確理解傳輸完成中斷和傳輸緩沖區清空中斷。
傳輸完成中斷之間的區別通常是指串行端口數據已從移位寄存器中的端口發送出去。
但這并不意味著它已經發送到RS485總線。
從MCU的IO端口到RS485總線,還必須考慮隔離光電耦合器,電容器和RS485芯片的延遲。
發送緩沖區為空的中斷意味著緩沖區位置已騰空,數據可以被緩沖。
此時,最后的數據可以在移位寄存器中按順序移出到IO端口。
此時,RS485芯片被設置為接收。
數據仍在不斷變化。
因此,有必要弄清楚所選擇的中斷是發送完成中斷還是緩沖區空中斷。
在發送中斷中,它不能切換為立即接收,因此應延遲一段時間。
在中斷中,如果判斷為最后一個字節,則延遲為1.7ms,并且將RS485設置為接收。
定時器不應該延時啟動,定時器資源是非常寶貴的,它應該由大約100us的定時器中斷中的變量來計數,大約需要1.7ms的延時; MODBUS從站設備將響應多長時間? Modbus是一種問答式通信。
主設備發送數據后,從設備將響應。
根據Modbus協議,從站在3.5個字符后做出響應是合法的。
不同的傳感器具有不同的響應時間。
一些不良的傳感器可能要到幾十毫秒后才會響應,而有些傳感器會在3.5ms左右立即響應。
有些甚至沒有遵循Modbus協議,因此在3.5ms之前做出了響應。
這要求主設備在啟用RS485接收后立即進入接收狀態。
如果使用串行端口中斷接收,則應注意中斷操作是否與主程序有關,以及中斷操作是否會影響接收。
每個串行端口數據之間的時間間隔Modbus根據數據之間的時間間隔判斷幀消息的結束。
必須確保幀消息中前后數據之間的間隔不超過3.5個字符。
通常在發送中斷期間發送數據。
為了確保數據的完整性和相互排斥的數據訪問,有些人喜歡關閉中斷以保護現場。
如果您不小心,這種方法將導致兩次發送數據之間的間隔超過3.5個字符。
特別是當波特率較高時,更可能發生這種情況。
例如,當波特率為38400時,3.5個字符僅約為850us。
在發送串行端口數據期間,如果中斷關閉了850us,則Modbus通信將中斷。
如果MCU支持DMA,建議使用DMA +定時器進行數據發送和接收。
作為Modbus從站設備,接收數據后需要多長時間進行響應?根據要求