串口屏可视化
一、项目要求
- 实现 Modbus 协议的传感器采集。
- 实现传感器数据的 MQTT 发送。
- 实现淘晶驰串口屏的数据显示。
- 实现预警。
二、硬件说明
1、传感器
2、淘晶驰屏幕
实物:
参数:
型号 | TJC1076X7F0_011R_P01 | 触摸类型 | 电阻式触摸 | 工作温度(℃) | -20~+70 |
---|---|---|---|---|---|
尺寸 | 15寸 | 工作电压(V) | mA12-24 | 主控频率(HZ) | 800M |
分辨率 | 1024*768 | 工作电流(mA) | 700 | RTC时钟 | 有 |
亮度(nit) | 300 | FLASH(Bytes) | 32M | 运行内存 | 512 |
三、实现过程
3.1、实现 Modbus 协议的传感器采集
1、新建设备
点击设备接入,进入设备管理界面,再点击新建,进入设备创建界面。
进入设备建设界面后。选择 Modbus 设备类型。开启轮询,实现不断从传感器获取数据。设定最大点位,这是设定可以从传感器获取最多不同的数据点位。选择 UART 的工作模式,因为本项目传感器和终端之间是通过串口通信。选择传感器和终端设备相连的串口编号。在设备配置完成后,就可点击提交。(详细的设备配置说明可见: 设备接入)
2、配置点位表
提交完后回到设备管理界面,可以看到我们创建好的设备。然后设备的高级操作中点击点位表配置。
在点位表配置界面我们有两种配置方式:手动单个配置点位与通过点位表批量配置点位
本项目是使用批量配置点位。
首先要制作点位表。先建里如下的 excel 表,在表中填入相关数据.其中每一列依次是数据的标签、数据的别名、Modbus 功能码、采样频率、设备地址、起始寄存器地址、寄存器个数(一个寄存器两个字节)、数据类型、排序、权重系数。
导入之后就可以在这个界面看到采集的数据。
到这我们便实现了其中一种数据的采集。但是因为这个项目我们有 3 种类型的传感器,数据解析方式上有差异,所以决定创建 3 个设备分别对应3种传感器。3 种传感器的设备创建上方式,类似唯一就是点位表上有些许差别。所以安装上述方法依次创建另外两个设备,实现另外两种水质参数的采集。
盐度点位
溶解氧点位
3、数据查看
在配置完点位表之后。若是没有问题此时就可以在当前页面看到采集上来的传感器数据。
3.2、实现传感器数据的MQTT发送
1、新建北向资源
点击左侧的北向资源,进入北向资源创建界面。点击新建,开始新建资源。
选择 MQTT Borker 的资源类型。配置实现 MQTT 通信的相关配置。点击提交。(相关配置介绍详情可见:北向资源)。
提交之后。我们的北向资源界面就可看到我们创建好的资源。复制好对应资源的 UUID,这个参数在配置规则中有作用。
2、传感器设备 MQTT 发送规则
PH 数据的 MQTT 发送规则
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 发送规则
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 发送规则
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)
2、新建淘晶驰设备
在设备接入里面选择淘晶驰即可。
3、给传感器设备编写淘晶驰显示规则
PH 传感器的显示规则
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
};
溶解氧显示规则
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
};
盐度显示规则
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
替换成对印陶晶驰设备的标识码