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ückruf | Trigger-Zeitpunkt | Wichtige Punkte |
|---|---|---|
on_init() | Unmittelbar nach dem Laden des LUA durch das System eine | Initialisierung durchführen, dofile laden andere lua, Schreiben des Anfangswertes |
on_run(screen) | Jeder Hauptzyklus-Zyklus ruft automatisch die | Kernzyklus-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) | Trigger | Daten-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 Bildwechsels | Initialisierung / Status-Synchronisierung / Ressourcen-Lading |
on_press(state,x,y) | Berührung Zustandänderung, maximal einmal alle 100ms | state: 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 Identifizierung | Treiber als Festplattenzeichen, M-Serie ist "2:", mit globalen Variablen Aufzeichnen |
on_usb_removed() | USB-Laufwerk Entfernen | Globale Variablen |
on_sd_inserted(dir) | SD-Karte - Einfügung identifiziert | dir Festplattenzeichen, M-Serie ist "1:" |
on_sd_removed() | SD-Karte - Entfernung | Clearzeichen Globale Variable |
on_parse_timestamp(screen,control,timestamp) | Alarm / Daten / Operationsprotokoll Tabelle Zeitfeld Formatierung | control 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
| Funktionen | Parameter | Beschreibung |
|---|---|---|
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 0 | im 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) / Klein | Nur 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 einmal | Automatische 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-Index | Stoppt 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 Deaktivieren | Gesamtschalter 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 Schreiben | Host-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
| Funktion | Parameter | Beschreibung |
|---|---|---|
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 - 16 | Batch-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)
| Funktion | Numerischer Bereich | Adressbereich |
|---|---|---|
set/get_uint16(vtype,addr,value) | 0 ~ 65535, Überschneidung & 0xFFFF | 1 Register |
set/get_int16(vtype,addr,value) | -32768 ~ +32767, Überschneidung & 0xFFFF | 1 Register. |
set/get_uint32(vtype,addr,value) | 0 ~ 4294967295, Abkürzung & 0xFFFFFF | 2 Register |
set/get_int32(vtype,addr,value) | -2^31 ~ 2^31 - 1 | 2 Register |
set/get_uint64(vtype,addr,value) | 0 ~ 2^64 - 1 | 4 Register |
set/get_int64(vtype,addr,value) | -2^63 ~ 2^63-1 | 4 Register |
set/get_float(vtype,addr,value) | IEEE 754 Single Precision | 2 Register |
set/get_double(vtype,addr,value) | IEEE 754 Double Precision | 4 Register |
Alle get-Serie Lese-Local - Cache; set-Serie Kommunikation Trigger Siehe "Mechanismus II".
2.4 Zeichenfolgen und Batch
| - Funktionen | Parameter | Beschreibung |
|---|---|---|
set_string(vtype,addr,str) | str Maximal 2K Bytes, UTF - 8 oder GBK | Schreiben einer Zeichenfolge in eine Adresssequenz |
get_string(vtype,addr,len) | len Optional, Standard 128 Bytes, maximal 2048 | Lesen einer Zeichenfolge, automatisch abgeschnitten |
set_uint16_ex(vtype,addr,value1,...,valueN) | bis zu 120 Werte | Variable 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örter | Tabelle, 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()。
| Funktion | Parameter | Beschreibung |
|---|---|---|
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 ~ 10 | Zeichnen Sie eine Linie, Farbe wählen Sie den aktuellen Pinsel |
draw_rect(x0,y0,x1,y1,fill) | Füll 1 Füll / 0 Rahmen | Links 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 Hohl | Eingeschlossenes 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=GBK | Bereich Text-Zeichnung, Unterstützung für Multibyte-Zeichen |
draw_surface(surface,x,y,w,h,srcx,srcy) | surface für Bild / Leinwand-Ressourcen | Bildschnittsanzeige, 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
endAus 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.
Antwort veröffentlichen