VisualHMI - 数据记录控件

本章节主要介绍LUA脚本API 对数值、字符串类型数据记录控件的使用说明。数据记录控件的功能,本章节只介绍需要LUA脚本设置部分,其他界面上直接配置的功能(如记录的上下翻页、时间戳定位等)不做说明,详细可参考VisualHMI - 数据记录控件 (点击跳转)

适用范围:VisualHMI - HMI&M系列&Dx系列

例程下载链接:ViusalHMI - 数据记录控件(点击下载)

1.Lua API说明

1.1.record_get_count(sn)

获取资料采样记录总条数函数record_get_count(sn) 是 HMI 系统提供的数据记录查询接口,用于获取指定资料采样通道(索引为 sn)中已存储的历史记录总条数

📊 参数说明

参数 类型 说明
sn number 资料采样通道索引
• 取值范围:0 ~ 19(共 20 个通道)

1.2.record_modify_data(sn, index, data)

修改资料记录内容函数record_modify_data(sn, index, data) 是 HMI 系统提供的数据记录修改接口,用于修改指定资料采样通道中某一条历史记录的数据内容

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19
• 对应工程中配置的第 sn 个采样通道
index number 记录行号(从 0 开始)
• 表示要修改的第 index 条记录
• 必须小于 record_get_count(sn) 返回值
data table (array) 待写入的数据数组
• 字一维数组,Lua 表索引从 1 开始

⚠️ 重要限制:若该资料采样已启用块地址存储模式,数据不可篡改性。

1.3.record_write_data(sn, data)

添加资料记录函数record_write_data(sn, data) 是 HMI 系统提供的数据记录写入接口,用于向指定资料采样通道追加一条新的记录

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19
• 对应工程中已配置的第 sn 个采样通道
data table (array) 待写入的数据数组
• 字一维数组,Lua 表索引从 1 开始

1.4.record_read_data(sn, index)

读取资料记录内容函数record_read_data(sn, index) 是 HMI 系统提供的历史数据查询接口,用于从指定资料采样通道中读取某一条记录的原始数据及其时间戳

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19 •
对应工程中配置的第 sn 个采样通道
index number 记录行号(从 0 开始)
• 表示要读取的第 index 条记录
• 必须满足 0 ≤ index < record_get_count(sn)

返回值

返回值 类型 说明
data table (array) 记录数据数组
• 元素为 16 位无符号整数(uint16)
Lua 表索引从 1 开始,即 data[1] 为记录的第一个 word 字段
timestamp number 32 位 Unix 时间戳(秒)

1.5.record_modify_string(sn, index, strings)

修改字符串类型资料记录函数record_modify_string(sn, index, strings) 是 HMI 系统为字符串型资料记录通道提供的专用接口,用于修改指定记录行中的内容每一列数据以分号 ;分隔的字符串形式传入

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19
• 必须对应一个配置为字符串类型的采样通道
index number 记录行号(从 0 开始)
• 表示要修改的第 index 条记录
• 必须满足 0 ≤ index < record_get_count(sn)
strings string 分号分隔的字符串字段序列
• 格式:"字段1;字段2;字段3;..."

⚠️ 重要限制:若该资料采样已启用块地址存储模式,数据不可篡改性。

1.6.record_read_string(sn, index)

读取字符串类型资料记录函数record_read_string(sn, index) 是 HMI 系统为字符串型资料记录通道提供的专用查询接口,用于读取指定记录行的内容及其时间戳。返回的数据以分号 ; 分隔的字符串

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19
index number 记录行号(从 0 开始)
• 表示要读取的第 index 条记录
• 必须满足 0 ≤ index < record_get_count(sn)

返回值

返回值 类型 说明
strings string 分号分隔的字符串字段序列
• 格式:"字段1;字段2;字段3;..."
timestamp number 32 位时间戳(秒)

1.7.record_write_string(sn, strings)

添加字符串类型资料记录函数,record_write_string(sn, strings) 是 HMI 系统为字符串型资料记录通道提供的专用写入接口,用于向指定通道追加一条新的文本记录。数据以分号 ; 分隔的字符串形式传入。

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19
strings string 分号分隔的字符串字段序列
• 格式:"字段1;字段2;字段3;..."

