操作手册 — ActDenox 智能脱硝控制系统
目录
- 快速开始
- Modbus 通讯管理
- 内部变量监控
- 内部变量完整参考
- 字段映射
- 数据保存与查询
- 历史趋势
- PID 控制
- 仪表盘
- 数据过滤器
- 仪表状态补偿
- 报警阈值配置
- 用户管理与授权
- 系统工具与备份
- 配置文件与数据文件参考
- 常见问题
- 开发与打包清单
一、快速开始
1.1 启动与登录
- 双击运行程序,首页显示系统状态和功能入口
- 首次运行自动创建三个账号:
| 账号 | 密码 | 角色 | 权限范围 |
|---|---|---|---|
| admin | 请联系系统管理员 | 管理员 | 全部功能 |
| operator | 请联系系统管理员 | 操作员 | 日常操作(无用户管理) |
| viewer | 请联系系统管理员 | 观察者 | 仅查看 |
⚠️ 安全须知:默认密码已在安装前通过工具预置为加密哈希,明文密码不出现在任何程序文件中。系统上线后,管理员应立即登录并修改所有默认账号的密码,确保生产环境安全。
- 自动登录:用户管理页面可开启 " 自动登录 “,电脑重启后自动以操作员身份运行,无需人工干预
1.2 基本工作流
- Modbus 通讯管理 — 连接设备(主机模式)或对外提供寄存器服务(从机模式),配置解析规则
- 字段映射 — 将解析字段映射到数据库列名
- 数据保存与查询 — 启动自动保存,查询历史数据,导出 Excel
- (可选)PID 控制 — 配置控制回路,自动计算输出值
- (可选)报警配置 — 配置看门狗心跳和阈值报警规则
- (可选)仪表盘 — 自定义数据看板,拖拽组件
二、Modbus 通讯管理
2.1 主机模式 — 读取设备数据
RTU 连接
- 选择模式:主机 (Master)
- 选择协议:Modbus RTU (串口)
- 填入串口号(如 COM1)、波特率、校验位、停止位
- 点击 连接
- 读写操作:设置地址、数量、数据类型,点击读取或写入
TCP 连接
- 选择协议:Modbus TCP (以太网)
- 填入 IP 地址和端口(默认 502)
- 点击 连接
后台轮询
- 点击 启动后台轮询,程序持续读取并更新内部变量
- 间隔建议 1000ms
- 页面切换后继续运行
解析规则表
| 列 | 说明 |
|---|---|
| 起始地址 | 从机模式下可见,主机模式下隐藏 |
| 字段名 | 内部变量名,需一字不差地匹配 |
| 类型 | uint16 / int16 / float32 / float64 |
| 字节序 | BE(大端,标准)/ LE(小端) |
| 字序 | ABCD(标准)/ BADC / CDAB / DCBA |
| 备注 | 自由文本 |
| 当前值 | 实时显示解析结果,绿色=正常,红色=异常 |
| 操作 | ↑↓ 移动行 / 删除 |
2.2 从机模式 — 对外提供寄存器服务
程序作为 Modbus 从站,DCS/PLC 可通过标准 Modbus 协议读写本机寄存器。
- 选择模式:从机 (Slave)
- 配置端口(如 COM2)、波特率、站号
- 在解析规则表中填好 " 起始地址 " 列
- 点击 启动从机
数据流向:
|
|
- DCS 写入的 CEMS 数据:在解析规则表中有地址的字段自动接收
- PID 输出/报警状态:在解析规则表中有地址的字段自动暴露给 DCS
2.3 通讯诊断
| 指标 | 说明 |
|---|---|
| 总请求数 | 发送/接收的总帧数 |
| 成功/失败 | 主机读写成功/失败次数 |
| 成功率 | 成功次数 / 总次数 |
| 超时次数 | 操作超时计数 |
| 连接断开 | 串口异常断开次数 |
| CRC/校验失败 | 帧校验错误次数 |
| 异常响应 | Modbus 异常码响应次数 |
三、内部变量监控
3.1 变量分类与筛选
页面顶部筛选栏:全部 | Modbus | PID | 手动 | 计算 | 系统
- Modbus:解析规则表中的字段,数据来自 Modbus 读取或从机接收
- PID:PID 控制回路产生的变量(P/I/D 分量、输出值、健康指标)
- 手动:用户手动添加的变量
- 计算:用户自定义表达式计算出的变量
- 系统:程序运行状态指标(
_sys_前缀)
3.2 手动添加变量
填写变量名和初始值 → 点击添加变量。变量值可点击直接编辑。
手动创建的变量标记为可写变量,可在仪表盘 " 可编辑数值 " 组件中选择,点击直接修改值。
3.3 计算变量
输入表达式,引用其他变量名进行数学计算。示例:
入口NOX * 0.8 + 出口NOX * 0.2(加权平均)(PID-1_output + 50) / 2(映射到 0-100 范围)出口NOX / 入口NOX * 100(转化率百分比)
支持运算符:+ - * / ( )。变量不存在时静默跳过不报错。
3.4 搜索
筛选栏右侧搜索框,输入关键字即时过滤。
四、内部变量完整参考
4.1 系统运行状态(_sys_ 前缀,只读)
| 变量名 | 类型 | 单位 | 说明 |
|---|---|---|---|
_sys_uptime |
数值 | 秒 | 程序已运行时间 |
_sys_memory_rss_mb |
数值 | MB | 进程物理内存占用 |
_sys_memory_heap_mb |
数值 | MB | JS 堆内存占用 |
_sys_memory_total_mb |
数值 | MB | JS 堆内存总量 |
_sys_modbus_connected |
0/1 | — | 主机或从机任一在线即为 1 |
_sys_modbus_slave_running |
0/1 | — | 从机是否运行中 |
_sys_modbus_requests |
数值 | 次 | 主机总请求数 |
_sys_modbus_success |
数值 | 次 | 主机成功次数 |
_sys_modbus_errors |
数值 | 次 | 主机失败次数 |
_sys_modbus_rate |
数值 | % | 主机成功率 |
_sys_modbus_consecutive_errors |
数值 | 次 | 连续错误数(≥3 触发重连) |
_sys_modbus_healthy |
0/1 | — | 通讯健康状态 |
_sys_modbus_refresh_failures |
数值 | 次 | 后台轮询连续失败次数 |
_sys_background_active |
0/1 | — | 后台轮询是否运行中 |
_sys_pid_total |
数值 | 个 | PID 实例总数 |
_sys_pid_active |
数值 | 个 | 活跃 PID 实例数 |
_sys_alarm_enabled |
0/1 | — | 报警引擎是否启用 |
_sys_alarm_active_rules |
数值 | 条 | 当前触发的报警规则数 |
_sys_auto_save_active |
0/1 | — | 自动保存是否运行中 |
_sys_db_datastore_mb |
数值 | MB | 主数据库文件大小 |
_sys_db_write_failures |
数值 | 次 | 连续数据库写入失败次数 |
_sys_db_write_healthy |
0/1 | — | 数据库写入健康(0=不健康) |
_sys_db_retention_days |
数值 | 天 | 数据保留天数 |
_sys_db_last_cleanup_count |
数值 | 行 | 上次清理删除的数据行数 |
_sys_variable_count |
数值 | 个 | 内部变量总数(不含系统变量) |
_sys_variable_limit_reached |
0/1 | — | 变量数是否达上限(500) |
_sys_compensation_active_count |
数值 | 条 | 当前活跃的补偿规则数 |
4.2 PID 控制变量(以 PID-1 为例,多实例替换名称)
| 变量名 | 类型 | 方向 | 说明 |
|---|---|---|---|
PID-1_P |
数值 | 输出 | 比例项实时值 |
PID-1_I |
数值 | 输出 | 积分项实时值 |
PID-1_D |
数值 | 输出 | 微分项实时值 |
PID-1_output |
数值 | 输出 | PID 修正量输出值 |
PID-1_abs_error |
数值 | 输出 | 当前绝对误差 |SP - PV| |
PID-1_divergence_seconds |
数值 | 输出 | 偏离超阈值已持续秒数(0=正常) |
PID-1_saturation |
0/1/2 | 输出 | 输出饱和:0=正常, 1=上限饱和, 2=下限饱和 |
PID-1_reset_trigger |
0/1 | 输入 | DCS 写 1 → PID 自动复位(清零积分 + 历史),复位后自动归 0 |
PID-1_integralFreeze |
0/1 | 输入 | 写 1 冻结积分累积,写 0 恢复 |
PID-1_integralFreeze(补偿) |
0/1 | 输出 | 补偿引擎自动控制的积分冻结标志 |
PID-1_schedFactor |
数值 | 输出 | 增益调度缩放因子(1=基准工况) |
PID-1_FF |
数值 | 输出 | 前馈控制分量实时值 |
PID-1_smithPV |
数值 | 输出 | 史密斯预估器预测 PV 值(关闭预估器时 = 实际 PV) |
<输出目标> |
数值 | 输出 | PID 最终输出值(基准 + PID 修正),等于配置的 outputTarget |
<输出目标>_SP |
数值 | 输出 | 当前设定值 |
4.3 报警变量
| 变量名 | 类型 | 说明 |
|---|---|---|
_alarm_heartbeat |
数值 | 看门狗心跳计数(0-65535 循环递增) |
<规则名>_alarm |
0/1 | 该报警规则当前是否触发(1=报警中, 0=正常) |
_alarm_active_<规则名> |
字符串 | 报警级别(warning/alarm/critical),内部使用 |
4.4 补偿变量
| 变量名 | 说明 |
|---|---|
<字段名>(补偿) |
补偿引擎处理后的值。原始值保留在 <字段名> 不变 |
<字段名>(过滤) |
数据过滤器处理后的值 |
<规则名>_compensating |
该补偿规则是否正在执行中(1=补偿中, 0=正常) |
五、字段映射
- 将内部变量名(sourceName)映射到数据库列名(dbField)
- 保存数据时,系统从内部变量读取值,写入数据库对应列
- 点击 从规则和 PID 加载 自动填充所有已知字段
- 可手动添加行
- 数据库列管理:查看所有列、删除不需要的列
六、数据保存与查询
6.1 自动保存
- 设置保存间隔(秒),点击 启动自动保存
- 程序定时将勾选的字段值写入 SQLite 数据库
- 数据文件:
data/datastore.sqlite
6.2 保存变量选择
- 点击 刷新数据库字段列表 加载当前映射
- 勾选需要保存的字段,取消勾选的字段不会写入数据库
- 全选 / 取消全选 快捷操作
6.3 数据查询
- 聚合模式:原始数据 / 分钟均值 / 小时均值 / 天均值
- 时间范围:预设快捷按钮(最近 1 小时/1 天/7 天/30 天)或手动输入起止时间
- 显示条数:仅影响表格展示行数
- 查询 按钮执行查询
- 导出 Excel:导出选中时间范围内全部数据(不受显示条数限制),上限 50000 条
6.4 数据保留策略
- 保留天数默认 180 天(6 个月),可修改
- 每天凌晨 3:00 自动清理超过保留期的旧数据
- 页面显示上次清理时间和删除行数
七、历史趋势
- 选择聚合模式和时间范围 → 点击 查询
- 字段选择面板:勾选要显示的字段(只有已选保存的字段才有历史数据)
- Y 轴分配:1-3 个独立轴,支持手动设量程
- 底部滑块缩放时间范围
- 鼠标悬停查看具体数值
- 图例点击切换曲线显隐
八、PID 控制
8.1 参数说明
| 参数 | 说明 | 建议 |
|---|---|---|
| 控制目标 (PV) | 要控制的内部变量名 | 通常是 Modbus 解析的 CEMS 字段 |
| 设定值 (SP) | 期望达到的目标值 | 如排放限值 50 mg/m³ |
| Kp | 比例系数:误差越大输出越大 | 先调这个 |
| Ki | 积分系数:消除稳态误差 | 太大易振荡,先设小值 |
| Kd | 微分系数:抑制超调 | 对噪声敏感,建议先设 0 |
| 修正下限/上限 | PID 修正量的限幅 | 防止过度调节 |
| 基准频率 | PID 修正前的基准输出值 | 喷氨泵正常工作频率 |
| 输出下限/上限 | 最终输出值的安全范围 | 保护执行机构 |
| 采样间隔 | 每次 PID 计算的间隔 | 建议 500-2000ms |
| 偏差带 (±) | 图表上 SP ± X 画两条虚线 | 0=不显示,视觉辅助 |
| 偏离阈值 (%) | SP × X% 超过后开始计时偏离 | 默认 10%,决定 " 偏差正常 " 判断 |
| PV 滤波 (α) | 低通滤波系数,0=强滤波, 1=无滤波 | 测量噪声大时设为 0.3-0.5 |
| 死区 | |error| < 此值时不做调节 | 防止频繁微小调整 |
| 输出变化率限制 | 每秒最大变化量,0=不限 | 防止执行机构剧烈动作 |
| 输出寄存器地址 | PID 计算结果写入的 Modbus 寄存器 | 主机模式下才生效 |
| 字节序/字序 | 输出寄存器的字节/字排列 | float32 时需与设备一致 |
| 反向作用 | 勾选后 error = PV − SP(脱硝等负增益过程) | 脱硝推荐开启 |
| 前馈源变量 | 可测扰动变量名(如入口 NOX),按系数直接叠加到输出 | 提升对入口波动的响应速度 |
| 前馈系数/偏置 | FF = 源变量 × 系数 + 偏置 | |
| 增益调度 | 根据工况变量动态缩放 P/I/D 系数 | 高负荷自动增强,低负荷减弱 |
| 调度源变量/基准值/敏感度 | Factor = 1 + (当前值 − 基准值) × 敏感度 |
8.2 史密斯预估器(Smith Predictor)
脱硝系统最大的物理特性是纯滞后——从喷氨泵动作到出口 CEMS 读数变化,存在 3~15 分钟的物理延迟。传统 PID 面对超大滞后极易过冲或振荡。
史密斯预估器通过建立一阶 + 纯滞后 (FOPDT) 过程模型,预测 " 如果没有滞后,PV 现在应该是什么值 “,将预测值送入 PID 计算,使控制器提前响应。
| 参数 | 说明 | 建议 |
|---|---|---|
| 启用预估器 | 开启后 PID 使用 Smith 预测 PV 进行控制 | 先整定好 Kp/Ki 再开启 |
| 滞后时间 (s) | 纯滞后 τ,从喷氨到 CEMS 读数的延迟 | 典型范围 180 |
| 时间常数 (s) | 一阶惯性 T,过程响应快慢 | T 越大响应越慢,需现场测定 |
| 过程增益 K | ΔPV / Δ输出(如 +5Hz → -10mg/m³ → K=-2) | 脱硝通常为负值 |
启用后效果:
- 趋势图新增紫色「预估 PV」曲线,可对比实际 PV 观察预估准确性
- 运行控制区新增「史密斯预估 PV」行,显示预测值及与 SP 的偏差
- 内部变量
PID-1_smithPV记录预测值,可存入数据库用于离线分析 - 关闭预估器时预估 PV = 实际 PV,两者一致
8.3 健康指示灯与 Smith 显示
PID 运行控制区显示两个实时状态:
| 指示灯 | 数据源 | 绿色 (正常) | 红色/橙色 (异常) |
|---|---|---|---|
| 输出饱和 | PID-1_saturation | 输出正常 | 上限饱和(红)/ 下限饱和(橙) |
| 偏差状态 | PID-1_divergence_seconds | 偏差正常 | 持续偏离 + 时长 |
8.4 远程复位
DCS 通过 Modbus 从机写入 PID-1_reset_trigger = 1 → PID 自动清零(积分归零、历史清空)→ 自动写回 0。只响应 0→1 上升沿,DCS 持续保持 1 不会反复触发。
8.5 手动/自动无扰动切换(Bumpless Transfer)
PID 控制回路支持手动模式与自动模式之间的平滑切换。切换瞬间,系统内置的无扰动跟踪算法自动介入,确保控制输出信号绝对不发生任何突跳或骤变。
适用场景:
- 调试阶段:操作员临时切入手动模式,手动指定喷氨泵频率或阀门开度
- 设备检修:执行机构维护期间,需绕过 PID 由人工直接控制
- 紧急工况:传感器数据异常时,切手动防止 PID 误动作
切换行为:
| 切换方向 | 系统内部动作 | 用户感知 |
|---|---|---|
| 自动 → 手动 | 反算积分项,使手动初始值 = PID 当前输出(输出无跳变) | 模式切换瞬间,阀门/泵频率保持平滑,无冲击 |
| 手动模式持续中 | PID 积分项冻结锁定(杜绝积分饱和累积) | 手动值由操作员自由调节,不受 PID 计算影响 |
| 手动 → 自动 | 积分项从对齐值平滑接管,PID 从当前状态开始闭环调节 | 恢复自动后,阀门/泵频率无缝过渡,不会因积分复位而骤降或飙升 |
工业保护意义:传统 PID 在手动切回自动时,常因积分未对齐导致输出突跳,轻则造成工艺波动,重则砸坏调节阀或计量泵等精密执行机构。本系统的无扰动切换从根本上消除了这一风险。
操作方式:
- 在 PID 控制页面,找到 " 手动模式 " 开关
- 开启手动模式 → 输入目标值(如喷氨泵频率 30 Hz)
- 完成手动操作后 → 关闭手动模式 → PID 自动平滑接管
手动模式指示:PID 运行控制区状态行显示 手动模式 (值=XX),健康指示灯持续更新 PV(过程值),确保操作员始终掌握当前工况。
九、仪表盘
9.1 组件类型
| 组件 | 说明 | 数据源 |
|---|---|---|
| 数值卡片 | 显示一个或多个变量值,支持显示名称 | 实时 / 聚合(分钟/小时/天均值) |
| 状态指示灯 | 根据阈值显示正常/报警状态,支持显示名称 | 实时值 + 自定义条件 |
| 可编辑数值 | 多变量显示,点击直接修改值,支持显示名称 | 仅可写变量(手动变量/PID 可写参数) |
| 折线图/柱状图 | 历史趋势曲线/柱状图,支持显示名称 | 数据库聚合查询 |
| 环形仪表盘 | 单值仪表盘显示 | 实时 / 聚合 |
| 进度条 | 百分比进度条,支持显示名称 | 实时值 + 独立量程 |
| 图片 | 显示网络图片 | URL |
9.2 操作
- 添加组件:点击工具栏「+ 添加组件」
- 编辑:卡片右上角 ✎ 按钮
- 删除:卡片右上角 × 按钮
- 尺寸切换:点击尺寸标签(小/中/大/特大),四档循环
- 拖拽排序:拖拽卡片到目标位置交换
- 保存/加载布局:工具栏按钮,布局存入备份
9.3 显示名称
添加数据源时,每个变量行右侧有一个显示名称输入框(可选项),用于将英文/编码变量名翻译成中文名称。
| 组件 | 显示名称支持 |
|---|---|
| 数值卡片 | ✅ |
| 可编辑数值 | ✅ |
| 状态指示灯 | ✅(显示名称在数据源下拉框下方) |
| 折线图/柱状图 | ✅ |
| 进度条 | ✅ |
填写了显示名称后,组件中
w-data-name显示自定义名称;未填写时自动回退到原始变量名。
示例:变量 PID-1_SP → 显示名称 " 标干 NOX 目标值 " → 卡片上显示 " 标干 NOX 目标值: 45.00 mg/m³”
9.4 聚合模式
数值卡片和环形仪表盘支持查询数据库聚合数据(分钟均值/小时均值/天均值),显示最近一个时段的值。图表支持多时段折线。
9.5 可编辑数值(多数据源 + 可写变量过滤)
可编辑数值组件允许添加多个可写变量,点击数值直接修改,常用于 DCS 目标值下发等场景。
数据源过滤:添加数据源时,下拉框只显示可写变量:
- 手动创建的内部变量(变量监控页面手动添加)
- PID 可写参数(
PID-1_SP、PID-1_reset_trigger、PID-1_integralFreeze等) - Modbus 解析字段、计算变量、系统变量等只读变量不会出现在选项中
显示名称:每个数据源行可单独设置显示名称(如将 PID-1_SP 显示为 " 标干 NOX 目标值 “),未设置时显示原始变量名。
修改数值:点击组件中的数值即可编辑,输入后按回车或点击其他区域保存。修改通过 setInternalVariable 写入内部变量,PID 控制回路会立即响应(如修改了 _SP 设定值)。
十、数据过滤器
按需添加过滤规则,只显示已配置的规则。未配置的字段直接透传。
过滤器类型:
| 类型 | 参数 | 说明 |
|---|---|---|
| 范围限制 | min, max, 越界动作 | 钳位到边界或拒绝 |
| 变化率限制 | maxDelta | 相邻值变化不超过设定值 |
| 移动平均 | windowSize | 最近 N 次值的算数平均 |
| 尖峰抑制 | threshold | 偏差超过阈值沿用上次有效值 |
过滤结果写入伴生变量 字段名(过滤),原始值保留不变。
十一、仪表状态补偿
11.1 补偿规则
每条规则包含:
- 进入条件(IF):满足时进入补偿状态
- 退出条件(可选):满足时退出补偿状态(无退出条件则为跟随模式)
11.2 补偿动作
| 动作 | 说明 | 示例 |
|---|---|---|
| 保持 (hold) | 冻结为进入补偿前的值 | 仪表吹扫时保持最后好值 |
| 偏移 (offset) | 当前值 ± 偏移量 | NOX + 10 |
| 缩放 (scale) | 当前值 × 系数 | 流量 × 1.2 |
| 设值 (set) | 设为固定值 | 设为 0 |
| 取变量值 (setVar) | 取另一变量的当前值 | 用出口 NOX 替换入口 NOX |
设值支持两种模式:固定数值 / 取变量值(点击输入框旁的 " 取变量 " 切换)。
11.3 条件支持变量比较
进入/退出条件除了比较固定阈值,还可以比较两个变量:
IF 出口NOX > 入口NOX— 两个变量实时比较IF _sys_modbus_connected == 0— 系统状态触发补偿
条件行阈值输入框旁有 " 取变量 " 切换按钮。
11.4 补偿状态变量
每条启用的补偿规则实时产生 <规则名>_compensating(1=补偿中, 0=正常)和 _sys_compensation_active_count(活跃规则总数),可在仪表盘显示。
十二、报警阈值配置
12.1 总开关与看门狗
- 启用报警:开启整个报警引擎
- 检查间隔:检查频率(ms),默认 1000
- 看门狗心跳:定时向指定寄存器写入递增计数。DCS 读到计数不变化 = 程序通讯断开
12.2 报警规则
每个规则配置:
- 规则名:唯一标识(内部变量
<规则名>_alarm由此生成) - 级别:⚠ 预警 / 🚨 报警 / 🔥 严重
- 条件组合:多条件 AND(全部满足)/ OR(任一满足)
- 延时:条件持续满足 N 秒后才触发(0 = 立即)
- 滞后:报警触发后需值回落阈值 - 死区才解除
- 通知寄存器:报警时写入报警值,恢复时写入正常值
12.3 DCS 如何获取报警状态
将以下变量加入从机解析规则表(填写地址):
| 变量名 | 说明 |
|---|---|
_alarm_heartbeat |
看门狗计数,DCS 读这个检查程序是否存活 |
<规则名>_alarm |
该规则报警状态(1=报警中, 0=正常) |
12.4 报警延时进度
延时触发中,状态面板实时显示倒计时(剩余 N 秒),到 0 自动触发报警。
十三、用户管理与授权
13.1 用户管理(管理员专属)
- 添加/删除用户,修改密码
- 三种角色:管理员(全部权限)/ 操作员(日常操作)/ 观察者(只读)
13.2 权限矩阵
为每个角色勾选可访问的页面。管理员始终拥有全部权限。修改后立即生效。
13.3 自动登录(无人值守)
勾选 " 启用自动登录 " 后,电脑重启/程序自启时自动以操作员身份运行,无需人工登录。确保 PID/报警在无人时持续工作。
13.4 会话超时与降级
会话超时时间可设置(默认 30 分钟)。无操作超时后不退出,而是自动降级为观察者角色。管理员操作后超时不会被完全锁死,程序仍在运行。
13.5 切换账号
首页顶栏和用户管理页面均有「切换账号」按钮,无需先退出即可换账号。
十四、系统工具
系统工具页面(导航栏「🔧 工具」)整合了所有系统级配置,admin 和 operator 角色可访问。
14.1 开机自启
控制程序是否随系统启动自动运行。开关即时生效,写入系统注册表。
14.2 配置备份与恢复
- 文件勾选列表:列出所有可备份的配置文件(含中文名称),可全选/取消全选
- 导出选中配置:仅导出勾选的配置文件 → 弹出保存对话框,默认路径为用户 " 文档 " 文件夹
- 导出全部配置:一键导出所有配置文件
- 导入配置备份:从之前导出的 JSON 文件恢复。支持选择性恢复(勾选要恢复的项)
14.3 数据备份与数据库信息
- 立即备份数据文件:手动触发一次文件级备份到
data/backups/当天日期/ - 数据库文件大小:实时显示 datastore.sqlite / auth.db / alarm_history.sqlite / audit_log.sqlite / error.log 的大小
- 数据保留天数:请在「数据保存与查询」页面中设置(每天凌晨 3:00 自动执行清理和备份)
十五、配置文件与数据文件参考
15.1 文件清单
所有配置和数据存储在 data/ 目录下:
| 文件 | 内容 | 格式 |
|---|---|---|
modbus.json |
Modbus 连接参数 | JSON |
autosave.json |
自动保存配置 | JSON |
pid.json |
PID 实例配置 | JSON |
alarm.json |
报警规则 + 看门狗 | JSON |
save-filter.json |
保存变量选择 | JSON |
manual-variables.json |
手动添加的变量 | JSON |
computed-variables.json |
计算变量表达式 | JSON |
data-filter.json |
数据过滤规则 | JSON |
instrument-compensation.json |
补偿规则 | JSON |
dashboard-layout.json |
仪表盘布局 | JSON |
mapping.json |
字段映射表 | JSON |
pages.json |
页面权限配置 | JSON |
modbus-slave-config.json |
从机串口参数 | JSON |
modbus-parse-rules.json |
解析规则(根目录) | JSON |
datastore.sqlite |
CEMS 历史数据 | SQLite |
auth.db |
用户/权限/授权/自登录 | SQLite |
alarm_history.sqlite |
报警历史记录 | SQLite |
audit_log.sqlite |
操作审计日志 | SQLite |
error.log |
错误日志(统一文件) | 文本 |
15.2 更新程序是否丢失数据
不会。安装新版本时,安装目录下的程序文件会更新,但 data/ 目录不会被覆盖。所有配置、数据库、布局全部保留。
15.3 查看 SQLite 数据库
推荐使用 DB Browser for SQLite(免费开源),直接拖 .sqlite 文件打开即可浏览数据。
十六、常见问题
Q: 连接设备后读取失败?
检查端口、波特率、校验位、停止位是否与设备匹配。查看报文区域的 hex 帧。
Q: Modbus 通信偶发中断后需要手动重启软件吗?
不需要。 软件内建了完善的通信鲁棒性机制:
- 智能断线重连:系统检测到连续 3 次读取失败后,自动触发强制重连流程(先断开 → 等待 500ms → 重新握手)。链路物理恢复后(如松动网线重新插紧、串口干扰消失),数据采集在 1-2 秒内自动恢复,运维人员无需任何操作。
- 重连冷却期保护(10 秒锁频防抖):当通信链路处于持续不稳定的 " 抖动 " 状态时(如接触不良导致频繁通断),系统会自动启用 10 秒冷却期。在冷却期内不会再次发起重连尝试,防止高频重复连接导致 Modbus 芯片或操作系统串口驱动进入假死状态。冷却期过后若链路仍异常,系统会再尝试一次重连。
- 连接健康心跳:后台每 30 秒独立检测一次连接状态和连续错误计数,一旦发现链路断开或连续异常,自动触发上述重连机制。心跳与主轮询线程互不干扰。
- 休眠唤醒自动恢复:电脑从休眠/息屏状态唤醒后,系统会先彻底断开所有失效的串口/TCP 句柄,等待 1.5 秒让操作系统驱动层就绪,然后重新连接并恢复数据采集。全程自动,无需人工介入。
现场运维提示:如果通信状态栏长时间显示 " 连接失败 " 且一直未恢复,请检查物理链路(串口线是否脱落、RS-485 终端电阻是否匹配、以太网 IP 是否可达)——软件层面的重连逻辑已经全部自动运行。
Q: 从机启动没反应? 确保串口未被其他程序占用。COM 口必须存在且配置正确。
Q: 从机 Modbus Poll 超时? 检查 Poll 的站号是否与从机 " 本机站号 " 一致。检查 COM 口和波特率。
Q: 数据查询没有结果? 确认自动保存已启动、保存变量已勾选、字段映射已配置。注意:只有勾选了 " 保存变量选择 " 的字段才有历史数据。
Q: PID 不工作? 确认控制目标字段在内部变量中有值(需要 Modbus 读取或从机接收获取 PV)。
Q: PID 页面显示 " 仅更新内部变量 “? 这表示 Modbus 主机未连接。如果只用从机模式,这是正常的——PID 计算结果通过从机暴露给 DCS 读取,不需要主机写寄存器。
Q: 报警不触发? 确认报警总开关已启用、规则已添加并勾选启用、监控字段在内部变量中已有值。
Q: 变量页面看不到某个字段?
使用搜索框或分类筛选。系统变量以 _sys_ 开头,PID 变量以实例名开头。
Q: 补偿规则中 " 取变量 " 怎么用? 条件行阈值输入框旁点 " 取变量 “,切换为变量选择。可以实现 " 出口 NOX > 入口 NOX” 这样的动态比较。
Q: 如何保障系统安全?
- 授权保护:软件采用 AES-256-CBC 加密 + 硬件指纹绑定的授权机制,授权码与机器一对一绑定,防止非法复制
- 密码安全:所有用户密码使用 PBKDF2-SHA512(100,000 次迭代)哈希存储,明文密码不出现在任何程序文件或数据库中
- 首次登录提醒:系统上线后,管理员应立即修改所有默认账号的密码,确保生产环境账号安全
- 进程隔离:渲染进程(界面层)与主进程(硬件通信层)严格隔离,网页前端无法直接访问 Node.js 或串口资源
- 操作审计:所有关键操作(登录、修改配置、启停 PID、导入配置等)均记录到审计日志数据库
Q: 配置备份文件默认保存在哪里? 导出配置备份时,默认保存路径为当前用户的 " 文档 " 文件夹(而非程序安装目录),避免因程序更新或卸载导致备份文件丢失。
十七、开发与打包清单
17.1 技术栈
| 层 | 技术 |
|---|---|
| 桌面框架 | Electron |
| 前端 | HTML/CSS/JS + ECharts |
| 后端 | Node.js (CommonJS) |
| 数据库 | SQLite (sqlite3) |
| Modbus | modbus-serial |
| Excel | xlsx (SheetJS) |
17.2 项目结构
|
|
17.3 打包命令
|
|
17.4 构建产物
执行 npm run build 后在 dist/ 目录生成:
ActDenox 智能脱硝控制系统 Setup x.x.x.exe— NSIS 安装包
安装程序后,数据目录位于:
%APPDATA%/ActDenox 智能脱硝控制系统/data/
17.5 代码保护
打包前自动使用 javascript-obfuscator 混淆所有核心 JS 文件。
- 原始源码:开发目录,正常可读
- 构建产物:
dist/中安装包内的 JS 文件已混淆为不可读形式 - 页面文件(HTML/CSS)不混淆
- 混淆仅影响打包产物,不影响开发源码
- 授权码生成工具(
generateLicense.js)为开发者独立工具,不打包到产品中
17.6 首次安装初始化流程
- 安装程序复制文件到目标目录
data/目录首次创建,所有 JSON 配置由config.load()自动生成默认值auth.db首次创建,自动建立 admin / operator / viewer 三个账号- 解析规则文件
modbus-parse-rules.json包含一条默认示例规则 - 程序启动 → 自动登录(如启用)→ 恢复上次的运行状态