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

[MELSEC] PLC 프로그램을 함수화 해보자 -2- (문자열 스플릿)

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

< XCALL을 활용한 STRING SPLIT 함수 예제 >

 

PLC는 손쉽게 그림 그리듯 래더라는 언어를 이용하여 프로그램 할수 있는 뛰어난 자동화 제어장치입니다.

하지만 단점이 있으니 프로그램을 여러 유니트에 맞추어 어드레스를 변경해가며 일일이 복사해서 코딩을 해주어야 한다는 점입니다.

PLC에서도 간단한 기능들은 CALL이나 XCALL 문을 이용하여 함수화 할수 있으니 이를 활용하면 보다 프로그램이 간단해 질것입니다.

 

이번에는 두번째로 다뤄볼 예문으로 지난번에 다루었던 SCALE 기능과 마찮가지로 과거에 제가 한번 다루었었던 콤마(,)로 문자열을 나누는 스플릿 기능을 XCALL을 활용하여 함수화 해봅니다.

해당 과거글을 참고해보시면 이해에 조금더 도움이 되실것입니다.

 

2022.01.22 - [PLC 전기제어 기술자료/샘플 프로그램] - [MELSEC Q] 콤마(,) 로 나열된 데이터를 분리하는 방법 (INSTR명령어, MIDR명령어)

 

[MELSEC Q] 콤마(,) 로 나열된 데이터를 분리하는 방법 (INSTR명령어, MIDR명령어)

계측기나 다양한 검사장비들과 데이터를 송수신하다보면 손쉽게 만나는 데이터 형식으로 콤마(,)로 정리된 문자열입니다. 이제는 PLC에서도 이렇게 콤마(,)로 구분되어 수신된 데이터를 정리하

plcman.tistory.com

 

splitString()_230301.gxw
0.89MB

 

< 함수 기능 설명 >

이번 함수는 데이터를 다루는 함수이기에 많은 워드가 필요합니다.

따라서 XCALL에서 파라미터로 활용할수 있는 로컬변수(FD0, FX1, FY2)를 사용하기가 애매합니다.

이를 극복하기 위해 유니트 프로그램의 끝부분에 해당하는 영역을 XCALL에서 활용할 어드레스 영역으로 지정하여 사용합니다.

[예제프로그램에서는 D5000번대를 통신프로그램영역으로 XCALL 함수영역은 D5900 번대 사용합니다.]

 

 

D5900 / FD0 : 문자열 스플릿 구분자 (ex: "," (0x2C), " " (0x20) 등)

D5902 : 문자열 종료문자 (ex: ETX (0x03), CR (0x0D), LF (0x0A) 등

 

 

D5904 : 문자열의 추출 시작위치 포인트

D5905 : 추출할 캐릭터의 갯수

D5906 : 추출 문자열의 다음 operator "," 위치

D5909 : 원본 문자열의 길이 LEN

 

D5910 : 원본 문자열 (입력값)

D5950 : 추출한 문자열 (출력값)

 

 

< 프로그램 예제 #1 ::문자열을 건바이건 직접 분리하는 방법 >

 

콤마 위치를 초기화 하고 XCALL P50 함수를 연속으로 호출하면 계속하여 연속된 문자를 분리합니다.

테스트용 문자가 "START, 1,2,3,4,5,6,7,8,9,FINISH" 로 세어보면 콤마로 11구역으로 나눠져 있음을 알수있습니다.

그런데 10번 반복하였으니 문자는 "START", "1", "2", "3", "4", "5", "6", "7", "8", "9" 까지 나눠졌을겁니다.

잘 된것 같군요.

D5900, D5902, D5906에 각각 오퍼레이터 구분자와 종료코드, 콤마위치를 초기화 하지 않는다면 연속하여 함수를 콜하여 연속된 문자를 찢을수 있습니다.

 

< 프로그램 예제 #2 ::문자열을 FOR 반복문으로 분리 하는 방법 >

 

하나씩 개별로 써보면서 특성은 이제 이해했으니 같은 동작을 FOR 반복문으로 꾸몄습니다.

이번엔 테스트용 문자를 "OK,STRING,SPLIT,TEXT,YEAH" 라는 의미없는 문구로 준비해보았습니다.

잘 되네요.

추후에 필요에 따라 FOR 반복문의 반복횟수는 콤마의 갯수만큼만 진행하도록 콤마의 갯수를 체크하여 진행하게 만들어도 좋을것같습니다.

 

 

< 프로그램 예제 #3 ::데시멀아스키형 숫자를 정수형으로 분할하여 변환 >

 

이번에는 계측기 등을 다룰때 매우 편한 예시입니다.

위와 같이 FOR문을 이용하여 문자를 나누고, 이를 EVAL명령어와 DINT 명령어를 통해 아스키형 10진수를 INT정수형으로 바꾸는 방법이죠.

 

이번엔 테스트용 문자를 "1.464,2.412,3.575,4.164,7.123" 라는 숫자로만 구성된 문자열로 테스트해봅니다.

소숫점 3자리로의 처리를 위해 EVAL명령어로 아스키10진수형태의 숫자를 FLOAT형태로 바꾼후 1000을 곱하여 자리수를 올려준 다음 DINT 처리를 합니다.

 

당연하게도 잘 정리 되었네요.

 

어떻습니까, 프로그램도 매번할 필요없어 비교적 간결해졌고 참 편리하고 재밌죠?

반응형

댓글