안녕하세요 공직자입니다.
지난주의 해설을 들고왔습니다.
퀘스트들을 내면서 어떻게 하면 설명드린 개념과 연관시켜 쉽게 이해시킬수 있을까하는 고민으로 문제를 내는데
그러다보니 몇몇 오류들이 생기기도하고 잘못 작성한 부분도 보이는것 같아요.
늘 말씀드리는 것이지만 문제가 이해가지 않거나 오류가 발생하는 부분.
과감하게 피드백 주세요.
저도 미숙한 부분이 많지만 서적을 뒤져서라도 답을 찾아서 답변을 드리겠습니다.
퀘스트.
잘 해결되었나요?
늘상 말씀드리지만 래더를 그리고 프로그래밍하는데에는 정답이 없습니다.
어떻게 프로그램을 짜도 제어를 하기만 하면 됩니다.
우리는 학교 수업처럼 시간재고 문제를 푸는 것이 아니며, 평가받는 것이 아니고 문제 해결이 목적이기 때문입니다.
물론 A프로그래머는 100줄로 기능을 구현하였는데
B프로그래머는 그 과정에 불필요한 부분을 제거하여 50줄로 기능을 구현하였다면 실력이 있다고 보겠지만.
어쨌든 사용자 입장에서는 프로그램의 줄수가 짧던 말던 전혀 상관이 없습니다.
에러없이 잘만 돌아가면 100줄이든 50줄이든 모두 훌륭합니다.
QUEST1
문제 a). D0와 D1으로부터 시간을 받아와 7-SEGMENT상 출력될 수 있는 로직을 구현해보시고.
(D0와 D1은 각각 D2와 D3에 매칭되어야 함)
D0는 분, D1은 시간
->
이를 쉽게 구현하기 위해서 단계적으로 구현을 해볼게요.
먼저 시계 로직을 만들어볼까요?
포인트는 T0가 올라간다고 해도 D0에 즉각 즉각 수치가 변화하는게 아니라는 것.
(T0는 초의 단위인데, 7-SEGMENT는 분의 단위부터 표현하기 때문입니다.)
또한 분의 표현 단위는 0~59 이며 시의 표현단위는 0~23이라는 것.
분의 표현단위와 시의 표현단위의 한계가 넘어가면 0으로 떨어진다는 것.
이 3가지 포인트를 잘 이해하셔야 래더링을 할 수 있어요.
아래는 시계 로직만 구현한 것이에요.
위에까지는 별거 아니였죠?
본격적으로 7-SEGMENT로 표현하는 부분을 다뤄볼게요
7-SEGMENT를 표현하기 위해서는 어쩔까요??
이 엑셀파일을 참고해보시면 몇가지 특징을 발견할 수 있어요.
노란부분과 빨간부분이 분침과 시침의 각자리수를 표현하며
하나의 데이터 레지스터에 저장될 수 있는 이유는 7-SEGMENT가 총 7개의 비트의
조합(정확히 말하면 온점까지 8개)으로 이루어지기 때문에 분침의 일의자리와 십의자리를 나타내기
위해서는 총 16개의 비트가 필요하고 이를 표현하기 위해서는 하나의 데이터레지스터만 필요하기 때문입니다.
요쯤에서 힌트를 얻으시고 스스로 래더링을 해보시기 권장합니다.
해설보시다 정답보이면 맥빠질까봐...
PDF로 해설 공개드립니다.
PDF를 보고 제가 래더링 한부분을 이해해보셔도 좋고
독자여러분 스스로가 제가 드린 힌트를 바탕으로 독창성 있는 레더링을 하셔도 좋습니다.
중요한건 여러분이 스스로 해낼 수 있어야 한다는 사실이죠.
여러분이 아마도 제 해설을 보시고 궁금증을 가질만한 부분에 대해서 정리를 해보면
1. '왜 비명령문을 넣으셨나요?'
-> 비명령문은 독자여러분께서 왜 비명령문을 넣었을지 생각을 해보시길 바라는 마음으로 넣었습니다.
왜 시간은 30부터 표현이 안되도 되는지
왜 분은 60부터 표현이 안되도 되는지 말이죠.
2. 표현중에 [D0.0]은 무엇인가요?
-> 데이터 레지스터는 총 16개의 비트를 저장한다고 하였었죠. D0.0이라는 것은 비트의 실제 위치를
지정합니다. D0.0은 하위 첫번째 비트를 의미하고 D0.8은 하위 9번째 비트를 의미하겠죠.
3. MOV8은 무엇인가요?
-> MOV8은 8비트 전송 명령으로 총 16개의 비트중 8개만 옴기는 명령입니다.
4. 타이머는 왜 T0번을 안쓰셨나요?
-> 진짜 시계를 구현해버리면 24시간이 흘러야 회로가 제대로 돌아가는지 판단이 가능하죠?
제대로 구현했나 확인한다고 하루를 낭비해서야 되겠나요???
기능이 제대로 구현되었는지 편하게 확인하기 위해 시간간격을 줄였습니다.
5. D100과 D101을 넣은 이유는 무엇인가요?
-> 시침과 분침의 각 자리수를 분리하여 표현하면서 이 데이터를 적절하게 이용하기 위함입니다.
C언어로 치면 일종의 버퍼 변수라고 보시면 되는데요
D0와 D1에는 16비트의 데이터가 들어가기 때문에 이를 이용해 먹기가 어렵습니다.
16비트의 데이터를 각각 8개씩 쪼개서 표현하기 위해 사용한 임시 데이터레지스터라고 보시면 됩니다.
문제 b). BIN 혹은 BCD를 활용, D2와 D3를 적절하게 변환하여 엔지니어 입장에서 유지보수가 편하도록
모듈 로직을 만들어보세요. 필요에 따라 레지스터의 추가사용을 허용합니다.
[물론 디바이스 모니터에서 각 비트 통전여부를 확인할 수 있긴 합니다.]
->
요번문제는 간단합니다.
각비트의 통전이 명확히 이루어지는지 알기위해서는 모든 비트를 ON 시키면 되겠죠.
문제 c). 2진수 표현으로 저장할때와 BCD로 저장하는 경우 각각 어떤 장점과 단점이 있는지
생각해보시기 바랍니다.
->
문제 a)에서 결론내린 래더는 BCD를 활용하여 시침 분침을 자리수 별로 분리하였었죠?
근데 BCD로 변환하지 않고 2진수를 그대로 가져다 쓴다고하면 어떻게 프로그래밍 될까요?
문제 a)의 엑셀의 로직을 보시면 시침마다, 분침마다 계산되어져 있는 수치들이 보이시죠?
이걸 일일히 다넣으시면 됩니다.
분침은 00부터 59까지 총 60개의 래더와 시침은 00부터 23까지 총 24개의 래더가 추가되니
D2와 D3의 조합을 사용하여 시간을 표현하려면
총 60 + 24 = 84개 가 필요합니다.
제가말한게 잘 이해가 가지 않으신가요?
엑셀을 곧이곧대로 만들어보겠습니다.
한마디로 노가다판이죠.
래더링 해야하는 부분도 늘고 수치계산도 매우매우 복잡합니다.
하지만 이도 틀린 방식은 아닙니다.
시계기능이 구현되고 있으니까요.
여러분은 어떤게 편하신가요?
저는 BCD 변환이 더 편합니다.
정리하면.
BCD의 장점은 사람이 알아보기 쉽고 줄수의 길이를 줄일 수 있는 장점을 가지고 있으며
BCD의 단점은 데이터레지스터를 많이 필요로하고 메모리 공간이 낭비될 수 있는 단점을 가지고 있겠습니다.
2진수로 프로그래밍 할때의 장점은 머리를 덜써도 됩니다.
but
2진수로 프로그래밍 할때의 단점은 손을 더써야 됩니다. 계산도 더 해야 됩니다.
어떤것이 편한지 어떤것이 불편한지는 독자여러분의 선택을 존중하겠습니다.
QUEST3
문제 a).
반전 명령을 통하여 NOR 회로를 구현해보세요.
NOR는 NOT OR의 줄임말이며 연산결과가 완전히 반대로 됩니다.
다음진리표를 참고바랍니다.
NOR 회로의 수식은 다음과 같습니다
F=(X+Y)' = X' * Y'
->
먼저 X는 P0으로 Y는 P1로 치환하겠습니다.
저는 NOR 회로를 두 가지 방법으로 구현해봤습니다.
첫 번째 방법입니다.
래더를 보세요.
그리고 시뮬레이션 화면입니다.
아무것도 안눌렀을때 P20이 점등됩니다.
P0을 눌렀을때(X, ON시) P20은 소등됩니다.
P1을 눌렀을때(Y, ON시) P20은 소등됩니다.
P0, P1을 눌렀을때(X&Y, ON시) P20은 소등됩니다.
그다음으로 두 번째 방법입니다.
래더를 보시죠.
신기한게 뭐냐면. 첫 번째 방법과 두 번째 방법의 결과가 동일하다는 것.
바로 이것이 포인트에요
시뮬레이션을 한번 돌려보시면 첫 번째 방법과 결과가 똑같다는 것이죠.
아무것도 안눌렀을때 P20이 점등됩니다.
P0을 눌렀을때(X, ON시) P20은 소등됩니다.
P1을 눌렀을때(Y, ON시) P20은 소등됩니다.
P0, P1을 눌렀을때(X&Y, ON시) P20은 소등됩니다.
눈치빠른 독자님은 여기서 제가 구현한 두 가지 방법이 어떻게 도출된 것인지 대충 감을 잡으셨을듯 합니다.
문제를 잘읽어보면 F=(X+Y)' = X' * Y'라고 하였죠.
그렇습니다.
F=(X+Y)'는 첫 번째 방법을 표현한 것이고,
F=X' * Y'는 두 번째 방법을 표현한 것 인데요
이 수식과 래더를 매칭시켜보면 특징을 찾아볼 수 있습니다.
수식상 '+' 기호는 래더에서 병렬 접점로 연결된다.
수식상 '*' 기호는 래더에서 직렬 접점으로 연결된다.
반전 기호는 즉, NOT 회로는 '*'로 표현된다
다른 표현으로 확장하였을때 '*'는 AND 조건이며 '+'는 OR 조건이라는것 입니다.
왜 똑같은 기능을 하는 회로들을 구지 이렇게 다른 방법으로 표현할까요?
다음 회로를 보실까요?
수식은 F = A * B + A + B' 라고 주어져 있는 회로를 앞서 소개한 래더링 규칙으로 변환하여 봅시다.
어떻게 래더가 구현되나요?
A를 P0으로 치환 B를 P1으로 치환하면 아래처럼 회로가 구현이 되겠지요?
시뮬을 돌려 P0과 P1이 각각 0과 1의 조합을 가져 총 4가지 경우수가 발생하는데
이때의 결과값을 봅시다.
먼저 아무것도 안눌렀을때 입니다.
P0만 눌렀을때
P1만 눌렀을때
P0 & P1 모두 눌렀을때
자 정리해보면
P0(X) | P1(Y) | OUTPUT |
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
이 번거로운 회로를 결과값을 동일하게 하면서 더 쉽게 구현할 수 있는 방법이 없을까요?
F = A * B + A + B' 를
F = A * B + A + B' = A * ( B + 1 ) + B' = A + B'
디지털 논리회로를 배우신 분이라면 위와같이 회로를 축약하실 수 있을겁니다.
하지만 비전공자를 위해서 납득이 안가실만한 부분을 소개합니다.
B+1은 1 입니다. 왜냐구요?
B는 0아니면 1이라는 사실은 이해를 하셨으리라 봅니다.
전에 말씀드렸다시피 우린 수학을 배우는중은 아닙니다..ㅎ
0과 1은 전기가 안들어왔느냐 들어왔느냐라고 했지요?
B + 1에서 B는 전기가 들어왔는지 안들어왓는지 모르나 1은 이미 전기가 들어와있습니다.
'+' 기호는 위에서 설명하였듯 병렬회로라 했습니다.
즉 전기가 들어와있는 선과 B라는 명칭을가진 스위치 접점을 병렬로 연결한겁니다.
당연히 B가 전기가 들어오던 안들어오던 결과는 무조건 전기가 들어온다는 사실을 알 수 있습니다.
정리하면 1에다가는 어떤 접점을 붙이던 값이 1 입니다.
다시 돌아와서...
F = A + B' 의 수식을 래더로 그려봅시다.
위 회로를 시뮬을 돌려보겠습니다.
먼저 아무것도 안눌렀을때
P0만 눌렀을때
P1만 눌렀을때
P0 & P1 모두 눌렀을때
분명히 접점이 줄었음에도 불구하고
기능이 똑같아요.
OMG.
요래서 여러가지 방법으로 표현하는게 쓸모가 있다는 것이고
여러가지 방법중 가장 래더링이 짧게끔 하는 것이 업무 효율을 높일 수 있다고 할 수 있죠.
허나 기능이 구현되기만 하면 어쨋든 상관은 없습니다.
문제 b부터는 완성된 레더만 보여드릴테니 직접 시뮬레이션 돌려보시고 진리표와 동일하게 결과가
나타나는지 확인해보시기 바랍니다.
문제 b).
다음문제는 NAND 회로를 구현해보겠습니다.
진리표 참조바랍니다.
NAND 회로의 수식은 다음과 같습니다
F=(X*Y)' = X' + Y'
->
첫 번째 방법 래더
두 번째 방법 래더
문제 c).
다음은 Exclusive OR 회로인데요
해석하자면 배타적 논리합이네요. 말이 어렵네요.
하지만 진리표와 논리식은 별거 없습니다.
아래를 참고하여 회로를 구현해주세요.
F = A' * B + A * B'
->
이 문제는 한가지 방법으로만 나타내겠습니다.
더이상 축약이 안되거든요.
뭐 다른방법으로 나타낼려고하면 나타낼수야 있긴합니다.
하지만 가장 짧은 수식을 표현하는 것으로 넘어가도록 하겠습니다.
아마도 이렇게 회로를 짜셨을겁니다.
결론부터 말씀드려보자면 위 회로는 틀렸습니다.
왜냐하면 '*'가 앞선 래더의 모든 반전을 의미하기 때문이지요.
위 회로는 따지자면 F= X' * Y + (X * Y)' = 가 됩니다.
축약하자면 F = X' * Y + X' + Y' = X' * ( Y + 1 ) + Y = X' + Y' 가 되겠습니다.
즉 X와 Y가 모두 ON 일때만 0이 됩니다.
그렇다면 우리가 만들고 싶은 F = A' * B + A * B'는
어떻게 만들어야 할까요?
답을 이해하기 위해서는 PLC가 스캔하는 순서에 대해서 이해하고 있어야 하겠죠.
자 위에 순서를 이해해서 위와 동일한 회로를 구현해 봅시다.
F = A' * B + A * B' 는 위 순서에 입각하여 구현코자 할때
아래 래더와 같이 만들면 가능할겁니다.
PLC 래더 특성상 NOT회로가 전단 로직의 모든 것에 대해 부정을 하기 때문에
스위치 순서를 바꿔주는 것이죠.(BOOL 대수의 교환법칙)
시뮬레이션을 돌려 진리표대로 작동하는지 확인해보시기 바랍니다.
문제 d).
Exclusive NOR는 Exclusive OR 회로를 반전명령 한것으로 이해하시면 됩니다.
가장먼저 수식을 기억해주시고 진리표로 접근하시면서 이해하시는게 더 효과적일 거에요.
F = (A+B') * (A'+B)
->
이건 너무 쉽습니다. 앞문제에서 마지막에 반전명령만 추가하면 되니까요.
래더는 이렇게 생겼습니다.
QUEST4
발권기가 선착순으로 10등까지 행운권을 발권하는데요
1부터 10까지는 계속 증가하면서 P20 모터가 동작하여
발권이 되지만 11등 부터는 P20은 정지하고 프로그램을 종료하는 것이죠
문제 풀이를 위해 힌트를 드리면...
명령어는 2가지를 사용해야하는데요
사용법과 의미는 다음과 같습니다.
[JMP LABEL] -> LABEL 위치로 점프.
[LABEL]-> 점프해서 위치할 시작 지점.
입니다. 한번 구현해보세요.
->
래더???
이렇게 한번짜보세요
이렇게 짜고 시뮬레이션을 돌리면 어떤결과가 발생할까요?
일단 P0한번 눌러보면
P20이 켜집니다.
P0을 계속계속 눌러봅시다.
계속 켜졌다 꺼졋다합니다.
근데 10이 되는순간?
P20이 안켜져요.
C0가 ON이 되는순간 JMP 구문이 작동하기 때문인데요.
우리는 여기서 JMP라는 동작이 스캐닝 동작중에 건너뛰고 싶은 래더를 지정할 수 있구나라는 사실을 알게됩니다.
한마디로 스캐닝동작중에 씹는 래더 영역을 지정하는거죠.
추가적으로 설명드리면 레이블을 설정하기 위해서는
아래 화면과 같이 주황색 부분을 더블클릭하면 아래 팝업창이 드는데
여기서 레이블을 선택하고 확인을 눌러주시면
레이블 리스트 창이뜹니다.
여기서 JMP 명령에서 지정해주었던 이름과 동일한 이름을 레이블로 지정해주시면 됩니다.
QUEST5
물류자동화 공장내에 운전하고 있는 자동화 로봇이 에러가 났어요.
에러가 나는 것은 실제로 에러관련 플래그가 발생하겠으나
우리는 P0이라는 감지부로부터 에러의 발생을 감지한다고 가정하겠습니다.
엔지니어가 현장에 도착했는데 언제부터 어떤 에러들이 났었는지 그 이력이 궁금한거죠.
에러가 발생했을 때의 시간 궁금합니다.
PLC는 특수명령중 시간을 넘겨주는 명령이 있는데요
[DATERD D0]
명령입니다.
이것을 잘 활용하셔서 문제를 풀어보세요 단, 에러는 여러번 발생할 수 있으며
최대 5개의 에러발생 시각이 기록되어지고 선입 선출 방식으로 데이터가 새로 채워집니다.
->
LS산전에서 배포한 XGK 메뉴얼에 보면 총 4개의 데이터 레지스터가 필요하단 사실을 알 수 있어요.
메뉴얼에 사실 설명이 너무너무 잘나와있어 따로 설명이 필요가 없을 정도입니다.
다만 (3)번에서 금요일이면 H05가 되는데 메뉴얼상 오타로 보입니다.
제가현재 포스팅을 작성하는 시점 2020-07-21 화요일에 오류가 났을때는 데이터레지스터에 어떻게 저장이 될까요?
위 기능을 구현하는데에는 다양한 방법이 있겠지만 저는 이렇게 래더를 짰습니다.
위에 짜놓았던 로직을 시뮬레이션 돌려봤습니다.
그다음 디바이스 모니터를 통하여 데이터를 뽑아봤습니다.
먼저 이해해야 하는 부분은 데이터레지스터 D0부터 D3까지는 캡쳐한 시점에 데이터가 들어가고
D4~ D7 : 에러가 첫 번째 났을때의 D0~D3값 저장
D8~D11 : 에러가 두 번째 났을때의 D0~D3값 저장
D12~D15 : 에러가 세 번째 났을때의 D0~D3값 저장
D16~D19 : 에러가 네 번째 났을때의 D0~D3값 저장
D20~D23 : 에러가 다섯 번째 났을때의 D0~D3값 저장
요런식으로 저장이 됩니다.
메뉴얼에서 설명한 이론대로 디바이스 모니터의 D0~D3의 값을 해석해보도록 하겠습니다.
각 데이터레지스터는 BCD 형태로 값이 저장된다고 하였으니 4비트 단위로 한자리씩 쪼개질겁니다.
8개 비트면 십진수로 2자리를 나타낼 수 있죠 데이터 레지스터는 16비트 이기 때문에
십진수로 표현하였을때 총 4자리를 나타낼 수 있습니다.
정리하면
D0 : 월/년 -> 07 / 20 -> 07월 20년
D1 : 시/일 -> 21 / 21 -> 21시 21일
D2 : 초/분 -> 22 / 54 -> 22초 54분
D3 : 백년/요일 -> 20 / 02 -> 2,000년 (20백년), 화요일(숫자 2에 해당)
나머지도 같은 방식으로 해석이 가능합니다.
GMOVP가 기억이 나지 않으시는 분들은 이전 포스팅을 참고해주세요.
QUEST6
래치의 개념에 대해서 설명드리면서 공장에서 이루어지는 프레싱 기기의 횟수 기억 기능에 대해서 설명드린적
있습니다.
공장에 300번 프레싱을 한뒤 기구적인 수명을 고려하여 유지보수 하는 상황인데요.
300번 프레싱을 하기위해서 물리적으로 많은 시간을 필요로 하고 공장은 주말마다 쉬기 때문에
이때는 전원이 차단되어야 합니다.
바로 그 프레싱 기계를 구현해보도록 하겠습니다.
P0: 공정시작 버튼
P1: 공정중지 버튼
D0: C0값이 저장되며 래칭기능을 유지한다
C0: 프레싱동작에 대한 카운팅 갯수 (300개 진입시 초기화 되고 C0는 20ms마다 D0에 저장된다.)
P20: 프레싱기구 모터
->
사실 위 기능은 비교적 레더로 구현하기 간단합니다.
이렇게 래더를 짜주신 이후에 기본 파라미터 설정에서
좌상단 영역 1사용 체크박스 선택
래치영역 항목에서 데이터레지스터 D 우측 체크박스 사용 선택
확인 클릭
이렇게 하면 20ms 마다 샘플링된 수치가 PLC 베터리에 저장되어 전원을 끈다고 하더라도 그 값이 보존되어
전원을 껏다 켜도 몇번 프레싱 기구를 사용하였는지 확인이 가능하게 됩니다.
아쉬운점은 이 기능이 제대로 구현되는지 확인을 하려면 실물 PLC가 있어야 하는데...
그이상은 보여드릴 수가 없는점은 아쉽습니다...
또, 문제를 풀다보니 접점을 수정해야 하는 것들이
생기고 약간의 문제상 수정이 있었네요...
이전 포스팅의 문제를 약간 수정하였습니다.
물론 문제 자체가 바뀐건 아니고 시뮬레이터로 버튼기능이 안되는 것들에 대해서만 수정을 하였습니다.
오늘도 최선을 다해 최대한 쉽게풀어서 설명드리고자 하였으나 저도 제가 직접 포스팅 작성하면서 어렵네요.
이제는 뭐라고 떠드는지도 모르겠어요.
하나의 포스팅을 쓰기위해 거의 1주일 정도 고민하고 쓰는거 같아요..
제가 여러분께 당부드리고 싶은 것은.
고민하고 스트레스 받는만큼 여러분은 전문가가 된다는 사실이에요.
복잡한 PLC 공부하겠다는 다짐으로 구지 찾아 들어오셨으니 포스팅은 넘겨집지 마시고
스트레스 팍팍 받다 가시기 바랍니다.
분명 여러분은 그 과정의 반복속에 실력이 쌓일거니까요.
오늘은 여기까지만 할게요.
끝.
'PLC > PLC(XG-5000)' 카테고리의 다른 글
18. Step Relay의 개념 (1) | 2020.08.03 |
---|---|
17. Master Control Set(MCS)의 개념 (0) | 2020.07.28 |
15. BIN/BCD, 반전명령, 특수릴레이, 래치의 응용 (0) | 2020.07.08 |
14. 트렌드모니터링, 래치의 개념 (0) | 2020.07.07 |
13. 특수릴레이의 개념 (0) | 2020.06.30 |