电脑与plc通过网络通信
根据 欧姆龙OMRONPLC之CP1H以太网FINS/TCP通讯实例,进行了实践,将实践过程及遇到的问题进行记录。
所用材料:
- 欧姆龙CP1H-X40DT-D
- CP1W-CIF41模块
- 网线
- 交换机
- 笔记本
- fins通讯手册,这东西虽然是英文的,但是用来查查重点还是不错的
- ethernet units和communication commands 这两份手册,这两份手册可能有用,网上找的,我自己没有看
实验步骤
详细步骤不做赘述,参照上面那篇文章,记录几个比较重要的信息。
-
握手协议(命令码为00000000)
格式:头(FINS) + 长度(Hex0C) + 命令(00000000)+ 错误码(00000000) + 客户机节点地址
举例:发送:46494E53 0000000C 00000000 00000000 00000002
返回:46494E53 00000010 00000001 00000000 00000002 00000001
这里的46494E53是FINS的ASCII码,
0000000C是指这串代码之后的长度,注意是用十六进制发送的,每两个数字长度加1,不要搞错了
00000002是客户端ip,我电脑设置的ip为102.168.250.2,实际上这里不一定要传ip最后两位进去,只要不是00000001,01是plc的地址
返回中的最后一串00000001就是plc的地址码,错误码全为0就表示没有出错,我也没有遇到过出错的情况,所以也不清楚会发生什么问题,真的遇到问题,可以参考最上面列的那篇博客。 -
读指定地址的值(命令码为00000002,fins中的命令为0101)
参考文章中以读DM存储区举例,因为我实际用到的是CIO存储区,所以我以CIO存储区举例
2.1 按照字(word)读
查同一个作者的另一篇文章,欧姆龙OMRONPLC之HostLink通讯协议-FINS命令W字/位操作篇,CIO存储区按照字的代码为B0,读取CIO区地址0000中的值,读一个长度的字
发送:46494E53 0000001A 00000002 00000000 08000020 01000002 00FF0101 B0000000 0001
返回:46494E53 00000018 00000002 00000000 C0000200 02000001 00FF0101 000000C1
没有找到对08000020的解释
01000002的头和尾分别为接收方和发送方
0101是命令
B0000000前两位是CIO的地址码,接下去的四位是字对应的地址,我读的是0000,最后两位是位的地址,因为是按字读,所以这边就是00不用管
0001表示读一个字
返回码中的最后4个十六进制数中,两位(0000)表示成功,00C1就是读到的值
需要注意的是,一个字读出来值占两个十六进制,因为一个字的位有0-15,最大就是11111111 11111111(这是我的理解,不确定是不是有错误),所以一个字占两个十六进制。2.2 按照位(bit)读
CIO存储区按位的代码为30,读取CIO区地址000104的值,读一个位(地址000104就是输入变量I01.04的地址)
发送:46494E53 0000001A 00000002 00000000 80000200 01000002 00FF0101 30000104 0001
接收:46494E53 00000017 00000002 00000000 C0000200 02000001 00FF0101 000001
这里接收到的和上面按字读同样是读一个长度,但是字一个长度由两个十六进制组成,而位由一个十六进制组成,注意区别,在写入的时候也要注意读的时候还遇到过一个问题,命名CIO0100地址中是有值的,但是读出来全是0,那是因为犯了个错误,这里的CIO0100用的是十进制,发送的是十六进制,所以应该是0064地址,其实只是个小问题,仔细一点。
-
往指定区域写入值(fins命令0102)
此处不特别举例,参考那篇文章的例2-7,这里要注意的就是按位和按字的长度不要弄错。
因为我自己遇到了一次出错,错误码为1003,查找了fins通讯手册之后,发现是长度问题,错误码在通讯手册的5-1-3章节中。