阅界资讯

.NET上位机踩坑:为什么有时读取数据需要Sleep?

阅阅界编辑部1阅读6分钟

《.NET上位机踩坑:为什么有时读取数据需要Sleep?》这篇在博客园热度很高,讲的正是大家天天碰到的事。下面帮你把要点捋出来,结尾有能直接抄的结论。

前言 大家好,我是 wacky。 今天这篇文章,也是源自于一个真实的探讨。曾经有朋友说,做上位机开发对接PLC的时候,有时会出现玄学,读取不到完整的数据。这时就需要加一个Thread.Sleep(30),或者一个类似的时间间隔,就完全好了,至于为什么,完全搞不清楚。 我相信应该不少人都遇到过类似的情况,包括我自己,曾经做数据采集的时候,也加过类似的代码,但是当时没想明白为什么,只是以为下位机返回数据存在延迟的现象。

前言 大家好,我是 wacky。 今天这篇文章,也是源自于一个真实的探讨。曾经有朋友说,做上位机开发对接PLC的时候,有时会出现玄学,读取不到完整的数据。这时就需要加一个Thread.Sleep(30),或者一个类似的时间间隔,就完全好了,至于为什么,完全搞不清楚。 我相信应该不少人都遇到过类似的情况,包括我自己,曾经做数据采集的时候,也加过类似的代码,但是当时没想明白为什么,只是以为下位机返回数据存在延迟的现象。但是随着时间的推移和经验的积累,我认为任何问题都有迹可循,恰好近期在梳理工控系列文章的时候,想明白了这个问题,我认为有以下两种可能性: PLC扫描周期未到 参考我们之前写的内容: .NET工控概念科普——PLC扫描周期:理解了它才算入了工控的门 PLC是存在扫描周期的概念的,如果一个扫描周期过了,但是未到下一个扫描周期,这时你刚好发送了一个读取数据的指令,那么PLC即使收到了报文,也只会返回旧数据,因为没有把最新的值给到通信缓冲区。

前言 大家好,我是 wacky。 今天这篇文章,也是源自于一个真实的探讨。曾经有朋友说,做上位机开发对接PLC的时候,有时会出现玄学,读取不到完整的数据。这时就需要加一个Thread.Sleep(30),或者一个类似的时间间隔,就完全好了,至于为什么,完全搞不清楚。 我相信应该不少人都遇到过类似的情况,包括我自己,曾经做数据采集的时候,也加过类似的代码,但是当时没想明白为什么,只是以为下位机返回数据存在延迟的现象。但是随着时间的推移和经验的积累,我认为任何问题都有迹可循,恰好近期在梳理工控系列文章的时候,想明白了这个问题,我认为有以下两种可能性: PLC扫描周期未到 参考我们之前写的内容: .NET工控概念科普——PLC扫描周期:理解了它才算入了工控的门 PLC是存在扫描周期的概念的,如果一个扫描周期过了,但是未到下一个扫描周期,这时你刚好发送了一个读取数据的指令,那么PLC即使收到了报文,也只会返回旧数据,因为没有把最新的值给到通信缓冲区。 但是这种情况的可能性其实很低,因为我们的问题是"读不到完整的数据",而不是"一直读取的是旧数据",那么就要引入第二种可能性。

前言 大家好,我是 wacky。 今天这篇文章,也是源自于一个真实的探讨。曾经有朋友说,做上位机开发对接PLC的时候,有时会出现玄学,读取不到完整的数据。这时就需要加一个Thread.Sleep(30),或者一个类似的时间间隔,就完全好了,至于为什么,完全搞不清楚。 我相信应该不少人都遇到过类似的情况,包括我自己,曾经做数据采集的时候,也加过类似的代码,但是当时没想明白为什么,只是以为下位机返回数据存在延迟的现象。但是随着时间的推移和经验的积累,我认为任何问题都有迹可循,恰好近期在梳理工控系列文章的时候,想明白了这个问题,我认为有以下两种可能性: PLC扫描周期未到 参考我们之前写的内容: .NET工控概念科普——PLC扫描周期:理解了它才算入了工控的门 PLC是存在扫描周期的概念的,如果一个扫描周期过了,但是未到下一个扫描周期,这时你刚好发送了一个读取数据的指令,那么PLC即使收到了报文,也只会返回旧数据,因为没有把最新的值给到通信缓冲区。 但是这种情况的可能性其实很低,因为我们的问题是"读不到完整的数据",而不是"一直读取的是旧数据",那么就要引入第二种可能性。 TCP存在粘包/半包 这个就是我们今天要探讨的重点了,因为TCP协议属于流式协议,它是没有报文边界的。

前言 大家好,我是 wacky。 今天这篇文章,也是源自于一个真实的探讨。曾经有朋友说,做上位机开发对接PLC的时候,有时会出现玄学,读取不到完整的数据。这时就需要加一个Thread.Sleep(30),或者一个类似的时间间隔,就完全好了,至于为什么,完全搞不清楚。 我相信应该不少人都遇到过类似的情况,包括我自己,曾经做数据采集的时候,也加过类似的代码,但是当时没想明白为什么,只是以为下位机返回数据存在延迟的现象。但是随着时间的推移和经验的积累,我认为任何问题都有迹可循,恰好近期在梳理工控系列文章的时候,想明白了这个问题,我认为有以下两种可能性: PLC扫描周期未到 参考我们之前写的内容: .NET工控概念科普——PLC扫描周期:理解了它才算入了工控的门 PLC是存在扫描周期的概念的,如果一个扫描周期过了,但是未到下一个扫描周期,这时你刚好发送了一个读取数据的指令,那么PLC即使收到了报文,也只会返回旧数据,因为没有把最新的值给到通信缓冲区。 但是这种情况的可能性其实很低,因为我们的问题是"读不到完整的数据",而不是"一直读取的是旧数据",那么就要引入第二种可能性。 TCP存在粘包/半包 这个就是我们今天要探讨的重点了,因为TCP协议属于流式协议,它是没有报文边界的。所以这就会出现PLC发送了一包100字节,我们上位机可能会收到: 全部完整数据; 拆成两段(半包); 两包数据合并到一起(粘包)。

最后提醒:每个人的环境不一样,照抄之前先小步验证。有了自己的验证结果,这篇的价值才真正归你。你怎么看? 来源|博客园《.NET上位机踩坑:为什么有时读取数据需要Sleep?》,https://www.cnblogs.com/wackysoft/p/22947367.html

程序员技术场技术后端

评论(0)

暂无评论,来抢第一条。