Visual HMI LUAはModbusのマスターマルチスレーブを行います:start_read/select_slave実戦とピット

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

前に、プロジェクトではModbusマスターと画面があると述べましたが、“1つのマスターマルチスレーブ+複雑なロジック”(2つのスレーブの電力合計を読み取る、条件に従ってレジスタを書き込む、コイルをバッチで書き込むなど)に遭遇し、画面バインディング変数だけでは不十分であり、LUAスクリプトでCommunicationを引き継ぐ必要があります。この記事ではModbus関連のLUA APIについて説明し、コードはすべて大規模なドキュメントの実際のルーチンであり、エンジニアの視点からの注釈とピットストップのヒントを追加しました。

✔️適用範囲:HMI M DXシリーズ例として、Modbusの2つのスレーブステーション、ステーション番号10と20があり、ロジックはFX 2 N/FX 3 Uマスターと同じです。

1.コアCommunication API

1.1 start_read--バックグラウンドでの自動ポーリング最も一般的

マスターモードでスレーブレジスタを定期的に読み込むスケジューリング関数。呼び出し後、システムはそれをCommunicationキューに追加し、サイクルごとに自動的にリクエストを送信し、データをHMIメモリイメージに書き込みます。get_uint16/get_float直接読み取りキャッシュ、通信遅延なし

start_read(index, vtype, addr, quantity, cycle, cycle_run, mode)
パラメータタイプの種類説明書は
indexnumberタスクインデックス0~127、stop_read時に使用
vtypenumberデータ型VT_3x / VT_4xなど
addrnumberレジスター·アドレス
quantitynumber読み取り数1~120
cyclenumberポーリング周期の倍数、0=周期ごとに読み込み
cycle_runnumberサイクル中の実行回数(0ベース、サイクルが必要)
modenumber0=連続読み取り(デフォルト)/ 1= 1回のみ読み取り
スケジュールの本質:cycle/cycle_runは周波数分割に使用されます。高周波数変数(速度、temperature)c =0サイクルごとに読み込み;低周波数変数(积算量、ステータスワード)c =5、c_run=4 5サイクルごとに読み込み、バス負荷の低減。例として:
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_idHMI 内部リスト添字0、1、20 =最初のマシン
Modbus駅番号デバイスの物理アドレス10, 33
️最も簡単な間違い:slave_id =0はステーション番号10に対応し、slave_id =1はステーション番号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シングル
️注意:書く前にfeed_dog()をしてください。LUAスクリプトは画面上のリアルタイムタスクで実行され、長い間犬に餌を与えないと、死んだループが死んだときにウォッチドッグによって殺され、画面が再起動します。ループまたは時間のかかるロジックは、間隔にfeed_dogを追加します。

計量校正の例(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コイル値テーブル
デバッグのヒント:Modbus Slaveソフトウェア+仮想シリアルポートペアを使用したオンライン検証では、画面をホストとして、コンピュータをスレーブとして、リアルタイムで総電圧/総電力変化を確認します。実際のマシンよりもはるかに速いです。

この記事は、Visual HMI開発ドキュメントLUAチュートリアル“Modbusアプリケーション”chapterから整理されており、コードとAPIはオリジナルの忠実さであり、著作権はDai Technologyが所有しており、ここにエンジニアの注釈と重要な注釈が追加され、学習参考としてのみ使用されます。

Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.