目前和Modbus主機相關(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的主機通信服務(wù);modbus_master_in和modbus_master_dynamic_in是Modbus的輸入節(jié)點,主要用于讀取從機設(shè)備的線圈量和寄存器數(shù)據(jù);modbus_master_out是數(shù)據(jù)的輸出節(jié)點,用于寫線圈量和寄存器;modbus_parse_in和modbus_parse_out是擴展的Modbus功能節(jié)點,一般用來對輸入/輸出數(shù)據(jù)進行處理。
modbus_master_rtu節(jié)點Modbus主機的配置節(jié)點,用于配置與Modbus主機通信的從設(shè)備的通信參數(shù),提供了Modbus RTU和Modbus TCP主機功能。該節(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)時間:從機應(yīng)答超時時間,單位ms;
- 最大請求數(shù)量:用于配置Modbus主機讀寫請求的最大數(shù)量。
1.2 TCP模式配置屬性
- IP地址:從機設(shè)備(服務(wù)器)的IP地址;
- 端口:從機設(shè)備的端口號;
- 響應(yīng)時間:從機應(yīng)答超時時間,單位ms;
- 最大請求數(shù)量:用于配置Modbus主機讀寫請求的最大數(shù)量。
2. 使用方法
該節(jié)點的使用依附于modbus_master_in、modbus_master_dynamic_in以及modbus_master_out等節(jié)點,使用時選擇對應(yīng)的通信模式,根據(jù)從機信息配置相應(yīng)的配置屬性即可。
modbus_master_in節(jié)點modbus_master_in是Modbus的輸入節(jié)點,主要用于讀取從機設(shè)備的線圈量和寄存器數(shù)據(jù)并輸出給消費者節(jié)點。其輸出是原始數(shù)據(jù)的緩沖區(qū),后續(xù)可連接modbus_parse_in節(jié)點對數(shù)據(jù)進行處理。
1. 屬性
- 主機參數(shù)配置:輸入節(jié)點依賴modbus_master_rtu節(jié)點,選擇對應(yīng)的配置節(jié)點即可;
- 讀取模式:選擇節(jié)點的觸發(fā)方式,可選擇以用戶設(shè)定的輸出周期定時向消費者節(jié)點輸出數(shù)據(jù);也可根據(jù)輸入的信息(來自push節(jié)點)進行數(shù)據(jù)讀取并輸出;
- 從機ID:從機設(shè)備的ID地址;
- 輸出周期:用于周期讀取模式設(shè)置讀取和輸出的周期;
- 寄存器地址:需要被讀取的寄存器/線圈的起始地址;
- 讀取數(shù)量:需要讀取的寄存器/線圈數(shù)量;
- 寄存器類型:用于選擇讀取目標的類型,可選線圈量、離散量、輸入寄存器、保持寄存器。
2. 輸入
該節(jié)點屬于pump類型節(jié)點,一般不需要數(shù)據(jù)輸入,但可以使用push節(jié)點來實現(xiàn)數(shù)據(jù)輸入。- slaveID:從機設(shè)備的ID地址;
- address:需要被讀取的寄存器/線圈的起始地址;
- reg_num:需要讀取的寄存器/線圈數(shù)量;
- reg_type:需要讀取的寄存器/線圈類型。
3. 輸出
- slaveID:從機設(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é)點”,進入配置主機參數(shù)面板。
根據(jù)實際情況配置完相應(yīng)的參數(shù)后,點擊添加,回到modbus_master_in節(jié)點配置界面。可以看到已經(jīng)創(chuàng)建了一個新的主機參數(shù)配置,同時配置讀取模式為周期讀取,從機ID、輸出周期、寄存器地址等參數(shù)按照實際設(shè)備進行配置 。然后雙擊modbus_parse_in節(jié)點打開屬性配置面板,對modbus_parse_in進行轉(zhuǎn)換規(guī)則設(shè)置。這里我們選擇多地址轉(zhuǎn)換模式,分別對溫度和濕度兩個寄存器進行轉(zhuǎn)換,因此轉(zhuǎn)換數(shù)量設(shè)置為2,轉(zhuǎn)換類型設(shè)置為16位。接下來設(shè)置modbus_parse_in節(jié)點的后級節(jié)點fscript,主要是對后續(xù)的打印信息進行格式化。由于modbus_parse_in節(jié)點的輸出payload是array型對象,這里我們可以通過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 下載驗證
連接好硬件,通過下載接口下載流圖進行驗證。
通過調(diào)試面板可以看到讀回的溫濕度數(shù)據(jù)。 ?modbus_master_dynamic_in節(jié)點
modbus_master_dynamic_in同樣是Modbus的輸入節(jié)點,與modbus_master_in的區(qū)別是:modbus_master_dynamic_in節(jié)點是filter類型的節(jié)點,其根據(jù)前級節(jié)點輸入的信息向從機設(shè)備讀取數(shù)據(jù),并輸出給消費者節(jié)點。
1. 屬性
- 傳輸類型:用于設(shè)置鏈路層的傳輸模式(rtu/tcp可選);
- 主機參數(shù)配置:輸入節(jié)點依賴modbus_master_rtu節(jié)點,和使用modbus_master_in節(jié)點時一樣,選擇對應(yīng)的配置節(jié)點即可;
2. 輸入
- slaveID:從機設(shè)備的ID地址;
- address:待讀取的寄存器的起始地址;
- reg_num:待讀取的寄存器的數(shù)量;
- reg_type:待讀取寄存器的類型。
3. 輸出
- slaveID:從機設(shè)備的ID地址;
- address:待讀取的寄存器的起始地址;
- reg_num:讀取到的寄存器的數(shù)量;
- payload:數(shù)據(jù)緩沖區(qū),存儲讀取到的數(shù)據(jù);
- payloadLength:讀取到的數(shù)據(jù)長度;
- poll_result:指明讀取是否成功。
3. 使用方式
modbus_master_dynamic_in節(jié)點一般是由fscript節(jié)點指明需要讀取的從機設(shè)備的信息,節(jié)點本身只需要創(chuàng)建并配置相應(yīng)的主機即可。對于modbus_master_dynamic_in的輸出緩沖區(qū),我們同樣使用modbus_parse_in節(jié)點進行處理。在fscript中指明讀取內(nèi)容時,只需提供以下信息:
msg.slaveID = 1
msg.address = 0
msg.reg_num = 2
msg.reg_type = 4
modbus_master_out節(jié)點modbus_master_out節(jié)點是Modbus的輸出節(jié)點,用于寫線圈量和寄存器。
1. 屬性
- 主機參數(shù)配置:輸出節(jié)點依賴modbus_master_rtu節(jié)點,選擇對應(yīng)的配置節(jié)點即可;
- 從機ID:待寫入的從機設(shè)備ID地址;
- 錯誤重試次數(shù):發(fā)送錯誤情況下的重試次數(shù);
- 寄存器類型:待寫入寄存器的類型。
2. 輸入
- slaveID:從機設(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é)點進行輸入。使用時和modbus_master_in一樣創(chuàng)建一個主機配置,指明待寫入設(shè)備的ID地址以及寄存器類型即可。
其中,modbus_parse_out節(jié)點的輸入一般來自fscript節(jié)點,我們可以在fscript中借助array對象完成數(shù)據(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ù)進行轉(zhuǎn)換,也可以選擇對指定數(shù)量的寄存器、或者對輸入的所有地址進行轉(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ù)進行轉(zhuǎn)換;
- 大小端選擇:大小端系統(tǒng)選擇;
- 數(shù)據(jù)主題:數(shù)據(jù)地址的主題(可選)。
2. 輸入
modbus_parse_in的輸入來自modbus_master_in或modbus_master_dynamic_in節(jié)點。- slaveID:從機設(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:從機設(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進行讀取;
- 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)的大小端模式。
作為filter類型節(jié)點,modbus_parse_in通常是從modbus_master_in節(jié)點獲取輸入。其輸出有兩種類型,在轉(zhuǎn)換單個寄存器時,payload的類型是value,可以直接讀取。當(dāng)轉(zhuǎn)換多個寄存器時,payload是個array對象,可以在fscript中通過array對象的方法進行處理。其中,array對象的使用方式如下:
a = msg.payload
print("濕度 " + array_get(a, 0))
print("溫度 " + array_get(a, 1))
modbus_parse_out節(jié)點
modbus_parse_out節(jié)點通常用于將fscript節(jié)點輸出的value或array對象轉(zhuǎn)換成Modbus標準的十六進制格式,后續(xù)可以將相應(yīng)的數(shù)據(jù)指針傳入Modbus的輸出節(jié)點modbus_master_out進行使用。
1. 屬性
- 寄存器起始地址:指明需要modbus_master_out寫入的寄存器的起始地址,如果節(jié)點的輸入不包含msg.address,則使用此屬性指向的地址;
- 大小端:系統(tǒng)大小端模式選擇;
- 主題:如果設(shè)定了主題,則節(jié)點只處理屬于自己的主題消息。
2. 輸入
- slaveID:從機設(shè)備ID地址;
- address:待寫入的寄存器起始地址;
- payload:待寫入的值,可以是value類型,也可以是array對象;
- topic:輸入的數(shù)據(jù)主題,如果本節(jié)點設(shè)置了主題屬性,則只有輸入的主題與節(jié)點的主題屬性匹配,節(jié)點才會對下一節(jié)點輸出;
3. 輸出
- slaveID:從機設(shè)備ID地址;
- address:待寫入的寄存器的起始地址;
- reg_num:待寫入的寄存器的數(shù)量;
- payload:轉(zhuǎn)換后的Modbus標準十六進制數(shù)組緩沖區(qū)指針;
- payloadLength:數(shù)組緩沖區(qū)的字節(jié)長度。
4. 使用方法
modbus_parse_out節(jié)點的前級通常是fscript,使用時在fscript中指明待寫入的從機設(shè)備ID地址、并傳遞構(gòu)建好的array對象即可。其后級節(jié)點一般是modbus_master_out節(jié)點,通過modbus_master_out節(jié)點將數(shù)據(jù)寫入目標設(shè)備。其中,在fscript中構(gòu)建array對象的方法如下:
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瀏覽量
77335 -
現(xiàn)場總線
+關(guān)注
關(guān)注
3文章
521瀏覽量
38650 -
ESDA
+關(guān)注
關(guān)注
0文章
28瀏覽量
7534 -
串行通信協(xié)議
+關(guān)注
關(guān)注
0文章
23瀏覽量
7692 -
致遠電子
+關(guān)注
關(guān)注
13文章
409瀏覽量
31434
原文標題:【EsDA應(yīng)用】Modbus應(yīng)用詳解
文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論