VisualHMI OTA 升级:ota_init/ota_write 与 SD 卡自动升级

kostenlosKostenloses technisches Material

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

🌐 Diese Seite ist noch nicht auf Deutsch verfügbar. Die chinesische Version wird angezeigt. Zurück zur chinesischen Seite.
本文目录
  1. 1. 1. ⚠️ Flash 规划(升级失败/变砖的根源)
  2. 2. 2. API 总表
  3. 3. 3. 应用:SD 卡本地升级
  4. 4. 3.1 升级包准备
  5. 5. 3.2 检测盘符 + 找 a.bin
  6. 6. 3.3 核心升级流程(ota.lua)

OTA 升级 API:HMI 的升级逻辑与KommunikationVereinbarung、Daten来源完全解耦——不管升级Daten来自主板Die Serie、Ethernet、Wi-Fi 还是 4G,不管上位机用Custom Vereinbarung、Modbus 还是 HTTP,HMI 只负责通过标准 API 把收zu的Daten写进指定 Flash 区,Prüfungen解压成功后自动重启升级。适用 HMI&M 系列&Dx 系列。

1. ⚠️ Flash 规划(升级失败/变砖的根源)

以 HMI80480M070 为例(标准品 128Mbit = 16MB):

项目 大小
Flash 总容Quantität 16 MB
Das System固件(OS+驱动,M 系列) 1 MB(DH 系列 2 MB)
gegenwärtig工程(private) 4.38 MB
已用合计 5.38 MB,剩 ≈10.62 MB
OTA Ausgang Adresse要求 必须 ≥ 8 MB(Flash 总Quantität一半)

两条铁律:①OTA Ausgang Adresse必须从 Flash 后半部Unterteilung开始(哪怕剩余 10.62MB 也要从 ≥8MB 起),避免新旧工程交叉覆盖,升级过程中gegenwärtigDas System才能继续跑;②OTA 写入区必须连续且空闲——如果你用「块Adresse」Funktion占了高Adresse区(比如 10~12MB),或者升级包超过 Flash 一半(≈10.62MB 的包),都不可升级。

2. API 总表

函数 Parameter 说明
ota_init(md5, filesize, addr) md5 固定 “0123456789abcdef”;filesize 与 .bin 实际大小严格一致;addr ≥ Flash 一半 配置升级目标,准备Empfang固件Daten
ota_write(writeTb) Bytes表,≤2048,不足自动补 0x00 Unterteilung块写固件zu Flash 区
ota_check_upgrade(state) 必须传 1 触发vollständig性Prüfungen + 解压 + 升级
ota_destory() 擦除已写的 OTA 残留Daten(升级前清场)
on_ota_progress(status, value) 见下表 Prüfungen/解压进度与Ergebnis回调

on_ota_progress 的 status/value 组合:

status 含义 value
1 Prüfungen过程开始 固定 0
2 PrüfungenErgebnis 0=失败(固件损坏/MD5 不匹配)/1=成功
3 解压进度 0~100 百Unterteilung比
4 解压Ergebnis 0=失败/1=成功 → 即将重启

3. 应用:SD 卡本地升级

3.1 升级包准备

工程编译后AuswahlQuantität产Download,生成的文件里有 ota.bin。使用前把 ota.bin 改名为 a.bin 放zu SD 卡根目录。

VisualHMI OTA 升级:ota_init/ota_write 与 SD 卡自动升级插图

3.2 检测盘符 + 找 a.bin

ota_filename   = "a.bin"
ota_addr_start = 8 * 1024 * 1024    -- OTA Ausgang Adresse(至少 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, "检测不zuSD卡和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.." 已检测zu")
      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 核心升级流程(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 Daten
      local sdota_addr = ota_init("0123456789abcdef", size, ota_addr_start)
      -- Berechnung尾包补零Länge
      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, "Download进度 : "..prg.." %")
        refresh_screen()
        ota_write(rddata)                            -- 写入 Flash,不足补零
        if size <= TransferSize then break end
      end
      file_close()
      ota_check_upgrade(1)                           -- Prüfungen、解压
    end
  end
end

function on_ota_progress(status, value)
  if status == 1 and value == 0 then
    set_string(VT_LW, useraddr.text, "Prüfungen开始")
  elseif status == 2 then
    if value == 0 then set_string(VT_LW, useraddr.text, "Prüfungen失败")
    elseif value == 1 then set_string(VT_LW, useraddr.text, "Prüfungen成功") 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

关键点:ota_init 的 filesize 必须和 .bin 实际大小严格一致;Schreiben von Daten全程流式(每次 ≤2048,尾包补 0x00);ota_check_upgrade(1) 之后Prüfungen失败会停在回调里给你机会处理,解压成功就自动重启进升级。

四个坑:①md5 Parameter是固定串「0123456789abcdef」,不是文件的真实 MD5,别自作聪明去算文件哈希;②addr 必须 ≥ Flash 一半且区域连续空闲,块Adresse占了高Adresse区就升不了;③升级包不能超过 Flash 一半,10.62MB 的剩余空间nicht gleich能放 10.62MB 的包;④升级前先 ota_destroy() 清残留,ota_write 的尾包不足 2048 会自动补零,你不需要自己处理对齐。升级中断电 = 变砖,Quantität产前务必反复验证升级流程。

整理自 广州大彩科技 VisualHMI 开发Dokumentation(hmi-doc.gz-dc.com)LUA Unterricht「OTA升级」,版权归大彩科技所有。

Techniken术语(共 1 个)—— Klick auf展开
Die SerieBerechnung机与外部Ausrüstung进行串行Kommunikation的物理Schnittstelle
来源/Werkzeuge信息 —— Klick auf展开
来源 Modbus Chinesisches Netzwerk(modbus.cn) —— Inländisch führend.ModbusKommunikationsprotokoll Technologie Gemeinschaft Klassifizierung Das Drehbuch von LUA / Entwicklung von HMI / HMI 字数 3478 字 · 阅读约 9 Unterteilung钟 更新 2026-08-05 永久链接 https://www.modbus.cn/51511.html
Empfohlene Werkzeuge: Modbus Debugger-Assistent WeChat-Applet
Modbus Chinesisches Netzwerk官方推出的Modbus Debugging-Tools,支持 Modbus RTU/TCP 实时KommunikationTests、Register.读写、线圈控制、Daten监控和MeldungUnterteilung析。 keine Installation erforderlich,Mikro-Suche「Modbus DebuggingAssistenten.」Benutzt werden kann.。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
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.