
📚 上一篇回顾:我们拆解了FUXA编辑器的核心功能,并通过简易车间温度监控案例掌握了基础操作。
🎯 本篇目标:带来完整实战教程,从FUXA环境准备、多类型设备对接,到复杂工业可视化项目搭建、高级功能(报警/调度/第三方集成)实现,再到最终的项目部署与优化,全程手把手教学,帮你真正落地工业级可视化系统。
本实战案例以"小型工厂多区域监控系统"为目标,实现以下功能:
✅ 对接2台不同协议设备(西门子S7-1200 PLC、Modbus TCP传感器) ✅ 实时展示温度、压力、设备运行状态等6项参数 ✅ 实现超标报警、定时数据导出、手机短信通知 ✅ 支持多终端访问
在开始实战前,需完成FUXA安装、设备调试、工具准备三步,确保环境可用。
FUXA基于Node.js开发,支持全平台安装,推荐使用官方安装包(最简单)或Docker部署(适合生产环境)。
步骤1:下载安装包 访问FUXA官网,进入"Download"页面,下载Windows版本安装包(如FUXA-Setup-1.1.10.exe)
步骤2:双击安装 打开安装包,按引导完成安装(默认路径即可,勾选"Create desktop shortcut"创建桌面快捷方式)
步骤3:启动验证 安装完成后,双击桌面"FUXA"图标,自动启动服务并打开浏览器(默认地址:http://localhost:1881),出现登录界面即安装成功(默认账号:admin,密码:admin)
步骤1:安装Node.js
FUXA依赖Node.js(v14+),访问Node.js官网下载对应系统版本,安装后执行 node -v 验证(显示版本号即成功)
步骤2:安装FUXA
打开终端,执行命令 npm install -g fuxa(全局安装)
步骤3:启动服务
终端执行 fuxa,出现"Server running on port 1881"即启动成功,浏览器访问 http://localhost:1881 即可
步骤1:安装Docker 确保本地已安装Docker(Windows需开启WSL2)
步骤2:拉取镜像
终端执行 docker pull frangoteam/fuxa:latest
步骤3:启动容器 执行命令(映射端口和数据卷,确保数据持久化):
docker run -d -p 1881:1881 -v fuxa-data:/app/data --name fuxa frangoteam/fuxa:latest
步骤4:验证
浏览器访问 http://服务器IP:1881,登录后即可使用(数据卷 fuxa-data 用于保存项目文件,避免容器删除后数据丢失)
📦 硬件设备:
🔧 调试工具:
📝 其他准备:
工业场景中常需对接多种协议设备,本案例将同时对接"西门子S7-1200 PLC"和"Modbus TCP传感器"。
确保设备已完成基础网络配置,可与FUXA服务器通信:
登录FUXA后,进入"项目设置-设备配置",分别添加两台设备:
步骤1:点击"添加设备",设备名称填写"PLC_S71200",设备类型选择"SIEMENS > S7-1200/1500"
步骤2:通信参数配置:
参数 | 值 | 说明 |
|---|---|---|
IP地址 | 192.168.1.100 | PLC实际IP |
机架号 | 0 | 默认值 |
槽号 | 1 | S7-1200默认槽号 |
通信端口 | 102 | 西门子S7协议默认端口 |
超时时间 | 3000ms | 避免通信不稳定 |
步骤3:点击"测试连接",显示"连接成功"即配置完成;若失败,检查IP是否可达、参数是否正确、PLC是否上电。
步骤1:点击"添加设备",设备名称填写"Sensor_ModbusTCP",设备类型选择"Modbus > Modbus TCP"
步骤2:通信参数配置:
参数 | 值 | 说明 |
|---|---|---|
IP地址 | 192.168.1.101 | 传感器实际IP |
端口 | 502 | Modbus TCP默认端口 |
从站地址 | 1 | 传感器设置的从站地址 |
超时时间 | 3000ms | - |
步骤3:点击"测试连接",显示"连接成功"即完成配置。
进入"项目设置-标签管理",为两台设备分别创建标签(标签即设备参数的映射,用于后续组件绑定):
点击"添加标签",填写标签信息:
标签名称 | 设备关联 | 数据类型 | 地址(PLC寄存器) | 单位 | 备注 |
|---|---|---|---|---|---|
PLC_车间1温度 | PLC_S71200 | 数值型(Real) | DB1.DBW0 | ℃ | 车间1温度监测 |
PLC_设备运行状态 | PLC_S71200 | 布尔型(Bool) | I0.0 | - | 1=运行,0=停止 |
点击"保存",重复操作添加其他PLC参数标签(如车间1压力、设备故障信号)。
点击"添加标签",填写标签信息(Modbus地址格式:类型+地址,如40001对应保持寄存器):
标签名称 | 设备关联 | 数据类型 | Modbus地址 | 单位 | 备注 |
|---|---|---|---|---|---|
Sensor_车间2温度 | Sensor_ModbusTCP | 数值型(Float) | 40001(保持寄存器) | ℃ | 车间2温度监测 |
Sensor_车间2压力 | Sensor_ModbusTCP | 数值型(Float) | 40003(保持寄存器) | bar | 车间2压力监测 |
点击"保存",完成标签创建。
基于已配置的设备和标签,搭建"小型工厂多区域监控系统"界面,实现多设备参数实时展示、状态可视化、交互控制。
步骤1:点击顶部导航栏"文件-新建项目",项目名称填写"工厂多区域监控系统",点击"确定"
步骤2:界面布局设计,从左侧工具栏拖拽组件完成基础布局,推荐结构:
┌─────────────────────────────────────────────────────┐
│ 顶部:标题栏 + 系统状态 │
├──────────────────┬──────────────────────────────────┤
│ 左侧:车间1监控区 │ 右侧:车间2监控区 │
│ - 温度仪表盘 │ - 温度仪表盘 │
│ - 压力仪表盘 │ - 压力仪表盘 │
│ - 运行状态指示灯 │ - 运行状态指示灯 │
├──────────────────┴──────────────────────────────────┤
│ 下方:数据趋势区(折线图)+ 控制区(按钮) │
└─────────────────────────────────────────────────────┘
布局说明:
选中每个组件,在右侧属性面板"数据绑定"中关联对应标签,部分关键组件配置如下:
步骤1:选中车间1温度仪表盘,数据绑定选择"PLC_S71200 > PLC_车间1温度"
步骤2:设置数据范围:
步骤3:添加样式:仪表盘颜色设置为渐变(绿色-黄色-红色),对应正常-预警-超标状态。
步骤1:拖拽"圆形"组件作为指示灯,数据绑定选择"PLC_S71200 > PLC_设备运行状态"
步骤2:添加动画配置:
步骤1:拖拽"折线图"组件,标题设置为"温度/压力24小时趋势"
步骤2:数据绑定:添加4个数据系列,分别关联:
步骤3:设置X轴:
步骤4:添加交互:
步骤1:拖拽"按钮"组件,文本设置为"启动车间1设备",绑定PLC设备运行状态标签
步骤2:添加点击事件脚本(组件脚本):
// 启动/停止车间1设备
if (tags.PLC_设备运行状态.getValue() === false) {
tags.PLC_设备运行状态.setValue(true); // 发送启动指令
widget.setText("停止车间1设备");
widget.setStyle("backgroundColor", "red");
} else {
tags.PLC_设备运行状态.setValue(false); // 发送停止指令
widget.setText("启动车间1设备");
widget.setStyle("backgroundColor", "green");
}
✨ 状态切换动画:为设备运行状态指示灯添加颜色渐变动画(绿色-红色过渡时间0.5秒)
🚨 数据超标报警动画:为温度仪表盘添加超标动画(温度>80℃时,仪表盘边框红色闪烁)
👆 交互反馈:控制按钮点击时添加按压效果(缩放比例0.95,释放后恢复1.0)
🖥️ 视图切换:添加"全屏显示"按钮,点击事件脚本调用 app.fullscreen() 实现全屏切换
基础监控界面完成后,添加工业场景必需的高级功能,提升系统实用性和智能化水平。
实现"温度>80℃""压力>12bar"时自动报警,包含弹窗提示、声音报警、报警记录存储。
步骤1:从左侧工具栏"交互组件"拖拽"报警组件"到界面,设置为默认隐藏
步骤2:添加报警规则脚本(全局脚本):
// 定时检查参数是否超标(每1秒执行一次)
setInterval(function() {
// 定义超标条件
const temp1Over = tags.PLC_车间1温度.getValue() > 80;
const press1Over = tags.PLC_车间1压力.getValue() > 12;
const temp2Over = tags.Sensor_车间2温度.getValue() > 80;
const press2Over = tags.Sensor_车间2压力.getValue() > 12;
// 超标时触发报警
if (temp1Over || press1Over || temp2Over || press2Over) {
// 显示报警组件
widgets.报警组件.setVisible(true);
// 设置报警内容
let alarmText = "超标预警:\n";
if (temp1Over) alarmText += "车间1温度超标(" + tags.PLC_车间1温度.getValue() + "℃)\n";
if (press1Over) alarmText += "车间1压力超标(" + tags.PLC_车间1压力.getValue() + "bar)\n";
if (temp2Over) alarmText += "车间2温度超标(" + tags.Sensor_车间2温度.getValue() + "℃)\n";
if (press2Over) alarmText += "车间2压力超标(" + tags.Sensor_车间2压力.getValue() + "bar)\n";
widgets.报警组件.setText(alarmText);
// 播放报警声音(需提前导入音频文件)
const audio = newAudio("alarm.mp3");
audio.play();
} else {
// 数据正常,隐藏报警组件
widgets.报警组件.setVisible(false);
}
}, 1000);
通过脚本将报警记录存储到本地JSON文件或对接数据库(如MySQL),示例(存储到本地):
// 报警时记录数据(添加到上述超标判断逻辑中)
const alarmRecord = {
time: newDate().toLocaleString(),
content: alarmText,
level: "严重"
};
// 读取现有记录并添加新记录
fetch("/api/files/alarm-records.json")
.then(response => response.json())
.then(records => {
records.push(alarmRecord);
// 写入文件
fetch("/api/files/alarm-records.json", {
method: "PUT",
body: JSON.stringify(records, null, 2),
headers: { "Content-Type": "application/json" }
});
});
使用FUXA调度器实现定时任务,如"每天00:00自动导出前一天数据""每小时检查设备连接状态"。
步骤1:进入"项目设置-调度器",点击"添加调度器"
步骤2:配置调度器参数:
参数 | 值 | 说明 |
|---|---|---|
名称 | 每日数据导出 | - |
触发类型 | 定时(Cron表达式) | - |
Cron表达式 | 0 0 0 * * ? | 每天00:00执行 |
执行动作 | 运行脚本 | - |
步骤3:脚本内容(导出数据到CSV文件):
// 导出前一天温度/压力数据到CSV
const moment = require("moment");
const fs = require("fs");
// 定义导出时间范围(前一天00:00到23:59)
const start = moment().subtract(1, "day").startOf("day").format("YYYY-MM-DD HH:mm:ss");
const end = moment().subtract(1, "day").endOf("day").format("YYYY-MM-DD HH:mm:ss");
// 查询趋势数据(FUXA内置API)
fetch(`/api/tags/history?tags=PLC_车间1温度,PLC_车间1压力,Sensor_车间2温度,Sensor_车间2压力&start=${start}&end=${end}`)
.then(response => response.json())
.then(data => {
// 转换为CSV格式
let csv = "时间,车间1温度(℃),车间1压力(bar),车间2温度(℃),车间2压力(bar)\n";
data.forEach(item => {
csv += `${item.time},${item["PLC_车间1温度"]},${item["PLC_车间1压力"]},${item["Sensor_车间2温度"]},${item["Sensor_车间2压力"]}\n`;
});
// 写入CSV文件
const fileName = `数据导出_${moment().subtract(1, "day").format("YYYYMMDD")}.csv`;
fetch(`/api/files/${fileName}`, {
method: "PUT",
body: csv,
headers: { "Content-Type": "text/csv" }
});
});
步骤4:点击"保存",调度器自动生效,可在"调度器日志"中查看执行记录。
对接第三方短信服务(如阿里云短信、腾讯云短信),实现超标时向管理员发送短信通知。
步骤1:准备工作
步骤2:编写短信发送脚本(添加到报警逻辑中):
// 对接阿里云短信API(示例)
functionsendSms(alarmText) {
const accessKeyId = "你的AccessKeyId";
const accessKeySecret = "你的AccessKeySecret";
const phoneNumber = "管理员手机号";
// 阿里云短信API请求参数
const params = {
PhoneNumbers: phoneNumber,
SignName: "你的短信签名",
TemplateCode: "你的短信模板CODE",
TemplateParam: JSON.stringify({ content: alarmText })
};
// 发送请求(使用axios,需先安装:npm install axios)
const axios = require("axios");
axios.post("https://dysmsapi.aliyuncs.com/", null, { params })
.then(response =>console.log("短信发送成功:", response.data))
.catch(error =>console.error("短信发送失败:", error));
}
// 报警时调用
sendSms(alarmText);
步骤3:测试验证:手动模拟参数超标,检查是否收到短信通知。
实战项目完成后,需部署到生产环境并优化性能,确保稳定运行。
步骤1:项目导出 点击顶部导航栏"文件-导出项目",选择导出格式为"FUXA项目文件(.fuxa)",保存到本地
步骤2:生产环境部署
方式1:Docker部署(推荐) 将导出的项目文件导入Docker容器中的FUXA(通过"文件-导入项目")
方式2:服务器部署 在生产服务器安装FUXA,导入项目文件,设置开机自启(Windows可创建快捷方式到启动文件夹,Linux使用systemd)
步骤3:多终端访问 在局域网内,其他设备通过"http://服务器IP:1881"访问监控系统,支持PC、平板、手机(界面自动适配)
⚡ 数据更新频率:根据需求调整,非关键参数(如环境温度)可降低更新频率(如5秒/次),减少服务器压力
💾 数据缓存:使用FUXA内置缓存功能,避免重复请求设备数据
🎨 组件优化:减少不必要的动画效果,复杂界面使用多视图切换,避免单页面组件过多
💿 备份策略:定时备份项目文件和历史数据,避免数据丢失
问题 | 可能原因 | 解决方案 |
|---|---|---|
设备连接失败 | IP地址错误、网络不通、参数不匹配 | 检查IP是否可达、参数是否正确、设备是否上电 |
数据不更新 | 标签地址错误、设备未输出数据 | 检查标签地址是否正确、设备是否正常输出数据 |
脚本执行失败 | 语法错误、依赖包未安装、权限不足 | 检查脚本语法错误、依赖包是否安装、权限是否足够 |
界面卡顿 | 组件过多、动画效果复杂 | 优化组件数量和动画效果,降低数据更新频率 |
本篇通过完整实战案例,覆盖了FUXA从环境搭建、多协议设备对接、可视化界面设计,到高级功能(报警/调度/第三方集成)实现、项目部署的全流程。
🎓 掌握技能:
🚀 后续扩展: 掌握这些技能后,你可根据实际工业场景扩展功能,如:
📖 下一篇预告:我们将解析FUXA高级进阶技巧,如自定义组件开发、脚本模块化、大规模项目管理,帮助你应对更复杂的工业可视化需求。
💡 温馨提示:本教程内容仅供参考,实际应用中请根据具体设备和环境调整配置参数。如有疑问,欢迎在评论区留言交流!
关注我们,获取更多工业自动化与可视化技术干货! 🎯