頭+博圖V15.1+IO-Link載碼體調(diào)試實(shí)戰(zhàn))
簡(jiǎn)介倍加福讀寫(xiě)頭與西門(mén)子1500PLC通過(guò)Profinet協(xié)議通信的調(diào)試說(shuō)明文檔面向工業(yè)自動(dòng)化現(xiàn)場(chǎng)調(diào)試人員及電氣工程師重點(diǎn)解決讀寫(xiě)頭、轉(zhuǎn)換器、載碼體三者協(xié)同工作時(shí)的硬件接線與軟件配置問(wèn)題。壓縮包為單個(gè)docx文檔大小約604KB內(nèi)容組織清晰便于按章節(jié)查閱和學(xué)習(xí)。文檔詳細(xì)講解了轉(zhuǎn)換器航插電源1正極3負(fù)的接法、工業(yè)4芯網(wǎng)線黃白橙藍(lán)與航插1234的對(duì)應(yīng)線序、8芯RJ45網(wǎng)口的接線注意事項(xiàng)并給出線序異常時(shí)的萬(wàn)用表排查思路軟件側(cè)覆蓋博圖V15.1中通過(guò)在線訪問(wèn)分配IP和設(shè)備名稱(chēng)、復(fù)位為出廠設(shè)置及重啟識(shí)別的完整流程。針對(duì)載碼體讀寫(xiě)文檔演示了通過(guò)瀏覽器登錄轉(zhuǎn)換器管理界面設(shè)置起始地址與字節(jié)長(zhǎng)度以讀取或?qū)懭胗脩?hù)記憶區(qū)數(shù)據(jù)并說(shuō)明Hex Command生成與Logging Monitor查看操作日志的方法。同時(shí)介紹了同一載碼體中分段存儲(chǔ)數(shù)據(jù)便于不同PLC系統(tǒng)獨(dú)立提取所需信息并附有倍加福官網(wǎng)查詢(xún)載碼體存儲(chǔ)區(qū)結(jié)構(gòu)的指引。目前已有3261人學(xué)習(xí)下載適合需要快速上手Profinet讀寫(xiě)頭調(diào)試的工程技術(shù)人員。1. 倍加福讀寫(xiě)頭博圖V15.1載碼體這套組合到底解決什么問(wèn)題在產(chǎn)線上每個(gè)工件要帶一個(gè)能變化的“身份證”到了某個(gè)工位先確認(rèn)身份再把加工結(jié)果寫(xiě)回去。過(guò)去最常見(jiàn)的方案是配一臺(tái)獨(dú)立RFID控制器讀寫(xiě)頭掛在控制器上控制器再通過(guò)以太網(wǎng)或串口和PLC說(shuō)話程序兩邊來(lái)回調(diào)?,F(xiàn)在用倍加福讀寫(xiě)頭配合博圖V15.1可以把那臺(tái)控制器直接省掉讀寫(xiě)頭掛到S7-1200/1500的IO-Link主站上載碼體數(shù)據(jù)變成PLC的I/O區(qū)地址博圖里寫(xiě)幾行SCL就能讀能寫(xiě)。我第一次調(diào)通這套組合時(shí)最驚訝的不是通信有多快而是調(diào)試方式變了——不用在專(zhuān)用軟件和PLC之間來(lái)回切換所有驗(yàn)證都在博圖的監(jiān)控表里完成。這篇文章就是寫(xiě)給在設(shè)備現(xiàn)場(chǎng)對(duì)著博圖和讀寫(xiě)頭不知道從哪下手的電氣調(diào)試人員也寫(xiě)給做產(chǎn)線集成的工程師。我會(huì)按實(shí)際動(dòng)手順序把從選型、接線、組態(tài)、程序到排錯(cuò)的完整路徑講清楚每個(gè)參數(shù)為什么這么設(shè)以及我在現(xiàn)場(chǎng)踩過(guò)的坑。2. 倍加福讀寫(xiě)頭選型與接線IO-Link還是RS485載碼體間距怎么算2.1 讀寫(xiě)頭接口選型IO-Link在博圖V15.1下的優(yōu)勢(shì)倍加福讀寫(xiě)頭按通信接口分市面上最常見(jiàn)的是IO-Link和RS485兩種也有少數(shù)PROFINET直接接口但價(jià)格和調(diào)試復(fù)雜度都上去了。我一般優(yōu)先選IO-Link原因很實(shí)際IO-Link主站模塊是S7-1200/1500的選件直接插在CPU左側(cè)總線博圖V15.1原生支持讀寫(xiě)頭變成主站的一個(gè)子設(shè)備數(shù)據(jù)按周期自動(dòng)刷新到過(guò)程映像區(qū)。RS485則需要獨(dú)立的通信模塊或者從站適配器報(bào)文里要自己拼地址、功能碼、校驗(yàn)和調(diào)試周期至少多一天。從維護(hù)角度看IO-Link也明顯優(yōu)于RS485。倍加福讀寫(xiě)頭的一些參數(shù)比如讀寫(xiě)功率、天線濾波、命令觸發(fā)模式都寫(xiě)在IODD文件里通過(guò)博圖的通道設(shè)置就能下發(fā)。更換讀寫(xiě)頭時(shí)新設(shè)備一插上就自動(dòng)應(yīng)用原參數(shù)不需要拿著調(diào)試盒在現(xiàn)場(chǎng)重新配置。而RS485方案里參數(shù)通常存在讀寫(xiě)頭內(nèi)部換備件后往往忘記同步導(dǎo)致功率不對(duì)讀距變短。下表是我在選型時(shí)的對(duì)比情況對(duì)比項(xiàng)IO-LinkRS485組態(tài)方式博圖導(dǎo)入IODD通道綁定設(shè)備需配置通信模塊手動(dòng)組報(bào)文傳輸速率COM1/COM2/COM3最高230.4kbps取決于網(wǎng)關(guān)常見(jiàn)9600/19200bps電纜長(zhǎng)度20米以?xún)?nèi)標(biāo)準(zhǔn)IO-Link可達(dá)100米甚至更長(zhǎng)參數(shù)下發(fā)主站自動(dòng)下發(fā)換備件省心需要專(zhuān)用工具或組態(tài)指令調(diào)試體驗(yàn)監(jiān)控表直接讀寫(xiě)I/O地址需要報(bào)文解析和協(xié)議轉(zhuǎn)換如果你的PLC機(jī)架有空閑槽位讀寫(xiě)頭距離PLC不超過(guò)20米聽(tīng)我的直接選IO-Link后面會(huì)少很多麻煩。距離超過(guò)20米或者現(xiàn)場(chǎng)電磁干擾特別重RS485配合屏蔽雙絞線還是更穩(wěn)但程序工作量要提前算進(jìn)去。比如我有個(gè)項(xiàng)目讀寫(xiě)頭裝在轉(zhuǎn)臺(tái)內(nèi)距離PLC超過(guò)30米就用了RS485配合RS485轉(zhuǎn)PROFIBUS網(wǎng)關(guān)程序里每個(gè)讀寫(xiě)周期要處理接收幀超時(shí)比IO-Link麻煩不少。2.2 載碼體選型抗金屬、讀寫(xiě)距離和安裝間距的計(jì)算載碼體就是RFID標(biāo)簽倍加福的叫法是數(shù)據(jù)載體有高頻HF和低頻LF兩種。做產(chǎn)線工件追蹤我?guī)缀醵加肏F工作頻率13.56MHz符合ISO 15693標(biāo)準(zhǔn)讀寫(xiě)速度快數(shù)據(jù)區(qū)大一般一個(gè)載碼體有128字節(jié)用戶(hù)區(qū)存工單號(hào)、工序結(jié)果、操作員編號(hào)都?jí)蛴?。低頻125kHz的優(yōu)點(diǎn)是抗干擾強(qiáng)、讀距遠(yuǎn)但數(shù)據(jù)區(qū)小通常只有幾個(gè)字節(jié)適合只做身份識(shí)別的場(chǎng)景不適合寫(xiě)過(guò)程數(shù)據(jù)。選型時(shí)先看應(yīng)用別一味追求讀距。載碼體有抗金屬和非抗金屬之分這是最容易出問(wèn)題的地方。非抗金屬載碼體內(nèi)部沒(méi)有鐵氧體層緊貼金屬表面時(shí)射頻能量被金屬吸收讀取距離可能從30mm掉到5mm甚至完全讀不出來(lái)。如果你要把載碼體安裝在金屬工件或金屬支架上必須選抗金屬型號(hào)。我習(xí)慣在選型階段就問(wèn)清楚載碼體最終安裝面材質(zhì)如果材質(zhì)不確定就用雙面膠暫時(shí)貼在金屬板上現(xiàn)場(chǎng)測(cè)一遍再?zèng)Q定是否換抗金屬型號(hào)。讀寫(xiě)頭安裝間距不能只看載碼體貼的位置和讀寫(xiě)頭感應(yīng)面之間的垂直距離還要考慮偏移角度和載碼體移動(dòng)路徑。倍加福讀寫(xiě)頭規(guī)格書(shū)會(huì)給出最大讀距我一般把這個(gè)值打八折作為基準(zhǔn)安裝距離。比如標(biāo)稱(chēng)讀距30mm安裝垂直距離就控制在24mm以?xún)?nèi)同時(shí)允許側(cè)向偏移約10mm。如果兩個(gè)讀寫(xiě)頭在同一條輸送線上連續(xù)安裝感應(yīng)區(qū)不能重疊否則會(huì)出現(xiàn)串讀。最簡(jiǎn)單辦法是讓兩個(gè)讀寫(xiě)頭中心距大于最大讀距的2倍比如標(biāo)稱(chēng)30mm中心距至少60mm實(shí)際我做項(xiàng)目都放到100mm以上徹底避開(kāi)邊緣干擾。2.3 物理接線M12針腳定義與現(xiàn)場(chǎng)電源規(guī)劃倍加福IO-Link讀寫(xiě)頭絕大多數(shù)是M12圓形接頭四芯或五芯。標(biāo)準(zhǔn)A編碼M12插頭的針腳定義是針腳1接24V電源正極針腳3接0V針腳4接IO-Link通信數(shù)據(jù)線針腳2在不同型號(hào)上略有區(qū)別有的作為數(shù)字量輸入有的作為另一個(gè)通信通道。不要憑顏色記憶不同廠家的線纜顏色并不統(tǒng)一我見(jiàn)過(guò)好幾次把針腳2和針腳4接反讀寫(xiě)頭LED亮綠燈但一直不進(jìn)組態(tài)。接線時(shí)用標(biāo)準(zhǔn)M12連接器預(yù)制線纜最安全如果現(xiàn)場(chǎng)需要自己做線建議剝線后對(duì)著讀寫(xiě)頭標(biāo)簽上的針腳定義圖逐根確認(rèn)。IO-Link要求使用非屏蔽標(biāo)準(zhǔn)電纜即可但射頻讀寫(xiě)頭工作時(shí)會(huì)產(chǎn)生微弱的高頻信號(hào)再加上現(xiàn)場(chǎng)變頻器、伺服驅(qū)動(dòng)器多我建議使用屏蔽M12電纜屏蔽層在PLC側(cè)單端接地。線纜總長(zhǎng)度控制在IO-Link標(biāo)準(zhǔn)20米內(nèi)如果讀寫(xiě)頭在移動(dòng)機(jī)構(gòu)上要用高柔電纜固定安裝則用普通PVC護(hù)套電纜就夠。電源規(guī)劃是最容易被忽略的環(huán)節(jié)。IO-Link主站模塊和讀寫(xiě)頭共用一個(gè)24V電源沒(méi)問(wèn)題但讀寫(xiě)頭在寫(xiě)入載碼體的瞬間電流會(huì)比待機(jī)時(shí)高出不少如果電源線過(guò)長(zhǎng)或電源功率余量不足電壓跌落會(huì)讓IO-Link通信直接中斷。我一般會(huì)給IO-Link主站模塊單獨(dú)供電尤其是系統(tǒng)里還帶著其他電磁閥、繼電器負(fù)載時(shí)。供電線徑也注意距離超過(guò)2米就選0.75mm2以上IO-Link信號(hào)線和電源線共用一根M12電纜線芯截面積由電纜決定所以選擇預(yù)制電纜時(shí)就要選線徑足夠粗的規(guī)格。3. 博圖V15.1組態(tài)步驟從導(dǎo)入IODD到配置IO-Link通道3.1 導(dǎo)入倍加福讀寫(xiě)頭的IODD文件并添加到硬件目錄第一次在博圖V15.1里組態(tài)IO-Link讀寫(xiě)頭最容易被卡住的是打開(kāi)IO-Link主站模塊的通道設(shè)置下拉列表里沒(méi)有任何讀寫(xiě)頭可選。原因是博圖不認(rèn)識(shí)倍加福讀寫(xiě)頭必須先導(dǎo)入它對(duì)應(yīng)的IODD描述文件。IODD文件是一個(gè)XML格式的包包含設(shè)備ID、參數(shù)定義、數(shù)據(jù)布局等信息。正常渠道是找倍加福的技術(shù)支持獲取對(duì)應(yīng)型號(hào)的IODD文件下載后通常是個(gè)壓縮包里面包含estedes.xxdd、vendor.xxdd等文件。導(dǎo)入步驟打開(kāi)博圖V15.1后從菜單欄選“設(shè)備描述文件”—“管理”在彈出窗口中點(diǎn)擊“安裝”定位到下載的IODD文件夾。博圖會(huì)識(shí)別出供應(yīng)商“PepperlFuchs”和設(shè)備型號(hào)。安裝完成后在硬件目錄的“其他現(xiàn)場(chǎng)設(shè)備”或IO-Link主站的設(shè)備列表里就能找到這個(gè)讀寫(xiě)頭。要注意IODD文件版本必須和讀寫(xiě)頭硬件版本匹配比如讀寫(xiě)頭的IODD版本是V2.1你卻安裝了V1.0的文件組態(tài)后可能無(wú)法識(shí)別。我習(xí)慣把下載的IODD壓縮包命名為帶型號(hào)和日期的格式比如“IQH1_HF_20250315”避免版本混亂。導(dǎo)入成功后把IO-Link主站模塊拖到S7-1200的左側(cè)總線。博圖自動(dòng)分配模塊的I/O地址。右鍵點(diǎn)擊IO-Link主站模塊選擇“IO-Link設(shè)備”屬性選項(xiàng)卡在每個(gè)通道的下拉框里選擇對(duì)應(yīng)的讀寫(xiě)頭型號(hào)。選擇后通道下方會(huì)出現(xiàn)輸入長(zhǎng)度和輸出長(zhǎng)度的默認(rèn)值通常輸入6~16字節(jié)輸出4~6字節(jié)取決于讀取頭型號(hào)。這里我建議記錄下博圖自動(dòng)分配的輸入起始地址和輸出起始地址比如輸入IW64、輸出QW64后面監(jiān)控表編程全用這兩個(gè)地址。3.2 配置IO-Link端口模式、通信速率與循環(huán)時(shí)間博圖組態(tài)IO-Link主站時(shí)每個(gè)通道有幾種操作模式數(shù)字量輸入、數(shù)字量輸出、IO-Link模式。很多人這一步會(huì)忽略通道默認(rèn)為數(shù)字量模式讀寫(xiě)頭雖然接了信號(hào)線但只是作為一個(gè)開(kāi)關(guān)量輸入工作數(shù)據(jù)根本進(jìn)不了PLC。必須雙擊IO-Link主站模塊在每個(gè)通道屬性里把端口模式改為“IO-Link”然后選擇之前添加的讀寫(xiě)頭設(shè)備。只有改為IO-Link模式通道才執(zhí)行周期通信。通信速率方面IO-Link標(biāo)準(zhǔn)有COM14.8kbps、COM238.4kbps、COM3230.4kbps三檔。倍加福HF讀寫(xiě)頭一般支持COM3博圖里默認(rèn)可能是COM2建議手動(dòng)設(shè)為COM3。速率改好后讀寫(xiě)頭的LED會(huì)從慢閃變?yōu)槌A帘硎就ㄐ沤?。如果線纜長(zhǎng)度超過(guò)15米COM3可能因信號(hào)衰減出現(xiàn)偶發(fā)斷線這時(shí)要降回COM2并重啟PLC再觀察。循環(huán)時(shí)間是主站與讀寫(xiě)頭的通信周期默認(rèn)通常是10ms對(duì)RFID應(yīng)用來(lái)說(shuō)太短了因?yàn)樽x寫(xiě)頭內(nèi)部處理載碼體天線掃描需要幾十毫秒過(guò)短的循環(huán)沒(méi)有實(shí)際意義。我在參數(shù)表里把數(shù)據(jù)循環(huán)時(shí)間設(shè)為50ms這樣可以減輕PLC通信負(fù)載也不影響產(chǎn)線節(jié)拍——除非你的工位節(jié)拍小于100ms但那種場(chǎng)景一般不用RFID。還有一項(xiàng)“數(shù)據(jù)處理類(lèi)型”對(duì)倍加福讀寫(xiě)頭選“字節(jié)數(shù)據(jù)”而不是“位數(shù)據(jù)”因?yàn)檩d碼體數(shù)據(jù)是字節(jié)流。端口參數(shù)里有一項(xiàng)“設(shè)備ID校驗(yàn)”建議保持默認(rèn)。博圖會(huì)在每次通信開(kāi)始時(shí)讀取讀寫(xiě)頭的設(shè)備ID與IODD文件里的設(shè)備ID比對(duì)如果不一致通道會(huì)報(bào)錯(cuò)。倍加福原廠讀寫(xiě)頭設(shè)備ID都是統(tǒng)一的不會(huì)存在不一致的情況除非你買(mǎi)到的是兼容第三方讀寫(xiě)頭。如果你發(fā)現(xiàn)組態(tài)后通道報(bào)“設(shè)備ID錯(cuò)誤”先確認(rèn)讀寫(xiě)頭型號(hào)與IODD文件是否完全匹配不要手動(dòng)修改設(shè)備ID改了只會(huì)讓通信更奇怪。3.3 下載硬件組態(tài)并用監(jiān)控表驗(yàn)證在線狀態(tài)組態(tài)參數(shù)設(shè)好后選中PLC站點(diǎn)執(zhí)行“編譯—硬件”然后下載到CPU。下載完成后在博圖的“在線與診斷”界面里選擇IO-Link主站模塊查看通道的狀態(tài)。正常狀態(tài)下通道項(xiàng)會(huì)顯示通信已建立并且可以看到讀寫(xiě)頭的供應(yīng)商ID、設(shè)備ID、協(xié)處理器版本等具體信息。如果通道狀態(tài)顯示“無(wú)連接”或“設(shè)備失敗”就要回到硬件側(cè)排查接線和供電。確認(rèn)在線后打開(kāi)一個(gè)監(jiān)控表把IO-Link主站模塊的輸入字節(jié)地址和輸出字節(jié)地址添加到“監(jiān)視”區(qū)域。以地址字為單位監(jiān)視例如輸入地址IW64、輸出QW64。接通電源后輸入字的低字節(jié)應(yīng)該出現(xiàn)狀態(tài)值。倍加福讀寫(xiě)頭的狀態(tài)字一般是一個(gè)16位整數(shù)常見(jiàn)空閑狀態(tài)值0x8000。如果看到0x8000說(shuō)明讀寫(xiě)頭已就緒物理通信鏈路完全正常。如果狀態(tài)值是0x0000大概率是端口模式?jīng)]改對(duì)或者接線針腳有誤。監(jiān)控表還能驗(yàn)證讀寫(xiě)頭是否能檢測(cè)到載碼體。把一枚載碼體靠近讀寫(xiě)頭正常情況下?tīng)顟B(tài)字會(huì)從0x8000變?yōu)椤耙褭z測(cè)到載碼體”的值比如0x8001。如果狀態(tài)字不變先檢查載碼體是否在讀寫(xiě)頭感應(yīng)范圍內(nèi)再確認(rèn)載碼體工作頻率是否匹配。我用過(guò)一枚低頻載碼體放在高頻讀寫(xiě)頭上半天沒(méi)反應(yīng)后來(lái)才意識(shí)到兩者協(xié)議都不一樣。這一步做完硬件層面就沒(méi)問(wèn)題了下面進(jìn)入程序調(diào)試。4. 讀寫(xiě)命令調(diào)試用SCL實(shí)現(xiàn)讀取UID和寫(xiě)入載碼體數(shù)據(jù)4.1 監(jiān)控表強(qiáng)制發(fā)送命令快速驗(yàn)證讀寫(xiě)頭收發(fā)在正式寫(xiě)PLC程序前先用監(jiān)控表手動(dòng)發(fā)送一條命令確認(rèn)讀寫(xiě)頭能正確響應(yīng)。假設(shè)IO-Link主站輸出起始地址是QW64輸入起始地址是IW64。倍加福HF讀寫(xiě)頭常見(jiàn)命令布局是輸出第一個(gè)字命令碼輸出第二個(gè)字?jǐn)?shù)據(jù)長(zhǎng)度或地址輸出后續(xù)字?jǐn)?shù)據(jù)輸入第一個(gè)字狀態(tài)字輸入后續(xù)字節(jié)數(shù)據(jù)。具體偏移要以IODD或說(shuō)明書(shū)為準(zhǔn)但思路一致。在監(jiān)控表里把QW64強(qiáng)制設(shè)為“1”即發(fā)送讀取UID的命令。然后觀察IW64的變化如果讀寫(xiě)到載碼體狀態(tài)字變成0x8001緊接著的幾個(gè)字節(jié)里就是載碼體UID的前幾個(gè)字節(jié)。我用這個(gè)方法驗(yàn)證過(guò)不同尺寸的載碼體讀取到的UID完全不同能直觀判斷讀寫(xiě)頭天線是否正常工作。強(qiáng)制發(fā)送時(shí)不要一直按“立即刷新”因?yàn)閷?xiě)入命令是邊沿觸發(fā)的持續(xù)發(fā)送重復(fù)命令可能會(huì)讓讀寫(xiě)頭不停執(zhí)行相同操作。監(jiān)控表發(fā)送命令的另一個(gè)好處是能測(cè)出讀寫(xiě)命令返回的數(shù)據(jù)格式。比如發(fā)送讀取用戶(hù)數(shù)據(jù)命令時(shí)要先在輸出第二個(gè)字里指定讀取起始地址比如設(shè)為地址0。如果監(jiān)控表里看到返回?cái)?shù)據(jù)帶了前4個(gè)字節(jié)0xFF、0xFF、0xFF、0xFF說(shuō)明載碼體用戶(hù)區(qū)還沒(méi)有寫(xiě)入有效數(shù)據(jù)。這個(gè)結(jié)果能幫你判斷命令參數(shù)設(shè)置是否正確避免上來(lái)就寫(xiě)程序排查問(wèn)題時(shí)黑匣子一樣。4.2 讀取載碼體UID和用戶(hù)數(shù)據(jù)的SCL函數(shù)實(shí)現(xiàn)監(jiān)控表驗(yàn)證命令格式正確后就可以在博圖的“程序塊”里創(chuàng)建FC把讀寫(xiě)邏輯封裝成可復(fù)用的函數(shù)。下面是我在一個(gè)S7-1212C項(xiàng)目里用的簡(jiǎn)化版讀取函數(shù)用來(lái)讀取載碼體UID。這里的地址做了抽象實(shí)際項(xiàng)目中要把“ID64”和“QD64”替換成你的主站模塊地址。// 讀取載碼體UID的SCL函數(shù)用于S7-1200 FUNCTION FC_ReadUID : Void VAR_INPUT bTrigger : Bool; // 上升沿觸發(fā)讀取 iwInAddr : Int; // IO-Link主站輸入字地址偏移如64 qwOutAddr : Int; // IO-Link主站輸出字地址偏移如64 END_VAR VAR_OUTPUT bReady : Bool; // 狀態(tài)字空閑 bDone : Bool; // 讀取完成 aUID : Array[0..7] Of Byte; // 讀取到的UID 8字節(jié) wStatus : Word; // 狀態(tài)字 END_VAR VAR_TEMP ptIn : Word; // 臨時(shí)變量 END_VAR BEGIN // 非觸發(fā)狀態(tài)不發(fā)送命令 IF NOT bTrigger THEN bReady : FALSE; bDone : FALSE; RETURN; END_IF; // 發(fā)送讀取UID命令命令碼1 POKE(word, qwOutAddr, W#16#0001); // 等待狀態(tài)字出現(xiàn)0x8001最多等待20個(gè)掃描周期 FOR i : 1 TO 20 DO wStatus : PEEK(word, iwInAddr); IF wStatus W#16#8001 THEN bDone : TRUE; // 拷貝輸入緩沖區(qū)中從第2個(gè)字節(jié)開(kāi)始的8字節(jié)UID FOR j : 0 TO 7 DO aUID[j] : PEEK(byte, iwInAddr 2 j); END_FOR; EXIT; END_IF; END_FOR; // 狀態(tài)字不是空閑也不是完成則視為錯(cuò)誤 IF NOT bDone THEN bReady : FALSE; END_IF; END_FUNCTION這段代碼用POKE和PEEK指令直接訪問(wèn)過(guò)程映像區(qū)不需要擔(dān)心地址重疊問(wèn)題。參數(shù)說(shuō)明bTrigger是外部啟停信號(hào)必須用上升沿觸發(fā)否則每個(gè)掃描周期都會(huì)發(fā)一次命令。iwInAddr和qwOutAddr是主站模塊的起始地址注意博圖里有些CPU支持“字”地址直接用I64有些需要訪問(wèn)字節(jié)地址我的寫(xiě)法是用整型表示地址偏移更方便參數(shù)化。FOR循環(huán)等待狀態(tài)字是最簡(jiǎn)單的同步方式但對(duì)掃描周期有影響更好的做法是用定時(shí)器實(shí)現(xiàn)異步等待。如果狀態(tài)字遲遲不變化循環(huán)20次后函數(shù)自動(dòng)退出避免程序卡死。讀取用戶(hù)數(shù)據(jù)區(qū)的邏輯類(lèi)似只需要把命令碼從0x01改成0x02并指定讀取起始地址和數(shù)據(jù)長(zhǎng)度。倍加福標(biāo)準(zhǔn)命令中輸出第二個(gè)字通常是起始地址輸出第三個(gè)字是讀取長(zhǎng)度。要注意用戶(hù)數(shù)據(jù)區(qū)長(zhǎng)度不要超過(guò)讀寫(xiě)頭協(xié)議支持的最大長(zhǎng)度比如一次讀32字節(jié)如果你的載碼體用戶(hù)區(qū)有128字節(jié)可以分4次讀取。我在實(shí)際項(xiàng)目里只讀一次因?yàn)楣の粚?xiě)入的數(shù)據(jù)一般不超過(guò)16字節(jié)一次能讀完。4.3 寫(xiě)入載碼體數(shù)據(jù)的時(shí)序控制防止寫(xiě)壞載碼體寫(xiě)入命令比讀取命令復(fù)雜因?yàn)檩d碼體內(nèi)部閃存寫(xiě)入需要時(shí)間。發(fā)送寫(xiě)入命令后讀寫(xiě)頭會(huì)先進(jìn)入忙狀態(tài)等到數(shù)據(jù)完全寫(xiě)入才返回完成狀態(tài)。如果PLC在忙狀態(tài)時(shí)發(fā)送下一條命令可能打斷寫(xiě)入過(guò)程輕則寫(xiě)入失敗重則載碼體數(shù)據(jù)區(qū)損壞。我遇到過(guò)載碼體寫(xiě)了一半之后再讀取整個(gè)用戶(hù)區(qū)都是0xFF只能報(bào)廢。安全的寫(xiě)入流程分四步第一步發(fā)送寫(xiě)入命令第二步輪詢(xún)狀態(tài)字是否為“寫(xiě)入完成”第三步空閑后延時(shí)50ms再允許下一條命令第四步重新讀取該地址區(qū)域校驗(yàn)數(shù)據(jù)。下面是一個(gè)寫(xiě)入用戶(hù)數(shù)據(jù)的SCL片段使用了一個(gè)內(nèi)部定時(shí)器做延時(shí)。// 寫(xiě)入載碼體用戶(hù)區(qū)的關(guān)鍵邏輯 // bWriteTrigger: 寫(xiě)入觸發(fā) // qwOutAddr: 輸出起始地址 // iwInAddr: 輸入起始地址 IF bWriteTrigger AND NOT bWriteBusy THEN // 組裝寫(xiě)入命令 // 命令碼0x03起始地址bStartAddr數(shù)據(jù)長(zhǎng)度Len POKE(word, qwOutAddr, W#16#0003); POKE(word, qwOutAddr 2, bStartAddr); POKE(word, qwOutAddr 4, Len); FOR i : 0 TO Len - 1 DO POKE(byte, qwOutAddr 6 i, aData[i]); END_FOR; bWriteBusy : TRUE; tonWriteTimer(IN:TRUE, PT:T#50MS); END_IF; // 輪詢(xún)狀態(tài)字 IF bWriteBusy THEN wStatus : PEEK(word, iwInAddr); IF wStatus W#16#8002 THEN // 寫(xiě)入完成 bWriteBusy : FALSE; bWriteDone : TRUE; tonWriteTimer(IN:FALSE); ELSIF wStatus W#16#8000 THEN // 回到空閑說(shuō)明寫(xiě)入失敗 bWriteBusy : FALSE; bWriteError : TRUE; END_IF; END_IF;這個(gè)片段的要點(diǎn)寫(xiě)入命令的觸發(fā)要加互鎖防止重復(fù)寫(xiě)入寫(xiě)完必須輪詢(xún)完成狀態(tài)不能只發(fā)命令不管結(jié)果寫(xiě)入完成后要再讀一遍數(shù)據(jù)區(qū)做校驗(yàn)這是我在現(xiàn)場(chǎng)總結(jié)出來(lái)最有效防錯(cuò)手段。另外載碼體寫(xiě)入有最小頁(yè)大小限制常見(jiàn)是4字節(jié)一頁(yè)所以Len必須是4的倍數(shù)不夠就補(bǔ)0xFF。如果寫(xiě)入長(zhǎng)度不合法讀寫(xiě)頭會(huì)立即返回錯(cuò)誤狀態(tài)比如0x8413。程序里還有一個(gè)容易忽略的點(diǎn)載碼體的地址映射。用戶(hù)區(qū)地址有的從0x00開(kāi)始有的從0x10開(kāi)始讀寫(xiě)頭通過(guò)命令參數(shù)指定起始地址。我在一臺(tái)設(shè)備上調(diào)試時(shí)寫(xiě)入命令的起始地址設(shè)為0但讀回來(lái)數(shù)據(jù)都在地址16以后原因是那款載碼體的用戶(hù)區(qū)本身把前16字節(jié)保留用于特殊功能。查閱載碼體數(shù)據(jù)手冊(cè)后改用起始地址16寫(xiě)入一次成功。調(diào)試這種問(wèn)題不能只看PLC數(shù)據(jù)要結(jié)合載碼體內(nèi)部地址圖和讀寫(xiě)頭命令說(shuō)明。5. 倍加福讀寫(xiě)頭調(diào)試常見(jiàn)問(wèn)題排查5個(gè)翻車(chē)現(xiàn)場(chǎng)5.1 博圖找不到讀寫(xiě)頭IODD未導(dǎo)入或端口模式錯(cuò)現(xiàn)象是IO-Link主站通道設(shè)備列表里是空的下拉框沒(méi)有倍加福讀寫(xiě)頭可選。檢查過(guò)程分兩層先看IODD文件是否安裝成功在博圖“設(shè)備描述文件—管理”里應(yīng)能看到倍加福設(shè)備的條目。如果沒(méi)有重新導(dǎo)入并注意安裝時(shí)選擇正確文件夾。第二層看端口模式即使設(shè)備條目已安裝如果通道屬性是“數(shù)字量輸入/輸出”下拉框也不會(huì)出現(xiàn)IO-Link設(shè)備列表。解決方法是把端口模式改為“IO-Link”再重新選擇設(shè)備。還有一種情況是讀寫(xiě)頭本身供電異常。IO-Link主站模塊的通道會(huì)為連接的設(shè)備提供24V電源如果讀寫(xiě)頭電源針腳接觸不良或線纜內(nèi)部斷芯讀寫(xiě)頭LED不亮或閃紅燈。這時(shí)候博圖里無(wú)論如何找不到設(shè)備因?yàn)橹髡緵](méi)有檢測(cè)到設(shè)備的存在。優(yōu)先用萬(wàn)用表量讀寫(xiě)頭M12插頭針腳1和3之間的電壓應(yīng)在24V左右。5.2 能讀UID但用戶(hù)數(shù)據(jù)全零起始地址與長(zhǎng)度參數(shù)問(wèn)題讀寫(xiě)頭能讀到載碼體UID證明射頻通信正常但讀取用戶(hù)數(shù)據(jù)時(shí)返回全0或數(shù)據(jù)位數(shù)不對(duì)。這個(gè)問(wèn)題原因有兩個(gè)一是讀寫(xiě)頭讀取用戶(hù)區(qū)時(shí)需要指定起始地址如果不指定或指定的地址超出載碼體有效地址范圍讀寫(xiě)頭會(huì)返回空數(shù)據(jù)。二是載碼體的用戶(hù)區(qū)只有部分字節(jié)已寫(xiě)入出廠默認(rèn)填充0x00如果你讀取的地址段從未寫(xiě)入過(guò)數(shù)據(jù)讀回來(lái)自然全是0。解決步驟是先用監(jiān)控表強(qiáng)制發(fā)送讀取命令命令參數(shù)里顯式寫(xiě)上起始地址為0數(shù)據(jù)長(zhǎng)度為16字節(jié)觀察返回內(nèi)容。如果還是全0換一個(gè)已知寫(xiě)入數(shù)據(jù)的載碼體再試。如果已知載碼體在別的讀寫(xiě)頭上能讀出數(shù)據(jù)在這臺(tái)讀寫(xiě)頭上全0那就是讀寫(xiě)頭的”讀取區(qū)“配置有問(wèn)題比如激活了某種數(shù)據(jù)過(guò)濾或掩碼功能。查看讀寫(xiě)頭IODD參數(shù)關(guān)閉“數(shù)據(jù)過(guò)濾”即可。5.3 寫(xiě)入載碼體報(bào)錯(cuò)寫(xiě)保護(hù)、頁(yè)大小和供電壓降寫(xiě)入錯(cuò)誤的表現(xiàn)是狀態(tài)字返回錯(cuò)誤碼或者明明提示寫(xiě)入完成但重新讀取時(shí)數(shù)據(jù)仍是舊值。最常見(jiàn)的三個(gè)原因按優(yōu)先級(jí)排列載碼體寫(xiě)保護(hù)位被置位數(shù)據(jù)長(zhǎng)度不是頁(yè)大小的整數(shù)倍以及寫(xiě)入瞬間電源電壓跌落。寫(xiě)保護(hù)位可以通過(guò)讀寫(xiě)頭命令讀取狀態(tài)字中的保護(hù)位標(biāo)志但更直接的方法是換一枚全新載碼體測(cè)試排除保護(hù)位問(wèn)題。頁(yè)大小問(wèn)題在倍加福載碼體上很典型比如某型號(hào)一頁(yè)4字節(jié)寫(xiě)入長(zhǎng)度給5字節(jié)讀寫(xiě)頭返回錯(cuò)誤。解決辦法是把數(shù)據(jù)長(zhǎng)度補(bǔ)成4的倍數(shù)補(bǔ)的字節(jié)用0xFF或0x00都可以。供電壓降這個(gè)坑很隱蔽我見(jiàn)過(guò)一個(gè)讀寫(xiě)頭寫(xiě)入時(shí)報(bào)“射頻錯(cuò)誤”排查到最后發(fā)現(xiàn)是IO-Link主站模塊電源線太細(xì)寫(xiě)入瞬間電流上升到350mA線纜壓降導(dǎo)致電壓低于21.5V。把電源線加粗到0.75mm2寫(xiě)入就正常了。5.4 多讀寫(xiě)頭串讀感應(yīng)區(qū)重疊與分時(shí)使能在相鄰工位安裝兩個(gè)讀寫(xiě)頭有時(shí)讀寫(xiě)頭A的緩沖區(qū)里出現(xiàn)了讀寫(xiě)頭B感應(yīng)區(qū)的載碼體數(shù)據(jù)。這種現(xiàn)象叫串讀本質(zhì)是射頻場(chǎng)重疊或反射。解決方法是拉開(kāi)距離讓兩個(gè)讀寫(xiě)頭的感應(yīng)區(qū)在物理上不重疊。如果空間不允許可以在程序里給每個(gè)讀寫(xiě)頭加一個(gè)“使能”命令寫(xiě)入空閑命令到不工作的讀寫(xiě)頭使其天線停止發(fā)射然后再操作另一個(gè)讀寫(xiě)頭。軟件分時(shí)使能的方法很簡(jiǎn)單每個(gè)讀寫(xiě)頭輸出緩沖區(qū)有一個(gè)“讀/寫(xiě)”命令口發(fā)送命令0x0000表示休眠不發(fā)送任何射頻命令。在SCL里兩個(gè)讀寫(xiě)頭的工作觸發(fā)做互鎖同一時(shí)間只讓一個(gè)讀寫(xiě)頭發(fā)送命令。這樣即使感應(yīng)區(qū)有重疊也不會(huì)發(fā)生同時(shí)識(shí)別。這個(gè)辦法我用于同一個(gè)龍門(mén)架上兩個(gè)讀寫(xiě)頭間距只有40mm的場(chǎng)景問(wèn)題立即消失。5.5 地址寫(xiě)錯(cuò)通道主站地址分配與字對(duì)齊陷阱程序里明明把命令寫(xiě)到了QD64但讀寫(xiě)頭沒(méi)有反應(yīng)檢查后才發(fā)現(xiàn)讀寫(xiě)頭接在通道2而QD64是通道1的地址。這是組態(tài)時(shí)最容易犯的錯(cuò)誤。博圖添加IO-Link主站模塊后起始地址是針對(duì)整個(gè)模塊的每個(gè)通道地址按順序排列但不會(huì)自動(dòng)直觀顯示。需要在組態(tài)界面點(diǎn)選具體通道在“地址”選項(xiàng)卡里查看它對(duì)應(yīng)的輸入/輸出起始地址然后修改程序中的地址。另一個(gè)隱藏問(wèn)題是對(duì)齊方式。有些IO-Link主站模塊的I/O地址是字對(duì)齊的輸入地址從IW64開(kāi)始但讀寫(xiě)頭的第一個(gè)狀態(tài)字節(jié)不是最低字節(jié)而是最高字節(jié)也就是大端模式。在這種情況下直接用“W”訪問(wèn)狀態(tài)字沒(méi)問(wèn)題但如果你用“B”訪問(wèn)字節(jié)可能讀到的實(shí)際是狀態(tài)字的高字節(jié)或低字節(jié)導(dǎo)致判斷邏輯錯(cuò)誤。我建議始終以字為單位讀取狀態(tài)字避免字節(jié)對(duì)齊差異。如果一定要用字節(jié)先在監(jiān)控表里確認(rèn)數(shù)據(jù)布局再寫(xiě)程序。6. 把讀寫(xiě)頭嵌進(jìn)產(chǎn)線用UID做多工位追溯的驗(yàn)證習(xí)慣單點(diǎn)調(diào)試通過(guò)后讀寫(xiě)頭真正落地到產(chǎn)線通常要解決多工位追溯問(wèn)題。我的常規(guī)做法是建立一張“載碼體跟蹤表”把每枚載碼體的UID作為唯一標(biāo)識(shí)在PLC全局DB中維護(hù)一條記錄記錄內(nèi)容是工件號(hào)、各工位的工序結(jié)果和寫(xiě)入時(shí)間。每個(gè)工位讀寫(xiě)頭讀取UID后在跟蹤表中查找該UID是否存在不存在則新建存在則更新對(duì)應(yīng)工位數(shù)據(jù)。這個(gè)表在博圖里用STRUCT數(shù)組實(shí)現(xiàn)數(shù)組大小按產(chǎn)線同時(shí)運(yùn)行的工件數(shù)量確定比如100個(gè)工件就建100條記錄再多就要考慮與MES的通信。實(shí)際驗(yàn)證這套系統(tǒng)我留下來(lái)的習(xí)慣是每調(diào)試一個(gè)工位就拿一枚載碼體在這枚載碼體上手動(dòng)寫(xiě)入一個(gè)遞增的測(cè)試編號(hào)然后讓載碼體順著輸送線走到下一個(gè)工位觀察工位程序是否識(shí)別。這個(gè)過(guò)程不能只在編程軟件里看變量要在HMI上做一個(gè)“最近讀取記錄”頁(yè)面直接顯示讀到的UID和上一工位寫(xiě)入的數(shù)據(jù)。用HMI頁(yè)面驗(yàn)證比看DB監(jiān)視值更直觀也方便產(chǎn)線維護(hù)人員日后使用。驗(yàn)證過(guò)程中最怕出現(xiàn)臟數(shù)據(jù)。如果之前調(diào)試時(shí)手動(dòng)寫(xiě)過(guò)不完整的記錄這些數(shù)據(jù)殘留在載碼體用戶(hù)區(qū)會(huì)干擾后續(xù)工位判斷。我多次吃過(guò)這個(gè)虧所以現(xiàn)在養(yǎng)成一個(gè)習(xí)慣每次測(cè)試前先用“清除載碼體用戶(hù)區(qū)”的命令把所有測(cè)試載碼體重置為統(tǒng)一狀態(tài)再開(kāi)始新的測(cè)試序列。這不算復(fù)雜功能但在SCL里增加一個(gè)系統(tǒng)維護(hù)頁(yè)面手動(dòng)觸發(fā)清除命令調(diào)試和試生產(chǎn)階段都非常有用。調(diào)試多工位追溯其實(shí)是在和數(shù)據(jù)殘留作斗爭(zhēng)。處理好這一點(diǎn)產(chǎn)線上的RFID系統(tǒng)會(huì)穩(wěn)定很多。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取