随着5G时代的来临,物联网开始加速盛行,慢慢地融入到我们的生活当中,万物互联互通将不再只是纸上谈兵。现在各大物联网平台层出不穷,看似离我们很遥远,其实只要我们敢于去研究,敢于去发现,万物互联,近在咫尺之间。

今天给大家介绍一下,作为一个普通的.NET开发人员,如何不借助第三方的物联网平台,搭建一个简单实用的物联网平台框架。

1、物联网框架

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

整体框架如下图示所示:

整体框架实现

2、框架实现

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

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

xktComm下载

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

MQTT客户端UI界面

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

MQTTnet下载

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

private IMqttClient mqttClient = null;

private void btn_Connect_Click(object sender, EventArgs e)

{

var option = new MqttClientOptions() { ClientId = Guid.NewGuid().ToString("D") };

//设置连接的服务器及端口号

option.ChannelOptions = new MqttClientTcpOptions()

{

Server = this.txt_ServerIP.Text,

Port = Convert.ToInt32(this.txt_Port.Text)

};

//是否需要账户密码

if (this.chk_IsUsePwd.Checked)

{

option.Credentials = new MqttClientCredentials()

{

Username = this.txt_UserName.Text,

Password = this.txt_Pwd.Text

};

}

option.CleanSession = true;

option.KeepAlivePeriod = TimeSpan.FromSeconds(100);

option.KeepAliveSendInterval = TimeSpan.FromSeconds(10000);

if (mqttClient != null)

{

mqttClient.DisconnectAsync();

mqttClient = null;

}

try

{

mqttClient = new MqttFactory().CreateMqttClient();

mqttClient.Connected += MqttClient_Connected;

mqttClient.Disconnected += MqttClient_Disconnected;

mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;

mqttClient.ConnectAsync(option);

}

catch (Exception ex)

{

AddLog(1, "MQTT客户端连接失败:" + ex.Message);

return;

}

}

private void btn_DisConn_Click(object sender, EventArgs e)

{

mqttClient.DisconnectAsync();

}

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

private AddLogDelegate AddLog;

private string CurrentTime

{

get { return DateTime.Now.ToString("HH:mm:ss"); }

}

/// 写入日志方法体

private void AddLogMethod(int index, string info)

{

if (this.lstInfo.InvokeRequired)

{

this.lstInfo.Invoke(new Action(() =>

{

ListViewItem lst = new ListViewItem(" " + CurrentTime, index);

lst.SubItems.Add(info);

lstInfo.Items.Insert(0, lst);

}));

}

else

{

ListViewItem lst = new ListViewItem(" " + CurrentTime, index);

lst.SubItems.Add(info);

lstInfo.Items.Insert(0, lst);

}

}

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

实际开发过程中,这块应该是基于CMS配置软件实现的,本案例用于测试,就不弄那么复杂了,这里以读取以下四个变量为例(实际应用时变量数据及结构可能要比这复杂),如下图所示:

通信变量列表

序号 变量名称 变量地址 变量类型
1 出口压力 DB100.DBD0 Float
2 入口压力 DB100.DBD4 Float
3 出口温度 DB100.DBD8 Float
4 入口温度 DB100.DBD20 Float

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

public enum DataType

{

Bit,

Byte,

Short,

UShort,

Int,

UInt,

Float,

Double

}

public class Variable

