戰(zhàn))
??狄曈X通訊配置中TCP和Modbus協(xié)議是最容易讓現(xiàn)場工程師頭疼的兩塊。我調(diào)試過不少視覺項目發(fā)現(xiàn)一個規(guī)律拍照、打光、算法模型大家七七八八都能調(diào)通但真正在產(chǎn)線上拖后腿的往往是視覺結(jié)果怎么給到PLC這一步。TCP連不上、Modbus讀出來全是0、數(shù)據(jù)錯位、連接閃斷這些問題隨便來一個就能讓現(xiàn)場調(diào)試從半小時變成兩天。這篇文章以海康威視視覺控制器mv-vb2100-120g為例把TCP和Modbus通訊的配置思路、幀格式設(shè)計、排錯鏈路一次說清楚適合正在做視覺集成、現(xiàn)場調(diào)試、設(shè)備通訊對接的工程師收藏參考。先說一個容易忽略的事實(shí)視覺控制器本質(zhì)上就是一臺工業(yè)電腦。它內(nèi)部跑的是算法和通訊服務(wù)對外需要和PLC、機(jī)器人、上位機(jī)軟件交換數(shù)據(jù)。mv-vb2100-120g這類型號網(wǎng)口、串口、IO、USB都齊全但真正讓項目和產(chǎn)線轉(zhuǎn)起來的是TCP和Modbus這兩條數(shù)據(jù)通路。下面我按實(shí)際項目推進(jìn)的順序來拆解。1. 視覺控制器在自動化閉環(huán)里的真實(shí)定位1.1 從拍照-判斷-輸出看通訊需求一套典型的視覺檢測系統(tǒng)表面上干的活是相機(jī)拍照算法判斷但放到整個自動化產(chǎn)線里它只是閉環(huán)中的一個環(huán)節(jié)。上游PLC給出觸發(fā)信號視覺控制器收到信號后拍照算法跑完得出OK或NG結(jié)論再把結(jié)論送回去給PLCPLC根據(jù)結(jié)果控制氣缸、機(jī)械臂或分選機(jī)構(gòu)動作。如果最后這一步把結(jié)論送回去做不好前面算法再準(zhǔn)也沒用。這就是通訊配置最核心的訴求建立一條可靠的、實(shí)時的、格式清晰的數(shù)據(jù)通道。mv-vb2100-120g這類控制器通常會提供多個網(wǎng)口一個接工業(yè)相機(jī)另一個接PLC或交換機(jī)。在VisionMaster或者??档耐ㄓ嵟渲媒缑胬锬憧梢赃x擇走TCP、Modbus、Profinet、EtherNet/IP等不同協(xié)議。但對大多數(shù)項目來說最通用、最容易調(diào)通的就是TCP Socket和Modbus TCP。1.2 為什么不是每家都直接用Profinet不少電氣工程師會問為什么不用Profinet西門子PLC和發(fā)那科機(jī)器人、小原焊機(jī)控制器之間走Profinet確實(shí)很順因?yàn)檫@些都是PLC生態(tài)圈里的主流品牌。但視覺控制器不一樣??悼刂破鲀?nèi)置的Profinet從站功能受軟件授權(quán)、固件版本、組態(tài)工具限制而且現(xiàn)場還要在博圖里導(dǎo)GSD文件、分配IO地址、處理一致性數(shù)據(jù)。一套操作下來沒半天時間很難調(diào)順。TCP和Modbus TCP的優(yōu)勢非常明顯對比維度TCP SocketModbus TCPProfinet IO實(shí)現(xiàn)難度低任意語言寫Socket即可低PLC側(cè)有現(xiàn)成指令高需要組態(tài)和授權(quán)通用性所有設(shè)備都支持幾乎所有PLC都支持西門子生態(tài)內(nèi)通用實(shí)時性取決于網(wǎng)絡(luò)和程序輪詢模式一般夠用硬實(shí)時適合運(yùn)動控制數(shù)據(jù)語義自定義幀格式自由度高標(biāo)準(zhǔn)寄存器模型語義固定標(biāo)準(zhǔn)化IO映射調(diào)試成本低抓包就能看低Modbus Poll即可高需要博圖、GSD、Wireshark所以我個人判斷是除非客戶明確指定Profinet或者現(xiàn)場設(shè)備清單里全是Profinet設(shè)備否則先用Modbus TCP把項目跑起來永遠(yuǎn)是最穩(wěn)妥的路。TCP Socket適合做視覺主動上報、結(jié)果推送、自定義協(xié)議交互Modbus TCP適合做PLC周期輪詢、讀寄存器這種標(biāo)準(zhǔn)的工業(yè)數(shù)據(jù)交換。兩種各司其職下面分別展開。2. 硬件準(zhǔn)備與IP規(guī)劃mv-vb2100-120g的通訊拓?fù)?.1 雙網(wǎng)口的分工怎么定mv-vb2100-120g這類視覺控制器網(wǎng)口不是用來賣的每個口都有明確的用途。通常第一個網(wǎng)口建議接工業(yè)相機(jī)因?yàn)閳D像數(shù)據(jù)流量大走獨(dú)立的物理網(wǎng)段能避免和PLC控制報文互相干擾。第二個網(wǎng)口用來做設(shè)備通訊接交換機(jī)或直接接PLC。如果現(xiàn)場只有一臺相機(jī)、一個PLC兩個網(wǎng)口分開用就是最干凈的拓?fù)?。但?shí)際很多項目并沒有這么理想。比如控制器只有單網(wǎng)口相機(jī)用的是USB3.0接口那你只能用一個網(wǎng)口同時跑圖像和通訊。這種情況下盡量把相機(jī)和PLC放到同一個交換機(jī)上通過交換機(jī)端口隔離或VLAN劃分來減少廣播沖擊。千萬別讓相機(jī)數(shù)據(jù)和Modbus TCP在同一個物理鏈路上裸奔幀沖突和延遲會讓你懷疑人生。接線方面mv-vb2100-120g的網(wǎng)口都是RJ45用工業(yè)級超五類或六類屏蔽網(wǎng)線兩端做好接地。插座、接線端子這些看起來和通訊無關(guān)的東西反而經(jīng)常是現(xiàn)場干擾的源頭。2.2 IP段規(guī)劃與防火墻放行通訊第一件事就是IP規(guī)劃。??狄曈X控制器默認(rèn)IP可能是192.168.1.64之類的固定地址PLC和上位機(jī)必須和它在同一網(wǎng)段才能通訊。我一般這樣規(guī)劃設(shè)備IP地址作用mv-vb2100-120g通訊口192.168.1.10作為TCP Server、Modbus TCP ServerPLC以太網(wǎng)口192.168.1.20主動連接視覺控制器上位機(jī)調(diào)試電腦192.168.1.100安裝視覺軟件、Modbus Poll、Wireshark調(diào)試相機(jī)網(wǎng)口獨(dú)立網(wǎng)段192.168.2.x與通訊網(wǎng)段完全隔離這里有個容易被坑的細(xì)節(jié)??狄曈X控制器如果開了多個服務(wù)比如同時開了TCP Server、Modbus TCP Server和SDK通訊服務(wù)不同服務(wù)綁定不同端口IP和端口一定不要寫混。另外控制器如果是Windows或Linux系統(tǒng)操作系統(tǒng)防火墻默認(rèn)會攔截外部連接必須手動放行對應(yīng)端口。以Linux系統(tǒng)為例CentOS下開放TCP端口用firewall-cmd# 開放Modbus TCP默認(rèn)端口502 firewall-cmd --permanent --add-port502/tcp # 開放自定義TCP通訊端口例如8000 firewall-cmd --permanent --add-port8000/tcp # 重新加載防火墻規(guī)則 firewall-cmd --reload # 查看端口是否已放行 firewall-cmd --list-portsWindows系統(tǒng)則在防火墻高級設(shè)置里添加入站規(guī)則放行指定TCP端口。很多人調(diào)不通通訊第一反應(yīng)是程序?qū)戝e了其實(shí)是防火墻把端口擋了白白排查半天。還有一個端口坑就是啟動服務(wù)時報錯error: listen tcp 127.0.0.1:11434: bind: only one usage of each socket address。這個錯誤翻譯過來就是端口被占用同一個IP和端口只能被一個進(jìn)程監(jiān)聽。我在現(xiàn)場遇到過視覺調(diào)試軟件和自寫的通訊服務(wù)同時搶一個端口后啟動的一方直接報bind失敗。解決方法是先用netstat查端口占用netstat -ano | grep 11434或者Windows下netstat -ano | findstr 11434拿到PID后在任務(wù)管理器里結(jié)束對應(yīng)進(jìn)程或者改到一個沒人占用的端口。3. TCP通訊實(shí)戰(zhàn)從握手機(jī)制到自定義報文3.1 三次握手與四次揮手在視覺通訊中的意義TCP通訊的本質(zhì)是建立一條可靠的字節(jié)流通道。為什么叫可靠因?yàn)檫B接建立前有三次握手?jǐn)嚅_時有四次揮手。三次握手的過程是客戶端先發(fā)SYN服務(wù)端回應(yīng)SYNACK客戶端再回ACK。這保證了雙方都確認(rèn)對方能收到自己的數(shù)據(jù)通道才算建立。這套機(jī)制放在視覺通訊里非常實(shí)用。PLC作為客戶端視覺控制器作為服務(wù)端每次連接建立后雙方都知道鏈路是通的發(fā)送的結(jié)果數(shù)據(jù)不會丟。但代價是建立連接是有開銷的。一次握手至少一個RTT往返時間如果產(chǎn)線節(jié)拍是每秒檢測10個產(chǎn)品每次檢測都重新建連握手、揮手、再握手時序會非常尷尬。所以真正的視覺項目里連接建立策略必須清晰見3.2。3.2 長連接和短連接怎么選短連接適合什么場景手動調(diào)試、單次測試、低頻查詢。比如你在電腦上寫一個小工具連上海康控制器讀一次當(dāng)前結(jié)果然后斷開這種用短連接沒問題。Windows的telnet、Modbus Poll默認(rèn)也是短連接風(fēng)格。長連接適合什么場景產(chǎn)線連續(xù)運(yùn)行、高頻檢測、視覺結(jié)果實(shí)時上報。生產(chǎn)線節(jié)拍通常幾百毫秒到幾秒一個產(chǎn)品視覺控制器每拍完一個就主動把結(jié)果推給PLC或者PLC周期性地來讀。如果用短連接假設(shè)一次建連耗時幾十毫秒節(jié)拍300毫秒的項目直接報廢。所以我強(qiáng)烈建議產(chǎn)線正式運(yùn)行一律用長連接。視覺控制器作為Server常駐監(jiān)聽PLC或上位機(jī)啟動時建立連接運(yùn)行時保持不斷開數(shù)據(jù)在已有連接上持續(xù)傳輸。如果連接斷了客戶端要做自動重連服務(wù)端要做好舊連接清理。長連接最怕的是連接假活。雙方看似連著但長時間沒有數(shù)據(jù)中間防火墻或交換機(jī)把空閑連接回收了。解決方式有兩種應(yīng)用層心跳包每隔1-2秒發(fā)一個心跳命令或者啟用TCP KeepAlive在Socket上設(shè)置?;顓?shù)。工業(yè)現(xiàn)場我推薦心跳包因?yàn)镵eepAlive默認(rèn)2小時才檢測一次不適合快速感知斷線。3.3 視覺報文的幀格式設(shè)計TCP是字節(jié)流協(xié)議沒有天然的消息邊界所以應(yīng)用層必須自己定義幀格式。如果不上報文協(xié)議直接發(fā)一串OK、一串NGPLC收到后沒法判斷數(shù)據(jù)從哪里開始、到哪里結(jié)束多個視覺結(jié)果擠在一起還會粘包。我常用的做法是設(shè)計一套固定格式的報文頭大致如下字節(jié)偏移字段長度說明0幀頭2字節(jié)固定0xAA 0x552命令字1字節(jié)0x01查詢0x02結(jié)果通知0x03心跳3數(shù)據(jù)長度2字節(jié)后面數(shù)據(jù)區(qū)字節(jié)數(shù)5結(jié)果數(shù)據(jù)N字節(jié)例如1字節(jié)結(jié)果碼4字節(jié)時間戳末尾校驗(yàn)1字節(jié)從幀頭到數(shù)據(jù)區(qū)所有字節(jié)異或或CRC數(shù)據(jù)長度字段是解決粘包和半包問題的關(guān)鍵。接收方先讀6個字節(jié)解析出數(shù)據(jù)長度N再讀N個字節(jié)湊成一個完整幀如果緩沖不夠就繼續(xù)等待這就是緩存解析狀態(tài)機(jī)。舉一個最簡單的結(jié)果通知幀AA 55 02 02 00 01 01 03解釋AA 55是幀頭02是結(jié)果通知命令02 00表示后面跟2個字節(jié)數(shù)據(jù)數(shù)據(jù)區(qū)是0x01OK結(jié)果碼和0x01檢測質(zhì)量分最后一個0x03是前面所有字節(jié)的異或校驗(yàn)。PLC拿到后通過命令字判斷是結(jié)果幀再提取結(jié)果碼。3.4 Python Socket實(shí)現(xiàn)海康視覺結(jié)果主動上報??狄曈X控制器上如果跑的是Linux系統(tǒng)或Windows帶Python環(huán)境可以直接用Python寫一個簡單的TCP服務(wù)端把視覺結(jié)果推送給PLC。下面是一個最小可用的示例import socket import time import struct def build_frame(cmd, result_code, quality): data bytes([result_code, quality]) length len(data) header b\xAA\x55 bytes([cmd]) struct.pack(!H, length) frame header data checksum 0 for b in frame: checksum ^ b return frame bytes([checksum]) def main(): server socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((0.0.0.0, 8000)) server.listen(5) print(TCP Server started at port 8000) conn, addr server.accept() print(Client connected:, addr) while True: # 模擬視覺檢測結(jié)果 result_code 0x01 if time.time() % 2 1 else 0x02 quality 1 frame build_frame(0x02, result_code, quality) conn.send(frame) print(Sent result:, hex(result_code)) time.sleep(0.5) if __name__ __main__: main()這里用SO_REUSEADDR是為了解決服務(wù)端重啟時端口被TIME_WAIT狀態(tài)占用的報錯。之前講的bind錯誤很多就是沒有設(shè)置這個選項導(dǎo)致的。PLC側(cè)作為客戶端建立連接后持續(xù)收幀按幀頭、命令字、長度、數(shù)據(jù)、校驗(yàn)解析即可。這套方案的優(yōu)勢是協(xié)議完全可控視覺結(jié)果可以主動推送給PLCPLC不用頻繁輪詢節(jié)省了PLC的通訊負(fù)載。4. Modbus TCP配置讓PLC能直接讀懂視覺結(jié)果4.1 Modbus TCP的核心概念與數(shù)據(jù)模型Modbus TCP是工業(yè)領(lǐng)域最通用的協(xié)議之一本質(zhì)上就是把Modbus RTU的協(xié)議數(shù)據(jù)單元封裝在TCP/IP之上。默認(rèn)端口是502。它的數(shù)據(jù)模型有四個區(qū)域線圈Coil位讀寫、離散輸入Discrete Input位只讀、保持寄存器Holding Register字讀寫、輸入寄存器Input Register字只讀。視覺檢測結(jié)果通常放在保持寄存器里因?yàn)镻LC既能讀也能寫例如PLC可以寫一個復(fù)位計數(shù)器命令也可以讀當(dāng)前檢測總數(shù)和OK/NG數(shù)量。Modbus TCP報文比RTU多了MBAP頭包含事務(wù)處理標(biāo)識符、協(xié)議標(biāo)識符、長度、單元標(biāo)識符。很多初學(xué)者調(diào)試時只管填數(shù)據(jù)沒注意事務(wù)ID要對應(yīng)上。Modbus Poll這類主站工具會自動處理事務(wù)ID但如果你自己寫Socket程序模擬Modbus客戶端就需要按照時序把請求和響應(yīng)的事務(wù)ID對齊否則對不上響應(yīng)就是錯亂。4.2 海康視覺控制器作為Modbus TCP Server的配置流程??狄曈X控制器在VisionMaster軟件里可以加載通訊模塊選擇Modbus TCP Server模式。配置的核心有三步第一指定端口默認(rèn)502。如果現(xiàn)場502被占用可以改成5020等但PLC側(cè)要同步修改端口號。第二確定從站地址也就是Unit ID。Modbus TCP從站地址在絕大多數(shù)情況下填1即可。多臺Modbus設(shè)備并聯(lián)時每個設(shè)備要有獨(dú)立的Unit ID否則PLC會分不清誰是誰。第三規(guī)劃寄存器映射。這是整個通訊配置里最容易出錯的地方建議做一個映射表寄存器地址數(shù)據(jù)類型讀寫含義40001無符號16位只讀當(dāng)前檢測結(jié)果1OK2NG3未檢測40002無符號16位只讀累計檢測總數(shù)40003無符號16位只讀累計OK數(shù)40004無符號16位只讀累計NG數(shù)40005無符號16位讀寫PLC寫入1時清零所有計數(shù)器40006-4001032位浮點(diǎn)數(shù)只讀檢測精度或尺寸測量數(shù)據(jù)地址40001在Modbus TCP報文里的實(shí)際地址是0x00因?yàn)閰f(xié)議地址從0開始而PLC組態(tài)里顯示的Modbus地址從1開始。這個換算關(guān)系我見過太多次搞錯的一定注意。字節(jié)序問題也是重災(zāi)區(qū)。海康控制器和PLC寄存器里都是16位一個字如果結(jié)果超過65535需要用32位數(shù)據(jù)類型比如累計總數(shù)就要占用兩個寄存器。不同品牌的PLC對32位數(shù)據(jù)的字節(jié)序處理不一樣有的高字在前有的低字在前。我的經(jīng)驗(yàn)是先寫一個固定值比如0x12345678PLC讀出來如果解析成0x56781234說明字節(jié)序反了調(diào)整一下就行。4.3 Modbus Poll主站模擬與聯(lián)調(diào)Modbus Poll是調(diào)試Modbus TCP Server最常用的工具。它作為主站去連接視覺控制器的從站端口能直觀地看到寄存器數(shù)據(jù)。配置方法創(chuàng)建連接時選擇Modbus TCP填I(lǐng)P和端口Unit ID填1然后選擇功能碼03讀保持寄存器起始地址設(shè)0數(shù)量根據(jù)映射表設(shè)置。注意不要用網(wǎng)上流傳的所謂注冊碼或者破解版直接去官網(wǎng)下載試用版或者聯(lián)系廠家要授權(quán)。商用項目用盜版工具一旦被查項目交付時可能有合規(guī)風(fēng)險。如果Modbus Poll能讀到正常數(shù)據(jù)但PLC側(cè)讀不到大概率是PLC的組態(tài)問題比如IP不對、端口不對、Unit ID不對、寄存器地址換算錯誤。這時候用Modbus Poll和實(shí)際PLC程序做個交叉驗(yàn)證能快速圈定故障范圍。輪詢間隔也需要控制。有些工程師喜歡把PLC的Modbus通訊塊放到定時中斷里1ms輪詢一次看起來實(shí)時性好但給視覺控制器造成了很大的CPU壓力。視覺控制器的通訊模塊不是為微秒級響應(yīng)設(shè)計的50ms到100ms的輪詢間隔一般就夠用了。如果真的需要毫秒級數(shù)據(jù)刷新應(yīng)該用TCP主動上報而不是Modbus輪詢。5. 現(xiàn)場聯(lián)調(diào)排錯從物理層到應(yīng)用層5.1 一步一步定位連不上通訊故障的排查一定要按分層思路走不要上來就懷疑程序邏輯。第一層物理鏈路。用ping命令確認(rèn)IP通不通。如果ping不通查網(wǎng)線、交換機(jī)、IP地址、VLan。??狄曈X控制器和PLC之間通常會經(jīng)過交換機(jī)確認(rèn)交換機(jī)的端口沒有設(shè)置為隔離模式。第二層端口監(jiān)聽。確認(rèn)視覺控制器上的TCP服務(wù)或者M(jìn)odbus TCP服務(wù)真的在監(jiān)聽。用netstat命令netstat -anp | grep :502 python mock server 端口 8000 同理如果LISTEN狀態(tài)都不存在說明服務(wù)沒起來檢查軟件配置和啟動日志。如果服務(wù)起了但外部連不上檢查防火墻。第三層連接行為。用telnet測端口telnet 192.168.1.10 502能連上說明TCP通了。連不上要么服務(wù)端沒監(jiān)聽要么防火墻攔截。第四層應(yīng)用層報文。用Wireshark抓包看TCP握手是否完成。三次握手報文會依次出現(xiàn)SYN、SYNACK、ACK。如果只看到SYN沒有SYNACK說明服務(wù)端沒響應(yīng)或者被防火墻丟包。如果握手正常但應(yīng)用沒有數(shù)據(jù)問題就在應(yīng)用層協(xié)議解析上。5.2 典型故障一端口被占用導(dǎo)致服務(wù)起不來這個前面2.2里已經(jīng)提過bind: only one usage of each socket address是典型的端口占用。再展開一下我遇到過視覺控制器上同時啟動了VisionMaster自帶的通訊服務(wù)和自研的Modbus服務(wù)兩者都綁定502端口結(jié)果后啟動的服務(wù)崩潰日志里全是bind錯誤。處理流程分三步先netstat查出誰占用了502端口再確認(rèn)是不是必需的服務(wù)如果不需要就停掉如果兩個服務(wù)都需要就把其中一個改成別的端口比如把Modbus端口改成1502。改完以后PLC側(cè)的目標(biāo)端口也要同步修改。另外Windows下還有一個坑如果程序異常退出后端口會處于TIME_WAIT狀態(tài)持續(xù)幾十秒。此時立即重啟程序可能因?yàn)槎丝诒籘IME_WAIT占用而bind失敗。解決辦法是服務(wù)端Socket設(shè)置SO_REUSEADDR前面代碼示例里已經(jīng)包含。5.3 典型故障二Modbus連接后讀取超時或異常響應(yīng)Modbus TCP連上了但讀數(shù)據(jù)超時或者返回異常響應(yīng)這是聯(lián)調(diào)階段最常見的第二種故障。異常響應(yīng)會在原功能碼基礎(chǔ)上加上0x80并附帶一個異常碼。常見的異常碼有以下幾種Modbus異常碼含義常見原因01非法功能碼從站不支持該功能碼例如只支持03讀保持寄存器你發(fā)了01讀線圈02非法數(shù)據(jù)地址寄存器地址超出從站映射范圍03非法數(shù)據(jù)值寫入的數(shù)據(jù)值超出允許范圍04從站設(shè)備故障從站內(nèi)部程序異常我在現(xiàn)場遇到過Modbus Poll返回Exception Response from Slave Device異常碼是02。查看寄存器映射表發(fā)現(xiàn)我讀的起始地址是40020但視覺控制器只映射到40010地址越界了。把起始地址改成40001后正常。還有一次是異常碼04原因是視覺控制器的算法服務(wù)沒有完全啟動Modbus從站服務(wù)掛起來了。重啟VisionMaster后恢復(fù)。所以聯(lián)調(diào)前確認(rèn)視覺算法已經(jīng)處于正常跑圖狀態(tài)再開通訊服務(wù)順序很重要。5.4 典型故障三數(shù)據(jù)錯位和字節(jié)序問題Modbus通訊看起來通但讀出來的數(shù)據(jù)明顯不對比如PLC讀到的OK數(shù)是幾千上萬的亂值或者和視覺軟件界面顯示的數(shù)字對不上。先別懷疑寄存器地址錯先查字節(jié)序。Modbus是16位一個寄存器的協(xié)議超過16位的數(shù)據(jù)需要拼接。很多PLC在讀取32位數(shù)據(jù)時會自動把相鄰兩個寄存器按高字在前或低字在前的方式拼接。??狄曈X控制器的數(shù)據(jù)打包方式大概率是低字在前小端如果PLC側(cè)用了大端解析數(shù)值必然錯亂??焖衮?yàn)證方法在視覺側(cè)把某個寄存器寫入固定值0x1234PLC讀出來應(yīng)該是4660。如果讀出的是0x341213330就是地址對但字節(jié)序/字序有問題。多個寄存器都正常后再切換到真實(shí)數(shù)據(jù)。還有一種情況是地址偏了1。Modbus地址編號從0開始但是組態(tài)軟件里有的顯示1開始有的顯示0開始。比如PLC組態(tài)里寫40001協(xié)議幀里的地址卻是0x0000如果你在組態(tài)里寫40000協(xié)議幀里就變成了0xFFFF的非法地址。建議先讀0地址看返回慢慢定位實(shí)際偏移量。6. 跨品牌設(shè)備混接當(dāng)現(xiàn)場還有FANUC、小原焊機(jī)時6.1 Profinet與TCP/Modbus之間的橋接思路現(xiàn)代產(chǎn)線很少有單一品牌的設(shè)備。一邊是??狄曈X控制器另一邊是發(fā)那科機(jī)器人、小原SIV32焊機(jī)控制器這些設(shè)備往往原生支持Profinet。如果用Modbus TCP和視覺控制器通訊機(jī)器人側(cè)又只認(rèn)Profinet怎么辦這時可以用協(xié)議轉(zhuǎn)換網(wǎng)關(guān)比如在Modbus TCP網(wǎng)絡(luò)和Profinet網(wǎng)絡(luò)之間加一臺網(wǎng)關(guān)設(shè)備將視覺控制器的寄存器數(shù)據(jù)映射到Profinet的IO地址。這樣的話視覺控制器只需要把結(jié)果寫到Modbus寄存器網(wǎng)關(guān)自動同步到Profinet的輸入?yún)^(qū)機(jī)器人PLC讀到的是Profinet里的輸入數(shù)據(jù)完全無感。網(wǎng)關(guān)選型時要注意Profinet一端需要向西門子PLC提供GSD文件做組態(tài)Modbus TCP一端要支持自定義寄存器映射和輪詢間隔。有些網(wǎng)關(guān)還支持WEB配置頁面調(diào)試起來非常方便。如果沒有網(wǎng)關(guān)那就只能讓機(jī)器人側(cè)用TCP自由協(xié)議對接視覺但機(jī)器人側(cè)寫自由協(xié)議報文的工作量不小而且對程序員的通訊功底要求很高不到萬不得已不推薦。6.2 網(wǎng)絡(luò)拓?fù)湓O(shè)計建議跨品牌設(shè)備一多網(wǎng)絡(luò)拓?fù)渚秃苋菀讈y。我的建議是分三個段相機(jī)圖像段、視覺通訊段、PLC控制段。相機(jī)段跑圖像流不參與控制視覺通訊段跑Modbus TCP和自定義TCPPLC控制段跑Profinet或EtherNet/IP。段與段之間通過工業(yè)交換機(jī)或網(wǎng)關(guān)隔離。尤其是相機(jī)圖像數(shù)據(jù)帶寬占用高且是周期性爆發(fā)的如果和Modbus TCP混跑在同一個二層網(wǎng)絡(luò)中一旦相機(jī)分辨率高、幀率高交換機(jī)的背板帶寬會被瞬間打滿PLC下一秒讀Modbus就可能超時。我在一個項目里就遇到過相機(jī)觸發(fā)頻率20fps時Modbus讀寫從5ms飆升到200ms后來把相機(jī)挪到獨(dú)立網(wǎng)卡和獨(dú)立交換機(jī)問題立刻消失。還有接地和屏蔽。TCP和Modbus本質(zhì)是電信號遇到大功率變頻器、焊機(jī)、伺服驅(qū)動器啟動時地電位漂移會導(dǎo)致偶發(fā)斷連。網(wǎng)線一定要用帶屏蔽層的工業(yè)網(wǎng)線交換機(jī)和控制器外殼最好用同一等電位接地?,F(xiàn)場電磁干擾導(dǎo)致的假死連接是最難排查的一類問題因?yàn)閺能浖峡匆磺姓5珨?shù)據(jù)就是不來。最后再分享幾個經(jīng)驗(yàn)調(diào)試??狄曈X通訊順序永遠(yuǎn)是先在電腦上模擬再上產(chǎn)線實(shí)測。我習(xí)慣的做法是先用Modbus Poll和TCP調(diào)試工具在辦公室驗(yàn)證視覺控制器的服務(wù)端是否正常再寫一個小型PLC仿真程序驗(yàn)證寄存器映射和字節(jié)序確認(rèn)無誤后才把設(shè)備搬到機(jī)臺旁邊接真PLC。這樣能過濾掉至少70%的通訊問題。另一個經(jīng)驗(yàn)是聯(lián)調(diào)時一定要開Wireshark并且一邊接一邊看報文。不要相信我的程序絕對不會錯有時候問題出在對方設(shè)備的通訊實(shí)現(xiàn)上。比如有一次PLC側(cè)發(fā)送的Modbus請求里Unit ID填了0被我們的視覺控制器直接丟棄抓包以后一看報文就明白了而雙方程序員各執(zhí)一詞吵了半天。配置完成后把所有端口號、IP地址、寄存器映射表、幀格式文檔化放到項目資料包。視覺項目往往隔幾個月要復(fù)制到另一條產(chǎn)線有這個文檔復(fù)制部署只需要改IP不用重新設(shè)計通訊方案。算下來這份文檔比代碼本身在售后運(yùn)維中發(fā)揮的作用更大。