问题点: C#上位机运行一段时间无法向PLC写入数据
由于这个上位机代码配合PLC做modbusTCP好多年没出过问题,所以很疑惑。
然后就做了以下动作
1.打400 810 4288西门子工业客户电话,给的建议是加捕捉错误代码,并且ERROR时接通DISCONNECT一个周期重启modbusServer。 (这是原来一直没有出现问题的程序)
![573f8edf334b8e1707fe2bf940b93f87.png](https://i-blog.csdnimg.cn/blog_migrate/3a4deb3e8c71fe4e4cf907ab68ba7f38.jpeg)
原程序
2.就有了以下程序
![08d1017bd40b0709e3b5d29655ac5476.png](https://i-blog.csdnimg.cn/blog_migrate/a824439ea1615d99e2c78a42f1dc50c4.jpeg)
捕捉错误码 并重启SERVER
![af149de6222e6f214a52f0c44e40599e.png](https://i-blog.csdnimg.cn/blog_migrate/98bd02fa8dc177b16ffd5875159f865b.jpeg)
顺便把错误码发到上位机
![5fd5e972ccd61928bf840868c8f3bf9c.png](https://i-blog.csdnimg.cn/blog_migrate/483247825e0a608a06521449b8c04628.jpeg)
错误码写入条件
![3b9cd60446b4e23902d431e9853e4c9e.png](https://i-blog.csdnimg.cn/blog_migrate/06f376c2d830349e7cb75bfc8e81169b.jpeg)
C#把错误码写入记事本
3.利用另外一个开放式用户通讯向C#上位机发送错误码 然后记录在记事本上。
![e3b19ea8a161ebde4ee9bad2cd329ddc.png](https://i-blog.csdnimg.cn/blog_migrate/17eca0c1309ad2f0f62dfc91736e2886.jpeg)
记录到的错误码
4.在客户现场驻守了3天,打算开车回公司。结果很神奇的事情发生了,故障重现了,然后上位机连接不上了,我写的上位机有自动重连机制,正常情况重连是可以的。我以为是我的上位机有bug然后退出软件。用socket测试工具测试,结果还是连不上,然后拔掉网线,重启电脑,还是不行。这时候PLC的STATUS引脚状态是0。感觉SERVER死掉了,没有检测到。按理来说TCP物理层网络层不通的时候,PLC端应该是知道的。也考虑过物理层有问题,但是同一物理层的另外一个开放式TCP连接是OK的。最终必须重启DISCONNECT引脚,或者断电重启PLC解决。
5.答应老婆今天回去的,没想到现场翻车...客户现场实在待不住了,就写了组合键同事按下,强制重启SERVER应急解决。
6.考虑回公司写心跳,控制SERVER重启。
7.继续拨打400电话,问有没有可能固件有问题。因为以前没有做这些重启SERVER程序是没出现问题的。西门子工程师回复 固件更新不会去公布这些细节,无从得知改动。
8.我考虑C#端写心跳给PLC,PLC检测到没心跳就自动重启SERVER。我的上位机重连机制就会生效,就会产生新的连接。来解决这问题,并且尝试把通讯负载由默认的20%改为40%也试试。
欢迎大佬指导交流