问题
操作:创建fins tcp连接后,网给定的地址写1。
问题现象:
1、底层通讯库(asio)读取(async_read_some)报错:End of File。对应的解释为 End of file or stream。
解决方案
1、开始往报错方向(End of file)去查询,这个报错指对方关闭接口。 但对方是什么都没有操作。这个时候需要确定连接的这款plc能同时最多创建几个链接(可向欧姆龙客服询问),以确保这款plc能支持开发的功能。
2、后面使用wireshark对通讯进行抓包,此处注意只抓与plc通讯的网口,这样数据少一些,看的时候只看OMRON的数据交互即可。
数据正常通讯的时候:
发生异常的时候:
Error Code:The data length is too long
按照Error Code去找网上找发现没有什么有用的信息。后面发现报文里面的Command才是关键:
Node Address Data Send (Server to Client) 这是握手的报文反馈,但是我发送的并不是握手报文。
综上:当这种情况下发生错误时,是没有先进行握手。Fins tcp需要先进行握手,再发送或接受想要的数据。
FIns Tcp握手指令:
发送:
46494E53 0000000C 00000000 00000000 00000018
46494E53:ASCII编码:FINS;
0000000C:指后面跟的字节长度;
00000000:固定命令;
00000000:错误代码;
00000018:PC节点IP,当设置为0时,会自动获取节点IP。
反馈:
46494E53 00000010 00000001 00000000 00000018 00000017
46494E53:ASCII编码:FINS;
00000010:指后面跟的字节长度;
00000001:固定命令;
00000000:错误代码;
00000018:本机电脑节点IP;
00000017:PLC节点IP。
参考:
https://blog.csdn.net/sgmcumt/article/details/87435778