当前位置: 首页 > news >正文

PyScada(四)构建用户 HMI

构建用户 HMI(前端)的简短说明

在后端HMI部分:

  1. 图表,添加新图表
  2. 页面,添加页面
  3. Widget,添加一个 Widget,在 Page 下选择您在 2 中添加的页面,并在Content下选择1 中的图表。
  4. 小部件控制页面上每个元素的位置。设置小部件的位置(行、列)和宽度。
  5. 查看,添加视图并从 2 中选择页面。
  6. (可选)GroupDisplayPermissions,添加新的 GroupDisplayPermission,(如果需要添加新组并将您的用户添加到该组,请选择您在 1. 至 4 中创建的所有项目。)
  7. 打开http://IP/,您应该看到新的视图,如果 DAQ 正在运行并且数据库中已有数据,您应该看到最近 2 小时的数据和当前数据。

前端结构:

+-View------------------------------------+
|                                         |
| +-Page--------------------------------+ |
| |                                     | |
| | +-Widget--------+ +-Widget--------+ | |
| | |               | |               | | |
| | | Row 1, Col 1  | | Row 1, Col 2  | | |
| | | Width 1/2     | | Width 1/2     | | |
| | | +-Chart-----+ | | +-Chart-----+ | | |
| | | |           | | | |           | | | |
| | | +-----------+ | | +---------- + | | |
| | +---------------+ +---------------+ | |
| +-------------------------------------+ |
+-----------------------------------------+

设备协议 ID ¶


  • 1:保留(调度程序)
    2:系统统计
    3:Modbus
    4:BAC网络
    5:签证
    6:1线
    7:潘特
    8:SMBus
    9:保留(Jofra350)
    10:GPIO
    11:保留(PT104)
    12:OPC-UA
    13:SML(智能电表语言)
    14:文件
    15:仪表总线(MBus)
    16:通用虚拟设备
    17:特快专递
    18:运营
    19:聚合
    8X:定制工人
    93:保留(串行)
    94:保留(Web 服务)
    95:保留(脚本)
    96:保留(事件)
    97:保留(邮件)
    98:保留(报告)
    99:保留(导出)
    100+:保留用于动态

使用 Grafana

mysql

添加用户并授予 SELECT 权限:

sudo mysql -uroot -p -e "GRANT SELECT ON PyScada_db.* TO 'Grafana-user'@'localhost' IDENTIFIED BY 'Grafana-user-password';"

nginx

在/etc/nginx/nginx.conf后添加:http { ... }

include /etc/nginx/grafana-access.conf;

使用以下命令创建/etc/nginx/grafana-access.conf:

stream {# MySQL serverserver {listen     3305;proxy_pass 127.0.0.1:3306;proxy_timeout 60s;proxy_connect_timeout 30s;}
}

重新启动 Nginx :

sudo systemctl restart nginx

Grafana

添加MySQL数据源:

  • 主持人 :
    • 本地:/run/mysqld/mysqld.sock
    • 远程:SERVER_WITH_NGINX_IP:3305
  • 数据库 :PyScada_db
  • 用户:Grafana-user
  • 密码 :Grafana-user-password

创建仪表板:

  • 或者导入示例仪表板。
  • 或者例如,添加这些变量:set和:refresh on dashboard load``multi-value``all option
    • 添加 mysql 数据源变量(类型 Datasource)。
    • 使用类型查询添加变量$Datasource:
      • 协议:SELECT protocol AS __text, id AS __value FROM pyscada_deviceprotocol
      • 设备 :SELECT d.short_name AS __text, d.id AS __value FROM pyscada_device d WHERE d.protocol_id IN (${Protocols}) AND d.active = 1
      • 单位 :SELECT u.unit AS __text, u.id AS __value FROM pyscada_unit u
      • 变量:SELECT v.name AS __text, v.id AS __value FROM pyscada_variable v WHERE v.device_id IN (${Devices}) AND v.unit_id IN (${Units}) AND v.active = 1
      • 时间组(类型Interval):1s,10s,1m,10m,30m,1h,6h,12h,1d,7d,14d,30d,1M
      • 空为(自定义类型):0, NULL, previous
  • 查询示例:
SELECT$__timeGroupAlias(r.date_saved,$time_group),avg(IFNULL(r.value_float64, 0.0) + IFNULL(r.value_int64, 0.0) + IFNULL(r.value_int32, 0.0) + IFNULL(r.value_int16, 0.0) + IFNULL(r.value_boolean, 0.0)),v.name AS metric
FROM pyscada_recordeddata as r
JOIN pyscada_variable v ON r.variable_id = v.id
WHERE$__timeFilter(r.date_saved) ANDr.variable_id IN (${Variables})
GROUP BY time, metric
ORDER BY $__timeGroup(r.date_saved,$time_group,$null_as)

嵌入 pyscada HMI

编辑 Grafana 配置文件:

sudo nano /etc/grafana/grafana.ini

查找并设置:

  • 允许嵌入= true
  • 对于本地主机 grafana : root_url = http://localhost:3000/grafana/