1.8.record_clear(sn)

清除资料记录函数record_clear(sn) 是 HMI 系统提供的资料记录重置接口,用于清空指定通道(sn)中的所有历史记录数据

📊 参数说明

参数 类型 说明
sn number 资料记录通道索引
• 取值范围:0 ~ 19
• 对应工程中配置的第 sn 个采样通道(数值型或字符串型均适用)

2.数值表格

2.1.资料采集配置

在菜单栏工程→资料采样中,设置数值表格属性如下所示:

  1. 采集模式:触发采样;
  2. 记录条数:100;
  3. 数据地址:LW2000

    • 数据类型:UINT16

    • 数据个数:10

  4. 控制地址:LW1001
  5. 采样控制地址:LW1002
    • 启动模式OFF→ON

image-20240118092220529

2.2.画面配置

2.2.1.数据记录控件

画面中添加一个数据记录表格,属性配置如下所示:

  1. 数据来源:资料采集,资料取样索引为“[0]数值数组”

    • 时间顺序:时间逆序

    • 时间日期:显示时间

  2. 通道数:为10。和资料采集→数据个数→10一致
  3. 自动列宽:不勾选
    • 固定列数为2:即是序号、时间两列固定不动
  4. 每页行数:5
  5. 显示滚动条:√,当记录数大于5时,显示滚动条,可拖动滚动条查看
  6. 手势滑动:√,当记录数大于5时,可以上下滑动表格查看数据
  7. 控制地址:

    • 翻页控制:√,地址为LW1004,UINT16类型

    • 允许翻页:地址为LW1005,UINT16,只读

    • 时间戳定位:√,地址为LW1006,UINT32类型

    • 选中行通知:√,地址为LW1008,UINT32类型

image-20240118093008048

2.2.2.Lua键设置

添加5个字设置按钮,用于触发Lua控制数值表格,以“添加”按钮为例,控件配置如下所示:

  1. 写入地址:LW1000
  2. 操作模式:写入常量

    • 常量值:1/2/3/4/5(依次为添加、修改、读取、清除、读取记录数)
  3. 使用图库:√
  4. 使用文字:√

image-20240118093453415

2.2.3.文本设置

添加一个文本控件,用于显示表格操作的信息,如读取选中行内容,总记录数等,配置如下所示:

image-20240118094850356

2.3.Lua 和 预览

2.3.1.添加记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1100、键值为1,调用record_write_data添加新的记录,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1100 --操作
        then
            local key = get_uint16(vtype, 0x1100) --获取key值,操作类型

            if key == 1 --添加记录
            then
                local dataTb = {}
                addByteRatio = addByteRatio + 1
                for i = 1, 10
                do
                    dataTb[i] = i*addByteRatio
                end
                record_write_data(0, dataTb)
            end
        end
    end
end
2.运行预览

运行虚拟屏,点击添加,第一次点击,添加“1,2,3,4,5,6,7,8,9,10”,在点击将添加“2,4,6,8,10,12,14,16,18,20”,如下所示:

Video_2024-01-19_091351

2.3.2.修改记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1100、键值为2,调用record_write_data修改对应选中行内容,程序如下所示:

4function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1100 --操作
        then
            local key = get_uint16(vtype, 0x1100) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 2 --修改记录
            then
                local dataTb = {}
                for i = 1, 10
                do
                    dataTb[i] = 12345
                end
                record_modify_data(0, number_select_line, dataTb)
            end

        elseif addr == 0x1105 --选择行通知
        then
            local cnt = record_get_count(0) --逆序表格
            number_select_line = cnt - get_uint32(vtype, 0x1105) - 1
        end
    end
end
2.运行预览

运行虚拟屏,选中第2行,点击修改,选中内容为“12345;12345;12345;12345;12345;12345;12345;12345;12345;12345;”,如下所示:

Video_2024-01-18_095153

