안녕하세요 공돌이 직딩입니다.
오늘은 퇴근길에 잠시 편의점에 들러 도시락을 사왔습니다.
아무것도 먹지 못하고 하루종일 일만하니 몸과 마음이 녹초가 되버리네요..
그래도 독자님들과의 정보공유는 끊임없이 이루어져야겠죠!
오늘은 가장 써먹을 곳 많은 비교연산문을 공부할겁니다.
이는 응용범위가 매우 넓어서 개념편과 응용편을 2개로 나누어 포스팅하도록 하겠습니다.
비교연산문은 사실 PLC도 PLC지만 C언어에서 아주 요긴하게 쓰입니다.
(주로 if, if else, case 기타등등으로 사용)
어떤 회로가 동작하기 위해 조건을 주는 것입니다.
그럼 지금부터 차근차근 공부해보도록 하겠습니다.
먼저 비교연산문이 XG-5000에서 어떻게 사용되는지 그림을 한번 보시죠.
[>= T0 30 에 해당하는 래더 그림 삽입]
위 그림을 해석하기 위해서 다음 규칙을 배워둘 필요가 있습니다.
첫 번째.
'>=' 가 자리하는 이곳을 첫번째 항(1항)이라고 명명하겠습니다.
이곳은 바로 비교연산자에 대해서 기술하는 곳입니다.
종류는 다음것들이 있으니 참고해주세요.
비교연산자 | 의미 |
> | 2항이 3항보다 큰가? |
>= | 2항이 3항보다 크거나 같은가? |
< | 2항이 3항보다 작은가? |
<= | 2항이 3항보다 작거나 같은가? |
= | 2항과 3항이 같은가? |
<> | 2항과 3항이 다른가? |
두 번째
T0가 위치하는 곳을 두 번째항(2항)이라고 명명해보죠.
비교 기준이 되는 항이죠.
이곳은 데이터 레지스터값이나, 타이머 현재값, 카운터 현재값들이 들어갈 수 있어요.
세 번째
30이 위치하는 이곳은 3항이며 상수나 변수(데이터 레지스터)가 들어갈 수 잇습니다.
위에서 예시들었던
[>= T0 30]를 해석하자면 'T0값이 30보다 크거나 같은가?'
정도로 해석할 수 있겠네요.
비교연산문은 해당조건이 만족되면 회로가 통전되고 해당조건이 부합하지 않으면 회로가 차단됩니다.
다음으로 또 중요한 개념이 등장합니다.
바로 MOV(P) 명령인데요.
MOV(P)라는 명령을 XG-5000에서는 다음과 같은 방법으로 사용합니다
1항은 2항을 3항에 저장한다는 의미입니다.
즉 1항의 MOV라는 개념은 MOVE의 약어로 2항에 있는 10이라는 수치를 3항의 D0(데이터레지스터)에 저장한다는
의미이지요.
MOV는 입력이 인가되면 리프레싱 동작(PLC가 레더를 해석하는 동작)마다 끊임없이 값을 이동시킵니다.
예를들어 PLC 성능이 1초에 100번 레더를 해석한다고 가정하면
1초동안만 입력을 주었는데 무려 100번 값이 바뀌는 것이죠.
반면에 MOVP 명령을 주게되면 상승엣지 구간이 등장하는 경우만 캐치하여 MOV 명령을 합니다.
(이전에 펄스에 개념에 대해서 설명했었죠.)
즉 PLC 성능이 예를들어 1초에 100번 레더를 해석한다고 하더라도, 상승엣지가 한 번 검출되면
한 번만 MOV 명령을 취합니다.
자. 한개 더 개념을 짚고 넘어갑시다.
1항은 2항을 3항에 저장한다는 의미라고 하였죠.
그렇다면 2항을 3항에 저장하는데 3항의 정체가 뭘까요?
3항의 정체가 무엇일까요?
답은 메모리(데이터 레지스터)에요!
메모리(데이터 레지스터라고도 부릅니다)놈에 대해서 이해하고 계셔야해요.
PLC의 데이터 레지스터는 16비트로 구성됩니다.
쉽게말해서 전기가 통하느냐 안통하느냐를 각각 1과 0으로 봤을때
1과 0을 저장할 수 있는 방이 16개가 있는 것이지요.
아래 그림의 경우는 16개의 방에 모두 전기가 통하고 있음을 기억해주는 것이죠.
백번의 설명보다는 직접 래더 예제를 봐봅시다.
P0를 누르면 10이라는 숫자가 D0에 입력되겠죠.
D0는 다음처럼 저장이 되겠죠.
제가 메모리를 방이라고 말씀을 드렸는데요..
실제로는 그냥방이 아니고 방마다 호실이 다르듯 각각의 방이 의미가 다릅니다.
즉 메모리에서는 각 방(자리수로 표현)마다 호수(자리수 값)가 다릅니다.
자리수가 1인 방에 통전이 되어 1이 쓰여져 있으면 그것은 PLC에서 1로 인식을하게 되고
자리수가 2인 방에 통전이 되어 1이 쓰여져 있으면 그것은 PLC에서 2로 인식을하게 됩니다.
왜 헷갈리게 방마다 자리수 값을 다르게 했느냐구요?
PLC는 방의 호수를 지정해주지 않게되면 어느방에 1이 쓰인지 모르기 때문이죠.
최우측 2번째와 4번째 방에 1이라는 수치를 저장하고 싶을때,
PLC는 10이라는 수치를 기억함으로써 최우측 2번째와 4번째에 1이 쓰였다고 인식할 수 있는 것이죠.
(각자리수가 가지고 있는 고유한 수치가 다르기 때문)
말이 이해가 어려울 수 있는데 한번 곰곰히 생각해보세요.
이해가 안가면 댓글남겨주시구요.
또말이 길어졌네요.
본론으로 돌아옵시다.
P0를 누르면 D0라는 방에 0000,0000,0000,1010이 쓰여있어야 하겠죠?
XG-5000에는 해당수치를 확인할 수 있는 모니터 기능이 있습니다.
아래 그림을 참고해서 수치를 확인해보세요.
시뮬레이션 절차는 기존에 하던 방법과 동일하나
데이터 레지스터에 쓰인 값들을 확인하기 위해서 디바이스 모니터를 더 띄워야 합니다.
모니터창을 보니 좌측에 각각의 데이터 레지스터의 이름들이 나열되어 있죠?
우리는 D0라는 방에 값을 저장했으니 D를 클릭해봅시다.
P0를 누르기전 D0의 상태가 0000,0000,0000,0000이 맞는지를 확인해보세요.
그다음은 P0를 눌러 0000,0000,0000,1010가 맞는지를 확인할겁니다.
어떤가요? 수치가 바뀌는 것이 확인 가능하시죠?
다음은 P1을 눌러 다시 D0 방에 0이 들어가지는지를 확인해봅시다
다음으로 눈여겨 볼것은 D0.1번방 D0.3번방이 어느시점에 통전되느냐를 봐보세요.
해당 방이 통전되면 P20, P21이 켜지겠죠.
D0.1과 D0.3이 앞서 말씀드렸던 아래 표입니다.
다음 예제를 살펴봅시다.
앞서 말씀드린대로 각 버튼을 눌러서 시스템 모니터링이 어떻게 변화하는지 잘 살펴보세요.
스스로 깨닫는것이 중요합니다.
그다음 예제를 봅시다.
레더는 다음과 같아요.
시뮬레이션 결과를 보세요.
P0를 누를때마다 카운트 수치가 증가하고
카운트 수치가 1일때 P20
카운트 수치가 2일때 P21
...
순으로 차례대로 점등하는지를 확인해보는 겁니다.
다음은 설명 드릴 것은 INC(P), DEC(P)입니다.
매우 간단합니다.
-INC(P)는 1씩증가, DEC(P)는 1씩감소하는 것이죠.
예제를 통해 바로 익혀보도록 합시다.
P0를 누르면 D0가 빠른속도로 증가할 겁니다.
펄스 입력을 인가한 것이 아니라 단순 A접점 신호를 주었기 때문이죠.
또한, P1을 누르면 D0에 저장된 수치가 빠르게 감소할 겁니다.
마찬가지로 누르고 있는 동안엔 계속 수치가 감소합니다.
하지만... P2를 한번 눌러봅시다.
INCP라는 것은 Increment Pulse라는 뜻과 일맥상통하며 그 의미는 상승엣지가 검출되면 데이터레지스터 값이 1증가
한다 입니다.
시뮬레이션을 돌려보면 위 그림처럼 데이터 레지스터값이 1증가했음을 확인할 수 있죠.
DECP는 그반대의 의미이겠죠.
다음으로 P4를 눌러보기전에 한가지 개념을 더 짚고 넘어가겠습니다.
오버플로우라는 개념에대해서요.
PLC는 과연 1과 0이라는 방(메모리)을 몇개를 가지고 있을까요?
앞에서 이미 살펴보았듯 총 16개의 비트를 가지고 있었음을 확인했었죠.
통상 16번째 자리수는 1과 0으로 표현되는 수치가 부호의 의미를 나타낸다고 보시면 됩니다.
0이면 양수로 기억하고 1이면 음수로 기억하는 PLC만의 기억방법이죠.
흔히들 최상위 비트를 부호를 나타내는 부호비트라고 칭하기도 합니다.
실제로는 부호비트는 부호가 무엇이냐의 의미를 가지고 있을뿐 수치적인 의미로는 사용되지 않아요.
정리하면, PLC라는 녀석은 16개의 방중 가장 호수가 큰 방을 부호의 의미로 사용하고 나머지 방은
1과 0이 어떤식으로 저장되었는지 확인하기 위해 사용하는 것이지요.
그래서 우리가 16비트로 나타낼수 있는 수치의 범위는
- 2^15 부터 2^15 - 1 까지 사용할 수 있는것이지요.
이를 계산하면 -32768에서 32767이라는 수치를 기억할 수 있는것이네요.
P4버튼을 2번 툭툭 건드리면 -32768로 되돌아가는 것을 확인할 수 있을겁니다.
왜냐면 방이 그게 끝인거거든요.
PLC의 한계는 그게 마지노선이라는 뜻이죠.
반대로 작동시켜 수치를 줄여보아도 똑같이 언더플로우가 발생하여 -32768에서 32767로 넘어가는 것을
보실 수 있습니다.
여기까지 모두 익혀보셧나요?
다시 데이터를 초기화하여 마무리 지읍시다.
우리는 간략히 MOV(P) 명령에 대해서만 알아보았는데 사실은 종류가 많아요.
기타 명령어는 일일히 설명드리는 것보다는 각각 예제를 드리고 시뮬레이션 그림을 보여드릴테니
실제로 실험해보시면서 어떤용도로 사용되는지 직접 감을 잡아보세요.
1. DMOV(P)
DMOV라는 녀석은 32비트를 이동시켜줍니다.
특이한 부분을 좀 설명을 드리자면 [DMOVP h12121212 D00000]의
(20.6.4 수정)
h12121212 에 대한 내용인데요 h는 hexadecimal의 약자로서 16진수를 의미합니다.
h12121212라는 녀석은 한마디로 4비트가 8개가 붙어있는 구조인것인데요
h뒤의 문구 각각이 4개의 비트로 이루어집니다 즉.
0001/0010/ 0001/0010/ 0001/0010/ 0001/0010/로 표현이 되겠지요.
말로만 들어선 이해가 어려우니 쪼개서 봅시다.
이해가 안가시는 분은 댓글 남겨주시구요.
특이한점은 일반 비교연산자 사용법과는 차이가있죠
[= D00010 2147483647]명령창에 이런식으로 사용해보면 오퍼랜드 초과가 뜨게됩니다.
[D= D00010 2147483647]로 쓰면 아무 에러를 확인할 수 없죠.
바로 32비트 전용 비교연산자라고 생각하시면 되는거죠.
2. GMOV(P)
GMOV라는 녀석은 그룹 무빙입니다.
어떻게 이동되는지 직접 레더를보고 시뮬레이션을 돌려서 익혀보세요.
D00000에 저장된 100, D00001에 저장된200, D00002에 저장된300 총 3개의 수치들이
D00010, D00011, D00012에 똑같이 복사되었네요.
그렇습니다.
[GMOVP D0 D10 3]의 의미는
D00000번 D00001번 D00002번 총 3개를 D00010, D00011, D00012에 복사하라는 의미에요
D0는 어디서 복사를 시작할지에 대한 시작점의 위치를 나타내고,
D10은 어디서부터 복사된 값을 붙여넣을지에 대한 시작점의 위치를 나타내며
가장 마지막 3의 의미는 시작점으로부터 차례대로 몇개의 16비트 수치를 복사하겠느냐 입니다.
3. FMOV(P)
FMOV라는 녀석도 GMOV와 비슷하게 복사하는 역할을 수행합니다.
하지만 차이점이 존재하지요. 어떤 차이점인지 시뮬레이션을 보고 한번 익혀봅시다.
GMOV는 그룹단위로 복사가 됬는데 FMOV는 한개의 데이터를 3개의 방에 똑같이 뿌려주는 효과를 가지고 있네요.
즉 앞서 살펴본 [GMOVP D0 D10 3]의 의미는
D00000번 D00001번 D00002번 총 3개를 D00010, D00011, D00012에 복사하라는 의미이지만
FMOV는
[FMOVP D0 D10 3]의 의미는
D00000번 에 저장된 값을 D00010, D00011, D00012에 동일하게 복사하라는 의미에요.
쉽죠??
마찬가지로
[FMOVP D0 D10 3]
D0는 복사를 어디서 시작할지 시작점을 나타내고
D10은 복사값을 어느위치로 붙여넣을지에 대한 초기정보
3이라는 수치는 D10으로부터 시작하여 몇개만큼의 방에 저장할지를 나타내는 것이에요.
다시말해서 3이라는 수치는 D10, D11, D12만큼을 나타내는 것이고
4라는 수치가 들어가있다면 D10, D11, D12, D13만큼을 나타내는 것이죠.
차이점을 잘 이해해보세요.
4.CMOV(P)
CMOV라는 놈은 너무쉬워요. 반전한다는 뜻입니다.
크리스마스 트리를 만들수 있겠네요..
5.BMOV(P)
다음은 BMOV라는 녀석인데 개념이 조금 이해하기 난해할 수 있어요.
먼저 P0를 눌러 10이라는 수치를 입력시키고.
P1을 누르면 어떤일이 생기는지 보자구요.
??? 이해할 수 없는 결과가 나왔네요. 10이 갑자기 40이 되다니.
결론을 말씀드려볼게요.
일단 [BMOVP D0 D1 h1303]
D0는 복사할 녀석의 시작점, D1은 복사해서 붙여넣을 시작점.
h1303의 각각의 의미
1000의 자리수: 원본 시작 비트수
100의 자리수: 목적지 시작 비트수
10의 자리수: 의미 없음!
1의 자리수: 복사할 비트의 갯수
앞의 GMOV나 FMOV와는 다르게
복사되어질 첫주소도 지정할 수 있다는 점이 독특하죠.
아래를 보면 이해는 빼박이에요
왜 10이 40이 되었는지가 해결되었네요.
6.SMOV(P)
SMOVP는 겁나게 간단하다구요~
아스키코드만 잘이해하고 있으면 되요.
아스키코드는 다음과 같이 정의되어 있어요.
어려운거 다집어치우시고. 각각 숫자를 인간의 언어와 1대1 대응시켜놨다고 보면됩니다.
어려운말은 집어치웁시다.
아스키코드는 PLC와 인간 언어의 번역기능을 해주는 낱말사전 정도로 이해하면됩니다
50을 PLC에 입력시키면 인간의 언어로 2라는 숫자가 짠하고 나타나겠죠.
그게 답니다.
별거없죠.
오늘 배운내용이 조금 방대해서 사실 걱정이 많이됩니다.
제가 제대로 설명을한 것인지...
하지만 독자님들께서는 모두 이런 누추한 블로그를 검색해셔 들어오셨을거고
꼼꼼히 읽어보시고 자기 지식으로 만들 수 있는 능력을 가졌다고 생각합니다.
다음 시간에는 위 명령어를 충분히 숙지하셨다는 가정하에 QUESET를 드리고 함께 고민해보는 시간을 가져보도록
하겠습니다.
그럼 한주간 잘지내시고 다시뵙도록 하겠습니다.
'PLC > PLC(XG-5000)' 카테고리의 다른 글
11. 비교연산문, 조건문, 데이터 이동 명령어의 응용 해설 (0) | 2020.06.16 |
---|---|
10. 비교연산문, 조건문, 데이터 이동 명령어의 응용 (0) | 2019.07.31 |
8. SET, RESET 제어의 개념과 응용 (0) | 2019.07.17 |
7. Counter의 개념과 응용 (1) | 2019.07.10 |
6. 타이머의 개념과 응용 (5) | 2019.07.03 |