对于 localhost grafana 添加/etc/nginx/sites-enabled/pyscada.conf:

location /grafana/ {proxy_pass http://127.0.0.1:3000/;
}

重新启动 Grafana 服务器:

sudo systemctl restart grafana-server.service

使用仪表板中的代码或 grafana 中共享选项的面板创建自定义 html 面板

其他

使用ssl:http://www.turbogeek.co.uk/2020/09/30/grafana-how-to-configure-ssl-https-in-grafana/

对于开发人员

激活PyScada虚拟环境

source /home/pyscada/.venv/bin/activate

克隆存储库

git clone git@github.com:pyscada/PyScada.git

对于像 PyScada-Modbus 这样的插件:

git clone git@github.com:pyscada/PyScada-Modbus.git

Pip 可编辑安装

激活虚拟环境后:

sudo -u pyscada -E env PATH=${PATH} pip3 install -e ./PyScada

对于像 PyScada-Modbus 这样的插件:

sudo -u pyscada -E env PATH=${PATH} pip3 install -e ./PyScada-Modbus

重新启动应用程序

激活虚拟环境后,要应用更改(根据更改的情况),可能需要:

创建迁移

python3 /var/www/pyscada/PyScadaServer/manage.py makemigrations

应用它们

python3 /var/www/pyscada/PyScadaServer/manage.py migrate

复制静态文件(answer yes)

sudo -u pyscada -E env PATH=${PATH} python3 /var/www/pyscada/PyScadaServer/manage.py collectstatic

然后你可以 :

对于 URL、视图或管理员更改,请重新启动 Gunicorn

sudo systemctl restart gunicorn

否则重新启动 PyScada

sudo systemctl restart pyscada

覆盖路线

当您希望重写现有视图(以及现有路线)时会遇到此用例。

PyScada 项目的urls.py文件用于加载软件的路由(请参阅此处)。

  • python虚拟环境安装:位于/var/www/pyscada/PyScadaServer/PyScadaServer
  • Docker 安装:位于/src/pyscada/PyScadaServer/PyScadaServer

默认情况下,项目的urls.py文件仅加载urls.py来自pyscada.core. 该文件以随机顺序pyscada.core.urls加载所有其他模块文件。urls.py

使用的路由是遇到的第一个有效路由,因此如果您想替换现有路由,则必须在其他路由之前加载您的路由,即在加载pyscada.core.urls文件之前。

为此,您需要修改项目的urls.py文件。

对于非 Docker 安装:

sudo -u pyscada nano /var/www/pyscada/PyScadaServer/PyScadaServer/urls.py

并在 pyscada.core.urls 之前包含您的路线

urlpatterns = [
path('', include('pyscada.yourPlugin.urls')), #Routing file yourPlugin
path('', include('pyscada.core.urls')),
]

相关文章:

  • 亿联 AM610 M.2 SSD PCIE 3.0X2 128GB测评
  • NSIS 入门教程 (一)
  • mybatis框架相关问题总结(本地笔记搬运)
  • 这家民营银行起诉担保公司?暴露担保增信兜底隐患
  • 波兰出局奥地利无限可能,荷法无谓争小组第一,谁能小组第一?
  • 帕金森患者饮食指南:科学调养,呵护健康
  • 一般人不要学Python?一般人怎么学Python!!
  • Android studio在Ubuntu桌面上 创建桌面图标,以及导航栏图标
  • “论数据访问层设计技术及其应用”必过范文,软考高级,系统架构设计师论文
  • 【Pmac】PMAC QT联合开发中各种可能遇到的坑
  • C++之提高篇
  • 【数据结构】链表的大概认识及单链表的实现
  • 考前刷题练手感(北航期末往年数据结构编程题)
  • 【数据结构】线性表之《栈》超详细实现
  • 【八股系列】介绍React高阶组件,适用于什么场景?
  • Fabric架构演变之路
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Js基础——数据类型之Null和Undefined
  • k8s如何管理Pod
  • Laravel 中的一个后期静态绑定
  • MaxCompute访问TableStore(OTS) 数据
  • RxJS: 简单入门
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • SQLServer之创建显式事务
  • SSH 免密登录
  • Vue.js源码(2):初探List Rendering
  • 不上全站https的网站你们就等着被恶心死吧
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 后端_MYSQL
  • 坑!为什么View.startAnimation不起作用?
  • 容器服务kubernetes弹性伸缩高级用法
  • 设计模式 开闭原则
  • 正则学习笔记
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 第二十章:异步和文件I/O.(二十三)
  • ![CDATA[ ]] 是什么东东
  • ###STL(标准模板库)
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #define用法
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #图像处理
  • (SpringBoot)第七章:SpringBoot日志文件
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (力扣题库)跳跃游戏II(c++)
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .NET Standard 的管理策略
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET 指南:抽象化实现的基类
  • .NET 中使用 TaskCompletionSource 作为线程同步互斥或异步操作的事件
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net的C#语言取月份数值对应的MonthName值