VisualHMI Lua API: Rückruf / Kommunikation / Register-Lese - Schreib-Funktionen Quick Checklist

kostenlosKostenloses technisches Material

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

Das ist das Skript der VisualHMI-Plattform Lua.für das Lua-Skript für die VisualHMI-Plattform10 System-Rückrufe + 32 Lesen - und Schreiben-Register - Funktionen + 10 Zeichnungsfunktionen, insgesamt 52 Schnittstellen Bevor Sie das Drehbuch schreiben, lesen Sie es schneller, als das Schreiben einzeln. Die Plattform basiert auf Lua 5.3

0. Basis: Automatisch generierte main.lua

Menü Engineering → Skript-Programmierung Standardmäßig generiert main.lua, automatisch mit dem entsprechenden Protokoll Datentyp Definition:

ENCRYPT_ = 0        -- LUA脚本加密开关
-- 数据类型定义(随协议变化,以下为 Modbus)
VT_LW = 1           -- 内部变量
VT_RW = 2           -- FLASH掉电存储
VT_0x = 10          -- 线圈
VT_1x = 11          -- 输入点(离散输入)
VT_3x = 12          -- 输入寄存器
VT_4x = 13          -- 保持寄存器

function on_init() end
function on_run(screen) end
function on_update(slave,vtype,addr) end
function on_draw(screen_id,control_id) end

Das FX3U-Protokoll enthält auch die Typen VT_M (internes Relay), VT_D (D-Register) und so weiter. Diese Konstanten werden für die ersten Argumente der vtype und get / set-Funktionen in on _ update verwendet.

1. Häufige Rückruffunktionen (10)

RückrufTrigger-ZeitpunktWichtige Punkte
on_init()Unmittelbar nach dem Laden des LUA durch das System eineInitialisierung durchführen, dofile laden andere lua, Schreiben des Anfangswertes
on_run(screen)Jeder Hauptzyklus-Zyklus ruft automatisch dieKernzyklus-Planung. Delay_ms / Long-Loop / Network Synchronization / Internal set_run_cycle () verhindert; Modbus Master-Station schrieb nicht auf Hochfrequenz Slave (Bus-Verstopfung)
on_update(slave,vtype,addr)TriggerDaten-Treiber nicht polling, wenn sich der Wert der Register / Variable ändert. Serial Port / Modbus-Master - Schreiben, set _ xxx in on _ update nicht ausgelöst (Recursive-Anti - Recursive); globalen EN _ ON _ UPDATE _ API _ CB Steuerschalter verfügbar
on_screen_change(screen)Nach Abschluss des BildwechselsInitialisierung / Status-Synchronisierung / Ressourcen-Lading
on_press(state,x,y)Berührung Zustandänderung, maximal einmal alle 100msstate: 0 Aufheben / 1 Drücken / 2 Langen Drücken (nur einmal durch Drücken ausgelöst); unteren Koordinaten, Punkte Leerzeichen auch auslöst
on_usb_inserted(driver)USB-Laufwerk Einfügen IdentifizierungTreiber als Festplattenzeichen, M-Serie ist "2:", mit globalen Variablen Aufzeichnen
on_usb_removed()USB-Laufwerk EntfernenGlobale Variablen
on_sd_inserted(dir)SD-Karte - Einfügung identifiziertdir Festplattenzeichen, M-Serie ist "1:"
on_sd_removed()SD-Karte - EntfernungClearzeichen Globale Variable
on_parse_timestamp(screen,control,timestamp)Alarm / Daten / Operationsprotokoll Tabelle Zeitfeld Formatierungcontrol muss ≠ 0 mit make_datetime(timestamp) zurückgeben benutzerdefinierte Zeitzeichenfolge

2.0; Lese - und Schreibregisterfunktionen (32)

2.0 Zwei Schlüsselmechanismen (allgemein für set / get)

Mechanismus 1: get_xxx () ist Null-Kommunikations - Kosten.Die get-Serie wird vollständig aus dem lokalen HMI-Cache (Speicherspiegel) gelesen und erzeugt keine seriellen Frames. Hintergrund-Aufgaben von HMI lesen automatisch Kommunikationsvariablen von der SPS (z. B. VT_3x / VT_4x für Modbus) und zwischengespeichern sie im Konstruktions-Konfigurations - Abfrage-Zyklus. Das Bildschirmsteuerelement bindet eine Adresse, die automatisch in die Polling-Liste gesetzt wird; das Skript liest die Adresse, die nicht vom Projekt verwiesen wurde, und fordert explizit die Synchronisierung mit start _ read an.

Mechanismus 2: set_xxx () sendet nicht unbedingt einen seriellen Port-Frame aus.Eine aktive Nachricht wird nur ausgeschickt, wenn zwei Bedingungen erfüllt sind: 1 HMI ist im Hostmodus (Modbus Master / DCBUS / XGUS); 2 Serial-Benachrichtigungen werden nicht durch set _ notify (0) verboten. Im Slave-Modus aktualisiert set nur das lokale Spiegel.

