본문 바로가기
PLC 전기제어 기술자료/샘플 프로그램 & TIP

[MELSEC] Q Modbus RTU 무수순 통신 가이드-2 (구현편)

by 위치결정 2026. 1. 27.
반응형

2026.01.27 - [PLC 전기제어 기술자료/샘플 프로그램 & TIP] - [MELSEC] Q Modbus RTU 무수순 통신 구현 가이드 (이해편)

 

앞선 이해편 에서 설명했듯 Modbus RTU는 RS-485 기반 시리얼직렬통신으로,

바이너리 형태를 사용하며 프레임 간 간격을 기준으로 무신호 시간으로 판단하여 종료를 판단합니다.

이는 ASCII 방식과 달리 특정 종료문자를 갖지 않는 구조로, 무수순 방식에서도 처리할 수 있습니다.

 

이를 미츠비시 Q PLC 에서 기존의 무수순 방식으로 어떻게 구현할수 있는지 설명하도록 하겠습니다.

PLC 래더프로그램의 샘플은 오토닉스사의 온도컨트롤러 TX, TK 시리즈 기반으로 작성되었음을 먼저 알려드립니다.

TX_KR_Comm_V1.4_20190402_W.pdf
1.06MB

 

(첨부) 오토닉스 온도컨트롤러 TX 통신 프로토콜 매뉴얼

 

1. 시리얼 통신모듈 (QJ71C24N) 파라미터 설정

(1) 수신 종료코드 미사용 처리

시리얼통신모듈(QJ71C24N) 버퍼메모리 설정값
수신 종료 코드 (Ch1. G165 / Ch2. G325) 0xFFFF (종료코드 없음)
수신 종료 길이 (ch1. G164 / ch2. G324) 0x1FF (기본값 유지 혹은 충분히 크게)

 

모드버스 RTU에서는 종료코드 개념을 아예 제거하는 것이 핵심입니다.

 

모드버스 RTU는 바이너리 데이터 기반 교신이기 때문에

송수신 데이터 중간중간에도 숫자 3이란 정상적인 데이터로 들어올 수 있습니다.

 

아스키기반 통신이였다면 숫자3은 0x33 이였겠지만, 바이너리기반 통신이기에 숫자3은 0x03 으로 들어옵니다.
그래서 종료코드를 ETX (0x03) 으로 설정한다면 데이터를 읽은 순간,

메시지 도중에 통신이 끝난줄 아는 오해가 생겨버려 교신이 꼬이게 됩니다.

이러한 현상은 ETX (0x03) 만이 아닌 아스키코드표에 존재하는 모든 코드중 어떤것으로 종료코드로 설정해도 발생하는 문제입니다.
그래서 모드버스RTU 교신은 종료코드를 설정하면 안되는 이유가 됩니다.

 

2. 수신데이터 감시 구조 (데이터 수신과 종료 처리)

종료 코드가 없다보니 수신데이터 요청(ch1.X03, ch2.X0A) 에 의한 교신 완료처리는 어렵습니다.

시리얼통신모듈(QJ71C24N) 에는 수신 데이터를 저장하는 버퍼메모리가 있습니다.

 

수신데이터의 바이트 갯수를 저장하는 ch1.G1536, ch2.G2560

수신된 데이터의 내용을 저장하는 ch1.G1537, ch2.G2561

 

이 부분을 활용하여 수신된 데이터가 있는지 감시하며 모드버스 RTU 프로토콜의 교신구조를 구현합니다.

G1536 : ch1 수신데이터 바이트 갯수

G2560 : ch2 수신데이터 바이트 갯수

 

수신데이터 바이트 갯수를 감시하여 0보다 크다면 수신된 데이터가 있다고 판단

D6257에 차이가 있을경우 MOV 처리하여 저장, 이전 스캔과 현재 스캔의 수신데이터 수량이 같다면 수신 완료 처리합니다.

 

이러한 처리를 통해 모드버스의 종료처리 방법인 무신호 시간을 1스캔의 처리로 흉내내어 구현할수있습니다.

만약 1스캔만으로 처리가 불안하다면 스캔카운터를 추가하여 2~3스캔을 더 감시하게 구현하는것도 가능합니다.

 

3. 수신 데이터 판정 후 처리

G1537 : ch1 수신데이터 저장영역

G2561 : ch2 수신데이터 저장영역

 

수신 데이터가 정상적으로 인식 및 종료를 판정 후 수신데이터 저장영역에서 수신된 데이터를 PLC 내부 프로그램에서 처리할 영역으로 옮깁니다.

 

수신데이터 갯수는 캐릭터 (바이트갯수) 형태로 저장되기 때문에 워드기반 명령어인 BMOV 가 정상적으로 처리할수 있도록 워드 갯수를 연산해줍니다.

 

수신된 바이트 수량을 2 로 나누고 나머지를 더해주면 BMOV 해야할 워드의 갯수가 계산이됩니다.

eg1. 수신된 바이트 수량이 10 인 경우
10 / 2 = 몫 5 , 나머지 0
5 + 0 = 5
> 5워드 저장


eg2. 수신된 바이트 수량이 5 인 경우
5 / 2 = 몫 2, 나머지 1
2 + 1 = 3
> 3워드 저장

 

 

4. 데이터 수신 처리 후 초기화

G168 : ch1. 수신 데이터 초기화 요구

G328 : ch2. 수신 데이터 초기화 요구

 

데이터를 정상적으로 수신 처리후 다음 데이터를 수신하기 위해 데이터를 초기화 처리합니다.

수신데이터 초기화 요구 플래그를 살려 수신버퍼메모리를 시리얼통신모듈 내부에서 초기화 한뒤

수신데이터 갯수와 수신데이터 저장영역을 모두 0값으로 클리어 처리합니다.

 

이로서 데이터 정상 처리후 다음 데이터 수신 준비까지 처리 완료

 

5. 수신 데이터 파싱 및 가공 처리

지금부터는 쉽습니다. 수신한 데이터를 워드에서 바이트로 쪼갭니다. (WTOB) 

 

ZR6200 : 슬레이브 국번

ZR6201 : 펑션코드

ZR6202 : 수신데이터 바이트 갯수

ZR6203~ : 데이터

마지막 : CRC-16

 

바이트화 된 데이터의 각 정보들을 조합하여 CRC 검증을 하여 데이터의 정합성을 체크하고

내가 원하는 형태로 가공후(BTOW) 사용하면됩니다.

 

 

※ 마치며

전체적인 구조 흐름은 다음과 같습니다.

 

데이터 수신 → 수신 바이트 수 변화 감시 → 변화 멈춤 감지 (1스캔) → 프레임 종료 판단 → BMOV로 데이터 복사 → CRC 검증 → 프레임 파싱 → 수신 버퍼 클리어 → 다음 프레임 대기

 

반드시 해야할 일은 종료코드 설정을 제거할것

CRC 코드의 검증 및 메시지 프레임을 처리후 수신용 버퍼메모리를 클리어 처리할것

Modbus RTU는 종료문자로 끝나는 통신이 아니라 타이밍과 CRC로 완성되는 프레임 통신입니다.

GX Works에서 무수순 통신으로 RTU를 구현하려면 종료코드를 찾는 로직이 아니라
“데이터 흐름이 멈췄는지를 판단하는 구조”를 설계해야 하는 이유입니다.
이 관점을 가지면 RTU 통신은 더 이상 까다롭지 않습니다.

 

마지막으로 위 프로그램의 예제를 업로드하며 글을 마치겠습니다.

감사합니다.

 

Autonics TX TK_260123.gxw
1.67MB

 

반응형