S2F23에 S2F0이 돌아왔다 — 기능 미구현인지 통신 게이트인지 바이트로는 못 가린다
같은 세션에서 S2F23이 두 번 S2F0으로 돌아온 캡처. 원인은 E30 통신 게이트와 기능 미구현으로 서로 다른데 응답 바이트는 SystemBytes만 빼고 같다.
글
HMI/SCADA, 산업 통신, 알람, 태그, 히스토리언을 현장 업무 흐름에 맞춰 정리한 노트입니다.
같은 세션에서 S2F23이 두 번 S2F0으로 돌아온 캡처. 원인은 E30 통신 게이트와 기능 미구현으로 서로 다른데 응답 바이트는 SystemBytes만 빼고 같다.
Select.rsp와 Linktest.rsp는 장비가 고른 Session ID로 온다. 데이터 메시지 응답만 보낸 값을 그대로 돌려준다. 캡처 세 판.
알람 연동 테스트는 통과하는데 현장에서 알람이 안 온다. 호스트가 보낸 S5F1에 ACKC5 0이 왔고, 정작 호스트 몫인 S10F3은 abort였다.
한 소켓에 S1F13, S3F17, S14F1, S16F11을 던진 캡처. GEM은 답하고 GEM300이 쓰는 stream 셋은 SxF0으로 끊겼다.
씹힌 Linktest.req로 T6가 만료돼도 같은 소켓의 S1F1은 0.3 ms 만에 S1F2로 답했지만, 장비가 SELECTED여도 host는 E37대로 끊는 게 맞다.
S1F4 body에는 SVID가 없다. SVID 번호와 이름을 S1F11/S1F12로 먼저 받아오는 실제 byte, 그리고 S2F29와 갈리는 지점.
SELECTED는 E37, COMMUNICATING은 E30이다. S1F13/S1F14 전에 보낸 S1F3이 S1F0 abort로 돌아오는 과정을 실제 byte로 본다.
S2F29로 ECID 목록을 받고 S2F13으로 값을 읽는다. 요청과 응답이 위치로만 묶이는 구조와 없는 ECID, S2F0이 오는 두 경우를 실제 byte로 확인한다.
정의하지 않은 RPTID를 link하면 설비마다 답이 다르다. S2F33/35/37 순서와 LRACK 5, DRACK 3, ERACK 0을 실제 byte로 본다.
설비 시계가 밀리면 link는 멀쩡한데 MES의 run 재구성이 어긋난다. S2F17로 읽고 S2F31로 맞추는 절차와 TIACK 0의 함정을 실제 capture로 본다.
화면은 ONLINE인데 S2F41 START가 HCACK 2로 거절된다. E30 통신 상태와 제어 상태를 나누고 HCACK이 0이 되는 자리를 capture로 짚는다.
설비 없이 host driver 검증: S1F13부터 S2F31까지 E30 startup 10단계를 npx 한 줄로 돌린다. PASS가 증명하는 것과 wire capture.
없는 Stream, 없는 Function, 깨진 본문을 리스너에 보낸 캡처. 돌아온 건 S9 하나와 SxF0 abort다. E5 stream 9와 MHEAD 읽기.
장비는 SystemBytes를 검사하지 않고 그대로 돌려준다. 같은 값으로 요청 두 개를 동시에 띄운 실제 캡처와, 호스트가 지켜야 할 SystemBytes 할당 규칙.
호스트 로그에 timeout 한 줄만 있을 때 T3와 T6를 실제 캡처로 가른다. E37 기본값(T3 45초, T6 5초, T7 10초, T8 5초)까지.
PPBODY 300바이트가 와이어에서는 330바이트가 된다. S7F1/S7F2 승인 단계를 건너뛴 호스트가 무엇을 잃는지 실제 S7F1·S7F3 캡처로 본다.
3ms 만에 떨어지는 connection refused와, TCP는 붙었는데 아무도 Select를 걸지 않는 경우. HSMS Active/Passive 짝을 실제 캡처로 구분한다.
HSMS는 SELECTED인데 S1F13은 조용히 T3만 태운다. 같은 소켓에서 Linktest는 0ms에 답하는 실제 캡처와, 상태 기계가 두 개인 이유.
S1F3 본문을 실제 소켓에 실어 본 캡처. 아이템 헤더 한 바이트가 포맷 코드와 길이 바이트 수를 어떻게 나눠 갖는지, 길이가 1 틀리면 무슨 일이 나는지.
HSMS 리스너에 Deselect.req, Reject.req, 미할당 SType 두 개를 보낸 캡처. 전부 무응답인데 Linktest는 돌아오고 세션은 SELECTED다.
패시브 HSMS 리스너 하나에 호스트 둘을 붙인 실제 캡처. 둘 다 Select Status 0을 받고, 먼저 붙은 쪽은 두 번째가 붙은 걸 끝까지 모른다.
S1F1에 S1F2가 안 오고 T3만 터진다면 헤더 바이트 2를 먼저 본다. W-bit과 Stream이 한 바이트에 같이 사는 탓에 생기는 두 가지 버그를 실제 캡처로.
부하 때만 응답을 놓치는 호스트는 TCP 읽기를 메시지로 착각한 파서다. 합쳐진 write, 쪼개진 write, 모자란 바디, 1 MiB 길이 접두어 캡처.
호스트를 내렸는데 장비는 아직 SELECTED다. Separate.req로 끝낸 세션과 소켓만 닫은 세션을 실제 캡처로 나란히 놓고 무엇이 다른지 본다.
HSMS에서 살아 있음과 연결됨은 다르다. Select 전에 Linktest와 S1F13을 보낸 캡처, E37의 Reject.req reason 4, 먼저 터지는 타이머.
실제 소켓에서 받은 Select.rsp 캡처. 수락, E37 Select Status 1·2·3 거절, 다른 SessionID 응답. select failed가 버리는 바이트.
Select 타임아웃 한 줄 뒤에는 무응답, SystemBytes 불일치, SessionID 불일치가 섞여 있다. 실제 패킷과 E37 T5·T6·T7로 구분한다.
장비는 응답했는데 호스트는 타임아웃을 낸다. 실제 캡처로 SystemBytes 불일치를 바이트 단위로 맞춰 보고, 프레임이 버려지는 이유와 T3가 아니라 T6인 이유까지.
Rework loop가 들어가면 WIP와 수율이 틀어진다. Visit number, disposition, 설비 event를 맞는 step instance에 묶는 법.
MQTT 페이로드를 바꿀 때 HMI, 히스토리언, MES connector가 조용히 깨지지 않게 schema version을 관리하는 법.
EC 쓰기에 EAC 0이 왔는데 아홉 lot이 이전 값으로 돌았다. E5 EAC code, S2F13 readback, S2F29 namelist, SAT용 EC 시험표.
계기 고장으로 태그가 11시간 full scale에 붙었다. 품질 검토를 통과하는 audit trail로 구간을 보정하는 법과 raw sample을 남기는 이유.
E30 spooling은 S2F43으로 허용한 stream만 대상이다. SPOOL LOAD/UNLOAD, S2F44 RSPACK/STRACK, S6F24 RSDA 캡처.
야간 교대 report의 good count가 4개 어긋난다. PLC counter, historian delta, S6F11 시각, spool drain 중 먼저 볼 곳.
E5 HCACK/CPACK을 실제 S2F41 capture로 읽는다. HCACK=4, E30 control state, T3 만료 후 START 중복을 막는 retry.
Event frame과 batch segment는 경계가 맞아야 쓸모 있다. 시작·종료 트리거 위치, 캡처할 속성, 닫히지 않은 frame 처리.
설비 event로 lot 이력을 만들 때 깨지는 곳: lot context, GEM clock, spool replay 순서, split/merge, correction.
S2F33/S2F35/S2F37로 collection event를 define, link, enable하는 순서, restart 후 report가 비는 이유, S6F11 검증법.
MES 비가동 사유 코드를 현장에서 제대로 선택되게 만드는 법. 입력 프롬프트 타이밍, PackML 상태 기반 자동 분류, 리포트에 실제로 필요한 필드까지 정리했습니다.
S5F1은 ALCD, ALID, ALTX다. ALCD 8번 비트가 set/clear를 정하고, 놓치면 MES 알람이 안 꺼진다. 재시작 후 S5F5/S5F6 복구까지.
HMI, SCADA, MES, 히스토리언을 역할 기준으로 구분하고 현장 아키텍처에서 어디까지 책임져야 하는지 정리합니다.