这里写自定义目录标题

  • 记录下项目上使用的通讯
    • 川崎机器人套接字编程
    • FINS TCP报文分析
      • 握手
      • 读取
      • 写入
    • 川崎机器人通讯源码

记录下项目上使用的通讯

开个坑,在项目中利用川崎机器人自带的TCP实现了与欧姆龙PLC通讯,仅作为总结记录

川崎机器人套接字编程

1、川崎机器人TCP通讯命令
川崎机器人TCP通讯命令如图

本程序中,川崎机器人作为客户端使用,用到的命令有:TCP_CONNECT、TCP_SEND、TCP_RECV、TCP_CLOSE,外加TCP_STATUS指令,该指令作为通讯连接状态判断。详细的通讯命令用法可参考手册。
2、川崎机器人TCP通讯特性
调试过程中,发现川崎机器人在发送和接收套接字的时候,当要发送或接收的文本中有“H00”这个字节时,川崎机器人会将后面所有的字节认定为“H00”,所以,我在写发送报文的时候将报文拆分成字符串数组处理,保证数组中每个字符串中间不含有“H00”,如下:

  .$fsend[1] = $CHR(^H46)+$CHR(^H49)+$CHR(^H4e)+$CHR(^H53)+$CHR(^H0)+$CHR(^H0)+$CHR(^H0) ;报文头 川崎机器人一个ASCII字符串中出现00即Null的时候后面的字符全部置为00.$fsend[2] = $CHR(^H1a).$fsend[3] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0).$fsend[4] = $CHR(^H2)  ;发送命令代码.$fsend[5] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0)+$CHR(^H0) ;均为固定字符.$fsend[6] = $CHR(^H80)+$CHR(^H0).$fsend[7] = $CHR(^H2)+$CHR(^H0).$fsend[8] = $CHR(^H33)+$CHR(^H0)+$CHR(^H0).$fsend[9] = $CHR(^H37)+$CHR(^H0)+$CHR(^H0).$fsend[10] = $CHR(^H1)+$CHR(^H1)+$CHR(^H82)+$CHR(^H5)+$CHR(^Hdc)+$CHR(^H0)+$CHR(^H0).$fsend[11] = $CHR(^H4)

FINS TCP报文分析

FINS TCP是欧姆龙公司定义的一套通讯协议,本项目使用欧姆龙CP1H-E型号PLC,该PLC自带一个以太网口,作为服务器,川崎机器人利用套接字通讯来作为客户端;
固定字符(读写握手都有的字符)

  .$fsend[1] = $CHR(^H46)+$CHR(^H49)+$CHR(^H4e)+$CHR(^H53)+$CHR(^H0)+$CHR(^H0)+$CHR(^H0) ;报文头 川崎机器人一个ASCII字符串中出现00即Null的时候后面的字符全部置为00.$fsend[3] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0).$fsend[5] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0)+$CHR(^H0) ;均为固定字符

握手

FINS TCP在建立TCP连接后需先发送握手命令报文如下
46 49 4E 53 (ASCII码:FINS;FINS TCP通讯报文头)
00 00 00 0C (数据长度;字节数,从该字节后计算)
00 00 00 00 (命令,握手)
00 00 00 00 (错误;固定为0)
00 00 00 37 (最后一个字节为本站IP最后一位)
发送完上述报文后PLC会回复PLC的节点号,该命令仅在建立TCP连接后发送,在建立FINS TCO 连接后再次发送会报错。

;握手
inspect:.$fsend[2] = $CHR(^Hc)  ;发送字节数.$fsend[4] = $CHR(^H0)  ;发送命令代码.$fsend[6] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0).$fsend[7] = $CHR(^H37) ;节点号TCP_SEND rets,sock1,.$fsend[1],7,2  ;发送命令,返回值,套接字号,发送内容,发送字符串数组数量,超时时间IF rets<>0 THEN;发送数据失败IF sock1>0 GOTO closeGOTO inspectELSE$state = "连接成功"END
;握手返回 正常返回不做数据处理
inspectrecv:.num = 0 ;返回数组数量.$recv[1] = "" ;清空返回接收TCP_RECV retr,sock1,.$recv[1],.num,3,255  ;接收指令 返回值,套接字号,返回值,返回字符串数组数量,超时时间,返回数组最大字符数IF retr<>0 THENIF sock1>0 GOTO closeGOTO inspectrecvEND

