미쓰비시 PLC에서 시리얼 통신 데이터의 체크섬(Checksum)을 생성·검증하는 함수를 XCALL로 만드는 방법을 다룹니다.
송신 프레임에 체크섬을 붙이는 경우와, 수신 데이터의 체크섬을 비교해 유효성을 확인하는 경우를 모두 함수 하나로 처리합니다.
체크섬은 이 기기 저 기기와 프로토콜을 맞추다 보면 가끔 튀어나와 그때그때 새로 짜기 번거로운 존재입니다. 콜문 함수로 만들어 두면 매우 편합니다.

1. 체크섬이란: CRC 와의 차이
체크섬은 데이터 바이트를 단순 합산한 뒤 하위 바이트만 취해 통신 오류를 검출하는 가장 기본적인 방식입니다.
연산이 가볍고 구현이 단순해 많은 계측기·간이 프로토콜에서 사용합니다.
체크섬과 CRC 는 목적은 같지만(전송 오류 검출) 방식이 다릅니다.
체크섬은 바이트의 단순 합이고, CRC 는 다항식 나눗셈으로 훨씬 강력한 검출력을 가집니다.
가벼운 합산 검증이면 이 편(체크섬), MODBUS RTU 같은 CRC-16 검증이면 함수화 6편: CRC-16/MODBUS 를 쓰면 됩니다.
2. 함수 구조와 파라미터
이 함수도 문자열 데이터를 다루므로 많은 워드가 필요해, XCALL 로컬 인수(FD0·FX1·FY2)만으로는 부족합니다.
유닛 프로그램 끝부분의 빈 영역을 함수 전용으로 지정해 사용합니다.
예제에서는 통신 프로그램 영역을 D5000번대, XCALL 함수 영역을 D5900번대로 사용합니다.
실제 적용 시 사용 중인 디바이스와 겹치지 않는 빈 영역으로 바꿔 주면 됩니다.


| 구분 | 디바이스 | 역할 |
|---|---|---|
| 1번째 파라미터 | FD0 | 체크섬 생성 시 문자열 참조 시작 포인트 |
| 2번째 파라미터 | FD1 | 체크섬 생성 시 문자열 참조 종료 포인트 |
| 입력 영역 | ZR5900 | 원본 문자열 (입력값) |
| 작업 | D5907 | 문자열 추출 시작 위치 포인트 |
| 작업 | D5909 | 원본 문자열의 길이 (LEN) |
| 작업 버퍼 | D5910 | 문자열을 바이트 캐릭터 단위로 분리 저장 (WTOB 버퍼) |
| 출력 | D5992 | 체크섬 정수형 출력값 |
| 출력 | D5994 | 체크섬 문자열 출력값 |
| 출력 | D5996, D5997 | 체크섬 Byte 캐릭터 출력값 |
3. 예제 #1: 송신 프레임에 체크섬 붙이기
어느 계측기에 "$STX :READ? <Checksum> $ETX" 형식의 요청 프로토콜을 송신하려는 경우입니다.
체크섬은 STX 부터 :READ? 까지를 참조해 생성해야 합니다.
시작 포인트는 1, 종료 포인트는 LEN 으로 문자 끝 위치를 지정합니다.

함수가 맞게 동작하는지 직접 계산으로 검증해 봅니다.
각 문자의 16진수 코드를 더합니다.
| 문자 | 16진수 |
|---|---|
| STX | 0x02 |
| : | 0x3A |
| R | 0x52 |
| E | 0x45 |
| A | 0x41 |
| D | 0x44 |
| ? | 0x3F |

전부 합산하면 0x197 입니다.
여기서 상위 바이트를 버리고 남은 하위 바이트 0x97 이 바로 체크섬입니다.
이를 아스키로 돌리면 9 = 0x39, 7 = 0x37 이 되어 송신 데이터에 함께 실어 보냅니다.
이제 콜문으로 함수를 실행해 결과를 확인합니다.

체크섬이 D5990번대 영역에 생성됐습니다.
송신 데이터에도 잘 합쳐졌는지 확인합니다.

처음 의도대로 "$STX :READ? <Checksum> $ETX" 형태로 프레임이 완성됐습니다.
4. 예제 #2: 수신 데이터의 체크섬 검증
상대 기기에서 "ST,100.00F2 $CR $LF" 데이터를 수신한 상황입니다.
이 값이 유효한지 체크섬을 비교해 판단합니다.

프로토콜이 정형화되어 데이터 위치가 고정이면 시작·종료 포인트를 상수로 지정해도 됩니다.
하지만 길이가 가변이면, 통상 종료코드 직전에 체크섬이 위치한다는 규칙을 이용합니다.
이 예시는 종료코드가 CR·LF 2바이트, 체크섬이 2바이트이므로, LEN 으로 전체 길이를 구한 뒤 -4 한 값을 종료 포인트로 지정했습니다.
그러면 1번 문자부터 끝에서 4번째 문자까지를 참조해 체크섬이 생성됩니다.

정수형·문자열형·캐릭터형 모두 생성됩니다.
이제 상황에 맞는 형태로 수신 체크섬과 비교해 일치 여부만 확인하면 됩니다.

수신 검증에서 가변 길이 데이터는 "종료코드 + 체크섬 바이트 수"만큼 LEN 에서 빼는 것이 핵심입니다.
종료코드(CR/LF 등)와 체크섬 자릿수가 프로토콜마다 다르므로, 상대 기기 사양서에서 이 두 값을 먼저 확인하세요.
마무리
체크섬 생성을 함수로 만들어 두면 송신 프레임 작성과 수신 데이터 검증을 모두 호출 한 번으로 처리할 수 있어 시리얼 통신 스트레스를 크게 덜 수 있습니다.
다음 편에서는 테스트에 유용한 함수화 4편: 범위지정 랜덤값 생성 을 다룹니다.
또한 더 강력한 오류 검출이 필요한 MODBUS RTU 통신이라면 함수화 6편: CRC-16/MODBUS 코드 생성 으로 이어집니다.
'PLC 전기제어 기술자료 > PLC를 함수화 해보자!' 카테고리의 다른 글
| PLC 범용 CRC-16 함수화 : 다항식 가변으로 CCITT·XMODEM·ARC까지 (함수화 7편) (0) | 2023.05.09 |
|---|---|
| 미쓰비시 PLC CRC-16/MODBUS 함수화: XCALL 재사용 라이브러리 (함수화 6편) (0) | 2023.03.01 |
| 미쓰비시 PLC 랜덤 문자열 생성 함수화 : 테스트 데이터 만들기 (함수화 5편) (0) | 2022.04.26 |
| 미쓰비시 PLC 범위지정 랜덤값 생성 함수화 : RND 한계 극복 (함수화 4편) (0) | 2022.04.25 |
| 미쓰비시 PLC 문자열 스플릿 함수화 : 콤마 구분 데이터 분리 (함수화 2편) (1) | 2022.02.20 |
| 미쓰비시 PLC 스케일 변환 함수화 : XCALL로 아날로그 환산 재사용 (함수화 1편) (0) | 2022.02.19 |