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