基于Socket访问西门子PLC系列教程(二)
本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】
基于Socket访问西门子PLC系列教程(一)
在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:
从上图可以看出,上位机需要完成以下功能:
- TCP建立连接与断开连接
- 多线程接收服务器数据
- 各种数据类型通用数据解析
- 各种数据类型的通用写入接下来我们将按照功能顺序来逐个完成,具体如下:
(1)TCP的建立连接与断开连接:TCP连接与断开主要是调用Socket的API函数来实现,代码如下所示:
(2)开启多线程持续接收服务器数据:上位机连接上PLC后,PLC会定时向上位机发送数据,上位机需要持续接收数据,因此在连接成功后,开启一个线程来接收服务器数据。
(3)各种数据类型通用数据解析:当已经获取到所有的数据(字节数组)时,如果想任意一种数据类型的解析,通过分析发现,至少需要三个元素,分别为起始字节、数据类型、偏移(针对布尔是位偏移,针对字符串是长度),因此我们首先针对这三个元素,创建了一个实体类,如下所示:
通过控件显示数据,因此需要给控件做下绑定,这里是通过Tag属性来做,按照DataType;Start.Offset的格式,DataType按照枚举类型填写数据,Start填写一个整数,对于Offset,如果不是布尔类型或者字符串,该项可以不填,填写格式如下所示:
Tag绑定方式如下所示:【公众号dotNet工控上位机:thinger_swj】
获取到控件绑定的Tag之后,需要编写一个方法,实现Tag和实体对象BindVariable之间的转换。
通用数据更新实现思路:遍历所有的控件,首先判断其Tag属性是否满足要求,如果满足要求,将Tag转换为BindVariable对象,再根据BindVariable对象来进行数据解析,这里可以将实时更新单独封装成一个方法,多线程中直接进行调用,完成上述步骤后,可以直接运行上位机软件,进行读取功能测试,先在博途中创建一个监控表,填入一些随机数,然后通过上位机进行读取对比,监控表如下图所示:
上位机运行读取数据如下图所示:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构