- 1. 1. ⚠️ Flash Adresse规划(不看会变砖)
- 2. 2. API 总表
- 3. 3. Daten aufzeichnenKontrollen「Custom definiert」模式
- 4. 4. 应用:db.lua 句柄封装 + 增删改查
- 5. 4.1 初始化(on_init)
- 6. 4.2 增删改(LW5000 按键Unterteilung发)
简易Daten库(定制固件专属)是一个轻Quantität级、无文件Das System的EingebettetDaten库:在 Flash 里划一块连续区域,按固定Länge记录存结构化Daten(Parameter配置、Ereignisse日志、Betrieb记录),掉电不丢,支持Betrieb时按需初始化。Daten aufzeichnenKontrollen用「Custom definiert」Datenquelle模式对接,实现增删改查全流程。
1. ⚠️ Flash Adresse规划(不看会变砖)
简易Daten库直接Operationen Flash,没有文件Das System隔离机制,flashaddr Ausgang Adresse必须严格避开四类高风险区域:
- 工程资源存储区
- Informationen采样块存储区
- Operationen记录块存储区
- OTA 升级备份区域
总占用空间 = dataRowSize × maxCount,规划Adresse时把这段空间算进去,别和别的Funktion打架。
2. API 总表
| 函数 | Parameter | 说明 |
|---|---|---|
easydb_open(flashaddr, createIfNotExist, dataRowSize, maxCount) |
flashaddr Flash Ausgang Adresse;createIfNotExist 0=仅Öffnen./1=nicht existiert.则创建;dataRowSize ≥1;maxCount 最大条数 | Öffnen.或创建Daten库,返回句柄(非 0 成功,0 失败) |
easydb_close(db) |
句柄 | SchließenDaten库,释放资源 |
easydb_get_count(db) |
句柄 | gegenwärtigWirksam记录数 |
easydb_get(db, idx) |
idx 从 0 开始 | 读指定索引记录,成功返回Charaktere串,失败 nil |
easydb_add(db, dataset) |
Charaktere串Daten | 末尾追加一条记录 |
easydb_update(db, idx, dataset) |
idx + 新内容 | 更新指定记录,dataset Länge必须严格gleich ist dataRowSize |
easydb_del(db, idx) |
idx | Löschen指定记录 |
easydb_clear(db) |
句柄 | Leeren Sie alles记录 |
3. Daten aufzeichnenKontrollen「Custom definiert」模式
Daten来源设为Custom definiert时,Das System不知道有多少行Daten,必须由两个回调提供:
- 记录Anzahl回调
on_get_record_count(screen_id, control_id):返回总行数,内部调 easydb_get_count(g_db_handle) - 记录内容回调
on_get_record_row(screen_id, control_id, row):返回Die row 行的Charaktere串内容
function on_get_record_count(screen_id, control_id)
if screen_id == 0 and control_id == 1 then
return db.getCnt(g_db_handle)
end
end
function on_get_record_row(screen_id, control_id, row)
local ret, msg = db.get(g_db_handle, row)
if ret == 0 then
return msg
end
end
Kontrollen配置:Daten来源=Custom definiert、CharaktereCodierung=UTF8、翻页控制√、控制Adresse LW4000、选中行通知√(LW4004,UINT32)——选中某行时索引写进 LW4004,增删改都靠它定位。
4. 应用:db.lua 句柄封装 + 增删改查
4.1 初始化(on_init)
function on_init()
dofile("db.lua")
_EN_ON_UPDATA_API_ = 0
-- 10MB Anfang、nicht existiert.则创建、单条1000Bytes、最多1000条
g_db_handle = db.open(10*1024*1024, 1, 1000, 1000)
if g_db_handle == 0 then
print("ERROR: 无法Öffnen.Daten库!")
return
end
db.clear(g_db_handle) -- Leeren旧Daten(可选)
db.add(g_db_handle, "Alice;Engineer;30")
db.add(g_db_handle, "Bob;Technician;25")
db.add(g_db_handle, "Charlie;Manager;40")
db.add(g_db_handle, "Harden;Basketball players;36")
_EN_ON_UPDATA_API_ = 1
end
记录Das Format「Name;职业;Jahr龄」,英文UnterteilungNr.Unterteilung隔,和表格KontrollenAnalyseRegeln一致,直接映射多列。
4.2 增删改(LW5000 按键Unterteilung发)
function on_update(slave, vtype, addr)
if addr == 0x4004 then -- 选中行通知
local idx = get_uint32(VT_LW, addr)
local ret, msg = db.get(g_db_handle, idx)
if ret == 0 then
local parts = my_split(msg, ";")
if parts ~= nil then
set_uint16(VT_LW, 0x4530, idx) -- 记录gegenwärtig选中索引
set_string(VT_LW, 0x4500, (parts[1] == nil) and "--" or parts[1])
set_string(VT_LW, 0x4510, (parts[2] == nil) and "--" or parts[2])
set_string(VT_LW, 0x4520, (parts[3] == nil) and "--" or parts[3])
end
show_dialog(1, 232, 33, 50) -- 弹窗显示详情
end
elseif addr == 0x5000 then
local key = get_uint16(VT_LW, addr)
if key == 0 then -- 添加
local name = get_string(VT_LW, 0x5010)
local position = get_string(VT_LW, 0x5020)
local age = get_string(VT_LW, 0x5030)
db.add(g_db_handle, name..";"..position..";"..age..";")
elseif key == 1 then -- 修改(改选中行)
local name = get_string(VT_LW, 0x4500)
local position = get_string(VT_LW, 0x4510)
local age = get_string(VT_LW, 0x4520)
local idx = get_uint16(VT_LW, 0x4530)
db.modify(g_db_handle, idx, name..";"..position..";"..age..";")
elseif key == 2 then -- Löschen(删选中行)
local idx = get_uint16(VT_LW, 0x4530)
db.del(g_db_handle, idx)
end
end
end
db.lua 封装层每个函数都做句柄Prüfungen + 索引越界检查(idx = count 返回 -2),这是句柄驱动设计的标准姿势:不合法就直接返回Fehler.码,绝不往下传。
整理自 广州大彩科技 VisualHMI 开发Dokumentation(hmi-doc.gz-dc.com)LUA Unterricht「简易Daten库」,版权归大彩科技所有。
Antwort veröffentlichen