Modbus簡(jiǎn)介Modbus是一種串行通信協(xié)議,由于其公開、免費(fèi)、易于部署和維護(hù)的優(yōu)點(diǎn),被廣泛應(yīng)用于工業(yè)電子領(lǐng)域,并且已經(jīng)成為工業(yè)領(lǐng)域通信協(xié)議的業(yè)界標(biāo)準(zhǔn)。

(圖片源自網(wǎng)絡(luò),侵刪)
以往我們?cè)谑褂肕odbus協(xié)議進(jìn)行應(yīng)用開發(fā)時(shí),通常需要自己實(shí)現(xiàn)諸多的Modbus功能碼,或者移植開源的第三方庫,這個(gè)過程往往比較費(fèi)時(shí)費(fèi)力,耽誤項(xiàng)目的進(jìn)展。基于EsDA設(shè)計(jì)的Modbus主機(jī)功能節(jié)點(diǎn),可以通過簡(jiǎn)單的拖拽、連線方式,快速實(shí)現(xiàn)讀取Modbus從機(jī)數(shù)據(jù),搭配其他功能節(jié)點(diǎn),可以快速搭建出一個(gè)集數(shù)據(jù)采集上報(bào)、遠(yuǎn)程控制于一體的物聯(lián)網(wǎng)應(yīng)用。
Modbus相關(guān)節(jié)點(diǎn)介紹目前和Modbus主機(jī)相關(guān)的節(jié)點(diǎn)主要有6個(gè),分別是modbus_master_rtu、modbus_master_in、modbus_master_dynamic_in、modbus_master_out、modbus_parse_in和modbus_parse_out節(jié)點(diǎn)。其中,modbus_master_rtu節(jié)點(diǎn)屬于配置節(jié)點(diǎn),用于配置Modbus通信設(shè)備的參數(shù)信息,該節(jié)點(diǎn)提供了Modbus RTU和Modbus TCP的主機(jī)通信服務(wù);modbus_master_in和modbus_master_dynamic_in是Modbus的輸入節(jié)點(diǎn),主要用于讀取從機(jī)設(shè)備的線圈量和寄存器數(shù)據(jù);modbus_master_out是數(shù)據(jù)的輸出節(jié)點(diǎn),用于寫線圈量和寄存器;modbus_parse_in和modbus_parse_out是擴(kuò)展的Modbus功能節(jié)點(diǎn),一般用來對(duì)輸入/輸出數(shù)據(jù)進(jìn)行處理。
modbus_master_rtu節(jié)點(diǎn)Modbus主機(jī)的配置節(jié)點(diǎn),用于配置與Modbus主機(jī)通信的從設(shè)備的通信參數(shù),提供了Modbus RTU和Modbus TCP主機(jī)功能。該節(jié)點(diǎn)需要和對(duì)應(yīng)的功能節(jié)點(diǎn)搭配使用,不會(huì)在畫布中顯示。
1. 屬性
modbus_master_rtu節(jié)點(diǎn)包含了RTU和TCP兩種模式的配置,不同模式需要設(shè)置的屬性不同。
1.1RTU模式配置屬性

- 名稱 :節(jié)點(diǎn)名稱,用于索引查找本節(jié)點(diǎn);
- 顯示名稱:用于畫布上顯示的名稱;
- 傳輸類型:用于設(shè)置鏈路層的傳輸模式(rtu/tcp可選);
- 串口設(shè)備名:用于與從設(shè)備通信的串口設(shè)備名;
- 波特率:串口波特率參數(shù);
- 數(shù)據(jù)位:串口數(shù)據(jù)位參數(shù);
- 校驗(yàn)位:串口奇偶校驗(yàn)位參數(shù);
- 停止位:串口停止位參數(shù);
- 響應(yīng)時(shí)間:從機(jī)應(yīng)答超時(shí)時(shí)間,單位ms;
- 最大請(qǐng)求數(shù)量:用于配置Modbus主機(jī)讀寫請(qǐng)求的最大數(shù)量。
1.2 TCP模式配置屬性

