VisualHMI OTA-Upgrade: otta _ init / otta _ write mit SD-Karte automatisches Upgrade

kostenlosKostenloses technisches Material

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

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ößeGesamtkapazität von Flash
Flash Gesamtkapazität16 MB
System-Firmware (OS + Treiber, M-Serie)1 MB (DH-Serie 2 MB)
Aktuelles Projekt (private)4,38 MB
Verbraucht Gesamt5,38 MB, übrig ≈ 10,62 MB
OTA-StartadresseMuss ≥ 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

- FunktionParameterBeschreibung
ota_init(md5, filesize, addr)md5 Fix "0123456789abcdef"; filesize entspricht genau der tatsächlichen Größe von. bin; addr ≥ Flash-HalfKonfiguration des Upgrade-Ziels, Bereitschaft zum Empfangen von Firmware-Daten
ota_write(writeTb)Bytetab, ≤ 2048, Unzureichend Auto-Automatisierung 0x00Schreiben von Firmware in den Flash-Bereich
ota_check_upgrade(state)muss 1 übergebenTrigger 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 TabelleValidierungs - / Decompressungsfortschritt und Ergebnis-Callback

Status / Wert-Kombination für on_ota_progress:

statusBedeutungvalue
1Validierungsvorgang startetFixiert 0
2Validierungsergebnis0 = Fehler (Firmware beschädigt / MD5 nicht übereinstimmt) / 1 = Erfolg
3Entpackung Fortschritt0 ~ 100 Prozent
4Entpackung Ergebnis0 = 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.

VisualHMI OTA-Upgrade: otta _ init / otta _ write mit SD-Karte automatisches UpgradeAbbildung

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
end

3.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
end

Schlü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.

Vier Gruben:1md5 - Parameter ist die feste String „0123456789abcdef"und ist nicht der richtige MD5 der Datei, mach dich nicht schlau, um den Hash der Datei zu berechnen;2addr muss ≥ die Hälfte von Flash und die Region ist kontinuierlich freiund die Blockadresse kann nicht erhöht werden, wenn sie den hohen Adressbereich besetzt hat;3 Upgrade-Pakete können nicht mehr als die Hälfte von Flashund 10,62 MB verbleibender Speicherplatz ist nicht gleich dem Paket, das 10,62 MB platzieren kann;4 Vor dem Upgrade löschen Sie Ota_destroy () den Rest von, die OTA_write-Tailpakete weniger als 2048 werden automatisch Nullfüllen, Sie müssen nicht selbst die Ausrichtung verarbeiten. Upgrade Stromausfall = Ziegel, vor der Massenproduktion müssen Sie den Upgradeprozess wiederholt überprüfen.

Aus dem LUA-Tutorial "OTA-Upgrade" von Guangzhou Dacai Technology VisualHMI-Entwicklungsdokument (hmi-doc.gz-dc.com) zusammengestellt, 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.