读取

读取报文如下
46 49 4E 53 (ASCII码:FINS;FINS TCP通讯报文头)
00 00 00 1A (数据长度;字节数,从该字节后计算)
00 00 00 02 (命令,固定)
00 00 00 00 (错误;固定为0)
80 (需要回复)
00 02 00 (固定)
33 (目标节点号即IP最后一位)
00 00 (固定)
37 (本站节点号)
00 00 (固定)
01 01 (读操作/写是0102)
82 (DM区,其他见下图)
05 DC (寄存器号为D1500)
00 (起始位号)
00 04 (读取寄存器个数,一个寄存器占两个字节)

sendr:.$fsend[2] = $CHR(^H1a).$fsend[4] = $CHR(^H2).$fsend[6] = $CHR(^H80)+$CHR(^H0).$fsend[7] = $CHR(^H2)+$CHR(^H0).$fsend[8] = $CHR(^H33)+$CHR(^H0)+$CHR(^H0).$fsend[9] = $CHR(^H37)+$CHR(^H0)+$CHR(^H0).$fsend[10] = $CHR(^H1)+$CHR(^H1)+$CHR(^H82)+$CHR(^H5)+$CHR(^Hdc)+$CHR(^H0)+$CHR(^H0).$fsend[11] = $CHR(^H4)TCP_SEND rets,sock1,.$fsend[1],11,2IF rets<>0 THEN;发送数据失败IF sock1>0 GOTO closeGOTO sendrEND

读取报文发出后将会收到返回报文 如下
46 49 4E 53 (ASCII码:FINS;FINS TCP通讯报文头)
00 00 00 1A (数据长度;字节数,从该字节后计算)
00 00 00 02 (命令,固定)
00 00 00 00 (错误;固定为0)
00 (无需回复)
00 02 00 (固定)
37 (目标节点号即IP最后一位)
00 00 (固定)
33 (本站节点号)
00 00 (固定)
01 01 (读操作/写是0102)
00 00 (错误码)
XX XX XX XX XX XX XX XX (返回结果)

写入

读取报文如下
46 49 4E 53 (ASCII码:FINS;FINS TCP通讯报文头)
00 00 00 20 (数据长度;字节数,从该字节后计算)
00 00 00 02 (命令,固定)
00 00 00 00 (错误;固定为0)
80 (需要回复)
00 02 00 (固定)
33 (目标节点号即IP最后一位)
00 00 (固定)
37 (本站节点号)
00 00 (固定)
01 02 (写操作/读是0101)
82 (DM区,其他见下图)
03 E8 (寄存器号为D1000)
00 (起始位号)
00 04 (写取寄存器个数,一个寄存器占两个字节)
XX XX XX XX XX XX XX XX (写入内容)

sendw:.$fsend[2] = $CHR(^H20).$fsend[4] = $CHR(^H2).$fsend[6] = $CHR(^H80)+$CHR(^H0).$fsend[7] = $CHR(^H2)+$CHR(^H0).$fsend[8] = $CHR(^H33)+$CHR(^H0)+$CHR(^H0).$fsend[9] = $CHR(^H37)+$CHR(^H0)+$CHR(^H0).$fsend[10] = $CHR(^H1)+$CHR(^H2)+$CHR(^H82)+$CHR(^H3)+$CHR(^He8)+$CHR(^H0)+$CHR(^H0).$fsend[11] = $CHR(^H3)TCP_SEND rets,sock1,.$fsend[1],17,2IF rets<>0 THEN;发送数据失败IF sock1>0 GOTO closeGOTO sendwEND