{

//变量名称

public string VarName { get; set; }

//变量地址

public string VarAddress { get; set; }

//开始地址

public string Start

{

get

{

if (VarAddress.Contains('.'))

{

string temp = VarAddress.Split('.')[1];

return temp.Substring(temp.IndexOf(temp.First(c => char.IsDigit(c))));

}

else

{

return VarAddress.Substring(VarAddress.IndexOf(VarAddress.First(c => char.IsDigit(c))));

}

}

}

VarList.Add(new Variable() { VarName = "出口压力", VarAddress = "DB100.DBD0", VarType = DataType.Float });

VarList.Add(new Variable() { VarName = "入口压力", VarAddress = "DB100.DBD4", VarType = DataType.Float });

VarList.Add(new Variable() { VarName = "出口温度", VarAddress = "DB100.DBD8", VarType = DataType.Float });

VarList.Add(new Variable() { VarName = "入口温度", VarAddress = "DB100.DBD12", VarType = DataType.Float });

(7)Nuget添加Newtonsoft.Json,引入JSON转换类:

public class JSONHelper

{

// 实体对象转换成JSON字符串

public static string EntityToJSON<T>(T x)

{

string result = string.Empty;

try

{

result = JsonConvert.SerializeObject(x);

}

catch (Exception)

{

result = string.Empty;

}

return result;

}

// JSON字符串转换成实体类

public static T JSONToEntity<T>(string json)

{

T t = default(T);

try

{

t = (T)JsonConvert.DeserializeObject(json, typeof(T));

}

catch (Exception)

{

t = default(T);

}

return t;

}

}

(8)PLC建立连接:

//通信对象

private SiemensS7 objS7 = new SiemensS7();

//PLC连接状态

private bool IsPLCConenected = false;

//PLC建立连接

IsPLCConenected= objS7.Connect("192.168.1.210", CPU_Type.S71200, 0, 0);

//写入日志

AddLog(IsPLCConenected?0:1, IsPLCConenected?"PLC连接成功":"PLC连接失败");

(9)定时器执行事件:

private void timer1_Tick(object sender, EventArgs e)

{

if (IsPLCConenected)

{

//PLC批量读取

byte[] array = objS7.ReadBytes(StoreType.DataBlock, 100, 0, 12);

if (array != null && array.Length == 12)

{

//变量解析 由于篇幅有限,这里仅对浮点型进行解析

foreach (var item in VarList)

{

switch (item.VarType)

{

case DataType.Float:

item.VarValue = FloatLib.GetFloatFromByteArray(array, Convert.ToInt32(item.Start)).ToString();

break;

case DataType.Double:

break;

default:

break;

}

}

//这里主要为了缩短发送的内容,减少发送数据长度

List<MQTTVariable> MqttVarList = new List<MQTTVariable>();

foreach (var item in VarList)

{

MqttVarList.Add(new MQTTVariable()

{

VarName = item.VarName,

VarValue = item.VarValue.ToString()

});

}

var msg = new MqttApplicationMessage()

{

Topic = this.txt_Topic.Text,

Payload = Encoding.UTF8.GetBytes(JSONHelper.EntityToJSON(MqttVarList)),

QualityOfServiceLevel = (MqttQualityOfServiceLevel)Enum.Parse(typeof(MqttQualityOfServiceLevel), this.cmb_QOSPublish.Text, true),

Retain = false

};

mqttClient.PublishAsync(msg);

}

}

}

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

MQTT服务器开启

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

运行MQTT客户端

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

MQTT服务器接收消息

3、框架应用

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

MQTT.fx测试

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

APP数据展示

4、整体总结

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

字符串 读取西门子_【必学技能】自己动手——基于C#实现手机APP远程访问西门子PLC...相关推荐

  1. 如何通过手机APP在线监控西门子PLC的运行状态

    随着工业生产.制造环节的不断神话,工业设备越来越精细复杂,借助PLC实现的自动化控制技术被广泛的应用于工业领域中,具备丰富的应用场景.在物联网和无线通信技术的发展下,越来越多的工业企业系统通过手机AP ...

  2. 自己动手——实现手机APP远程监控PLC(西门子S7-1200)

