ModBus通信協(xié)議
1 1. 主從模式
RS-485上的軟件層協(xié)議ModBus主要依賴于主從模式。主從模式是指在半雙工通訊方式上,2個或者2個以上的設備組成的通訊系統(tǒng)中:
(1) 至少且只有一個主機,其他的都是從機
(2) 不管任何時候,從機都不能主動向主機發(fā)送數(shù)據(jù)
(3) 主機具有訪問從機的權(quán)限,從機不可以主動訪問從機,任何一次數(shù)據(jù)交換,都要由主機發(fā)起
(4)不管是主機還是從機,系統(tǒng)一旦上電,都要把自己置于接收狀態(tài)(或者稱為監(jiān)聽狀態(tài))
主從機的數(shù)據(jù)交互,需要:
a. 主機將自己轉(zhuǎn)為發(fā)送狀態(tài)
b. 主機按照預先約定的格式發(fā)出尋址數(shù)據(jù)幀。
所謂的約定,可是主機開發(fā)者和從機開發(fā)者約定好的規(guī)約,好,例如主機要通過從機控制接在從機的電機,主機要啟動電機就往從機發(fā)0x1,停止電機就往從機發(fā)0x2。這就是一種預
先約定好的格式,但是這樣做,互換性、兼容性、通用性差,例如其他公司是約定發(fā)送0x03讓電機轉(zhuǎn)動,發(fā)0x04讓電機停止。導致不同廠家的主機、從機不能相互通訊。用戶需要的,就像網(wǎng)絡操作,只要接入有網(wǎng)的網(wǎng)線那么計算機都能上網(wǎng)。
所以說,我們需要一種大家都共同遵循的規(guī)則(可以是ModBus,也可以是TCP/IP等上層協(xié)議),這種大家認可,共同遵循的軟件層協(xié)議。軟件層協(xié)議主要是解決如何解析傳輸?shù)臄?shù)據(jù),即傳輸?shù)哪康幕蛘吒涌煽康膫鬏敂?shù)據(jù)。
半雙工通訊中,都是主機尋找從機,主機的目的無非有: 主機要發(fā)數(shù)據(jù)給從機,或者主機要從從機中獲取數(shù)據(jù)。
c. 主機恢復自身的接收狀態(tài)
主機等待自身所尋址的從機作回應,也就是說從機接收到主機的尋址命令、數(shù)據(jù)后一定要回應主機,不然主機會認為從機通訊異常。回應數(shù)據(jù)包也是要按照ModBus協(xié)議規(guī)約(其實不局限ModBus,像TCP/IP也需要回應是吧!~)
2. ModBus通訊協(xié)議
通俗點來講,ModBus規(guī)約了起停電機,主機要分別發(fā)送什么命令給從機。ModBus規(guī)定主從機之間數(shù)據(jù)的交互,需要遵循什么樣的格式,如何保證數(shù)據(jù)在傳輸過程中不發(fā)生沖突。只要都遵循這個協(xié)議,那么不同廠家的主從機就可以共用了。
ModBus一般是工作在一主多從的場景,還是這個圖:
主機和從機之間的連線不一定是非要485來作為載體,也可以是IIC,SPI。因為ModBus是軟件層的協(xié)議,它既可以規(guī)約485硬件接線方式,也可以規(guī)約其他硬件接線方式。很多資料會寫”基于RS-485的ModBus通訊協(xié)議”,意思是底層的0、1數(shù)據(jù)是通過RS-485方式去傳輸?shù)模?、1的意義則是通過ModBus去解析的。強調(diào),硬件協(xié)議可以確保數(shù)據(jù)得以傳輸出去,軟件協(xié)議保障數(shù)據(jù)的有序傳輸,數(shù)據(jù)不會發(fā)生沖突。
ModBus規(guī)定:
(1) 主從模式
有的協(xié)議規(guī)定是多主模式,意思是系統(tǒng)中的設備都是主機,它們并沒有主從之分,任何時刻,誰想發(fā)送數(shù)據(jù)都可以往總線上發(fā)送,例如網(wǎng)絡通信、CAN總線通訊,自然它們自有一套防止數(shù)據(jù)沖突機制,485由于不具備沖突檢測的硬件機制,所以它必須遵循主從模式。主從模式的原則是,整個系統(tǒng)只能有一個主機,每一個從機都必須有一個唯一的地址
(2) 從機的地址是作為每個從機的唯一標識。地址取值是0-247,0號地址表示廣播地址,廣播地址由主機保留,當主機向0號地址發(fā)數(shù)據(jù)包的時候,每一個從機設備都會收到數(shù)據(jù)包。也就是說,當主機發(fā)出的尋址幀的地址是0的時候,所有從機都要執(zhí)行主機要求的動作。按理說,從機收到主機的尋址幀之后,是要做出應答包的,但是現(xiàn)在是0號地址,也就是要回的話每臺從機都要回,那么肯定會造成RS-485通訊線上的數(shù)據(jù)混亂,因此所有從機在主機發(fā)0號地址時候不予返回數(shù)據(jù)包應答。
從機的地址有兩個作用
a. 主機向目標從機發(fā)尋址幀時其地址部分為從機地址,這樣主機才可以檢索到目標從機
b. 對于主機的目標從機,當收到主機發(fā)來的非0地址時,要做出數(shù)據(jù)包應答,假設從機要返回數(shù)據(jù)包給主機,自然是要把數(shù)據(jù)包放到RS-485總線上,因為每臺從機,其物理連線是在一起的,所以這就會造成其他從機認為數(shù)據(jù)是要發(fā)送給它的現(xiàn)象,所以在從機回復主機的數(shù)據(jù)包中,加上從機自身的地址,那么其他從機讀取到這個地址值跟自己的地址不相同,就不會去響應了。
(3) ModBus數(shù)據(jù)包的格式
主機要尋找某臺從機,需要發(fā)出相應格式的信息,這就需要談到ModBus的兩種傳輸方式:
a. RTU傳輸方式
RTU實際上也成為二進制方式。假設主機要發(fā)送0x23,那就是發(fā)送0010 0011,按照485通訊協(xié)議,先發(fā)高位,即1100 0100。前后分別加上起始、停止位: “起始位 1100 0100 停止位”共10位數(shù)據(jù)
b. ASC傳輸方式
同樣要發(fā)送0x23,它是十六進制數(shù),會將其拆成十位的’2’和個位的’3’,將它們的asc碼依次發(fā)出去,’0’的asc碼是0x32,’3’的asc是0x33,轉(zhuǎn)為二進制為0011 0010和0011 0011,同樣要加上停止、起始位,共20位數(shù)據(jù)
很明顯,asc傳輸方式比較低,但是由于它傳輸?shù)氖莂sc碼,所以可以利用一些串口終端將其數(shù)值打印出來。
特別提醒,RS-485硬件協(xié)議決定,對于每一個字節(jié)數(shù)據(jù)的傳輸是先發(fā)高位,再發(fā)地位,所以假設數(shù)組u8型數(shù)組revArr[2]存放著接收到的數(shù)據(jù),那么接收端解析數(shù)據(jù)應該是u16型data = revArr[0] * 256 + revArr[1]。