完整采集项目与交付验收
本例把温度采集、华氏温度计算、MQTT 上传、历史、报警及风机控制放在同一工程中完成。各阶段沿用相同设备和变量,便于检查数据是否从现场一路到达接收系统并完成控制反馈。
先按采集第一个点理解通道、设备和变量。下列温度、线圈地址和值用于测试,连接实际设备时按现场点表替换,并先确认控制对象允许联调。
变量与计算
1. 建立过程变量与执行变量
进入“开发配置 → 采集配置”,创建 Modbus 通道和设备,设置正确的远程地址、站号及执行周期。示例设备名称使用 Demo_Modbus_Device。
| 变量 | 示例配置 |
|---|---|
Demo_Modbus_Value | 保持寄存器 40001,Int16,标量数组长度 0,源值 1234。用于确认基础通信。 |
Temperature | 保持寄存器 40011,Int16,标量数组长度 0,源值 75。单位 ℃。 |
Fan | 线圈 00001,Boolean,标量数组长度 0,初始源状态 false。测试控制时允许读写并开启 RPC 写入。 |
先用源端或独立客户端核对这三个点,再确认网关当前值、原始值、质量及新的采集时间。温度值与风机状态都应来自实际协议读取。
2. 计算华氏温度
- 到“脚本管理”创建内存变量计算脚本,通过
Tag引用同一设备的Temperature,按摄氏温度乘9、除5、加32计算并返回结果。具体编写方式见内存变量脚本。 - 编译并保存,确认脚本可在读取转换链中选择。
- 在“内存计算”新增只读的
Temperature_F,保持Object类型,选择刚保存的计算脚本。 - 触发方式选择变化更新,单位填写
℉,保存后等待结果。
脚本编辑器中填写方法体,先转成浮点数,避免整数除法丢失小数:
// 按源温度计算华氏值,使用浮点运算保留换算后的小数。
var temperature = Convert.ToDouble(Tag("Demo_Modbus_Device", "Temperature").Value);
return Math.Round(temperature * 9.0 / 5.0 + 32.0, 1);
| 源端温度 | 应得到的计算结果 |
|---|---|
75 ℃ | 167 ℉ |
76 ℃ | 168.8 ℉ |
85 ℃ | 185 ℉ |
65 ℃ | 149 ℉ |
修改单位不会执行换算。应分别改变源温度并检查计算结果、质量和时间,不能只确认脚本已经编译。
上传、存储与报警
3. 上传同一批变量
在“数据转发”创建手动范围组,加入 Temperature、Fan 和 Temperature_F,保存后添加 MQTT 客户端目标。
- 配置实际 Broker 地址、唯一客户端 ID 和测试 Topic。
- 先保持默认 JSON,启用组和目标。
- 在独立订阅端核对三个变量的设备、名称和值。
- 将源温度改为
85,确认收到85和计算结果185的新消息,再恢复75。
目标在线、手工发布成功都不能代替组内变量实际上传。字段格式需要定制时,再按上传模板调整。
4. 保存历史与曲线
在包含上述变量的转发范围下添加历史数据目标,使用独立数据库或独立表名,设置保留周期和时区。
- 按
75 → 85 → 65 → 75改变真实源温度,每次等待采集和入库。 - 打开“数据与告警 → 数据查询 → 历史数据”,选择本工程的
组名/目标名。 - 只选择
Temperature,查询覆盖整个变化过程的时间窗口。 - 对照表格、原始趋势和数据库记录,核对变化顺序与采样时间。
图表应使用覆盖整个时间窗口的独立序列查询。选择“原始点”后,核对实际返回的聚合方式、点数和截断标志;表格当前页只包含分页记录,不能把当前页当作完整曲线。
本例数值历史的时区偏移为 +08:00,SQLite 物理字段保存东八区时间文本,类型化历史查询返回 UTC 时间。直接查数据库时,先按该偏移换算为同一时刻,再比较变量 ID、采集时间及历史创建时间。报警历史目标可以使用不同偏移,本例使用 +00:00,应分别核对。
下载时核对当前页及文件行数,其他页分别导出。详见数据入库与查询。
5. 配置报警并完成一个生命周期
编辑 Temperature 的报警配置,仅启用本次测试用的高限条件。
先添加并启用历史报警目标,把 Temperature 纳入其转发组,最低报警等级设为 3,本例时区偏移为 +00:00。确认目标已启动,再执行下面的报警过程,历史目标才能收到全过程事件。
| 参数 | 示例值 |
|---|---|
| 高限 | 80 |
| 报警等级 | 3 |
| 延时 | 0 毫秒 |
| 报警文本 | 工程约定的高温说明 |
- 将源温度改为
85,到实时报警页确认变量、当前值、限值和发生时间。 - 打开详情,执行确认并填写处理说明。
- 保持
85,确认操作本身不会降低温度或解除现场条件。 - 恢复温度
75,检查恢复状态。 - 到历史报警查询刚才的目标,核对同一生命周期的发生、确认和恢复。
三条状态记录应对应同一报警身份,不能仅凭相同变量名拼接不同事件。保留天数是清理策略,刚入库的记录不能证明已经完成到期清理。
报警与风机控制分别配置。确认表示人员已处理该事件,恢复表示触发条件已经解除,详细流程见报警查询。
控制与故障演练
6. 建立风机回差控制
在“规则引擎”建立测试流程,连线和参数完成前先禁用流程。
| 节点或连接 | 配置 |
|---|---|
| 变量通知规则 | 限定 Demo_Modbus_Device 和 Temperature。 |
| JSON 数值提取 | 将通知的数值转换为后续比较使用的数值输入;完整快照与值端口不要混用。 |
| 阈值触发 | Threshold=75、Hysteresis=5、CompareOperator=>。 |
| 变量 RPC | 选择本工程的 Fan,将阈值节点的 Triggered 布尔输出连到 WriteData。 |
保存、启用并重开检查连线。先用 85 跨过上界,再用 65 跨过下界,分别核对规则运行结果、RPC、源端线圈和网关采集回读。
| 连续输入 | 风机反馈 |
|---|---|
85 | 开启 true。 |
从 85 回到 75 | 在回差区保持开启。 |
降至 65 | 关闭 false。 |
从 65 回到 75 | 在回差区保持关闭。 |
该例使用严格大于比较;边界值的行为应按所选比较符验证。回差用于减少阈值附近反复开关,不能代替独立的设备联锁与现场许可。
7. 验证故障与主备
| 测试 | 通过条件 |
|---|---|
| MQTT 接收端断开 | 离线期间写入 76、77、78,恢复后逐条核对来源身份和时间,记录缺失、重复及积压回落。 |
| 通信短时中断 | 恢复后出现新采样,计算、报警、控制及发送继续工作。 |
| Runtime 工作机停止 | 备用机接管同一工程,新温度能引起报警与真实风机动作;确认没有双工作状态。 |
| 原主机恢复 | 核对当前工作方及同步状态,按配置和确认流程交回,避免把进程启动当成已完成接管。 |
有限输入的补传验收
为便于清点本次输入,将同一转发组暂时改为变化触发、全部分批。MQTT 目标启用失败重试缓存,文件最大行数设为 10000、内存队列上限 1000、上传分片大小 1000、并发上传数量 1,QoS 选择 1,关闭保留消息。
- 在独立订阅端接收消息,并通过当前数据请求主题发送一次快照请求。请求包含
Source: "TGateway"和本次唯一的 32 位小写RequestId,结构见 MQTT 当前数据请求。 - 确认收到基线温度、风机及对应请求编号的完成回执,目标缓存为空,记录接收边界。
- 停止本次测试的 Broker,依次输入
76、77、78,每次等到采集值与时间更新后再输入下一个值。 - 恢复同一 Broker,让独立订阅端先完成重连并确认订阅成功,再放开网关连接,使缓存开始发送。关闭保留消息时,订阅尚未建立会漏掉已经发布的补传消息。
- 在接收边界之后按变量 ID、值和来源变化时间逐次匹配,分别统计缺失和重复,观察缓存回落;不要用新的当前数据请求代替离线旧值。
- 恢复原过程值及生产使用的组触发策略。
容量应足以容纳故障窗口内的输入。QoS 1 与失败缓存允许重发,验收时应保留重复统计,不能据这次有限实验认定所有情况下都恰好投递一次。
主备交接检查
同步工程后,分别核对两端通道、设备、变量、脚本、组、目标和规则的原 ID、参数及关系;相同名称不能代替对象身份一致。工程同步不复制外部历史数据库文件,历史保护按对应目标单独配置。
停止当前工作机后,用新的温度输入验证备用机采集、计算、上传、报警和风机写回。原工作机按原数据目录启动后,先检查实际工作授权:另一端仍持有有效授权时,恢复的节点应保持待机。需要交回时执行手动切换并确认,之后再次检查单工作状态与真实反馈。
备份与交付
8. 备份和恢复
配置数据库恢复
“系统设置 → 系统控制 → 备份配置数据库”仅支持 SQLite 配置库,下载包含已提交 WAL 数据的一致性单文件快照,包含工程配置及账号权限。恢复时选择由该入口生成的配置备份,并确认当前配置库仍为 SQLite。采用其他类型配置库的工程按该数据库的备份恢复流程处理。独立历史库、缓存、证书文件和整个程序目录需要另行保全。
- 下载配置备份,记录所属网关和文件标识。
- 在允许恢复测试的环境中保存一项明确变化,例如修改测试变量的单位。
- 选择原备份并恢复,确认覆盖范围,只提交一次,等待软件实际重启。提交成功表示恢复请求已接受,应继续检查重启后的登录入口。
- 使用备份中的账号重新登录,确认测试差异消失,并逐项比较原 ID、设备参数、变量关系、计算源码和规则定义。
- 重新执行
85 → 75 → 65,验证采集、计算、MQTT、报警与真实风机反馈。
完整运行目录恢复
完整目录快照用于一并保全程序及目录内的数据。下面的验收范围为同一 Windows 账号、同一路径恢复;跨主机、账号或路径部署时,还需处理证书私钥及受保护配置的使用条件。
- 停止所属网关实例,确认其已经退出,再复制完整运行目录。保留程序、配置、证书、数据库及其 WAL、目录内的历史库和缓存,并保全密钥环境。
- 为快照记录相对路径、文件长度和 SHA256,妥善保管包含账号及密钥的备份。外部现场源、Broker 和目录外数据库另行备份。
- 先保全恢复前的原目录,再把快照恢复到原位置。核对文件清单与摘要一致后启动实例。
- 使用备份账号重新登录,核对工程配置和全部对象 ID;按原变量及时间定位恢复前的历史记录。
- 再执行新的
85 → 75 → 65输入,检查计算、报警、MQTT、风机开启、回差保持及关闭。旧曲线和快照值不能代替恢复后的新业务。
配置库恢复与完整目录恢复应分别验收。配置库单文件不包含整个运行环境,目录恢复成功也应继续核对外部连接及实际业务结果。
交付检查
| 交付内容 | 核对方法 |
|---|---|
| 点表与连接清单 | 设备、地址、类型、单位、周期及控制权限与现场一致。 |
| 配置备份 | 能实际恢复并重新登录;恢复后业务继续执行。 |
| 脚本和规则 | 源码、依赖变量、参数和启用状态明确,输入及实际反馈对应。 |
| 上传和数据库 | 外部接收、表模型、字段类型、时区、历史保留和断线补传均已核对。 |
| 证书与账号 | 用途、有效期、保管位置及运维权限明确。 |
| 故障处理 | 留有接管、恢复、日志定位和重新连接的方法。 |


