| 本篇完成什么 以一间设备室为例,建立温湿度、空调状态与命令的点表,说明策略防抖、失联和回读验收。 |
动环画面已经显示温度,自动空调却反复启停,常见原因是测点含义和控制条件没有写清楚:室内温度与空调回风温度混用,开机命令被当成运行状态,或者每次采样越过同一阈值就重复下发。
本文基于 Rapid SCADA v6 的通道、事件和命令链说明设计方法。具体联控编辑器属于本项目选配扩展;下面的状态机和阈值是联调示例,不表示官方平台自带这套控制规则,也不是设备现场整定值。
1. 同一房间可以有多个不同测点
“主控室温度”和“1号空调回风温度”不能因为属于同一房间就合并成一条通道。安装位置、采样周期和物理含义不同,策略应明确使用哪一个。
| 通道示例 | 语义 | 单位/类型 | 谁写入 |
|---|---|---|---|
| 1101 | 设备室环境温度 | ℃,Input | 温湿度设备驱动 |
| 1102 | 设备室相对湿度 | %RH,Input | 温湿度设备驱动 |
| 1103 | 空调运行反馈 | 状态,Input | 空调实际回读 |
| 1104 | 空调故障 | 状态,Input | 空调实际回读 |
| 1105 | 空调回风温度 | ℃,Input | 空调控制器 |
| 1106 | 远方允许 | 状态,Input | 设备模式回读 |
| 1110 | 空调启停命令 | Output/适用的可输出类型 | 统一命令入口 |
对象树用于组织设备室和权限,通道号在同一配置数据库内仍应唯一。甲站与乙站不能因为对象不同就复用同一个 1101。多实例独立数据库的编号方案需要另外定义跨站身份。
先在 Administrator 中核对活动状态、设备号、标签代码、类型、单位及归档;上传后在 Communicator、Server 与表视图比较相同测点。每个值都要能看到质量和更新时间。数据更新时间过旧时,不能仅因数值还在就继续参与策略。
2. 把告警阈值和启停规则分别配置
告警用于记录需要处理的状态,控制用于改变设备状态。两者可以使用相同输入,但触发条件和动作不必相同。高温事件生成,不代表空调已经启动。
以温控逻辑为例,先写清以下参数,再在支持相应能力的服务端逻辑中实现:
| 参数 | 示例 | 作用 |
|---|---|---|
| 启动阈值 | 30 ℃ | 温度连续高于阈值时申请启动 |
| 停止阈值 | 28 ℃ | 形成滞回,避免在 30 ℃ 附近来回切换 |
| 持续时间 | 60 s | 过滤短暂波动,按时间而非采样次数判断 |
| 最小停机时间 | 按设备要求配置 | 避免短时间重复启动 |
| 回读超时 | 由现场测试确定 | 命令接受后等待真实反馈 |
| 输入有效期 | 按采样与通信设计确定 | 拒绝失联后的陈旧数据 |
数字仅用于展示参数关系。最小启停时间、设备保护和故障复位应遵循实际设备要求。
3. 把规则落到当前 ModEnvControl 的真实配置
本项目当前链路是Administrator 通道 → Comm 采集 → Server/ModEnvControl → SendCommand → Comm → 设备;Web 的/env-control编辑绑定和参数,业务配置存入 Redis。ModEnvControl.xml的当前样例只有<ModEnvControl />,不能照旧文档往这个空壳里填一张阈值表,就认为现版 Web 已使用它。
Server 的ModEnvControl.Redis.xml与 Web 的PlgEnvControl.xml要指向同一配置域;首次安装、启用模块按部署流程完成。之后正常的 Web 参数保存由 Server 订阅重载,仍需查看加载日志,不能只看保存提示。以下为当前源码的配置片段,在原配置中合并同名条目,不整份覆盖已有房间和保护规则:
{"bindings":{"inputs":[{"id":"roomTemp","cnlNum":1101,"kind":"Double"},{"id":"autoEn","cnlNum":1107,"kind":"Bool"}],"actuators":[{"id":"ac01","cmdCnlNum":1110,"runFbCnlNum":1103,"group":"roomAc"}],"statusOutputs":[],"rules":[]},"profiles":{"roomAcDemo":{"kind":"pdAc","tempHi":30,"tempLo":28,"enabled":true}},"ruleDefs":{"roomAcTemp":{"engine":"ThresholdActuator","priority":2,"enabled":false,"profile":"roomAcDemo","inputs":{"temp":"roomTemp"},"actuators":["ac01"],"logic":{"mode":"all","offMode":"all","conditions":[{"source":"temp","op":">=","param":"tempHi"}],"offWhen":[{"source":"temp","op":"<=","param":"tempLo"}],"onDelayMin":1,"offDelayMin":1}}}}新增的 1107 是示例“自动投入”输入通道,与设备“远方允许”1106含义不同,不能拿它代替设备模式。所有示例编号先做冲突检查,再在 Administrator 创建并上传;选择器里查不到通道,先修工程和上传,不改 JSON 绕过检查。规则先保持禁用,使用隔离测试工程和模拟执行器验证后再按项目流程投用。
这三个 ID 的对应关系最容易配错:inputs.temp指向绑定 IDroomTemp,绑定再指向1101;actuators指向ac01,它的命令是1110、反馈是1103;profile指向roomAcDemo,不是通道名。priority数字越小优先级越高,温控规则的2不能覆盖优先级0的规则。
若使用当前 Web,管理员在环境调控页设置这些对应项并保存。排障可在浏览器 Network 核对GET /Api/EnvControl/GetParams返回的现有参数、GET /Api/EnvControl/GetStatus的redisEnabled、bindingOk、bindingMessage。状态接口只证明配置侧检查结果,不能证明 Server 已消费配置;继续核对 Server 日志以及模拟命令记录。本文不提供绕过页面直接改 Redis 的脚本。
用明确时间线验证持续条件
在无其他更高优先级规则干预的独立测试中启用此规则,令1107为有效的1。onDelayMin=1表示持续一分钟,不是采样60次:
| 模拟时刻 | 温度 | 预期 |
|---|---|---|
| 00 s | 30.2 | 开始启动延时,不立即开机 |
| 30 s | 29.9 | 回到滞回区,取消待启动延时 |
| 40 s | 30.3 | 重新开始计时 |
| 100 s后的首个控制周期 | 30.3 | 产生启动目标;观察命令是否只发一次 |
| 110 s | 29.0 | 维持已有逻辑状态 |
| 120 s | 27.9 | 开始停止延时 |
| 180 s后的首个控制周期 | 27.9 | 产生停止目标 |
首次求值或重启后的第一次输出可能包含一次初始关闭命令;验收应以记录的状态转换为准。onDelayMin与offDelayMin是连续越限延时,不是压缩机最小停机时间。如果设备要求额外防短周期,需由设备控制器或经过验证的逻辑补齐。
源码能证明什么,还有哪些缺口
本次按ThresholdActuatorRule、EnvControlRuleContext、EnvControlArbiter和EnvControlCommandWriter核对:
- 阈值引擎有滞回区、延时和规则运行状态,仲裁后只保留每个执行器的最终目标。
- 命令出口对成功请求记住上次值,目标未变化时抑制重复发送;失败请求不会因此自动变成成功。还要单独设计失败重试的退避和上限,不能宣称已经具备完整的有限重试。
- 目前启动目标可进入反馈监视,检查
RunFb,超时记录日志并尝试写事件。当前实现不等于已经覆盖停止反馈、陈旧反馈和重启后所有在途请求。 - 数值读取检查
CnlData.IsDefined,没有逐点源时间有效期检查。自动投入绑定缺失时默认参与控制;绑定质量未知也不能被当成“已经可靠退出自动”。远方允许、故障条件和新鲜度必须按实际项目补充验证。
这些差异直接影响上线:配置表能保存,只说明字段和引用基本成立;是否允许下令、设备是否执行以及失联后怎么办,要分别留测试证据。本文的 JSON 已按当前字段及引用关系核对,没有在现场设备上投入此演示规则。
4. 用状态机抑制重复下令
建议把一次控制分成待机 → 已请求 → 等待反馈 → 运行/失败。只有合法状态转换产生新命令,不在每次循环都发送同一指令。
自动模式、远方允许、输入新鲜有效、设备无故障 └─ 高温持续达到条件,且满足最小停机时间 └─ 发一次启动请求,记录请求时间 ├─ 运行反馈变为启动:进入运行态 └─ 超时仍无反馈:记录失败,按明确策略限制重试人工操作和自动策略需要仲裁。退出自动后是否维持当前设备状态,进入就地后是否停止远方写入,服务重启后是否重新下令,都要写入验收规则。不能通过网页刷新或重新打开画面触发设备控制。
输入失联时应进入明确的降级状态,具体保持、退出或转交设备本地控制由项目设计确定。平台画面显示最后一次温度时,应同时标明该数据已经过期。
5. 一条命令至少核对三层结果
| 层次 | 能证明什么 | 不能单独证明什么 |
|---|---|---|
| Web 接受请求 | 登录、权限和请求校验通过 | 设备已经收到 |
| 驱动返回成功 | 协议动作按驱动定义完成 | 压缩机或风机已经实际运行 |
| 运行反馈达到目标 | 对应设备回读满足判据 | 所有工艺条件均已满足 |
操作记录应关联通道、操作人或策略来源、请求值、时间和反馈结果。状态通道来自设备回读,不能在按下“开机”后直接把反馈强行写成 1,让画面看起来已经成功。
查看权限与控制权限分别验证。没有控制权限的账号,即使构造同样的请求也不应下令。固定设备保护和专用联锁继续由相应控制系统承担,动环页面负责展示与授权操作入口。
原系列的动环页面示意。本文的状态机、时限和失败处理需按实际服务端能力配置或实现,不能仅更换画面上的通道号。
6. 用一段温度序列验收
测试环境可输入29.8 → 30.2 → 29.9 → 30.3,先证明短波动不会反复启停;随后让高温连续保持到示例持续时间,再检查只产生一次启动请求。模拟设备未启动,验证超时记录,而不是把画面自动变为运行。
还应覆盖:
| 场景 | 检查结果 |
|---|---|
| 温度无效或长时间不更新 | 策略按设计退出或降级,界面提示过期 |
| 人工切到就地 | 自动任务不再持续覆盖就地操作 |
| 运行反馈与命令不一致 | 产生可追溯的超时/拒绝记录 |
| 重启服务 | 模式、计时基准和未完成请求按设计恢复,无重复下令 |
| 切换另一房间 | 状态、故障、命令都来自同一目标设备 |
| 通知或视频网关失败 | 告警仍可在事件归档中查询 |
告警视频映射目前提供实时联动,事件时刻录像需另行验证,详见 告警视频联动实战。
排障时先确定“温度是哪个位置的温度”,再依次查质量、模式、持续条件、命令入口和真实回读。单纯缩短轮询周期,解决不了错误测点和重复发令问题。
官网:Rapid SCADA 中文站