川崎机器人通讯源码

先贴个源码 慢慢写分析
.PROGRAM autostart.pc() #0; FinsTCP通讯程序 !!!请不要修改!!!
; *******************************************************************
;
; Program:      autostart.pc
; Comment:
; Author:       by
;
; Date:         2023/1/5
;
; *******************************************************************
;
;
;初始化.ip[1] = 192  ;服务器IP.ip[2] = 168.ip[3] = 0.ip[4] = 51.port = 9600.$fsend[1] = $CHR(^H46)+$CHR(^H49)+$CHR(^H4e)+$CHR(^H53)+$CHR(^H0)+$CHR(^H0)+$CHR(^H0) ;报文头 川崎机器人一个ASCII字符串中出现00即Null的时候后面的字符全部置为00.$fsend[3] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0).$fsend[5] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0)+$CHR(^H0) ;均为固定字符
;输出信号转换
status:BITS 2001,1 = SIG(1007) ;心跳.pcrun = BITS(2200,5) ;PC执行状态判断IF .pcrun==3 THENSIGNAL 2014ELSESIGNAL -2014END.s1[1] = BITS(2001,8) ;输出点转八位数值.s1[2] = BITS(2009,8).s1[3] = BITS(2017,8).s1[4] = BITS(2025,8).$fsend[12] = $CHR(.s1[2]) ;输出值转位ASCII字符.$fsend[13] = $CHR(.s1[1]).$fsend[14] = $CHR(.s1[4]).$fsend[15] = $CHR(.s1[3])IF INT(hanjietime*100)>250 THEN.$fsend[16] = $CHR(250)hanjietime = 2.5ELSE.$fsend[16] = $CHR(INT(hanjietime*100))ENDIF INT(lengquetime*100)>250 THEN.$fsend[17] = $CHR(250)lengquetime = 2.5ELSE.$fsend[17] = $CHR(INT(lengquetime*100))END.$recv[2] = "" ;初始化接收字符
;连接状态判断TCP_STATUS .str1,.str2[1],.str3[1],.str4[1],.str5[1],.$str6[1]  ;连接状态监控指令,返回值为总连接数,端口号,套接字号,主错误,子错误,IP地址IF .str1==0 GOTO connectIF .str3[1]==0 THENPRINT "请重启电源 "ENDIF .str3[1]>0 AND sock1>0 GOTO sendr
;连接服务器
connect:TCP_CONNECT sock1,.port,.ip[1],5  ;连接指令,套接字号,端口号。ip地址,超时时间IF sock1<=0 THEN;通信失败GOTO connect$state = "连接失败"ELSE$state = "通信打开"ENDTWAIT 4
;握手
inspect:.$fsend[2] = $CHR(^Hc)  ;发送字节数.$fsend[4] = $CHR(^H0)  ;发送命令代码.$fsend[6] = $CHR(^H0)+$CHR(^H0)+$CHR(^H0).$fsend[7] = $CHR(^H37) ;节点号TCP_SEND rets,sock1,.$fsend[1],7,2  ;发送命令,返回值,套接字号,发送内容,发送字符串数组数量,超时时间IF rets<>0 THEN;发送数据失败IF sock1>0 GOTO closeGOTO inspectELSE$state = "连接成功"END
;握手返回 正常返回不做数据处理
inspectrecv:.num = 0 ;返回数组数量.$recv[1] = "" ;清空返回接收TCP_RECV retr,sock1,.$recv[1],.num,3,255  ;接收指令 返回值,套接字号,返回值,返回字符串数组数量,超时时间,返回数组最大字符数IF retr<>0 THENIF sock1>0 GOTO closeGOTO inspectrecvEND
;读
sendr:.$fsend[2] = $CHR(^H1a).$fsend[4] = $CHR(^H2).$fsend[6] = $CHR(^H80)+$CHR(^H0).$fsend[7] = $CHR(^H2)+$CHR(^H0).$fsend[8] = $CHR(^H33)+$CHR(^H0)+$CHR(^H0).$fsend[9] = $CHR(^H37)+$CHR(^H0)+$CHR(^H0).$fsend[10] = $CHR(^H1)+$CHR(^H1)+$CHR(^H82)+$CHR(^H5)+$CHR(^Hdc)+$CHR(^H0)+$CHR(^H0).$fsend[11] = $CHR(^H4)TCP_SEND rets,sock1,.$fsend[1],11,2IF rets<>0 THEN;发送数据失败IF sock1>0 GOTO closeGOTO sendrEND
;读返回
recvr:.num = 0.$recv[1] = ""TCP_RECV retr,sock1,.$recv[1],.num,3,30IF retr<>0 THENSIGNAL -5IF sock1>0 GOTO closeGOTO recvrELSE$shuju = .$recv[2] ;返回值转存BITS 2101,8 = ASC($shuju,2) ;返回值ASCII字符转十六进制数字赋给内部输入BITS 2109,8 = ASC($shuju,1)BITS 2117,8 = ASC($shuju,4)BITS 2125,8 = ASC($shuju,3)BITS 1,1 = SIG(2131) ;专用输入转存BITS 2,1 = SIG(2115)BITS 3,1 = SIG(2114)BITS 4,1 = SIG(2107)BITS 5,1 = SIG(2106)BITS 6,1 = SIG(2101)END
;写
sendw:.$fsend[2] = $CHR(^H20).$fsend[4] = $CHR(^H2).$fsend[6] = $CHR(^H80)+$CHR(^H0).$fsend[7] = $CHR(^H2)+$CHR(^H0).$fsend[8] = $CHR(^H33)+$CHR(^H0)+$CHR(^H0).$fsend[9] = $CHR(^H37)+$CHR(^H0)+$CHR(^H0).$fsend[10] = $CHR(^H1)+$CHR(^H2)+$CHR(^H82)+$CHR(^H3)+$CHR(^He8)+$CHR(^H0)+$CHR(^H0).$fsend[11] = $CHR(^H3)TCP_SEND rets,sock1,.$fsend[1],17,2IF rets<>0 THEN;发送数据失败IF sock1>0 GOTO closeGOTO sendwEND
;写返回
recvw:.num = 0.$recv[1] = ""TCP_RECV retr,sock1,.$recv[1],.num,3,255IF retr<>0 THENIF sock1>0 GOTO closeGOTO recvwENDGOTO status ;跳转至初始位置
close:;##########关闭通信连接##########IF sock1<0 GOTO connectTCP_CLOSE .retc,sock1;关闭通信指令IF .retc<>0 THEN$state = "关闭失败"TCP_CLOSE .ret1,sock1;强制关闭通信END$state = "通信关闭"GOTO connect
.END

