OTA-Upgrade - API: Die Upgrade-Logik des HMI und dasKommunikationsprotokoll, die Datenquelle vollständig entkopptUnabhängig davon, ob die Upgrade-Daten von der Mainboard-Serial - Anschluss, Ethernet, Wi-Fi oder 4G, unabhängig davon, ob der Host benutzerdefiniertes Protokoll, Modbus oder HTTP verwendet, HMI ist nur verantwortlich für das Schreiben der empfangenen Daten in den angegebenen Flash-Bereich über die Standard-API, überprüfen Sie die erfolgreiche Entpackung und automatisch neu starten Sie das Upgrade. Gilt für die HMI & M-Serie und die Dx-Serie.
1. und️ Flash-Planung (Wurzel des fehlgeschlagenen Upgrades / Wandels)
Beispiel HMI80480M070 (Standard 128Mbit = 16MB):
| Projektgröße | Gesamtkapazität von Flash |
|---|---|
| Flash Gesamtkapazität | 16 MB |
| System-Firmware (OS + Treiber, M-Serie) | 1 MB (DH-Serie 2 MB) |
| Aktuelles Projekt (private) | 4,38 MB |
| Verbraucht Gesamt | 5,38 MB, übrig ≈ 10,62 MB |
| OTA-Startadresse | Muss ≥ 8 MB groß sein (Flash-Hälfte) |
Zwei eiserne Regeln:1OTA-Startadresse muss in der zweiten Hälfte des Flashs beginnen(auch wenn die verbleibenden 10,62 MB müssen von ≥ 8 MB beginnen, um die Überschreitung des neuen und alten Projekts zu vermeiden, kann das aktuelle System während des Upgrades weiter laufen;2OTA-Schreibbereich muss kontinuierlich und frei sein- - Wenn Sie mit der Funktion "Block Adresse" einen hohen Adressbereich (z. B. 10 - 12 MB) besetzen oder ein Upgradepaket mehr als die Hälfte von Flash (≈ 10,62 MB Paket), können Sie nicht aktualisieren.
2. API Gesamtübersicht
| - Funktion | Parameter | Beschreibung |
|---|---|---|
ota_init(md5, filesize, addr) | md5 Fix "0123456789abcdef"; filesize entspricht genau der tatsächlichen Größe von. bin; addr ≥ Flash-Half | Konfiguration des Upgrade-Ziels, Bereitschaft zum Empfangen von Firmware-Daten |
ota_write(writeTb) | Bytetab, ≤ 2048, Unzureichend Auto-Automatisierung 0x00 | Schreiben von Firmware in den Flash-Bereich |
ota_check_upgrade(state) | muss 1 übergeben | Trigger Integritätsprüfung + Entpackung + Upgrade |
ota_destory() | - | Löschen der geschriebenen OTA-Rest - Daten (Löschen vor dem Upgrade) |
on_ota_progress(status, value) | Siehe folgende Tabelle | Validierungs - / Decompressungsfortschritt und Ergebnis-Callback |
Status / Wert-Kombination für on_ota_progress:
| status | Bedeutung | value |
|---|---|---|
| 1 | Validierungsvorgang startet | Fixiert 0 |
| 2 | Validierungsergebnis | 0 = Fehler (Firmware beschädigt / MD5 nicht übereinstimmt) / 1 = Erfolg |
| 3 | Entpackung Fortschritt | 0 ~ 100 Prozent |
| 4 | Entpackung Ergebnis | 0 = Fehlschlag / 1 = Erfolg → Neustart bevorsteht |
3. Anwendungen: SD-Karte lokale Upgrade
3.1 Upgrade-Paket Vorbereitung
Projekt nach der Kompilierung AuswahlHerunterladen MassenproduktionDie erzeugte Datei enthält ota.bin. Benennen Sie ota.bin in a.bin in das Stammverzeichnis Ihrer SD-Karte.

3.2 Festplattenbuchstaben-Erkennung + Suche nach a.bin
ota_filename = "a.bin"
ota_addr_start = 8 * 1024 * 1024 -- OTA 起始地址(至少 Flash 一半)
flashsize = 16 * 1024 * 1024 -- Flash 总大小
function on_update(slave, vtype, addr)
if vtype == VT_LW and addr == useraddr.ota_swich then
if sd_dir ~= 0 then
list_dir(sd_dir) -- 先看 SD 卡
elseif usb_dir ~= 0 then
list_dir(usb_dir) -- 再看 U 盘
else
set_string(VT_LW, useraddr.text, "检测不到SD卡和USB,无法OTA升级!!!")
end
end
end
function on_list_dir(path, filename, type, fsize)
if type == 1 then
if filename == ota_filename then
set_string(VT_LW, useraddr.text, "文件:"..ota_filename.." 已检测到")
if (fsize + ota_addr_start) > flashsize then
set_string(VT_LW, useraddr.text, "ota.bin 文件大小超过,无法升级!!!")
else
set_string(VT_LW, useraddr.text, "开始升级!!!")
set_uint32(VT_LW, useraddr.ota_data, fsize)
ota.set_upgrade(path.."/"..ota_filename)
end
end
end
end3.3 Kern-Upgrade - Prozess (ota.lua)
function ota.set_upgrade(path)
local TransferSize = 0
local size = 0
if file_open(path, 0) == true then
size = file_size()
if size < (flashsize - ota_addr_start) then
ota_destroy() -- 消除残留 OTA 数据
local sdota_addr = ota_init("0123456789abcdef", size, ota_addr_start)
-- 计算尾包补零长度
local size_complement = 0
if size % 2048 ~= 0 then
size_complement = 2048 - (size % 2048)
end
while true do
local rddata = file_read(2048) -- 流式读 2048
if #(rddata) < 2048 then -- 尾包补 0x00
for i = (#(rddata) + 1), 2048 do rddata[i] = 0x00 end
end
TransferSize = TransferSize + #(rddata)
local prg = string.format("%.1f", (TransferSize * 100) / (size + size_complement))
set_uint16(VT_LW, useraddr.progress, math.modf((TransferSize * 1000) / size))
set_string(VT_LW, useraddr.text, "下载进度 : "..prg.." %")
refresh_screen()
ota_write(rddata) -- 写入 Flash,不足补零
if size <= TransferSize then break end
end
file_close()
ota_check_upgrade(1) -- 校验、解压
end
end
end
function on_ota_progress(status, value)
if status == 1 and value == 0 then
set_string(VT_LW, useraddr.text, "校验开始")
elseif status == 2 then
if value == 0 then set_string(VT_LW, useraddr.text, "校验失败")
elseif value == 1 then set_string(VT_LW, useraddr.text, "校验成功") end
elseif status == 3 then
set_uint16(VT_LW, useraddr.progress, value * 10)
set_string(VT_LW, useraddr.text, "解压进度 : "..value.." %")
refresh_screen()
elseif status == 4 then
if value == 0 then set_string(VT_LW, useraddr.text, "解压失败")
elseif value == 1 then set_string(VT_LW, useraddr.text, "解压成功") end
end
endSchlüsselfunktion: die Dateigröße vonota_init muss genau mit der tatsächlichen Größe von. bin übereinstimmen; Schreiben von Daten im gesamten Streaming (jedes Mal ≤ 2048, Tailpaket ergänzt 0x00); Ota_check_upgrade (1) Nach dem Scheitern wird in der Rückrufe angehalten, um Ihnen die Möglichkeit zu geben, die Verarbeitung zu verarbeiten, und der Erfolg der Entpackung wird automatisch neu gestartet.
Aus dem LUA-Tutorial "OTA-Upgrade" von Guangzhou Dacai Technology VisualHMI-Entwicklungsdokument (hmi-doc.gz-dc.com) zusammengestellt, das Urheberrecht liegt bei Dacai Technology.
Antwort veröffentlichen