안녕하세요. 공돌이 직딩이에요.
지난주에 이어 바로 본론으로 들어가볼까요?
지난주에 총 6가지 퀘스트가 있었습니다.
문제를 내고보니 이상한 부분이 있어 수정하였습니다..
직접 포스팅을하면서 느끼는건데 시험이나 각종 문제 출제위원들의 고충이 크게 느껴지네요.
완벽하게 쓴다고 써도 계속 오류가 생기거든요.
여튼. 꾸준한 포스팅을 통해 점차 필력을 올리고 여러분께 더 확실한 정보를 전달드리기 위해서 노력하겠습니다!
Quest1. (컨베이어 제어)
이 컨베이어는 물체의 크기에 따라서 총 4가지 경로(A, B, C, D)로 방향을 바꿔줍니다.
공정시작 버튼은 P10 공정 중지버튼은 P11입니다.
[시나리오]
a. 센서 P0만 감지되면 물체는 P20모터가 동작하여 물체를 A경로로 보내주고
b. 센서 P0, P1이 동시에 감지되면 물체는 P21 모터가 동작하여 물체를 B경로로 보내줍니다.
c. 센서 P0, P1, P2가 동시에 감지되면 물체는 P22 모터가 동작하여 물체를 C경로로 보내줍니다.
d. 마지막으로 P0, P1, P2에 모두 감지되지 않는 물체는 P23모터가 동작하여 물체를 D경로로 보내줍니다
공정시작 버튼 P10 & 아무센서도 감지되지 않은상태
P0 센서 감지
P0, P1 동시감지
P0, P1, P2 동시감지
Quest 2 (기차 모터제어)
기관실에서는 기차의 속력을 조정할 수 있고 객실에는 각각 모터가 달려있어서 기관실의 모터 속도지령을 받는다 가정해봅시다.
기관실은 1개가 존재하며 객실은 총 3개가 존재합니다.(2호칸, 3호칸, 4호칸)
기관사는 P0 스위치를 한번 누를때마다 30씩 속도를 증가시킬 수 있습니다.반대로 P1 스위치를 한번 누를때마다 30씩 속도를 감소시킬 수 있습니다.
속도지령치는 기관실 속력 저장 데이터레지스터 D0에 저장이 됩니다.
마찬가지로 객실의 속력지령치 역시 속력 저장데이터 레지스터 D1, D2 ,D3에 저장됩니다.
이 예제를 FMOV로 풀어보세요.
_ON은 상시 ON 접점으로서 앞서 배운적있죠. F99번 입니다.
시스템 모니터 및, 디바이스 모니터를 활용하여 D0 D1 D2 D3을 각각 확인해보세요.
Quest3 (차량 스마트센싱 기능 구현)
P10 전방 감지 센서
P11 우측 전방 감지 센서
P12 좌측 전방 감지 센서
P13 좌측 후방 감지 센서
P14 우측 후방 감지 센서
P15 후방 감지 센서
[시나리오]
a. 센서 P10은 세팅된 거리를 유지하면서 전진하고 세팅거리 이하가 되는경우 P20모터가 정지하여 차량이 정지합니다.
b. 후방감지 센서 P15은 세팅된 거리(30) 이하가 감지되는 경우 P23경보가 울립니다.
c. P0을 통해 거리를 10m씩 늘릴 수 있으며 해당거리는 D0 데이터레지스터에 보관되어 인버터에서 읽어줍니다.
d. P1을 통해 거리를 10m씩 줄일 수 있으며 해당거리는 D0 데이터레지스터에 보관되어 인버터에서 읽어줍니다.
e. 전방감지 센서 P10과 우측 전방 감지센서 P11이 동시에 감지되면 우측 전방 충돌을 알리는 P24 경보가 울립니다.
f. 전방감지 센서 P10과 좌측 전방 감지센서 P12가 동시에 감지되면 좌측 전방 충돌을 알리는 P25 경보가 울립니다.
g. 후방감지 센서 P15와 좌측 후방 감지센서 P13이 동시에 감지되면 좌측 후방 충돌을 알리는 P26이 점등됩니다.
h. 후방감지 센서 P15와 우측 후방 감지센서 P14가 동시에 감지되면 우측 후방 충돌을 알리는 P27이 점등됩니다.
엔코더로부터 받아들인 회전수는 D1 데이터레지스터에 저장되며 실제로는 일정 스케일 간격으로 피드백을 받겠으나
우리는 시뮬레이터를 돌리는 것이기 때문에 P1F로 강제로 10 이라는 수치를 D1 데이터레지스터에 입력할거에요.
이때 D1레지스터의 변화에 따라 모터의 구동상태 및 파일럿 램프의 동작을 확인해보는 것을 목적으로 합니다.
하기 래더는 완성된 레더입니다.
시뮬레이터를 돌려 시나리오대로 로직이 흘러가는지 확인해보세요.
Quest4 (소방설비기기 제어)
소방설비가 있어요. 화재 감지기는 연기의 농도를 측정합니다. 해당 화재 감지기는 연기의 농도에 따라서
경보벨이나 화재를 알리는 방식이 다른데요.
예를들어 화재 감지기가 감지할 수 있는 연기의 농도가 0부터 1000이라고 가정하고 해당 화재감지기로부터 읽어들인
데이터가 데이터레지스터 D0에 저장된다고 가정해봅시다.
우리는 말씀드렸다시피 시뮬레이션 기반의 프로그램을 작성중이므로 실제로 데이타레지스터에 값이 입력될 수는 없을
겁니다.
그래서 강제로 아래 a, b, c에 해당하는 임의의 농도를 주입시킬것 입니다.
우리는 임의의 농도를 주입시키지만 실제로는 상시 On되어 있는 접점에 의하여 데이터레지스터는 늘 값(연기농도)을
바꾸고 있겠죠
[시나리오]
a. 0초과 200미만의 값이 검출되었다면 비상 경보등 P20을 울리며
b. 200이상 500미만 값이 검출되었다면 비상 경보등 P20과 함께 비상 방송설비 P21이 작동합니다.
c. 500이상 1000미만 값이 검출되었다면 비상 경보등 P20과 비상 방송설비 P21과 함께 방화셔터 P22가 작동합니다.
다만 방화셔터가 내려오는 도중 사람이 끼어있는경우 적외선 센서 P1이 감지하여 5초간 P22가 정지하고 경보음
P25를 울립니다.
그리고 사람이 빠진경우 비상경보등 P20과 함께 비상방송설비 P21이 작동하고 방화셔터 P22가 재작동합니다.
Quest5 (마우스 감도기능 구현)
[시나리오]
a. P0 또는 P1을 빠르게 눌렀다가 때면 0.01씩 증가, 0.01씩 감소하고
b. P0 또는 P1을 누르는 도중 1초가 지나면 0.1씩 증가, 0.1씩 감소하고
c. P0 또는 P1을 누르는 도중 2초가 지나면 1씩 증가, 1씩 감소합니다.
위 로직을 증가 관련 레더와 감소 관련 레더로 나눠서 프로그램을 짜보세요.
전 증가로직만 보여드리겠습니다. 감소로직도 동일한 원리이니 한번 응용차원에서 스스로 해보시기 바랍니다.
TON타이머의 500번대를 사용한 이유는 아래와 같아요.
전 포스팅(타이머 관련)에서 말씀드렸듯 타이머는 기본 샘플링 시간이 다르거든요.
0.01 스케일 단위로 수치가 변화함을 표현하기 위해 사용한 것이에요.
너무 빠르게 감도의 수치가 변화한다면 조정하기 어렵겠죠.
그래서 적당한 간격을 준 것이라고 생각하시면 됩니다.
기능을 시뮬레이팅 하다보면 수치가 정확하게 증가되지 않는 것을 확인하실 수 있을거에요.
컴퓨터가 실수를 정확하게 표현할 수 없기 때문이죠.
바로 우리가 계산하는 방식의 수치계산과 컴퓨터의 수치계산은 다르기 때문입니다.
컴퓨터는 아주 넓은 범위의 수를 소숫점과 지수값을 통하여 표현할 수 있지만 거꾸로 생각하여보면
넓은 수를 작은 비트수로 표현하려다 보니 사람이 이해하는 무한소수와 같은 모호한 수에 대해서 표현하는 것에 문제가 생기게 됩니다.
컴퓨터는 모두 2진수의 개념으로 수치를 이해한다 정도는 모두 알고계실겁니다.
바로 여기서 문제가 발생하는데요.
컴퓨터는 우리가 사용하고자 하는 수치를 표현하기 모호할때 아주 가까운 근사값 수치를 만들어 내서 계산합니다.
그럼 의문을 가질거에요.
왜??? 표현을 못한다는거야????
컴퓨터가 왜 표현을 못한다는거지???
0.1을 컴퓨터는 어떻게 이해할까요?
만약 예를들어 우리가 3비트 메모리 공간을 가지고 있다면요?
0.1을 가장 근접하게 만들기위해 별노력을 기울여봤자
컴퓨터는
최대 수치로 아래 수식밖에 나타낼 수 없습니다.
0.5+0.25+0.125=0.875
그럼 0.1에 가장 근접하게 만들려면 어떻게 해야할까요?
기껏해봐야 0.125밖에 표현이 안되네요.
물론 컴퓨터는 더작은 수치로써 근사치를 만들려고 할겁니다.
이해를 돕기위해서 설명을 드린 것이니 참고바랍니다.
바로 여기서 문제가 발생하는겁니다.
왜냐면 컴퓨터는 기껏해봐야 0과 1밖에 기억을 못하니까요.
우리가 표현하려는 수치를 이해시키고자 할때 사각지대가 발생하는 것이죠.
컴퓨터의 메모리가 무한대라면 상관없겠지만 하드디스크는 용량이 정해져있으며 메모리역시 마찬가지이죠.
결국 0과 1의 조합으로 인간이 표현하고자 하는 모든수를 나타낼 수 없답니다.
그래서 저는 인간이 컴퓨터보다 뛰어나다고 봅니다..
한편으로. 부동소수점에 오차에 대해서 간략히 볼까요?
컴퓨터는 아래와 같이 실수를 이해합니다.
컴퓨터가 이해하는 실수 = (1.가수부)×2^지수부
우리가 표현하려는 실수 = 1/7
또하나의 예로 만약 우리가 표현하려는 실수인 1/7을 어떻게 컴퓨터가 이해하는 실수로 바꿀 수 있을까요?
1/7은 숫자가 나누어떨어지지 않죠.
흔히 알고 있는 원주율값도 마찬가지 입니다.
우리가 이해하고 있는 수 중에 컴퓨터에 나타낼수 있는 방법이 없기에 컴퓨터는 사용자에게 데이터 신뢰도를 제시하고
계산하기를 권하는 것입니다.
다음은 데이터형에 대한 저장범위입니다. 참고용으로 가져가시면 됩니다.
위 내용보다 사실 더깊이 들어가는 부분에 대해서는 포스팅이 방대해질듯 합니다.
부동소수점의 오차에 대해서 공부해보시면 자세한 내용을 공부하실 수 있을거에요.
궁금하신부분은 댓글로 남겨주시면 설명 드릴게요.
다시 본론으로 돌아와서...
얼마나 데이터를 신뢰할 수 있는냐에 따라서 정밀도 개념이 들어가는데 실질적으로 항공이나 자동차 미사일등의 고도의 제어시스템은
매우 높은 정밀도를 가져야 하겠죠.
아주 작은 수치 차이로도 항로나 좌표가 틀어질 수 있기 때문이에요.
허나 예제의 마우스의 감도를 조절하는 기능을 구현하기 위해서 이정도의 정밀도는 필요하지 않습니다.
따라서 '예제를 풀어보시면서 PLC에 정밀도라는 개념도 있구나' 정도로만 이해해주시면 되겠습니다.
Quest6 (놀이기구 제어)
*트랙은 설명을 위해서 그려놨을뿐 각각의 셀이 거리를 의미하는 것은 아님.*
해당 트렉을 따라 파란색 놀이기구가 움직이는데 각 센서들이 파란색 놀이기구를 감지합니다. 문제에 앞서 각 레지스터의 기능과 Push button에 대해서 정의하겠습니다.
놀이기구 기동버튼: P10
놀이기구 정지버튼: P11
D0: 속도값을 저장하는 데이터 레지스터
D1: 회전 방향을 저장하는 데이터 레지스터로 0이면 전진방향 1이면 후진방향을 의미.
각종 데이터 레지스터의 수치를 인버터가 실시간으로 스캐닝하여 모터를 동작시킨다고 봅시다.
실제로는 주파수나 전압값등을 가변하여 모터를 제어하지만
여기서는 단순히 수치 입력을 바탕으로 속도를 조정한다고 가정합니다.
속도는 데이터레지스터 D0에 입력되어 저장되고 예를들어, 인버터는 D0의 저장된 수치가 10일때 이를 10m/Sec로 인식
합니다,
일부의 인버터는 목표 속도지령치를 주면 알아서 시간속도 곡선을 그리기 때문에 우리는 목표 속도지령치만 넣어주고
시작과 정지 부분에 있어서는 인버터가 알아서 움직여준다고 가정하겠습니다.
Jerk, Creep속도, S곡선들을 설명하기 위해서는 내용이 많이 복잡해지고 포스팅 취지에 맞지 않기에 고려치 않도록
하겠습니다.
[시나리오]
a. 놀이기구는 P6 위치에서 시작하여 P0센서가 인식될때까지 2의 속도로 정속주행 합니다.
b. P0센서가 감지되면 P1에 도착하기까지 1초에 10씩 계속 속도가 증가합니다.
c. 이렇게 카트가 P1에 도착하게 되면 3초간 정지하였다가 다시 P0를 향하여 1초에 10씩 증가하여 D0에 수치가
저장됩니다.
d. P0에 다시 도착하게 되면, 정지한 직후 이번에는 P2 센서에 인식될때까지 1초에 5씩 속도를 증가하다가
P2에 인식되는 순간 1초에 10씩 속도가 감소하여 P3에서 2초간 정지합니다.
e. P3에서 2초간 정지후 놀이기구는 P4에 도착할때까지 1초에 20씩 속도를 증가하며 P4에 도착하면 도착 속도값을 유지
한 상태로 P5를 향해 전진합니다.
f. P5에 도착한 놀이기구는 5의 속도값을 유지한 상태로 P6에 도달하면 정지합니다.
1. STEP
2. STEP
P6 감지
3. STEP
P1에 감지될때까지 속도가 2씩 계속증가
4. STEP
다시 P0으로 주행하여 P0도착후 속도가 5씩 증가
5. STEP
P2에 감지될때까지 주행
6. STEP
P3에 감지되면 2초간 정지후 P4에 도착할때까지 속도를 20씩 올린다.
7. STEP
P4에 도착하면 속도값 유지한다.
8. STEP
P5 도착하면 속도 5를 유지하여 P6로 향한다.
9. STEP
P6 도착하면 정지
어떠신가요?
모든 문제가 잘해결되었나요?
하나 덧붙여 말씀드리고 싶은건 제가 써놓은 래더가 정답이 아닙니다.
프로그래밍은 정답이 없기 때문에 여러분들도 같은 기능을 구현하셨다면 정답이라고 볼 수 있습니다.
물론 프로그래밍 실력에 따라 줄의 수가 줄고 PLC에 걸리는 로드가 줄어서 속도가 빨라진다면 훌륭한 프로그래머라고 할 수 있겠죠.
하지만 누구나 처음부터 잘하는 것은 결코 있을 수 없죠.
아무리 천재라도. 시행착오가 있기 마련입니다.
적어도 어제와 다른 오늘의 내가 되었다면 그 목표가 무엇이든 언젠가 고지에 오를수 있을 것이라고 믿습니다.
이상으로 포스팅을 마칠게요
추가로...
포스팅에 이상한 부분이 있거나 이해가안가는 부분, 오류가 발생한 부분에대한 피드백은 언제든지 환영입니다.
그럼 즐거운 한주간 보내시기 바랍니다.
'PLC > PLC(XG-5000)' 카테고리의 다른 글
13. 특수릴레이의 개념 (0) | 2020.06.30 |
---|---|
12. BIN/BCD, 반전명령 개념 (2) | 2020.06.23 |
10. 비교연산문, 조건문, 데이터 이동 명령어의 응용 (0) | 2019.07.31 |
9. 비교연산문, 조건문, 데이터 이동 명령어의 개념 (4) | 2019.07.24 |
8. SET, RESET 제어의 개념과 응용 (0) | 2019.07.17 |