- IP地址:從機(jī)設(shè)備(服務(wù)器)的IP地址;
- 端口:從機(jī)設(shè)備的端口號(hào);
- 響應(yīng)時(shí)間:從機(jī)應(yīng)答超時(shí)時(shí)間,單位ms;
- 最大請(qǐng)求數(shù)量:用于配置Modbus主機(jī)讀寫請(qǐng)求的最大數(shù)量。
2. 使用方法
該節(jié)點(diǎn)的使用依附于modbus_master_in、modbus_master_dynamic_in以及modbus_master_out等節(jié)點(diǎn),使用時(shí)選擇對(duì)應(yīng)的通信模式,根據(jù)從機(jī)信息配置相應(yīng)的配置屬性即可。
modbus_master_in節(jié)點(diǎn)modbus_master_in是Modbus的輸入節(jié)點(diǎn),主要用于讀取從機(jī)設(shè)備的線圈量和寄存器數(shù)據(jù)并輸出給消費(fèi)者節(jié)點(diǎn)。其輸出是原始數(shù)據(jù)的緩沖區(qū),后續(xù)可連接modbus_parse_in節(jié)點(diǎn)對(duì)數(shù)據(jù)進(jìn)行處理。
1. 屬性

- 主機(jī)參數(shù)配置:輸入節(jié)點(diǎn)依賴modbus_master_rtu節(jié)點(diǎn),選擇對(duì)應(yīng)的配置節(jié)點(diǎn)即可;
- 讀取模式:選擇節(jié)點(diǎn)的觸發(fā)方式,可選擇以用戶設(shè)定的輸出周期定時(shí)向消費(fèi)者節(jié)點(diǎn)輸出數(shù)據(jù);也可根據(jù)輸入的信息(來自push節(jié)點(diǎn))進(jìn)行數(shù)據(jù)讀取并輸出;
- 從機(jī)ID:從機(jī)設(shè)備的ID地址;
- 輸出周期:用于周期讀取模式設(shè)置讀取和輸出的周期;
- 寄存器地址:需要被讀取的寄存器/線圈的起始地址;
- 讀取數(shù)量:需要讀取的寄存器/線圈數(shù)量;
- 寄存器類型:用于選擇讀取目標(biāo)的類型,可選線圈量、離散量、輸入寄存器、保持寄存器。
2. 輸入
該節(jié)點(diǎn)屬于pump類型節(jié)點(diǎn),一般不需要數(shù)據(jù)輸入,但可以使用push節(jié)點(diǎn)來實(shí)現(xiàn)數(shù)據(jù)輸入。- slaveID:從機(jī)設(shè)備的ID地址;
- address:需要被讀取的寄存器/線圈的起始地址;
- reg_num:需要讀取的寄存器/線圈數(shù)量;
- reg_type:需要讀取的寄存器/線圈類型。
3. 輸出
- slaveID:從機(jī)設(shè)備的ID地址,通常用于后級(jí)節(jié)點(diǎn)區(qū)分設(shè)備;
- address:讀取的寄存器起始地址;
- reg_num:讀取到的寄存器/線圈數(shù)量;
- payload:緩沖區(qū),存儲(chǔ)讀取到的數(shù)據(jù);
- payloadLength:讀取到的數(shù)據(jù)長(zhǎng)度;
- poll_result:指明讀取是否成功;
4.使用方法
這里我們借助ZC1平臺(tái)和一個(gè)RS485型的溫濕度變送器來說明節(jié)點(diǎn)的使用方法。按照下圖所示分別給ZC1開發(fā)板和傳感器供電,并連接好RS485的A、B兩線。
4.1 添加節(jié)點(diǎn)
添加modbus_master_in、modbus_parse_in、fscript以及l(fā)og節(jié)點(diǎn)到畫布上并連接節(jié)點(diǎn)。

4.2 配置節(jié)點(diǎn)
雙擊modbus_master_in節(jié)點(diǎn)打開屬性配置面板。

選擇“添加新的modbus_master_rtu節(jié)點(diǎn)”,進(jìn)入配置主機(jī)參數(shù)面板。

可以看到已經(jīng)創(chuàng)建了一個(gè)新的主機(jī)參數(shù)配置,同時(shí)配置讀取模式為周期讀取,從機(jī)ID、輸出周期、寄存器地址等參數(shù)按照實(shí)際設(shè)備進(jìn)行配置 。然后雙擊modbus_parse_in節(jié)點(diǎn)打開屬性配置面板,對(duì)modbus_parse_in進(jìn)行轉(zhuǎn)換規(guī)則設(shè)置。
這里我們選擇多地址轉(zhuǎn)換模式,分別對(duì)溫度和濕度兩個(gè)寄存器進(jìn)行轉(zhuǎn)換,因此轉(zhuǎn)換數(shù)量設(shè)置為2,轉(zhuǎn)換類型設(shè)置為16位。接下來設(shè)置modbus_parse_in節(jié)點(diǎn)的后級(jí)節(jié)點(diǎn)fscript,主要是對(duì)后續(xù)的打印信息進(jìn)行格式化。由于modbus_parse_in節(jié)點(diǎn)的輸出payload是array型對(duì)象,這里我們可以通過fscript的內(nèi)置方法array_get來獲取數(shù)據(jù)。fscript的內(nèi)容如下:
a=msg.payload
msg.payload = "溫度:"+array_get(a,0)/10 +",濕度:"+array_get(a,1)/10
4.3 下載驗(yàn)證
連接好硬件,通過下載接口下載流圖進(jìn)行驗(yàn)證。

