
Epson之Tcp/IP通訊網(wǎng)絡(luò)助手設(shè)置注意1設(shè)置ip為0.0.0.0注意2發(fā)送信息需要加上換行符因為下面設(shè)置的時候設(shè)置了CRLF SetNet #201,IP$,8080,CRLF,NONE,0Function main qt Test 啟動后臺任務(wù)不等它繼續(xù)往下走 Call TcpConnect rint主程序繼續(xù)干活ait2Fend Function TcpConnect String IP$ IP$192.168.0.12 PC網(wǎng)絡(luò)調(diào)試助手的局域網(wǎng) IP CloseNet All 先關(guān)掉所有舊連接防止殘留 Wait1 配置通道 #201目標(biāo)192.168.0.12端口8080CRLF 換行無校驗 SetNet #201,IP$,8080,CRLF,NONE,0OpenNet #201As Client 以客戶端身份撥號 WaitNet #201,10 最多等10秒連接結(jié)果IfTWTrue Then TWTrue 表示連接失敗 Print連接上位機失敗請確認(rèn)網(wǎng)絡(luò)調(diào)試助手已啟動監(jiān)聽CloseNet All Quit All EndIf Print連接成功FendEpson 機械手 TCP/IP 通信教程SPEL 版一、TCP/IP 是什么先打個比方IP 地址 門牌號。你的機械手控制器和上位機視覺軟件都在同一個局域網(wǎng)里每臺設(shè)備有一個唯一門牌號如192.168.1.50。發(fā)數(shù)據(jù)前先要知道對方門牌號。端口 房門號。一個門牌號下面有很多房間端口。機械手和視覺軟件約定好取料數(shù)據(jù)走 9600 號房下相機數(shù)據(jù)走 9700 號房。兩邊同時開多個房間各聊各的互不干擾??蛻舳?/ 服務(wù)器 打電話的主動方和被動方。服務(wù)器視覺軟件一直守機待呼客戶端機械手主動撥號過去。本項目里機械手是客戶端視覺軟件是服務(wù)器機械手控制器客戶端 視覺電腦服務(wù)器 │ │ │ OpenNet #201 As Client │ 監(jiān)聽端口 9600 │───────────────────────────────────────?│ │ Print #201, get ←── 發(fā)命令 ──? │ 收到get │ Input #201, ... ?── 等回復(fù) ── │ 回 gok1,123.5,45.6,90 ▼ ▼一問一答 對講機。連上之后兩邊就靠Print發(fā)和Input收輪流說話一問一答保證不搶話。數(shù)據(jù)格式 信封寫法。雙方約定一行數(shù)據(jù)用逗號分隔字段行尾用換行符CRLF表示這句話說完了。二、Epson 網(wǎng)絡(luò)指令全家桶指令作用項目里怎么用SetNet #n, IP$, 端口, CRLF, NONE, 超時配置一個網(wǎng)絡(luò)通道相當(dāng)于撥號設(shè)置SetNet #201, 192.168.1.50, 9600, CRLF, NONE, 0OpenNet #n As Client以客戶端身份發(fā)起連接OpenNet #201 As ClientWaitNet #n, 秒等待連接結(jié)果最多等 N 秒WaitNet #201, 10TW連接/發(fā)送失敗標(biāo)志True 失敗If TW True Then ... 報錯退出CloseNet #n/CloseNet All關(guān)閉通道 / 全部通道重連前先CloseNet AllPrint #n, 內(nèi)容通過通道發(fā)送數(shù)據(jù)Print #201, getInput #n, 變量1, 變量2, ...從通道接收一行按逗號拆分Input #201, CMD$, X$, Y$, A$SetNet 參數(shù)逐個說參數(shù)含義取值說明#n通道號一個控制器可開多個通道本項目用了 #201 / #210 / #216IP 地址對方門牌號字符串如192.168.1.50端口對方房門號數(shù)字本項目 9600 / 9700CRLF行終止符每句話結(jié)尾的換行格式雙方要一致NONE校驗位常用 NONE無校驗超時連接超時項目初始化用 0標(biāo)定程序用了 5000具體以控制器手冊為準(zhǔn)一句話記憶SetNet 配置 → OpenNet 連接 → WaitNet 等結(jié)果 → Print/Input 收發(fā) → CloseNet 關(guān)閉。三、源碼①初始化連接機械手主動連上位機3.1 打開網(wǎng)絡(luò)調(diào)試助手啟動服務(wù)端3.2 寫客戶端代碼下面這段來自項目Main.prg的ini()函數(shù)做了簡化。功能連接視覺上位機連不上就提示并退出。FunctionTcpConnectStringIP$IP$192.168.1.50 上位機視覺軟件的門牌號 CloseNet All 先關(guān)掉所有舊連接防止殘留Wait1 配置通道 #201IP192.168.1.50端口9600CRLF 換行無校驗 SetNet #201,IP$,9600,CRLF,NONE,0OpenNet #201AsClient 以客戶端身份撥號 WaitNet #201,10 最多等10秒連接結(jié)果IfTWTrueThen TWTrue 表示連接失敗Print連接上位機失敗請確認(rèn)視覺軟件已啟動 CloseNet All Quit All 退出整個程序 EndIfPrint連接上位機成功 再開一個通道給下相機不同端口各聊各的 SetNet #210,IP$,9700,CRLF,NONE,0OpenNet #210AsClient WaitNet #210,10IfTWTrueThenPrint連接下相機失敗 CloseNet All Quit All EndIfPrint連接下相機成功 Fend逐行理解CloseNet All重連前先清場避免上一個連接沒斷新連接失敗。SetNet只是寫好撥號設(shè)置真正打電話的是OpenNet。WaitNet是等結(jié)果的關(guān)鍵不看WaitNet結(jié)果就直接發(fā)數(shù)據(jù)等于不等對方接電話就說話。TW是是否出問題的標(biāo)志連接失敗、發(fā)送失敗都會變 True一定要判斷。四、源碼②一問一答——向上位機要坐標(biāo)取料核心這是本項目最典型的通信模式機械手發(fā)命令 → 視覺回坐標(biāo) → 機械手拿坐標(biāo)去取料。FunctionGetNutAndTakeStringCMD$,X$,Y$,A$ 接收的命令字三個坐標(biāo)值 循環(huán)要料直到拿到有效坐標(biāo)DoPrint#201,get ① 發(fā)命令我要料Input#201,CMD$,X$,Y$,A$ ② 等回復(fù)例如gok1,123.45,67.89,90.0PrintCMD$,X$,Y$,A$ ③ 打印看看收到啥調(diào)試必備IfCMD$gok1Then ④ 收到可以取第1顆 → 跳出循環(huán)ExitDoEndIfIfCMD$gok2OrCMD$gok3OrCMD$gok4ThenExitDoEndIf ⑤ 沒收到有效坐標(biāo)回安全位讓上位機重新準(zhǔn)備1秒后再問 Jump homeposWait1Loop ⑥ 拿到坐標(biāo)去取料Val把字符串轉(zhuǎn)成數(shù)值 Tool1Jump XY(Val(X$),Val(Y$),-10,Val(A$))/R /R 相對當(dāng)前位置移動 Fend這個模式叫協(xié)議握手要點先發(fā)后收一問一答Print和Input必須配對誰先說話、回什么雙方提前約定好?;貜?fù)是命令字 逗號 數(shù)據(jù)gok1,123.45,67.89,90.0拆成 4 個變量Input自動按逗號拆分。無效回復(fù)就重試收到不認(rèn)識的內(nèi)容別硬干回安全位等 1 秒再問這就是異常容錯。Val()轉(zhuǎn)數(shù)值通信收進來全是字符串取料前記得Val()轉(zhuǎn)成數(shù)字。五、源碼③完整的 TCP 測試程序可復(fù)制到 RC 直接跑想在真實控制器上體驗通信寫一個機械手-上位機對講機械手連上后每 1 秒發(fā)一個ping上位機回pong就打印。上位機一側(cè)可以用任意 TCP 調(diào)試工具如網(wǎng)絡(luò)調(diào)試助手監(jiān)聽 9600 端口當(dāng)服務(wù)器。 TCP 測試程序機械手作為客戶端與上位機一問一答 上位機服務(wù)器監(jiān)聽192.168.1.50:9600收到 ping 回 pong FunctionTcpTestStringCMD$IntegerCount CloseNet AllWait0.5 ① 連接 SetNet #201,192.168.1.50,9600,CRLF,NONE,0OpenNet #201AsClient WaitNet #201,10IfTWTrueThenPrint連接失敗請檢查Print1.上位機是否監(jiān)聽9600端口Print2.IP是否192.168.1.50Print3.網(wǎng)線/防火墻是否放行 Quit All EndIfPrint連接成功開始對講測試 ② 一問一答循環(huán) Count0DoCountCount1Print#201,ping 發(fā)命令Print發(fā)送 ping(第, Count, 次)Input#201,CMD$ 等回復(fù)會阻塞上位機必須回IfCMD$pongThenPrint收到 pong通信正常ElsePrint收到未知內(nèi)容,CMD$ EndIfWait1LoopFend跑這個程序前請注意Input是阻塞等待的——上位機不回話程序會一直停在那。所以先啟動服務(wù)器端TCP 調(diào)試工具再運行程序。如果卡住不動多半是發(fā)了沒人回或換行符不一致先 CtrlC / 急停退出程序再檢查。六、項目里的通信協(xié)議長什么樣本項目一共有三個通道各管一攤通道端口用途上行機械手→視覺下行視覺→機械手#2019600取料視覺get、checknutcount、RobotIniOKStart、gok1~gok4(X,Y,A)#2109700下相機acqDown,1、checkCoorddowncamacqok(X,Y,U)、checkCoord 坐標(biāo)#2169600標(biāo)定moveacq、toolset、go9point等moveok、toolsetok、anglerotationok協(xié)議設(shè)計建議命令字 逗號 參數(shù)acqDown,1比acqDown1好擴展視覺端用Split一下就行。一問一答要成對發(fā)了命令必須等回復(fù)回復(fù)里帶命令字如downcamacqok方便判狀態(tài)?;貜?fù)要能區(qū)分成功/失敗視覺側(cè)回了gok系列代表有料回別的代表沒料/異常機械手據(jù)此決定取還是等。每條命令都有兜底項目里取料用Do...Loop循環(huán)重試防止上位機一時沒準(zhǔn)備好吃料。換行符必須一致機械手設(shè)CRLF視覺軟件解析時也要按 CRLF 切行否則兩條數(shù)據(jù)粘在一起。七、常見問題排查表現(xiàn)象原因處理方法TW True連接失敗IP 不對 / 端口沒監(jiān)聽 / 上位機沒啟動 / 防火墻攔截先 Ping 通 IP確認(rèn)視覺軟件已啟動關(guān)防火墻或加白名單連上了但收不到數(shù)據(jù)程序卡在Input上位機沒回、或回的行尾不是 CRLF用網(wǎng)絡(luò)調(diào)試助手模擬回復(fù)確認(rèn)視覺端用 CRLF 換行收到亂碼/數(shù)據(jù)粘在一起換行符不一致、半包/粘包統(tǒng)一 CRLF數(shù)據(jù)太長時分多次收發(fā)有時能連有時連不上上次連接沒關(guān)閉重連前先CloseNet AllWait 1通信正常但機械手亂動坐標(biāo)沒Val()轉(zhuǎn)換、或沒加/R導(dǎo)致絕對定位取料點用Val(X$)并加/R相對移動標(biāo)定程序連不上 5000通道超時參數(shù)設(shè)太小參考項目標(biāo)定通道SetNet #216, ..., 5000排查三板斧先Print打印收到的字符串看內(nèi)容對不對——通信調(diào)試第一原則先看數(shù)據(jù)再談運動。用網(wǎng)絡(luò)調(diào)試助手當(dāng)假服務(wù)器不發(fā)真視覺軟件也能測通協(xié)議??ㄗ∠燃蓖?退出程序再查原因別讓機械手一直等。八、Epson 源碼速查復(fù)制即用1. 連接初始化含雙通道FunctionTcpInit CloseNet AllWait1SetNet #201,192.168.1.50,9600,CRLF,NONE,0OpenNet #201AsClient WaitNet #201,10IfTWTrueThenPrint連接失敗 Quit All EndIf SetNet #210,192.168.1.50,9700,CRLF,NONE,0OpenNet #210AsClient WaitNet #210,10IfTWTrueThenPrint連接失敗 Quit All EndIf Fend2. 發(fā)送命令Print#201,get 發(fā)不帶參數(shù)的命令Print#210,acqDown,,Index 發(fā)帶參數(shù)的命令逗號拼接3. 接收并拆分Input#201,CMD$,X$,Y$,A$ 一行按逗號拆成4個字符串PrintCMD$,X$,Y$,A$ 先打印再使用調(diào)試習(xí)慣4. 帶超時的等待防死等 發(fā)完命令后最多等3秒回復(fù)超時重發(fā)Print#201,getWait0.1TmReset1DoIfTmr(1)3ThenPrint等待超時重新發(fā)送Print#201,getTmReset1EndIfWaitSw(CheckXiQi1)On,0.1 占位循環(huán)體里做點別的避免空轉(zhuǎn)LoopWhile10 占位結(jié)構(gòu)實際按需求改寫說明Input本身沒有超時參數(shù)需要限時等待時用Tmr計時器 重發(fā)邏輯做保護這是現(xiàn)場防死機的標(biāo)準(zhǔn)做法。九、一句話總結(jié)SetNet 配好門牌 → OpenNet 撥號 → WaitNet 等接通 → Print 說話 → Input 聽話 → CloseNet 掛斷這就是 Epson TCP/IP 通信的全部骨架。剩下的就是和上位機約定好說什么、回什么、用逗號還是空格、換行用啥然后把每一問一答都加上重試和超時保護。