    一.准备工作. 1.1在对接前我们需准备如下物品: 1)    西门子S7-1200PLC一台,及通讯用RJ45网线. 2)    西门子CB1241 RS485模块. 3)    河北蓝蜂科技的DT ...

  3. app读写照片和文件_半小时读写照片文件1325次,手机APP疯狂搜集用户隐私

    很多人都很注重保护自己的隐私,比如在收到快递后,会把快递盒上的个人信息处理掉,这样就不会被别有用心的人利用.在使用手机的时候,也会特别注意,不上奇怪的网站,不点不明不白的链接,但是这样就真的安全了吗? ...

  4. android app系统的测试_计算机毕设项目003之基于Android系统的App点餐外送系统

    计算机毕设项目之基于Android系统的App点餐外送系统 一. 项目名称 基于Android系统的App点餐外送系统 二. 项目简介 本项目是基于Android系统的手机点餐系统,整个项目分为App ...

  5. uniapp app蓝牙打印_编程器加装蓝牙串口模块与手机APP操作演示

    编程器加装蓝牙模块后,可以方便的使用手机查看打印信息,进入控制台执行各种串口命令.本款蓝牙串口APP具有保存打印信息.分享打印信息.设置字体大小.清除屏幕信息.进入控制台.发送串口命令.执行串口命令- ...

  6. 简单Android app开发_与时代同行,目前最简单的手机APP开发方式!

    在市场需求的推动下,越来越多的公司开始制作APP,进一步拓展销售渠道.那么,市面上那么多可以开发APP的公司,要怎么选择呢? 第一,传统外包定制公司 这种方式在以前是绝对的最佳选择,制作出的APP非常 ...

  7. 三步快速免费开发工业手机APP,远程监控西门子300PLC数据

    三步快速免费开发工业手机APP,远程监控西门子300PLC数据                    (工业APP之于制造  巨控_何工) 互联网的飞速发展为人们的生活带来了翻天覆地的变化.工业APP ...

  8. linux运维工程师培训课程_《Linux运维工程师必学技能》完整版视频课程专题(1.0)...

    高性能负载均衡集群HAProxy实战视频课程 13节 4小时7分钟 课程目标: 欢迎大家加入 51CTO学院Linux交流群575837909,与喜欢学习Linux小伙伴们做朋友,一起为梦想增值.高性 ...

  9. SpringBoot入门到精通_第6篇 _必知必会

    接上一篇:SpringBoot入门到精通_第5篇 _SpringBoot Actuator监控 https://blog.csdn.net/weixin_40816738/article/detail ...

最新文章

  1. 抓包工具Charles基本用法
  2. ASP.NET中 Repeater嵌套
  3. Boost:circular buffer的测试程序
  4. Centos kvm虚拟sever
  5. 张萍萍 计科高职13-1 201303014010
  6. oracle修改字段的默认,oracle系统默认的账号ORACLE修改表字段的数据类型
  7. Python输入输出练习
  8. 《智能数据时代:企业大数据战略与实战》一2.3 自我评估、完善度、信息架构...
  9. cocos2d(CCSprite 用贝塞尔做抛物线,足球精灵并且同时做旋转放大效果)
  10. 学习matlab体会,学习matlab心得体会.doc
  11. tomcat8设置JAVA_HOME路径
  12. postman下载地址
  13. PHP折算,PHP实现货币换算的方法
  14. 续:~英语 1038个词根 217个后缀!
  15. android实时声音信号波形_android绘制播放音频的波形图
  16. 利用R语言进行探索性数据分析(EDA)
  17. hdu 5442 Favorite Donut 后缀数组
  18. 数值分析:数据的最小二乘拟合
  19. 云运维 linux centos7.2 LAMP环境搭建 一键全解析
  20. 2019第十届蓝桥杯省赛总结

热门文章

  1. 《学习javascript数据结构与算法》——第六章:集合
  2. 闲谈神经网络--写给初学者(三)
  3. raspberrypi 与 arduino 使用 nRF24L01+ 通信 -- raspberry pi为发送端
  4. Oracle 获取每月最后一天的函数
  5. CMS系统模板引擎设计(5):Label应用初探
  6. Javascript的错误处理
  7. 如何pspice模型转成saber模型
  8. [jQuery原理] jQuery入口函数
  9. Python_argparse
  10. Tips--Altium Designer 安装时出现Account log in