?
modbus_master_dynamic_in節(jié)點(diǎn)modbus_master_dynamic_in同樣是Modbus的輸入節(jié)點(diǎn),與modbus_master_in的區(qū)別是:modbus_master_dynamic_in節(jié)點(diǎn)是filter類型的節(jié)點(diǎn),其根據(jù)前級(jí)節(jié)點(diǎn)輸入的信息向從機(jī)設(shè)備讀取數(shù)據(jù),并輸出給消費(fèi)者節(jié)點(diǎn)。
1. 屬性

- 傳輸類型:用于設(shè)置鏈路層的傳輸模式(rtu/tcp可選);
- 主機(jī)參數(shù)配置:輸入節(jié)點(diǎn)依賴modbus_master_rtu節(jié)點(diǎn),和使用modbus_master_in節(jié)點(diǎn)時(shí)一樣,選擇對(duì)應(yīng)的配置節(jié)點(diǎn)即可;
2. 輸入
- slaveID:從機(jī)設(shè)備的ID地址;
- address:待讀取的寄存器的起始地址;
- reg_num:待讀取的寄存器的數(shù)量;
- reg_type:待讀取寄存器的類型。
3. 輸出
- slaveID:從機(jī)設(shè)備的ID地址;
- address:待讀取的寄存器的起始地址;
- reg_num:讀取到的寄存器的數(shù)量;
- payload:數(shù)據(jù)緩沖區(qū),存儲(chǔ)讀取到的數(shù)據(jù);
- payloadLength:讀取到的數(shù)據(jù)長(zhǎng)度;
- poll_result:指明讀取是否成功。
3. 使用方式
modbus_master_dynamic_in節(jié)點(diǎn)一般是由fscript節(jié)點(diǎn)指明需要讀取的從機(jī)設(shè)備的信息,節(jié)點(diǎn)本身只需要?jiǎng)?chuàng)建并配置相應(yīng)的主機(jī)即可。對(duì)于modbus_master_dynamic_in的輸出緩沖區(qū),我們同樣使用modbus_parse_in節(jié)點(diǎn)進(jìn)行處理。在fscript中指明讀取內(nèi)容時(shí),只需提供以下信息:
msg.slaveID = 1
msg.address = 0
msg.reg_num = 2
msg.reg_type = 4
modbus_master_out節(jié)點(diǎn)modbus_master_out節(jié)點(diǎn)是Modbus的輸出節(jié)點(diǎn),用于寫線圈量和寄存器。
1. 屬性

- 主機(jī)參數(shù)配置:輸出節(jié)點(diǎn)依賴modbus_master_rtu節(jié)點(diǎn),選擇對(duì)應(yīng)的配置節(jié)點(diǎn)即可;
- 從機(jī)ID:待寫入的從機(jī)設(shè)備ID地址;
- 錯(cuò)誤重試次數(shù):發(fā)送錯(cuò)誤情況下的重試次數(shù);
- 寄存器類型:待寫入寄存器的類型。
2. 輸入
- slaveID:從機(jī)設(shè)備的ID地址,如果輸入中包含此參數(shù),則忽略屬性中的地址;
- address:待寫入的寄存器的起始地址;
- reg_num:待寫入的寄存器的數(shù)量;
- payload:寫入緩沖區(qū),存儲(chǔ)待寫入的數(shù)據(jù),一般由modbus_parse_out輸入;
- payloadLength:寫入緩沖區(qū)的字節(jié)長(zhǎng)度。
3. 輸出
modbus_master_out節(jié)點(diǎn)是sink類型的節(jié)點(diǎn),一般沒有輸出。
4. 使用方法

