컨텐츠로 건너뛰기

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 가능)

  • 네 번째 이후 카메라에도 같은 규칙이 그대로 이어집니다. 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_HZ·FREQ_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_01, FX_02 등으로 올바르게 설정되었는지 다시 한 번 확인합니다. (가장 흔한 원인)

  • 일부 값(주파수 등)이 이상하게 읽힐 경우:

    • 클라이언트의 데이터 타입 설정이 레지스터 맵의 타입(S16/U16/U32)과 일치하는지 확인합니다. 특히 2개 레지스터를 사용하는 FREQ_LOW_HZ·FREQ_HIGH_HZ는 DWORD 계열 타입으로 읽어야 합니다. (섹션 4의 데이터 타입 설정 화면 참고)

7. 관련 문서