跳至主要內容

电磁流量计 4-20mA 模拟量采集接入 ThingsCloud

约 1362 字大约 5 分钟

电磁流量计 4-20mA 模拟量采集接入 ThingsCloud

这个示例,我们介绍电磁流量计如何接入 ThingsCloud 平台,并上报测量速度。

我们用的电磁流量计采用 4-20mA 模拟量信号输出,所以还需要一台支持 4-20mA 模拟量输入和网络通信的 RTU。将电磁流量计和 RTU 连接后,RTU 采集模拟量信号,同时提供 Modbus 从机服务。

RTU 如何连接 ThingsCloud

自带网络通信的 RTU 接入 ThingsCloud 的方法和 DTU 完全相同,请浏览 DTU 接入示例教程。本示例不限于特定的 DTU 产品。

对于另一些 RTU 支持 Modbus RTU 输出,请参考以下示例:

顺便说一下,有些电磁流量计也支持 RS485/Modbus 输出,这样就不需要单独的模拟量采集,只需要用支持 Modbus RTU 透传的 DTU 即可,具体步骤和以上示例相似。

添加属性定义

根据流量计口径的不同,这款的量程是 0.1-15m/s。我们在设备类型中,找到 功能定义,添加属性定义,如下图:

配置 Modbus 寄存器

接下来,确保设备类型的接入协议设置为Modbus RTU 透传,在设备类型的 Modbus 配置中,设置属性对应的设备端 Modbus 寄存器参数。

参考 RTU 的模拟量采集 Modbus 寄存器手册,我们知道第一路 AI 的寄存器是:

  • 起始地址:0x00C0
  • 寄存器数量:1
  • 数值单位:uA

我们对设备类型的 Modbus 设置如下:

接下来,记得开启 属性智能转换,并设置正确的自定义数据流标识符,自定义数据流用于云平台和 DTU 之间收发 Modbus RTU 报文,通常默认创建的自定义数据流标识符为 stream,请您根据实际情况为准。

通过任务查询数据

Modbus 数据上报需要主机发起查询,也就是从云平台下发查询指令,通过 DTU 透传到终端设备。

我们来创建 Modbus 查询任务,如下图:

保存任务后,我们可以手动点击单次运行任务,也可以在任务的定时选项中,设置定时时间间隔,例如 5 分钟,这样便可以每 5 分钟获得最新的数据。

查看数据

通过云平台的智能 Modbus 解析,在设备概要页面的属性中,我们可以实时看到设备最新上报的属性数据,如下图:

这时采集到的电流信号是 6830uA,也就是 6.83mA。

通过模拟量生成流速数值

接下来还需要自动将电流模拟量转为数字量,使用 ThingsCloud 规则引擎可以轻松完成这个转换。

创建一个属性上报预处理规则。

在云函数中使用如下代码:

module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可更新属性对象。
     */
     
    if (report_attributes.analog_value !== undefined) {
        // 得到电流信号 mA
        var analog_ma = report_attributes.analog_value / 1000;
        report_attributes.flow_speed = 14 + 
            (analog_ma - 4) / (20 - 4) * (140 - 14)
    }

    return report_attributes;
}

规则创建成功后,再次读取模拟量,会看到生成流速数值,如下图:

再来一些计算值

流量计设备只负责输出当前的测量速度,对于用户而言,还希望知道一些信息和数据,例如:

  • 今日的最大流速、最小流速;
  • 当前流速级别,是否超限?

我们以今日最大流速和最小流速为例,继续完善上边的预处理规则,增加一些代码,完整云函数如下:

module.exports = function (report_attributes) {
    /**
     * report_attributes:   上报的属性对象,同时作为函数返回值。函数中可更新属性对象。
     */
     
    if (report_attributes.analog_value !== undefined) {
        // 得到电流信号 mA
        var analog_ma = report_attributes.analog_value / 1000;
        report_attributes.flow_speed = 14 + 
            (analog_ma - 4) / (20 - 4) * (140 - 14);
            
        // 调用 ThingsCloud 内置函数,读取设备当前属性,也就是上次上报后的数据
        const attrs = Cloud.getCurrentAttributes();
        
        // 记录本次上报的年月日
        report_attributes.report_date = Cloud.Utils.dateFormat("YYYYMMDD");
        
        if (report_attributes.report_date !== attrs.report_date) {
            // 如果是新的一天首次上报
            report_attributes.min_speed = report_attributes.flow_speed;
            report_attributes.max_speed = report_attributes.flow_speed;
        } else {
            // 今日的非首次上报,计算最大值和最小值
            report_attributes.min_speed = Math.min(attrs.min_speed, report_attributes.flow_speed);
            report_attributes.max_speed = Math.max(attrs.max_speed, report_attributes.flow_speed);
        }
    }

    return report_attributes;
}

然后我们回到设备类型的功能定义,增加两个属性定义:

采集一段时间后,可以看到计算出的今日最大流速和最小流速。

编辑 App 设备界面

通过 ThingsCloud 的零代码用户应用平台,可以快速生成手机 App,为终端客户或者企业成员创建用户账号,分配设备给用户。

更多功能

设备接入成功后,您在 ThingsCloud 的探索之旅才刚刚开始,请浏览: