연결 목록 / 태그 목록 (/ui/connect/list) — 컬럼 / 액션 완전 가이드
게이트웨이가 알고 있는 모든 OPC(연결) 목록 과 그 안의 태그 목록 을 한 화면에서 보고 — 시작 / 중지 / 편집 / 삭제 / 값 쓰기 / 즉시 읽기 까지 모두 처리하는 운영 핵심 화면 입니다.
홈 카드 연결된 목록 (N) → 클릭, 또는 직접 http://<게이트웨이>/ui/connect/list.
1. 화면 구조
┌────────────────────────────────────────────────────────────────┐
│ ⊙ 연결 목록 [←] [↻] [+ 연결 추가] │
├────────────────────────────────────────────────────────────────┤
│ [OPC 목록 테이블 — 14개 컬럼] │
│ PLC | 프로토콜 연결상태 OPC ID ... 수집상태 액션 │
│ ───────────────────────────────────────────────────────── │
│ (행 클릭 → 아래 태그 테이블 채워짐 / 행 하이라이트) │
├────────────────────────────────────────────────────────────────┤
│ 선택된 연결의 TAG 목록을 표시합니다 │
│ [태그 목록 테이블 — 14개 컬럼] │
│ ▣ TAG ID TAG 명 ... 마지막 값 업데이트시간 액션 │
└────────────────────────────────────────────────────────────────┘
MOTOR_SENSE 프로토콜의 OPC 를 선택하면 태그 테이블 대신 HEALTH INDEX / SIGNAL 카드 컨테이너 가 표시됩니다 (별도 절 참고).
2. 상단 바 — 버튼
| 버튼 | 동작 |
|---|---|
| ← (백스페이스 아이콘) | /ui/main 으로 이동 |
| ↻ (sync 아이콘) | connect.search() — 목록 다시 조회 (자동 갱신은 데이터테이블이 알아서 — 강제 새로고침용) |
| + 연결 추가 (파란 버튼) | /ui/connect/connect 신규 연결 추가 화면으로 이동 |
3. OPC 목록 테이블 (14 컬럼)
/connect/opc/list API 결과를 DataTables 가 그립니다.
| # | 컬럼 | 의미 / 표시 |
|---|---|---|
| 1 | PLC | 프로토콜 | 프로토콜 별 로고 이미지 — MELSEC=mitsubishi.png / S7=siemens.png / MODBUS=modbus.svg / OPCUA=opcua.png / EIP=eip.png / LS=ls.png / GE=ge.png / PROFINET=profinet.png / FINS=fins.png / LOGIX=rockwell.png / CANOPEN=canopen.png / HTTP=http.png / OP=op.png / MOTOR_SENSE=MotorSense_Logo.svg |
| 2 | 연결 상태 | 라운드 뱃지 — 🟢 연결 / 🔴 끊김 / ⬜ 알수없음(시작 한 번도 안 함) |
| 3 | OPC ID | 고유 ID (예: OPC_LS_TEST) — 정렬 기준 (default ASC) |
| 4 | OPC 명 | 사용자 지정 이름 |
| 5 | 설명 | 자유 메모 |
| 6 | PLC IP | OPC 가 접속하는 PLC IP |
| 7 | PLC 포트 | OPC 포트 (LS 2004, S7 102, MODBUS 502 등) |
| 8 | 수집 주기 | timecycle (ms) — 우정렬, 천단위 콤마 |
| 9 | 자동 시작 | auto_collect=true 면 ✓, 아니면 - |
| 10 | 비동기 | async=true 면 ✓, 아니면 - |
| 11 | 연결된 태그수 | 이 OPC 에 등록된 태그 수 — 우정렬 |
| 12 | 수집 건수 | 누적 read 건수 (point_count) — 큰 숫자는 가로 스크롤로 보임 |
| 13 | 수집 상태 | 라운드 뱃지 — 🟢 정상 (scan_status=START, 회전 sync 아이콘) / 🟧 이상 (NOT COLLECT, 경고 삼각형) / ⬜ 중지 (STOP, 정지 아이콘) |
| 14 | 액션 | ▶ 시작 / ⏹ 중지 / 🔧 편집 / 🗑 삭제 (4 아이콘) |
3.1 액션 아이콘 — 자세히
| 아이콘 | 동작 | 호출 |
|---|---|---|
▶ 시작 (fa-play) | 수집 시작 | connect.start(opcId) → POST /connect/start |
⏹ 중지 (fa-stop) | 수집 중지 (TCP 연결은 유지) | connect.stop(opcId) → POST /connect/stop |
🔧 편집 (fa-wrench) | OPC 종류별 편집 화면으로 이동 (예: /ui/connect/ls 등 opc_type 따라 분기) | connect.edit(opcId&opcType) |
🗑 삭제 (fa-trash) | 확인 다이얼로그 → OPC + 하위 태그 일괄 삭제 | connect.del(opcId&opcType) |
OPC 삭제 시 그 아래 태그 row 와 함께 사라집니다. 시계열 데이터 (Cassandra tm_tag_point) 는 TTL 만료 전까지 그대로 남지만, 새 read 는 더이상 들어오지 않습니다.
3.2 연결 상태 vs 수집 상태 의 차이
같은 OPC 에 대해 두 상태가 다른 경우:
| 연결 | 수집 | 의미 |
|---|---|---|
| 🟢 연결 | 🟢 정상 | 정상 동작 |
| 🟢 연결 | 🟧 이상 | TCP 연결은 살아있지만 read 응답이 일정 시간 안 들어옴 — PLC 프로그램 / 주소 오타 / 권한 의심 |
| 🟢 연결 | ⬜ 중지 | 사용자가 ⏹ 중지 누른 상태 |
| 🔴 끊김 | ⬜ 중지 | 정상적인 시작 안 함 상태 |
| 🔴 끊김 | 🟧 이상 | 한 번 동작했었으나 PLC 가 끊어짐 — IP/포트/방화벽 점검 |
| ⬜ 알수없음 | ⬜ 중지 | 등록만 하고 한 번도 시작 안 한 신규 OPC |
4. 행 선택 → 태그 목록
OPC 행 클릭 시:
- 그 행이 selected 클래스로 하이라이트 (다른 행 해제)
connect.tag_list(opcId)호출 → 그 OPC 의 태그를 가져와 아래 태그 목록 테이블 에 그림- 그 OPC 의
opc_type이MOTOR_SENSE면 태그 테이블 대신 HEALTH INDEX / SIGNAL 카드 컨테이너 표시
행 선택 결과는
window.__connect_list_selected_opc_id에 저장 — 태그 인라인 쓰기 시 opc_id 파라미터로 사용.
5. 태그 목록 테이블 (14 컬럼)
선택된 OPC 안의 태그들을 표시. 마지막 값 / 시간 / read 상태가 페이지 안에서 주기적으로 갱신됩니다 (writejs.value() — 별도 폴링).
| # | 컬럼 | 의미 / 표시 |
|---|---|---|
| 1 | (아이콘) | 태그 아이콘 (fa-tag) |
| 2 | TAG ID | 고유 ID (예: TAG_LS_TEST_1000) |
| 3 | TAG 명 | 사용자 지정 이름 |
| 4 | 설명 | 자유 메모 |
| 5 | 데이터 타입 | Integer / Boolean / Float / Long / String 등 |
| 6 | PLC 주소 | PLC 프로토콜별 주소 (예: D1000, ns=2;s=...) |
| 7 | PLC 데이터 포맷 | 형식 옵션 (X / B / W / DW / Float 등 — 드라이버별 read/write 의 정밀 분기에 사용) |
| 8 | 계산 | 계산식 (fomula) — ${VALUE} * 10 처럼 단순 산술 적용 |
| 9 | 수집 건수 | 누적 read 건수 — 우정렬 |
| 10 | 마지막 값 | 최근 값 — 녹색 배경 + 흰글씨. 큰 텍스트(STRING/배열) 는 셀이 가로 스크롤 |
| 11 | 마지막 업데이트 시간 | 어두운 회색 배경 + 흰글씨, ms 까지 |
| 12 | 읽기 상태 | 🟢 SUCCESS (녹색) / 🔴 ERROR (빨강) |
| 13 | 읽기 에러 메세지 | 상태가 ERROR 일 때만 채워짐 — 빨간 배경 + 흰글씨 |
| 14 | 액션 | ✏ 쓰기 / 🔄 즉시 읽기 (2 아이콘) |
5.1 태그 액션 — 자세히
✏ 쓰기 (fa-pen)
해당 태그에 한 번 값을 쓰는 인라인 액션.
1. 클릭 → prompt 창: "태그 [<TAG_ID>] 에 쓸 값을 입력하세요"
2. 값 입력 후 OK → confirm: "<OPC_ID> / <TAG_ID> 에 [<VALUE>] 쓰기?"
3. POST /connect/write { tag_id, opc_id, value }
4. 성공 시 toastr: "쓰기 완료: <TAG_ID> = <VALUE>"
5. 서버가 write 직후 같은 connection 으로 즉시 read 한 결과를 함께 반환:
- 동일 ↔ 동일하지 않음 비교 후 추가 안내
· "읽기 확인" (info) — 같음 → 정상
· "읽기 결과 다름" (warning) — PLC 자체 프로그램이 즉시 덮어쓴 가능성
6. 약 800ms 후 화면의 마지막 값 셀도 자동 갱신
내부적으로 ConnectService.tagWriteByTagId() 가 PLC 프로토콜에 따라 분기 (HTTP / OPC-UA / Modbus / MELSEC / S7 / LS / EIP 모두 지원).
실설비 태그에 쓰기 전에 시뮬레이터 OPC 또는 테스트 태그 로 검증하세요. write 권한은 운영팀과 합의된 태그에만.
🔄 즉시 읽기 (fa-sync-alt)
수집기 캐시를 우회하고 PLC 에서 지금 직접 read.
GET /api/v1/tag/<TAG_ID>/value?fresh=true
→ 성공: toastr.info "지금 읽기: <TAG_ID> = <VALUE>"
→ 값 없음: toastr.warning "읽음 (값 없음): <TAG_ID>"
→ 실패: toastr.error "읽기 실패: ..."
수집 주기가 긴 PLC (예: 30초) 에서 수동 갱신 용. 자주 쓰면 PLC 부하가 늘어납니다.
6. MOTOR_SENSE 전용 영역
opc_type=MOTOR_SENSE OPC 를 선택하면 태그 테이블 대신 다음이 표시됩니다.
6.1 상태 정보 영역
| 항목 | 의미 |
|---|---|
| 마지막 업데이트 시간 | MOTOR_SENSE 자산의 가장 최근 데이터 시점 |
| 읽기 상태 | SUCCESS / ERROR |
6.2 HEALTH INDEX 섹션
❤ 아이콘 + 자산별 카드 — 가로 스크롤. 각 카드에 자산 ID + 측정 지표 (level, alarm 등). 카드 색: 옅은 파랑 배경 + 진한 파란 테두리.
6.3 SIGNAL 섹션
📶 아이콘 + 자산별 카드 — 가로 스크롤. 시계열 시그널 메트릭. 카드 색: 옅은 회색.
두 섹션 모두 자산이 많아도 카드가 옆으로 무한히 늘어나도록 세로 스크롤은 막고 가로 스크롤만 허용.
7. 자주 빠지는 함정
| 증상 | 원인 / 해결 |
|---|---|
| 행 클릭해도 태그 테이블이 비어있음 | 그 OPC 에 등록된 태그가 없음. 편집 으로 들어가 태그 추가 |
| 연결 인데 수집 이상 | 주소 형식 / 데이터 타입(format) / PLC Write 권한 점검 |
| 마지막 값 셀이 한참 안 갱신됨 | 수집 주기(timecycle) 가 길거나 PLC 가 변하지 않는 값 — 즉시 읽기 로 강제 read |
| ✏ 쓰기 후 읽기 결과 다름 경고 | PLC 프로그램이 1초 안에 자체 덮어씀. 정상일 수 있음 (lockout 코일 등) |
| 마지막 값이 너무 길어 읽기 어려움 | 그 셀에 가로 스크롤바가 자동 생김 — 셀 안에서 좌우 스크롤 |
| MOTOR_SENSE 카드가 비어있음 | 자산 검색이 아직 안 됨 (/connect/motor-sense/asset-list 미응답) — 잠시 기다리거나 OPC 재시작 |
| 시작 직후 수집 상태 가 알수없음 | scan loop 가 아직 첫 사이클을 안 돌았음 — timecycle + α 만큼 기다림 |
| 삭제 직후 다시 추가하니 알수없음 으로 다시 시작 | 정상 — auto_collect 가 on 이면 자동으로 연결 + 정상 으로 전환 |
8. 더 알아보기
- 신규 연결 추가: 새 PLC 연결 추가
- 태그 등록 / 편집: 태그 등록
- 시계열 차트로 보기: 수집 이력 보기
- 테스트/데모: 외부
plantpulse-simulator또는 테스트 태그 사용 - 모터센스: 모터센스 (Motor Sense)
- 동일 데이터를 코드로 다루기: REST API, 플로우 (Node-RED)