Epson机器人编程初级阶(三)

TCP通讯案例

1. 调用函数

'TCP通讯案例
Global String X1$, Y1$, Z1$, U1$ '定义全局变量
Function TCP1
    Call inition '初始化程序,打开电源设置速度等
    Call NetConnet '建立连接
    Do
        Call Data '调用接收数据函数
        Go XY(Val(X1$), Val(Y1$), Val(Z1$), Val(U1$)) '执行动作
    Loop
Fend

 

2.建立TCP连接函数

'建立tcp连接
Function NetConnet
    SetNet #201, "127.0.0.1", 8000, CRLF, NONE, 0
    OpenNet #201 As Server '打开并设置201为服务器
    Print "等待201端口连接"
    WaitNet #201 '等待网络连接成功
    Print "201端口口连接成功"
Fend

 

3.标定取料脚本

Global Integer buzhou '流程步骤
Global String fasongshuju$ '发送数据
Global String getData$ '接收的数据
Global Double zuobiaoX, zuobiaoY, zuobiaoU '上位机发送过来要走的点位数据

Global Double quliaogaodu '取料高度
Global Double fangliaogaodu '放料高度
Global Double upch '上相机标定高度
Global Double downch '下相机标定高度



Global String All$
Global Double inx, iny, inu
Global String outx$, outy$, outu$, I$
Global String data$(3)
Global Integer TcpOK

Function InitailTcp
    
    '!!!注意Z轴的高度参数一定要先示教否则会撞机
    'P1(回原点)、P10(放料点) 点也需要手动示教保存
    quliaogaodu = -32 '取料高度
    fangliaogaodu = -12 '放料高度
    upch = -32 '上相机标定高度
    downch = -32 '下相机标定高度
    
    'SetNet #201, "192.168.3.11", 5000, CRLF, NONE, 0
    SetNet #201, "127.0.0.1", 5000, CRLF, NONE, 0
    OpenNet #201 As Server '打开机器人201端口
    Print "等待201端口连接" '显示当前连接状态
    WaitNet #201 '等待网络端口连接成功
    Print "201" + "端口连接成功" '显示当前连接状态
    TcpOK = 1
    'Xqt SKT
    Wait TcpOK <> 0
    '回零点P1 需要自己先示教
    Call GetData
    
Fend

Function GetData
    
        Do
            If ChkNet(201) > 0 Then
                '读取端口数据
                Input #201, getData$
                
                ParseStr getData$, data$(), ":" '上位机发送的数据用:分割开
                '判断有数据指令
                If data$(0) <> "" Then
                    buzhou = Val(data$(0)) '上位机发送的数据分割开第一个是步骤
                    zuobiaoX = Val(data$(1)) '上位机发送的数据分割开第二个是X坐标
                    zuobiaoY = Val(data$(2)) '上位机发送的数据分割开第三个是Y坐标
                    zuobiaoU = Val(data$(3)) '上位机发送的数据分割开第四个是R坐标 --旋转轴
              
                    Print getData$ '显示当前连接状态
                         '0 回零
                       If buzhou = 0 Then
                        'On (15)
                        Go P1
                        fasongshuju$ = "Done"
                        Print #201, fasongshuju$ '发送数据的指令  数据是fasongshuju
                        buzhou = -999
                            
                       '1 走标定点 X、Y、R, Z轴示教定死
                       ElseIf buzhou = 1 Then
                       '下相机
                        Go XY(zuobiaoX, zuobiaoY, upch, zuobiaoU)
                        '上相机
                        'Go XY(zuobiaoX, zuobiaoY, downch, zuobiaoU)
                        fasongshuju$ = "Done"
                        Print #201, fasongshuju$ '发送数据的指令  数据是fasongshuju
                        buzhou = -999
                        Print "buzhou = 1" '显示当前连接状态 
                        
                       '2 取料
                       ElseIf buzhou = 2 Then
                           Off (15) '打开15输出口
                           Wait (0.5) '等待100ms
                           Go XY(zuobiaoX, zuobiaoY, fangliaogaodu, zuobiaoU)
                           Wait (0.5)
                           Go XY(zuobiaoX, zuobiaoY, quliaogaodu, zuobiaoU)
                           Wait (0.5)
                           On (15)
                           Wait (0.5)
                           Go XY(zuobiaoX, zuobiaoY, fangliaogaodu, zuobiaoU)
                           Go P10 '放料位
                           Wait (0.5)
                           Go P10 +Z(-10)
                           Wait (0.5)
                           Off (15)
                           Go P1 '放料完成回原点
                           fasongshuju$ = "Done"
                           Print #201, fasongshuju$ '发送数据的指令  数据是fasongshuju
                           buzhou = -999
                           
                        '3 去放料点
                        ElseIf buzhou = 3 Then
                           Go XY(zuobiaoX, zuobiaoY, fangliaogaodu, zuobiaoU)
                      
                         
                           fasongshuju$ = "Done"
                           Print #201, fasongshuju$ '发送数据的指令  数据是fasongshuju
                           buzhou = -999
                           
                         '4 获取机器人当前坐标点 X、Y、U
                        ElseIf buzhou = 4 Then
                           P0 = RealPos
                           '格式 X:  600.000 Y:    0.000 Z:    0.000 U:    0.000 V:    0.000 W:    0.000 /R /0
                           Print #201, P0  '发送数据的指令  数据是fasongshuju
                           buzhou = -999
                        
                   EndIf
                EndIf
                

            EndIf
            
        Loop
    
    
Fend

 

4.接收通讯数据函数

'接收通讯数据
Function Data
    AA:
    If ChkNet(201) >= 0 Then '判断数据个数是否>=0
        Input #201, X1$, Y1$, Z1$, U1$ '数据发送格式必须用逗号隔开,和接收一致
        Print "接收到:", "X值", X1$, "Y值", Y1$, "Z值", Z1$, "U值", U1$
        Print "接收到数据个数", ChkNet(201)
        Print #201, "收到数据" '向外发送数据回复
    Else
        CloseNet #201 '关闭OpenNet打开的201端口
        OpenNet #201 As Server
        Print "连接中"
        WaitNet #201
        Print "连接成功"
        GoTo AA '跳转到标签AA处继续执行,也可以用GoSub
    EndIf
Fend

 

5.常见问题:TCP服务器启动后自动连接

场景:机器人作为服务器,上位机作为客户端连接机器人。但是服务器一启动就显示连接成功,实际上位机并未连接。

找到:设置 >> 系统配置 >> 控制器 >> TCP/IP ,去掉 “模拟”勾选,选择 “实际”。

 

6.常见问题:机器人接收数据卡住

和机器人的TCP建立连接,发送方发送了数据,但是机器人卡住 Input ...  也没有异常提示。

原因是:发送方发送数据格式不规范,我们可以看到上图:终端(T):CRLF

意思是数据末尾要加 回车符和换行符,因此给机器人发送数据在末尾要加上 \r\n。我们要根据设置的终端标识,加上对应的字符。

//回车符(CR,即'\r')和换行符(LF,即'\n'),CRLF = \r\n
tcpService.ClientSend($"{msg}\r\n");

 

posted @ 2024-07-15 18:41  别动我的猫  阅读(328)  评论(0编辑  收藏  举报