개발공부/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
개발 진행 방향
- Modbus TCP Test 통신에서 전송 중인 동작 상태와 알람 데이터를 1초마다 수집
- 수집한 데이터를 InfluxDB에 적재
- DB - Modbus
- Measurement - python_plugin
- Filed key - run_status, alarm_status
- 데이터 수집 중 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()