modbus_master_out節(jié)點(diǎn)通常由modbus_parse_out節(jié)點(diǎn)進(jìn)行輸入。使用時(shí)和modbus_master_in一樣創(chuàng)建一個(gè)主機(jī)配置,指明待寫入設(shè)備的ID地址以及寄存器類型即可。
其中,modbus_parse_out節(jié)點(diǎn)的輸入一般來自fscript節(jié)點(diǎn),我們可以在fscript中借助array對(duì)象完成數(shù)據(jù)輸入。比如我們需要將從機(jī)地址為1的設(shè)備的寄存器0設(shè)置為2,我們只需在fscript中添加如下內(nèi)容:
var a = array_create();
array_isert(a,0,2);
msg.payload = a;
msg.slaveID = 1;
msg.address = 0;
modbus_parse_in節(jié)點(diǎn)
Modbus輸入數(shù)據(jù)的轉(zhuǎn)換節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)一般用于接收Modbus輸入節(jié)點(diǎn)的原始數(shù)據(jù),將其轉(zhuǎn)換成單個(gè)value或者array對(duì)象,以便于后續(xù)處理。
1. 屬性

- 數(shù)據(jù)轉(zhuǎn)換模式:可以選擇對(duì)輸入中的單個(gè)地址的數(shù)據(jù)進(jìn)行轉(zhuǎn)換,也可以選擇對(duì)指定數(shù)量的寄存器、或者對(duì)輸入的所有地址進(jìn)行轉(zhuǎn)換;
- 轉(zhuǎn)換地址:選擇單個(gè)寄存器轉(zhuǎn)換時(shí),填寫需要轉(zhuǎn)換的寄存器地址;
- 數(shù)據(jù)轉(zhuǎn)換起始地址:選擇轉(zhuǎn)換多個(gè)寄存器時(shí),指明轉(zhuǎn)換的起始地址;
- 轉(zhuǎn)換數(shù)量:選擇轉(zhuǎn)換多個(gè)寄存器時(shí),指明轉(zhuǎn)換數(shù)量;
- 數(shù)據(jù)轉(zhuǎn)換類型:選擇按照哪種類型對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換;
- 大小端選擇:大小端系統(tǒng)選擇;
- 數(shù)據(jù)主題:數(shù)據(jù)地址的主題(可選)。
2. 輸入
modbus_parse_in的輸入來自modbus_master_in或modbus_master_dynamic_in節(jié)點(diǎn)。- slaveID:從機(jī)設(shè)備的ID地址;
- address:上一級(jí)節(jié)點(diǎn)讀取的寄存器起始地址;
- reg_num:上一級(jí)節(jié)點(diǎn)讀取到的寄存器數(shù)量;
- payload:數(shù)據(jù)緩沖區(qū)指針,存儲(chǔ)讀取到的數(shù)據(jù);
- payloadLength:讀取到的字節(jié)數(shù)據(jù)長(zhǎng)度;
- poll_result:上一級(jí)節(jié)點(diǎn)讀取數(shù)據(jù)是否成功。
3. 輸出
- slaveID:從機(jī)設(shè)備ID地址;
- address:轉(zhuǎn)換單個(gè)寄存器時(shí),指示數(shù)據(jù)的寄存器地址;在轉(zhuǎn)換多個(gè)寄存器模式下,指示起始的寄存器的地址;
- payloadType:指示緩沖區(qū)的類型是value還是array;
- payload:轉(zhuǎn)換后的數(shù)據(jù)緩沖區(qū),在轉(zhuǎn)換單個(gè)寄存器時(shí),payload的類型是value,可直接讀??;當(dāng)轉(zhuǎn)換多個(gè)寄存器時(shí),payload是個(gè)array對(duì)象,可以使用rbuffer進(jìn)行讀取;
- topic:屬性中設(shè)定的數(shù)據(jù)主題;
- poll_result:上一級(jí)節(jié)點(diǎn)讀取數(shù)據(jù)是否成功。
4. 使用方法
modbus_parse_in節(jié)點(diǎn)使用時(shí)需要指定轉(zhuǎn)換的模式、待轉(zhuǎn)換的寄存器地址和數(shù)量、待轉(zhuǎn)換寄存器的數(shù)據(jù)類型以及系統(tǒng)的大小端模式。

當(dāng)轉(zhuǎn)換多個(gè)寄存器時(shí),payload是個(gè)array對(duì)象,可以在fscript中通過array對(duì)象的方法進(jìn)行處理。
其中,array對(duì)象的使用方式如下:
a = msg.payload
print("濕度 " + array_get(a, 0))
print("溫度 " + array_get(a, 1))
modbus_parse_out節(jié)點(diǎn)modbus_parse_out節(jié)點(diǎn)通常用于將fscript節(jié)點(diǎn)輸出的value或array對(duì)象轉(zhuǎn)換成Modbus標(biāo)準(zhǔn)的十六進(jìn)制格式,后續(xù)可以將相應(yīng)的數(shù)據(jù)指針傳入Modbus的輸出節(jié)點(diǎn)modbus_master_out進(jìn)行使用。
1. 屬性