记录一下川崎机器人实现FINS TCP 通讯相关推荐

  1. 欧姆龙OMRON PLC之HostLink通讯协议(五)- CP1H以太网FINS/TCP通讯实例

    //写在前面: 自2010年起,本人陆续在新浪博客上面发了几篇OMRON PLC的应用笔记,曾经很疑惑阅读量异常增加,后来发现原来是这里有人转载.现将原文照发在这里,希望能帮到做工控的同行朋友们. C ...

  2. 【转】欧姆龙OMRON PLC之 CP1H 以太网FINS/TCP通讯实例

    原文:http://blog.sina.com.cn/s/blog_539cee190102wr4t.html CP1H上面的选件板插槽可以插入1-2块CP1W-CIF41模块,系统即具有了以太网功能 ...

  3. 川崎机器人c#通讯(转)

    由于本人在工业自动化行业做机器视觉的工作,所以除了图像处理方面要掌握外,还需要与工业机器人进行通信.最近学习了计算机与川崎机器人的TCP/IP通信,于是在这里记录一下. 除了直接与机器人通信外,有一种 ...

  4. c#利用TCP/IP协议与川崎机器人进行通信

    由于本人在工业自动化行业做机器视觉的工作,所以除了图像处理方面要掌握外,还需要与工业机器人进行通信.最近学习了计算机与川崎机器人的TCP/IP通信,于是在这里记录一下. 除了直接与机器人通信外,有一种 ...

  5. 川崎机器人总线通信_川崎机器人TCP/IP通信方法及编程过程介绍

    川崎机器人的TCP/IP通信除了直接与川崎机器人通信外,有一种方式是通过PLC间接通信,附上我的另一篇文章,讲c#与三菱PLC通信的: 首先假设一个简单的应用情况,有一台带相机的川崎机器人,需要在机器 ...

  6. 川崎机器人总线通信_川崎机器人:PLC有那些功能?能实现机器人哪些通讯?

    川崎机器人:PLC有那些功能?能实现机器人哪些通讯? (一)运算功能 简单PLC的运算功能包括逻辑运算.计时和计数功能:普通PLC的运算功能还包括数据移位.比较等运算功能:较复杂运算功能有代数运算.数 ...

  7. UR机器人TCP通讯示例

    本文介绍UR机器人通讯示例,采用的是UR5机器人,实现的功能是从电脑端给机器人发送坐标,让机器人运动到目标位置.已经经过实操检验.本文截图是在虚拟机上,与实际界面显示略有不同,仔细看图片和文字. 1. ...

  8. UR机器人TCP通讯示例 详细例程,手把手教会你

    本文介绍UR机器人通讯示例,采用的是UR5机器人,实现的功能是从电脑端给机器人发送坐标,让机器人运动到目标位置.已经经过实操检验.本文截图是在虚拟机上,与实际界面显示略有不同,仔细看图片和文字. 1. ...

  9. YAMAHA机器人跟上位机TCP通讯

    工控小知识: YAMAHA机器人跟上位机TCP通讯 机器人当断电后重启后是不会自动执行程序的,这时候的机器人相当于是伺服端,在等待外部客户端给命令,需要上位机发一个@RUN+回车空格的指令,机器人返回 ...

