子PLC與匯川伺服Modbus-RTU通訊實(shí)戰(zhàn)解析)
車(chē)間里一臺(tái)老設(shè)備改造客戶(hù)提了個(gè)要求別加運(yùn)動(dòng)控制卡就用PLC上閑置的那個(gè)485口把伺服帶起來(lái)。我第一反應(yīng)就是匯川伺服加Modbus-RTU——不用額外買(mǎi)通訊板卡不用換驅(qū)動(dòng)器一條雙絞線(xiàn)就能讓西門(mén)子PLC和匯川伺服對(duì)上話(huà)。這篇文章就把我從Modbus-RTU幀結(jié)構(gòu)解析、匯川伺服參數(shù)設(shè)置到西門(mén)子PLC側(cè)程序配置的完整過(guò)程記錄下來(lái)算是一份能直接參考復(fù)現(xiàn)的實(shí)戰(zhàn)文檔。適合正在做設(shè)備改造、維護(hù)調(diào)試或者剛接觸伺服總線(xiàn)通訊的工程師。很多朋友一聽(tīng)到“總線(xiàn)通訊”就發(fā)怵覺(jué)得協(xié)議高深莫測(cè)。實(shí)際把Modbus-RTU拆開(kāi)看無(wú)非就是按固定格式發(fā)一串16進(jìn)制字節(jié)伺服收到后回一串字節(jié)僅此而已。真正干活時(shí)讓人卡殼的往往是幾個(gè)細(xì)節(jié)CRC校驗(yàn)怎么算、寄存器地址從哪查、PLC里那個(gè)ADDR參數(shù)怎么拼、伺服使能后為什么不動(dòng)。這些我都會(huì)在下面逐個(gè)講透。1. 方案選型為什么是Modbus-RTU1.1 匯川伺服的主流通訊方式對(duì)比匯川伺服驅(qū)動(dòng)器以常見(jiàn)的IS620N系列為例本身支持脈沖、CANopen、EtherCAT、Modbus-RTU等好幾種控制方式。選型時(shí)很多人糾結(jié)我直接給一張對(duì)比表大家按場(chǎng)景對(duì)號(hào)入座??刂品绞酵ㄓ?信號(hào)介質(zhì)典型周期成本適用場(chǎng)景脈沖脈沖方向信號(hào)實(shí)時(shí)性取決于發(fā)脈沖頻率最低無(wú)需通訊模塊簡(jiǎn)單單軸定位PLC高速脈沖口夠用CANopenCAN總線(xiàn)1-10ms中多軸中小型設(shè)備PLC帶CAN口EtherCAT以太網(wǎng)0.125-1ms較高多軸高速高精度需要專(zhuān)用主站Modbus-RTURS48510-50ms取決于輪詢(xún)低老設(shè)備改造、少軸點(diǎn)位控制、PLC僅支持串口從成本角度講Modbus-RTU幾乎不增加硬件成本。PLC自帶RS485口或加一個(gè)幾十塊的通訊板伺服用標(biāo)準(zhǔn)RJ45或端子接線(xiàn)兩邊撥碼一撥就完事。對(duì)于老設(shè)備改造、單軸或兩三軸的點(diǎn)位控制這種方案性?xún)r(jià)比極高。1.2 Modbus-RTU的性能邊界Modbus-RTU不是萬(wàn)能的它的性能邊界得說(shuō)清楚免得大家踩坑。RS485串口通訊常見(jiàn)波特率9600或19200算一幀十幾字節(jié)的數(shù)據(jù)再加上幀間隔主站輪詢(xún)一個(gè)從站大約要5-10ms。如果你帶三五臺(tái)伺服完整輪詢(xún)一圈可能到30-50ms。這個(gè)響應(yīng)速度做點(diǎn)位運(yùn)動(dòng)控制、速度控制、狀態(tài)監(jiān)控完全夠用但要做多軸插補(bǔ)、高速高精輪廓加工那就別指望它了老老實(shí)實(shí)上EtherCAT。還有一點(diǎn)要注意Modbus-RTU是半雙工主從協(xié)議所有通訊由主站發(fā)起從站之間不能直接通訊。這意味著你的控制邏輯必須集中在PLC側(cè)伺服側(cè)的“聯(lián)動(dòng)”需要通過(guò)PLC輪詢(xún)來(lái)實(shí)現(xiàn)。好在匯川伺服大部分運(yùn)動(dòng)控制是“給目標(biāo)位置、觸發(fā)運(yùn)行”這種點(diǎn)位模式天然適合Modbus-RTU。1.3 硬件準(zhǔn)備與組網(wǎng)拓?fù)浔敬螌?shí)戰(zhàn)所用硬件清單如下匯川伺服驅(qū)動(dòng)器IS620N一臺(tái)配套伺服電機(jī)MS1H4系列西門(mén)子S7-1200 PLC一臺(tái)外加CM1241 RS485通訊模塊訂貨號(hào)6ES7241-1CH30-1XB0USB轉(zhuǎn)RS485調(diào)試工具一個(gè)用于先單獨(dú)驗(yàn)證伺服通訊屏蔽雙絞線(xiàn)若干米R(shí)S485通訊線(xiàn)組網(wǎng)拓?fù)浜芎?jiǎn)單PLC的CM1241模塊的RS485口作為主站用屏蔽雙絞線(xiàn)引出A、B兩線(xiàn)接到伺服驅(qū)動(dòng)器的485通訊端子上。需要注意的是如果鏈路上有多臺(tái)伺服每臺(tái)的從站地址要設(shè)置成不同編號(hào)鏈路兩端設(shè)備需要啟用終端電阻。這一點(diǎn)我在后面的調(diào)試章節(jié)還會(huì)重點(diǎn)講。2. Modbus-RTU幀結(jié)構(gòu)解析先把協(xié)議啃透2.1 報(bào)文幀的基本組成Modbus-RTU一幀報(bào)文包含四個(gè)部分從站地址、功能碼、數(shù)據(jù)區(qū)、CRC校驗(yàn)。看起來(lái)簡(jiǎn)單但每個(gè)字節(jié)在總線(xiàn)上的時(shí)序是有嚴(yán)格要求的。字段長(zhǎng)度說(shuō)明從站地址1字節(jié)0-2471-247可用0為廣播地址功能碼1字節(jié)03讀寄存器、06寫(xiě)單個(gè)寄存器、10十六進(jìn)制0x10寫(xiě)多個(gè)寄存器數(shù)據(jù)區(qū)N字節(jié)取決于功能碼包含寄存器起始地址、數(shù)據(jù)長(zhǎng)度、數(shù)據(jù)內(nèi)容CRC校驗(yàn)2字節(jié)CRC16-Modbus低字節(jié)在前幀與幀之間必須有至少3.5個(gè)字符時(shí)間的空閑間隔。以9600波特率為例一個(gè)字符大約1ms3.5個(gè)字符就是3.5ms左右。如果兩幀之間的間隔太短接收方可能把兩幀數(shù)據(jù)當(dāng)成一幀處理導(dǎo)致解析錯(cuò)亂。做PLC通訊程序時(shí)如果調(diào)用通訊指令的頻率過(guò)高反而可能觸發(fā)這個(gè)問(wèn)題。2.2 三種核心功能碼03、06、10本次實(shí)戰(zhàn)用到三個(gè)功能碼分別是讀寄存器、寫(xiě)單個(gè)寄存器、寫(xiě)多個(gè)寄存器030x03讀保持寄存器用于讀取伺服的狀態(tài)字、實(shí)際位置、實(shí)際速度等。報(bào)文格式是“從站地址03起始地址高字節(jié)起始地址低字節(jié)寄存器數(shù)量高字節(jié)寄存器數(shù)量低字節(jié)CRC”。060x06寫(xiě)單個(gè)寄存器用于寫(xiě)控制字、模式切換等單字操作。報(bào)文格式是“從站地址06寄存器地址數(shù)據(jù)CRC”。100x10寫(xiě)多個(gè)寄存器用于寫(xiě)目標(biāo)位置、目標(biāo)速度這類(lèi)32位數(shù)據(jù)。因?yàn)橐粋€(gè)寄存器只有16位32位數(shù)據(jù)需要占用兩個(gè)連續(xù)寄存器這時(shí)候必須用0x10功能碼一次寫(xiě)入兩個(gè)字。舉個(gè)例子讀取1號(hào)從站、寄存器地址0x0B01、長(zhǎng)度為1個(gè)字報(bào)文就是01 03 0B 01 00 01 CRC_LO CRC_HI其中0B01就是要讀取的寄存器地址0001表示讀取1個(gè)寄存器。對(duì)應(yīng)匯川伺服的H0B-01對(duì)象字典也就是狀態(tài)字。2.3 CRC校驗(yàn)的原理與手算方法CRC校驗(yàn)是Modbus-RTU最容易讓新手迷糊的地方。如果你用串口調(diào)試助手手動(dòng)發(fā)幀不把CRC算對(duì)伺服絕對(duì)不搭理你。CRC16-Modbus的算法核心是初始值0xFFFF多項(xiàng)式0xA001逐字節(jié)處理。我習(xí)慣在電腦上用Python腳本算CRC函數(shù)就這么幾行def crc16_modbus(data: bytes) - int: crc 0xFFFF for byte in data: crc ^ byte for _ in range(8): if crc 1: crc (crc 1) ^ 0xA001 else: crc 1 return crc舉例要發(fā)送01 03 0B 01 00 01這6個(gè)字節(jié)先把這6個(gè)字節(jié)傳入函數(shù)得到CRC值然后將CRC的低字節(jié)放在幀尾倒數(shù)第二位高字節(jié)放在最后一位。也就是很多文檔里寫(xiě)的“低字節(jié)在前”。當(dāng)時(shí)我剛開(kāi)始做串口調(diào)試時(shí)就栽在這個(gè)字節(jié)序上把高低字節(jié)寫(xiě)反伺服一直無(wú)響應(yīng)排查了半天才發(fā)現(xiàn)是CRC字節(jié)序問(wèn)題。2.4 用串口調(diào)試工具先驗(yàn)證一幀拿到驅(qū)動(dòng)器后我強(qiáng)烈建議先用USB轉(zhuǎn)RS485工具連接伺服配合串口調(diào)試助手手動(dòng)發(fā)送一幀讀取狀態(tài)字的報(bào)文確認(rèn)伺服能正?;貜?fù)。這一步能幫你把“伺服通訊問(wèn)題”和“PLC通訊問(wèn)題”分開(kāi)極大縮小排查范圍。我的調(diào)試流程是這樣的打開(kāi)串口調(diào)試助手設(shè)置串口號(hào)、波特率9600、數(shù)據(jù)位8、偶校驗(yàn)、停止位1然后手動(dòng)發(fā)送01 03 0B 01 00 01 CRC_LO CRC_HI如果一切正常會(huì)收到類(lèi)似01 03 02 00 06 CRC_LO CRC_HI其中01是從站地址03是功能碼02表示后面有2個(gè)字節(jié)數(shù)據(jù)00 06就是狀態(tài)字的內(nèi)容??吹竭@個(gè)響應(yīng)說(shuō)明驅(qū)動(dòng)器通訊通道完全正常接下來(lái)再去折騰PLC程序思路就清晰很多。3. 匯川伺服側(cè)參數(shù)設(shè)置讓驅(qū)動(dòng)器開(kāi)口說(shuō)話(huà)3.1 通訊參數(shù)組H0C的設(shè)置匯川伺服驅(qū)動(dòng)器的參數(shù)通過(guò)前面板或調(diào)試軟件InoDriverShop修改。Modbus-RTU通訊需要設(shè)置H0C組的幾個(gè)參數(shù)我用表格整理了一份常用配置。參數(shù)含義常用設(shè)置說(shuō)明H0C-00從站通訊地址1范圍1-127多臺(tái)伺服必須不同H0C-01通訊波特率596000-9對(duì)應(yīng)不同波特率具體查閱手冊(cè)H0C-02數(shù)據(jù)格式18E18個(gè)數(shù)據(jù)位偶校驗(yàn)1個(gè)停止位H0C-03通訊協(xié)議選擇Modbus-RTU部分固件版本還需要設(shè)置協(xié)議類(lèi)型H0C-05485終端電阻按需鏈路終端設(shè)備設(shè)為1中間設(shè)備設(shè)為0H0C-06通訊超時(shí)時(shí)間100ms主站超時(shí)后驅(qū)動(dòng)器報(bào)警這里最需要注意的是H0C組參數(shù)修改后部分參數(shù)需要驅(qū)動(dòng)器重新上電才能生效。我遇到過(guò)好幾次現(xiàn)場(chǎng)改完參數(shù)直接發(fā)報(bào)文驅(qū)動(dòng)器不響應(yīng)結(jié)果發(fā)現(xiàn)是參數(shù)沒(méi)真正加載。一般操作是修改后保存參數(shù)然后斷電報(bào)文再重新上電。3.2 控制模式與指令來(lái)源的確認(rèn)要讓伺服通過(guò)Modbus-RTU接收位置指令光配好通訊參數(shù)還不夠還得把驅(qū)動(dòng)器的控制模式和指令來(lái)源切到Modbus通訊。匯川IS620N中一般用H02組參數(shù)設(shè)置控制模式位置控制、速度控制還是轉(zhuǎn)矩控制。點(diǎn)位運(yùn)動(dòng)用位置控制模式也就是H02-01設(shè)為位置控制。關(guān)鍵是指令來(lái)源。默認(rèn)情況下驅(qū)動(dòng)器可能從脈沖端子接收指令必須把位置指令來(lái)源修改為Modbus通訊。具體是H02-03還是H0D組不同固件版本略有差異我建議直接以隨機(jī)附帶手冊(cè)的“運(yùn)行指令來(lái)源”章節(jié)為準(zhǔn)。設(shè)置完同樣要保存并重新上電。3.3 對(duì)象字典H0B組PLC眼中的伺服寄存器匯川IS620N將Servo對(duì)象字典映射到了Modbus保持寄存器區(qū)以H0B組為主。下面這張表是本次實(shí)戰(zhàn)最核心的寄存器映射建議截圖保存。Modbus寄存器地址對(duì)象字典含義讀寫(xiě)屬性0x0B00H0B-00控制字讀寫(xiě)0x0B01H0B-01狀態(tài)字只讀0x0B02H0B-02目標(biāo)位置32位讀寫(xiě)0x0B03H0B-03實(shí)際位置32位只讀0x0B04H0B-04目標(biāo)速度32位讀寫(xiě)0x0B05H0B-05實(shí)際速度32位只讀0x0B06H0B-06目標(biāo)轉(zhuǎn)矩只讀0x0B07H0B-07實(shí)際轉(zhuǎn)矩只讀注意32位的數(shù)據(jù)比如目標(biāo)位置在Modbus里占兩個(gè)字默認(rèn)高位字在前、低位字在后也就是大端模式。在PLC側(cè)組裝數(shù)據(jù)時(shí)一定要先放高16位再放低16位。我見(jiàn)過(guò)不少同行把高低字顛倒結(jié)果伺服走的位置完全不是預(yù)想值。3.4 默認(rèn)編碼器線(xiàn)數(shù)是262144這個(gè)數(shù)值能改嗎這是很多匯川伺服用戶(hù)都問(wèn)過(guò)的問(wèn)題。MS1H4系列電機(jī)配絕對(duì)值編碼器默認(rèn)分辨率是262144線(xiàn)也就是電機(jī)轉(zhuǎn)一圈編碼器反饋262144個(gè)脈沖。那這個(gè)“262144”到底能不能改我的答案很明確編碼器本身的分辨率是硬件特性不能通過(guò)參數(shù)修改。出廠后的262144就固定在編碼器內(nèi)部改不了也不需要改。但為什么有人覺(jué)得它能改因?yàn)樵谒欧?qū)動(dòng)器的參數(shù)里確實(shí)提供了編碼器分頻輸出比如H05組的脈沖輸出分頻和電子齒輪比電子齒輪分子/分母等參數(shù)。這些參數(shù)修改的是驅(qū)動(dòng)器對(duì)外輸出的脈沖數(shù)或指令換算關(guān)系不會(huì)改變編碼器內(nèi)部的實(shí)際分辨率。舉個(gè)例子你可以設(shè)置電子齒輪比讓PLC每發(fā)1000個(gè)脈沖電機(jī)轉(zhuǎn)一圈但電機(jī)內(nèi)部編碼器反饋的仍是262144線(xiàn)分辨率精度并沒(méi)有降低。所以當(dāng)你看到驅(qū)動(dòng)器里顯示262144時(shí)不要去糾結(jié)怎么把它改小。你真正需要操心的是電子齒輪比的計(jì)算讓PLC發(fā)的用戶(hù)單位符合你想要的脈沖當(dāng)量。3.5 電子齒輪比的計(jì)算示例電子齒輪比解決的是“PLC發(fā)的用戶(hù)單位”和“電機(jī)實(shí)際轉(zhuǎn)多少圈”之間的換算。假設(shè)現(xiàn)場(chǎng)要求PLC發(fā)送10000個(gè)單位電機(jī)剛好轉(zhuǎn)一圈。而伺服內(nèi)部一個(gè)單位對(duì)應(yīng)多少編碼器反饋呢這就要算電子齒輪比了。以編碼器分辨率262144線(xiàn)為例如果一份位置指令對(duì)應(yīng)1個(gè)編碼器計(jì)數(shù)那么要讓10000份指令轉(zhuǎn)一圈電子齒輪比應(yīng)該設(shè)置為262144:10000簡(jiǎn)化后約等于26.2144:1。但這樣不是整數(shù)很多驅(qū)動(dòng)器的電子齒輪比要求整數(shù)設(shè)定沒(méi)法直接寫(xiě)。實(shí)際工程中我們會(huì)調(diào)整用戶(hù)單位比如讓每份指令對(duì)應(yīng)0.001mm絲杠導(dǎo)程10mm電機(jī)轉(zhuǎn)一圈走10mm那轉(zhuǎn)一圈需要10000個(gè)用戶(hù)單位此時(shí)電子齒輪比同樣是262144:10000。如果比例不是整數(shù)就換用戶(hù)單位比如改成每份指令對(duì)應(yīng)0.01mm轉(zhuǎn)一圈只要1000份指令齒輪比就是262144:1000依然不是整數(shù)。所以很多時(shí)候需要配合機(jī)械傳動(dòng)比一起調(diào)這就是另一個(gè)話(huà)題了??傊涀∫稽c(diǎn)編碼器線(xiàn)數(shù)是固定的你需要調(diào)的是電子齒輪比分母和分子。4. 西門(mén)子PLC側(cè)配置從零到能跑4.1 硬件接線(xiàn)RS485 A/B與屏蔽處理RS485接線(xiàn)看著簡(jiǎn)單其實(shí)是故障高發(fā)區(qū)。CM1241 RS485模塊上的A、B端子對(duì)應(yīng)匯川伺服驅(qū)動(dòng)器的485通訊端子。接線(xiàn)時(shí)用屏蔽雙絞線(xiàn)A接A、B接B然后屏蔽層單端接地一般在PLC側(cè)接地。很多人圖省事不接地線(xiàn)等到現(xiàn)場(chǎng)變頻器一啟動(dòng)通訊就開(kāi)始亂碼那時(shí)候后悔就晚了。如果鏈路上只有PLC和伺服兩臺(tái)設(shè)備且CM1241和伺服分布在鏈路兩端那兩端的終端電阻都要啟用。CM1241模塊側(cè)面有終端電阻撥碼開(kāi)關(guān)伺服側(cè)通過(guò)H0C-05參數(shù)啟用。如果鏈路中間還有其他設(shè)備中間設(shè)備的終端電阻必須關(guān)閉。4.2 TIA Portal中組態(tài)CM1241 RS485在TIA Portal博途中先添加S7-1200 CPU再添加CM1241 RS485模塊。組態(tài)時(shí)可以看到模塊的硬件標(biāo)識(shí)符比如“64”之類(lèi)的數(shù)字這個(gè)標(biāo)識(shí)符在后面的通訊指令里要作為PORT參數(shù)使用。通訊口的波特率、校驗(yàn)方式等在硬件組態(tài)里可以先隨便設(shè)真正生效的是后面程序里MB_COMM_LOAD指令設(shè)置的參數(shù)。這一點(diǎn)很多初次接觸的朋友會(huì)被繞暈覺(jué)得“我硬件組態(tài)里明明設(shè)了9600怎么程序里還要設(shè)一遍”。記住CM1241的串口參數(shù)最終以MB_COMM_LOAD的形參為準(zhǔn)。4.3 初始化指令MB_COMM_LOAD在OB1里調(diào)用MB_COMM_LOAD指令負(fù)責(zé)初始化串口通訊參數(shù)。核心形參如下形參設(shè)置值說(shuō)明PORTCM1241硬件標(biāo)識(shí)符在PLC變量的系統(tǒng)常量中查找BAUD9600與伺服H0C-01一致PARITY2偶校驗(yàn)與伺服H0C-02一致DATABITS88個(gè)數(shù)據(jù)位STOPBITS11個(gè)停止位MB_DB分配一個(gè)全局DB用于存放通訊控制數(shù)據(jù)MB_COMM_LOAD的REQ端用首次掃描脈沖觸發(fā)一次即可不需要每個(gè)掃描周期都去初始化。DONE和ERROR引腳可以接到M點(diǎn)或DB里方便在線(xiàn)監(jiān)控。4.4 主站讀寫(xiě)指令MB_MASTER初始化完成后用MB_MASTER進(jìn)行單次讀寫(xiě)。MB_MASTER是邊沿觸發(fā)的每次REQ從0變1時(shí)發(fā)送一次請(qǐng)求。核心形參如下形參說(shuō)明REQ上升沿觸發(fā)通訊請(qǐng)求RW0表示讀1表示寫(xiě)ADDR從站地址功能碼起始地址組合值DATA_PTR指向存儲(chǔ)數(shù)據(jù)區(qū)的指針LEN數(shù)據(jù)長(zhǎng)度讀寫(xiě)字的個(gè)數(shù)重點(diǎn)是ADDR的拼接。S7-1200的MB_MASTER要求把從站地址、功能碼、起始地址打包成一個(gè)雙字。比如讀1號(hào)從站、功能碼03、起始地址0x0B01ADDR就等于16#01030B01其中01是從站地址03是功能碼0B01是寄存器地址。如果是寫(xiě)控制字功能碼換成06ADDR就是16#01060B00寫(xiě)多個(gè)寄存器時(shí)功能碼用160x10比如寫(xiě)目標(biāo)位置0x0B02ADDR為16#01100B02這個(gè)ADDR格式我在現(xiàn)場(chǎng)給不少同事講過(guò)大家最容易錯(cuò)的就是把從站地址和功能碼的位置搞混。一定記住高字節(jié)是從站地址次高字節(jié)是功能碼低兩個(gè)字節(jié)是寄存器地址。4.5 點(diǎn)位運(yùn)動(dòng)控制的程序邏輯我寫(xiě)一個(gè)最簡(jiǎn)單的點(diǎn)位控制流程大家可以直接參考首次掃描調(diào)用MB_COMM_LOAD完成初始化。用MB_MASTER寫(xiě)控制字0x0B00值為1使能伺服。延時(shí)一段時(shí)間確認(rèn)狀態(tài)字0x0B01的bit0為1表示伺服已使能。用MB_MASTER功能碼0x10寫(xiě)目標(biāo)位置寄存器0x0B02連續(xù)寫(xiě)兩個(gè)字?jǐn)?shù)據(jù)先放高字再加低字。再次用MB_MASTER功能碼06寫(xiě)控制字值為3觸發(fā)運(yùn)行。周期讀取狀態(tài)字和實(shí)際位置判斷運(yùn)動(dòng)是否完成。LEN參數(shù)注意讀寫(xiě)單個(gè)寄存器16位數(shù)據(jù)時(shí)LEN1讀寫(xiě)32位數(shù)據(jù)比如目標(biāo)位置時(shí)LEN2。DATA_PTR指向的數(shù)據(jù)區(qū)如果是32位數(shù)據(jù)需要保證兩個(gè)字連續(xù)存放。我在實(shí)際項(xiàng)目中會(huì)把每次MB_MASTER的ERROR引腳接到一個(gè)故障DB一旦狀態(tài)字不是0就把狀態(tài)值記錄下來(lái)。這樣即使伺服或者通訊出問(wèn)題也能快速定位是哪個(gè)請(qǐng)求失敗。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 通訊超時(shí)故障速查表調(diào)試中通訊超時(shí)是最常見(jiàn)的問(wèn)題我把這些年踩過(guò)的坑整理成一張表按出現(xiàn)頻率排序。現(xiàn)象可能原因排查方法主站報(bào)16#8180從站無(wú)響應(yīng)伺服地址、波特率、數(shù)據(jù)格式不一致用串口調(diào)試助手直接發(fā)幀測(cè)試伺服是否回復(fù)主站報(bào)16#8180從站無(wú)響應(yīng)RS485 A/B接反對(duì)調(diào)A/B線(xiàn)主站報(bào)16#8180從站無(wú)響應(yīng)伺服未上電或通訊參數(shù)修改后未重啟斷電重啟驅(qū)動(dòng)器偶發(fā)超時(shí)缺終端電阻、線(xiàn)纜過(guò)長(zhǎng)、屏蔽層未接地檢查鏈路終端電阻和接地偶發(fā)超時(shí)波特率過(guò)高導(dǎo)致抗干擾能力下降降到9600試一下通訊正常但數(shù)據(jù)錯(cuò)亂校驗(yàn)位、停止位設(shè)置不一致PLC和伺服統(tǒng)一為8E1或8N1伺服能通訊但不動(dòng)作控制模式或指令來(lái)源未設(shè)置為Modbus檢查H02組控制模式和指令來(lái)源5.2 西門(mén)子16#8180錯(cuò)誤代碼詳解16#8180這個(gè)錯(cuò)誤在S7-1200 Modbus-RTU通訊里最常見(jiàn)。西門(mén)子官方文檔的解釋是“從站無(wú)響應(yīng)”或“請(qǐng)求超時(shí)”。說(shuō)白了MB_MASTER把請(qǐng)求幀發(fā)出去但在設(shè)定的超時(shí)時(shí)間內(nèi)沒(méi)收到從站回復(fù)于是報(bào)這個(gè)錯(cuò)。排查思路很簡(jiǎn)單先把PLC放在一邊用USB轉(zhuǎn)RS485和串口調(diào)試助手手動(dòng)發(fā)一幀讀狀態(tài)字的報(bào)文。如果伺服也不回復(fù)問(wèn)題一定出在伺服側(cè)或接線(xiàn)側(cè)。如果串口助手能收到回復(fù)那問(wèn)題就回到PLC側(cè)——重點(diǎn)查MB_COMM_LOAD的參數(shù)是否和伺服一致ADDR的地址拼接是否正確以及RS485模塊接線(xiàn)。這里還有個(gè)容易被忽略的點(diǎn)MB_MASTER的LEN參數(shù)如果設(shè)錯(cuò)也可能導(dǎo)致通訊失敗。比如寫(xiě)目標(biāo)位置時(shí)LEN設(shè)為1而實(shí)際需要2個(gè)字PLC只發(fā)了一個(gè)字伺服端解析就會(huì)異常導(dǎo)致不回復(fù)或回異常碼。5.3 數(shù)據(jù)字節(jié)序與單位換算問(wèn)題數(shù)據(jù)錯(cuò)亂是另一個(gè)高頻問(wèn)題。Modbus協(xié)議規(guī)定多字節(jié)數(shù)據(jù)大端傳輸也就是高字節(jié)在前。但伺服驅(qū)動(dòng)器的實(shí)際表現(xiàn)偶爾會(huì)和手冊(cè)有出入我的建議是寫(xiě)一個(gè)固定值去驗(yàn)證。比如把目標(biāo)位置寄存器寫(xiě)成0x0001C350十進(jìn)制115536然后用伺服面板或調(diào)試軟件看實(shí)際位置值。如果顯示115536說(shuō)明字序正確如果顯示的是其他值大概率是高低字顛倒調(diào)整一下PLC里數(shù)據(jù)的存放順序即可。還有個(gè)經(jīng)驗(yàn)PLC的DATA_PTR如果指向的是Byte數(shù)組或Word數(shù)組要注意數(shù)據(jù)對(duì)齊。S7-1200里指針訪問(wèn)的數(shù)據(jù)區(qū)最好用位存儲(chǔ)器M區(qū)或者DB的絕對(duì)地址避免優(yōu)化訪問(wèn)帶來(lái)的麻煩。5.4 實(shí)測(cè)下來(lái)的幾條獨(dú)家心得最后分享幾條現(xiàn)場(chǎng)總結(jié)出來(lái)的經(jīng)驗(yàn)都是常規(guī)手冊(cè)里不會(huì)寫(xiě)的內(nèi)容。第一調(diào)試時(shí)先用串口助手把伺服通訊打通再動(dòng)PLC程序。這樣做的好處是能把問(wèn)題分成“伺服側(cè)”和“PLC側(cè)”兩段每段單獨(dú)驗(yàn)證效率最高。我有一次直接上PLC折騰了兩小時(shí)沒(méi)搞定結(jié)果用串口助手十分鐘就發(fā)現(xiàn)是CM1241模塊的DB數(shù)據(jù)區(qū)地址寫(xiě)錯(cuò)了。第二使能之前一定要確認(rèn)狀態(tài)字的反饋。很多伺服必須先看到使能位反饋有效才會(huì)響應(yīng)運(yùn)行指令。PLC里別省那幾個(gè)掃描周期寫(xiě)完控制字加一個(gè)延時(shí)或者輪詢(xún)狀態(tài)字確認(rèn)到位后再發(fā)下一幀穩(wěn)定性會(huì)好很多。第三參數(shù)修改后記得保存并斷電重啟。我見(jiàn)過(guò)不少現(xiàn)場(chǎng)參數(shù)在InoDriverShop里改了也保存了但驅(qū)動(dòng)器沒(méi)重啟導(dǎo)致新參數(shù)沒(méi)生效。通訊類(lèi)參數(shù)尤其敏感不重啟很容易出現(xiàn)“改了半天沒(méi)變化”的怪象。第四通訊超時(shí)時(shí)間不要設(shè)太短。MB_MASTER的超時(shí)設(shè)置如果太小在惡劣電磁環(huán)境下容易誤報(bào)但也不要太長(zhǎng)否則故障響應(yīng)太慢。我一般設(shè)置在100-300ms之間兼顧穩(wěn)定性和實(shí)時(shí)性。最后分享一點(diǎn)個(gè)人體會(huì)我做設(shè)備調(diào)試這些年越來(lái)越覺(jué)得通訊方案不是越高級(jí)越好。Modbus-RTU雖然“老”但在這種小規(guī)模點(diǎn)位控制場(chǎng)景里穩(wěn)定、直觀、好排查反而是最省心的選擇。匯川伺服加西門(mén)子PLC的組合在市場(chǎng)上保有量巨大兩個(gè)設(shè)備之間的Modbus-RTU通訊值得每個(gè)自動(dòng)化工程師認(rèn)真掌握。按照我的習(xí)慣每次新項(xiàng)目會(huì)先做一張通訊參數(shù)速查卡把伺服H0C組參數(shù)、H0B組關(guān)鍵寄存器地址、PLC側(cè)MB_COMM_LOAD和MB_MASTER的配置全部寫(xiě)在一張紙上?,F(xiàn)場(chǎng)調(diào)試時(shí)對(duì)照這張紙操作基本能一次通過(guò)。這篇文章就算是一個(gè)公開(kāi)版的速查卡希望對(duì)大家有用。