- 寄存器起始地址:指明需要modbus_master_out寫入的寄存器的起始地址,如果節(jié)點(diǎn)的輸入不包含msg.address,則使用此屬性指向的地址;
- 大小端:系統(tǒng)大小端模式選擇;
- 主題:如果設(shè)定了主題,則節(jié)點(diǎn)只處理屬于自己的主題消息。
2. 輸入
- slaveID:從機(jī)設(shè)備ID地址;
- address:待寫入的寄存器起始地址;
- payload:待寫入的值,可以是value類型,也可以是array對(duì)象;
- topic:輸入的數(shù)據(jù)主題,如果本節(jié)點(diǎn)設(shè)置了主題屬性,則只有輸入的主題與節(jié)點(diǎn)的主題屬性匹配,節(jié)點(diǎn)才會(huì)對(duì)下一節(jié)點(diǎn)輸出;
3. 輸出
- slaveID:從機(jī)設(shè)備ID地址;
- address:待寫入的寄存器的起始地址;
- reg_num:待寫入的寄存器的數(shù)量;
- payload:轉(zhuǎn)換后的Modbus標(biāo)準(zhǔn)十六進(jìn)制數(shù)組緩沖區(qū)指針;
- payloadLength:數(shù)組緩沖區(qū)的字節(jié)長(zhǎng)度。
4. 使用方法
modbus_parse_out節(jié)點(diǎn)的前級(jí)通常是fscript,使用時(shí)在fscript中指明待寫入的從機(jī)設(shè)備ID地址、并傳遞構(gòu)建好的array對(duì)象即可。其后級(jí)節(jié)點(diǎn)一般是modbus_master_out節(jié)點(diǎn),通過modbus_master_out節(jié)點(diǎn)將數(shù)據(jù)寫入目標(biāo)設(shè)備。

a = array_create();
array_insert(a, 0, u16(1))
array_insert(a, 1, u16(2))
array_insert(a, 2, u16(3))
output.payload = a;
output.slaveID = 10;
output.address = 0;
關(guān)聯(lián)產(chǎn)品
技術(shù)交流群長(zhǎng)按識(shí)別如下二維碼可加入“EsDA嵌入式系統(tǒng)設(shè)計(jì)自動(dòng)化交流群”,與志同道合的朋友交流,并有專業(yè)技術(shù)人員為您答疑解惑,如有問題可以咨詢小致微信:zlgmcu-888。
?【版權(quán)聲明】本文為ZLG開發(fā)者社區(qū)用戶原創(chuàng)內(nèi)容,未經(jīng)授權(quán)不得轉(zhuǎn)載。歡迎更多用戶到社區(qū)交流互動(dòng)、創(chuàng)作博文,一經(jīng)采用,可獲得百元京東E卡。


-
致遠(yuǎn)電子
+關(guān)注
關(guān)注
13文章
422瀏覽量
32548
原文標(biāo)題:【EsDA應(yīng)用】Modbus應(yīng)用詳解
文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
汽車網(wǎng)絡(luò)ESD防護(hù)利器:ESD772詳解
4 個(gè)核心方向,吃透 PXB 協(xié)議轉(zhuǎn)換器 Modbus 協(xié)議錯(cuò)誤機(jī)制 #Modbus #工業(yè)通信 #協(xié)議轉(zhuǎn)換
ESD靜電保護(hù)二極管原理及應(yīng)用詳解
ESDA5WY車規(guī)級(jí)單向ESD保護(hù)器件技術(shù)解析與應(yīng)用指南
ESD751與ESD761:24V單通道ESD保護(hù)二極管技術(shù)解析
開腦洞,Modbus為什么叫Modbus?
CCLinkie轉(zhuǎn)Modbus TCP網(wǎng)關(guān)在印染設(shè)備的應(yīng)用
新一代PLC控制軟件平臺(tái)EsDA-AWStudio
EthernetIP轉(zhuǎn)Modbus網(wǎng)關(guān):水利革新神器
Profinet轉(zhuǎn)RS485-Modbus RTU通信案例詳解
ESD技術(shù)文檔:芯片級(jí)ESD與系統(tǒng)級(jí)ESD測(cè)試標(biāo)準(zhǔn)介紹和差異分析
【EsDA應(yīng)用】Modbus應(yīng)用詳解
評(píng)論