最新文章

  1. 妙啊,边玩游戏边学强化学习
  2. JAVA I/O系统。
  3. httphandlers 与 httpmodules
  4. UIAutomator 2
  5. pycharm在ubuntu xfce下面Alt+insert快捷键冲突解决
  6. C#/WPF程序开机自动启动
  7. [Leedcode][JAVA][第983题][最低票价][动态规划]
  8. Java File类boolean isFile()方法(带示例)
  9. 捋一捋20201217
  10. oracle怎么按时间查找,JDBC:我如何在Oracle中按时间查询?
  11. Golang错误和异常处理的正确姿势
  12. 在线html代码生成器,支持网页快速排版 CSS代码一键生成的在线设计工具
  13. java httpsession_JavaWeb:HttpSession
  14. excel 转html 样式丢失,excel2010繁体转简体不见了
  15. 区块链专题报告:区块链是计算机板块上行的催化剂
  16. CNZZ埋点及点击量统计方法
  17. 大数据基础知识(上)
  18. 网络系统设计的基本原则(一)
  19. 栈和队列OJ练习——栈实现队列,队列实现栈
  20. 2021.5.13 易协同访客数据

热门文章

  1. 低压变频器市场Q3同比小幅负增长,市场回暖迹象不明显
  2. 道相同、谋相通、人相守:华为副总裁周跃峰分享如何与用户精英共创数字基建
  3. 禁忌搜索算法解决TSP问题
  4. 声音攻受测试软件,攻受成分鉴定测试入口-攻受成分鉴定小程序官方测试入口 v1.0预约_手机乐园...
  5. 我的2020——一颗红心,两手准备
  6. Fluka-cern版本安装过程(RocksCluster版本)
  7. 聊天更有劲了!开发者的日常 表情包来了!
  8. emwin从外部flash中读取bmp图片显示
  9. 打通任督二脉,成为OI侠客的秘笈,在!这!里!
  10. Python最详细的Excel操作方式,你值得拥有!