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

미쓰비시 PLC 문자열 스플릿 함수화 : 콤마 구분 데이터 분리 (함수화 2편)

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

이전 글 — 함수화 1편: 스케일 변환

미쓰비시 PLC에서 콤마(,)로 나열된 문자열을 항목별로 분리하는 스플릿 함수를 XCALL로 만드는 방법을 다룹니다.
계측기·검사장비에서 수신하는 CSV 형태 데이터를 PLC에서 바로 잘라 쓸 수 있습니다.

계측기나 검사장비와 데이터를 주고받다 보면 콤마로 정리된 문자열을 자주 만납니다.
이를 매번 새로 파싱하지 않고 함수 하나로 처리하는 것이 목표입니다.

 

1. 문자열 스플릿의 원리

PLC에서 문자열 분리는 두 가지 명령을 조합해 구현합니다.

 

  • INSTR — 원본 문자열에서 구분자(예: ,)의 위치를 찾습니다.
  • MIDR — 시작 위치와 길이를 지정해 그 사이 부분 문자열을 추출합니다.

 

즉 "다음 구분자가 어디 있는지(INSTR)" 찾고, "이전 구분자 다음부터 그 직전까지(MIDR)" 잘라내는 동작을 반복하면 한 항목씩 분리됩니다.

이 동작을 과거 글에서 INSTR·MIDR 명령으로 직접 다룬 적이 있습니다.
함께 보면 이해에 도움이 됩니다.

참고 — 콤마(,)로 나열된 데이터를 분리하는 방법 (INSTR·MIDR 명령어)

 

splitString()_230304.gxw
0.89MB

2. 함수 구조와 파라미터

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

📝 NOTE

예제에서는 통신 프로그램 영역을 D5000번대, XCALL 함수 영역을 D5900번대로 사용합니다.
실제 적용 시 사용 중인 디바이스와 겹치지 않는 빈 영역으로 바꿔 주면 됩니다.

디바이스 역할
D5900 / FD0 문자열 스플릿 구분자 (예: , = 0x2C, 공백 = 0x20)
D5902 문자열 종료 문자 (예: ETX = 0x03, CR = 0x0D, LF = 0x0A)
D5904 문자열 추출 시작 위치 포인트
D5905 추출할 캐릭터 개수
D5906 추출 문자열의 다음 구분자(,) 위치
D5909 원본 문자열의 길이 (LEN)
D5910 원본 문자열 (입력값)
D5950 추출한 문자열 (출력값)

3. 예제 #1: 한 항목씩 직접 분리

구분자·종료코드·콤마 위치를 초기화하고 XCALL P50 함수를 연속 호출하면, 호출할 때마다 다음 항목을 하나씩 분리합니다.

 

 

테스트 문자열 "START,1,2,3,4,5,6,7,8,9,FINISH" 는 콤마로 11구역으로 나뉩니다.
함수를 10번 호출하면 "START", "1", "2" … "9" 까지 차례로 분리됩니다.

 

 

구분자(D5900)·종료코드(D5902)·콤마 위치(D5906)를 매번 초기화하지 않으면, 함수를 연속 호출해 이어지는 항목을 계속 잘라낼 수 있습니다.

4. 예제 #2: FOR 반복문으로 분리

한 항목씩 호출하는 특성을 이해했다면, 같은 동작을 FOR 반복문으로 묶을 수 있습니다.
테스트 문자열 "OK,STRING,SPLIT,TEXT,YEAH" 로 확인합니다.

 

 

💡 TIP

FOR 반복 횟수를 항목 수에 맞춰 정확히 돌리고 싶다면, 먼저 원본 문자열의 콤마 개수를 세어 그만큼만 반복하도록 구성하면 빈 항목 처리를 깔끔하게 할 수 있습니다.

5. 예제 #3: 아스키 숫자를 정수로 분할 변환

계측기를 다룰 때 매우 편리한 응용입니다.
FOR 문으로 문자를 나눈 뒤, EVAL·DINT 명령으로 아스키 10진수 문자열을 정수형으로 변환합니다.

 

 

테스트 문자열 "1.464,2.412,3.575,4.164,7.123" 처럼 숫자만으로 구성된 데이터를 다룹니다.
소수점 3자리를 살리기 위해 EVAL 명령으로 아스키 10진수를 FLOAT 형태로 바꾸고, 1000을 곱해 자릿수를 올린 뒤 DINT 처리합니다.

 

 

숫자 문자열이 정수형으로 깔끔하게 정리됩니다.
수신한 측정값을 바로 연산·비교에 쓸 수 있는 형태가 됩니다.

마무리

문자열 스플릿을 함수로 만들어 두면 콤마 구분 데이터를 한 항목씩, FOR 반복으로, 또는 숫자 변환까지 묶어 처리할 수 있어 통신 데이터 파싱이 훨씬 간결해집니다.

💡 TIP

다음 편에서는 시리얼 통신에서 데이터 무결성을 확인하는 함수화 3편: 체크섬 생성 을 다룹니다. 수신 문자열을 분리한 뒤 체크섬으로 검증하는 흐름으로 자연스럽게 이어집니다.

728x90
반응형