前に、プロジェクトではModbusマスターと画面があると述べましたが、“1つのマスターマルチスレーブ+複雑なロジック”(2つのスレーブの電力合計を読み取る、条件に従ってレジスタを書き込む、コイルをバッチで書き込むなど)に遭遇し、画面バインディング変数だけでは不十分であり、LUAスクリプトでCommunicationを引き継ぐ必要があります。この記事ではModbus関連のLUA APIについて説明し、コードはすべて大規模なドキュメントの実際のルーチンであり、エンジニアの視点からの注釈とピットストップのヒントを追加しました。
1.コアCommunication API
1.1 start_read--バックグラウンドでの自動ポーリング最も一般的
マスターモードでスレーブレジスタを定期的に読み込むスケジューリング関数。呼び出し後、システムはそれをCommunicationキューに追加し、サイクルごとに自動的にリクエストを送信し、データをHMIメモリイメージに書き込みます。get_uint16/get_float直接読み取りキャッシュ、通信遅延なし。
start_read(index, vtype, addr, quantity, cycle, cycle_run, mode)| パラメータ | タイプの種類 | 説明書は |
|---|---|---|
| index | number | タスクインデックス0~127、stop_read時に使用 |
| vtype | number | データ型VT_3x / VT_4xなど |
| addr | number | レジスター·アドレス |
| quantity | number | 読み取り数1~120 |
| cycle | number | ポーリング周期の倍数、0=周期ごとに読み込み |
| cycle_run | number | サイクル中の実行回数(0ベース、サイクルが必要) |
| mode | number | 0=連続読み取り(デフォルト)/ 1= 1回のみ読み取り |
start_read(0, VT_4x, 0x1000, 10)サイクルごとに4 x 1000 - 100 9を読むstart_read(1, VT_4x, 0x2000, 10, 3, 2)→ 3サイクルごとに4 x 2000 - 2009を読む1.2その他の管理機能
stop_read(index):個々のポーリングタスクをStopし、キャッシュは最後の値を保持するstop_all_read()すべてStop、リセット/緊急停止に適しています。set_auto_read(en):1=画面バインディング変数の自動読み取りを有効にする(デフォルト)、0=スクリプトのみstart_read高帯域幅シナリオに適したテイクオーバー
1.3 select_slave--スレーブを切り替える(キー)
飛行機からもっと、select_slave(slave_id)後続の一時的な指定get_xxx/set_xxxどのマシンを訪問するか。slave_idはスレーブリストの添字であり、Modbusステーション番号ではないことに注意してください。
| 用語集 | 意味の意味 | 例:例 |
|---|---|---|
| スレーブ·インデックスslave_id | HMI 内部リスト添字0、1、2 | 0 =最初のマシン |
| Modbus駅番号 | デバイスの物理アドレス | 10, 33 |
2、LUAリードレジスタ(オンライン判定付き)
読む前に避けるべき2つのこと:オンラインで判断する+駅から選ぶ。。プレゼンスシステム変数がexistenceしますVT_LW 0x01A3対応する場所。
- リードホールドレジスタ4 x
function mb_read_reg_03 slave
local onState = get_uint16_LW、0x01A3 --スレーブオンラインステータスワード
if onlineState slave 0x01 == 0x01 then--このスレーブはオンラインである。
select_slave slave これを機にカット。
return get_uint16 VT_4x addr - 読み取りキャッシュ
elseさん
falseを返す
End of Endシングル
End of Endシングル
-2つのスレーブ電力の合計を読み取り、LW領域に書き込みます。
function on_run screen
local Energy1 = mb_read_reg_03 0 0x0000
local Energy2 = mb_read_reg_03 1、0x0000
もしエネルギー 1 ~= falseとエネルギー 2 ~= false
set_uint16_LW、0x1000、Energy1 + Energy2
End of Endシングル
End of Endシングル3. LUA書き込みレジスタ
単一の保持レジスタへの書き込み0 x 0 6
function mb_write_reg_06 slave addr value
local onState = get_uint16_LW、0x01A3
if onState slave 0x01 == 0x01 then
feed_dog ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
select_slave slave
set_uint16 VT_4x addr value
真のリターン
elseさん
falseを返す
End of Endシングル
End of Endシングル計量校正の例(3つの校正モード)、表示on_updateコールバックはLW変数に基づいて分岐します:
function on_update slave vtype
vtype == VT_LWとaddr == 0 x 100 4の場合
local mode = get_uint16 VT_LW、0x1003
mode === 0の場合
mb_write_reg_06 0 0x1002 57 ゼロ校正です。
elseif mode === 1 then
local w = get_uint16 VT_LW、0x1005 少しでも校正。
mb_write_reg_06 0 0x1002 w
elseif mode == 2 then
local c = get_uint16 VT_LW、0x1006 - 物理的なキャリブレーション
local s = get_uint16 VT_LW 0x1007
C 0とS 0の場合
mb_e_reg_06 0 0x1002 s*w//c
End of Endシングル
End of Endシングル
End of Endシングル
End of Endシングル四、バッチ书き込みコイル(0 x 0Fパッケージ)
Visual HMIバッチ書き込みコイルの最小単位は16ビットアライメントです。以下の機能は完全にカバーされています。独自の非システムAPI。14個のコイル値を結合する方法を示します。
mb_e_coil_15 slave_id coils
--slave_idスレーブインデックス; addr開始アドレス; coilsTbコイル値テーブルこの記事は、Visual HMI開発ドキュメントLUAチュートリアル“Modbusアプリケーション”chapterから整理されており、コードとAPIはオリジナルの忠実さであり、著作権はDai Technologyが所有しており、ここにエンジニアの注釈と重要な注釈が追加され、学習参考としてのみ使用されます。
Leave a Reply