簡易データベース(カスタムファームウェア専用)は軽量でファイルシステムを持たない組み込みデータベース:Flashに連続領域を描画し、固定長記録による構造化データ(パラメータ設定、イベントログ、実行記録)、パワーダウンを失わず、オンデマンド初期化の実行をサポートします。データロギングコントロールは、“カスタム”データソースモードでドッキングし、追加、削除、変更、変更プロセス全体を実現します。
1.️フラッシュアドレス計画(変更なし)
簡易データベース直接操作 Flash,ファイル·システムの分離メカニズムがないflashaddrの開始アドレスは、4つの高リスク領域を厳密に避ける必要があります。
- エンジニアリングリソースストア
- データ·サンプリング·ブロックストア
- オペレーション·ログ·ブロック·ストア
- OTAアップグレードバックアップゾーン
合計占有スペース= dataRowSize × maxCount、アドレスを計画するときにこのスペースをカウントし、他の機能と競合しないでください。
2. APIの概要
| 関数の機能 | パラメータ | 説明書は |
|---|---|---|
easydb_open(flashaddr, createIfNotExist, dataRowSize, maxCount) | flashaddr Flash開始アドレス;createIfNotExist 0=オンのみ/1=existenceしない場合に作成;dataRowSize ≧ 1;maxCount最大バー数 | データベースを開くか作成し、ハンドルを返す0以外の成功、0失敗 |
easydb_close(db) | ハンドルハンドル | データベースのシャットダウン、リソースの解放 |
easydb_get_count(db) | ハンドルハンドル | 現在有効なレコード数 |
easydb_get(db, idx) | IDXは0から始まる。 | 指定されたインデックスレコードを読み取り、文字列を正常に返し、失敗nil |
easydb_add(db, dataset) | 文字列データ | 最後にレコードを追加 |
easydb_update(db, idx, dataset) | IDX + 新コンテンツ | 指定記録の更新、datasetの長さはdataRowSizeと厳密に等しい必要があります |
easydb_del(db, idx) | idx | 指定したレコードの削除 |
easydb_clear(db) | ハンドルハンドル | すべてのレコードをクリア |
3.データログコントロール“カスタム”モード
データソースはカスタム化。システムはデータの行数を知りませんが、2つのコールバックで提供する必要があります。
- レコード数のコールバック
on_get_record_count(screen_id, control_id)easydb_get_count - ログ·コンテンツ·コールバック
on_get_record_row(screen_id, control_id, row):行目の文字列の内容を返す
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制御構成:データソース=カスタム、文字エンコーディング= UTF 8、ページめくり制御√、制御アドレスLW4000、選択行通知√(LW4004、UINT32)-特定の行を選択すると、インデックスはLW4004に書き込まれ、追加、削除、変更はすべてそれに依存します。
4.アプリケーション:db.luaハンドルカプセル化+追加削除変更
4.1初期化on_init
function on_init
dofile "db.lua"
_EN_ON_UPDATA_API_ = 0
--10 MB開始、existenceしない場合は作成、単一1000バイト、最大1000個
g_db_le = db.open 10*1024 *1024 1 1000 1000
if g_db_le == 0 then
print "ERRORデータベースを開くことができません! ")
Return To Returnシングル
End of Endシングル
db.clear g_db_handle - 古いデータを消去する(オプション)
db.add g_db_handle "Alice;Engineer;30"
db. g_db_le ";Technician;25"
db.add g_db_handle Charlie;Manager;40
db. g_db_le "en;Basketball players;36"
_EN_ON_UPDATA_API_ = 1
End of Endシングルレコード形式は、セミコロン区切りで、テーブルコントロールの解決ルールと一致し、複数の列を直接マッピングします。
4.2追加削除改(LW5000ボタン配布)
function on_update slave vtype
addr == 0 x 4004の場合 - ライン通知の選択
local idx = get_uint32 VT_LW addr
local ret msg = db.get g_db_le idx
if ret == 0 then
local parts = my_it msg ";"
if parts = nil then
set_uint16 VT_LW、0x4530、idx --現在選択されているインデックスを記録する
set_string_LW 0x4500 parts[1] == nil and "--" or parts[1]
set_string_LW 0x4510 parts[2] == nil and "--" or parts[2]
set_string_LW 0x4520 parts[3] == nil and "--" or parts[3]
End of Endシングル
show_dialog 1、232、33、50 詳細はウィンドウを参照。
End of Endシングル
elseif addr === 0 x 5000 then
local key = get_uint16 VT_LW addr
key == 0の場合 --追加。
local name = get_string_LW、0x5010
local position = get_string VT_LW、0x5020
local age = get_string_LW、0x5030
db.add g_db_handle name.. ";".. position... ";"..年齢は..。";")
elseifキー == 1 then --変更(行を変更)
local name = get_string VT_LW、0x4500
local position = get_string VT_LW、0x4510
local age = get_string_LW、0x4520
local idx = get_uint16 VT_LW、0x4530
db.modify g_db_handle idx name.. ";".. position... ";"..年齢..。";")
Elseifキー == 2 then 削除(選択した行を削除)
local idx = get_uint16 VT_LW、0x4530
db.del g_db_handle idx
End of Endシングル
End of Endシングル
End of Endシングルdb.luaカプセル化層すべての関数ハンドルチェック+インデックスの範囲外チェック(idx = count return-2)、これはハンドル駆動設計の標準的な姿勢です。不正な場合はエラーコードを返し、決して渡さないでください。
Guangzhou Dai Cai Technology Visual HMI開発ドキュメント(hmi-doc.gz-dc.com)LUAチュートリアル“簡易データベース”、著作権はDai Cai Technologyに帰属します。
Leave a Reply