新聞中心
PRESS CENTERModbus是一種工業(yè)現(xiàn)場(chǎng)總線協(xié)議,通常運(yùn)行于RS485總線,采用半雙工即一問一答的通信機(jī)制。Modbus分為Modbus RTU/Modbus TCP/Modbus ASCII三種通信模式,網(wǎng)關(guān)目前支持Modbus RTU/Modbus TCP兩種通信模式。
Modbus主站請(qǐng)求節(jié)點(diǎn):根據(jù)設(shè)置的參數(shù)(地址碼/功能碼/寄存器起始地址/寄存器數(shù)量等)生成Modbus指令。
Modbus主站解析節(jié)點(diǎn):根據(jù)匹配的Modbus主站請(qǐng)求節(jié)點(diǎn),解析響應(yīng)數(shù)據(jù)。
Modbus主站解析節(jié)點(diǎn)使用時(shí)需指定匹配的Modbus主站請(qǐng)求節(jié)點(diǎn)(Modbus主站請(qǐng)求和Modbus主站解析節(jié)點(diǎn)匹配碼一致即可),匹配完成就會(huì)按照Modbus主站請(qǐng)求節(jié)點(diǎn)的設(shè)置來解析數(shù)據(jù),因此Modbus主站請(qǐng)求和Modbus主站解析節(jié)點(diǎn)必須成對(duì)出現(xiàn)且匹配碼必須唯一。
節(jié)點(diǎn)只對(duì)協(xié)議報(bào)文處理,并未指定相應(yīng)的物理通道,因此一般配合串口或者TCP節(jié)點(diǎn)一起使用。從而可以靈活實(shí)現(xiàn)Modbus RTU / Modbus TCP / Modbus RTU over TCP / Modbus TCP over RTU。
以下介紹主要針對(duì)Modbus主站請(qǐng)求節(jié)點(diǎn),Modbus主站解析節(jié)點(diǎn)無任何設(shè)置項(xiàng)。Modbus基礎(chǔ)概念此處不在介紹,如果不熟悉,請(qǐng)參考以下資料:https://iotrouter.yuque.com/attachments/yuque/0/2024/pdf/26702863/1726737470503-a9dfc212-14fd-45f3-b41a-0feee6be77b9.pdf
輸入
#高級(jí)用法-動(dòng)態(tài)傳參讀取: msg.type = "read" #字符串:read讀/write寫 msg.payload = [ { "read":true, //執(zhí)行讀操作:必填項(xiàng) "groups":"", //組名:必填項(xiàng),詳見點(diǎn)位表介紹 "name":"", //點(diǎn)位名稱:必填項(xiàng),詳見點(diǎn)位表介紹 "slaveAddr":"1", //從機(jī)地址:必填項(xiàng),詳見點(diǎn)位表介紹 "registerAddr":"1", //偏執(zhí):必填項(xiàng),詳見點(diǎn)位表介紹 "funCode":"FC1", //功能碼:必填項(xiàng),詳見點(diǎn)位表介紹 "type":"Bool", //數(shù)據(jù)類型:必填項(xiàng),詳見點(diǎn)位表介紹 "decimalPlaces":"1", //保留小數(shù)位:范圍1-4(選填參數(shù)) "slope":"", //斜率K:選填參數(shù),詳見點(diǎn)位表介紹 "intercept":"",//截距B:選填參數(shù),詳見點(diǎn)位表介紹 "special":"",//特殊處理:選填參數(shù),詳見點(diǎn)位表介紹 } ] |
輸出
msg.payload #根據(jù)配置項(xiàng)生成的Modbus RTU/TCP請(qǐng)求指令 group #當(dāng)前指令的組名 protocol #協(xié)議 cmdJson #本條指令的點(diǎn)位信息 |
功能
1.名稱
工作區(qū)內(nèi)節(jié)點(diǎn)的命名,方便維護(hù)及記憶。
2.匹配碼
當(dāng)請(qǐng)求節(jié)點(diǎn)匹配碼與解析節(jié)點(diǎn)匹配碼一致時(shí),自動(dòng)完成匹配,解析節(jié)點(diǎn)會(huì)按照請(qǐng)求節(jié)點(diǎn)的配置進(jìn)行解析。
3.協(xié)議
Modbus RTU / Modbus TCP。
4.點(diǎn)位表
a勾選框
請(qǐng)勾選要讀取的點(diǎn)位。不勾選則不會(huì)自動(dòng)讀取,僅用于寫入時(shí)匹配數(shù)據(jù)點(diǎn)用。
不勾選的點(diǎn)位只在寫入時(shí)用作匹配數(shù)據(jù)點(diǎn)用。如上圖所示,C未勾選則不會(huì)自動(dòng)讀取C點(diǎn)位,寫入時(shí)輸入格式:【msg.payload.C = 125】,當(dāng)表中有數(shù)據(jù)名稱為C的點(diǎn)位時(shí),將會(huì)匹配該點(diǎn)位,并將值125寫入對(duì)應(yīng)的寄存器。
b組
連續(xù) 且 可讀 且 從機(jī)地址相同 且 功能碼相同 的點(diǎn)位可配置為一個(gè)組,同組點(diǎn)位讀取會(huì)構(gòu)造一條指令讀取,從而大幅提高讀取效率。不同組的點(diǎn)位,會(huì)按照一個(gè)點(diǎn)位構(gòu)造一條指令的方式讀取。
同組使用時(shí),需嚴(yán)格遵守Modbus協(xié)議中關(guān)于寄存器讀取最大長(zhǎng)度的限制!
c數(shù)據(jù)名稱
數(shù)據(jù)名稱作為每個(gè)數(shù)據(jù)點(diǎn)的唯一鍵(key),請(qǐng)確保其不重復(fù)。
d從機(jī)地址
Modbus協(xié)議站號(hào)(10進(jìn)制地址,范圍1-255)。
連接多個(gè)從機(jī)時(shí),可以在同一個(gè) Modbus 主站節(jié)點(diǎn)的點(diǎn)位表中配置多個(gè)從機(jī)的寄存器地址。
e偏置
數(shù)據(jù)點(diǎn)的Modbus寄存器地址(填寫10進(jìn)制地址)。
偏置實(shí)際上是指Modbus寄存器地址,此處叫做偏執(zhí)是為了統(tǒng)一表達(dá)。
呈現(xiàn)方式:Modbus寄存器地址一般以兩種形式呈現(xiàn):
十六進(jìn)制地址:例如0X0000、0X0001
十進(jìn)制地址:例如40001、40002
填寫方式:
十六進(jìn)制地址:將十六進(jìn)制地址轉(zhuǎn)換為十進(jìn)制地址后加1。例如:十六進(jìn)制的 0x0000 偏置填寫 1;十六進(jìn)制的0x0001偏執(zhí)填寫2
十進(jìn)制地址:去掉十進(jìn)制地址的首位后,直接填寫偏置。例如:十進(jìn)制的 40001偏置填寫 1;十進(jìn)制的40002偏執(zhí)填寫2
寄存器類型 | 地址形式 | 偏置值 |
十六進(jìn)制 | 0x0000 | 1 |
十六進(jìn)制 | 0x0001 | 2 |
十進(jìn)制 | 40001 | 1 |
十進(jìn)制 | 40002 | 2 |
f功能碼
FC1:對(duì)線圈點(diǎn)位進(jìn)行讀寫操作,寫入操作默認(rèn)采用05功能碼。
FC2:對(duì)觸點(diǎn)進(jìn)行讀操作。
FC3:對(duì)保持寄存器讀寫操作。寫入時(shí),對(duì)于單個(gè)寄存器默認(rèn)使用06功能碼(針對(duì)16位整型),對(duì)于多個(gè)寄存器或更大位寬(如32位、64位整形及浮點(diǎn)型)寫入則采用10功能碼。
FC4:對(duì)輸入寄存器讀操作,不支持寫入,確保了對(duì)存儲(chǔ)數(shù)據(jù)的非侵入式訪問,適用于需要監(jiān)測(cè)或收集數(shù)據(jù)而不改變其狀態(tài)的場(chǎng)景。
g數(shù)據(jù)類型
Bool:二進(jìn)制位解析。
UInt16:占用1個(gè)寄存器,2個(gè)字節(jié),表示非負(fù)整數(shù),數(shù)據(jù)范圍 0 ~ 65535。
Int16:占用1個(gè)寄存器,2個(gè)字節(jié),表示整數(shù),數(shù)據(jù)范圍 -32768 ~ 32767。
UInt32:占2個(gè)寄存器,4個(gè)字節(jié),表示非負(fù)整數(shù),數(shù)據(jù)范圍 0 ~ 4294967295。
Int32:占2個(gè)寄存器,4個(gè)字節(jié),表示整數(shù),數(shù)據(jù)范圍 -2147483648 ~ 2147483647。
Float32:占2個(gè)寄存器,4個(gè)字節(jié),表示浮點(diǎn)數(shù)。
Double64:占4個(gè)寄存器,8個(gè)字節(jié),表示浮點(diǎn)數(shù)。
BCD:占用n個(gè)寄存器,n*2個(gè)字節(jié),表示16進(jìn)制字符串(n=特殊處理項(xiàng)填入的值)。
String:占用n個(gè)寄存器,n*2個(gè)字節(jié),表示ASCII字符串(n=特殊處理項(xiàng)填入的值)。
hK(斜率)/B (截距)
按照線性關(guān)系 y=kx+B計(jì)算,其中 x 是寄存器值,y 是轉(zhuǎn)換后的值。
縮小10倍:K = 0.1,B = 0
放大10倍:K = 10,B = 0
i特殊處理
對(duì)于FC3功能碼,要求按bit位進(jìn)行數(shù)據(jù)解析時(shí),通過在特殊處理框內(nèi)輸入0-15的數(shù)值,即可實(shí)現(xiàn)對(duì)指定數(shù)據(jù)的位解析。
在String解析模式下,特殊處理的值表示讀取字符串寄存器的長(zhǎng)度,如下圖為讀取5個(gè)寄存器長(zhǎng)度的字符串?dāng)?shù)據(jù)。
在BCD解析模式下,特殊處理的值將表示讀取BCD寄存器的長(zhǎng)度,如下圖為讀取5個(gè)寄存器長(zhǎng)度的BCD數(shù)據(jù)。
5.超時(shí)時(shí)間
主站發(fā)出一個(gè)請(qǐng)求后,等待從站應(yīng)答的最長(zhǎng)時(shí)間。如果在這段時(shí)間內(nèi)沒有收到從站的應(yīng)答,主站會(huì)觸發(fā)超時(shí)處理。
輸入
msg.payload #從站響應(yīng)的Modbus報(bào)文 |
輸出
msg.payload #解析后的數(shù)據(jù) msg.log #本次通信的原始請(qǐng)求指令和從機(jī)響應(yīng)數(shù)據(jù)以及一些其它參數(shù) { group:"",//組名 slaveAddr:1,//從機(jī)地址 funCode:1,//功能碼 dataPoints:[{}],//本次讀取的數(shù)據(jù)點(diǎn)詳細(xì)配置參數(shù) data:{},//解析后的值 reqpayload:[],//原始請(qǐng)求指令 message:"",//success請(qǐng)求成功,timeout請(qǐng)求超時(shí),error請(qǐng)求錯(cuò)誤,一般表示返回的報(bào)文不符合格式 reppayload:[],//從機(jī)響應(yīng)的原始報(bào)文 } |
功能
名稱
工作區(qū)內(nèi)節(jié)點(diǎn)的命名,方便維護(hù)及記憶。
匹配碼
當(dāng)請(qǐng)求節(jié)點(diǎn)匹配碼與解析節(jié)點(diǎn)匹配碼一致時(shí),自動(dòng)完成匹配,解析節(jié)點(diǎn)會(huì)按照請(qǐng)求節(jié)點(diǎn)的配置進(jìn)行解析。
模式
合并所有變量輸出:將所有變量整合為一個(gè)key-value集合,合并輸出。
每組變量單獨(dú)輸出:以組的維度進(jìn)行輸出,每個(gè)組內(nèi)的變量以key-value集合的形式輸出。
按組合并輸出:先以組的維度將輸出分類,然后構(gòu)建一個(gè)嵌套的key-value結(jié)構(gòu),其中外層key為組名,內(nèi)層為該組內(nèi)所有變量的key-value集合,實(shí)現(xiàn)數(shù)據(jù)的按組聚合和有序展示。
按從機(jī)地址合并輸出:先以從機(jī)地址的維度將輸出分類,然后構(gòu)建一個(gè)嵌套的key-value結(jié)構(gòu),其中外層key為從機(jī)地址,內(nèi)層為該從機(jī)內(nèi)所有變量的key-value集合,實(shí)現(xiàn)數(shù)據(jù)的按組聚合和有序展示。
1.讀單個(gè)從機(jī)
見文末
2.讀多個(gè)從機(jī)
源碼:見文末
3.寫從機(jī)數(shù)據(jù)
見文末
4.高級(jí)讀-動(dòng)態(tài)傳參
允許通過msg攜帶配置參數(shù)修改采集指令,從而根據(jù)需求動(dòng)態(tài)采集傳感器數(shù)據(jù)。例如:云端根據(jù)業(yè)務(wù)需求,不同情況下,下發(fā)不同的采集命令。
源碼:見文末
5.高級(jí)寫-動(dòng)態(tài)傳參
允許通過msg攜帶參數(shù)動(dòng)態(tài)寫入數(shù)據(jù)。
源碼:見文末
6.高級(jí)-組使用方法
如果配置了組,可以通過msg.group = ${組名}來讀取指定組的數(shù)據(jù)。
源碼:見文末
上文示例中使用到的是TCP鏈路的ModbusTCP協(xié)議。實(shí)際使用中,可以根據(jù)自己的需求自由組合來實(shí)現(xiàn)不同的應(yīng)用,例如:Modbus RTU / Modbus TCP / Modbus RTU over TCP / Modbus TCP over RTU。
ModbusRTU協(xié)議 串口鏈路
使用場(chǎng)景:在串口鏈路上使用MobusRTU協(xié)議。
ModbusRTU協(xié)議 TCP鏈路
使用場(chǎng)景:在TCP鏈路上使用ModbusRTU協(xié)議。
源碼/原文:https://iotrouter.yuque.com/zn3vdn/eg8000/yg8a2l602l18xc8a