王通過TCP與MCGS觸摸屏通訊配置與排錯(cuò))
我手上做過的泵站、水處理和幾條包裝線項(xiàng)目上位機(jī)清一色是組態(tài)王現(xiàn)場(chǎng)操作面板則基本被MCGS的TPC系列觸摸屏占滿這兩家的東西湊在一條產(chǎn)線上是常態(tài)。早年中間靠一根RS485串線硬拉碰上變頻器一開、地電位一偏通訊就開始抽風(fēng)維護(hù)工半夜打電話說畫面全是問號(hào)。后來我把能上網(wǎng)口的場(chǎng)子全改成走TCP一條網(wǎng)線過去干擾問題基本消失調(diào)試也從拿著萬用表量電壓變成了打開調(diào)試助手看報(bào)文。這篇就說清楚組態(tài)王通過TCP和MCGS觸屏通訊這件事它到底是什么、能解決哪些現(xiàn)場(chǎng)問題、從零到跑通要做哪幾步、參數(shù)怎么配、地址怎么對(duì)、壞了怎么查適合剛接手上位機(jī)聯(lián)調(diào)的朋友也適合已經(jīng)會(huì)點(diǎn)組態(tài)但被跨品牌通訊卡過的老手。1. 先把需求想清楚為什么非得讓這兩家走TCP1.1 一個(gè)典型現(xiàn)場(chǎng)上位機(jī)和觸摸屏各自為戰(zhàn)我遇到最多的場(chǎng)景是這樣的中控室里放一臺(tái)工控機(jī)跑組態(tài)王負(fù)責(zé)全廠數(shù)據(jù)匯總、報(bào)表、報(bào)警記錄和遠(yuǎn)程操作現(xiàn)場(chǎng)每臺(tái)設(shè)備旁邊裝一塊MCGS觸摸屏負(fù)責(zé)本地操作、參數(shù)設(shè)置和狀態(tài)顯示。這就帶來一個(gè)問題兩邊都要看同一批數(shù)據(jù)也得能互相下發(fā)指令。傳統(tǒng)做法是各接各的PLC組態(tài)王從PLC讀觸摸屏也從PLC讀兩條通道互不相干。聽起來挺干凈但現(xiàn)場(chǎng)一跑就露餡——兩次讀取的時(shí)間點(diǎn)不一樣中控看到的電流值和現(xiàn)場(chǎng)屏上差了半秒操作工按了屏上的啟動(dòng)中控畫面要等一兩秒才變色遇上工藝要求高的場(chǎng)合這種不同步就是事故隱患。另一種更常見的場(chǎng)景是改造老設(shè)備只有觸摸屏做本地控制甲方突然要求把數(shù)據(jù)上傳到中控。這時(shí)PLC的通訊口可能已經(jīng)被觸摸屏占死了或者PLC根本沒有空閑網(wǎng)口唯一能動(dòng)的就是觸摸屏那個(gè)網(wǎng)口。讓觸摸屏把數(shù)據(jù)轉(zhuǎn)出來給組態(tài)王是最省事的一條路。觸摸屏在這里扮演的是數(shù)據(jù)網(wǎng)關(guān)它自己跟PLC照常通訊同時(shí)開一個(gè)TCP服務(wù)端把需要共享的變量放到寄存器區(qū)里等組態(tài)王來讀。理解了這個(gè)背景就明白為什么說組態(tài)王通過TCP和MCGS觸屏通訊本質(zhì)上是解決跨品牌、跨設(shè)備的數(shù)據(jù)共享與操作同步問題。它不是簡單地連個(gè)網(wǎng)而是把兩塊原本獨(dú)立的控制系統(tǒng)拼成一張網(wǎng)。1.2 三種可行鏈路我逐個(gè)拆給你看把組態(tài)王和MCGS觸屏用TCP串起來落到實(shí)操上有三條路我按現(xiàn)場(chǎng)使用頻率從高到低排方案角色分配數(shù)據(jù)格式開發(fā)量適用場(chǎng)景Modbus TCP從站模式觸摸屏做服務(wù)端組態(tài)王做客戶端標(biāo)準(zhǔn)Modbus報(bào)文小純配置90%的常規(guī)項(xiàng)目自定義TCP透傳一方服務(wù)端一方客戶端收發(fā)原始字節(jié)自定報(bào)文中需定協(xié)議特殊數(shù)據(jù)、大數(shù)據(jù)量、私有格式中間網(wǎng)關(guān)/OPC中轉(zhuǎn)第三方軟件或網(wǎng)關(guān)做橋各自協(xié)議大多一層多品牌混雜、點(diǎn)數(shù)極多先說Modbus TCP從站模式這是我筆記本里存得最熟的一套。MCGS觸摸屏里掛一個(gè)通用TCP/IP父設(shè)備加一個(gè)ModbusTCP子設(shè)備把屏設(shè)成服務(wù)端端口默認(rèn)502屏內(nèi)部的、需要共享的變量通過通道連接掛到4區(qū)保持寄存器上。組態(tài)王那邊新建一個(gè)ModbusTCP設(shè)備IP填觸摸屏地址端口填502站號(hào)跟屏上設(shè)的從站號(hào)一致變量連到對(duì)應(yīng)的40001這類地址。整條鏈路不用寫一行代碼全靠配置穩(wěn)定性和可維護(hù)性最好。再講自定義TCP透傳。有些項(xiàng)目傳輸?shù)牟皇呛唵蔚拈_關(guān)量而是一整條工藝配方或者幾百字節(jié)的流水?dāng)?shù)據(jù)用Modbus一區(qū)一區(qū)拼會(huì)很別扭。這時(shí)候可以用MCGS的網(wǎng)口收發(fā)驅(qū)動(dòng)或者TCP/IP透傳屏和上位機(jī)之間直接收發(fā)字節(jié)流報(bào)文格式自己定比如幀頭加長度加數(shù)據(jù)加校驗(yàn)。好處是靈活壞處是協(xié)議要自己維護(hù)雙方字節(jié)序、幀同步、粘包處理都得考慮調(diào)試成本明顯上去。我一般只在Modbus實(shí)在裝不下的時(shí)候才走這條路。最后是第三方中轉(zhuǎn)。比如現(xiàn)場(chǎng)PLC是西門子的觸摸屏和PLC走的是廠商私有協(xié)議同時(shí)還要跟另外幾個(gè)品牌的設(shè)備連這時(shí)中間放一臺(tái)網(wǎng)關(guān)做協(xié)議轉(zhuǎn)換兩邊各自對(duì)接。這種方案點(diǎn)數(shù)多了以后反而清晰但多一層設(shè)備就多一個(gè)故障點(diǎn)預(yù)算也上去了。小項(xiàng)目真心不建議。提示選方案前先數(shù)清楚要共享多少點(diǎn)、是什么類型。幾十個(gè)開關(guān)量加模擬量無腦選Modbus TCP超過幾百點(diǎn)且刷新要求高再考慮透傳或網(wǎng)關(guān)。1.3 網(wǎng)絡(luò)拓?fù)浜陀布?zhǔn)備別在這步偷懶拓?fù)渖衔彝扑]星型結(jié)構(gòu)別用手拉手串著接。中控工控機(jī)、觸摸屏、PLC全接到一臺(tái)工業(yè)交換機(jī)上各占一個(gè)口。原因很簡單串著接一臺(tái)設(shè)備網(wǎng)口壞了下游全斷排查起來要命星型接法里拔掉哪根線影響誰一目了然。硬件上要留意三件事。第一觸摸屏的網(wǎng)口數(shù)量。TPC系列很多型號(hào)只有一個(gè)以太網(wǎng)口這個(gè)口如果已經(jīng)用來連PLC那它跟組態(tài)王通訊就得共用這個(gè)口屏內(nèi)部做協(xié)議轉(zhuǎn)發(fā)這是完全可行的但要確認(rèn)屏的固件和驅(qū)動(dòng)版本支持多設(shè)備并發(fā)。第二IP規(guī)劃。我習(xí)慣把觸摸屏放在100段以后的固定地址比如192.168.1.101、192.168.1.102中控工控機(jī)放192.168.1.10PLC放192.168.1.11起同一網(wǎng)段、同一子網(wǎng)掩碼255.255.255.0地址表寫在工程文檔里后期誰接手都不迷糊。第三交換機(jī)。別拿家用幾十塊的路由器湊合工業(yè)現(xiàn)場(chǎng)振動(dòng)、溫度、電磁干擾都不是消費(fèi)級(jí)設(shè)備扛得住的選帶導(dǎo)軌安裝、支持冗余電源的工業(yè)交換機(jī)幾百塊的東西能省掉無數(shù)扯皮。2. TCP通訊繞不開的基礎(chǔ)細(xì)節(jié)2.1 三次握手和長連接在組態(tài)軟件里意味著什么很多人一提到TCP就頭大其實(shí)對(duì)做組態(tài)的人來說不需要背協(xié)議規(guī)范只要理解連接是怎么建立的、什么時(shí)候斷??蛻舳税l(fā)起連接時(shí)先發(fā)一個(gè)同步包服務(wù)端回一個(gè)同步加確認(rèn)客戶端再回一個(gè)確認(rèn)這就是三次握手三下交互完鏈路才算通。之后數(shù)據(jù)就可以雙向跑了。這個(gè)動(dòng)作在Modbus TCP里就是組態(tài)王作為客戶端去連觸摸屏502端口的過程正常情況下幾十毫秒就完成。關(guān)鍵在于長連接還是短連接。Modbus TCP標(biāo)準(zhǔn)做法是長連接組態(tài)王連上觸摸屏后這條通道一直保持后續(xù)每次讀寫都在這條通道上發(fā)報(bào)文不再重復(fù)握手。長連接的好處是響應(yīng)快、開銷小壞處是一旦鏈路中間斷了比如交換機(jī)重啟、網(wǎng)線被碰掉客戶端如果不知道斷開就會(huì)一直往死連接里發(fā)數(shù)據(jù)畫面數(shù)據(jù)全部卡住不變。這就引出組態(tài)王里兩個(gè)重要參數(shù)通訊超時(shí)時(shí)間和通訊故障恢復(fù)時(shí)間。超時(shí)時(shí)間決定發(fā)出去多久沒回應(yīng)就判定為失敗我一般設(shè)1000毫秒恢復(fù)時(shí)間決定判定失敗后隔多久重試我設(shè)3000到5000毫秒。這兩個(gè)值設(shè)得太短網(wǎng)絡(luò)稍微抖一下畫面就報(bào)通訊故障、頻繁告警設(shè)得太長真斷線時(shí)半天不報(bào)警操作工看著舊數(shù)據(jù)以為是實(shí)時(shí)值這是很危險(xiǎn)的。我的經(jīng)驗(yàn)是先在現(xiàn)場(chǎng)用ping連續(xù)壓測(cè)十分鐘看平均延遲再把超時(shí)設(shè)成平均延遲的十倍左右比較穩(wěn)。注意長連接模式下現(xiàn)場(chǎng)任何一次網(wǎng)絡(luò)設(shè)備重啟都要考慮連接重建的時(shí)間。組態(tài)王一般能自動(dòng)重連但前提是這些超時(shí)和恢復(fù)參數(shù)配置合理。2.2 IP、端口和子網(wǎng)掩碼配置里最容易翻車的地方端口這塊Modbus TCP的規(guī)范端口是502觸摸屏做服務(wù)端時(shí)默認(rèn)也是502。有些現(xiàn)場(chǎng)為了避開和別的服務(wù)沖突會(huì)改成別的端口比如503、1502。一旦改了兩端必須同步改我見過不止一次只改了一頭調(diào)試半天找不到原因。還有個(gè)坑是端口占用觸摸屏或者其他設(shè)備上如果有別的程序搶占了502服務(wù)端就起不來所以屏上最好別裝無關(guān)的東西。子網(wǎng)掩碼必須兩端一致。工控機(jī)和觸摸屏都是255.255.255.0還好最怕的是現(xiàn)場(chǎng)已有網(wǎng)絡(luò)用了別的掩碼比如255.255.0.0你新加的屏按255.255.255.0配短時(shí)間ping得通跨網(wǎng)段一訪問就出問題。IP地址也要查重兩個(gè)設(shè)備撞了同一個(gè)IP現(xiàn)象是時(shí)通時(shí)不通ping丟包特別迷惑人。我現(xiàn)在的習(xí)慣是上線前拿一根網(wǎng)線單獨(dú)連屏和筆記本把地址固定好再接入主網(wǎng)絡(luò)避免跟老設(shè)備打架。還有個(gè)常被忽略的點(diǎn)觸摸屏的網(wǎng)關(guān)地址。如果中控和現(xiàn)場(chǎng)不在同一個(gè)網(wǎng)段需要跨網(wǎng)段訪問那就得給觸摸屏配網(wǎng)關(guān)指向所在網(wǎng)段的路由器地址同網(wǎng)段的話網(wǎng)關(guān)可以留空。這個(gè)配錯(cuò)了現(xiàn)象就是同網(wǎng)段能通、跨網(wǎng)段不通。網(wǎng)絡(luò)層調(diào)通之后用命令行驗(yàn)證是最快的ping 192.168.1.101 telnet 192.168.1.101 502ping通說明三層可達(dá)telnet 502能連上說明四層端口開放。兩條都過問題基本就落到應(yīng)用層配置上了這時(shí)候再去看設(shè)備地址、寄存器映射才有意義。順序反了會(huì)浪費(fèi)大量時(shí)間。2.3 寄存器地址怎么對(duì)得上號(hào)這是通訊的命門Modbus協(xié)議把數(shù)據(jù)分成四個(gè)區(qū)每個(gè)區(qū)有自己的編號(hào)段這是所有對(duì)接問題的根源也是新手最容易暈的地方區(qū)名功能地址段讀寫常見用途線圈可讀寫位00001-09999讀/寫啟停命令、開關(guān)狀態(tài)離散輸入只讀位10001-19999只讀限位、故障反饋輸入寄存器只讀字30001-39999只讀只讀的模擬量保持寄存器可讀寫字40001-49999讀/寫設(shè)定值、參數(shù)、共享數(shù)據(jù)觸摸屏這邊把變量掛到4區(qū)某個(gè)偏移上組態(tài)王那邊就要去讀同一個(gè)偏移。聽起來簡單實(shí)際最容易錯(cuò)的是偏移從0還是從1開始。有的軟件界面上寫寄存器地址填0表示第一個(gè)有的填1表示第一個(gè)兩家規(guī)則不一樣一個(gè)偏移差讀到的就是隔壁那個(gè)變量的值。我在現(xiàn)場(chǎng)的標(biāo)準(zhǔn)動(dòng)作是先在觸摸屏上做一個(gè)已知值的測(cè)試變量比如固定值1234組態(tài)王讀過來核對(duì)確認(rèn)偏移規(guī)則再把真實(shí)變量批量掛上去。這一步花十分鐘能省下后面幾小時(shí)的排查。還有個(gè)隱患是數(shù)據(jù)長度和字序。一個(gè)寄存器是16位能裝0到65535的整數(shù)但實(shí)際項(xiàng)目里的流量、溫度經(jīng)常是小數(shù)需要32位浮點(diǎn)甚至32位整數(shù)占兩個(gè)寄存器。這時(shí)就涉及高低字順序問題同樣的浮點(diǎn)數(shù)一方按高字在前存一方按低字在前讀結(jié)果就是一個(gè)天文數(shù)字。組態(tài)王和MCGS在這方面都提供字序選項(xiàng)對(duì)接前必須確認(rèn)。我的土辦法是寫一個(gè)固定值像12.5進(jìn)去兩邊讀出來一對(duì)對(duì)不上就調(diào)字序或者勾字節(jié)交換對(duì)上為止。3. MCGS觸摸屏側(cè)把它配成一個(gè)合格的TCP服務(wù)端3.1 先建工程把網(wǎng)口參數(shù)固定下來打開MCGS組態(tài)環(huán)境新建工程選擇匹配的TPC型號(hào)。工程建好后第一件事是設(shè)置屏本身的網(wǎng)絡(luò)參數(shù)位置一般在系統(tǒng)參數(shù)或設(shè)備屬性里的網(wǎng)絡(luò)設(shè)置頁IP地址、子網(wǎng)掩碼、網(wǎng)關(guān)按第2章規(guī)劃好的填進(jìn)去。這一步其實(shí)改的是觸摸屏操作系統(tǒng)的網(wǎng)絡(luò)配置跟工程是綁定的工程下載后生效。這里有個(gè)細(xì)節(jié)值得說改完網(wǎng)絡(luò)參數(shù)一定要重新下載工程并重啟屏有時(shí)候在線改完當(dāng)時(shí)能用一斷電重啟又回舊參數(shù)就是因?yàn)閰?shù)沒寫進(jìn)工程文件。我吃過這個(gè)虧現(xiàn)場(chǎng)調(diào)了半天第二天開機(jī)全崩后來養(yǎng)成習(xí)慣——所有網(wǎng)絡(luò)參數(shù)改動(dòng)都走工程下載流程不用在線調(diào)試窗口的臨時(shí)修改。默認(rèn)通訊端口保持502除非有明確理由才改。屏上如果有多個(gè)物理網(wǎng)口或者支持?jǐn)U展模塊要確認(rèn)服務(wù)端綁定在哪個(gè)口上別連到空閑口還納悶為什么不通。3.2 設(shè)備窗口掛通用TCP/IP父設(shè)備再掛ModbusTCP子設(shè)備這是MCGS側(cè)的核心配置步驟邏輯是父設(shè)備負(fù)責(zé)底層TCP鏈路子設(shè)備負(fù)責(zé)Modbus協(xié)議解析。在設(shè)備窗口里雙擊打開先添加一個(gè)通用TCP/IP父設(shè)備雙擊它的屬性把工作模式選成TCP服務(wù)器也就是服務(wù)端本地IP填屏自己的地址端口填502。工作模式這里要特別注意很多人稀里糊涂選了客戶端結(jié)果變成屏主動(dòng)去連別的設(shè)備組態(tài)王這邊就更連不上兩頭都等在原地。父設(shè)備配好之后在它下面添加子設(shè)備選ModbusTCP或者M(jìn)odbus RTU/TCP這類驅(qū)動(dòng)。子設(shè)備屬性里通常要填從站地址這個(gè)地址是邏輯站號(hào)屏自己做服務(wù)端時(shí)也要給它分配一個(gè)站號(hào)一般填1也有的驅(qū)動(dòng)叫設(shè)備地址或者主機(jī)地址。組態(tài)王那邊讀的時(shí)候設(shè)備地址填的必須跟這里一致否則請(qǐng)求發(fā)出去了服務(wù)端不認(rèn)這個(gè)站號(hào)直接不響應(yīng)。采集周期和通訊等待時(shí)間這兩個(gè)參數(shù)也別忽略。采集周期決定觸摸屏內(nèi)部多久刷新一次這些共享數(shù)據(jù)設(shè)50到200毫秒比較常見等待時(shí)間設(shè)太長會(huì)拖慢響應(yīng)設(shè)太短網(wǎng)絡(luò)稍微抖一下就超時(shí)報(bào)錯(cuò)。我一般采集周期100毫秒起步根據(jù)實(shí)際數(shù)據(jù)量和網(wǎng)絡(luò)負(fù)載再微調(diào)。提示如果現(xiàn)場(chǎng)要求觸摸屏主動(dòng)把數(shù)據(jù)推給上位機(jī)反過來把屏設(shè)成客戶端、組態(tài)王側(cè)開服務(wù)端也可以。角色可以互換核心是兩端角色必須一客一服不能都當(dāng)服務(wù)端干等。3.3 通道連接把屏里的變量一個(gè)個(gè)掛到寄存器上設(shè)備掛好只是打通了鏈路真正把數(shù)據(jù)放上去靠的是通道連接。在實(shí)時(shí)數(shù)據(jù)庫里先定義好要共享的變量類型分開關(guān)型和數(shù)值型。然后回到設(shè)備窗口雙擊ModbusTCP子設(shè)備進(jìn)入通道連接界面把變量一個(gè)個(gè)連到寄存器地址上。操作上選一個(gè)變量給它指定4區(qū)地址比如40001。注意界面上通常讓你填的是一段地址加上偏移比如選4區(qū)偏移填0對(duì)應(yīng)40001。前面說的偏移從0還是從1的坑就在這。我的做法是在4區(qū)最前面留出一片測(cè)試區(qū)比如40001到40010先把這一批固定值變量掛上確認(rèn)映射無誤后再掛真實(shí)業(yè)務(wù)變量最后把測(cè)試區(qū)清掉。這樣邏輯清晰、返工少。掛完變量把工程下載到觸摸屏重啟后服務(wù)端就起來了。這時(shí)候別急著去配組態(tài)王先在電腦上驗(yàn)證一下——這是我在3.4節(jié)要說的。3.4 用調(diào)試助手先自測(cè)能少走一大半彎路屏端配完我強(qiáng)烈建議先拿一個(gè)Modbus調(diào)試工具做單側(cè)驗(yàn)證。這類工具M(jìn)odbus Poll、Modbus Slave、各種Modbus客戶端工具在電腦上跑填屏的IP、端口、站號(hào)直接去讀40001那片測(cè)試區(qū)。能讀到值說明屏端服務(wù)端、寄存器映射、網(wǎng)絡(luò)鏈路三樣都對(duì)問題不在屏這邊。讀不到或者讀出來是異常碼就按這個(gè)順序排查先確認(rèn)IP和端口通不通再看站號(hào)對(duì)不對(duì)再看偏移規(guī)則最后看寄存器區(qū)選得對(duì)不對(duì)比如錯(cuò)選了3區(qū)。整個(gè)排查過程不到半小時(shí)比直接兩邊一起調(diào)高效得多。自測(cè)還有一個(gè)額外好處能看到報(bào)文原始內(nèi)容。工具里一般有報(bào)文顯示窗口你能看到請(qǐng)求幀是03功能碼讀保持寄存器、起始地址、數(shù)量響應(yīng)幀里跟著數(shù)據(jù)和CRC。這在你后面排查組態(tài)王讀取異常時(shí)非常有用因?yàn)閮蛇呭e(cuò)誤現(xiàn)象經(jīng)常長得一樣只有看報(bào)文才能區(qū)分到底是誰的問題。4. 組態(tài)王側(cè)建工程、裝驅(qū)動(dòng)、連設(shè)備4.1 6.55和7.5版本裝驅(qū)動(dòng)的路子不太一樣組態(tài)王版本是個(gè)不能忽略的變量。6.55和7.5在驅(qū)動(dòng)管理和安裝方式上差別挺明顯我兩種都用過提醒幾點(diǎn)。6.55時(shí)代驅(qū)動(dòng)安裝用的是設(shè)備安裝向?qū)ǔT陂_始菜單或者工程目錄下有個(gè)專門的安裝工具選驅(qū)動(dòng)目錄按提示走裝完重啟工程才能看到新設(shè)備。7.5把這塊整合成了設(shè)備安裝工具界面更規(guī)整支持驅(qū)動(dòng)包批量安裝也能看到已安裝驅(qū)動(dòng)的清單裝完同樣建議重啟軟件讓驅(qū)動(dòng)生效。另一個(gè)差異是變量詞典和新建工程的操作路徑略有調(diào)整7.5對(duì)大數(shù)據(jù)量工程的響應(yīng)的確好一些但界面變化讓習(xí)慣了6.55的人一時(shí)摸不著北。我的建議是如果甲方用哪個(gè)版本你就用哪個(gè)版本調(diào)試別為了順手換個(gè)版本導(dǎo)致現(xiàn)場(chǎng)工程打不開或者驅(qū)動(dòng)不匹配那才是真麻煩。驅(qū)動(dòng)裝完在設(shè)備窗口里新建設(shè)備選PLC大類下的Modbus再選ModbusTCP這一項(xiàng)。名字自己起一個(gè)清楚的比如MCGS屏1方便后面維護(hù)。設(shè)備地址填邏輯站號(hào)和第3章屏端設(shè)的從站號(hào)一致。通訊參數(shù)里填觸摸屏的IP地址和端口502。4.2 設(shè)備屬性里的參數(shù)哪些必須對(duì)設(shè)備配好后右側(cè)屬性欄有一堆參數(shù)我挑幾個(gè)關(guān)鍵的講。通訊超時(shí)和故障恢復(fù)時(shí)間按第2.1節(jié)的經(jīng)驗(yàn)值設(shè)。這里還有嘗試恢復(fù)次數(shù)采集頻率之類的項(xiàng)。采集頻率決定了組態(tài)王多久輪詢一次這個(gè)設(shè)備設(shè)100毫秒意味著每秒讀10次點(diǎn)數(shù)多的時(shí)候這個(gè)值會(huì)影響CPU和網(wǎng)絡(luò)負(fù)載。現(xiàn)場(chǎng)幾十個(gè)點(diǎn)的項(xiàng)目500毫秒到1秒就夠了那種幾十毫秒的要求往往是把節(jié)奏設(shè)得太緊張實(shí)際對(duì)工藝沒有任何意義反而增加誤報(bào)概率。IP地址和端口必須是屏的實(shí)際地址站號(hào)必須和屏端一致。這三樣只要有一個(gè)錯(cuò)現(xiàn)象都是通訊失敗或讀不到數(shù)據(jù)很難靠猜區(qū)分所以我在設(shè)備屬性里會(huì)加備注把這三項(xiàng)寫在工程文檔里后期交接省事。4.3 數(shù)據(jù)詞典變量類型和地址要一一對(duì)應(yīng)設(shè)備配好接下來建變量。在數(shù)據(jù)詞典里新建變量每個(gè)變量都要指定類型和連接設(shè)備。類型上開關(guān)量選離散或者位型模擬量選整型、浮點(diǎn)等。連接設(shè)備選剛才建的那個(gè)ModbusTCP設(shè)備連接項(xiàng)里填寄存器地址。組態(tài)王里Modbus驅(qū)動(dòng)的寄存器地址一般寫作40001這一類的形式或者分區(qū)間填偏移具體看驅(qū)動(dòng)版本——有的版本讓你先在連接項(xiàng)里選區(qū)域再填偏移數(shù)字。這里再強(qiáng)調(diào)一次偏移規(guī)則一定要和屏端對(duì)齊。最穩(wěn)妥的驗(yàn)證方法還是在4區(qū)開頭留測(cè)試變量兩邊讀一次對(duì)一次。變量名我習(xí)慣用設(shè)備含義的格式比如M1_Start、M1_Current一方面自己看著清楚另一方面批量建變量時(shí)不容易串行。變量描述這一欄別嫌麻煩寫上中文含義和量程運(yùn)行調(diào)試時(shí)鼠標(biāo)懸停就能看到查問題特別快。對(duì)于32位數(shù)據(jù)變量類型要選對(duì)應(yīng)的長整型或浮點(diǎn)同時(shí)注意字序設(shè)置跟屏端確認(rèn)清楚。前面說過用固定值驗(yàn)證這里同樣適用——建一個(gè)浮點(diǎn)變量連到屏上的浮點(diǎn)測(cè)試變量比對(duì)數(shù)值對(duì)不上就調(diào)字序。4.4 畫面綁定和運(yùn)行調(diào)試變量建好最后一步是把它們拖到畫面上燈、按鈕、數(shù)值顯示、趨勢(shì)曲線想怎么用怎么用。運(yùn)行一下看數(shù)值是不是實(shí)時(shí)跳動(dòng)、按鈕下發(fā)是不是立即生效。我在這一步會(huì)做兩件驗(yàn)收一是操作回路閉環(huán)在組態(tài)王畫面上點(diǎn)一個(gè)按鈕看觸摸屏上對(duì)應(yīng)的指示燈和屏上真實(shí)設(shè)備的反應(yīng)對(duì)不對(duì)確認(rèn)下行數(shù)據(jù)真的到了二是數(shù)據(jù)一致性同一時(shí)刻對(duì)比中控畫面和現(xiàn)場(chǎng)觸摸屏上的同一個(gè)數(shù)值差個(gè)一兩百毫秒正常差一大截就有問題。跑通之后別急著收工做一次斷電重啟測(cè)試。工控機(jī)重啟、觸摸屏重啟、交換機(jī)重啟各種情況都試一遍觀察恢復(fù)時(shí)間和數(shù)據(jù)是否正確。很多工程是當(dāng)時(shí)能跑一斷電就傻眼提前測(cè)出來能避免后面的檢修夜戰(zhàn)。5. 聯(lián)調(diào)現(xiàn)場(chǎng)那些年踩過的坑和排查套路5.1 常見問題速查表我把這些年現(xiàn)場(chǎng)遇到的典型問題整理成一張表按現(xiàn)象查原因比一條條翻手冊(cè)快得多現(xiàn)象可能原因排查動(dòng)作組態(tài)王提示通訊失敗IP錯(cuò)、端口錯(cuò)、站號(hào)不一致ping通后telnet端口核對(duì)站號(hào)ping通但連不上502屏端服務(wù)端沒起來或模式選成了客戶端看屏端設(shè)備屬性工作模式讀到恒定0或65535偏移錯(cuò)、變量未掛載、數(shù)據(jù)未刷新用調(diào)試工具單獨(dú)讀屏端驗(yàn)證浮點(diǎn)數(shù)讀出來是天文數(shù)字32位字序不匹配固定值測(cè)試調(diào)字序或勾字節(jié)交換數(shù)據(jù)時(shí)通時(shí)斷、ping丟包IP沖突、網(wǎng)線接觸不良、干擾查IP表換根好網(wǎng)線看交換機(jī)燈畫面數(shù)據(jù)不跳動(dòng)組態(tài)王采集頻率為0或被禁用檢查設(shè)備屬性與變量連接狀態(tài)按鈕下發(fā)無效寫到只讀區(qū)、地址寫反確認(rèn)寫到4區(qū)且地址與屏端一致斷電重啟后參數(shù)丟失網(wǎng)絡(luò)參數(shù)未下載進(jìn)工程用工程下載方式而不是在線臨時(shí)改這張表貼在我的工具箱蓋子上十年了還在用。5.2 抓包到底看什么別被滿屏報(bào)文嚇到第一次抓報(bào)文的人通常會(huì)被密密麻麻的十六進(jìn)制搞暈其實(shí)只要抓住幾個(gè)點(diǎn)就能定位問題。用Wireshark這類工具在工控機(jī)上抓過濾條件只留屏的IP和502端口剩下的幀就不多了??词裁聪瓤从袥]有三次握手。如果只看到工控機(jī)反復(fù)發(fā)同步包屏不回那問題在網(wǎng)絡(luò)層或屏端服務(wù)端沒起來應(yīng)用層配置不用看了。如果握手成功再找Modbus請(qǐng)求幀和響應(yīng)幀。請(qǐng)求幀里會(huì)帶功能碼、起始地址、寄存器數(shù)量響應(yīng)幀跟著數(shù)據(jù)。請(qǐng)求發(fā)了但沒響應(yīng)說明屏端沒處理或者站號(hào)不認(rèn)響應(yīng)里帶異常碼功能碼最高位置1說明屏端理解請(qǐng)求但拒絕執(zhí)行通常是地址越界或不允許的功能。還有個(gè)直觀的指標(biāo)是響應(yīng)時(shí)間。正常情況下響應(yīng)在幾十毫秒內(nèi)如果經(jīng)常幾百毫秒甚至超時(shí)就要考慮是不是點(diǎn)數(shù)太多、采集頻率太高或者屏端CPU忙于處理本地邏輯顧不上應(yīng)答??吹竭@種規(guī)律性的慢響應(yīng)先把采集頻率降下來試試往往立竿見影。注意抓包工具本身對(duì)網(wǎng)絡(luò)有額外負(fù)載抓包時(shí)間別太長尤其在生產(chǎn)網(wǎng)絡(luò)里抓到關(guān)鍵幀就停別長時(shí)間跑著。5.3 幾個(gè)容易忽略的細(xì)節(jié)坑網(wǎng)線質(zhì)量。這個(gè)看起來是廢話但真的有人拿一根壓得松松的水晶頭網(wǎng)線接生產(chǎn)設(shè)備跑兩天丟一次包。工業(yè)環(huán)境我建議用帶屏蔽層的成品網(wǎng)線超五類以上長度別超過交換機(jī)到設(shè)備的最遠(yuǎn)距離一般控制在80米以內(nèi)超過就考慮加交換機(jī)或換成光纖。交換機(jī)端口速率協(xié)商。老交換機(jī)跟新觸摸屏之間偶爾會(huì)協(xié)商出半雙工或者10兆這種低速模式現(xiàn)象是能通但丟包、延遲大。表現(xiàn)異常的時(shí)候去交換機(jī)管理界面看看端口狀態(tài)必要時(shí)手工鎖定速率和雙工模式。防火墻和殺毒軟件。上位機(jī)裝了防火墻出站連接看似不受限但很多安全管理軟件會(huì)攔截未知程序的網(wǎng)絡(luò)訪問。組態(tài)王進(jìn)程和調(diào)試工具都加進(jìn)白名單。這條在專網(wǎng)里也要注意別以為內(nèi)網(wǎng)就沒人管。多個(gè)上位機(jī)同時(shí)讀一塊屏。Modbus TCP理論上支持多個(gè)客戶端但觸摸屏的處理能力有限兩三個(gè)客戶端還行七八個(gè)同時(shí)輪詢屏就喘了。真有多客戶端需求考慮用網(wǎng)關(guān)或者讓組態(tài)王做一次匯聚再分發(fā)。6. 讓它長跑穩(wěn)定刷新、心跳和后期擴(kuò)展6.1 心跳和斷線重連寫給長時(shí)間運(yùn)行的工程一臺(tái)屏掛在那里跑幾年中間網(wǎng)絡(luò)波動(dòng)、交換機(jī)重啟、電源閃斷都會(huì)發(fā)生穩(wěn)定性靠的不是不出事而是出事了能自己恢復(fù)。Modbus TCP長連接本身不帶心跳機(jī)制靠的是組態(tài)王按采集頻率不斷發(fā)請(qǐng)求服務(wù)器斷線后請(qǐng)求超時(shí)客戶端判定失敗并進(jìn)入重連流程恢復(fù)時(shí)間參數(shù)決定重連間隔。我在實(shí)際工程里會(huì)把恢復(fù)時(shí)間設(shè)成3到5秒不要太急頻繁重連會(huì)給屏和交換機(jī)增加沒必要負(fù)擔(dān)也不要太長半分鐘以上就影響操作了。另外重要變量在畫面上加通訊狀態(tài)指示燈。組態(tài)王里可以定義一個(gè)讀取設(shè)備通訊狀態(tài)的變量一旦斷線它能報(bào)警操作工知道數(shù)據(jù)不可信這比默默顯示舊值安全得多。6.2 刷新周期別貪快夠用就行觸摸屏的CPU算力就那么點(diǎn)既要處理本地畫面和邏輯又要響應(yīng)上位機(jī)輪詢。采集頻率設(shè)太低數(shù)值小、頻率高比如設(shè)成20毫秒屏端每秒要處理50次請(qǐng)求幾百個(gè)點(diǎn)堆上去屏自己都會(huì)卡。我通常按數(shù)據(jù)重要性分級(jí)關(guān)鍵的啟停狀態(tài)、報(bào)警位設(shè)200到500毫秒溫度、液位這類慢變量設(shè)1秒報(bào)表用的累計(jì)量2到5秒都無所謂。分級(jí)之后整體負(fù)載降一大截實(shí)時(shí)數(shù)據(jù)也夠用。6.3 點(diǎn)數(shù)漲了、屏多了怎么擴(kuò)展單屏單上位機(jī)跑順以后項(xiàng)目往往會(huì)往上長一臺(tái)工控機(jī)要看十幾塊屏或者現(xiàn)場(chǎng)又加了幾條線。這時(shí)候有幾點(diǎn)建議。一是分組輪詢組態(tài)王里把不同觸摸屏配成不同設(shè)備各自獨(dú)立的采集頻率避免一塊慢拖累全部。二是地址規(guī)劃要提前做多屏之間不要用同樣的寄存器號(hào)亂映射最好每個(gè)屏對(duì)應(yīng)一塊地址段或者按屏號(hào)統(tǒng)一命名后期維護(hù)才不至于抓瞎。三是考慮統(tǒng)一數(shù)據(jù)出口如果將來還要對(duì)接MES或更大的平臺(tái)可以讓組態(tài)王作為匯聚點(diǎn)再往上走一層接口而不是讓每塊屏都對(duì)外單開通道那樣會(huì)成倍增加管理和安全負(fù)擔(dān)?;氐阶畛跄莻€(gè)問題——組態(tài)王和MCGS觸摸屏通過TCP對(duì)接說到底就是用標(biāo)準(zhǔn)協(xié)議把兩臺(tái)各司其職的設(shè)備連成一條數(shù)據(jù)通路難點(diǎn)不在協(xié)議本身而在細(xì)節(jié)地址對(duì)齊、字序、超時(shí)、網(wǎng)絡(luò)規(guī)劃每一項(xiàng)都平平無奇但每一項(xiàng)都能讓你在深夜的現(xiàn)場(chǎng)多待兩小時(shí)。我現(xiàn)在的習(xí)慣是每次新項(xiàng)目先在實(shí)驗(yàn)臺(tái)上用小規(guī)模把這三關(guān)過一遍再上現(xiàn)場(chǎng)批量配置這個(gè)流程幫我省下的返工時(shí)間比任何技巧都實(shí)在。