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