跳到主要内容

计算采集值

在设备上采集到的值并不一定是最终想要的值,有时它与实际想要的值存在一定的换算关系。
比如:电表上的电流有时采集到数据单位是毫安(mA),但是你期望的单位为安(A),需要将采集值除以1000。NodeSCADA提供了数据转换功能,并且数据转换支持两种方式:一种是非常简单的线性转换方式;另一种是非常强大且灵活的自定义函数方式,这种形式具有一定的学习门槛,本节以一个案例分别介绍这两种方式分别如何使用。
在数据点配置的数据转换列可以打开数据转换配置窗口,每一个数据点的数据转换规则都是独立的,即可以单独为每一个数据点配置不同的转换规则

案例

假设您现在有一个Modbus设备:

  • Host地址: 127.0.0.1
  • 端口: 502
  • TCP类型: ModbusTCP
  • 站号: 1

其保持寄存器上有两项数据

  • 电流(mA) 地址 120 数据类型 16位整数
  • 电压(V) 地址 122 数据类型 16位整数 但是新期望采集到 电流(A)功率(W)
    这里面存在两个问题,
  1. 电流(mA)采集到之后需要转换单位为安培(A)。
  2. 功率数据无法直接采集到,需要综合电压电流计算。 下面分别使用 线性转换 解决第1个问题,使用自定义函数 解决第2个问题

线性转换

可以配置倍数偏移小数位

  • 倍数。必填,指原始数据乘以相应倍数,例如采集的原始数据为1000,倍数为0.001,则转换后数据变为1。
  • 偏移。必填,指的加减运算。线性变换可同时配置倍数和偏移。
  • 小数位。选填,指的是保留多少位小数

计算规则为先倍数后偏移,最后处理小数位线性转换配置

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

线性转换配置结果

自定义函数

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

电压采集信息

点击数据转换列的按钮,更改为自定义函数并将下方代码复制进去。(暂时不用担心,稍后会解释其中的含意)

Javascript
return context.value * context.V('device01.a')

电压采集信息

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

功率计算结果

接下来让我们再来审视一下代码做了什么,在此之前先了解一下 return

Javascript return
// return 表示返回值,您返回什么,那么转换值就是什么,如果您像下方代码一样,则转换值永远为 1
// return 之后的逻辑都不再执行
return 1;
Javascript context
// 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 的规则是 设备编号.数据点ID

注意

如果目标数据点配置了数据转换,则为转换值,没有配置则为原始值