2.3.3.读取记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1100、键值为3,调用record_read_data读取选中对应行内容,并显示在文本,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1100 --操作
        then
            local key = get_uint16(vtype, 0x1100) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 3 --读取记录
            then
                local  dataTb,timeUnix = record_read_data(0, number_select_line) --返回参数1,数据数组;参数2,时间戳
                local dataMsg = ''
                for i = 1, #(dataTb)
                do
                    dataMsg = dataMsg..' '..dataTb[i]
                end
                set_string(VT_LW, 0x1160, timeUnix..dataMsg)
            end
        elseif addr == 0x1105 --选择行通知
        then
            local cnt = record_get_count(0) --逆序表格
            number_select_line = cnt - get_uint32(vtype, 0x1105) - 1
        end
    end
end
2.运行预览

运行虚拟屏,选中第2行,点击读取,将内容显示在文本上,如下所示:

Video_2024-01-18_095807~1

2.3.4.清除记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1100、键值为4,调用record_clear清除对应的资料,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1100 --操作
        then
            local key = get_uint16(vtype, 0x1100) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 4 --清除数据
            then
                record_clear(0)
            end
        end
    end
end
2.运行预览

运行虚拟屏,点击清除,表格的内容清空,如下所示:

Video_2024-01-18_100245

2.3.5.读取记录数

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1100、键值为5,调用record_get_count,并将记录数显示在文本上,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1100 --操作
        then
            local key = get_uint16(vtype, 0x1100) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 5 --获取记录数
            then
                local cnt = record_get_count(0)
                set_string(VT_LW, 0x1160, cnt)
            end
        end
    end
end
2.运行预览

运行虚拟屏,获取记录数,将当前的记录数显示在文本上,如下所示:

Video_2024-01-19_090208

3.字符串表格

3.1.资料采集配置

在菜单栏工程→资料采样中,设置字符串表格属性如下所示:

  1. 采集模式:触发采样;
  2. 记录条数:100;
  3. 数据地址:LW3000

    • 数据类型:STRING

    • 数据个数:50

  4. 控制地址:LW1501
  5. 采样控制地址:LW1502
    • 启动模式OFF→ON

image-20240119091840791

3.2.画面配置

3.2.1.数据记录控件

画面中添加一个数据记录表格,属性配置如下所示:

  1. 数据来源:资料采集,资料取样索引为“[1]字符串”

    • 字符串表格:√
      • 字符编码:GB CODE
    • 时间顺序:时间顺序
    • 时间日期:显示日期和时间
  2. 通道数:为10。和资料采集→数据个数→10一致
  3. 自动列宽:不勾选
    • 固定列数为2:即是序号、时间两列固定不动
  4. 每页行数:5
  5. 显示滚动条:√,当记录数大于5时,显示滚动条,可拖动滚动条查看
  6. 手势滑动:√,当记录数大于5时,可以上下滑动表格查看数据
  7. 控制地址:LW1201

    • 翻页控制:√,地址为LW1201,UINT16类型

    • 允许翻页:地址为LW1202,UINT16,只读

    • 时间戳定位:√,地址为LW1203,UINT32类型

    • 选中行通知:√,地址为LW1205,UINT32类型

image-20240119092123263

3.2.2.Lua键设置

添加5个字设置按钮,用于触发Lua控制字符串表格,以“添加”按钮为例,控件配置如下所示:

  1. 写入地址:LW1200
  2. 操作模式:写入常量

    • 常量值:1/2/3/4/5(依次为添加、修改、读取、清除、读取记录数)
  3. 使用图库:√
  4. 使用文字:√

image-20240119092516806

3.2.3.文本设置

添加一个文本控件,用于显示表格操作的信息,如读取选中行内容,总记录数等,配置如下所示:

image-20240119092632396

3.3.Lua 和 预览

3.3.1.添加记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1200、键值为1,调用record_write_string添加新的记录,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1200 --操作
        then
            local key = get_uint16(vtype, 0x1200) --获取key值,操作类型

            if key == 1 --添加记录
            then
                local allCnt = record_get_count(1)
                if allCnt < string_select_line - 1
                then
                    return
                end

                local dataStr = ''
                for i = 1, 10
                do
                    dataStr = dataStr..'第'..(math.ceil(addStr + i)..'个')..';'
                end
                addStr = addStr + 10
                record_write_string(1, dataStr)
            end
        end
    end
