국책과제 시험 리그의 온도·압력 사이클을 HTTP API로 상위 시스템에 넘기는 구성

국책과제 시험 리그에서 데이터가 끊기는 지점
국책과제 개발 단계의 시험 리그는 설비 한 대로 끝나지 않습니다. 가열부는 LS PLC가 잡고, 가압부는 Modbus TCP 장비가 따로 붙으며, 온도센서와 압력센서는 다시 별도 변환기에 물려 있는 경우가 많습니다. 사이클을 돌릴 때마다 값은 쌓이지만, 그 값이 MES나 CIM 같은 상위 시스템까지 올라가지 못하고 담당자 노트북에만 남는 일이 반복됩니다.
막히는 곳은 계측이 아니라 인터페이스입니다. 과제 보고서에 넣을 시험 리그 온도·압력 사이클 기록은 어떤 조건에서 언제 수집됐는지가 함께 남아야 하는데, 수집 장치마다 프로토콜이 다르면 형식을 맞추는 일부터 손이 갑니다. 이 글은 HTA 홈에서 소개하는 EASY-LINK PRO와 EASY LOGGER를 묶어, 시험 리그 데이터를 HTTP API로 상위 시스템에 넘기는 인터페이스 설계를 정리합니다.
EASY-LINK PRO로 시험 리그 신호를 모으는 구성
EASY-LINK PRO는 현장 PLC 네 대까지 동시에 읽어 상위로 올려 주는 게이트웨이입니다. CH1부터 CH4까지 채널마다 프로토콜, 국번, 통신 속도, 데이터 타입, 시작 주소, 읽을 개수를 따로 정하므로 제조사가 뒤섞인 시험 리그에 그대로 맞출 수 있습니다. 시험 리그의 PLC 연동 구간은 이 채널 단위로 나눠 잡습니다.
- CH1 — ModbusRTU, RTU SLAVEID 3, RTU BAUDRATE 19200. 온도센서 변환기를 RS-485로 읽습니다.
- CH2 — LS XGT FNET, TCP IP ADDRESS 192.168.0.110, TCP IP PORT 2004. 압력센서 값이 올라오는 D 영역을 Float로 읽습니다.
- CH3 — ModbusTCP, TCP IP PORT 502, 03_ReadHolding_Registers. 40000번대 주소에서 사이클 카운터를 읽습니다.
- CH4 — Disable. 예비 채널은 값을 남겨 둔 채 Disable만 걸어 둡니다.
Float와 Double Word는 값 하나가 2워드를 쓰므로, D100부터 세 개를 읽으면 실제 대상은 D100, D102, D104입니다. 주소를 1씩 세다가 값이 어긋나는 사고가 이 지점에서 가장 많이 납니다. 값이 터무니없이 크거나 부호가 뒤집혀 보이면 ENDIAN 네 가지를 차례로 넣고 모니터 화면에서 맞는 순간을 잡는 편이 빠릅니다. 채널당 상한은 논리값 100개, 원시 워드 200개입니다.

채널마다 프로토콜과 통신 속도를 따로 잡아 시험 리그 신호를 모읍니다
EASY LOGGER가 맡는 저장과 전달
EASY LOGGER는 그 값을 받아 쌓고 내보내는 운영 계층입니다. MAIN 설정의 CONNECTION PROTOCOL에서 EASY-LINK를 고르고 PRODUCT를 EASY-LINK PRO로 지정하면, 장치가 MQTT로 발행한 값을 EASY LOGGER가 구독해 받습니다. 브로커 출처는 Self·관리자 MQTT 재사용과 External·장치 브로커 중에서 고릅니다.
수집 조건에는 SUBSCRIBE TOPIC, ROOT KEY, ADDRESSES, TRIGGER, STALE AFTER (MS)를 넣습니다. EASY-LINK PRO는 ROOT KEY가 RTU1 같은 채널 키이고, ADDRESSES에는 저장할 주소키를 쉼표나 공백으로 구분해 나열합니다. 토픽 스캔을 누르면 저장된 브로커에 실제로 들어오는 토픽과 키를 보여 주므로, 결과를 클릭해 입력란을 채우면 됩니다.
DATA TYPE은 반드시 맞춰야 합니다. LINK-PRO의 Word를 WORD (UInt16)로 잡으면 장치가 보낸 -21095가 44441로 저장되고 오류도 나지 않아 알아채기 어렵습니다. PLC NAME과 CONFIG NAME은 MQTT 토픽, API 엔드포인트, OPC-UA 노드 경로의 기준이 되므로 RIG1_PRESS처럼 현장에서 통하는 이름으로 처음에 정해 둡니다. STALE AFTER (MS) 시간 동안 수신이 없으면 값은 null로 저장되고 결함으로 표시됩니다. EASY LOGGER 대시보드에서 저장 이력과 전달 상태를 함께 확인합니다.

