|
一、基礎(chǔ)知識: 1、什么是Modbus Modbus是由Modicon(現(xiàn)為施耐德電氣公司的一個品牌)在1979年發(fā)明的,是全球第一個真正用于工業(yè)現(xiàn)場的總線協(xié)議。 Modbus通訊協(xié)議常見于第三方設(shè)備的通訊,如DCS讀取PLC的數(shù)據(jù)、智能儀表(流量計、分析儀等設(shè)備)的數(shù)據(jù),需要用到Modbus協(xié)議,通常分為3類,Modbus RTU 和Modbus TCP/IP、Modbus ASCII; 2、主--從結(jié)構(gòu): 主設(shè)備查詢 查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返回它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開始讀及要讀的寄存器數(shù)量。錯誤檢測域為從設(shè)備提供了一種驗證消息內(nèi)容是否正確的方法。 從設(shè)備回應(yīng) 如果從設(shè)備產(chǎn)生正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的回應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù):像寄存器值或狀態(tài)。如果有錯誤發(fā)生,功能代碼將被修改以用于指出回應(yīng)消息是錯誤的,同時數(shù)據(jù)段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設(shè)備確認消息內(nèi)容是否可用。 每個MODBUS幀都包括地址域 功能域 數(shù)據(jù)域 錯誤檢測域 3、Modbus的三種通信協(xié)議: Modbus協(xié)議分為三種通信方式:Modbus RTU、Modbus ASCII以及Modbus TCP。 首先,Modbus TCP的通信格式和Modbus RTU非常相似,唯一的差別只是Modbus RTU最后帶兩個字節(jié)的CRC校驗,而Modbus TCP沒有。 其次,Modbus ASCII的通信格式與Modbus RTU其實“神合貌離”,就是把Modbus RTU的每一個字節(jié)(例如:27H)高四位(2)和低四位(7)拆分為兩個字節(jié),并以ASCII碼的方式表現(xiàn)出來(32 37),再給命令幀分別加上起始符和結(jié)束符便可以,當(dāng)然Modbus RTU和Modbus ASCII的校驗的方式不同,這里暫不詳述,所以同一條命令用Modbus RTU方式和Modbus ASCII方式表現(xiàn)出來,雖然在命令長度的上有很大的區(qū)別,但其實際表達的意思卻是一樣。 4、RTU方式: 幀定界:MODBUS RTU方式下,每兩個字符之間發(fā)送或者接收的時間間隔不能超過1.5倍 字符傳輸時間。如果兩個字符時間間隔超過了3.5倍的字符傳輸時間,規(guī)約就認為一幀數(shù)據(jù)已經(jīng)接收,新的一幀數(shù)據(jù)傳輸開始。 備注:NPort與MGate產(chǎn)品的區(qū)別就在于,MGate在每幀報文的之后,增加了3.5倍的字符傳輸時間,而NPort則沒有。 5、ASCII方式: 幀定界: “:”幀起始 “CR LF” 幀結(jié)束 ASCII方式用兩個ASCII字符表示一個8位數(shù)據(jù),比如16進制的3A用字符“3”和字符“A”表示。 6、Modbus TCP Modbus TCP數(shù)據(jù)幀包含報文頭、功能代碼和數(shù)據(jù)3個部分: MBAP報文頭(MBAP:Modbus Application Protocol,Modbus應(yīng)用協(xié)議)分4個域,共7個字節(jié): 自注:這里的客戶端、服務(wù)器端是指TCP的Client、Server端。 二、MGate說明: 1、通信模式 1)MGate配置文件中: Modbus采用主從結(jié)構(gòu),只有兩種模式:Master和Slave RTU/ASCII Slave:PC作為Master主,裝置作為Slave從; RTU/ASCII Master:PC作為Slave從,裝置作為Master主; RTU與ASCII的區(qū)別: a)校驗: RTU:CRC(循環(huán)冗長校驗); ASCII:LRC(縱向冗長校驗); 校驗碼用于檢查信息的完整性; b)消息格式不同: RTU:消息中每個字節(jié)(8Bit)包含2個4Bit的十六進制字符,優(yōu)點:同樣波特率下,比ASCII傳送更多的數(shù)據(jù); ASCII:消息中每個字節(jié)(8Bit)都作為一個ASCII碼(2個十六進制字符)發(fā)生,優(yōu)點:字符發(fā)送的時間間隔可達到1秒而不產(chǎn)生錯誤; 2)說明手冊中: 兩種通信模式: A)以太網(wǎng)Master串口Slave: Modbus TCP可支持同時16個連接,串口支持RS-232和RS-422/485,其中RS-232和RS-422僅能連一個設(shè)備,RS-485可連接31個設(shè)備; B)串口Master以太網(wǎng)Slave: 可支持32個Modbus TCP slave設(shè)備; 三、實測: 1、結(jié)構(gòu): 筆記本電腦網(wǎng)口→MB3480-筆記本→UPort 1150; 2、UPort 1150設(shè)置: 默認為RS-232方式,注意設(shè)置為RS-485(也可為RS-232),方法: “控制面板”→“設(shè)備管理器”→ 3、MB3480的設(shè)置: 1)主從模式的設(shè)定:以PC端作為Master、裝置作為Slave為例; 2)設(shè)置串口狀態(tài): 3)ID映射: 說明: a)Modbus TCP通信標(biāo)準(zhǔn)端口號為502,所有的端口號都是502,串口通過ID好識別; b)ID表中設(shè)置情況: 1~5:Port1; 6~10:Port2; c)從站偏移量:可不設(shè),以下為例子,假定偏移量為3; 4、使用的軟件: 前提說明: 兩套軟件: 軟件一:自己在網(wǎng)上找的Modbus Poll和Modbus Slave,注意: Modbus Poll:只作為Master(主端)(TCP Master和RTU Master都用它); Modbus Slave:只作為Slave(從端)(TCP Slave和RTU Slave都用它); 軟件二:使用的ModScan32和ModSim32,注意: ModScan32:只作為Master(主端)(TCP Master和RTU Master都用它); ModSim32:只作為Slave(從端)(TCP Slave和RTU Slave都用它); 軟件一: Modbus Poll(用于TCP Master) Modbus Slave(用于串口的Slave) 1)打開Modbus Slave: 選擇“Connectiong” 注意:UPort 1150映射為主機的COM2口,使用這里選擇Port2; ID號:1;功能碼:3 2)打開Modbus Poll: 選擇“Connection”,端口號為502; ID號:1;功能碼:3; 3)注意事項: a)Modbus Poll和Modbus Slave設(shè)置的ID號、功能碼必須一致; b)通信成功的判斷: 可從Modbus Poll軟件本身、MGate Manager的“監(jiān)控”來觀察; 注意:Mdobus Slave軟件無法判斷連接是否成功; 通信成功的界面: Modbus Poll:Tx值不斷增加,Err值為0(Err指響應(yīng)的返回值); MGate Manager→“監(jiān)控”: 通信不成功的界面: 比如:將Modbus Slave的連接斷開,則Modbus Poll會報錯: 正確的連接,則Err=0; MGate Manager→“監(jiān)控”: 圖中:TCP Req、RTU Req(通過MB3480轉(zhuǎn)發(fā)到RTU串口的),沒有Resp。 c)其他功能鍵的使用: Modbus Poll: Read/Write Definition:可設(shè)置ID號、功能碼、地址; Reset Counters:充值計數(shù)器; 其中:地址可自定義,但是Modbus Poll和Modbus Slave的地址設(shè)置都要一致; Modbus Slave: Slave Definition:可設(shè)置ID號、功能碼、地址; 軟件二: ModScan32:用于TCP Master; ModSim32:用于RTU Slave; 1)打開ModSim32軟件:網(wǎng)上有下載,或留下聯(lián)系郵箱,看都后發(fā)給各位; 打開“ModSim32.exe”即可; “File”→“New”: “Connection”→“Port2”→UPort 1150在筆記本上映射的端口號為COM; 2)打開ModScan32軟件: 直接打開目錄,點擊“ModScan32.exe”即可; “Connection”→“Remote TCP/IP Server”: 3)注意事項: a)ModScan32和ModSim32的Address(地址)、Device Id(ID號)、MODBUS Point Type(功能碼,為3)設(shè)置必須一致,其中: ID號:Port1為1~5; 功能碼:為3; Address:可自己設(shè)定,只要ModScan32和ModSim32的一致就可以了; b) 連接不成功的界面: 比如:將Address一個設(shè)置為“0001”,另一個設(shè)置為“0100”,則會連接不成功,如下界面: 而ModSim32則不會有報錯信息; 錯誤一:出現(xiàn)“**MODBUS Message TIME-OUT**”,如果正確的連接,則沒有這行報錯; 錯誤二:Number of Polls的值一直在增加,而Valid Slave Responses的值不變,這說明TCP Master一直發(fā)送請求,卻一直沒有得到回應(yīng); 當(dāng)正確連接后,點擊“Reset Ctrs”后,這個計數(shù)值就會清零,重新累計,出現(xiàn)的數(shù)據(jù)應(yīng)該是Number of Polls與Valid Slave Responses一致; c)當(dāng)修改設(shè)置后,參數(shù)會自動執(zhí)行,不要重啟軟件或按鍵; d)如果所有設(shè)置都正確,但是連接卻還是報錯,這種情況下,只要將ModScan32和ModSim32軟件重新開啟就可以了,因為這個軟件是沒有經(jīng)過注冊的; 5、監(jiān)控和數(shù)據(jù)報文: 1)一個完整的輪詢過程: TCP Req(TCP請求)→轉(zhuǎn)為RTU Req(RTU請求)→RTU Resp(RTU回應(yīng))→TCP Resp(TCP回應(yīng)); 2)報文內(nèi)容: MBAP報頭格式: MBAP包含7個字節(jié): 01 00:處理標(biāo)識ID,取決于設(shè)備的類型,取值一般為0000到FFFF; 00 00:協(xié)議ID,0=Modbus協(xié)議; 00 06:后面跟隨的字節(jié)個數(shù)(包含從設(shè)備ID號),此例:后面跟隨了6個字節(jié); 01:從設(shè)備的ID號; MBAP: 00 0D:13---后面跟隨13個字節(jié); 6、較深入的報文內(nèi)容: 1)Modbus Poll向多個寄存器發(fā)送數(shù)據(jù)的報文分析: a)Modbus Poll中的設(shè)置: 雙擊紅框部分,界面: Value中填入要發(fā)送的數(shù)據(jù),注意:這是十進制,對于“監(jiān)控”中是十六進制; Slave ID:Port所接從設(shè)備的ID; Address:這是寄存器地址,第1個是0,第2個是1……; b)多寄存器報文分析: 監(jiān)控中看到的數(shù)據(jù): 分析: 第一組: i)TCP Req:TCP發(fā)送請求; 時間 數(shù)據(jù) 0.000 03 36 00 00 00 06 01 03 00 00 00 0A MBAP解析: 03 36:處理標(biāo)識ID; 00 00:協(xié)議ID,0=Mdobus; 00 06:后面跟隨的字節(jié)個數(shù); 01:從設(shè)備ID; ii)RTU Req:通過MB3480轉(zhuǎn)換到串口的請求; 時間 數(shù)據(jù) 0.000 01 03 00 00 00 0A C5 CD 01 03是從設(shè)備的站號和設(shè)備ID; 00 00是Modbus起始地址; 00 0A是Modbus寄存器個數(shù) ; C5 CD是CRC校驗碼; 注意:i)與ii)的起始地址、寄存器個數(shù)是一樣的;ii)在i)的基礎(chǔ)上,去掉了MBAP報頭,并且增加了CRC校驗碼; iii)RTU Resp:從串口RTU回應(yīng)的數(shù)據(jù); 時間 數(shù)據(jù) 0.090 01 03 14 00 0F 00 10 00 11 00 12 00 00 00 00 00 00 00 00 00 00 一共10個寄存器: 00 0F:表示15; 00 10:表示16; 00 11:表示17; 00 12:表示18; 其余寄存器為00,沒有發(fā)送數(shù)據(jù); 注意:第i)、ii)是請求,沒有具體數(shù)據(jù),只有寄存器起始地址和寄存器個數(shù); 第iii)、iv)開始回應(yīng)數(shù)據(jù); iv)TCP Resp:通過MB3480轉(zhuǎn)到TCP的回應(yīng)數(shù)據(jù); 時間 數(shù)據(jù) 0.090 03 36 00 00 00 17 01 03 14 00 0F 00 10 00 11 00 12 00 00 00 注意:第iv)的MBAP報頭與i)的報頭是一樣的; 第二組: 與第一組一樣,需要注意的: MBAP報頭不同;起始地址、寄存器個數(shù),甚至校驗碼都是一樣的; 2)ModScan32向多個寄存器發(fā)送數(shù)據(jù)的報文: 4001:<00000> 第一個寄存器,發(fā)送的數(shù)據(jù)是0; 4001:<00000> 第二個寄存器,發(fā)送的數(shù)據(jù)是0; …… 點擊<00000>,出現(xiàn)界面: 4001寄存器的地址是:1; 4002寄存器的地址是:2; Value:要發(fā)送的數(shù)據(jù); 3)使用Modbos Poll和Modbus Slave模擬RTU Master: a)通信結(jié)構(gòu): RUT串口 → MB3480(192.168.127.254)→ PC(192.168.127.108) b)MGate Manager: 操作模式:設(shè)置為“RTU主站模式”(RTU Master); 串口狀態(tài)設(shè)置: 從站ID映射的設(shè)置: 注意:當(dāng)Port 1的操作模式設(shè)置為“RTU主站模式”時,從站ID映射列表中就沒有了Port1的從站設(shè)備ID號,為什么?因為這時的Port1是作為Master(發(fā)起端),TCP端是作為響應(yīng)端,這就是Modbus的主從結(jié)構(gòu)。界面如下: 設(shè)置遠程TCP從站IP:“新增”即可。 b)Modbus Poll: 注意:此時連接的是串口端,作為Master(主); c)Modbus Slave: 注意:此時連接的是TCP端,作為Slave(從); d)通信成功: 報文分析: 第一組: 0.000 RTU Req ---RTU主動發(fā)起請求; 0.000 TCP Req ---通過MB3480,轉(zhuǎn)發(fā)Req請求; 0.010 TCP Resp ---TCP返回響應(yīng) ; 0.010 RTU Resp ---通過MB3480,轉(zhuǎn)發(fā)RTU響應(yīng); 下篇文章我們將對報文的數(shù)據(jù)解析,感謝你的觀看! |
|
|