Modbus是一種串行通信協(xié)議,是Modicon公司(現(xiàn)在的施耐德電氣 Schneider Electric)于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表。Modbus已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn)(De facto),并且現(xiàn)在是工業(yè)電子設(shè)備之間常用的連接方式。
Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備之間可以通信。Modbus協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)求訪問(wèn)其它設(shè)備的過(guò)程,如果回應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共格式。
Modbus 是一個(gè)請(qǐng)求/應(yīng)答協(xié)議。也叫做Slave和Master與Server和Client。
協(xié)議分類
ModBus協(xié)議是應(yīng)用層報(bào)文傳輸協(xié)議(OSI模型第7層),它定義了一個(gè)與通信層無(wú)關(guān)的協(xié)議數(shù)據(jù)單元(PDU),即PDU=功能碼+數(shù)據(jù)域。
ModBus協(xié)議能夠應(yīng)用在不同類型的總線或網(wǎng)絡(luò)。對(duì)應(yīng)不同的總線或網(wǎng)絡(luò),Modbus協(xié)議引入一些附加域映射成應(yīng)用數(shù)據(jù)單元(ADU),即ADU=附加域+PDU。
Modbus有下列三種通信方式:
1.以太網(wǎng),對(duì)應(yīng)的通信模式是MODBUS TCP。
2.異步串行傳輸(各種介質(zhì)如有線RS-232-/422/485/;光纖、無(wú)線等),對(duì)應(yīng)的通信模式是MODBUS RTU或MODBUS ASCII。
3.高速令牌傳遞網(wǎng)絡(luò),對(duì)應(yīng)的通信模式是Modbus PLUS。
Modbus協(xié)議是一個(gè)master/slave架構(gòu)的協(xié)議。有一個(gè)節(jié)點(diǎn)是master節(jié)點(diǎn),其他使用Modbus協(xié)議參與通信的節(jié)點(diǎn)是slave節(jié)點(diǎn)。每一個(gè)slave設(shè)備都有一個(gè)唯一的地址。在串行和MB+網(wǎng)絡(luò)中,只有被指定為主節(jié)點(diǎn)的節(jié)點(diǎn)可以啟動(dòng)一個(gè)命令(在以太網(wǎng)上,任何一個(gè)設(shè)備都能發(fā)送一個(gè)Modbus命令,但是通常也只有一個(gè)主節(jié)點(diǎn)設(shè)備啟動(dòng)指令)。
一個(gè)ModBus命令包含了打算執(zhí)行的設(shè)備的Modbus地址。所有設(shè)備都會(huì)收到命令,但只有指定位置的設(shè)備會(huì)執(zhí)行及回應(yīng)指令(地址0例外,指定地址0的指令是廣播指令,所有收到指令的設(shè)備都會(huì)運(yùn)行,不過(guò)不回應(yīng)指令)。所有的Modbus命令包含了檢查碼,以確定到達(dá)的命令沒(méi)有被破壞?;镜?/span>ModBus命令能指令一個(gè)RTU改變它的寄存器的某個(gè)值,控制或者讀取一個(gè)I/O端口,以及指揮設(shè)備回送一個(gè)或者多個(gè)其寄存器中的數(shù)據(jù)。
有許多modems和網(wǎng)關(guān)支持Modbus協(xié)議,因?yàn)?/span>Modbus協(xié)議很簡(jiǎn)單而且容易復(fù)制。它們當(dāng)中一些為這個(gè)協(xié)議特別設(shè)計(jì)的。有使用有線、無(wú)線通信甚至短消息和GPRS的不同實(shí)現(xiàn)。不過(guò)設(shè)計(jì)者需要克服一些包括高延遲和時(shí)序的問(wèn)題。
在串行通信中,用“波特率”來(lái)描述數(shù)據(jù)的傳輸速率。國(guó)際上規(guī)定了一個(gè)標(biāo)準(zhǔn)波特率系列:110、300、600、1200、1800、2400、4800、9600、14.4Kbps、19.2Kbps、28.8Kbps、33.6Kbps、56Kbps。例如:9600bps,指每秒傳送9600位,包含字符的數(shù)位和其它必須的數(shù)位,如起始位、停止位和奇偶校驗(yàn)位等。
在自動(dòng)化領(lǐng)域我們常用RTU模式,RTU 模式中每個(gè)字節(jié)的格式:
編碼系統(tǒng):8 位二進(jìn)制,十六進(jìn)制 0-9,A-F
數(shù)據(jù)位: 1 起始位
8 位數(shù)據(jù),低位先送
奇/偶校驗(yàn)時(shí) 1 位;無(wú)奇偶校驗(yàn)時(shí) 0 位
帶校驗(yàn)時(shí) 1 位停止位;無(wú)校驗(yàn)時(shí) 2 位停止位
錯(cuò)誤校驗(yàn)區(qū):循環(huán)冗余校驗(yàn)(CRC)
從站地址設(shè)置:信息地址包括 2 個(gè)字符(ASCII)或 8 位(RTU),有效的從機(jī)設(shè)備地址范圍 0-247(十進(jìn)制)。
功能碼設(shè)置:信息幀功能代碼包括字符(ASCII)或 8 位(RTU)。有效碼范圍 1-225(十進(jìn)制);
數(shù)據(jù)區(qū)的內(nèi)容:數(shù)據(jù)區(qū)有 2 個(gè) 16 進(jìn)制的數(shù)據(jù)位,數(shù)據(jù)范圍為 00-FF(16 進(jìn)制),根據(jù)網(wǎng)絡(luò)串行傳輸?shù)姆绞?,?shù)據(jù)區(qū)可由一對(duì) ASCII 字符組成或由一個(gè) RTU 字符組成。
RTU 方式讀取整數(shù)據(jù)的例子:
解析一下:主機(jī)發(fā)送指令,訪問(wèn)從站地址為1,使用功能碼03(讀保持寄存器),起始地址高8位、低8位:表示想讀取的模擬量的起始地址(起始地址為0)。比如例子中的起始地址為38,十進(jìn)制為:56。寄存器數(shù)量高8位、低8位:表示從起始地址開(kāi)始讀多少個(gè)模擬量。例子中為1個(gè)模擬量。注意,在返回的信息中一個(gè)模擬量需要返回兩個(gè)字節(jié)。錯(cuò)誤校驗(yàn)為CRC校驗(yàn)。
從站應(yīng)答:設(shè)備地址和命令號(hào)和上面的相同。返回的字節(jié)數(shù):表示數(shù)據(jù)的字節(jié)個(gè)數(shù),也就是數(shù)據(jù)1,2...n中的n的值。例子中返回了1個(gè)模擬量的數(shù)據(jù),因?yàn)橐粋€(gè)模擬量需要2個(gè)字節(jié)所以共2個(gè)字節(jié)。數(shù)據(jù)高低字節(jié):41和24代表返回的1個(gè)模擬量的值,即十進(jìn)制的16676。錯(cuò)誤校驗(yàn)為CRC校驗(yàn)。