ayusecret
级别: 略有小成
精华主题: 0
发帖数量: 183 个
工控威望: 261 点
下载积分: 806 分
在线时间: 73(小时)
注册时间: 2021-10-31
最后登录: 2024-11-18
查看ayusecret的 主题 / 回贴
楼主  发表于: 2022-06-09 08:31
最近基于Python写了一些测试MC协议的代码,想测测断线重连的功能,发现拔了网线后再插上,用原来的套接字无法与PLC通讯(下断点调也无法实现).监控PLC网络状态仍然处于连接中(与之前的套接字连接).如果我在Python程序内重新以一个新的套接字去尝试连接,会回复目标计算机积极拒绝.这样我只能复位PLC才能断开PLC的连接状态,这在实际应用应该是不允许的.后面再Gxword3内配置参数,让PLC自己10s后监视生存,再反复3次监视确认自动断开.想请教各位在用上位机是如何实现断线重连的,又或者是即使无重连功能,重新初始化是如何连上PLC的
ayusecret
级别: 略有小成
精华主题: 0
发帖数量: 183 个
工控威望: 261 点
下载积分: 806 分
在线时间: 73(小时)
注册时间: 2021-10-31
最后登录: 2024-11-18
查看ayusecret的 主题 / 回贴
1楼  发表于: 2022-06-09 09:37
图片:
引用
引用第1楼cythyx于2022-06-09 08:47发表的  :
使用套接字的通讯方式,一般会检测通讯状态,如果检测到通讯状态断开不是直接再连端口,需要先执行关闭端口,再打开端口连接。

试过了,PLC一直拒绝响应
ayusecret
级别: 略有小成
精华主题: 0
发帖数量: 183 个
工控威望: 261 点
下载积分: 806 分
在线时间: 73(小时)
注册时间: 2021-10-31
最后登录: 2024-11-18
查看ayusecret的 主题 / 回贴
2楼  发表于: 2022-06-09 11:54
引用
引用第3楼13821917697于2022-06-09 11:00发表的  :
Python的不太懂啊,C#最近刚好做了个这么功能可以跟你说说思路。首先套接字断线之后是不能沿用原先的连接的,我这里做的方式是重新new了一下。用一个新的连接。建立一个bool变量作为标志位,初次连接成功之后,标志位置反,开始正常工作。如果断开连接,try里面的正常工作指令会报错跳到catch,这里我们把套接字dispose全部释放,并且标志位初始化。然后就又开始重新连接了。就是这样

感谢提供思路,不过貌似没给回答到点上,就是三菱用的是还是上个连接,即使我初始化用新的套接字也无法连上。会被拒绝。(当然PLC参数上可用设置超时断开)。普通程序奔溃或调试程序断开,这种都能正常重连,不过既然你说套接字断线后无法沿用原来的连接,那我只能在PLC上参数设置了。
ayusecret
级别: 略有小成
精华主题: 0
发帖数量: 183 个
工控威望: 261 点
下载积分: 806 分
在线时间: 73(小时)
注册时间: 2021-10-31
最后登录: 2024-11-18
查看ayusecret的 主题 / 回贴
3楼  发表于: 2022-06-09 11:58
引用
引用第4楼我看到你了于2022-06-09 11:14发表的  :
为什么不直接用三菱的控件,MXcomponent啊还搞啥socket

我知道有控件,还有别人开源的HslCommunication的动态链接库,我只是想自己写个玩玩,学习一下。不懂就要问
ayusecret
级别: 略有小成
精华主题: 0
发帖数量: 183 个
工控威望: 261 点
下载积分: 806 分
在线时间: 73(小时)
注册时间: 2021-10-31
最后登录: 2024-11-18
查看ayusecret的 主题 / 回贴
4楼  发表于: 2022-06-09 19:26
引用
引用第7楼zmrs163于2022-06-09 17:22发表的  :
看了下你的代码,close之后要重新connect才能发送吧

Close前面已经有两次Send是断线后发的,提示远程主机中止连接。但又没法Connect,因为我的套件字已经Connect了。所以只能初始化重新尝试连接。
ayusecret
级别: 略有小成
精华主题: 0
发帖数量: 183 个
工控威望: 261 点
下载积分: 806 分
在线时间: 73(小时)
注册时间: 2021-10-31
最后登录: 2024-11-18
查看ayusecret的 主题 / 回贴
5楼  发表于: 2022-06-10 15:02
引用
引用第9楼zmrs163于2022-06-10 13:26发表的  :
我测试了下网线拔掉之后PLC很快就关闭了连接,这个时候电脑客户端重连发送即可。你程序前两个错误在于PLC关闭了连接你还尝试发送,然后自己关闭了连接肯定不能发了,资源都已经释放了。最后一个错误需要查看你PLC的程序,如果你PLC也执行了CLOSE就连不了了,反之可以继续连接。

不知道你在什么环境下测试的,我是用Gxwork3,R04 CPU测试,测试环境默认没有开启生存定时器,所以我拔网线,PLC还是不会关闭连接的。只有我在参数上再配置定时器超时自动关闭才会关闭。
我的配图从头到尾,PLC都没断之前的连接,错误都是为了演示整个过程,我知道错误的原因,只是当时纳闷PLC为啥自己不断开,后面开了定时器才正常。没验证Gxwork2 Q系列PLC的,貌似Gxwork2没有这个定时器配置,难道这就是区别?