2.1 Kommunikationssteuerung

FunktionenParameterBeschreibung
set_notify(enable)0 Verbot / 1 Aktiviert (Standard)Schalter für Benachrichtigungssendungen für globale Serienanschlüsse. Set_notify (0) Set_xxx sendet keine seriellen Anweisungen nach dem Set_notify(1)
select_slave(slave_id)Wiederherstellung des Slave-Index 0im Multi-Slaven - Modus umschalten die nachfolgenden get / set-Zugriffe. slave_id ist ein Subindex des Arrays für die Schlavenliste und nicht die Bytefolge beim Austausch von Multibyte-Daten (uint16/32/float) mit einem Slave durch Modbus-Stationsnummer
set_endian(en)0 Groß (Standard) / KleinNur Kommunikationsprotokoll gültig, wenn es sich um Multibyte handelt
start_read(index,vtype,addr,quantity,cycle,cycle_run,mode)index0 ~ 127; quantity1 ~ 120; cycle-Polling - Multiplikator (Standard 0 = pro Zyklus); 0 - based im cycle_run-Zyklus; mode 0 dauert / 1 nur einmalAutomatische Hintergrund-Polling im Host-Modus. Kein Rückgabewert, die Daten werden mit get_xxx gelesen. mode = 1 Erfordert zuerst create _ response _ que ()
stop_read(index)Task-IndexStoppt die Angabe von Hintergrund-Leseaufgaben, Cache behält den letzten Wert
stop_all_read()-Stoppt alle skript-initiierten Leseaufgaben
set_auto_read(en)1Aktivieren (Standard) / 0 DeaktivierenGesamtschalter für das automatische Polling von Bildverbindungsvariablen. Start_read übernimmt
create_resp_que()-eine Antwort-Warteschlange erstellt, zusammen mit start_read (mode=1) ein einzelnes Lesen nach Bedarf
on_cmd_resp(slave,vtype,addr,count,ret,wr)ret0 Erfolg / 1 Ausnahme; wr0 Lesen / 1 SchreibenHost-Modus Kommunikation Ergebnisse asynchron Rückruf, Empfang einer Antwort oder Timeout-Trigger. Einmaliges Lesen erfolgreich.
set_slave_site(idx,slave_id)idx Slave-Index; slave _ id Neue Stationnummer (Modbus1 ~ 247)Dynamische Änderung der Slave-Station - Nummer während der Laufzeit, Anpassung an das Netzwerk vor Ort

2.2 - Bit-Betrieb

FunktionParameterBeschreibung
set_bit(vtype,addr,value,count)Wert 16 - Bit ohne Symbol, niedrige Count-Bits entsprechen dem Ziel-Bits (bit0 → addr, bit1 → addr + 1...); count Optional 1 - 16Batch-Bits - Schreiben. Modbus-Spule, X / Y / S / M von FX3U sind geeignet. Schreiben Sie mehrere Schalter auf einmal.
get_bit(vtype,addr)-Lesen Sie eine einzelne Stelle und geben 0 / 1 zurück. Lese aus dem lokalen Cache, Null-Kommunikations - Overhead

2.3 Numerisches Lese - Schreiben (16 / 32 / 64 Bit)

FunktionNumerischer BereichAdressbereich
set/get_uint16(vtype,addr,value)0 ~ 65535, Überschneidung & 0xFFFF1 Register
set/get_int16(vtype,addr,value)-32768 ~ +32767, Überschneidung & 0xFFFF1 Register.
set/get_uint32(vtype,addr,value)0 ~ 4294967295, Abkürzung & 0xFFFFFF2 Register
set/get_int32(vtype,addr,value)-2^31 ~ 2^31 - 12 Register
set/get_uint64(vtype,addr,value)0 ~ 2^64 - 14 Register
set/get_int64(vtype,addr,value)-2^63 ~ 2^63-14 Register
set/get_float(vtype,addr,value)IEEE 754 Single Precision2 Register
set/get_double(vtype,addr,value)IEEE 754 Double Precision4 Register

Alle get-Serie Lese-Local - Cache; set-Serie Kommunikation Trigger Siehe "Mechanismus II".

2.4 Zeichenfolgen und Batch

- FunktionenParameterBeschreibung
set_string(vtype,addr,str)str Maximal 2K Bytes, UTF - 8 oder GBKSchreiben einer Zeichenfolge in eine Adresssequenz
get_string(vtype,addr,len)len Optional, Standard 128 Bytes, maximal 2048Lesen einer Zeichenfolge, automatisch abgeschnitten
set_uint16_ex(vtype,addr,value1,...,valueN)bis zu 120 WerteVariable Parameter Massen-Schreiben in kontinuierliche Registers, geeignet für feste Parametermengen
set_array(vtype,addr,buff)Buff ist eine Lua-Tabelle (Wörterarray), maximal 120 WörterTabelle, die für programmatische / dynamische Daten generiert wird. Der Unterschied zu set_uint16_ex liegt in der Argumentation

