目前和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),用于寫(xiě)線圈量和寄存器;modbus_parse_in和modbus_parse_out是擴(kuò)展的Modbus功能節(jié)點(diǎn),一般用來(lái)對(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ì)在畫(huà)布中顯示。
1. 屬性
modbus_master_rtu節(jié)點(diǎn)包含了RTU和TCP兩種模式的配置,不同模式需要設(shè)置的屬性不同。
1.1RTU模式配置屬性
- 名稱(chēng) :節(jié)點(diǎn)名稱(chēng),用于索引查找本節(jié)點(diǎn);
- 顯示名稱(chēng):用于畫(huà)布上顯示的名稱(chēng);
- 傳輸類(lèi)型:用于設(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ī)讀寫(xiě)請(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ī)讀寫(xiě)請(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)依賴(lài)modbus_master_rtu節(jié)點(diǎn),選擇對(duì)應(yīng)的配置節(jié)點(diǎn)即可;
- 讀取模式:選擇節(jié)點(diǎn)的觸發(fā)方式,可選擇以用戶(hù)設(shè)定的輸出周期定時(shí)向消費(fèi)者節(jié)點(diǎn)輸出數(shù)據(jù);也可根據(jù)輸入的信息(來(lái)自push節(jié)點(diǎn))進(jìn)行數(shù)據(jù)讀取并輸出;
- 從機(jī)ID:從機(jī)設(shè)備的ID地址;
- 輸出周期:用于周期讀取模式設(shè)置讀取和輸出的周期;
- 寄存器地址:需要被讀取的寄存器/線圈的起始地址;
- 讀取數(shù)量:需要讀取的寄存器/線圈數(shù)量;
- 寄存器類(lèi)型:用于選擇讀取目標(biāo)的類(lèi)型,可選線圈量、離散量、輸入寄存器、保持寄存器。
2. 輸入
該節(jié)點(diǎn)屬于pump類(lèi)型節(jié)點(diǎn),一般不需要數(shù)據(jù)輸入,但可以使用push節(jié)點(diǎn)來(lái)實(shí)現(xiàn)數(shù)據(jù)輸入。- slaveID:從機(jī)設(shè)備的ID地址;
- address:需要被讀取的寄存器/線圈的起始地址;
- reg_num:需要讀取的寄存器/線圈數(shù)量;
- reg_type:需要讀取的寄存器/線圈類(lèi)型。
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型的溫濕度變送器來(lái)說(shuō)明節(jié)點(diǎn)的使用方法。按照下圖所示分別給ZC1開(kāi)發(fā)板和傳感器供電,并連接好RS485的A、B兩線。4.1 添加節(jié)點(diǎn)
添加modbus_master_in、modbus_parse_in、fscript以及l(fā)og節(jié)點(diǎn)到畫(huà)布上并連接節(jié)點(diǎn)。
4.2 配置節(jié)點(diǎn)
雙擊modbus_master_in節(jié)點(diǎn)打開(kāi)屬性配置面板。
選擇“添加新的modbus_master_rtu節(jié)點(diǎn)”,進(jìn)入配置主機(jī)參數(shù)面板。
根據(jù)實(shí)際情況配置完相應(yīng)的參數(shù)后,點(diǎn)擊添加,回到modbus_master_in節(jié)點(diǎn)配置界面。可以看到已經(jīng)創(chuàng)建了一個(gè)新的主機(jī)參數(shù)配置,同時(shí)配置讀取模式為周期讀取,從機(jī)ID、輸出周期、寄存器地址等參數(shù)按照實(shí)際設(shè)備進(jìn)行配置 。然后雙擊modbus_parse_in節(jié)點(diǎn)打開(kāi)屬性配置面板,對(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)換類(lèi)型設(shè)置為16位。接下來(lái)設(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ì)象,這里我們可以通過(guò)fscript的內(nèi)置方法array_get來(lái)獲取數(shù)據(jù)。fscript的內(nèi)容如下:
a=msg.payload
msg.payload = "溫度:"+array_get(a,0)/10 +",濕度:"+array_get(a,1)/10
4.3 下載驗(yàn)證
連接好硬件,通過(guò)下載接口下載流圖進(jìn)行驗(yàn)證。
通過(guò)調(diào)試面板可以看到讀回的溫濕度數(shù)據(jù)。 ?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類(lèi)型的節(jié)點(diǎn),其根據(jù)前級(jí)節(jié)點(diǎn)輸入的信息向從機(jī)設(shè)備讀取數(shù)據(jù),并輸出給消費(fèi)者節(jié)點(diǎn)。
1. 屬性
- 傳輸類(lèi)型:用于設(shè)置鏈路層的傳輸模式(rtu/tcp可選);
- 主機(jī)參數(shù)配置:輸入節(jié)點(diǎn)依賴(lài)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:待讀取寄存器的類(lèi)型。
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),用于寫(xiě)線圈量和寄存器。
1. 屬性
- 主機(jī)參數(shù)配置:輸出節(jié)點(diǎn)依賴(lài)modbus_master_rtu節(jié)點(diǎn),選擇對(duì)應(yīng)的配置節(jié)點(diǎn)即可;
- 從機(jī)ID:待寫(xiě)入的從機(jī)設(shè)備ID地址;
- 錯(cuò)誤重試次數(shù):發(fā)送錯(cuò)誤情況下的重試次數(shù);
- 寄存器類(lèi)型:待寫(xiě)入寄存器的類(lèi)型。
2. 輸入
- slaveID:從機(jī)設(shè)備的ID地址,如果輸入中包含此參數(shù),則忽略屬性中的地址;
- address:待寫(xiě)入的寄存器的起始地址;
- reg_num:待寫(xiě)入的寄存器的數(shù)量;
- payload:寫(xiě)入緩沖區(qū),存儲(chǔ)待寫(xiě)入的數(shù)據(jù),一般由modbus_parse_out輸入;
- payloadLength:寫(xiě)入緩沖區(qū)的字節(jié)長(zhǎng)度。
3. 輸出
modbus_master_out節(jié)點(diǎn)是sink類(lèi)型的節(jié)點(diǎn),一般沒(méi)有輸出。
4. 使用方法
modbus_master_out節(jié)點(diǎn)通常由modbus_parse_out節(jié)點(diǎn)進(jìn)行輸入。使用時(shí)和modbus_master_in一樣創(chuàng)建一個(gè)主機(jī)配置,指明待寫(xiě)入設(shè)備的ID地址以及寄存器類(lèi)型即可。
其中,modbus_parse_out節(jié)點(diǎn)的輸入一般來(lái)自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í),填寫(xiě)需要轉(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)換類(lèi)型:選擇按照哪種類(lèi)型對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換;
- 大小端選擇:大小端系統(tǒng)選擇;
- 數(shù)據(jù)主題:數(shù)據(jù)地址的主題(可選)。
2. 輸入
modbus_parse_in的輸入來(lái)自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ū)的類(lèi)型是value還是array;
- payload:轉(zhuǎn)換后的數(shù)據(jù)緩沖區(qū),在轉(zhuǎn)換單個(gè)寄存器時(shí),payload的類(lèi)型是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ù)類(lèi)型以及系統(tǒng)的大小端模式。
作為filter類(lèi)型節(jié)點(diǎn),modbus_parse_in通常是從modbus_master_in節(jié)點(diǎn)獲取輸入。其輸出有兩種類(lèi)型,在轉(zhuǎn)換單個(gè)寄存器時(shí),payload的類(lèi)型是value,可以直接讀取。當(dāng)轉(zhuǎn)換多個(gè)寄存器時(shí),payload是個(gè)array對(duì)象,可以在fscript中通過(guò)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寫(xiě)入的寄存器的起始地址,如果節(jié)點(diǎn)的輸入不包含msg.address,則使用此屬性指向的地址;
- 大小端:系統(tǒng)大小端模式選擇;
- 主題:如果設(shè)定了主題,則節(jié)點(diǎn)只處理屬于自己的主題消息。
2. 輸入
- slaveID:從機(jī)設(shè)備ID地址;
- address:待寫(xiě)入的寄存器起始地址;
- payload:待寫(xiě)入的值,可以是value類(lèi)型,也可以是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:待寫(xiě)入的寄存器的起始地址;
- reg_num:待寫(xiě)入的寄存器的數(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中指明待寫(xiě)入的從機(jī)設(shè)備ID地址、并傳遞構(gòu)建好的array對(duì)象即可。其后級(jí)節(jié)點(diǎn)一般是modbus_master_out節(jié)點(diǎn),通過(guò)modbus_master_out節(jié)點(diǎn)將數(shù)據(jù)寫(xiě)入目標(biāo)設(shè)備。其中,在fscript中構(gòu)建array對(duì)象的方法如下:
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;
-
MODBUS
+關(guān)注
關(guān)注
28文章
1821瀏覽量
77316 -
現(xiàn)場(chǎng)總線
+關(guān)注
關(guān)注
3文章
521瀏覽量
38640 -
ESDA
+關(guān)注
關(guān)注
0文章
28瀏覽量
7530 -
串行通信協(xié)議
+關(guān)注
關(guān)注
0文章
23瀏覽量
7692 -
致遠(yuǎn)電子
+關(guān)注
關(guān)注
13文章
409瀏覽量
31426
原文標(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)先 登錄
相關(guān)推薦
評(píng)論