基于C#实现手机APP远程访问西门子PLC(附源码)

1 篇文章 0 订阅

 

随着5G时代的来临,物联网开始加速盛行,慢慢地融入到我们的生活当中,万物互联互通将不再只是纸上谈兵。

物联网框架

此物联网框架是在上位机框架的基础上,结合物联网通信协议MQTT实现。上位机本身就集成有采集、归档及日志等功能,只需要在这个基础上,连接MQTT服务器之后,并向指定的主题Topic中发布相关的数据,相关的WEB、APP只需要订阅相应的主题,即可获取到数据。

整体软件框架如下图示所示:

图表 1 整体软件框架实现

 

    从上图可以看出,整体软件基于MQTT协议搭建,依据此软件框架搭建的MQTT物联网拓扑图如下图所示:

图表 2 MQTT物联网平台拓扑图

框架实现

为了测试方便,这里选择西门子S7-1200 PLC作为下位机,采用西门子S7进行通信,上位机先与PLC进行通信,同时连接MQTT服务器,并向指定主题发布数据。

(1)首先创建一个新的Windows窗体应用,从NuGet上下载xktComm.dll:

图表 3 xktComm下载

 

(2)开发UI界面开发,按照功能设计如下图所示:

图表 4 MQTT客户端UI界面

 

(3)UI界面设计完成之后,进行代码的编写,这里使用开源的mqtt库mqttnet,仍然通过NuGet下载安装一下,这里选择版本为2.8.2,选择不同的版本,使用上会有一些区别:

图表 5 MQTTnet下载

 

(4)先实现基本的MQTT连接服务器及断开连接:

(5)基于委托创建日志处理对象及方法体:

  

 

(6)确定并创建通信变量实体类及集合:

     实际开发过程中,这里是基于CMSPro实现的,本案例用于测试,以读取以下四个变量为例(实际应用时变量数据及结构可能要比这复杂),如下图所示:

 

表格 1通信变量列表

序号

变量名称

变量地址

变量类型

1

出口压力

DB100.DBD0

Float

2

入口压力

DB100.DBD4

Float

3

出口温度

DB100.DBD8

Float

4

入口温度

DB100.DBD12

Float

    按照这个结构,创建一个实体类,如下图所示:

 

    (7)Nuget添加Newtonsoft.Json,引入JSON转换类,便于后续将对象转换成JSON格式字符串进行传输。

 

    (8)基于xktComm.dll与西门子PLC之间建立连接:

    (9)通过定时器定时向指定的主题发布实时数据:

    (10)在云服务器端开启MQTT服务器:

图表 6 MQTT服务器开启

    (11)运行MQTT客户端,连接服务器,并点击开始定时:

图表 7 运行MQTT客户端

 

    (12)连接成功后,可以观察到MQTT服务器中收到了来自MQTT客户端发来的信息:

图表 8 MQTT服务器接收消息

 

 

框架应用

    当数据已经上传到MQTT服务器后,那么如果需要获取这些数据,只需要开发一个MQTT,并订阅那个主题,这样,MQTT服务器就会自动将相关的信息推送到客户端软件中,可以先用MQTT.fx测试一下,MQTT.fx是一款基于Eclipse Paho,使用Java语言编写的MQTT客户端工具,支持通过Topic订阅和发布消息。打开MQTT.fx,输入正确的服务器地址、端口号、用户及密码,并订阅主题thinger后,就可以实时收到服务器发送过来的数据了,如下图所示:

图表 9 MQTT.fx应用

    与此同时,我们也可以通过开发相关的WEB网页或者APP来获取数据,下面是一个简易APP的数据展示:

图表 10 TIA博途数据

图表 11 APP数据展示

四 、整体总结

    本文主要是基于MQTT协议实现了本地PLC控制器数据上传的过程。基于阿里云服务器,你可以在任意地方访问到本地PLC的实时数据,实现数据的远程上传。本文主要针对的是电气和工控人员,物联网必然是未来发展的趋势,建议所有的PLC工程师及电气工程师,都应该掌握一门编程语言,也许现在用不到,但未来总会用得到。

    对于文中涉及的MQTT服务器及MQTT客户端的源码,大家可以扫描下方的二维码关注【DotNet工控上位机】公众号,关注后发送关键词:MQTT通信源码获取。

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#中,可以使用Siemens提供的S7.Net库来实现西门子PLC的优化访问块数据读取。S7.Net库是一款开源的库,支持各种版本的西门子PLC和S7协议,提供了丰富的API和示例代码,可以方便地实现PLC数据读取和写入等操作。 以下是使用S7.Net库实现西门子PLC优化访问块数据读取的示例代码: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using S7.Net; namespace PLC_OBA_Read { class Program { static void Main(string[] args) { Plc plc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1); // 创建PLC连接 plc.Open(); // 打开PLC连接 // 读取DB1块中Var2的低4字节 var result = plc.ReadBytes(DataType.DataBlock, 1, 4, 0, 4); if (result != null) { int var2Low = S7.GetIntAt(result, 0); // 将读取到的4字节数据转换为整型数值 Console.WriteLine("Var2.Low: " + var2Low); } else { Console.WriteLine("Read failed!"); } plc.Close(); // 关闭PLC连接 } } } ``` 在上述代码中,首先创建了一个Plc对象,用于连接PLC。然后使用`ReadBytes`方法读取DB块中Var2的低4字节,读取的数据以字节数组的形式返回。最后将读取到的字节数组转换为整型数值,并输出结果。需要注意的是,读取DB块中的变量时,需要指定DB号、偏移量和长度等参数,这些参数需要根据DB块的设置来确定。 需要注意的是,使用S7.Net库进行PLC数据读取时,需要保证PLC和计算机处于同一局域网中,且PLC的IP地址和端口号等参数设置正确。同时,在使用S7.Net库时需要引用S7.Net.dll文件,并且需要在项目中添加S7.Net.dll的引用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值