IEC 61850 MMS 드라이버
개요
IEC 61850 MMS (Manufacturing Message Specification) — 발전소 / 변전소 / ESS / 풍력단지 자동화의 국제 표준. ISO 풀 스택 (TPKT → COTP → ISO Session → ISO Presentation → ACSE → MMS) 위에서 동작. 자체 자바 ASN.1/BER 구현(외부 의존 없음).
| 항목 | 값 |
|---|---|
opc_type | IEC61850 |
| 구현 클래스 | plantpulse.driver.protocol.iec61850.IEC61850Driver |
| 라이브러리 | 자체 자바 구현 (외부 의존 없음, ASN.1 BER 자체 작성) |
| 상속 | BaseProtocolDriver |
| read | OK (ReadRequest → AccessResult(MmsValue), 폴링) |
| write | OK (isWriteSupported() = true) |
| 보안 | 없음 (IEC 62351 미구현) |
| 기본 포트 | 102 (TCP) |
폴링 read 에 더해, report-control-blocks 로 지정한 RCB 에 대해 연결 시마다 RptEna=true(+옵션 GI=true)를 MMS write 해 리포트 구독을 자동 복원합니다. InformationReport(unsolicited push)는 lastReportByVariable 캐시로 처리하고, read 는 TTL(report-cache-ttl-ms) 이내의 신선한 캐시만 서빙 — 만료 시 폴링 폴백.
클래스 구조 (위에서 아래로)
TCP
└ ISO TPKT (RFC 1006) — Tpkt.java
└ ISO COTP (Class 0) — Cotp.java
└ ISO Session — IsoSession.java
└ ISO Presentation — IsoPresentation.java
└ ACSE — Acse.java
└ MMS (ASN.1 BER) — MmsPdu.java + Asn1.java + MmsAddress.java
연결 시퀀스(connect()): COTP CR → CC → Session CONNECT(Presentation CP / ACSE AARQ / MMS Initiate-Request 캡슐화) → AARE → MMS Initiate-Response 디코드 검증. 상수 DEFAULT_TPDU_SIZE = 0x0B(2048 byte, IEC 61850 권장). 세션은 한 개만 사용 — transact() 가 synchronized 로 트랜잭션을 직렬화하고 응답 invokeID 를 검증(불일치 = stale reject + 소켓 무효화).
OPC 등록 옵션
| 키 | 기본 | 설명 |
|---|---|---|
opc_agent_ip / opc_agent_port | port 0 이면 102 | IED IP / 포트 |
options.connect-timeout | 5000 ms | TCP connect 타임아웃 |
options.read-timeout | 5000 ms | read SO 타임아웃 |
options.enable-information-report | false | BRCB/URCB 리포트 활성화 여부 |
options.report-control-blocks | (없음) | 콤마 구분 RCB 참조 목록 — 예: LD0/LLN0$BR$brcb01 (점 표기 허용) |
options.report-gi | true | RCB 활성화 직후 GI=true write 로 general interrogation(최신값 전량 재수신) |
options.report-cache-ttl-ms | 30000 ms | 리포트 캐시 신선도 TTL — 만료 시 폴링 폴백. <=0 은 만료 비활성 |
태그 plc_address 형식
MmsAddress 가 LD/LN.DO.DA[$FC] 표기와 wire 표기(LD/LN$FC$DO$DA) 둘 다 허용합니다. 슬래시(/)는 domain/item 구분, 점(.)은 wire 변환 시 $ 로 치환됩니다.
| 표기 | 의미 |
|---|---|
IED1Server/MMXU1.MX.A.phsA | 도메인 IED1Server / Item MMXU1$MX$A$phsA |
IED1Server/MMXU1$MX$A$phsA | wire 표기 동일 |
LD1/LLN0.Mod.stVal | LD LD1, LN LLN0, DO Mod, DA stVal |
FC(Functional Constraint)는 $FC 로 명시하거나 표준 위치($MX / $ST 등)를 포함해 표기합니다.
Read / Write
- read:
buildReadRequest→transact()(synchronized) →parseReadResponse→AccessResult(MmsValue) 를 문자열로 반환. InformationReport 는 응답 대기 중 인터리브로 들어와도 캐시 처리 후 계속 대기. 연속 read 실패 3회(READ_FAIL_STREAK_LIMIT)면 connected 하강 — 엣지 복구(PLCRecovery) 발동. - write:
isWriteSupported() = true.data_type→ MmsValue 매핑:
data_type 별칭 | MmsValue |
|---|---|
boolean / bool | bool |
integer / int / long / short / byte | integer (long 파싱) |
unsigned / uint / ulong | unsigned |
float / double / real / floating-point | floating |
octet-string / octet / bytes | octet |
visible-string / string / "" / varchar | visible |
mms-string / utf8 | mmsString |
| 그 외 | visible (폴백) |
data-access-error 코드는 WriteResponse.errorCode 로 노출됩니다.
미지원 영역
- GOOSE / Sampled Values (multicast) — 별도 raw-Ethernet 스택 필요.
- SCL (.icd / .scd) 파싱 — 데이터 모델 자동 발견 불가, 사용자가 수동 입력.
- IEC 62351-3/-6 — TLS / 인증 / 무결성 보호 없음.
본 구현은 ASN.1 BER 유틸리티가 spec 정확하나, 실 IED 와의 wire-level 완전 호환은 차후 phase 입니다. 운영 적용 전 충분한 검증을 권장합니다.
참고
- IEC 61850-7-2 (ACSI), -8-1 (mapping to MMS), ISO 9506 (MMS). ASN.1 BER — ITU-T X.690.
- 코드:
plantpulse-edge-driver/src/plantpulse/driver/protocol/iec61850/.