end
2.运行预览

运行虚拟屏,“添加”:点击表格显示“第1个;第2个;第3个;第4个;第5个;第6个;第7个;第8个;第9个;第10个;”,在点击将显示“第11个;第12个;第13个;第14个;第15个;第16个;第17个;第18个;第19个;第20个;”依次类推,显示效果,如下所示:

Video_2024-01-19_092937

3.3.2.修改记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1200、键值为2,调用record_modify_string修改对应选中行内容,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1200 --操作
        then
            local key = get_uint16(vtype, 0x1200) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 2 --修改记录
            then
                local allCnt = record_get_count(1)
                if allCnt < string_select_line - 1
                then
                    return
                end
                record_modify_string(1, string_select_line, 'change;change;change;change;change;change;change;change;change;change;')

            end

        elseif addr == 0x1205 --选择行通知
        then
            local cnt = record_get_count(1)
            string_select_line = get_uint32(vtype, 0x1205)
            print('string_select_line = '..string_select_line)
            set_string(VT_LW, 0x1260, '顺序表格 : 选中第'..((get_uint32(vtype, 0x1205) + 1) // 1)..'行,索引'..(string_select_line // 1))
        end
    end
end
2.运行预览

运行虚拟屏,选中第2行,点击修改,选中内容修改为“change;change;change;change;change;change;change;change;change;change;”,如下所示:

Video_2024-01-19_093321

3.3.3.读取记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1200、键值为3,调用record_read_string读取选中对应行内容,并显示在文本,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1200 --操作
        then
            local key = get_uint16(vtype, 0x1200) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 3 --读取记录
            then
                local allCnt = record_get_count(1)
                if allCnt < string_select_line - 1
                then
                    return
                end
                local dataStr,timeUnix = record_read_string(1, string_select_line) --返回参数1,字符串;参数2,时间戳
                set_string(VT_LW, 0x1260, timeUnix..dataStr)
            end
        elseif addr == 0x1205 --选择行通知
        then
            local cnt = record_get_count(1)
            string_select_line = get_uint32(vtype, 0x1205)
            print('string_select_line = '..string_select_line)
            set_string(VT_LW, 0x1260, '顺序表格 : 选中第'..((get_uint32(vtype, 0x1205) + 1) // 1)..'行,索引'..(string_select_line // 1))
        end
    end
end
2.运行预览

运行虚拟屏,选中第2行,点击读取,将内容显示在文本上,如下所示:

Video_2024-01-19_093657~1

3.3.4.清除记录

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1200、键值为4,调用record_clear清除对应的资料,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1200 --操作
        then
            local key = get_uint16(vtype, 0x1200) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 4 --清除数据
            then
                record_clear(1)
            end
        end
    end
end
2.运行预览

运行虚拟屏,点击清除,表格的内容清空,如下所示:

Video_2024-01-19_093918

3.3.5.读取记录数

1.Lua

在on_update里面,判断触发地址和键值,若地址为LW1200、键值为5,调用record_get_count,并将记录数显示在文本上,程序如下所示:

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1200 --操作
        then
            local key = get_uint16(vtype, 0x1200) --获取key值,操作类型

            if key == 1 --添加记录
            then
                ....
            elseif key == 5 --获取记录数
            then
                local cnt = record_get_count(1)
            string_select_line = get_uint32(vtype, 0x1205)
            print('string_select_line = '..string_select_line)
            set_string(VT_LW, 0x1260, '顺序表格 : 选中第'..((get_uint32(vtype, 0x1205) + 1) // 1)..'行,索引'..(string_select_line // 1))
            end
        end
    end
end
2.运行预览

运行虚拟屏,获取记录数,将当前的记录数显示在文本上,如下所示:

Video_2024-01-19_094124

Copyright ©Dacai all right reserved,powered by Gitbook该文件修订时间: 2026-02-10 11:21:01

results matching ""

    No results matching ""