Modbus通信協(xié)議簡介
Modbus協(xié)議,首先從字面理解它包括Mod和Bus兩部分,首先它是一種bus,即總線協(xié)議,和I2C、SPI類似,總線就意味著有主機(jī),有從機(jī),這些設(shè)備在同一條總線上。
Modbus支持單主機(jī),多個(gè)從機(jī),最多支持247個(gè)從機(jī)設(shè)備。關(guān)于Mod,因?yàn)檫@種協(xié)議最早被用在PLC控制器中,準(zhǔn)確的說是Modicon公司的PLC控制器,這也是Mod-Bus名稱的由來。
Modbus在7層OSI參考模型中屬于第七層應(yīng)用層,數(shù)據(jù)鏈路層有兩種:基于標(biāo)準(zhǔn)串口協(xié)議和TCP協(xié)議,物理層可使用3線232、2線485、4線422,或光纖、網(wǎng)線、無線等多種傳輸介質(zhì)。
Modbus協(xié)議是一種請求/應(yīng)答方式的交互過程,主機(jī)主動發(fā)起通訊請求,從機(jī)響應(yīng)主機(jī)的請求,從機(jī)在沒有收到主機(jī)的請求時(shí),不會主動發(fā)送數(shù)據(jù),從機(jī)之間不會進(jìn)行通訊。
Modbus通信協(xié)議特點(diǎn)
(1) 標(biāo)準(zhǔn)、開放,用戶可以免費(fèi)、放心地使用Modbus協(xié)議,不需要交納許可證費(fèi),也不會侵犯知識產(chǎn)權(quán)。
(2) Modbus可以支持多種電氣接口,如RS-232、RS-485等,還可以在各種介質(zhì)上傳送,如雙絞線、光纖、無線等。
(3) Modbus的幀格式簡單、緊湊,通俗易懂。用戶使用容易,廠商開發(fā)簡單。
Modbus4種數(shù)據(jù)類型
Modbus協(xié)議規(guī)定,進(jìn)行讀寫操作的數(shù)據(jù)類型,按照讀寫屬性和類型可分為以下4種:
1.離散量輸入(Discretes Input):1位,只讀;
2.線圈(Coils):1位,讀寫;
3.輸入寄存器(Input Registers ):16位,只讀;
4.保持寄存器(Holding Registers):16位,讀寫。
Modbus協(xié)議版本
Modbus協(xié)議目前存在用于串口、以太網(wǎng)以及其他支持互聯(lián)網(wǎng)協(xié)議的網(wǎng)絡(luò)的版本。
大多數(shù)Modbus設(shè)備通信通過串口485物理層進(jìn)行。
對于串行連接,存在兩個(gè)變種,它們在數(shù)值數(shù)據(jù)表示不同和協(xié)議細(xì)節(jié)上略有不同。Modbus RTU是一種緊湊的,采用二進(jìn)制表示數(shù)據(jù)的方式,Modbus ASCII是一種人類可讀的,冗長的表示方式。這兩個(gè)變種都使用串行通信(serial communication)方式。RTU格式后續(xù)的命令/數(shù)據(jù)帶有循環(huán)冗余校驗(yàn)的校驗(yàn)和,而ASCII格式采用縱向冗余校驗(yàn)的校驗(yàn)和。被配置為RTU變種的節(jié)點(diǎn)不會和設(shè)置為ASCII變種的節(jié)點(diǎn)通信,反之亦然。
對于通過TCP/IP(例如以太網(wǎng))的連接,存在多個(gè)Modbus/TCP變種,這種方式不需要校驗(yàn)和計(jì)算。
對于所有的這三種通信協(xié)議在數(shù)據(jù)模型和功能調(diào)用上都是相同的,只有封裝方式是不同的。
Modbus有一個(gè)擴(kuò)展版本ModbusPlus(Modbus+或者M(jìn)B+),不過此協(xié)議是Modicon專有的,和Modbus不同。它需要一個(gè)專門的協(xié)處理器來處理類似HDLC的高速令牌旋轉(zhuǎn)。它使用1Mbit/s的雙絞線,并且每個(gè)節(jié)點(diǎn)都有轉(zhuǎn)換隔離裝置,是一種采用轉(zhuǎn)換/邊緣觸發(fā)而不是電壓/水平觸發(fā)的裝置。連接Modbus Plus到計(jì)算機(jī)需要特別的接口,通常是支持ISA(SA85),PCI或者PMCIA總線的板卡。
所以當(dāng)我們提及Modbus協(xié)議時(shí),要確定是哪種模式,不同的模式之間區(qū)別還是很大的。
Modbus數(shù)據(jù)幀格式
首先我們要知道一幀正常的MODBUS數(shù)據(jù)幀包含的內(nèi)容有:地址域 + 功能碼 + 數(shù)據(jù) + 差錯(cuò)校驗(yàn),再者無論是上述哪種協(xié)議版本,Modbus幀格式都是一樣的:
主要包括:
1.地址域:即主站要訪問的從站地址,其范圍0~240;
2.功能碼:即主站想要對從站進(jìn)行何種操作;
3.?dāng)?shù)據(jù):如果主站的請求是讀數(shù)據(jù),那么該“數(shù)據(jù)”要包含的信息有:從哪里開始讀數(shù)據(jù) + 讀多少數(shù)據(jù)。如果主站的請求是向從站寫數(shù)據(jù),那么該“數(shù)據(jù)”要包含的信息有:從哪里開始寫數(shù)據(jù) + 寫多少個(gè)字節(jié)數(shù)據(jù) + 要寫的具體數(shù)據(jù);
4.差錯(cuò)校驗(yàn):為了保證數(shù)據(jù)傳輸?shù)恼_性,Modbus協(xié)議會在數(shù)據(jù)幀最后面加上兩個(gè)字節(jié)的差錯(cuò)校驗(yàn)。