内存计算
打开“开发配置 → 内存计算”。这里的变量保存在网关内部,不需要连接 PLC,可用于人工设置值、计算结果或规则中间状态。
创建并计算内存变量
新增一个可手动写入的变量
- 点击“新增变量”,名称填
ManualValue,所属设备保持“内存设备”,不需要另外新增设备。 - 数据类型保持
Object,初始值填0,保持“使能”开启。内存变量在这里使用Object,不用另选Double。 - 读写权限选择允许读写,读表达式和写表达式先留空。
- 点击“确定”,回到列表找到
ManualValue。 - 点击这一行的“写入”,在“写入值”填
12.5,再点击弹窗中的“写入”。输入数字时不要加引号。 - 刷新列表,当前值应为
12.5。

写入窗口会自动识别数字、true / false 和 JSON 对象或数组。表格的“运行时数据类型”表示实际保存的值类型,例如本例写入后显示 Decimal,不是新增表单里需要另选的配置。
这里写的是内部变量。但如果该变量已被规则引用,写入仍可能触发下游动作。练习时使用新变量,不使用生产规则正在监听的变量。
根据已有变量计算
需要计算结果自动变化时,给内存变量选择“内存变量”类型的读表达式。不要选择采集变量使用的“数据转换”类型。
- 先确认参与计算的源变量已经存在并正常更新。
- 到脚本管理,新增“内存变量”类型的脚本,按内存变量示例编译并保存。
- 返回内存计算,新增或编辑结果变量,在“读表达式”中选择这个脚本。
- 填写脚本所需输入参数。要固定周期计算,触发方式选择定时,执行间隔先填
1000毫秒。 - 保存后等待一个周期,检查“当前值”“采集时间”和“错误信息”。
读表达式为空时不会自动计算。一个变量尽量只由一种方式更新,避免人工写入后立即被计算脚本覆盖。
变量配置参考
新增和编辑变量
点击列表行的“编辑”修改。弹窗中的“保存”会保存并留在弹窗内,“确定”会保存并关闭。
| 配置项 | 怎么设置 |
|---|---|
| 变量名称 | 同一设备内唯一,被脚本或规则引用后不要随意改名 |
| 数据类型、初始值 | 数据类型保持 Object;初始值按实际内容填写,例如数字 0、布尔值 false |
| 单位 | 按需填写,例如 kPa |
| 读写权限 | 人工写入或规则写入时必须允许写 |
| 读表达式 | 自动计算这个变量的脚本;人工赋值可留空 |
| 写表达式 | 写入时需要校验或转换才配置 |
| 触发方式、执行间隔 | 决定计算何时执行;定时计算的间隔单位为毫秒 |
| 报警配置 | 根据数值或布尔条件配置,报警表达式使用“数据转换”脚本。 |
| 值过滤 | 采集数值的过滤规则不能用于推断手动内存赋值的效果;内存点按实际值类型和写入口检查。 |
选择计算触发方式
触发方式决定什么时候运行公式,执行间隔决定周期调度。检查效果时同时看采集时间、变化时间、质量和错误;公式再次执行但结果相同,变化时间可以保持。
| 触发方式 | 有变量依赖时的行为 |
|---|---|
| 变化时更新 | 脚本通过 Tag 引用的输入变化后计算;即使填了 4000,稳定输入也不会因此每四秒重算。 |
| 间隔更新 | 按毫秒数或包含秒字段的六段 Cron 执行;输入改变后等待下一次调度。 |
| 间隔或变化时更新 | 周期到达或依赖变化都可以触发计算。 |
执行间隔例如 1000 表示一秒,*/2 * * * * * 表示每两秒。留空时使用内存设备的默认间隔,不能用空值停用计算。没有通过 Tag 登记依赖的脚本会进入周期任务,因此返回时间等无依赖脚本不能用来证明“变化时更新”只运行一次。
条件分支中的依赖
变化触发跟随本轮公式实际执行过的 Tag 读取。条件切换到另一分支后,不再读取的旧来源会退出依赖;决定分支的开关本身也应通过 Tag 读取,才能在开关变化时重新计算。
例如公式先读取选择开关,再从 A、B 中选择一路:选择 A 时改变 A 应触发计算,改变 B 不应因该分支触发;切换到 B 后反向核对。观察采集时间和执行错误,不能只凭结果未变化判断公式没有执行。
读取链发生异常时,已实际访问的来源仍可触发后续恢复,尚未执行部分的旧来源不继续触发。没有有效来源依赖时,按周期调度检查恢复;循环依赖应先修改公式解除,再验证各级结果。
验证两路输入和多级计算
- 创建可写的
Memory.InputA、Memory.InputB,初始值分别为10、20。 - 创建“内存变量”脚本,按内存脚本示例读取两个真实变量,明确转换为数值后求和并返回。
- 创建只读结果
Memory.Total,绑定脚本并保存。质量正常时应得到30。 - 只把 A 改为
15,确认 B 仍为20、Total 为35;再把 B 改为25,确认 Total 为40。不要直接把结果写成期望值。 - 分别选择三种触发方式。在稳定输入和单路变化两种条件下观察时间,区分立即响应与等待周期。
- 需要多级计算时,让第二级脚本读取 Total,逐级核对输入和结果。避免直接或间接循环依赖。
计算结果设为只读可以阻止外部写入,不会阻止计算任务更新它。输入离线或脚本异常时,应先处理质量和错误,不能把保留的旧值当作本次计算成功。
内存写表达式与权限
内存读计算选择“内存变量”脚本,写表达式选择“数据转换”脚本,两者绑定位置不同。手动输入值先经过写表达式,再进入内存当前值。
例如写脚本将输入乘以参数 Scale:绑定 2 后写入 5,实际值应为 10;只把当前变量参数改成 3,再次写入 5 应为 15。清除写表达式并保存后,同样输入得到 5,原脚本仍保留在目录中。
“RPC写入使能”、变量读写权限和系统只读身份分别检查。“只写”配置不表示内存列表不能显示最近保存值;物理协议是否能回读由相应驱动决定。Object 可以保存布尔、字符串、数组和对象,写入后同时核对运行时类型。配置报警前先解除不需要的倍率,避免报警边界使用了意外的换算结果。
初始值与最新快照
“初始值”决定变量装载时的起点;运行中的当前值不会因为显示在列表中就自动成为下次起点。
| 保存设置 | 作用 |
|---|---|
| 保存初始值关闭 | 当前值可以变化,配置中的初始值保持原值;强制保存值会关闭且不可用。 |
| 保存初始值开启,强制保存值关闭 | 后台按普通周期保存最新快照,默认周期约 30 分钟,可随部署设置调整。需要等待实际写入完成。 |
| 保存初始值、强制保存值均开启 | 更新进入按变量合并的保存队列,后台约每秒处理;不保证每个采样都单独落库,也不是同步提交。 |
采集变量的快照来自原始值。例如读表达式把 1234 换算成当前值 12.34,保存的起点仍为 1234;重建后还需等待新采集和换算,不能把启动瞬间的起点当成新的工程量读数。
快照用于任务重建后恢复状态,不是逐条历史。快速连续写入的中间值可能被合并,需要完整变化记录时另行配置历史数据存储。关闭保存不会清除已经持久化的旧初值;需要新的起点时,应明确编辑初始值。
验收时先记录初始值和当前值,写入一个不同的安全测试值,等待保存后在维护窗口重启数据任务,再核对同一变量恢复的值。数据任务重启会重建采集和仿真任务;同时检查源端是否运行以及新采集是否恢复,不能只看内存值恢复。
设备和通道状态变量
新增或编辑采集设备、通道后,系统会在 Memory 设备下自动生成对应的只读系统变量。系统会定期读取当前状态并更新变量,通常约每秒刷新一次。用户不需要手工创建或修改这些变量。
| 对象 | 变量名称 | 数据类型 | 可能的值 | 说明 |
|---|---|---|---|---|
| 采集设备 | <DeviceName>_DS | String(字符串) | Default、OnLine、OffLine、Pause | 表示设备当前状态。 |
| 通道 | <ChannelName>_TS | Boolean(布尔) | true(在线)、false(离线) | 表示通道在线状态。 |
变量名称中的设备名称和通道名称来自对应资源,不需要手工填写。实际名称、描述和当前值可在内存变量列表中查看。
操作步骤
- 登录 TGateway Web,进入“开发配置 → 内存计算”。
- 在左侧选择“系统内存变量”,清除搜索条件,点击“刷新”。
- 在变量列表中查找以
_DS或_TS结尾的变量,查看“描述”和“当前值”。 - 设备或通道状态发生变化后,等待约一个刷新周期,再查看“当前值”。
设备状态变量和通道在线变量都不能手工写入、编辑或删除。需要在规则、脚本或数据转发中使用时,直接选择对应的变量名称即可。
两种状态的区别
| 查看项 | 表示 |
|---|---|
| 设备状态 | 采集设备自身的运行状态,可能为初始化、在线、离线或暂停。 |
| 通道在线状态 | 通讯通道是否在线。同一通道被多个设备共用时,该变量仍只对应这一条通道。 |
设备名称或通道名称修改后,对应变量名称会同步改为新的名称和后缀,变量描述也会同步更新。删除设备或通道后,对应的状态变量会自动消失。
不需要普通通讯连接的通道,其在线状态可能显示为 true。这表示该通道不需要外部连接,不代表某个采集设备已经在线。
维护与使用
批量修改与备份
少量相似变量可使用行内“复制”。批量修改时先勾选变量,再选择“批量编辑”,只修改本次需要调整的字段。
Excel 操作:
- 先导出一份现有内存变量,保留原文件作备份。
- 在副本中保留工作表和列名,新增变量时使用不重复的名称;不要修改系统自动生成的状态变量。
- 点击“导入变量”选择文件,等待导入结果。选择后即开始导入,不是预览。
- 按失败行修正文件,成功后回到列表检查变量和值。
“导出变量”导出当前页及筛选范围内的内存变量;要完整备份内存变量,使用“导出全部”。通道、设备和普通点表的导入规则见采集配置 → 导入导出。
用于规则、报警或上传
创建好内存变量后,可在规则或转发组中按 Memory.变量名 选择它。需要上传时,仍要将它加入转发组成员,不是创建后就自动上传。
报警在该变量的“报警配置”中设置,步骤见报警查询。
数值枚举可使用状态映射,例如 100 表示维护、101 表示故障。需要温度与压力同时满足条件时,先建立只读布尔计算点,再启用布尔开报警,按组合条件矩阵逐项改变两路真实输入。
常见问题
| 现象 | 先检查 |
|---|---|
| 当前值不更新 | 是否启用,是否配置读表达式,定时触发和执行间隔是否正确 |
| 写入失败 | 读写权限、数据类型、输入值格式,以及是否为只读系统变量 |
| 脚本报找不到变量 | 脚本中的设备名与变量名是否与现有配置完全一致 |
| 列表找不到变量 | 清空筛选条件后刷新 |
| 转发中没有这个变量 | 检查组范围是否包含这个内存变量 |
| 想删除变量 | 先检查脚本、规则和转发引用,导出备份后再删除 |