PLC Engineer's Field Notes

Practical solutions for industrial automation


[실전] 미쓰비시 PLC 소켓통신 로직, 왜 송신·수신 포트를 분리할까?

분명히 Ping도 정상이고 연결(ESTABLISH)도 잡혔습니다. 그런데 이상하게 데이터만 한 번씩 빠집니다.

어제는 잘 되다가 오늘 갑자기 멈추기도 하죠. 이럴 때 설비를 열어보면, 대개 한 포트에 송신과 수신을 억지로 몰아넣은 경우가 많습니다.

“연결됐다고 끝난 게 아닙니다.”

왜 현장 사수들이 굳이 포트를 두 개로 쪼개라고 하는지, 실제 로직을 보면서 이유를 짚어보겠습니다.
포트 번호, 역할, 누가 먼저 접속하는지 개념이 헷갈린다면 먼저 “포트 열어주세요” 들었을 때 바로 확인할 것들 글을 보고 오셔도 좋습니다.


1. 한 포트에 몰아넣으면 생기는 문제

IP 하나에 포트 하나만 쓰면 설정은 간편해 보입니다. 하지만 통신량이 조금만 늘어나면 바로 타이밍 싸움이 시작됩니다.

  • 타이밍 충돌: 내가 보낼 때 상대도 던지면 응답이 꼬입니다.
  • 디버깅 지옥: 이게 송신 에러인지 수신 대기 문제인지 구분이 안 됩니다.
  • 병목 현상: 송신 처리가 길어지면 수신 데이터는 뒤로 밀려버립니다.

이러면 현장에서는 사람 미칩니다. 원인이 안 보이니까요.


2. 해결책: 송신·수신 포트의 논리적 분리

가장 확실한 방법은 ‘듣는 통로’와 ‘말하는 통로’를 처음부터 나누는 것입니다.

[Fig.1] (동일 IP 환경에서 수신용 9001번, 송신용 9011번 포트를 분리 설정한 화면)

👉 포트 번호만 다르게 가져가도 수신 대기와 송신 처리를 PLC 내부에서 독립적으로 운영할 수 있습니다.

실제 현장에서 한 IP에 여러 채널을 어떻게 나눠 쓰는지는 [실전] GX Works2 Open Setting 사례 분석: 설계 의도를 읽는 법 글도 같이 보면 감이 빨리 잡힙니다.


3. 수신 채널: “계속 듣고 있어야 합니다”

상대 장비가 언제 데이터를 던질지 모릅니다. 그래서 수신 채널은 항상 문을 열어두는 것이 원칙입니다.

[Fig.2] (수신 전용 포트 활성화를 위한 ZP.OPEN 로직)

※ 로직 상에서 수신 채널을 먼저 오픈해서 상시 접속 상태를 유지하세요.
그래야 상대가 데이터를 툭 던졌을 때 즉각 반응할 수 있습니다.

저도 처음에는 연결 상태가 애매해서 많이 헷갈렸습니다.
PING도 되고, 설정도 맞는 것 같은데 실제 데이터가 들어오는지 확신이 안 섰습니다.

그때 가장 확실했던 방법이 수신 완료 신호마다 카운터를 올려보는 것이었습니다.

데이터가 들어올 때마다 카운터 값이 1, 2, 3 계속 올라가는 걸 보고 나서야,

“아, 설정만 맞은 게 아니라 실제 통신이 되고 있구나.”

확신할 수 있었습니다.

현장에서는 진단창보다 이런 단순한 확인 로직이 더 빠를 때가 많습니다.

✔ 수신 완료 비트 ON 시 카운터 +1
✔ HMI에서 카운터 변화 확인
✔ 일정 시간 변화 없으면 미수신 의심
✔ 들어오는 주기까지 같이 보면 더 정확함

통신은 ‘연결됨’ 표시보다, 실제로 데이터가 들어오고 있는지 확인하는 것이 더 중요합니다.


4. 데이터 처리: 읽고 나서 비우기

통로가 열리고 데이터가 들어오면, PLC는 수신 버퍼의 값을 읽어와 내부 메모리에 옮깁니다.

[Fig.3] (ZP.BUFRCV 명령을 사용하여 데이터를 읽어오는 로직)

여기서 제가 한 번 크게 당한 적이 있습니다.

데이터는 한 번 정상적으로 들어왔는데, 처리 후 메모리를 제대로 비우지 않았습니다.
그러다 보니 다음 사이클에서 새 데이터가 들어온 줄 알고 이전 값을 다시 적용해버렸습니다.

통신은 끊긴 게 아니었습니다.
데이터도 읽히고 있었습니다.
문제는 읽은 뒤 정리하는 로직이 빠져 있었다는 것입니다.

그래서 수신 완료 플래그를 확인한 뒤에는 바로 파싱하고, 처리가 끝난 데이터 영역은 반드시 초기화해야 합니다.

✔ 수신 완료 플래그 확인
✔ 데이터 파싱
✔ 적용 완료 후 수신 데이터 영역 Clear
✔ 다음 데이터와 이전 데이터가 섞이지 않는지 확인

이 부분을 빼먹으면 현장에서는 이렇게 보입니다.

“통신은 살아 있는데 값이 왜 한 박자씩 이상하지?”
“새 데이터가 아닌데 PLC가 또 반응하네?”
“장비는 정상인데 로직이 헛값을 잡네?”

데이터 읽기보다 중요한 건, 읽은 뒤 이전 값을 남기지 않는 것입니다.


5. 송신 채널: 필요할 때만 가동

송신 채널은 수신 상태와 상관없이 PLC가 주도권을 가지고 명령을 날리는 통로입니다.

[Fig.4] (송신 전용 포트 제어 및 송신 대기 로직)

수신 채널과 물리적으로 분리되어 있어 타이밍 간섭이 없습니다. 덕분에 응답 속도가 제각각인 타사 장비와 통신할 때 안정성이 비약적으로 올라갑니다.


6. 포트를 나누면 얻는 유지보수 장점

처음 보면 괜히 복잡해 보입니다. 채널을 왜 두 개나 쓰나 싶죠. 하지만 시운전 들어가면 체감이 확 됩니다.

  • 장애 포인트 명확: 말을 못 하는 건지, 듣지를 못하는 건지 플래그만 보면 바로 압니다.
  • 확장성: 송신량이 급증해도 수신 채널은 영향을 안 받습니다.
  • 스트레스 감소: 상대방 장비와 타이밍 맞추느라 머리 싸맬 필요가 없습니다.

마무리하며

“통신은 속도보다 구조입니다.”

단순히 통신 연결 성공(Ping)에 만족하지 마세요. 현장의 거친 환경에서도 스스로 복구되고 데이터가 엉키지 않는 구조를 만드는 것이 엔지니어의 진짜 실력입니다.

지금 간헐적인 데이터 누락으로 고생하고 있다면, 당장 포트 분리 설계부터 검토해 보세요. 실무에서는 이 작은 차이가 퇴근 시간을 결정합니다.