Visual HMI PlatformのLua Scriptです。完全なAPIマニュアル:10個のシステムコールバック+ 32個の読み書きレジスタ関数+ 10個の描画関数、合計52個のインタフェース。スクリプトを書く前にこの記事を読んでください。チュートリアルを読むよりも早いです。プラットフォームはLua 5.3に基づく。
0.基本生成されたmain.lua
メニューエンジニアリング→スクリプトプログラミングはデフォルトでmain.luaを生成し、プロトコル対応のデータ型定義を自動的に使用します。
ENCRYPT_= 0 --LUAスクリプト暗号化スイッチ データ型定義(プロトコルにより変更、以下Modbus) VT_LW = 1 - 内部変数 _RW = 2 - フラッシュパワーダウンストレージ VT_0 x = 10 【COIL】 VT_1 x = 11 --入力点離散入力 VT_3x = 12 --入力レジスタ VT_4x = 13 - レジスタを保持する function on_end function on_run screen end function on_update slave vtype addr end function on_w screen_id_id end
FX 3 Uプロトコルには、VT_M(内部リレー)、VT_D(Dレジスタ)などのタイプもあります。on_updateのvtypeとget/set関数の最初の引数は、これらの定数を使用します。
1.一般的なコールバック関数(10)
| コールバック | トリガー·タイミング | 主なポイント |
|---|---|---|
on_init() | システムがLUAをロードした直後に1回実行 | 初期化、dofile-他のluaのロード、初期値の書き込み |
on_run(screen) | メインサイクルごとに自動呼び出し | コアサイクルスケジュール。delay_ms/ロングサイクル/ネットワーク同期/内部set_run_cycle;Modbusマスタ時別高周波書き込みスレーブバス渋滞 |
on_update(slave,vtype,addr) | レジスタ/変数の値が変化したときにトリガー | データ駆動型はポーリングしません。シリアルポート/Modbusマスタ書き込み、on_update set_xxxはトリガされません(再帰防止);グローバルEN_ON_UPDATE_API_CB制御スイッチ |
on_screen_change(screen) | 画面切り替え完了後 | 初期化/同期/リソースロード |
on_press(state,x,y) | 最大100msごとにタッチ状態が変化する | state 0持ち上げ/1押し/2長押し(押して1回だけトリガー);下の座標、点空白もトリガー |
on_usb_inserted(driver) | ディスク挿入認識 | driverはドラフト、Mシリーズは“2”で、グローバル変数でされる |
on_usb_removed() | ディスクを取り出す。 | クリア文字グローバル変数 |
on_sd_inserted(dir) | SDカード挿入認識 | dir文字、Mシリーズは“1” |
on_sd_removed() | SDカードを取り出す。 | クリア文字グローバル変数 |
on_parse_timestamp(screen,control,timestamp) | アラーム/データ/アクションレコードフォームの時間フィールドのフォーマット | controlは≠0でなければなりません。make_datetime timestampでカスタム時刻列を返します。 |
2.読み書きレジスタ関数(32個)
2.0 2つの重要なメカニズム(すべてのセット/get共通)から始めましょう。
メカニズム1 get_xxxはCommunicationオーバーヘッドがゼロです。getシリーズはすべてHMIローカルキャッシュ(メモリイメージ)から読み取り、シリアルフレームを生成しません。HMIバックグラウンドタスクは、PLCから通信変数(ModbusのVT_3 x/VT_4 xなど)を自動的に読み取り、エンジニアリング設定のポーリングサイクルごとにキャッシュします。画面コントロールはアドレスにバインドされ、そのアドレスは自動的にポーリングリストに入ります。スクリプトはプロジェクトによって参照されていないアドレスを読み取り、start_readで明示的に同期を要求します。
メカニズム2:set_xxx()は必ずしもシリアルフレームを送信しません。HMIがホストモード(Modbus Master/DCBUS/XGUS)であること、シリアルポート通知がset_notify(0)によって禁止されていないことの2つの条件のみがアクティブに送信されます。スレーブモードでは、setはローカルミラーのみを更新します。
2.1通信の制御
| 関数の機能 | パラメータ | 説明書は |
|---|---|---|
set_notify(enable) | 0禁止/1イネーブルデフォルト | グローバルシリアルポート送信通知スイッチ。set_notify(0)の後、set_xxxはシリアルコマンドを発行せず、set_notify(1)を再開する。 |
select_slave(slave_id) | インデックス0から。 | マルチスレーブモードで後続のget/setアクセスのスレーブを切り替える。slave_idは、Modbusステーション番号ではなく、エンジニアリングスレーブリストの配列インデックスです。 |
set_endian(en) | 0ビッグエンディアン既定のnCloth/1リトルエンディアン | マルチバイトデータ(uint16/32/float)スレーブとする际のエンディアン。Communicationプロトコルがマルチバイトを含むのみ有効 |
start_read(index,vtype,addr,quantity,cycle,cycle_run,mode) | index 0~127;quantity 1~120;cycleポーリングの倍数デフォルト0=サイクルごと; cycle_runサイクル内の回数0-based;mode 0持続/1回のみ | ホストモードバックグラウンドで自動ポーリング。戻り値はなく、データはget_xxxで読み取りキャッシュされます。mode=1はcreate_resp_queの場合 |
stop_read(index) | タスクインデックス | 指定されたバックグラウンド読取りタスクをStopし、キャッシュは最後の値を保持します |
stop_all_read() | - | すべてのスクリプト起動読み取りタスクをStopします。 |
set_auto_read(en) | 1有効-デフォルト/0不可 | 画面バインド変数ポーリングのトータスイッチ。0以降はstart_readが完全に引き継ぐ |
create_resp_que() | - | start_read mode=1を使用して、単一のオンデマンド読み取りを行うレスポンスキューを作成します。 |
on_cmd_resp(slave,vtype,addr,count,ret,wr) | ret 0成功/1例外;wr 0読み取り/1書き込み | ホストモード通信結果非同期コールバック、応答の受信、タイムアウトトリガー。1回の読書の成功 |
set_slave_site(idx,slave_id) | idxスレーブインデックス;slave_id新しい局番号1~247 | 動的にスレーブステーション番号を変更し、現場ネットワークに適応 |
2.2ビットOperation。
| 関数の機能 | パラメータ | 説明書は |
|---|---|---|
set_bit(vtype,addr,value,count) | value 16ビット符号なし、下位countビットは対象ビットに対応するbit0→ bit1→ +1;countは1~16を选択する | batch bit writeです。Modbusコイル、FX3UのX/Y/S/MのどちらでもOKです。1回のCommunicationで複数のスイッチを書き込み |
get_bit(vtype,addr) | - | 1ビットを読み取り、0/1を返します。ローカルキャッシュからの読み取り、Communicationオーバーヘッドゼロ |
2.3数値の読み書き(16/32/64ビット)
| 関数の機能 | 値の範囲 | アドレススパン |
|---|---|---|
set/get_uint16(vtype,addr,value) | 0~65535、切り捨て0xFFFFを超えています。 | 1位レジスタ |
set/get_int16(vtype,addr,value) | -32768~+32767、カットオフ0xFFFFを超えています。 | 1位レジスタ |
set/get_uint32(vtype,addr,value) | 0~4294967295、切り捨て0 x FFFFFFFF | 2つのレジスタ |
set/get_int32(vtype,addr,value) | -2^31~2^31-1 | 2つのレジスタ |
set/get_uint64(vtype,addr,value) | 0~2^64-1 | 4つのレジスタ |
set/get_int64(vtype,addr,value) | -2^63~2^63-1 | 4つのレジスタ |
set/get_float(vtype,addr,value) | IEEE 75 4単精度 | 2つのレジスタ |
set/get_double(vtype,addr,value) | IEEE 75 4倍精度 | 4つのレジスタ |
すべてのgetシリーズはローカルキャッシュを読み取り、setシリーズは“メカニズム2”を参照してください。
2.4文字列とバッチ
| 関数の機能 | パラメータ | 説明書は |
|---|---|---|
set_string(vtype,addr,str) | str最大2 Kバイト、UTF-8またはGBK | 文字列をアドレスシーケンスに書き込む |
get_string(vtype,addr,len) | lenオプション、デフォルト128バイト、最大20 4 8 | 文字列の読み取り、自動トランケート |
set_uint16_ex(vtype,addr,value1,...,valueN) | 最大120個の値 | 可変パラメータ一括書き込み連続レジスタ、固定パラメータセットに適した |
set_array(vtype,addr,buff) | buffはLuaテーブル(ワードの配列)で、最大120ワードです。 | プログラム生成/動的データに適した一括書き込みテーブル。set_uint16_exとの違い |
3.描画機能(10)
draw_xxxはon_draw(screen_id,control_id)コールバック呼び出しが有効になるには、コントロールID ≠ 0でなければなりません。レイヤーはコントロールZ軸(エディタの重ね順)で管理され、control_idによってレイヤー化されます。アクティブ·リフレッシュ·トーンredraw()。
| 関数の機能 | パラメータ | 説明書は |
|---|---|---|
set_pen_color(color) | RGB565上位5ビットR 0~31/中6ビットG 0~63/下位5ビットB 0~31 | ブラシ前景のカラーを設定します。赤0xF800、緑0x07E0、青0x001F、白 0xFFFF、黒0x000 |
draw_line(x0,y0,x1,y1,width) | width 1~10 | 現在のブラシに線を引く色を取る |
draw_rect(x0,y0,x1,y1,fill) | fill 1パディング/0ボーダー | 左上隅+右下隅座標 |
draw_rect_alpha(x0,y0,x1,y1,alpha) | アルファ0 - 255(0透明/255不透明) | 半透明のソリッド長方形、マスクレイヤでよく使われる |
draw_circle(x,y,r,fill) | fill 0ソリッド/非ゼロボイド値は線の厚さ | 半径+半径。 |
draw_ellipse(x0,y0,x1,y1,fill) | fill 0ソリッド/非ゼロ中空 | 外接矩形楕円の定義 |
draw_image(image_id,frame_id,dstx,dsty,width,height,srcx,srcy) | image_id build/image.xml; frame_idアニメーションフレーム非アニメーション=0 | ズーム+トリミングをサポートした画像の描画。image_idプロジェクトbuildディレクトリimage.xmlで調べる |
draw_text(text,x,y,w,h,font_id,size,color,align,charcode) | align 0左/1中央/2右;charcode 0=UTF-8デフォルト/1=GBK | エリアテキスト描画、マルチバイト文字サポート |
draw_surface(surface,x,y,w,h,srcx,srcy) | Surfaceは画面/キャンバスのリソースです。 | 画面切り抜き表示、マルチレイヤー合成用 |
4.図面例:switchテーブル駆動
ソーステキストすべての描画例はルーチンです:on_update読み取りボタンキー → redraw → on_drawキー値チェックswitchテーブル選択描画関数。線+円を描く場合:
draw_type = 0
mode = { line = 1 rect = 2 rect_= 3 le = 4 pse = 5 imageId = 6 text = 7 }
function on_update slave vtype
addr === 0 x 1000の場合
draw_type = get_uint16 VT_LW addr--ワード設定ボタンのキー値
redraw
End of Endシングル
End of Endシングル
function on_w screen_id_id
ローカルスイッチ= {
[mode.line] = function
screen_id == 0とcontrol == 1の場合
set_pen_color 0xFFE0 - 黄色です。
draw_line 225、253、405、253
set_pen_color 0xF800 【赤】
draw_line 508、128、508、378、5
End of Endシングル
end
[mode.circle] = function control
screen_id == 0とcontrol == 1の場合
draw_circle 300 253 100 0--ソリッドの円
draw_circle 450 253 150 1--中空円、線の厚さ1
End of Endシングル
end
}
if switch[w_type] then switch[w_type]_id end
End of EndシングルGuangzhou Dai Tech Visual HMI開発ドキュメント(hmi-doc.gz-dc.com)から整理されたLUAチュートリアル“Lua Script API Function Interface”、著作権はDai Dai Technologyに帰属します。
Leave a Reply