先說一下為什麼modbus asc||很少人在用的原因,主要是傳輸時間和檢查碼較弱的關係,以我家的溫控器來說如果要讀取pv(modbus rtu)的資料我會下
01 03 00 8A 00 01 A5 E0(8個byte)
01 站號8A是PV的暫存器位置 A5 E0 是CRC
如果用O_81的資料格式和38400的鮑率去算的話
一個BYTE的傳輸時間就要0.28645ms,所以傳完整串命令就要2.2916ms
再來是modbus asc||的格式
3A 30 31 30 33 30 30 38 41 30 30 30 31 37 31 0D 0A (17個byte)
以上3A是header 37 31 是LRC 0D 0A是delimiter
如果用O_81的資料格式和38400的鮑率去算的話
一個BYTE的傳輸時間就要0.28645ms,所以傳完整串命令就要4.8697ms
從以上結果得知做一樣的事情rtu要來的比asc||有效率的多,再者asc||的checksum是用累加去算出來的,這種檢驗法無法分辨出位元組是否有交換,假設命令的其中一段為00 01,如果今天傳輸過程中發生錯誤變成01 00,使用crc checksum可以抓到這個錯誤,lrc則無法抓到,因為加總後數值還是一樣,所以可以的話盡量還是用rtu較好
回到你的問題,我比較有疑問的是為什麼你的設備(儀表)在rtu模式時要等10ms?這從mcu端的角度來看是不合理的,因為mcu閒置時永遠是在等你的plc,只要你的plc丟出第一個start bit mcu就會去收你丟過來的資料,至於要收幾個byte,收完後要如何解析資料,這就是韌體設計師要做的事情(讀modbus手冊),所以要等10ms,這真的無法理解。
還有一個比較常遇到的問題就是master端(plc 人機)中有個參數”delay time”的設定,很多master的預設是0ms,而你資料量大後,或著是遇到比較慢的儀器,就須要去調整這個參數,以上是我的一些意見,也不一定完全正確,有機會再來研究研究,感謝!
