通常來(lai)說Modbus網關的網口(kou)(kou)接主站,網口(kou)(kou)采(cai)(cai)用Modbus TCP協議(yi),串口(kou)(kou)接各種RS485的儀(yi)表,串口(kou)(kou)采(cai)(cai)用Modbus RTU協議(yi)。但(dan)是也有少量情況是串口(kou)(kou)的(RS485)作為(wei)主站需要獲(huo)得Modbus TCP從站的數據(ju),如下圖所示:
由于Modbus RTU和Modbus TCP的(de)(de)尋址(zhi)方式(shi)不(bu)同,普通的(de)(de)方式(shi)無法實現這(zhe)種功能。RTU一般(ban)通過Modbus RTU指(zhi)(zhi)令的(de)(de)第一個(ge)字節(jie)作(zuo)為(wei)站地址(zhi),比如01 03 00 00 00 01 84 0a 的(de)(de)第一個(ge)字節(jie)01就是(shi)(shi)指(zhi)(zhi)查詢站地址(zhi)1,所有RS485總(zong)線上非01地址(zhi)的(de)(de)設備都不(bu)會應答。但是(shi)(shi)當Modbus TCP協議由于采用TCP連(lian)接作(zuo)為(wei)綁(bang)定主站和從站的(de)(de)紐帶,不(bu)再需要(yao)從站地址(zhi)的(de)(de)概念,只要(yao)是(shi)(shi)發給Modbus TCP從站的(de)(de)查詢,它都會做應答。它忽略了(le)01這(zhe)個(ge)站地址(zhi)字節(jie),實際上Modbus TCP采用的(de)(de)是(shi)(shi)IP地址(zhi)作(zuo)為(wei)站號的(de)(de)識(shi)別。
普通的(de)方式RTU主站的(de)查詢過程如下:
1.首先6路Modbus網關(guan)的(2個(ge)ZLAN5143×1路和(he)1個(ge)ZLAN5443D×4路)分別(bie)配(pei)置連(lian)接到6個(ge)Modbus TCP從站(zhan),地址(zhi)分別(bie)為192.168.1.61、192.168.1.62、192.168.1.63~192.168.1.66。Modbus RTU主站(zhan)的RS485和(he)6路Modbus網關(guan)的RS485連(lian)接在一起。
2.Modbus RTU主站PLC向(xiang)RS485總線發送(song)指令(ling)3d 03 00 00 00 01 81 36。
3.所有的6路Modbus網關都會收到(dao)3d 03 00 00 00 01 81 36,并且都轉(zhuan)化為Modbus TCP格式的數據(ju)00 00 00 00 00 06 3d 03 00 00 00 01,分(fen)別發給192.168.1.62、192.168.1.63~192.168.1.66。
4.雖然00 00 00 00 00 06 3d 03 00 00 00 01指令里面(mian)也(ye)有3d這個(ge)地(di)址字段(十(shi)六(liu)進制(zhi)3d就是61),但是每個(ge)Modbus TCP從(cong)(cong)站(zhan)不(bu)會(hui)關心(xin)這個(ge)站(zhan)地(di)址,所有的從(cong)(cong)站(zhan)都會(hui)給出應答(da)。
5.6路Modbus網(wang)關(guan)幾乎同時收到Modbus TCP從站(zhan)的應答,并(bing)同時發送到RS485總線,產生了總線的沖(chong)突,數(shu)據錯亂。
以上方案(an)的最終結果是(shi)由于數據沖突和無法(fa)使用。
根據(ju)上一節的(de)分析關(guan)鍵的(de)問題在于Modbus TCP和(he)RTU的(de)從(cong)站(zhan)識別方式不同(tong),前者是IP地(di)址,后者是站(zhan)地(di)址。我們無法修(xiu)改(gai)RTU主站(zhan)PLC的(de)協(xie)議也(ye)無法修(xiu)改(gai)Modbus TCP從(cong)站(zhan)的(de)協(xie)議。所以需要在Modbus網關(guan)內部做這種地(di)址轉換。
具體的實現(xian)方法是(shi):將Modbus TCP從站的IP地址(zhi)的最后一個字段作為Modbus RTU的站地址(zhi)。所(suo)以為了(le)訪問192.168.1.62、192.168.1.63~192.168.1.66,RTU主站發送(song)的指(zhi)令應該分別對應站地址(zhi)61、62、63~66,即:3d 03 00 00 00 01 81 36、3e 03 00 00 00 01 81 05等(deng)。
Modbus網關(guan)在(zai)收(shou)到RS485總(zong)線(xian)指(zhi)令后(hou)(hou)會識別站地址,如果站地址和自己連接的Modbus TCP的IP地址最后(hou)(hou)一(yi)個字(zi)段相同則(ze)轉發,否則(ze)不做(zuo)轉發。也(ye)就是需要有一(yi)個小的定制功(gong)能。
有了這(zhe)個定制功能后,再(zai)按(an)照之前的(de)通訊步驟運行時,由(you)于(yu)現在只有一路Modbus網關轉(zhuan)發(fa)了數據(ju),相應的(de)也(ye)就只有一路返回數據(ju)轉(zhuan)發(fa)到RS485總線上,避免了沖突。
為(wei)了實現這個小的定(ding)制(zhi)功能,需要從卓嵐那邊獲(huo)得“RTU做主站”的配置文件,將其下載到設(she)備內部(bu),重新上電即(ji)可。
在(zai)實際(ji)的(de)(de)使用場合中有比(bi)圖(tu)(tu)1更為有效的(de)(de)方法,即每個Modbus網(wang)關可(ke)以連接6個目(mu)的(de)(de)IP,所(suo)以以上(shang)圖(tu)(tu)1,只(zhi)需要一臺ZLAN5143即可(ke)實現(xian),只(zhi)不(bu)過需要配置額外的(de)(de)5個目(mu)的(de)(de)IP分別連接到192.168.1.62、192.168.1.63~192.168.1.66。
“RTU做主(zhu)站(zhan)”的定制功能會(hui)識(shi)別(bie)連接的IP地(di)址,目(mu)的IP地(di)址最后一個字節和RTU從站(zhan)地(di)址不同不會(hui)轉發(fa),所以也(ye)可以用(yong)單臺Modbus網關實現(xian)6個Modbus TCP從站(zhan)的查詢。