서론
현재 진행중인 프로젝트가 LS PLC XGT를 사용중이다.
이놈 보통놈들과 다르게 까다롭다.
TCP 연결 개수 제한도 걸려있고 콜백을 안뱉고 소켓을 공중분해시켜버려 시퀀스상 필요로 동기로 소켓구현을 하였는데 Exception이 터져버리며 초단위동안 하트비트를 못읽어와 알람을 띄워주신다.
심지어는 같은 PLC에 설비가 여러개 묶여있으면 A설비에서 A1 달라하고 B설비에서 B1달라하는데 B설비가 때마침 달라한다고 B설비한테 A1을 줘버린다.
패킷분석 돌려봐도 원인을 찾을수가 없다.
PLC제어 담당자는 자기도 모른단다 자기는 분명 비트 잘 올라오니 이상없단다. 배째라식이고 고객사는 열불터지니 누구라도 해결은 해야겠고 그게 결국 나라는게 스트레스를 받는다.
분명 헤더가 있으면 응답을 줄 때 매칭을 해서 줘야하는데 왜 막주는지 모르겠다. 뭐 나도 쓰레기 자꾸 준다고 Ack를 무시했으니 잘못하긴 했지만.. 후...
어쨋든 지금은 해결했지만 환장할 노릇이다.
보통놈들과 같이 소켓 헤더만보고 동기화 방식으로 구현했다가 피똥싸보고 경험을 공유하고자 포스팅을 진행한다.
먼저 LS PLC가 사용하는 XGB/XGT FEnet I/F의 특징에 대해 알아야 대처가 가능할 것 같아서 인터넷을 뒤적이다 메뉴얼같은 정석 문서를 찾았다.
XGB / XGT 란
간단하게 XGB는 컴팩트한 모듈형이라 하여 CPU, 파워, I/O 등 한 몸체에 들고있으며 주로 소형 시스템 구축에 사용한다.
XGT는 흔히 우리가 알고있는 PLC의 형태를 가지고 있다. CPU, 파워, 통신, I/O등 모듈형태로 구분되어 있으며 주로 중대형 시스템 구축에 사용한다. 그냥 참고만 하자.
XGB FEnet I/F 모듈의 특징
XGB FEnet I/F 모듈의 특징에는 여러가지가 있는데 별로 눈에 들어오는 정보는 없다. 일반적으로 PLC 설명하면 다들 이렇게 기능들 나열해놓기 마련이다. 여기저기 쓰이긴 하는 네이밍벨류라 여러 기능이 많긴하다.
출처는 위 링크에 있는 문서에서 캡처해왔다.
중요한 내용은 아래쪽에 존재했다.
- XGT 전용 프로토콜에서의 사용하는 명령어는 4가지이며 각 명령어는 읽기/쓰기, 요청/응답 처리를 합니다. 각 명령어에서 가용 가능한 데이터 타입은 개별일 경우 비트, 바이트, 워드, 더블워드, 롱 워드가 가능하며 연속일 경우 데이터 타입은 바이트만 가능합니다.
- 바이트 타입 명령어의 경우 주소 값은 워드 지정시의 2배가 됩니다. 즉 D1234의 경우 워드 지정 시 %DW1234를 사용하지만, 바이트 형태로 지정 시 %DB2468을 사용해야 합니다.
- 전용 접속 개수 동시에 접속할 수 있는 TCP 전용 서비스의 최대 개수. 1~4 까지 설정 가능 ( P2P 채널은 4-전용접속 개수가 됨)
그렇다. 나를 괴롭히던 두가지 궁금증이 여기서 어느정도 해결되었다.
내가 가지고있던 두가지 문제점은 아래와 같다.
1. 왜 연속읽기를 하는데 워드에 쓰레기값을 들고오는가?
2. 클라이언트를 수시로 붙였다 떼었다 하는데 PLC가 묶여있는 한 설비에 공정이 6개고 통신 PC는 3대일 경우 왜 리시브 데이터가 꼬이는가?
결론적으로 3가지 문구가 굉장히 중요한 역할을 하게되는데, 앞으로 포스팅 할 LS PLC 통신 프로토콜에 중요한 길잡이가 되어준다.
그럼 오늘은 여기까지만 쓰고 다음부터 그래서 통신은 어떻게하는지 알아보자.
Ps.지금까지 그냥 대충 뚝딱뚝딱하면 통신이 잘 뚫렸었고 필요하면 동기 비동기 구현이나 해줬지 PLC통신 프로토콜 특성은 찾아본적이 없었다. 앞으로 프로젝트 시작 전 방심하지 말고 알아볼 수 있는건 최대한 알아보는게 좋겠다 싶다.