从零开始基于西门子PLC用C#通过OPC编写一套简易车间能源信息系统(附代码)
写在面前
前面讲了很多汽车行业的案例,也讲了很多汽车行业的标准,比如西门子SICAR,戴姆勒Integra,大众VASS等(见文末)~
对于汽车四大工艺(冲、焊、涂、总)而言,车间的能源管控起着至关重要的作用~
而节能通常意味着设备运行状态的优化,而优化通常意味着大量的数据分析。在这个过程中,数据的采集和分析就变得越来越重要
今天分享的内容是来自一汽大众一个朋友做的内部真实项目案例~
01 项目背景与目的
02 实现思路与分析
03 五步详述数据采集与简易能源管理系统的实现
04 总结
01PART
项目背景与目的
项目背景:
在汽车四大工艺中,笔者所在车间能耗极高,每年都有一定节能指标,如何科学有效的使用技术和数字化手段节能是车间考虑的首要因素之一
通过这个系统实现以下目的:
车间水电气的消耗(瞬时、累计)记录
相同设备参数对比分析、优化设备运行状态
同一设备不同时期的对比分析、优化设备运行状态
设备运行时的(水、气)理论的消耗值和实际消耗值的偏差
02PART
实现思路,系统结构与步骤分析
以下示意图即为整个过程的大概思路:
系统结构:
实施步骤:
Step-1
主要涉及到仪表数据的读取,如(流量、压力、温度、PH、电导率等等),目前所接触到的这些仪表都是通过模拟量或数字量信号输入给PLC。PLC通过FB或FC对这些信号进行处理。
Step-2
涉及到上位机和PLC的通讯,通常采用OPC的方式,也可以通过高级语言(C#、VB.net、JAVA)等实现和PLC的通讯。snap7.dll 、sharp7.cs、libnodave.dll等都是免费开源的,这些也都可以配合高级语言实现与PLC的通讯。
Step-3
实现和PLC通讯后,将DB块中的数据存入数据库中。在Step-1中可以设置采样周期等相关参数。数据库可以采用mysql、sql-server、oracle等。
Step-4
Web-Server和数据库的交互,这里我们用PHP语言
Step-5
前端网页展示,主要是美观,涉及到css、javascript等。会用到一些好看的图表库,如echarts、jscharts等。
系统架构
03PART
五步详述数据采集与简易能源管理系统的实现
Step 1
如图片所示,这个阶段主要针对现场仪表和PLC的编程。
这里的仪表主要针对的是流量计、压力传感器、液位传感器、温湿度传感器等。
关于流量计之前有写过关于流量计的两篇文章,附上链接
数据采集与可视化-Siemens Plc-流量计-瞬时流量的一种统计方法-学习笔记-1
数据采集与可视化-Siemens Plc-流量计-瞬时流量的一种统计方法-学习笔记-2
关于温度的信号转换,可参考之前的一篇文章
传感器-温度传感器-FC105 通过取整指令,将对应的数值转换为整数
这里我们定义一下数据的存放标准
数据统一转换为整数型。数据存储在特定的DB块中,举例如下,我有100台PLC,每台PLC和现场仪表相关的数据都存放于DB100中。
数值读取与清零的两种方式
1-PLC周期性的给出清零指令,如定义在每天的23:59:59。获取系统时间,分别对时分秒进行比较。
2-上位机读取完数值后,直接将db100.dbw0的数值写入0
Step 2 & Step 3
本文主要内容为步骤2和步骤3,计划实现方法:
1-C#通过sharp7.cs读写PLC,C#操作数据库
2-C#通过KepWare读写PLC,C#操作数据库
3-C#通过Libnodave.dll读写PLC,C#操作数据库
4-KepWare直接访问PLC
5-Java通过Snap7.dll访问PLC
以上方法中,其中方法-1、3、5是相似的。本文着重讲解方法1。
方法1在之前的文章中也有讲过:
数据采集与可视化-C#-Sharp7学习笔记-1
数据采集与可视化-C#~PLC-Sharp7学习笔记-2
数据采集与可视化-C#~PLC-Sharp7学习笔记-3
数据采集与可视化-C#~PLC-Sharp7学习笔记-4
数据采集-C#通过Sharp7读取西门子PLC-DBW并存入Oracle数据库-(1)
C#+Sharp7实现西门子数据块中字的读写操作-系列终结篇
方法2可参考之前的文章
数据采集与可视化-Win10安装破解版KepWare V4.5
C# KEPServerEX 6 s7-400 学习笔记系列1-服务器的连接
C# KEPServerEX 6 s7-400 学习笔记系列2-PLC的连接及读取
C# KEPServerEX 6 s7-400 学习笔记系列3-单个PLC的连接及读取
C# KEPServerEX 6 s7-400 学习笔记系列4-多个PLC的连接及读取
方法4目前还没有尝试成功
方法5,更多信息可在网站中https://sourceforge.net/projects/snap7/获取更多信息
在这么多方法中,我更喜欢用方法-1。个人觉得结合C#,实现起来更加灵活。自己编写函数并封装到类中。
在这个过程中,一步一步摸索,走了很多弯路。今天总结一下,算是代表了目前我的C#的最高水平。应该也是以后的最高水平了,写完这个系列以后,我应该就会放弃C#的学习了。
下面开始项目的介绍
Basic_DataBase_Operate.cs是我创建的操作数据库的类。
Sharp7.cs是别人创建的操作PLC的类。
comWithPlc.cs是我基于Sharp.cs文件自己编写的一个类。里面是一些PLC的DB块数据读写的函数。这里我们定义了word的读和写(这里主要是写入0,清空数据)
类的使用
using comWithPlc //引用 getPlcValues operatePlc = new getPlcValues();//类的实例化operatePlc.readPlcDbwValue("10.228.140.46", 0, 3, 294, 0)//读取DB294.DBW的值
这里我们看一下类comWithPlc
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Sharp7;//引用sharp7.csnamespace comWithPlc{ class getPlcValues //创建类 { S7Client Client = new S7Client(); private byte[] Buffer = new byte[65536]; public int readPlcDbwValue(string plcIp,int Rack,int Slot,int DbNum,int DbwNum) { Client.ConnectTo(plcIp, Rack, Slot); //建立PLC连接 Client.DBRead(DbNum, DbwNum, 2, Buffer);//读取DbwNum所对应的字的值 Client.Disconnect();//断开PLC连接 return S7.GetIntAt(Buffer, 0); //返回值 } public void writePlcDbwValue(string plcIp, int Rack, int Slot, int DbNum, int DbwNum, int writeValue) { short a = (short)writeValue;//将整形的writeValue强制转换成short类型 Client.ConnectTo(plcIp, Rack, Slot); byte[] buffer = new byte[65536]; S7.SetIntAt(buffer, 0, a); Client.DBWrite(DbNum, DbwNum, 2, buffer);//将DbwNum对应的字更新 Client.Disconnect(); } }}
通过C#的timer,我们就可以实现数据的定时读取了。并且存入数据库。
C#操作数据库,网上可以收到大把的教程,这里我们就不在细说了。
目前根据车间现有仪表,做的一个简单的数据采集界面。
Step 4
首先我们需要下载一个phpStudy。phpStudy是一个PHP调试环境的程序集成包。 Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.
https://www.xp.cn/ 这里可以下载。
具体使用教程可以参考https://www.php.cn/phpstudy-377909.html
网上资料一搜一大把,这里不做过多阐述。
IDE推荐
这里我们推荐phpStorm.
下载地址https://www.jetbrains.com/ 目前只能试用30天,之前可以破解,现在激活码好像都被封了。过了30天之后,每次打开只能使用30分钟。
这个公司出了很多好用的IDE,如网页编辑可以使用webStorm,操作数据库可以使用DataGrip,等等用起来非常好用。
整个系统的结构
其他解释:
1-phpStorm如何通过FTP读写网站根目录
网上有大把教程资料,这里不再细说。通过这种方式,可以实现多人协同 开发。
2-为什么不把这些都放置在一台电脑上
个人理解,追求稳定吧。
3-为什么不采用phpStudy自带的mysql数据库
这个数据库远程访问配置麻烦,刚好车间有安装Oracle数据库,我就从项目一开始就使用了Oracle数据库。实际上IDE/webServer/数据库/数据采集软件可以运行在同一台电脑上。