modbus協(xié)議可以說是工業(yè)自動化領(lǐng)域應(yīng)用最為廣泛的通訊協(xié)議,因為他的開放性、可擴充性和標準化使它成為一個通用工業(yè)標準。有了它,不同廠商的產(chǎn)品可以簡單可靠的接入網(wǎng)絡(luò),實現(xiàn)系統(tǒng)的集中監(jiān)控,分散控制功能。
目前modbus規(guī)約主要使用的是ascii, rtu, tcp等,并沒有規(guī)定物理層。目前modbus常用的接口形式主要有rs-232c,rs485,rs422,也有使用rj45接口的,modbus的ascii, rtu協(xié)議則在此基礎(chǔ)上規(guī)定了消息、數(shù)據(jù)的結(jié)構(gòu)、命令和應(yīng)答的方式。modbus數(shù)據(jù)通信采用master/slave方式(主/從),即master端發(fā)出數(shù)據(jù)請求消息,slave端接收到正確消息后就可以發(fā)送數(shù)據(jù)到master端以響應(yīng)請求;master端也可以直接發(fā)消息修改slave端的數(shù)據(jù),實現(xiàn)雙向讀寫。
在串行通信中,用“波特率”來描述數(shù)據(jù)的傳輸速率。國際上規(guī)定了一個標準波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4kbps、19.2kbps、28.8kbps、33.6kbps、56kbps。例如:9600bps,指每秒傳送9600位,包含字符的數(shù)位和其它必須的數(shù)位,如起始位、停止位和奇偶校驗位等。
在自動化領(lǐng)域我們常用rtu模式,rtu 模式中每個字節(jié)的格式:
編碼系統(tǒng):8 位二進制,十六進制 0-9,a-f
數(shù)據(jù)位: 1 起始位
8 位數(shù)據(jù),低位先送
奇/偶校驗時 1 位;無奇偶校驗時 0 位
帶校驗時 1 位停止位;無校驗時 2 位停止位
錯誤校驗區(qū):循環(huán)冗余校驗(crc)
從站地址設(shè)置:信息地址包括 2 個字符(ascii)或 8 位(rtu),有效的從機設(shè)備地址范圍 0-247(十進制)。
功能碼設(shè)置:信息幀功能代碼包括字符(ascii)或 8 位(rtu)。有效碼范圍 1-225(十進制);
數(shù)據(jù)區(qū)的內(nèi)容:數(shù)據(jù)區(qū)有 2 個 16 進制的數(shù)據(jù)位,數(shù)據(jù)范圍為 00-ff(16 進制),根據(jù)網(wǎng)絡(luò)串行傳輸?shù)姆绞?,?shù)據(jù)區(qū)可由一對 ascii 字符組成或由一個 rtu 字符組成。
rtu方式的消息幀:
modbus的功能碼:
modbus 功能碼與數(shù)據(jù)類型對應(yīng)表:
rtu 方式讀取整數(shù)據(jù)的例子:
解析一下:主機發(fā)送指令,訪問從站地址為1,使用功能碼03(讀保持寄存器),起始地址高8位、低8位:表示想讀取的模擬量的起始地址(起始地址為0)。比如例子中的起始地址為38,十進制為:56。寄存器數(shù)量高8位、低8位:表示從起始地址開始讀多少個模擬量。例子中為1個模擬量。注意,在返回的信息中一個模擬量需要返回兩個字節(jié)。錯誤校驗為crc校驗。
從站應(yīng)答:設(shè)備地址和命令號和上面的相同。返回的字節(jié)數(shù):表示數(shù)據(jù)的字節(jié)個數(shù),也就是數(shù)據(jù)1,2...n中的n的值。例子中返回了1個模擬量的數(shù)據(jù),因為一個模擬量需要2個字節(jié)所以共2個字節(jié)。數(shù)據(jù)高低字節(jié):41和24代表返回的1個模擬量的值,即十進制的16676。錯誤校驗為crc校驗。