昌暉儀表在一個應(yīng)用測試中測試了多個品牌流量積算儀MODBUS通信。由于測試的流量積算儀來自于不同廠家,不同時期的產(chǎn)品(最早的出廠時間為2004年),故雖其標(biāo)識的均為標(biāo)準(zhǔn)Modbus通信,但其中一些流量積算通訊有其各自的不同“特點”,在這里和大家聊聊。
由于一些流量積算儀無法找到可以溝通的技術(shù)支持人員,有些特性不排除是單獨(dú)測試設(shè)備的問題或是老產(chǎn)品的問題,故在下面的敘述中,昌暉儀表均隱去流量積算儀品牌,以免不必要的紛爭。以下流量積算儀網(wǎng)絡(luò)測試參數(shù)均為9600波特率,8數(shù)據(jù)位,1停止位,無校驗,RS485半雙工網(wǎng)絡(luò),Modbus RTU協(xié)議。
1、流量積算儀MODBUS通訊:你慢慢問,否則我要罷工了
在測試上面這個流量積算儀時,通過查閱其手冊,發(fā)現(xiàn)我們需要的數(shù)據(jù)主要放置在從40001到40014(或者說從保持型寄存器0x00到0x0D)這14個連續(xù)寄存器中。
在使用PLC或者組態(tài)軟件測試之前,昌暉儀表習(xí)慣用ModScan測試軟件進(jìn)行簡單測試。ModScan測試結(jié)果正常,能讀取到我們需要的7個數(shù)據(jù)。ModScan配置如下:
ModScan測試成功后,我們使用PLC直接讀取以上數(shù)據(jù),可以讀到正確的數(shù)據(jù),但是發(fā)現(xiàn)數(shù)值變動十分緩慢;進(jìn)一步監(jiān)控PLC的通信狀態(tài)字,其一直在通信正常、校驗錯誤以及無響應(yīng)幾種狀態(tài)之間不斷切換。由于我們已經(jīng)讀到正確的數(shù)據(jù),故寄存器地址信息和波特率、站號等網(wǎng)絡(luò)參數(shù)應(yīng)該沒有問題。
所以首先昌暉儀表工程師對硬件接線進(jìn)行了檢查,由于只是在辦公室內(nèi)進(jìn)行測試,且通信線距離只有50厘米,故測試開始時昌暉儀表未在網(wǎng)絡(luò)兩端安裝120歐姆終端電阻,那么既然現(xiàn)在存在問題,我們就把終端電阻加上,畢竟昌暉儀表之前也遇到過某些設(shè)備在使用特定材質(zhì)線纜時在短距離也無法通信的情況。然而,加上終端電阻,甚至更換了一段標(biāo)準(zhǔn)的RS485雙絞屏蔽電纜后,故障依然存在。此時,把儀表的線重新接回計算機(jī)用ModScan測試,依然正常。并且,我們把PLC的數(shù)據(jù)直接用串口監(jiān)控,發(fā)現(xiàn)其和ModScan發(fā)出的數(shù)據(jù)內(nèi)容一模一樣,就是速度快了一點。ModScan默認(rèn)情況下一般是1秒鐘發(fā)送一次數(shù)據(jù)請求,但是昌暉儀表測試的PLC主站在默認(rèn)狀況下,只要從站設(shè)備有回復(fù),在3?個字符時間后,就會進(jìn)行下一次數(shù)據(jù)請求。會不會是這里的問題呢?
在之前的工作中,昌暉儀表工程師遇到過一些從站設(shè)備對通信的處理能力比較弱,或者是程序編制不完善,當(dāng)485總線繁忙時,由于其處理器計算能力或者程序編制不合理,出現(xiàn)較總線不繁忙時通訊響應(yīng)遲緩,設(shè)備動作卡頓,通訊中斷,甚至設(shè)備重啟等情況。僅在今年,昌暉儀表就遇到過一個集控器,主站03報文詢問過快之后設(shè)備顯示器停滯不刷新數(shù)據(jù);某家電一線品牌的中央空調(diào)集控器,速度快但不定時通訊中斷,必須重啟設(shè)備才可恢復(fù);某模擬量模塊,速度快后模擬量讀數(shù)失真;某壓力表,速度快后直接重啟。
想到這里,昌暉儀表在PLC主站的輪詢邏輯中增加了100ms的延遲時間,即當(dāng)主站收到從站的正確響應(yīng)后,等100ms之后再發(fā)送下一條請求。驗證,問題得到解決。
2、流量積算儀MODBUS通訊:不要一次問那么多問題,我每次只能回答一點點
在測試上面這臺流量積算儀時,我們同樣首先使用ModScan進(jìn)行第一步的測試。儀表的協(xié)議和地址表如下。
◆讀當(dāng)前數(shù)據(jù)
計算機(jī)→FC6000(4-8bytes):$,03H,XXXX,CRC
根據(jù)上表,我們在ModScan中做出了如下配置,并且我們在流量積算儀上設(shè)置了一個數(shù)值為328的質(zhì)量累積流量值,看看是否可以通信正常。不負(fù)所望,ModScan讀出了從地址40003開始的連續(xù)14個字的數(shù)據(jù),但是結(jié)果卻另昌暉儀表感到困惑。如下圖:
地址40003中,確實是昌暉儀表希望的328的數(shù)值,可是地址40004中竟然也是這個值。在地址表中,我們可以看到該數(shù)據(jù)應(yīng)該是一個32位雙字的長整型數(shù)據(jù)才對,所以如果對于數(shù)值328來說,40004中的數(shù)值應(yīng)該為0才對。即使考慮了高低字交換,高低字節(jié)交換,有無符號數(shù),地址偏移1位等因素,這個數(shù)值依然不對。昌暉儀表又進(jìn)行了多次測試,發(fā)現(xiàn)40003和40004的數(shù)值始終相等。然后,昌暉儀表習(xí)慣性的想先測試1個數(shù),看看能不能讀上來,于是就在上圖的配置中,把數(shù)據(jù)長度從14改為了1,奇怪的是,這時40003的數(shù)值竟然讀不上來了。難道問題和數(shù)據(jù)長度有關(guān)?
于是,昌暉儀表工程師又仔細(xì)看了下該廠家流量積算儀手冊,有了點不太確定的發(fā)現(xiàn)(直到現(xiàn)在仍不太確定)。在上面的協(xié)議中,有這么一句:
◆讀當(dāng)前數(shù)據(jù)
計算機(jī)→FC6000(4-8bytes):$,03H,XXXX,CRC
這里的4-8字節(jié)莫非是指我們一次只能讀取4-8字節(jié)的數(shù)據(jù)?仔細(xì)查看該表的數(shù)據(jù),我們看到所有的數(shù)據(jù)都是4字節(jié)長的。所以,昌暉儀表就在ModScan中,把數(shù)據(jù)長度改為2,經(jīng)過修改后,表里的7個數(shù)據(jù)都可以讀到且正常。最后,我們在PLC中做了如下配置,分7次讀取這7個數(shù)據(jù),結(jié)果正常。
這里,昌暉儀表不能說儀表有問題,只能說其手冊寫得應(yīng)該更明確些。
3、流量積算儀MODBUS通訊:人家是標(biāo)準(zhǔn)Modbus RTU協(xié)議……只不過校驗是反的
這塊流量積算儀的問題更直接,當(dāng)使用ModScan按其手冊發(fā)送內(nèi)容讀取數(shù)據(jù)時,儀表沒有數(shù)據(jù)回復(fù)。但是如果使用流量積算儀廠家自帶的一個小軟件測試儀表的通信,數(shù)據(jù)是完全正常的。由于和廠家軟件測試使用的物理鏈路完全相同,所以應(yīng)該還是報文協(xié)議上出現(xiàn)了一些問題。這就需要我們仔細(xì)的閱讀廠家手冊。
經(jīng)過反復(fù)研讀廠家的手冊,終于昌暉儀表發(fā)現(xiàn)了一個之前很少遇到的情況,下圖是通信協(xié)議的一部分:
6、通訊命令:
功能代碼03-用來讀取顯示數(shù)據(jù)
發(fā)送01;地址回應(yīng)01;地址
03;功能碼03;功能碼
00;寄存器地址高04;;字節(jié)個數(shù)
01;寄存器地址低(顯示地址)80;數(shù)據(jù)1
00;寄存器個數(shù)高04;數(shù)據(jù)2
04;寄存器個數(shù)低80;數(shù)據(jù)3
CRCH;CRC校驗碼高80;數(shù)據(jù)4
CRCL;CRC校驗碼低CRCH;CRC校驗碼高
CRCL;CRC校驗碼低
說明:地址=儀表號;寄存器地址=顯示項目編號;回應(yīng)字節(jié)個數(shù)=(發(fā)送)寄存器個數(shù)低(1-63)
在標(biāo)準(zhǔn)Modbus協(xié)議中,報文的最后兩個字節(jié)為CRC校驗字節(jié),在正常情況下,一般是先發(fā)CRC的低字節(jié),然后再發(fā)CRC的高字節(jié)。如果CRC校驗不對,設(shè)備可以對報文不做應(yīng)答。在一般的PLC或是組態(tài)軟件的標(biāo)準(zhǔn)Modbus塊或者驅(qū)動中,昌暉儀表未曾見過可以修改CRC高低字節(jié)的設(shè)置,故在此情況下,我們直接用ModScan或者PLC里預(yù)制的標(biāo)準(zhǔn)Modbus塊是無法和該儀表進(jìn)行通信的。所以,在后續(xù)處理和這塊表的通信時,昌暉儀表使用了自由協(xié)議的方式,用PLC的TX功能塊直接發(fā)送報文,然后對儀表回復(fù)的報文用RX功能塊接收后進(jìn)行解析。
4、其他
某些流量積算儀是有Modbus RTU和ASCII的選項的。但是昌暉儀表在測試中,發(fā)現(xiàn)有的流量積算儀稱RTU為”寄存器模式”,ASCII為”字符模式”,這在配置流量積算儀時需要注意。
在前文中也提到過,流量積算儀中的很多數(shù)據(jù)往往是32位的雙整型數(shù)據(jù)或IEEE754單精度浮點型數(shù)據(jù)。既然是32位數(shù)據(jù),在不同的PLC或者設(shè)備中,其高低字或高低字節(jié)的存放順序各有不同。所以,如果通信可以通上但數(shù)據(jù)讀上來是亂碼,大多數(shù)情況下,對于32位雙整型數(shù)據(jù),可以交換其高低字;對于32位單精度浮點數(shù),由于其有1234,2143,3412,4321這4中可能,可以先交換高低字,如果不正確后可以再對高低字節(jié)交換進(jìn)行測試。在PLC中,除了用Move指令進(jìn)行交換外,還可以使用循環(huán)移位指令對單字循環(huán)左移/右移8位以交換高低字節(jié),或者對雙字循環(huán)左移/右移16位以交換高低字。在一些流量積算儀中,也提供了此種功能,已方便用戶使用。
同時需要注意的是,某些流量積算儀的浮點數(shù)未必是標(biāo)準(zhǔn)的IEEE754格式,可能是其自定義的數(shù)值格式,如下圖。這時就需要我們根據(jù)其手冊,在PLC或上位機(jī)中編制對應(yīng)的轉(zhuǎn)換程序。
作者:張偉寧
推薦閱讀
數(shù)顯表與PLC串口通信調(diào)試的步驟和方法
昌暉數(shù)顯儀表與組態(tài)王工控軟件通信組態(tài)實例
共有訪客發(fā)表了評論
網(wǎng)友評論