Easy Database (Benutzerdefinierte Firmware-Exklusiv) ist eineleichte, Dateisystemlose eingebettete Datenbank: Zeichnen Sie einen kontinuierlichen Bereich in Flash, speichern Sie strukturierte Daten (Parameterkonfiguration, Ereignisprotokoll, Laufprotokoll) nach einer festen Länge, Stromausfall, Unterstützung für die Initialisierung nach Bedarf. Die Datensatzsteuerung ist mit dem "benutzerdefinierten" Datenquellenmodus verbunden, um den gesamten Prozess hinzuzufügen, zu löschen und zu ändern.
1. und️ Flash Adressplanung (nicht zu sehen)
Einfache Datenbank-Bedienung Flash,Keine Dateisystem-IsolationFlashaddr-Startadresse muss vier Arten von hohen Risiken vermieden werden:
- Engineering-Ressourcen - Speicher
- Speicherplatz für Daten
- Operations Log-Block - Speicher
- OTA Upgrade Backup-Bereich
Gesamtplatz = dataRowSize × maxCount, diesen Platz bei der Planung der Adresse zu zählen, nicht mit anderen Funktionen zu kämpfen.
2. API Gesamtübersicht
| Funktionen | Parameter | Beschreibung |
|---|---|---|
easydb_open(flashaddr, createIfNotExist, dataRowSize, maxCount) | flashaddr Startadresse von Flash; createIfNotExist 0 = nur geöffnet / 1 = nicht vorhanden, erstellt; dataRowSize ≥ 1; maxCount | Öffnen oder erstellen einer Datenbank, Rückgabe des Handles (Nicht 0 Erfolg, 0 Misserfolg) |
easydb_close(db) | Handler | Datenbank schließen, Ressourcen freigeben |
easydb_get_count(db) | Handler | Anzahl der aktuell gültigen Datensätze |
easydb_get(db, idx) | idx Beginn von 0 | Lesen der angegebenen Index-Datensätze, erfolgreiche Rückgabe einer Zeichenfolge, fehlgeschlagen nil |
easydb_add(db, dataset) | String-Daten | Hinzufügen eines Datensatzes am Ende |
easydb_update(db, idx, dataset) | idx + Neuer Inhalt | Aktualisieren des angegebenen Datensatzes,Dataset-Länge müssen genau gleich dataRowSize sein |
easydb_del(db, idx) | idx | Entfernen des angegebenen Datensatzes |
easydb_clear(db) | Handling | Alle Datensätze leeren |
3. Datenaufzeichnungssteuerung "Benutzerdefinierter" Modus
Wenn die Datenquelle aufBenutzerdefiniertegesetzt ist, kann das System nicht wissen, wie viele Zeilen Daten vorhanden sind, die durch zwei Rückrufe bereitgestellt werden müssen:
- Datensatz-Zahl Rückruf
on_get_record_count(screen_id, control_id): Rückgabe der Gesamtzahl der Zeilen, interne Rückruf easydb_get_count(g_db_handle) - Datensatz-Inhalt Rückruf
on_get_record_row(screen_id, control_id, row): Rückgabe der Zeichenfolge-Inhalt der Zeile.
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
endKonfiguration der Steuerung: Datenquelle = benutzerdefiniert, Zeichencodierung = UTF8, Seite umsteuern √, Steuerung Adresse LW4000, ausgewählte Zeile Benachrichtigung √ (LW4004, UINT32) - - wenn Sie eine Zeile ausgewählt, Index in LW4004 geschrieben, Hinzufügen und Löschen ändern werden von ihm abhängig.
4. Anwendung: db.lua-Handler - Verpackung + Entfernen von Überprüfungen
4.1 Initialisierung (on_init)
function on_init()
dofile("db.lua")
_EN_ON_UPDATA_API_ = 0
-- 10MB 起始、不存在则创建、单条1000字节、最多1000条
g_db_handle = db.open(10*1024*1024, 1, 1000, 1000)
if g_db_handle == 0 then
print("ERROR: 无法打开数据库!")
return
end
db.clear(g_db_handle) -- 清空旧数据(可选)
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
endDatensatzformat "Name; Beruf; Alter", englische Semikolon getrennt, und Tabelle-Steuerung Analyse Regeln übereinstimmen, direkt mehrere Spalten zuordnen.
4.2 Hinzufügen und Entfernen (LW5000 - Schlüsselverteilung)
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) -- 记录当前选中索引
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 -- 删除(删选中行)
local idx = get_uint16(VT_LW, 0x4530)
db.del(g_db_handle, idx)
end
end
enddb.lua Jede Funktion in der Verpackungsschicht führtHandler-Check + Index-Over - Grenzen-Check(idx = count zurückkehrt -2), dies ist die Standard-Haltung des Handler-Designs: Wenn es illegal ist, gibt es einen Fehlercode direkt zurück, niemals weitergeben.
Aus dem VisualHMI-Entwicklungsdokument von Guangzhou Dacai Technology (hmi-doc.gz-dc.com) LUA-Tutorial "Einfache Datenbank", das Urheberrecht liegt bei Dacai Technology.
Antwort veröffentlichen