项目案例
串口屏可视化

串口屏可视化

一、项目要求

  • 实现 Modbus 协议的传感器采集。
  • 实现传感器数据的 MQTT 发送。
  • 实现淘晶驰串口屏的数据显示。
  • 实现预警。

二、硬件说明

1、传感器

uart-hmi

2、淘晶驰屏幕

实物:

uart-hmi

参数:

型号TJC1076X7F0_011R_P01触摸类型电阻式触摸工作温度(℃)-20~+70
尺寸15寸工作电压(V)mA12-24主控频率(HZ)800M
分辨率1024*768工作电流(mA)700RTC时钟
亮度(nit)300FLASH(Bytes)32M运行内存512

三、实现过程

3.1、实现 Modbus 协议的传感器采集

1、新建设备

点击设备接入,进入设备管理界面,再点击新建,进入设备创建界面。

uart-hmi

进入设备建设界面后。选择 Modbus 设备类型。开启轮询,实现不断从传感器获取数据。设定最大点位,这是设定可以从传感器获取最多不同的数据点位。选择 UART 的工作模式,因为本项目传感器和终端之间是通过串口通信。选择传感器和终端设备相连的串口编号。在设备配置完成后,就可点击提交。(详细的设备配置说明可见: 设备接入

uart-hmi

2、配置点位表

提交完后回到设备管理界面,可以看到我们创建好的设备。然后设备的高级操作中点击点位表配置。

uart-hmi

在点位表配置界面我们有两种配置方式:手动单个配置点位与通过点位表批量配置点位

💡

本项目是使用批量配置点位。

首先要制作点位表。先建里如下的 excel 表,在表中填入相关数据.其中每一列依次是数据的标签、数据的别名、Modbus 功能码、采样频率、设备地址、起始寄存器地址、寄存器个数(一个寄存器两个字节)、数据类型、排序、权重系数。

uart-hmi

uart-hmi

导入之后就可以在这个界面看到采集的数据。

到这我们便实现了其中一种数据的采集。但是因为这个项目我们有 3 种类型的传感器,数据解析方式上有差异,所以决定创建 3 个设备分别对应3种传感器。3 种传感器的设备创建上方式,类似唯一就是点位表上有些许差别。所以安装上述方法依次创建另外两个设备,实现另外两种水质参数的采集。

盐度点位

uart-hmi

溶解氧点位

uart-hmi

3、数据查看

在配置完点位表之后。若是没有问题此时就可以在当前页面看到采集上来的传感器数据。

uart-hmi

3.2、实现传感器数据的MQTT发送

1、新建北向资源

点击左侧的北向资源,进入北向资源创建界面。点击新建,开始新建资源。

uart-hmi

选择 MQTT Borker 的资源类型。配置实现 MQTT 通信的相关配置。点击提交。(相关配置介绍详情可见:北向资源)。

uart-hmi

提交之后。我们的北向资源界面就可看到我们创建好的资源。复制好对应资源的 UUID,这个参数在配置规则中有作用。

uart-hmi

2、传感器设备 MQTT 发送规则

PH 数据的 MQTT 发送规则

Lua
Actions = {
  function(args)
    local dataT, err = json:J2T(args);
    if err ~= nil then
      Throw(err);
      return true, args;
    end;
    local schemaData = {};
    for _, row in ipairs(dataT) do
      schemaData[row.tag] = row.value;
    end;
    local json = json:T2J({
        id = time:TimeMs(),
        method = "thing.event.property.post",
        params = schemaData
      });
    local err = data:ToMqtt("uuid", json);
    if err ~= nil then
      Throw(err);
    end;
    return true, args;
  end
};
 

溶解氧数据的 MQTT 发送规则

Lua
Actions = {
  function(args)
    local dataT, err = json:J2T(args);
    if err ~= nil then
      Throw(err);
      return true, args;
    end;
    local schemaData = {};
    for _, row in ipairs(dataT) do
      schemaData[row.tag] = apure:ParseDOxygen(row.value);
    end;
    local json = json:T2J({
        id = time:TimeMs(),
        method = "thing.event.property.post",
        params = schemaData
      });
    local err = data:ToMqtt("uuid", json);
    if err ~= nil then
      Throw(err);
    end;
    return true, args;
  end
};
 

盐度数据的 MQTT 发送规则

Lua
Actions = {
  function(args)
    local dataT, err = json:J2T(args);
    if err ~= nil then
      Throw(err);
      return true, args;
    end;
    local schemaData = {};
    for _, row in ipairs(dataT) do
      schemaData[row.tag] = apure:ParseDOxygen(row.value);
    end;
    local json = json:T2J({
        id = time:TimeMs(),
        method = "thing.event.property.post",
        params = schemaData
      });
    local err = data:ToMqtt("uuid", json);
    if err ~= nil then
      Throw(err);
    end;
    return true, args;
  end
};
 
💡

记得将其中的 uuid 替换成对应北向资源的标识码

3.2、实现淘晶驰串口屏的数据显示

1、淘晶驰窗口屏界面设计。

首先要设计好淘晶驰屏幕上的基础界面。具体参考章节(设备接入- RHILEX 接入淘晶驰串口屏)。也可以参考官方文档 http://wiki.tjc1688.com/。 (opens in a new tab)

uart-hmi

2、新建淘晶驰设备

在设备接入里面选择淘晶驰即可。

uart-hmi

3、给传感器设备编写淘晶驰显示规则

PH 传感器的显示规则

Lua
Actions = {
  function(args)
    local dataT, err = json:J2T(args);
    if err ~= nil then
      Throw(err);
      return true, args;
    end;
    local schemaData = {};
    for _, row in ipairs(dataT) do
      schemaData[row.tag] = row.value;
    end;
    local hmiParams = {
      "t1.txt=\"" .. schemaData.ph_1 .. "\"",
      "t6.txt=\"" .. schemaData.ph_2 .. "\"",
      "t10.txt=\"" .. schemaData.ph_3 .. "\"",
      "t14.txt=\"" .. schemaData.ph_4 .. "\"",
      "t2.txt=\"" .. schemaData.ph_t1 .. "\"",
      "t5.txt=\"" .. schemaData.ph_t2 .. "\"",
      "t9.txt=\"" .. schemaData.ph_t3 .. "\"",
      "t13.txt=\"" .. schemaData.ph_t4 .. "\""
    };
    local err = tjchmi:WriteToHmi("uuid", hmiParams);
    if err ~= nil then
      Throw(err);
    end;
    return true, args;
  end
};
 

溶解氧显示规则

Lua
Actions = {
  function(args)
    local dataT, err = json:J2T(args);
    if err ~= nil then
      Throw(err);
      return true, args;
    end;
    local schemaData = {};
    for _, row in ipairs(dataT) do
      schemaData[row.tag] = apure:ParseDOxygen(row.value);
    end;
    local hmiParams = {
      "t3.txt=\"" .. schemaData.conductivity_1 .. "\"",
      "t7.txt=\"" .. schemaData.conductivity_2 .. "\"",
      "t11.txt=\"" .. schemaData.conductivity_3 .. "\"",
      "t15.txt=\"" .. schemaData.conductivity_4 .. "\""
    };
    local err = tjchmi:WriteToHmi("uuid", hmiParams);
    if err ~= nil then
      Throw(err);
    end;
    return true, args;
  end
};
 
 

盐度显示规则

Lua
Actions = {
  function(args)
    local dataT, err = json:J2T(args);
    if err ~= nil then
      Throw(err);
      return true, args;
    end;
    local schemaData = {};
    for _, row in ipairs(dataT) do
      schemaData[row.tag] = row.value;
    end;
    local oxygen_1 = apure:ParseDOxygen(schemaData.oxygen_1);
    local ox_t1 = apure:ParseDOxygen(schemaData.ox_t1);
    local oxygen_2 = apure:ParseDOxygen(schemaData.oxygen_2);
    local ox_t2 = apure:ParseDOxygen(schemaData.ox_t2);
    local oxygen_3 = apure:ParseDOxygen(schemaData.oxygen_3);
    local ox_t3 = apure:ParseDOxygen(schemaData.ox_t3);
    local oxygen_4 = apure:ParseDOxygen(schemaData.oxygen_4);
    local ox_t4 = apure:ParseDOxygen(schemaData.ox_t4);
    local hmiParams = {
      "t0.txt=\"" .. oxygen_1 .. "\"",
      "t4.txt=\"" .. oxygen_2 .. "\"",
      "t8.txt=\"" .. oxygen_3 .. "\"",
      "t12.txt=\"" .. oxygen_4 .. "\""
    };
    local err = tjchmi:WriteToHmi("uuid", hmiParams);
    if err ~= nil then
      Throw(err);
    end;
    return true, args;
  end
};
💡

记得将 uuid 替换成对印陶晶驰设备的标识码

四、最终成果

uart-hmi

© 2023-2025 RHILEX Technologies Inc. All rights reserved.