개발공부/Data Collection

[Modbus] #2-1 Modbus TCP 통신 데이터 수집 및 InfluxDB 적재

Dev. Dong 2025. 2. 9. 09:00

Modbus TCP 통신 데이터 수집 및 InfluxDB 적재 


개요

아래의 이전 게시물에서 Python을 통해 Modbus TCP 데이터 전송 용 Test를 진행하였다. Modbus TCP 통신에서 데이터를 수집하고 InfluxDB v1 버전에 적재하는 Python Plugin 을 개발할 예정이다.

 

[Modbus] Modbus 소개 및 Modbus TCP test 통신 구축

 

[Modbus] #1 Modbus 소개 및 Modbus TCP test 통신 구축

Modbus 소개 및 Modbus TCP test 통신 구축Modbus란?PLC와 함께 사용하기 위한 데이터 통신 프로토콜으로, 산업용 전자 장치를 연결하는 방법이다. 프로토콜 전송 계층으로 케이블이나 이더넷 네트워크

dev-dong-log.tistory.com

 


개발 진행 방향

  1. Modbus TCP Test 통신에서 전송 중인 동작 상태와 알람 데이터를 1초마다 수집
  2. 수집한 데이터를 InfluxDB에 적재
    • DB - Modbus
    • Measurement - python_plugin
    • Filed key - run_status, alarm_status
  3. 데이터 수집 중 Modbus TCP 종료 시 10초에 한번씩 재연결 시도

개발

import time
from pymodbus.client.sync import ModbusTcpClient
from influxdb import InfluxDBClient

MODBUS_SERVER_IP = "127.0.0.1"
MODBUS_SERVER_PORT = 502
INFLUXDB_HOST = "127.0.0.1"
INFLUXDB_PORT = 8086
INFLUXDB_DATABASE = "modbus"

modbus_client = ModbusTcpClient(MODBUS_SERVER_IP, port=MODBUS_SERVER_PORT)
influx_client = InfluxDBClient(host=INFLUXDB_HOST, port=INFLUXDB_PORT, username='admin', password='admin')

if INFLUXDB_DATABASE not in [db["name"] for db in influx_client.get_list_database()]:
    influx_client.create_database(INFLUXDB_DATABASE)
influx_client.switch_database(INFLUXDB_DATABASE)

# modbus connection check & reconnetion
def check_modbus_connection():
    while not modbus_client.connect():
        print("Modbus Server Not Connection. try agin after 10s")
        time.sleep(10)
    print("Modbus Server Connection Success")

# data store
def collect_and_store_data():
    print('data collection ~ing')
    while True:
        alarm_status = modbus_client.read_coils(0, 1).bits[0]  # alarm status
        run_status = modbus_client.read_coils(1, 1).bits[0]  # run status
        # InfluxDB store format
        json_body = [
            {
                "measurement": "python_plugin",
                "fields": {
                    "run_status": int(run_status),
                    "alarm_status": int(alarm_status)
                }
            }
        ]
        influx_client.write_points(json_body)
        time.sleep(1)

# data collection start
try:
    check_modbus_connection()
    collect_and_store_data()
except KeyboardInterrupt:
    print("data collection exit")
finally:
    modbus_client.close()
    influx_client.close()