3. Zeichnungsfunktionen (10)

Alle draw_xxx müssen in einemon_draw(screen_id,control_id)- Rückruf aufgerufen werden, um wirksam zu werden, und die Steuerelement-ID muss ≠ 0 sein. Die Ebenen werden anhand der Z-Achse des Steuerelements (Editor-Stapel - Reihenfolge) verwaltet und basierend auf der Beurteilung der control _ id-Schichten gemalt. Aktive Aktualisierung derredraw()

FunktionParameterBeschreibung
set_pen_color(color)RGB565: High 5 R (0 ~ 31) / Medium 6 G (0 ~ 63) / Low 5 B (0 ~ 31)Stellen Sie die Pinselfarbe (Vordergrund) fest. Rot 0xF800, Grün 0x07E0, Blau 0x001F, Weiß 0xFFFF, Schwarz 0x0000
draw_line(x0,y0,x1,y1,width)width1 ~ 10Zeichnen Sie eine Linie, Farbe wählen Sie den aktuellen Pinsel
draw_rect(x0,y0,x1,y1,fill)Füll 1 Füll / 0 RahmenLinks oberen Ecke + rechts unteren Ecke Koordinaten
draw_rect_alpha(x0,y0,x1,y1,alpha)alpha 0 ~ 255 Transparent (0 / 255 undurchsichtig)Durchsichtiges rechteckiges Rechteck, häufig verwendete Masken
draw_circle(x,y,r,fill)fill 0 Fest / Nicht0 Hohl (Wert als Linienstärke)Zentrum + Radius
draw_ellipse(x0,y0,x1,y1,fill)fill 0 Fest / Nicht0 HohlEingeschlossenes Rechteck definiert Ellipse
draw_image(image_id,frame_id,dstx,dsty,width,height,srcx,srcy)image_id Suche build/image.xml; frame_id Animierte Frames (Nicht animierte Frames = 0)Zeichnen Sie Bilder, unterstützt Zoom + Zuschneiden. image_id im Projekt-Build - Verzeichnis image.xml
draw_text(text,x,y,w,h,font_id,size,color,align,charcode)align 0 links / 1 Mitte / 2 rechts; charcode 0=UTF - 8 (Standard) / 1=GBKBereich Text-Zeichnung, Unterstützung für Multibyte-Zeichen
draw_surface(surface,x,y,w,h,srcx,srcy)surface für Bild / Leinwand-RessourcenBildschnittsanzeige, Multi-Layer - Synthese mit

4. Zeichnungsbeispiel: switch Tabelle-Treiber

Quelltext Alle Zeichnungsbeispiele sind eine Routine: on _ update Tastenwert lesen → redraw () → on _ draw Tastenwert Suche switch Tabelle Auswahl Zeichnungsfunktion. Zeichnen Sie eine Linie + Kreise als Beispiel:

draw_type = 0
mode = { line = 1, rect = 2, rect_alpha = 3, circle = 4, ellipse = 5, imageId = 6, text = 7 }

function on_update(slave,vtype,addr)
  if addr == 0x1000 then
    draw_type = get_uint16(VT_LW, addr)  -- 字设置按钮键值
    redraw()
  end
end

function on_draw(screen_id, control_id)
  local switch = {
    [mode.line] = function(control)
      if screen_id == 0 and control == 1 then
        set_pen_color(0xFFE0)          -- 黄色
        draw_line(225, 253, 405, 253)
        set_pen_color(0xF800)          -- 红色
        draw_line(508, 128, 508, 378, 5)
      end
    end,
    [mode.circle] = function(control)
      if screen_id == 0 and control == 1 then
        draw_circle(300, 253, 100, 0)  -- 实心圆
        draw_circle(450, 253, 150, 1)  -- 空心圆,线厚1
      end
    end,
  }
  if switch[draw_type] then switch[draw_type](control_id) end
end
Drei Punkte, die am leichtesten umgewandelt werden können:1get_xxx Lesen Sie den Cache nicht als Echtzeitwert- - um die Adresse des ungebundenen Steuerelements zu lesen, start_read synchronisieren;2set_xxx Senden Sie keine seriellen Frames im Slave-Modus.- - Es ist normal, dass die MCU nicht empfängt, nicht die Baudrate für einen halben Tag überprüfen;3on_run ist streng verboten, set_run_cycle () und delay_mszu verwenden, der Scheduler wird blockiert. Die Zeichnung muss in on _ draw platziert werden und die Steuerungs-ID ist nicht 0.

Aus dem VisualHMI-Entwicklungsdokument von Guangzhou Dacai Technology (hmi-doc.gz-dc.com) LUA-Tutorial „Lua Script API Function Interface", 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.