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

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

基于Socket访问西门子PLC系列教程(二)的更多相关文章

  1. CRL快速开发框架系列教程二(基于Lambda表达式查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  3. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (高级) 本章介绍的是企业库加密应用程序模块 ...

  4. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) 中间件 Fastify 提供了与 Express 和 Restify ...

  5. Fastify 系列教程二 (中间件、钩子函数和装饰器)

    Fastify 系列教程: Fastify 系列教程一 (路由和日志) Fastify 系列教程二 (中间件.钩子函数和装饰器) Fastify 系列教程三 (验证.序列化和生命周期) Fastify ...

  6. memcached基于socket访问memcache缓存服务器

    memcached基于socket访问memcache缓存服务器 操作memcache常用三种方法: .memcache基于php_memcache.dll扩展(php扩展) .memcached基于 ...

  7. Android Studio系列教程二--基本设置与运行

    Android Studio系列教程二--基本设置与运行 2014 年 11 月 28 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处! 上面一篇博客,介绍了Studio的 ...

  8. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

  9. 黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级)

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(二) Cryptography Application Block (初级) 企业库加密应用程序模块提供了2种方 ...

随机推荐

  1. 用Python演奏音乐

    目录 背景 准备 安装mingus 下载并配置fluidsynth 下载soundfont文件 分析 乐谱格式 乐谱解析 弹奏音乐 添加伴奏 保存音乐 完整程序 背景 笔者什么乐器也不会,乐理知识也只 ...

  2. ffmpeg常见用法总结

    1. 视频/音频剪切: ffmpeg -i input_file [-ss 00:00:10] [-t 00:00:20] output_file 去掉-ss指令表示从头开始 去掉-t指令表示剪切到结 ...

  3. 蒲公英 · JELLY技术周刊 Vol.14: Vue 3 新特性详解

    2020 年真的是灾祸频发,但是在各类前端框架上,依旧是在稳步的推进.近日 Vue 团队更新了关于 Vue 3 的最新状态,尤大新增了三个语法糖特性,它们将用于优化 SFC 的开发体验,你会有兴趣尝鲜 ...

  4. 我一天的工作,同事一个小时就做完了?python的应用

    " ONE "   众所周知,现在很多行业,都离不开用Excel: 做财务的,要用Excel做报表: 做物流的,会用Excel来跟踪订单情况: 做HR的,会用Excel算工资: 做 ...

  5. git push到远程新分支

    获取远程代码并在本地切换到一个新分支修改后,想要 push 到远端与原来不同的新分支,可以使用下面的命令实现: git push origin 本地分支:远端希望创建的分支 上面的本地分支 是基于拉取 ...

  6. DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. grpc 之 word2pdf使用

    ​ 做一个word转pdf的服务,采用grpc,使用libreoffice命令. 1.构建libreoffice镜像 FROM python:3.6 ENV TZ=Asia/Shanghai RUN ...

  8. https://blog.csdn.net/yongchaocsdn/article/details/53355296

    https://blog.csdn.net/yongchaocsdn/article/details/53355296

  9. Python之生成器、迭代器

    生成器 生成器类似返回值为数组的一个函数,这个函数可以接受参数,可被调用,但只能产生一个值,所以大大节省内存. 生成器表达式的语法非常简单,只需要将列表推导式的中括号改成小括号就可以了 [x+x fo ...

  10. 什么是 A/B 测试?

    1.什么是A/B 测试?有什么用? 做过App功能设计的读者朋友可能经常会面临多个设计方案的选择,例如某个按钮是用蓝色还是黄色,是放左边还是放右边. 传统的解决方法通常是集体讨论表决,或者由某位专家或 ...