VisualHMI-Einfache Datenbank: easyydb _ * mit benutzerdefinierten Modus für Datensatzsteuerelemente

kostenlosKostenloses technisches Material

Dieser Inhalt ist direkt lesbar und eignet sich für das Grundlagenlernen und die Suche.

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

FunktionenParameterBeschreibung
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)HandlerDatenbank schließen, Ressourcen freigeben
easydb_get_count(db)HandlerAnzahl der aktuell gültigen Datensätze
easydb_get(db, idx)idx Beginn von 0Lesen der angegebenen Index-Datensätze, erfolgreiche Rückgabe einer Zeichenfolge, fehlgeschlagen nil
easydb_add(db, dataset)String-DatenHinzufügen eines Datensatzes am Ende
easydb_update(db, idx, dataset)idx + Neuer InhaltAktualisieren des angegebenen Datensatzes,Dataset-Länge müssen genau gleich dataRowSize sein
easydb_del(db, idx)idxEntfernen des angegebenen Datensatzes
easydb_clear(db)HandlingAlle 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
end

Konfiguration 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
end

Datensatzformat "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
end

db.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.

Vier Gruben:1flashaddr muss Engineering-Ressourcen / Datensampel / Operationsprotokoll / OTA-Backup vier Zonenvermeiden, direkt Flash ohne Isolierung, falsche Adressdaten überschneiden sich gegenseitig oder sogar Ziegel;2easydb_update Dataset-Länge muss genau gleich dataRowSize beim Erstellensein, wenn es lang ist, wird es fehlschlagen;3 Aufzeichnungen mit englischen Semikolon; Trennung, Ausrichtung der Auflösungsregeln für Tabellensteuerelemente, ohne chinesische Semikolon;4 - Handler ist eine globale Lebenszyklus-Ressource, in on _ init wird ein ganzes Halten geöffnet, und vor der Operation wird überprüft, ob der Handle nicht 0 ist und der Index im Bereich liegt. Diese API ist nur für die benutzerdefinierte Firmware verfügbar, die übliche Firmware nicht.

Aus dem VisualHMI-Entwicklungsdokument von Guangzhou Dacai Technology (hmi-doc.gz-dc.com) LUA-Tutorial "Einfache Datenbank", das Urheberrecht liegt bei Dacai Technology.

Sollte man diese Informationen für ein echtes Projekt verwenden?

Gehen Sie zum Tool Center, um Nachrichten zu analysieren, CRC-Prüfungen und Geräte-Debugging zu erledigen, oder senden Sie Anforderungen für Auswahl - und Zugangsvorschläge.

Ingenieur Mitglied

Verwandeln Sie diesen Artikel in ein umsetzbares Debuggermaterial

Erweiterte Nachrichtenanalyse, Paket-Downloads, Codebeispiele, Engineering-Szenarien und Priority-Technischer Support sind für die Real-Projekt - Bereitstellung möglich.

Unbegrenzte Werkzeuge
Datenpaket und Codepaket
Vollständige Engineering Case-Basis
Vorrangiger Zugang zum technischen Support

Antwort veröffentlichen

Ihre E-Mail - Adresse wird nicht öffentlich gemacht. Erforderliche Elemente wurden verwendet * markiert.