데이터记录控件 + record_* API:在 HMI 上维护历史데이터表——数值型(如电压曲线데이터)和문자串型(如操作로그)都能存,配表格控件显示、翻页、时间戳定位。sn 是자료采样通道索引,范围 0~19 共 20 通道,控件데이터来源选「자료采集」的哪个通道,API 就操作哪个。
1. record_* API 总表
| 函数 | 설명 |
|---|---|
record_get_count(sn) | 通道已存记录总条数 |
record_write_데이터(sn, 데이터) | 追加一条记录,데이터 为字数组(索引从 1 开始) |
record_read_데이터(sn, index) | 读一条,返回 데이터(索引从 1)和 timestamp(32 位 Unix 秒) |
record_modify_데이터(sn, index, 데이터) | 改一条,index 从 0 开始,须 < record_get_count(sn) |
record_write_string(sn, strings) | 追加문자串记录,필드用分号 ; 分隔 |
record_read_string(sn, index) | 读문자串记录,返回 strings 和 timestamp |
record_modify_string(sn, index, strings) | 改문자串记录 |
record_clear(sn) | 지우기通道所有记录(数值/문자串都行) |
⚠️ 若采样已활성화块주소存储모드,记录不可篡改——modify 会失败。
2. 数值表格案例(추가/修改/읽기/清除/查条数)
자료采集설정:触发采样、记录条数 100、데이터주소 LW2000、UINT16、데이터个数 10、控制주소 LW1001、采样控制주소 LW1002、启动모드 OFF→ON。데이터记录控件:데이터来源「[0]数值数组」、时间逆序、通道数 10、每页 5 行、翻页控制 LW1004、允许翻页 LW1005(只读)、时间戳定位 LW1006(UINT32)、选中行通知 LW1008(UINT32)。5 个버튼写 LW1000,常量 1=추가/2=修改/3=읽기/4=清除/5=读条数。
addByteRatio = 0 -- 累加器,让每次추가的데이터不同
function on_update(slave, vtype, addr)
if vtype == VT_LW then
if addr == 0x1100 then -- 操作버튼
local key = get_uint16(VT_LW, 0x1100)
local 데이터Tb = {}
if key == 1 then -- 추가
addByteRatio = addByteRatio + 1
for i = 1, 10 do
데이터Tb[i] = i * addByteRatio -- 第一次 1..10,第二次 2..20
end
record_write_데이터(0, 데이터Tb)
elseif key == 2 then -- 修改选中行
local cnt = record_get_count(0)
local line = cnt - get_uint32(VT_LW, 0x1105) - 1 -- 逆序表格行映射
for i = 1, 10 do 데이터Tb[i] = 12345 end
record_modify_데이터(0, line, 데이터Tb)
elseif key == 3 then -- 읽기选中行
local cnt = record_get_count(0)
local line = cnt - get_uint32(VT_LW, 0x1105) - 1
local 데이터, timeUnix = record_read_데이터(0, line)
local msg = "时间:"..timeUnix.." 데이터:"
for i = 1, 10 do msg = msg..데이터[i].." " end
set_string(VT_LW, 0x1160, msg)
elseif key == 4 then
record_clear(0) -- 清除
elseif key == 5 then
set_string(VT_LW, 0x1160, "条数:"..record_get_count(0))
end
end
end
end逆序表格的行映射:控件时间逆序显示,第 0 行是最新记录。选中行通知给的是显示位置,换算公式 line = cnt - select - 1。
3. 문자串表格案例
자료采集:触发采样、记录条数 100、데이터주소 LW3000、STRING、데이터个数 50、控制주소 LW1501、采样控制주소 LW1502、启动모드 OFF→ON。控件:데이터来源「[1]문자串」、문자串表格√、GB CODE、时间顺序(注意和数值案例的逆序不同)、通道数 10、每页 5 行、翻页 LW1201、允许翻页 LW1202、时间戳定位 LW1203、选中行通知 LW1205。5 个버튼写 LW1200。
addStr = 0
function on_update(slave, vtype, addr)
if vtype == VT_LW and addr == 0x1200 then
local key = get_uint16(VT_LW, 0x1200)
if key == 1 then -- 추가
local cnt = record_get_count(1)
local line = get_uint32(VT_LW, 0x1205) -- 顺序表格不反转
if cnt < line - 1 then return end
addStr = addStr + 10
local 데이터Str = ""
for i = 1, 10 do
데이터Str = 데이터Str.."第"..(addStr - 10 + i).."个;"
end
record_write_string(1, 데이터Str) -- "第1个;...第10个;"
elseif key == 2 then -- 修改
local line = get_uint32(VT_LW, 0x1205)
record_modify_string(1, line, "change;change;change;change;change;change;change;change;change;change;")
elseif key == 3 then -- 읽기
local line = get_uint32(VT_LW, 0x1205)
local 데이터Str, timeUnix = record_read_string(1, line)
set_string(VT_LW, 0x1260, timeUnix..데이터Str)
elseif key == 4 then
record_clear(1)
elseif key == 5 then
set_string(VT_LW, 0x1260, "条数:"..record_get_count(1))
end
end
end문자串记录用分号 ; 分隔필드,和表格控件분석规则一致。顺序表格选中行不用反转,直接拿 LW1205。
整理自 广州大彩科技 VisualHMI 개발문서(hmi-doc.gz-dc.com)LUA 튜토리얼「데이터记录」,版权归大彩科技所有。
답글 작성