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

Modbus主機(jī)的配置節(jié)點,用于配置與Modbus主機(jī)通信的從設(shè)備的通信參數(shù),提供了Modbus RTU和Modbus TCP主機(jī)功能。該節(jié)點需要和對應(yīng)的功能節(jié)點搭配使用,不會在畫布中顯示。
1. 屬性
modbus_master_rtu節(jié)點包含了RTU和TCP兩種模式的配置,不同模式需要設(shè)置的屬性不同。
1.1RTU模式配置屬性

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

- IP地址:從機(jī)設(shè)備(服務(wù)器)的IP地址;
- 端口:從機(jī)設(shè)備的端口號;
- 響應(yīng)時間:從機(jī)應(yīng)答超時時間,單位ms;
- 最大請求數(shù)量:用于配置Modbus主機(jī)讀寫請求的最大數(shù)量。
2. 使用方法
該節(jié)點的使用依附于modbus_master_in、modbus_master_dynamic_in以及modbus_master_out等節(jié)點,使用時選擇對應(yīng)的通信模式,根據(jù)從機(jī)信息配置相應(yīng)的配置屬性即可。

modbus_master_in是Modbus的輸入節(jié)點,主要用于讀取從機(jī)設(shè)備的線圈量和寄存器數(shù)據(jù)并輸出給消費者節(jié)點。其輸出是原始數(shù)據(jù)的緩沖區(qū),后續(xù)可連接modbus_parse_in節(jié)點對數(shù)據(jù)進(jìn)行處理。
1. 屬性

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


a=msg.payload
msg.payload = "溫度:"+array_get(a,0)/10 +",濕度:"+array_get(a,1)/10
4.3 下載驗證
連接好硬件,通過下載接口下載流圖進(jìn)行驗證。


modbus_master_dynamic_in同樣是Modbus的輸入節(jié)點,與modbus_master_in的區(qū)別是:modbus_master_dynamic_in節(jié)點是filter類型的節(jié)點,其根據(jù)前級節(jié)點輸入的信息向從機(jī)設(shè)備讀取數(shù)據(jù),并輸出給消費者節(jié)點。
1. 屬性
- 傳輸類型:用于設(shè)置鏈路層的傳輸模式(rtu/tcp可選);
- 主機(jī)參數(shù)配置:輸入節(jié)點依賴modbus_master_rtu節(jié)點,和使用modbus_master_in節(jié)點時一樣,選擇對應(yīng)的配置節(jié)點即可;
2. 輸入
- slaveID:從機(jī)設(shè)備的ID地址;
- address:待讀取的寄存器的起始地址;
- reg_num:待讀取的寄存器的數(shù)量;
- reg_type:待讀取寄存器的類型。
3. 輸出
- slaveID:從機(jī)設(shè)備的ID地址;
- address:待讀取的寄存器的起始地址;
- reg_num:讀取到的寄存器的數(shù)量;
- payload:數(shù)據(jù)緩沖區(qū),存儲讀取到的數(shù)據(jù);
- payloadLength:讀取到的數(shù)據(jù)長度;
- poll_result:指明讀取是否成功。
3. 使用方式

在fscript中指明讀取內(nèi)容時,只需提供以下信息:
msg.slaveID = 1
msg.address = 0
msg.reg_num = 2
msg.reg_type = 4

modbus_master_out節(jié)點是Modbus的輸出節(jié)點,用于寫線圈量和寄存器。
1. 屬性

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

modbus_master_out節(jié)點通常由modbus_parse_out節(jié)點進(jìn)行輸入。使用時和modbus_master_in一樣創(chuàng)建一個主機(jī)配置,指明待寫入設(shè)備的ID地址以及寄存器類型即可。
其中,modbus_parse_out節(jié)點的輸入一般來自fscript節(jié)點,我們可以在fscript中借助array對象完成數(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é)點
Modbus輸入數(shù)據(jù)的轉(zhuǎn)換節(jié)點,這個節(jié)點一般用于接收Modbus輸入節(jié)點的原始數(shù)據(jù),將其轉(zhuǎn)換成單個value或者array對象,以便于后續(xù)處理。
1. 屬性

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


a = msg.payload
print("濕度 " + array_get(a, 0))
print("溫度 " + array_get(a, 1))

modbus_parse_out節(jié)點通常用于將fscript節(jié)點輸出的value或array對象轉(zhuǎn)換成Modbus標(biāo)準(zhǔn)的十六進(jìn)制格式,后續(xù)可以將相應(yīng)的數(shù)據(jù)指針傳入Modbus的輸出節(jié)點modbus_master_out進(jìn)行使用。
1. 屬性

- 寄存器起始地址:指明需要modbus_master_out寫入的寄存器的起始地址,如果節(jié)點的輸入不包含msg.address,則使用此屬性指向的地址;
- 大小端:系統(tǒng)大小端模式選擇;
- 主題:如果設(shè)定了主題,則節(jié)點只處理屬于自己的主題消息。
2. 輸入
- slaveID:從機(jī)設(shè)備ID地址;
- address:待寫入的寄存器起始地址;
- payload:待寫入的值,可以是value類型,也可以是array對象;
- topic:輸入的數(shù)據(jù)主題,如果本節(jié)點設(shè)置了主題屬性,則只有輸入的主題與節(jié)點的主題屬性匹配,節(jié)點才會對下一節(jié)點輸出;
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é)長度。
4. 使用方法
modbus_parse_out節(jié)點的前級通常是fscript,使用時在fscript中指明待寫入的從機(jī)設(shè)備ID地址、并傳遞構(gòu)建好的array對象即可。其后級節(jié)點一般是modbus_master_out節(jié)點,通過modbus_master_out節(jié)點將數(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;



【版權(quán)聲明】本文為ZLG開發(fā)者社區(qū)用戶原創(chuàng)內(nèi)容,未經(jīng)授權(quán)不得轉(zhuǎn)載。歡迎更多用戶到社區(qū)交流互動、創(chuàng)作博文,一經(jīng)采用,可獲得百元京東E卡。


-
致遠(yuǎn)電子
+關(guān)注
關(guān)注
13文章
411瀏覽量
31908
原文標(biāo)題:【EsDA應(yīng)用】Modbus應(yīng)用詳解
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄

Profinet轉(zhuǎn)RS485-Modbus RTU通信案例詳解

ESD技術(shù)文檔:芯片級ESD與系統(tǒng)級ESD測試標(biāo)準(zhǔn)介紹和差異分析



Modbus網(wǎng)關(guān)如何實現(xiàn)Modbus RTU與Modbus TCP協(xié)議的數(shù)據(jù)采集?
ST NPI 新上架產(chǎn)品【ESDA5WY】Datasheet
串口屏Modbus通訊協(xié)議詳解
Modbus RTU協(xié)議與Modbus TCP/IP協(xié)議的區(qū)別

EsDA,一站式嵌入式軟件

高效數(shù)據(jù)傳輸Modbus RTU轉(zhuǎn)Modbus TCP網(wǎng)關(guān)

Modbus轉(zhuǎn)Profinet協(xié)議轉(zhuǎn)化網(wǎng)關(guān)功能與配置詳解

評論