最近做智能檢測的項目,,設(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)準的通訊協(xié)議,一般用于不同廠商設(shè)備之間進行數(shù)據(jù)交換,,是應(yīng)用層的軟件協(xié)議,,不能自己單獨存在,必須要依賴于硬件設(shè)備作為實現(xiàn)平臺,。不同的硬件具有不同的電氣特性和連接方式,,比如RS232、RS485,??梢园袽odbus比作英語,RS232比作印度人,,RS485比作美國人,,印度人之間講英語時,理解為基于RS232的modbus通信,,美國人之間講英語時,,理解為基于RS485的modbus通信。 兩臺設(shè)備之間通過Modbus協(xié)議傳輸數(shù)據(jù),,需要硬件接口,,于是就有了RS232\RS422\RS485等,其中RS485傳輸距離遠,,成為現(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)準串口通訊,是有自己的標(biāo)準通信格式的,。 可以看到,,跟modbus是有些相似的,除了自己的格式外,,也可以選擇遵循Modbus通訊規(guī)約,,更多的是使用modbus RTU模式通訊格式,。 上圖是modbus rtu的通訊規(guī)約,接下里的任務(wù),,是搞懂485通訊規(guī)約和modbus rtu通訊規(guī)約的區(qū)別,,兩種格式到底區(qū)別在哪里。為什么供應(yīng)商選擇用485格式,,而不是使用的更廣泛的modbus rtu,?這兩者之間的優(yōu)缺點又分別是什么? 補充1: 所謂rs485通訊協(xié)議,,屬于硬件層協(xié)議,。硬件層管什么呢?決定數(shù)據(jù)如何傳輸,,比如2進制的數(shù)只有0和1,,那么如果1個字節(jié)現(xiàn)在是'0110 0011',現(xiàn)在這個字節(jié)里的0怎么傳輸和表達,,1怎么傳輸和表達,,比如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)系,。 補充2(2020.12.14): 起始我糾結(jié)了半天,就是被串口通訊和modbus rtu搞暈了,,一周之后回過頭來看,,就顯得有點笨,但是還是硬著頭皮補充完整吧,。 串口通訊和Modbus rtu的有哪些區(qū)別,,又有哪些共同點呢,? 從概念上來說,都是串口,,rtu起始就是基于串口的,,所以共同點就是,rtu和串口通訊,,都要設(shè)置波特率、數(shù)據(jù)位,、停止位,、奇偶校驗等
不同點是,串口通訊需要串口對象,,而modbus需要從機地址(設(shè)備地址),,如果是廣播模式就需要廣播地址,一般是0,。
下面貼一段經(jīng)典的,,串口程序,第一段是打開串口,,第二段是往串口發(fā)送數(shù)據(jù)的
入?yún)⑹谴诿Q和波特率。返回值是實體對象,。
入?yún)⑹谴趯ο髮嶓w,,即第一段打開串口代碼的返回值。用的是outPutStream,,輸出流,。 而modbus rtu是怎么實現(xiàn)串口打開和發(fā)送呢,起始modbus只是基于串口,,本質(zhì)上還是主從機之間的通訊,。
跟SerialPort實體類似,ModbusMaster是個主機對象,,當(dāng)你將其init()的時候,,在modbus角度你開啟了主機,其實就是打開了串口,。 modbus的發(fā)送不用贅述,,基本就是遵循modbus的格式,功能碼,、寄存器地址,、寄存器數(shù)量,、數(shù)據(jù)位等等。例如16功能碼,,代表寫入多個連續(xù)保持寄存器,,支持廣播模式。 這是16碼的格式: |
|