使用 FUXA 构建 SCADA 监控演示
最近更新:
本教程使用模拟储罐液位数据,在 reComputer RK3576 上构建一个小型 SCADA 监控画面。Mosquitto 接收 MQTT 消息,FUXA 订阅数据,并在网页画面中显示数值和趋势图;最后再配置低液位报警。
这是纯软件演示。 本文不连接 PLC、不控制水泵,也不验证实体设备的控制功能。开始前,请先完成本分类中的 FUXA 安装教程。
准备工作
- reComputer RK3576 已按照安装教程运行名为
fuxa-rk3576的 FUXA 容器。 - 可以通过 SSH 登录 RK3576,并从同一可信网络的电脑打开 FUXA 网页。
- RK3576 上有 Mosquitto Broker 和
mosquitto_pub/mosquitto_sub。如未安装,可按下文安装。
安装教程使用 Linux host 网络。先确认容器正在运行,且网络模式为 host,这样 FUXA 才能连接 RK3576 本机的 127.0.0.1:1883:
sudo docker ps --filter name=fuxa-rk3576
sudo docker inspect -f '{{.HostConfig.NetworkMode}}' fuxa-rk3576如果第二条命令没有输出 host,FUXA 容器内的 127.0.0.1 就不代表 RK3576 主机。请先根据实际容器网络调整 Broker 地址,再继续操作。
步骤 1:准备本机 MQTT Broker
在 RK3576 上执行:
sudo apt update
sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable --now mosquitto
systemctl is-active mosquitto
sudo ss -ltnp | grep ':1883'systemctl is-active 应输出 active。本地演示只需让 Broker 在 RK3576 本机监听;不要将无身份验证的 MQTT 端口开放到互联网。如果已有启用身份验证的 Broker,请使用该 Broker 的实际连接设置。
步骤 2:发布并核对模拟数据
用一个 MQTT 主题传输三个数值型储罐液位。先发布一条保留消息,使 FUXA 在稍后订阅时也能读到最新值:
mosquitto_pub -h 127.0.0.1 -p 1883 \
-t rk3576/fuxa/demo/tanks -r \
-m '{"tank1":7500,"tank2":1500,"tank3":3000}'
mosquitto_sub -h 127.0.0.1 -p 1883 \
-t rk3576/fuxa/demo/tanks -C 1 -v订阅命令应立即打印主题和 JSON。后续步骤中的 tank1、tank2、tank3 拼写必须与这里一致。
步骤 3:让 FUXA 连接 MQTT
打开 http://<RK3576_IP>:1881/editor,点击编辑器左上角的齿轮图标,进入 Connections,新增一个 MQTT 连接:
| 配置项 | 本地演示值 |
|---|---|
| Name | RK3576 MQTT |
| Type | MQTTclient |
| Address (mqtt://[server]:[port]) | mqtt://127.0.0.1:1883 |
| Enable | 开启 |
Polling 保持未设置。点击 OK,确认连接旁出现绿色状态点。这里只需要建一个 MQTT 连接;三个储罐数值是同一主题中的字段,不是三个独立连接。
点击该连接上的链条图标,进入标签与订阅页面。在 Browser Topics on broker 输入 rk3576/fuxa/demo/tanks,点击搜索图标,选择该主题。如果 Topic path 没有自动填入,就填入同一个主题路径;选择 json 而不是 raw,再点击 Subscribe。确认订阅后出现 tank1、tank2、tank3 三个数值字段。
步骤 4:制作监控画面
返回编辑器,在 Views 中打开 MainView,先添加 RK3576 Tank Monitor 这样的文字标题。
- 从 Controls 拖入数值显示控件(## 图标),绑定到数值标签
tank1,不要绑定到整个 JSON 主题。再添加两个数值显示控件,分别绑定tank2和tank3。初始消息发布后,它们应显示7500、1500、3000。 - 从 Controls 拖入 Chart 控件(折线图图标)。打开它的 Chart settings,在 Chart to show 中选择 New Chart。进入图表配置后,点击 + 新建名为
Tank Levels的图表。 - 在新图表的 ⋮ 菜单中选择 Add Line,把曲线绑定到
tank1;如需在同一张图中显示全部液位,按相同方式添加tank2、tank3曲线。回到 Chart to show 选择Tank Levels。 - 点击磁盘图标保存,再使用播放/预览按钮确认三个数值和图表出现在运行页面。
请以 FUXA 标签选择器中实际显示的名称为准。它可能在字段名前显示 MQTT 连接和主题路径。
步骤 5:观察实时数据变化
在 RK3576 的第二个终端运行以下前台模拟器。需要停止时按 Ctrl+C:
tank1=7500
tank2=1500
tank3=3000
while true; do
mosquitto_pub -h 127.0.0.1 -p 1883 \
-t rk3576/fuxa/demo/tanks -r \
-m "{\"tank1\":$tank1,\"tank2\":$tank2,\"tank3\":$tank3}"
tank1=$((tank1 - 100))
tank2=$((tank2 + 60))
tank3=$((tank3 + 40))
if [ "$tank1" -le 0 ]; then
tank1=7500
tank2=1500
tank3=3000
fi
sleep 2
done在 FUXA 运行画面中,确认数值随消息更新,趋势图逐渐出现数据点。测试下面的报警前,先停止模拟器,否则下一条模拟消息会立即覆盖报警测试值。
步骤 6:添加并测试低液位报警
在 FUXA 编辑器中点击左上角齿轮图标,进入 Alarms 并新增报警,按下表填写:
| 配置项 | 值 |
|---|---|
| Name | Tank 1 low level |
| Tag | RK3576 MQTT 下的 tank1 数值标签 |
| Low → Enabled | 开启 |
| Low → Check interval (seconds) | 1 |
| Low → Min / Max | 0 / 1000 |
| Low → Time in Min-Max range (seconds) | 1 |
| Low → Text | Tank 1 low level |
点击 OK 并保存编辑器项目。检查间隔和区间持续时间的单位都是秒,这里填写 1,不是 1000。本例不需要再设置 High 或 High High 条件。
确认模拟器已经停止,再发布低液位数值:
mosquitto_pub -h 127.0.0.1 -p 1883 \
-t rk3576/fuxa/demo/tanks -r \
-m '{"tank1":800,"tank2":1500,"tank3":3000}'打开 FUXA 运行页面 http://<RK3576_IP>:1881/。确认第一个数值显示为 800、右上角铃铛出现红色数字,并且下方 Alarms 列表出现 Tank 1 low level,优先级为 Low、状态为 Active。如果报警列表已收起,点击铃铛将其展开。
测试结束后发布正常值:
mosquitto_pub -h 127.0.0.1 -p 1883 \
-t rk3576/fuxa/demo/tanks -r \
-m '{"tank1":7500,"tank2":1500,"tank3":3000}'验证结果与边界
当 MQTT 连接正常、数值显示和趋势图随消息变化,并且 tank1 为 800 时出现低液位报警,这个模拟监控演示就完成了。这里的发布器只是前台测试循环,不是生产数据源。循环停止后,MQTT 保留消息仍可能让画面显示最后一个数值;静态数值不能证明新数据仍在到达。
实际部署时,应换成经过身份验证的数据源,限制 FUXA 网页和 Broker 的访问,并针对真实设备验证报警及任何控制动作。不要把本例直接用于安全关键设备。