コンテンツにスキップ

Modbus 連携

FX Viewer Modbus 連携機能マニュアル

1. 機能紹介

FX Viewer のリアルタイム音響カメラデータ(ビームパワー、アラーム状態など)を外部システム(PLC、SCADA、HMI など)と連携するための Modbus TCP サーバー機能です。

この機能により、PLC のような外部制御装置から FX Viewer のカメラデータを監視し、一部の設定を直接制御できます。

2. 基本設定および接続情報

自動起動

FX Viewer プログラムが起動すると、Modbus サーバーは自動的に実行されます。別途の設定は必要ありません。

接続情報

  • IP アドレス: FX Viewer が実行中の PC の IP アドレス

  • ポート: 5020(既定)または 502

    • 1024 以下のポートを使用する権限がない環境を考慮し、サーバーは5020 ポートに優先的にバインドします。5020 ポートのバインドに失敗した場合、サーバーは 502 ポートでリッスンを試みます。

    • クライアントではまず 5020 ポートに接続してみて、接続できない場合は 502 ポートへの接続を試みてください。

  • プロトコル: Modbus TCP

3. カメラ設定

Modbus 機能が正常に動作するためには、カメラのニックネームを規定の形式で設定する必要があります。

⚠️ 重要: ニックネームが以下の規則と異なるカメラは Modbus 連携から除外されます。データが取得できない場合の最も多い原因ですので、連携の前に最初に確認してください。

Unit ID必須ニックネーム許容される他の形式Device ID
1FX_01FX01, FX-010x4601
2FX_02FX02, FX-020x4602
3FX_03FX03, FX-030x4603
  • 大文字と小文字は区別しません。fx_01 も可能)

  • 4 台目以降のカメラにも同じ規則がそのまま適用されます。Unit ID は FX Viewer に登録して使用するカメラの台数だけ順番に付与されます。

4. レジスタマップ

  • アドレス方式: PLC などのクライアントでは0 から始まるワイヤアドレス(Offset)の使用を推奨します。(例: 40009 番アドレス → 8 番アドレスで要求)
Modbus アドレスワイヤアドレスレジスタ名データ型R/W説明
400010DEVICE_IDU16R装置固有 ID(例: 0x4601
400021DEVICE_CONNECTEDU16Rカメラ接続状態(1: 接続、0: 切断)
400032YEARU16R現在時刻(年)
400043MONTHU16R現在時刻(月)
400054DAYU16R現在時刻(日)
400065HOURU16R現在時刻(時)
400076MINUTEU16R現在時刻(分)
400087SECONDU16R現在時刻(秒)
400098MAX_DBx10S16R最大音圧(dB 値 x 10)、例: 45.2dB → 452
400109ALARM_FLAGU16Rアラーム状態(1: アラーム発生、0: 正常)
4001110THRESH_DBx10S16R/Wしきい値(dB 値 x 10)、例: 42.5dB → 425
4001211THRESH_HOLDx10S16R/W保持時間(秒値 x 10)、例: 3.5 秒 → 35
40013-1412-13FREQ_LOW_HZU32R/W周波数下限(Hz)
40015-1614-15FREQ_HIGH_HZU32R/W周波数上限(Hz)

クライアントでのデータ型設定

PLC Modbus クライアントでレジスタアドレスごとにデータ型(INT、WORD、DWORD など)を選択する設定画面の例

PLC Modbus クライアントでレジスタアドレスごとにデータ型を選択する設定画面の例です。レジスタを 1 個使用する項目は上の表の型に合わせて、符号付き整数(S16)は INT、符号なし整数(U16)は WORD として読み取り、レジスタを 2 個(32 ビット)使用する FREQ_LOW_HZFREQ_HIGH_HZ は DWORD 系の型として読み取ります。

5. 主な機能と使用例(Python)

自動トリガーモードの有効化

  • PLC からしきい値(40011)や保持時間(40012)のレジスタに値を書き込むと、該当カメラの録画方式が「トリガー録画」モードに自動的に有効化されます。

⚠️ 注意: しきい値・保持時間レジスタへの書き込みには、カメラの録画方式を変更する副作用があります。データ監視のみが必要な場合は読み取り要求のみを使用し、書き込み要求はトリガー録画への切り替えを意図した場合にのみ送信してください。

Python サンプルコード

以下の例では Python の pymodbus ライブラリ(3.x 基準)を使用します。まずライブラリをインストールします。

Terminal window
pip install pymodbus

💡 参考: pymodbus はバージョンによって Unit ID を指定するキーワードが異なります。以下の例の slave= は 3.x 基準であり、旧バージョン(2.x)では unit= を使用します。インストールされているバージョンに合ったキーワードを使用してください。

from pymodbus.client import ModbusTcpClient
# FX Viewer が実行中の PC の IP とポートに設定
FX_VIEWER_IP = '127.0.0.1'
FX_VIEWER_PORT = 5020
client = ModbusTcpClient(FX_VIEWER_IP, port=FX_VIEWER_PORT)
client.connect()
# -- データ読み取り例 ---
# FX_01 カメラ (Unit ID = 1) のデータを読み取り
# ワイヤアドレス 8 番(MAX_DBx10)から 2 個のレジスタ(音圧、アラーム)を読み取り
result = client.read_holding_registers(8, count=2, slave=1)
if not result.isError():
max_db_x10 = result.registers[0]
alarm_flag = result.registers[1]
# 符号付き 16 ビットに変換してから 10 で割る
import struct
signed_max_db_x10 = struct.unpack('>h', struct.pack('>H', max_db_x10))[0]
print(f"FX_01 最大音圧: {signed_max_db_x10 / 10.0} dB")
print(f"FX_01 アラーム状態: {'発生' if alarm_flag == 1 else '正常'}")
# -- データ書き込み例 ---
# FX_02 カメラ (Unit ID = 2) のしきい値を 45.5 dB に設定
# ワイヤアドレス 10 番(THRESH_DBx10)に値を書き込み
new_threshold = 45.5
threshold_to_write = int(new_threshold * 10)
client.write_register(10, threshold_to_write, slave=2)
print(f"FX_02 しきい値を {new_threshold} dB に設定要求完了")
client.close()

実行結果の例

FX_01 カメラの最大音圧が 45.2 dB(レジスタ値 452)、アラームが正常状態のときの出力例です。

FX_01 最大音圧: 45.2 dB
FX_01 アラーム状態: 正常
FX_02 しきい値を 45.5 dB に設定要求完了

6. 問題解決 (Troubleshooting)

  • 接続できない場合:

    • FX Viewer PC の IP アドレスとポート(5020)が正しいか確認します。

    • Windows ファイアウォールのインバウンド規則でポート 5020 または 502 を許可しているか確認します。

  • データが 0 としか表示されない場合:

    • FX Viewer でカメラが有効になっており、リアルタイムデータが入ってきているか確認します。

    • カメラのニックネームFX_01FX_02 などに正しく設定されているか、もう一度確認します。(最も多い原因)

  • 一部の値(周波数など)が異常に読み取られる場合:

    • クライアントのデータ型設定がレジスタマップの型(S16/U16/U32)と一致しているか確認します。特にレジスタを 2 個使用する FREQ_LOW_HZFREQ_HIGH_HZ は DWORD 系の型として読み取る必要があります。(セクション 4 のデータ型設定画面を参照)

7. 関連文書