수집·저장·전달을 나눠 맡기면 어느 구간이 멈췄는지 바로 드러납니다
EASY LOGGER HTTP API 예제
시험 리그 값을 MES·CIM 쪽 데이터베이스로 넘기는 주 전달 대상은 HTTP API입니다. API 설정 화면에서 대상 주소와 인증을 넣고 발행할 수집 설정을 고르면, EASY LOGGER가 POST로 JSON 본문을 보냅니다. 상위 시스템이 쓰기 결과를 되돌려 받아야 하면 write_callback_url에 callback endpoint 주소를 넣습니다. 아래는 한 사이클 값이 나가는 형태입니다.
{
"method": "POST",
"plc_name": "RIG1_LINKPRO",
"config_name": "RIG1_CYCLE",
"content_type": "application/json",
"root_key": "RTU1",
"write_callback_url": "http://192.168.0.60:8080/rig1/write-result",
"values": {
"RIG1_TEMP_01": 182.4,
"RIG1_PRESS_01": 6.35,
"40001": 128
}
}
저장한 뒤에는 Endpoint Preview에서 PLC NAME과 CONFIG NAME으로 만들어진 실제 주소가 의도한 대로 나오는지 보고, API Payload Log에서 전송 건수와 마지막 오류 시각을 확인합니다. 화면 맨 아래 STATUS 표시등의 API가 정상으로 바뀌는지도 함께 봅니다.
쓰기 경로를 함께 열 때는 아래 여섯 줄을 그대로 지킵니다.
- 테스트 주소만 사용합니다.
- 최소 권한만 부여합니다.
- 허용 주소 범위를 제한합니다.
- PLC 인터록을 확인합니다.
- 수동 복구 절차를 준비합니다.
- WRITE CALLBACK을 호출합니다.
전달 대상을 고를 때의 판단 기준
상위 시스템과의 데이터 연동 방식은 EASY LOGGER 기준으로 네 갈래입니다. 같은 수집 값을 MQTT, HTTP API, OPC-UA로 내보낼 수 있고, 저장은 MariaDB나 MySQL 또는 장비 내부 CSV로 남깁니다.
HTTP API는 요청과 응답이 한 건씩 짝을 이루므로, 과제 보고 체계처럼 전송 성공 여부를 건별로 남겨야 하는 인터페이스에 맞습니다. MQTT는 값이 바뀔 때마다 밀어 올리기에 유리하고 브로커에서 내려오는 명령으로 PLC 쓰기까지 됩니다. 다만 브로커 한 대가 더 필요하고 토픽 설계를 먼저 잡아야 합니다.
MySQL은 장기 이력을 그대로 쌓아 두고 나중에 조회·집계하기 좋지만, 과제 주관 기관 데이터베이스에 직접 접속 권한을 받아야 하는 부담이 있습니다. Firebase는 외부 클라우드를 쓰는 구성이라 폐쇄망 시험동에서는 선택하기 어렵습니다. 실무에서는 상위 전달은 HTTP API로 하고, 원본 한 벌은 EASY LOGGER 안의 MySQL 또는 로컬 CSV에 남기는 구성을 많이 씁니다. DB 저장과 CSV 저장은 동시에 켤 수 없으므로 한쪽을 고릅니다.
시험 리그 한 대부터 넓혀 가는 순서
처음부터 리그 전체를 붙일 필요는 없습니다. 시험 리그 한 대에 EASY-LINK PRO를 먼저 붙여 CH1과 CH2만 채우고, EASY LOGGER에서 수집 조건 하나를 만들어 저장 설정 목록의 STATUS가 RUNNING으로 바뀌는지 봅니다. 값이 맞는 것을 확인한 뒤 HTTP API 발행을 켜고, 같은 방식으로 단계적으로 리그 수를 늘립니다.
시험동이 떨어져 있으면 EASY LOGGER의 WireGuard VPN을 함께 씁니다. .conf 파일을 업로드해 저장하고 VPN Enable을 켠 뒤, VPN 상태에서 SERVICE가 RUNNING이고 LATEST HANDSHAKE가 계속 갱신되는지 확인합니다. 연결을 유지해야 하면 Persistent Keepalive에 보통 25를 넣습니다.
다른 구성 사례는 블로그 글 목록에 정리해 두었고, 시험 데이터를 검증 화면으로 잇는 방식은 시험 압력 데이터를 검증 대시보드로 연결하는 운영 기준에서 이어서 보실 수 있습니다.
현재 쓰고 계신 PLC와 계측기 목록만 있으면 채널 배분과 주소 범위를 먼저 잡아 드립니다. 현장 연결 가능 여부만 먼저 확인해 보셔도 됩니다.