python工业互联网监控项目实战2—OPC
OPC(OLE for Process Control)定义:指为了给工业控制系统应用程序之间的通信建立一个接口标准,在工业控制设备与控制软件之间建立统一的数据存取规范。它给工业控制领域提供了一种标准数据访问机制,将硬件与应用软件有效地分离开来,是一套与厂商无关的软件数据交换标准接口和规程,主要解决过程控制系统与其数据源的数据交换问题,可以在各个应用之间提供透明的数据访问。实际项目中“设备”就变成一个可以访问的OPC Server和它的Tag位号值,更多的详情请参考OPC基金会官网:http://opcfoundation.cn/。
上一小节我们首先通过一个简单的json格式来完成数据到UI端的传输,UI端解析Json数据,并通过JQuery渲染到div上来完成数据的显示,最后ajax轮询实现了数据的实时刷新。本小节我们把Domo进一步迭代改进,首先规范数据传输的格式,然后,实现实时读取模拟OPC Server的tag位号值。
1.1. 界面UI与Json数据结构
采用面向对象的模式来定义数据传输Json格式,“设备”对象包含多个“tag”属性值。上一小节例子中,我们从后台获取的数据格式是一个Json字符串,只定义了tank4C9的相关属性。
tank4C9={
'Status': random.randint(0,1), #设备运行状态
'OverheadFlow':random.randint(1,10) ,#'顶流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
实际项目中的监控界面会涉及到多个设备和多个监控tag位号,为了便于数据的规范管理和更新,Json数据格式构造采用面向对象的模式进行构建如下:
tank4C9={
'DeviceId': 1,
'DeviceName':'1#反应罐',
'Status': random.randint(0,1), #设备运行状态
'OverheadFlow':random.randint(1,10) ,#'顶流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
Json代码就构建了一个图例反应罐主要监控数据,注意多出来的设备状态点,也就是用来体现设备是运行状态还是停机状态。另外,为了体现这个设备来自那个一个OPC Server服务,更好地体现现场设备与采集器(OPC Server)的关系,再增加一层关于采集器的Json结构python代码如下:
tank4C9={
'DeviceId': 1,
'DeviceName':'1#反应罐',
'Status': random.randint(0,1), #设备运行状态
'OverheadFlow':random.randint(1,10) ,#'顶流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
}
Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[tank4C9],
}
从上述代码的数据关系上,我们能看出来设备“1#反应罐”属于“1#采集器”,数据采集器本身也有自己的设备运行状态位号,来标识采集设备自身是否正常运行。
1.2. 重构Collector APP代码
接下来我们重构Collector APP代码,增加一个getCollectorData函数来返回连接器数据。
1.Collector APP views 增加函数getCollectorData代码如下:
def getCollectorData(request): tank4C9={
'DeviceId': 1,
'DeviceName':'1#反应罐',
'Status': random.randint(0,1), #设备运行状态
'OverheadFlow':random.randint(1,10) ,#'顶流量',
'ButtomsFlow': random.randint(1,10), #'低流量'
'Power': random.randint(10000,100000), #功率
} Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[tank4C9],
} return HttpResponse( json.dumps(Collector));
2.修改项目urls文件urlpatterns ,发布getCollectorData path
from django.urls import path
from Collector import views urlpatterns = [
# Uncomment the next line to enable the admin:
#path('admin/', admin.site.urls) path('getTank4C9Data/', views.getTank4C9Data),
path('getCollectorData/', views.getCollectorData), ]
项目调试状态我们可以通过浏览器直接访问url查看webAPI结果。http://127.0.0.1:8090/getCollectorData/
注意:Json数据格式的变化,图中数据体现出了基于面向对象模式的层次结构“1#采集器”下面有一个包含的“设备对象列表”DeviceList属性。
1.3. 修改UI代码
现在修改tank4C9.html文件里面的getData异步获取数据函数代码修改为读取上面getCollectorData函数如下:
<script> //JQuery 代码入口
$(document).ready(function(){ setInterval("getData()",1000); }); function getData() {
//模拟异步从后台获得值
$.ajax({
url: "/getCollectorData/", success: function (result) {
data = JSON.parse(result);
tank4C9=data.DeviceList[0] $("#OverheadFlow").html(tank4C9.OverheadFlow);
$("#ButtomsFlow").html(tank4C9.ButtomsFlow);
$("#Power").html(tank4C9.Power);
}});
} </script>
调试运行http://127.0.0.1:8090/tank4C9/ UI同样的实时自动刷新后台数据的浏览效果。
重点:代码重构的要点的功能不变的情况下,优化代码结构。
代码的结构优化,优先保证功能不变,尽量不要试图在一次迭代中引入过多的变量,这样只会导致编程工作杂乱无章的进行。Json格式代码重构完成后,接下来我们把代码调整成读取OPC Server服务的Tag点。
1.4. 从OPC Server读取Tag值
现在我们重构getCollectorData函数代码,通过OPC服务读取真正的设备值,当然dome的例子是读取一个模拟OPC服务,实际项目中读取设备发布的OPC服务即可,代码如下:
<script>
def getCollectorData(request): tank4C9={
'DeviceId': 1,
'DeviceName':'1#反应罐',
'Status': 0, #设备运行状态
'OverheadFlow':0 ,#'顶流量',
'ButtomsFlow': 0, #'低流量'
'Power': 0, #功率
} import OpenOPC
opc = OpenOPC.client()
opc.connect('Matrikon.OPC.Simulation')
tank4C9['OverheadFlow']= opc['Random.Int1']
tank4C9['ButtomsFlow']= opc['Random.Int2']
tank4C9['Power']= opc['Random.Int4']
opc.close() Collector={
'CollectorId': 1,
'CollectorName':'1#采集器',
'Status': 0,
'DeviceList':[tank4C9],
} return HttpResponse( json.dumps(Collector));
现在重新调试运行并浏览监控界面http://127.0.0.1:8090/tank4C9/动态效果如下:
1.5. 小结
本小节我们演示了如何在功能不变的模式下重构代码来实现功能的迭代和推进,过程中始终贯穿功能不变的前提下重构代码的结构来满足新迭代功能的要求,然后再改变代码功能读取OPC服务tag位号值。最终调整了Json的数据封装格式和实时设备数据从设备OPC Server中获取,也演示了从技术探索原型到生产原型的代码迭代过程。下一节我们将把ajax轮询演进到通过websocket来实现UI端的数据刷新,提高数据刷新的效率。
python工业互联网监控项目实战2—OPC的更多相关文章
- python工业互联网监控项目实战5—Collector到opcua服务
本小节演示项目是如何从连接器到获取Tank4C9服务上的设备对象的值,并通过Connector服务的url返回给UI端请求的.另外,实际项目中考虑websocket中间可能因为网络通信等原因出现中断情 ...
- python工业互联网监控项目实战4—python opcua
前面章节我们采用OPC作为设备到上位的信息交互的协议,本章我们介绍跨平台的OPC UA.OPC作为早期的工业通信规范,是基于COM/DCOM的技术实现的,用于设备和软件之间交换数据,最初,OPC标准仅 ...
- Python工业互联网监控项目实战3—websocket to UI
本小节继续演示如何在Django项目中采用早期websocket技术原型来实现把OPC服务端数据实时推送到UI端,让监控页面在另一种技术方式下,实时显示现场设备的工艺数据变化情况.本例我们仍然采用比较 ...
- Python爬虫开发与项目实战
Python爬虫开发与项目实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1MFexF6S4No_FtC5U2GCKqQ 提取码:gtz1 复制这段内容后打开百度 ...
- Python爬虫开发与项目实战pdf电子书|网盘链接带提取码直接提取|
Python爬虫开发与项目实战从基本的爬虫原理开始讲解,通过介绍Pthyon编程语言与HTML基础知识引领读者入门,之后根据当前风起云涌的云计算.大数据热潮,重点讲述了云计算的相关内容及其在爬虫中的应 ...
- python工业互联网应用实战2—从需求开始
前言:随着国家工业2025战略的推进,工业互联网发展将会提速,将迎来一个新的发展时期,越来越多的企业开始逐步的把产线自动化,去年年底投产的小米亦庄的智能工厂就是一个热议的新闻.小米/华为智能工厂只能说 ...
- python工业互联网应用实战3—模型层构建
本章开始我们正式进入到实战项目开发过程,如何从需求分析获得的实体数据转到模型设计中来,变成Django项目中得模型层.当然,第一步还是在VS2019 IDE环境重创建一个工程项目,本文我们把工程名称命 ...
- python工业互联网应用实战1—SQL与ORM
从sql到ORM应该说也是编程体系逐步演化的结果,通过类和对象更好的组织开个过程中遇到的各种业务问题,面向对象的解耦和内聚作为一套有效的方法论,对于复杂的企业应用而言确实能够解决实践过程中很多问题. ...
- python工业互联网应用实战18—前后端分离模式之jquery vs vue
前面我们分三章来说明了使用django template与jquery的差别,通过jquery如何来实现前后端的分离,同时再9章节使用vue.js 我们浅尝辄止的介绍了JQuery到vue的切换,由于 ...
随机推荐
- 基于 HTML + WebGL 结合 23D 的疫情地图实时大屏 PC 版【转载】
前言 2019年12月以来,湖北省武汉市陆续发现了多例肺炎病例,现已证实为一种新型冠状病毒感染引起的急性呼吸道传染病并蔓延全国,肺炎疫情牵动人心,人们每天起来第一件事变成了关注疫情进展,期望这场天灾早 ...
- win10安装ubuntu子系统和图形界面
子系统可以很方便的调用windows的文件(在/mnt里就有各个盘),也可以在windows里用VScode编辑linux的文件.还是很方便的.也可以切出去用QQ微信. 安装子系统参考教程:https ...
- SpringCloud微服务:Sentinel哨兵组件,管理服务限流和降级
源码地址:GitHub·点这里||GitEE·点这里 一.基本简介 1.概念描述 Sentinel 以流量为切入点,从流量控制.熔断降级.系统负载保护等多个维度保护服务的稳定性.包括核心的独立类库,监 ...
- Jmeter Agent自动化
1.打开菜单栏-附件-系统工具-任务计划程序,新建PerformanceTest目录. 2.在PerformanceTest目录下新建一个基本任务. 3.完成. 这样,当我们在使用Jmeter进行分布 ...
- React Native实现短信转发到微信上
缘由 都说需求来源于生活我为什么会有一个这么奇葩的需求呢?来看一个故事. 昨天为了省点手续费导航走了3公里多去找一家工行ATM机(没办法穷)然后到了以后发现ATM机在人家的园区里面,现在疫情进入要通行 ...
- linux入门系列19--数据库管理系统(DBMS)之MariaDB
前面讲完Linux下一系列服务的配置和使用之后,本文简单介绍一款数据库管理系统(MySQL的兄弟)MariaDB. 如果你有MySQL或其他数据的使用经验,MariaDB使用起来将非常轻松. 本文讲解 ...
- IE 跨域session丢失问题
在测试时发现session 取不到值,以为是session赋值除了问题,但是在Chrome中一切正常,故排除此原因.那问题肯定出在浏览器身上里.于是一步一步调试,发现在IE中,如果页面跳转,Sessi ...
- HTML中的IE条件注释,让低版本IE也能正常运行HTML5+CSS3网站的3种解决方案
最近的项目中,因为需要兼容IE7,IE8,IE9,解研究了IE的条件注释,顺手写下来备忘. HTML中的IE条件注释 IE条件注释是一种特殊的HTML注释,这种注释只有IE5.0及以上版本才能理解. ...
- hdu1181 dfs 字符串首尾可拼接,问是否可寻找到一条字串路径使得首尾分别是‘b’和‘m’,简单的搜索+回溯
#include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...
- 解决WSL在执行32位程序时报错“Exec format error”的问题
当你尝试在WSL上运行32位的程序时,shell将会报错:cannot execute binary file: Exec format error. 这是因为WSL目前暂不支持32位的ELF可执行文 ...