본문 바로가기
PLC 전기제어 기술자료/PLC를 함수화 해보자!

미쓰비시 PLC 체크섬 생성 함수화 : 시리얼 통신 데이터 검증 (함수화 3편)

by 위치결정JP 2022. 2. 28.
728x90
반응형

이전 글 — 함수화 2편: 문자열 스플릿

미쓰비시 PLC에서 시리얼 통신 데이터의 체크섬(Checksum)을 생성·검증하는 함수를 XCALL로 만드는 방법을 다룹니다.
송신 프레임에 체크섬을 붙이는 경우와, 수신 데이터의 체크섬을 비교해 유효성을 확인하는 경우를 모두 함수 하나로 처리합니다.

체크섬은 이 기기 저 기기와 프로토콜을 맞추다 보면 가끔 튀어나와 그때그때 새로 짜기 번거로운 존재입니다. 콜문 함수로 만들어 두면 매우 편합니다.

 

1. 체크섬이란: CRC 와의 차이

체크섬은 데이터 바이트를 단순 합산한 뒤 하위 바이트만 취해 통신 오류를 검출하는 가장 기본적인 방식입니다.
연산이 가볍고 구현이 단순해 많은 계측기·간이 프로토콜에서 사용합니다.

📝 NOTE

체크섬과 CRC 는 목적은 같지만(전송 오류 검출) 방식이 다릅니다.
체크섬은 바이트의 단순 합이고, CRC 는 다항식 나눗셈으로 훨씬 강력한 검출력을 가집니다.
가벼운 합산 검증이면 이 편(체크섬), MODBUS RTU 같은 CRC-16 검증이면 함수화 6편: CRC-16/MODBUS 를 쓰면 됩니다.

checksum()_230301.gxw
0.89MB

2. 함수 구조와 파라미터

이 함수도 문자열 데이터를 다루므로 많은 워드가 필요해, XCALL 로컬 인수(FD0·FX1·FY2)만으로는 부족합니다.
유닛 프로그램 끝부분의 빈 영역을 함수 전용으로 지정해 사용합니다.

📝 NOTE

예제에서는 통신 프로그램 영역을 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번째 문자까지를 참조해 체크섬이 생성됩니다.

 

 

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

 

💡 TIP

수신 검증에서 가변 길이 데이터는 "종료코드 + 체크섬 바이트 수"만큼 LEN 에서 빼는 것이 핵심입니다.
종료코드(CR/LF 등)와 체크섬 자릿수가 프로토콜마다 다르므로, 상대 기기 사양서에서 이 두 값을 먼저 확인하세요.

마무리

체크섬 생성을 함수로 만들어 두면 송신 프레임 작성과 수신 데이터 검증을 모두 호출 한 번으로 처리할 수 있어 시리얼 통신 스트레스를 크게 덜 수 있습니다.

💡 TIP

다음 편에서는 테스트에 유용한 함수화 4편: 범위지정 랜덤값 생성 을 다룹니다.
또한 더 강력한 오류 검출이 필요한 MODBUS RTU 통신이라면 함수화 6편: CRC-16/MODBUS 코드 생성 으로 이어집니다.

728x90
반응형