• 基于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对象来进行数据解析,这里可以将实时更新单独封装成一个方法,多线程中直接进行调用,完成上述步骤后,可以直接运行上位机软件,进行读取功能测试,先在博途中创建一个监控表,填入一些随机数,然后通过上位机进行读取对比,监控表如下图所示:

     

    上位机运行读取数据如下图所示:

  • 相关阅读:
    HDOJ 5414 CRB and String 模拟
    Python标准库:内置函数all(iterable)
    Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack.
    关于TabLayout+ViewPager组合实现多页面滑动
    互联网产品经理应该具备的技能(需求篇)
    【Android】利用自己定义View的重绘实现拖动移动,获取组件的尺寸
    mybatis自己主动生成mapper,dao,映射文件
    Java解析注解
    如日中天的Uber到底是用什么开发语言做到的?
    [Swift]LeetCode1002. 查找常用字符 | Find Common Characters
  • 原文地址:https://www.cnblogs.com/xiketang/p/13450871.html
Copyright © 2020-2023  润新知