最近做智能檢測的項目,設(shè)備、串口之間的通訊比較多,一會兒485,一會兒modbus RTU,有點暈了,這里重新梳理一下RS485、485通訊協(xié)議、ModBus通訊協(xié)議、Modbus Rtu通訊這幾個點的聯(lián)系和區(qū)別。 先說RS485吧,RS485是一個工業(yè)常用的物理接口,是物理層的硬件設(shè)備(串口)。是在電腦設(shè)置上看得到的(windows系統(tǒng)-我的電腦-設(shè)備管理器)設(shè)備。 Modbus是一種國際標(biāo)準(zhǔn)的通訊協(xié)議,一般用于不同廠商設(shè)備之間進(jìn)行數(shù)據(jù)交換,是應(yīng)用層的軟件協(xié)議,不能自己單獨存在,必須要依賴于硬件設(shè)備作為實現(xiàn)平臺。不同的硬件具有不同的電氣特性和連接方式,比如RS232、RS485。可以把Modbus比作英語,RS232比作印度人,RS485比作美國人,印度人之間講英語時,理解為基于RS232的modbus通信,美國人之間講英語時,理解為基于RS485的modbus通信。 兩臺設(shè)備之間通過Modbus協(xié)議傳輸數(shù)據(jù),需要硬件接口,于是就有了RS232\RS422\RS485等,其中RS485傳輸距離遠(yuǎn),成為現(xiàn)在最主流的工業(yè)現(xiàn)場硬件接口。 Modbus按照一般維度分為Modbus Rtu、Modbus ASCII、Modbus TCP三種模式。 從接口類型維度來說,Modbus Rtu和ASCII基于串行鏈路,屬于串行通訊口(serial port),Mobus tcp基于TCP/IP協(xié)議,屬于網(wǎng)絡(luò)(以太網(wǎng))通訊口。 協(xié)議分為硬件協(xié)議和軟件協(xié)議。而通訊協(xié)議屬于軟件協(xié)議,它包含報頭包圍的格式,MODBUS是應(yīng)用層的通訊協(xié)議,主要用于傳送和接收文件包的格式。而RS232,RS485是物理層的串行接口,它可以支持幾十種通訊協(xié)議,MODBUS只是其中的一種。 Modbus的特征:(1) 主從協(xié)議方式(master/slave) (2) 通訊規(guī)約:初始結(jié)構(gòu)-地址碼-功能碼-數(shù)據(jù)區(qū)-校驗碼-結(jié)束結(jié)構(gòu) (3) modbus協(xié)議本質(zhì)是對寄存器讀寫,通過指定寄存器地址,來交換數(shù)據(jù) 寫了一大堆概念性的東西,現(xiàn)在在面對實際問題,以下是供應(yīng)商給出來的一句話: 大概需求是我需要通過485串口,給供應(yīng)商的設(shè)備發(fā)送一個速度信號,這個速度信號的格式要求,是485格式,波特率、奇偶校驗、8個數(shù)據(jù)位這些就不用再說了,了解下串口基礎(chǔ)就知道了,一般都是N81,即“無奇偶校驗、8個數(shù)據(jù)位、1個停止位”,問題的關(guān)鍵在于這個“485格式”。RS485做為一個標(biāo)準(zhǔn)串口通訊,是有自己的標(biāo)準(zhǔn)通信格式的。 可以看到,跟modbus是有些相似的,除了自己的格式外,也可以選擇遵循Modbus通訊規(guī)約,更多的是使用modbus RTU模式通訊格式。 上圖是modbus rtu的通訊規(guī)約,接下里的任務(wù),是搞懂485通訊規(guī)約和modbus rtu通訊規(guī)約的區(qū)別,兩種格式到底區(qū)別在哪里。為什么供應(yīng)商選擇用485格式,而不是使用的更廣泛的modbus rtu?這兩者之間的優(yōu)缺點又分別是什么? 補(bǔ)充1: 所謂rs485通訊協(xié)議,屬于硬件層協(xié)議。硬件層管什么呢?決定數(shù)據(jù)如何傳輸,比如2進(jìn)制的數(shù)只有0和1,那么如果1個字節(jié)現(xiàn)在是'0110 0011',現(xiàn)在這個字節(jié)里的0怎么傳輸和表達(dá),1怎么傳輸和表達(dá),比如rs232就規(guī)定了電壓x伏就表示0,y伏表示1。再比如要選擇多少條線來傳輸,選擇什么材質(zhì)的線來傳輸,這就是硬件層協(xié)議規(guī)定的事情。 同樣RS485通訊協(xié)議也是個硬件層協(xié)議,實際上是關(guān)于電平、電壓的約定。搞軟件的不一定看得懂,特別是應(yīng)用層軟件。 比如這樣 但是我弄清楚了什么叫所謂的RS485通訊協(xié)議,是硬件的、關(guān)于電平、電壓的,一個規(guī)約,跟應(yīng)用軟件沒半毛錢關(guān)系。 補(bǔ)充2(2020.12.14): 起始我糾結(jié)了半天,就是被串口通訊和modbus rtu搞暈了,一周之后回過頭來看,就顯得有點笨,但是還是硬著頭皮補(bǔ)充完整吧。 串口通訊和Modbus rtu的有哪些區(qū)別,又有哪些共同點呢? 從概念上來說,都是串口,rtu起始就是基于串口的,所以共同點就是,rtu和串口通訊,都要設(shè)置波特率、數(shù)據(jù)位、停止位、奇偶校驗等
不同點是,串口通訊需要串口對象,而modbus需要從機(jī)地址(設(shè)備地址),如果是廣播模式就需要廣播地址,一般是0。
下面貼一段經(jīng)典的,串口程序,第一段是打開串口,第二段是往串口發(fā)送數(shù)據(jù)的
入?yún)⑹谴诿Q和波特率。返回值是實體對象。
入?yún)⑹谴趯ο髮嶓w,即第一段打開串口代碼的返回值。用的是outPutStream,輸出流。 而modbus rtu是怎么實現(xiàn)串口打開和發(fā)送呢,起始modbus只是基于串口,本質(zhì)上還是主從機(jī)之間的通訊。
跟SerialPort實體類似,ModbusMaster是個主機(jī)對象,當(dāng)你將其init()的時候,在modbus角度你開啟了主機(jī),其實就是打開了串口。 modbus的發(fā)送不用贅述,基本就是遵循modbus的格式,功能碼、寄存器地址、寄存器數(shù)量、數(shù)據(jù)位等等。例如16功能碼,代表寫入多個連續(xù)保持寄存器,支持廣播模式。 這是16碼的格式: |
|