计算采集值
在设备上采集到的值并不一定是最终想要的值,有时它与实际想要的值存在一定的换算关系。
比如:电表上的电流有时采集到数据单位是毫安(mA),但是你期望的单位为安(A),需要将采集值除以1000。NodeSCADA提供了数据转换功能,并且数据转换支持两种方式:一种是非常简单的线性转换方式;另一种是非常强大且灵活的自定义函数方式,这种形式具有一定的学习门槛,本节以一个案例分别介绍这两种方式分别如何使用。
在数据点配置的数据转换列可以打开数据转换配置窗口,每一个数据点的数据转换规则都是独立的,即可以单独为每一个数据点配置不同的转换规则
案例
假设您现在有一个Modbus设备:
- Host地址: 127.0.0.1
- 端口: 502
- TCP类型: ModbusTCP
- 站号: 1
其保持寄存器上有两项数据
- 电流(mA) 地址 120 数据类型 16位整数
- 电压(V) 地址 122 数据类型 16位整数
但是新期望采集到 电流(A)、功率(W)。
这里面存在两个需求,
- 电流(mA)采集到之后需要转换单位为安培(A)。
- 功率数据无法直接采集到,需要综合电压电流计算。 下面分别使用 线性转换 解决第1个需求,使用 自定义函数 解决第2个需求
线性转换
可以配置倍数、偏移和小数位。
- 倍数。必填,指原始数据乘以相应倍数,例如采集的原始数据为1000,倍数为0.001,则转换后数据变为1。
- 偏移。必填,指的加减运算。线性变换可同时配置倍数和 偏移。
- 小数位。选填,指的是保留多少位小数
计算规则为先倍数,后偏移,最后处理小数位。

配置完成之后,点击保存,然后展开预览表格查看到数据 2150 转换为 2.15,预览表格中展示了 原始值 和 转换值

自定义函数
配置 Javascript 代码自定义计算逻辑 ,这需要一定的编程基础,不过对于简单的计算,没有编程经验的人也可以完成。
在本案例中我们先点击数据点配置按钮后方的【复制】按钮复制一行,填入名称为功率,并在数据地址位置填入电压的数据地址 122

点击数据转换列的按钮,更改为自定义函数并将下方代码复制进去。(不用担心,稍后会解释其中的含义)
return context.value * context.V('device01.a')

然后点击确定,保存。 功率信息即可计算出来

接下来让我们再来审视一下代码做了什么,在此之前先了解一下 return
// return 表示返回值,您返回什么,那么转换值就是什么,如果您像下方代码一样,则转换值永远为 1
// return 之后的逻辑都不再执行
return 1;
// context 是一个可直接访问的变量,其上有一系列值和方法/
// context.value 获取到的是当前数据点采集的原始值,即电压值
// context.V 方法可以获取到 NodeSCADA 系统中的其他数据点值,即使是不在同一个连接器也可以
// context 的完整介绍在下方介绍。
return context.value * context.V('device01.a')
接下来我们详细介绍一下 context
context
context 代表了自定义函数执行的上下文,为了方便计算,NodeSCADA将有用的变量和方法放在了 context 对象上,您可以方便得使用它
context.value 属性
当前数据点的采集原始值。可以以此为基础进行运算
context.readResult 属性
context.readResult是一个对象
context.state 属性
它是一个缓存对象,允许你将某些数据存入进去,并在下次计算时取出来,但是当您编辑了数据点之后,该对象将重建,之前保存的缓存将丢失。
context.V(path: string) 方法
这个方法接受一个 path 字符串参数,允许你获取到其他采集点的值。
数据点 path 的规则是 设备编号.数据点编号
如果目标数据点配置了数据转换,则为转换值,没有配置则为原始值