\ 전기 엔지니어의 꿈 :: 'PLC 예제' 태그의 글 목록
반응형

안녕하세요 공직자입니다.

 

오늘은 PLC내 특수릴레이라는 개념에 대해서 알아볼겁니다.

 

원래 이번시간에 래치에 대해서도 알려드리고 싶었는데 천천히 깊숙히 흡수하시라고 다음주로 미뤘습니다.

 

특수릴레이에 대해서 알아볼까요?

 

PLC는 여러가지 이유로 사람들이 평소에 필요하다고 생각해놨던 기능들에 대해서 편리하게 사용할 수 있도록

 

일명 매크로 기능을 짜놨습니다.

 

특수릴레이라는 것은 쉽게말해 C언어로 치면 함수모듈이고, 펑셩블록이라고 생각하셔도 좋습니다.

 

이전 포스팅에서 간혹 특수릴레이를 사용한적이 있었는데요.

 

F99번 상시 ON접점이 바로 그것입니다.

 

특수릴레이들은 주로 통신쪽에 많이 사용됩니다.

 

이전에 엔코더에서 설명하면서 Clock 신호가 얼마나 중요한지 설명드린바 있지요.

 

통신은 보내는 놈과 받는놈의 타이밍을 잘 맞춰야 하는데

 

이를 ladder로 구현하기 번거로워 일명 매크로를 짜놧다고 보시면 될 것 같습니다.

 

특수릴레이는 어떻게 사용하고 어떻게 구성되는지 봐볼게요.

 

먼저 XG-5000을 실행합니다.

 

빈 프로젝트를 생성하시고 'F3'을 눌러 접점을 세팅하겠습니다.

 

그럼 '변수/디바이스(T):' 네임플레이트 옆에 TEXTBOX가 보이실텐데요.

 

거기에 F99를 한번 입력해봅시다.

 

그러면 F99가 의미하는 것은 상시 ON접점이며, 그외에도 수많은

 

특수릴레이들이 사용되고 있다는 것을 알 수 있을 겁니다.

 

사실 까놓고 말해서 저도 특수릴레이의 모든 기능에 대해서 알지 못하는데요.

 

우리는 암기 시험을 보는 것이 아니기 때문에 저것을 다 외우기보다는 누군가 열심히 만들어 놓은 것을

 

잘 활용하기만하면 됩니다.

 

어떤 엔지니어도 완벽하게 모든 내용을 외우고 있지는 않습니다.

 

필요에 의해서 서적이나 공부를 통해 해법을 찾는 과정을 거치는데요.

 

모르는 내용에 대해서 얼마나 빠르게 찾아내서 문제해결에 적용할 수 있느냐가 관건인것 같습니다. 

 

즉, 필요할때마다 꺼내쓸줄 아는 능력이 모든 기능을 외우는 것보다 더 효율적이라는 것이죠.

 

PLC라는것은 끊임없이 변화하고 있으며 그 모든 내용을 머리에 놓기에는 우리가 알아야 하는 우선순위 높은

 

중요한것들이 너무 많이 있습니다. 

 

다시 본론으로 돌아와서...

 

해당창의 스크롤을 위로 쭉 올려보니 F0번부터 수많은 특수 릴레이들이 존재하네요.

 

이 부분에 대해서는 독자여러분들이 필요하실때마다 연습용으로 하나씩 래더링 해보시고 직접 깨우치는 것이

 

더 효과적일 거라 생각합니다.

 

저는 수많은 특수릴레이중 몇가지를 추려서 설명드릴려고 합니다. 

 

릴레이 번호 의미 비고
F00099 상시 ON되어 있는 접점  
F0009B 1스캔만 ON  
F00090 20ms 간격으로 클락신호 발생 10ms은 High, 10ms은 Low
F00091 100ms 간격으로 클락신호 발생 50ms은 High, 50ms은 Low
F00092 200ms 간격으로 클락신호 발생 100ms은 High, 100ms은 Low
F00093 1s 간격으로 클락신호 발생 500ms은 High, 500ms은 Low
F00094 2s 간격으로 클락신호 발생 1s은 High, 1s은 Low
F00095 10s 간격으로 클락신호 발생 5s은 High, 5s은 Low
F00096 20s 간격으로 클락신호 발생 10s은 High, 10s은 Low
F00097 60s 간격으로 클락신호 발생 30s은 High, 30s은 Low

 

1. 먼저 F00099 접점에 대해서 설명드려볼게요.

 

평상시 ON인 접점입니다.

 

평상시 ON이면 있으나마나 항상 붙어있다는 이야기일텐데 왜 접점을 쓰는지 궁금하시죠.

 

저도 궁금해서 몇가지 이유를 찾아 보았습니다.

 

XGK초급 Manual(LS산전 배포) 자료에 보면 업다운카운터인 CTUD를 사용하는경우 F99를 사용하라고 명시되어 있네요.

 

근데 CTUD카운터를 사용하려고 만들었다고 하기엔 설명이 뭔가 부족해보입니다.

 

래더는 래더일뿐 실제 회로와는 다른구조라고 이해하시면 편하겠네요.

 

M0를 단순히 단락시켜 놓은 그림은 어찌보면 P24전원으로부터 상시 전원을 공급 받는것처럼 보이지만

(아래그림 참고)

실제로는 그렇지 않습니다. 

 

접점없이 그어놓은 선을 PLC는 어떻게 이해할까요?

위와 같이 이해하게 됩니다.

 

함수로 보시면 될 것 같아요. Y=X+1이라는 함수가 있는데

 

입력이 없다는건 PLC가 이해하기로 Y=? 의 상태가 되어버리는 것이지요.

 

따라서 PLC에게 상시ON되어 있는지 아닌지를 알려주어야 합니다

 

상시ON이라면 Y(M00000)=1일겁니다. 반대로 상시OFF라면 Y(M00000)=0 이겠지요. 

 

 

상시 ON접점을 사용한다면 컴파일이 되지만

 

단순히 단락회로로써 M0에 연결하는 경우는 컴파일이 안됩니다.

 

F00099의 자세한 로직에 대해서는 LS산전에 직접 의뢰하여야 하겠지만 의미가 없는 접점을 만들어 놨을리는 없겠지요.

 

2. F0009B는 한스캔만 유지라고 되어있는데 여러모로 쓸모가 많습니다.

 

한스캔이라는 것은 PLC가 래더를 해석하는 가장 첫번째 Scanning 동작을 의미합니다.

 

C언어로 치면 가장 첫번째 전역변수는 딱한번만 선언을 하듯이 비슷한 개념으로 사용된다고 보시면 됩니다.

 

주로 통신을 하는 경우 인버터와 각 통신보드간의 세팅이 제대로 되어있는지, 통신선으로 연결된 인버터의 상태는

 

정상인지 여부와 데이터레지스터의 초기값 세팅등 여러가지 용도로 활용되어질 수 있습니다. 

 

아래와 같이 래더를 작성하여 확인할 수 있는데 실제로 PLC에 프로그램을 전송한후

 

STOP에서 RUN신호롤 바꾸어주었을때 확인이 가능한 부분이라

 

시뮬레이터로는 보여드릴 수 없는 것이 아쉬운점이네요.

 

3. 다음은 Clock 신호에 대해서 알아볼거에요.

  

Clock 신호는 위에 표에서 보듯이 여러 시간스케일로 나타나집니다.

 

우리는 이 여러가지 스케일중 1초는 ON 1초는 OFF인 스캐닝 주기를 만들어 간단한 예제를 보겠습니다.

 

래더는 아래와 같습니다

 

래더의 A접점 '_T2S'는 F00094 접점으로써 1초간은 High 신호, 1초간은 Low 신호를 발생합니다.

 

출처:https://m.blog.naver.com/PostView.nhn?blogId=leecblee&logNo=221258949185&proxyReferer=https%3A%2F%2Fwww.google.com%2F

상기 그림과 같은 형태가 되겠죠?

 

 

작동시
미작동시

신기하죠?

 

단순히 접점만 주었을뿐인데 마치 타이머기능을 걸어놓은것처럼 혼자서 꺼지고 켜진답니다.

 

이런 신호들은 어느정도 정밀도를 표현하느냐에 따라서 유용할수도, 효용이 없을수도 있는데요

 

바로 앞전 예제의 1초라고 표현된 부분에 있어서 열심히 샌다고 새봤자 정확하게 1초가 아니기 때문에 그렇습니다.

 

PLC 개념에서 설명드렸듯 PLC는 입력과 출력을 스캐닝하며 리프레싱 과정을 거치게 되는데

 

이때 실제로는 측정되는 값의 오차가 발생하게 되거든요.

 

PLC는 1초를 샌다고 새지만 기구간 통신이 이루어지는 속도, PLC의 시퀀스상 동작순서에 의하여

 

실제로는 오차가 생길수 밖에 없는 것이죠.

 

타이머 오차는 어떤 스케일을 사용하느냐와, 프로그래밍상 어떤위치에 있느냐에 따라 달라지게 되는데요.

 

10ms 타이머의 경우 오차는 최대 1스캔시간 입니다.

 

100ms의 타이머 역시 동일한 최대오차를 가지게됩니다.

 

정리하면 보편적으로  ' 1스캔 타임 + 스캔시작에서부터 타이머 명령의 실행까지의 시간' 입니다.

 

이러한 연유로 실제로 이처럼 무한반복하는 Clock을 사용하는 것은 조심스러워야 합니다.

 

아무리 작은 오차라도 누적되면 커질 수 있기 때문이지요.

 

그래도 나는 특수릴레이를 사용하여 코딩을 하고싶다... 하시면

 

오차가 누적되어 문제가 발생하기 이전 적정한 주기로 값을 튜닝해주는 절차가 필요합니다.  

 

조금 색다른 예제를 들면서 해당 기능을 파헤쳐봅시다.

 

이 예제는 P0가 ON, OFF 스위치 역할을 하면서, D0가 0.5초마다 1씩 증가되는 예제인데요.

 

FF은 앞선 포스팅에서 기술하였던것처럼 플립플롭을 의미합니다

 

플립플롭에 입력이 한번 주어졌을때 ON 또한번 주어졌을때 OFF 다시한번 주어졌을때 ON.....

 

입니다. (당연히 기억나시죠?.... 그때 힘들게 포스팅했는데 안나도 기억난다고 해주시기 바랍니다....)

 

좀 특이합니다. 

 

보면. 

 

이런 로직대로 움직이는건데. 

 

상승펄스와 하강펄스마다 동작하게끔 의미를 부여했다는 점이 특이하죠.

 

상승펄스와 하강펄스마다 동작하게 하였으니 따져보면

 

0초, 0.5초, 1초, 1.5초가 되는 순간마다 1씩 증가하게 되는 것이지요.

 

이걸 다르게 표현하면 1초마다 2씩 증가되는 로직이라고도 표현할 수 있어요.

 

시뮬레이션을 돌려봅시다.

 

 

P0를 한번 눌러 M0가 1인 경우에는 M0가 활성화되어

 

0.5초마다 D0가 수치가 느는것을 확인할 수 있네요

반대로 P0를 다시한번 눌러 M0가 0이 되는 경우에는 M0의 활성이 깨져

 

_T1S 접점이 동작하더라도 D0값은 증가되지 않음을 확인할 수 있습니다.

 

자그럼... T0의 용도가 무엇일까요?

 

다음의 경우를 생각 해봅시다.

 

0.5초마다 증가하는 수치는 그대로 두되 10초마다 D0값을 샘플링하여 다른 레지스터에 읽어들이고 싶습니다.

 

D0는 D0대로 증가하지만 D1이라는 별도의 레지스터는 10초마다 D0값을 갱신하여 사용자에게 보여주는 것이죠.

 

이유야 간단합니다.

 

설명을 위해 비유를 드리자면... 우리에게는 시험기간까지 대략 1년이 남았습니다.

 

우린 1년중 수능을 위해서 월별로 공부전략을 짜겠죠. 월별로 크게 잡고 일별로 분할하여 계산할겁니다.

 

몇월 모의고사를 준비하는지, 몇월 단위로 공부계획을 세울지, 몇월달에는 적어도 오답노트 복습을 시작해야하는지에

 

대해서요. 

 

하지만 1년중 몇일 몇시간 몇초까지 짤라서 계산하는 사람은 없겠죠.

(있어도 없다고 하세요... 정상은 아닙니다.[비하할 의도는 없습니다.])

 

정리하면 우리는 시험을 위한 시간의 대략적인 흐름을 파악하여 현재 시점에 알맞는 공부전략을 선택하면

 

되는 것이지 몇초 단위로 공부전략을 짜는것은 별의미가 없다는 것입니다.

 

모든 값에는 유효한 부분이 존재하고 무의미한 부분이 존재하기 마련이지요.

 

D0의 작은 수치는 순간적인 값을 읽어들이기는 좋지만 사용자가 모든 수치의 변화과정을 볼 필요는 없습니다.

 

다만, 수치의 추이로부터 그 변화량을 그래프화하여 데이터의 특성을 보편화하면 그걸로도 충분히 의미있는

 

데이터이니까요.

 

다시 문제로 돌아가보죠.

 

래더는 아래와 같이 작성해봅시다.

 

0.5초 간격으로 증가하는 데이터레지스터 D0값을 4초마다 D1으로 불러들이는 예제입니다.

 

D00001에는 8이 찍혔네요 왜 8이 찍히는지 이해하셨나요?

 

직관적으로 보았을때 가장 첫번째 봉(?)의 상승엣지 부분을 빼면 4초의 상승엣지구간까지 더했을때 8이 되는것 같네요. 

 

왜인지 우리는 자연스레 아래 그래프를 떠올리게 됩니다.

 

 

여기서 우리가 생각해야 하는점이 있어요.

 

1. 시간이 0인 경우에는 카운팅이되지 않는다는점.

2. 타이머의 현재값 갱신 및 접점의 ON/OFF는 END명령 실행 이후 다음스캔인 점.

 

D00001은 정확하게 4초가 된시점에도 상승펄스를 감지할 겁니다.

 

왜냐하면 타이머의 현재값이 갱신되고 ON/OFF의 명령이 들어가는 시점이 [END]명령 이후이기 때문이지요.

 

추가로 타이머의 수치를 50으로 바꿔보겠습니다.

 

0.5초 간격으로 증가하는 데이터레지스터 D0값을 5초마다 D1으로 불러들이는 예제입니다.

 

근데 문제가 발생했습니다.

 

시뮬레이션을 돌려보면 이상한 현상이 발생합니다.

 

시뮬레이션을 돌려보니 아래와 같이 D00001에는 11이 찍혔습니다.

 

아까의 논리대로 계산이 맞다면 D00001에는 분명 10이 찍혀야 할텐데 말이죠.

 

타이머는 분명 5초인 시점에 [MOVP] 명령을 통하여 값을 인식할 수 있도록 명령을 주었을 것입니다. 

 

왜이런 현상이 발생할까요??

 

음변환 검출접점을 넣으니 문제가 조금 이해하기 어려울듯 하여 양변환 검출접점만 놓고 아래 래더를 보면서

 

시뮬을 돌려봤습니다.

 

 

시뮬을 돌려놓고 가만히 보자면 D0가 분명 D1을 따라가긴 하는데 타이밍이 조금 이상합니다.

 

즉각 즉각 변화해야 할 것 같은 수치들이 한박자 늦게 동작하거나 동시에 동작하는 상황이 발생했어요.

 

타이머도 1초간격이고 Clock 신호도 1초간격의 상승펄스마다 동작할텐데 왜 이런현상이 발생 했을까요?

 

기나긴 이야기를 지금 시작합니다.

 

잘 따라오실꺼죠?

 

타이머는 정확하게 수치를 측정할수 없다고 말씀드렸었죠.

 

LS 산전 XGK 메뉴얼 발췌

 

아래 타임차트에서 5인 지점의 값을 D1으로 찍고싶다고 가정해봅시다.

 

타이머는 5에(아래그림) 해당하는 부분에서부터 [END]를 만나기 이전까지 아무것도 할 수 없습니다.

 

그 말인 즉슨 0부터 세서 실제로 5초인 순간이 하필이면 입력 리프레싱 출력 리프레싱 순간이 아니라

 

레더를 해석하는 과정에 있다면, 필히 [END]를 만나기까지 대기해야 하는 불상사가 벌어지는 것입니다.

 

빨간색선이 만약 아래 타임차트의 4라는 부분에 걸쳐있게되면 5라는 부분 이후에나 그수치를 인식하겠지요.

 

최대 1스캔 간격입니다. 

 

앞선 예제와 연관하여 쉽게 풀어설명하자면 [MOVP D0 D1] 명령에 대한 결과값 출력은 어쨋거나 [END] 명령이후에

 

이루어지므로 시간상 5 라고 가정한 붉은색 선에 대한 시간을 PLC가 인식하려면(아래그림) [END]까지 조금더

 

기다려야 합니다.

 

또한 다음 스캐닝 동작 7.5쯤 되는 부분에서 [MOVP D0 D1]을 마주하고 실시간으로 측정된 값이

 

디바이스 이미지 메모리에 저장된 후 [END]에 닿아 출력 리프레싱이 될때까지 기다려야 합니다. 

 

바로 우리가 눈으로 보는 값들이 출력리프레싱 된 값들인데요.

 

그러나 이렇게 해당 예제에서는 스캐닝으로 인한 지연동작이 생긴다고해도.

 

사실 스캐닝 동작이 워낙빠르고 1초 Clock의 상승 펄스 하강펄스 검출이 스캐닝동작보다 빠르게 변화하는 것은

 

아니어서 이러한 오차는 고속의 스캐닝 동작에 의하여 보정이 될 것 같습니다. 

 

그럼 수치가 이상하게 찍히는 부분에 대해서 다른원인을 찾아보아야 하겠는데요.

 

이그림은 XGK 메뉴얼에서 발췌하였습니다.

 

어느 PLC 포스팅을 보아도 이런 내용에 대해서 기술한 것은 보이지가 않네요.

 

그래서 소개드립니다.

 

타이밍차트가 좀 특이합니다. LS산전의 메뉴얼 예제에서 P0를 누르면 곧바로 통전되어 타이머가 동작할듯하나

 

실제동작은 그렇지 않고 오차 간격을 가지게되네요.

 

사람이 P0를 누른시간과 실제로 타이머 코일의 동작에 대해 동작하는 시간 차이에 대해서 *2라고 설명하고 있습니다.

 

쉽게말해서 *2는 프로그래밍상의 위치에 따른 오차인데요.

 

PLC가 래더해석을 한줄 한줄 한스텝 한스텝 하다보니 물리적인 시간이 소요되고.

 

실제로 동시에 진행되는것처럼 보이지만 그렇지 않다는 점을 말하고 있습니다.

 

*1은 우리의 예제와 같은 사례에 대해서 설명하는 글이네요.

 

'0부터 새었을때 실제로는 8의 위치가 점선부분이지만 어쨋거나 [END]를 만나야 타이머가

 

최신화되므로 8초보다 시간적으로 더 늦은 위치에 8이라는 수치가 부여가 된다'라고 이해하시면 될듯 합니다. 

 

위의 그림과 밑의 그림이 다른이유는 실제위치와 PLC가 인식하는 시간위치의 오차에 대한 그림으로 이해하시면 됩니다.

 

또 한스캔동작에는 그림에서 표현하길 타이머의 계수가 1개인 경우도, 2개인 경우도 존재합니다.

 

실제로 스캐닝주기는 21ms인데 타이머로는 10ms밖에 측정이 안되기 때문에 이런경우가 발생할 수 있겠죠.

 

21ms과 10ms의 최소공배수는 210ms이죠.

 

그말인 즉슨 210ms 마다 21ms 스캐닝 주기와 타이머의 10ms은 각각 10번 21번 주기동작을 하다가 결국 만나게

 

된다는 의미인데요.

 

이에 따라서 한스캔을 동작시킬때마다 계수가 다를 수 밖에 없다는 점을 시사합니다.

 

그렇게 되면 스캔당 측정된 시간이 달라질 수 있다는 것은 인지상정이겠죠.

 

타이머의 계수가 실제로는 다소 불규칙적이고 스캔당 포함되어 있는 타이머의 계수에 따라 시간이 카운팅된다는 점을

 

미루어 보았을때 LS산전에서 클럭신호도(매크로) 역시 타이머와 같은 원리로 동작되게끔 설계하였다면...

 

210ms 이내의 구간의 래더 해석에 있어서는 스캐닝 주기가 타이머 계수의 주기보다는 11번 덜 동작해야하므로

 

1스캐닝 주기내에  여러개의 타이머 계수가 들어가있겠네요.

 

그렇게 되는경우 한번 스캐닝 동작에 의하여 한번에 20ms이 작동되는 경우가 있고

 

때로는 한번 스캐닝 동작에 의하여 10ms만 인식되는 경우가 있을 겁니다.

 

우리가 들었던 예제처럼 100ms 주기의 타이머를 사용하는 경우를 따져보아도 비슷합니다.

 

100ms(타이머계수)과 21ms(스캐닝 동작)의 최소공배수는 2100ms 입니다.

 

위에 사례처럼

 

타이머계수와 스캐닝동작은 2100ms 마다 다시 만나게되며

 

타이머 계수는 최소공배수를 만들기위해 21번 동작하여야 하고 스캐닝 동작은 무려 100번이나 이루어져야 합니다.

 

이로 미루어 보았을때 어느정도 적절하게 분배되었다면 1 스캐닝 동작에 타이머계수는 대략 0.21개

 

존재한다고 볼수 있지요.

 

거꾸로 뒤집어 말한다면 타이머계수 1개당 4.76개의 스캐닝 동작이 필요하며 적절하게 계산해보면

 

타이머 계수 5개당 23.8개의 스캐닝 동작이 필요하다는 것을 알 수 있습니다.

 

각타이머 계수별로 1부터 5까지 표현해볼까요?

 

1: 4.76 => 5 (0.1초)

[실제 0.1초를 새기위해서는 대략 4.76개의 스캔동작이 필요함. 그러나 PLC는 5개의 스캔동작에서 0.1초를 판단]

 

2: 9.52 => 10 (0.2초)

[실제 0.2초를 새기위해서는 대략 9.52개의 스캔동작이 필요함. 그러나 PLC는 10개의 스캔동작에서 0.2초를 판단]

 

3: 14.28 => 15 (0.3초)

[실제 0.3초를 새기위해서는 대략 14.28개의 스캔동작이 필요함. 그러나 PLC는 15개의 스캔동작에서 0.3초를 판단]

 

4: 19.04 => 20 (0.4초)

[실제 0.4초를 새기위해서는 대략 19.04개의 스캔동작이 필요함. 그러나 PLC는 20개의 스캔동작에서 0.4초를 판단]

 

5: 23.8 => 24 (0.5초) 

[실제 0.5초를 새기위해서는 대략 23.8개의 스캔동작이 필요함. 그러나 PLC는 24개의 스캔동작에서 0.5초를 판단]

 

신기한게 뭐냐면...

 

1개의 계수에 필요한 스캐닝동작이 제각각 다르다는 점입니다.

 

1스캐닝 동작이 메뉴얼대로 21ms를 의미한다면

 

왜 똑같은 시간을 새는데 간격이 달라질까요?

 

0.1초부터 0.4초까지는 각각 5개의 스캔동작인 5*21= 105[ms]씩이나 새야 됬는데

 

희안하게도 0.5초를 새기 위해서는 4*21 = 84[ms]만 새도 된다는 의미입니다.

 

[오차를 방지하기 위해서 LS산전에서 보정치를 준 것이 아닌가 사료됩니다.]   

 

 

 

 

 

하기 그래프는 실제데이터를 기반으로한 XG5000내 트렌드 모니터링 기능입니다.

 

트렌드 모니터링 기능에 의해서 해당 해답을 찾을 수 있습니다.

 

트렌드 모니터링 기능은 오실로스코프 같은 기능을 하는 것으로써 다음포스팅에서 소개드리겠습니다.

 

이기능에 대해서 바로 소개하자면 너무도 포스팅이 길어질듯 합니다. 일단은 이런것이 있구나 정도만 알고 

 

넘어가주시기 바랍니다.

 

아래 그래프는 500ms마다 샘플링된 결과값 입니다.

 

 

 

앞에 설명드린 내용과 연관지어 그래프를 해석해봅시다.

 

이상한점이 보이죠? _T1S는 0.5초 주기 간격으로 HIGH와 LOW를 오가는데 왜 사다리꼴 모양이 만들어지는지 말입니다. 

 

이 부분은 500ms마다 모델링이 되었고 앞서 말했듯이 0.5초를 새기위해서 어느 구간에는 더 짧은 스캐닝 시간을

 

필요로 한다고 하였죠

 

즉 사다리꼴을 형성하는 부분은 실제로는 상승과 하강을 2번한 모양이 그렇게 표현된 것이며, 이가 시사하는바는

 

타이머 계수의 위치가 앞서 설명한 이론처럼 정확한 시간간격으로 분배되지 않기 때문이라고 판단됩니다.

 

이를 고려하여 노란선의 펄스 갯수를 새보면 빨간색선이 상승하는 시점에서 하강펄스를 감지하여 총

 

11이 되는것을 확인할 수 있겠습니다.

 

여기서 우리가 캐치해야 되는점은 시작시간이 17:09:15.6인데 반해 D1이 출력된 시점은 17:09:20.5

 

즉 서로간의 간격이 4.9초로 0.1초가 짧습니다. 타이머 계수가 1개가 덜 먹었지만 5초로 인식을 한다는 의미겠지요.

 

정리하면 사다리꼴이 형성되는 구간은 유독 타이머 계수의 위치가 촘촘하여 어느구간에서 데이터를 캡쳐하느냐에

 

따라서 값이 달라질 수 있다 입니다.

 

그래프로 한번 응용 예제를 확인해볼까요? 

 

그래프상에서는 사다리꼴이 총 2번 형성되었죠.

 

우리는 2번째 사다리꼴이 아니라 1번째 사다리꼴을 봐보겠습니다.

 

17:09:15.6~17:09:17.8 구간에서 캡쳐를 할 겁니다. 시간간격은 2.2초정도 되네요.

 

아까 사다리꼴 모양에서 실제 타이머에 입력하는 수치보다 실제치가 0.1초가 더짧으니 실제치 2.2초를

 

인식시키려면 타이머에는 23이라고 써주어야 되겠군요.  

 

먼저 23을 인식시켰을때 D1값은 5가 되죠?

 

그렇담 22를 인식시켯을 때는요?

 

그러니 [TON T0000 23]을 써주면 한번이 [TON T0000 22]인경우보다 D1값이 하나가 더 크겠네요  

 

맞는지 봐볼까요?

 

 

 

 

여기까지 이해하셨나요?

 

500ms이 아니라 아주 정교하게 그래프를 표현하여 여러분들께 확실히 이해시켜드리면 더 좋겠지만 제능력의 한계로

 

이렇게밖에 설명못드리는 점에 대해서 아쉽게 생각합니다.

 

오늘은 여기까지만 포스팅하겠습니다

 

포스팅에 궁금한점이 있거나 오류가 있는 경우 피드백은 언제든지 환영입니다.

 

코로나가 다시 기승이니 건강 유의하시기 바랍니다.

 

끝.

반응형
블로그 이미지

Lubly0104

전기설계 엔지니어가 알려주는 찐전기

,
반응형

안녕하세요 공돌이 직딩이에요.

오랜만에 찾아뵙게 되었네요..

말씀드렸다시피 국가기술 자격증을 준비하고 업무에 치이고 하다보니 포스팅이

늦어져버렸어요.

그래도 꾸준히 찾아주신 독자 여러분들이 있어서 힘이 나네요

 

다시 힘차게 포스팅을 시작하려고 해요!

오늘은 지난시간에 이어 예제들을 알아보겠어요

이번시간에는 문제가 좀 길고 복잡할 수 있어요. 비교나 조건문 데이터들이 어떻게 응용되는지를 알아볼 것인데

산업에서는 제가 말씀드리는 이런 기초적인 부분보다 훨씬 더 복잡한 로직에 의하여 움직이는 것들이 많습니다.

아래 예제를 보면서 '아 이런식으로 응용될 수 있구나' 라는 마인드로 접근해주셨으면 좋겠습니다. 

모르시는 부분은 댓글 남겨주시면 해설드리겠습니다.

더불어 오류가 발견되는 부분에 대해서는 팍팍 피드백주시면 감사하겠습니다.

저도 배우고 있는 과정이고 여러분과 지식을 공유하는 과정을 통해 성장해나가고 있기에

미숙한 부분이 많습니다.

Quest

Quest 1
자동화 공장에 컨베이어를 움직이는 화물이 있습니다.

이 컨베이어는 물체의 크기에 따라서 총 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경로로 보내줍니다.

이를 기존에 배웠던 비교연산문을 이용하여 로직을 한번 짜보세요.

Quest 2
기차 예제를 보실까요.

움직이는 기차는 기관실과 객실로 나뉘죠.

기관실에서는 기차의 속력을 조정할 수 있고 객실에는 각각 모터가 달려있어서 기관실의 모터 속도지령을 받는다 가정해봅시다.

기관실은 1개가 존재하며 객실은 총 3개가 존재합니다.(2호칸, 3호칸, 4호칸)

기관사는 P0 스위치를 한번 누를때마다 30씩 속도를 증가시킬 수 있습니다.반대로 P1 스위치를 한번 누를때마다 30씩 속도를 감소시킬 수 있습니다.

속도지령치는 기관실 속력 저장 데이터레지스터 D0에 저장이 됩니다.
마찬가지로 객실의 속력지령치 역시 속력 저장데이터 레지스터 D1, D2 ,D3에 저장됩니다.
이 예제를 FMOV로 풀어보세요. 쉽습니다.

Quest3 (시나리오 부연설명 추가 및 문제수정 20.6.16)
차를 사보면 측방 위험감지 옵션들이나 스마트 크루즈기능(?)들이 있죠?
이 시나리오를 간략하게라도 구현해봅시다.

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씩 감소합니다.

위 로직을 증가 관련 레더와 감소 관련 레더로 나눠서 프로그램을 짜보세요.

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에 도달하면 정지합니다.

 

쓰고나니 다소 문제가 길고 복잡해보이네요.

 

말씀드렸듯 실제 회로는 이보다 더복잡하고 정교한 로직으로 이루어질 거에요.

 

간단한 예시들만을 맛보기로 보여드린 것인데요.

 

하지만 꾸준히 하다보면 어느새 기초부터 실력이 쌓이게되어서

 

제가 티칭하지 않아도 스스로 래더링을 할 수 있는 단계에 오르게 될거에요.

 

여러분의 성장을 위해 기도하겠습니다. 

 

그럼 다음주에 문제에 대한 해설을 들고 찾아 뵙도록 할게요.

반응형
블로그 이미지

Lubly0104

전기설계 엔지니어가 알려주는 찐전기

,
반응형

안녕하세요.

 

공돌이 직딩입니다.

 

지난주에는 포스팅이 너무길어서 이번주는 좀 쉬어가려고 합니다.

 

이번주는 XG-5000내의 SET기능과 RESET 기능에 대해서 한번 알아볼건데요

 

기존에 배웠던 자기유지회로 개념과 비교하면서 어떤부분이 다른지 한번 살펴보도록 하겠습니다.

 

먼저 기존의 자기유지 회로를 XG-5000으로 한번 그려볼까요?

 

 

이전에 개념에 대해서 말씀드렸듯 방안의 형광등을 키기 위해서 우리는 스위치를 계속 누르고 있을 수 없다하였습니다.

 

그래서 추가된 것이 A접점을 병렬로 연결하여, 스위치에서 손을 떼어도 지속적으로 통전될 수 있도록 한다고 하였죠.

 

하지만 우리가 실제로 산업에 사용되는 레더를 코딩하다보면 가끔식 A접점을 추가하여 자기유지를 걸어주기가

 

귀찮은 경우들이 종종 있습니다.

 

그래서 SET, RESET코일이라는 개념이 등장하게 됩니다.

 

결론말 말하겠습니다. SET 코일은 스스로 자기유지가 가능합니다. RESET 코일이 통전되기전까지는요.

 

즉, SET코일에 통전이 되면 저절로 자기유지가 걸리고 RESET코일을 통전시키기 전까지 자기유지가 걸린다는 것이죠.

 

산업에서 사용되는 수천줄의 래더를 코딩하다 보면 한줄한줄 절약하는 것이 스캐닝 속도도 영향을 줄 것이고,

 

디버깅도 더 수월하겠죠(눈으로 쳐다봐야 하는 부분이 줄게되니까요).

 

아주 간단한 개념이죠?

 

실제로 이러한 기능은 우리가 아주 애기때(?물론 대학생) 디지털논리회로를 배우면서(아물론 전기과.)

 

플립플롭이라는 것을 배웠을때 배운것으로 지금은 당연히 까먹었겠죠.

 

래더를 코딩할때는 몰라도 전혀 상관은 없지만 우리는 그래도 엔지니어니까 배경지식을 넓혀봅시다.

 

플립플롭의 한 종류인 래치는 한 비트의 정보를 입력 데이터가 바뀌기까지 계속 유지하고 있는 소자를 말합니다.

 

확실히 위키피디아가 이런내용에 대한 설명은 빵빵하네요

 

SR 래치는 가장 간단한 순차회로이다. 여기서 S(set)는 출력 1을, R(reset)은 출력 0으로 되도록 한다는 의미이다. NOR 논리 게이트를 교차 되먹임 입력을 통해 만들어 진다. 저장된 현재 상태출력은 Q로 표시한다.

S과 R 입력이 모두 0이면, Q와 Q 출력 상태가 되먹임(feedback) 입력되어 이전상태가 유지된다. 만약 S (Set)가 H이고, R (Reset)이 L이면, 출력 Q는 H로 된다. 만약 R이 H이고 S가 L로 입력되면, 출력 Q는 L 상태가 된다.

SR 래치 동작[1]특성표여기표

S R Qnext 동작 Q Qnext S R
0 0 Q 상태유지 0 0 0 X
0 1 0 reset 0 1 1 0
1 0 1 set 1 0 0 1
1 1 X 사용제한 1 1 X 0

 

 

즉 Set, Reset 제어는 이런 복잡하고 알기도 싫은 귀찮은 논리회로를 코일 한방으로 해결할 수 있도록 해준

 

아주 고마운 회로인 것이죠.

 

여기까지 정리해볼게요

 

SET 코일은 통전이 되는경우 즉시 자기유지상태이며 RESET 코일에 통전이 되면 자기유지가 해제된다.

 

그럼 XG-5000에서는 SET 코일과 RESET 코일을 어떻게 표현할까요?

 

아래 그림을 참조해주세요

 

하단메뉴에 형광펜이 쳐져있는 부분입니다.

 

Set 코일의 단축키는 Shift + F3

Reset 코일의 단축키는 Shift + F4

 

입니다.

 

 

자기유지회로를 Set, Reset으로 바꿔주면 래더가 어떻게 변화하는지 간단한 예제를 봅시다.

 

위 회로에서 P0를 누르면 코일이 자기유지회로처럼 별도의 병렬 a접점없이 자기가 유지되는 것을

 

확인할 수 있어요.

 

이렇듯 SET이 편리하기도 하지만 자기유지를 해제하기 위해서 리셋코일 명령을 꼭 주어야 합니다.

 

이것에 익숙하지 않는 사람들은 프로그래밍이 꼬여버리게 됩니다.

 

 

두 가지 자기유지 방법중 편한것을 사용하시면 됩니다.

 

한 가지 참고사항을 말씀드리면

 

Set, Reset도 마찬가지로 펄스 접점을 사용하여 신호를 주는것을 추천드립니다.

 

 

간단한 프로그램에서는 펄스접점을 주지 않아도 동작에는 전혀 문제가 없을겁니다.

 

하지만 로직이 복잡해지고 래더간 연관성이 짙어지는 경우 1스캔 주기동안만 신호를 인가할 것이냐

(펄스로 신호를 주는경우 PLC가 회로를 1번 스캐닝 할때에 한해 ON)

 

혹은 여러스캔동안 신호를 살릴 것이냐가 아주 큰 관건입니다.

 

펄스로 신호를 주냐 단순 접점으로 신호를 주냐에 따라서 얘기치 못한 오류를 초래할 수 있습니다.

 

후한을 없애기 위해서 단순접점이 아닌 펄스로 신호를 주는것을 추천드립니다.

 

왜 그래야만 하냐고 물어보면 저도 사실은 딱집어서 설명은 못하겟습니다...

 

하지만 실제로 업무를 하면서 펄스 접점을 주었을때 확실히 디버깅 에러가 줄더군요.

 

참고바랍니다.

 

 

이번주 이론은 이게 끝입니다.

 

 

지난주는 빡시게 달렸으니까 이번주는 이개념만 꽉잡고 Quest로 실력을 쌓아봅시다.

 

Quest1.

 

 

P0은 시작버튼, P1은 중지버튼입니다.

 

위 시퀀스에 맞게 동작하는 회로를 Set, Reset 회로를 사용하여 구성해보세요.

 

완성된 레더는 다음과 같습니다.

 

 

바로 결과모습으로 넘어가요. 별거없네요.

 

궁금한거 있으시면 댓글 달아주세요.

 

다음은 시뮬레이션 결과창입니다.

 

P0를 누르면 계속 램프가 1초 단위로 꺼졌다 켜졌다하면서 반복되는 것을

 

확인할 수 있어요.

 

 

Quest2.

 

일끝나고 엘리베이터를 타고 퇴근중 입니다.

 

1층은 3m 높이이며 권상기(상승방향-P20, 하강방향-P21)은 초속 1.5m를 이동합니다 엘리베이터의 높이는 3m입니다.

 

 

호출버튼은 다음과 같습니다

 

1층 P1

2층 P2

3층 P3

4층 P4

5층 P5

 

엘리베이터는 스스로 층수를 기억하기 위해 각층마다 설치된 램프가 켜져있는 수를 인식합니다.

 

1층에는 P11

2층에는 P12

3층에는 P13 

4층에는 P14

5층에는 P15

 

현재 엘리베이터가 2층에 있다면 엘리베이터가 센서를 통해 도그를 감지하여 P12 램프가 점등되어 있겠죠

 

엘리베이터가 현재위치를 인식하여 호출버튼을 눌렀을때 각층으로 이동하는 로직을 짜보세요..

 

완성된 레더는 아래와 같습니다

 

위의 시뮬레이션을 상상실험을 하는데에는 다소 무리가 따릅니다.

 

그래도 한번 노력해보자구요. 머리속으로 상상해보는 겁니다.

 

각층수를 감지하는 램프는 시뮬레이션시 수동으로 우리가 눌러줄거에요.

 

램프가 눌리는 수만큼 엘리베이터는 해당위치에 존재하고 있다고 가정하고 말이죠. 

 

실제로 시뮬레이션을 돌려보죠

 

5층에 있는 사람A가 2층에 있는 엘리베이터를 호출하기 위해 P5를 눌렀다고 가정해봅시다.

 

그럼 권상기인 P20은 2층에서 5층으로 이동하기 위해 총 P20이 6초동안 회전해야 하는 것이네요?

 

즉 바꿔말하면 타이머 6초동안 권상기가 회전하다가 멈춰야 된다는 것이에요.

 

1초에 권상기가 1.5m를 가니까요.

 

먼저 엘리베이터의 현위치를 인식시켜주기 위하여 P12버튼을 눌러준 상태를 만들어봅시다.

 

, 이상태에서 P5가 눌리면 P20이 6초동안 회전해야하는 것입니다.

 

실제 엘리베이터는 이것보다 훨씬더 고급 로직에 의하여 움직이게 됩니다. 

 

위에서 예를들었던 Lamp대신 Dog라는 놈을 승강로 가이드 각층에 설치해놓고 말굽센서로 인식하여

 

위치를 제어하기도 하고

 

절대위치센서나 Absolute 엔코더를 사용하여 위치를 인식하기도 합니다.

 

위는 한가지 예를 든것에 지나지 않아요.

 

그림이 잘안보여서 첨부파일을 넣을게요 참고해보세요~

SET_RESET QUEST2.pdf
0.11MB

 

Quest3.

 

보행자용 신호등이 있어요.

 

램프는 P20(초록불), P21(빨간불) 두 종류가 있습니다.

 

기본적으로 P20(초록불)은 20초동안 점등되며 P21(빨간불)은 30초동안 점등됩니다.

 

다만, P20(초록불)은 총 20초중 15초 동안은 완전 점등해있고 나머지 5초가 남았을때에는 1초 간격으로 점등합니다. 

 

 

이 문제를 SET, RESET 개념으로 해결해보세요.

 

지난주보다는 내용이 쉽죠?(!)??

 

완성된 래더를 보여드릴게요.

 

 

시뮬레이션도 바로 돌려봅시다.

 

문제에 의한 시퀀스대로 동작하면 성공입니다.

 

 

이번주부터는 태풍이 올라온다고 합니다.

 

근무중 멘탈과 같이 날라가지 않도록 정신꼭 붙들어 맵시다.

 

독자여러분 이번주도 수고하셨습니다.

 

다음주에 다시돌아올게요

 

 

 

 

 

 

반응형
블로그 이미지

Lubly0104

전기설계 엔지니어가 알려주는 찐전기

,
반응형

안녕하세요 공돌이 직딩입니다.

 

장마라는데 비는 안오고 날씨만 푹푹찌네요.

 

그나마 오늘은 비가좀 오겠어요. 비좀 쏟아졌으면 좋겠네요.. 시원하게

 

오늘은 지난시간에 이어서 타이머와 단짝인 카운터에 대해서 공부해보겠습니다.

 

 

카운터라는 놈은 숫자를 세주는 역할을 합니다.

 

사실 사전적 정의나 의미야 인터넷을 서칭하면 많이 나오겠지만 저는 카운터라는 놈을 실제로 어떻게 산업에서

 

응용 할 수 있는지를 설명드리고 싶네요.

 

 

타이머는 시간의 흐름에 따라서 코일 내부로 전원이 인가되어 횟수를 셌다면

 

카운터는 내가 원하는 조건에 따라서 코일 내부로 전원을 인가하고, 횟수를 세는 것입니다. 

 

간략도를 한번 들여다 볼까요.

 

실제로 가장 기본적인 8Pin 소켓은 위 그림과 같은 넘버링을 가집니다.

 

소켓을 보면 8개의 십자나사가 박혀있는데 위 간략도(노란 박스)처럼 넘버링이 됩니다.

 

소켓에 릴레이를 끼울수도 있고, 타이머, 플리커, 카운터등 여러가지를 꼽을 수 있게 되어있죠.

 

물론 전자식도 있습니다. 이런 타이머, 플리커, 카운터 등은 가격이 더 나가고 크기가 작죠.

 

카운터가 끼워진 사진을 보여드리고 싶었으나 해당사진이 없는 관계로 8핀 릴레이가 소켓에 끼워진 사진을

 

첨부합니다.

 

우리는 카운터의 넘버의 역할에 대해서 알아보려고 합니다.

 

아래 표를 보시죠.  

 

번호 명칭 역할
1 공통선(Common)
2 전원코일(AC 220V)
3 RESET 입력
4 COUNTER 입력
5 -
6 OUTPUT
7 전원코일(AC 220V)
8 공통선(Common)

다른 핀번호들은 이전에 공부했던 것과 같은데 특이한 것이라면

 

COUNTER 입력과 RESET입력, 그리고 OUTPUT이 보이죠.

 

1. COUNTER 입력이라는 것에 통전이 되면 숫자가 1 증가한다고 보시면 됩니다.

   즉 3이라는 수치를 만들고 싶다면 COUNTER 입력에 3번 통전을 해주어야겠죠.

 

2. RESET 입력은 COUNTER 값을 0으로 초기화 시켜주기 위해서 사용하는 핀입니다.

   RESET 입력핀에 통전되면 COUNTER 수치가 초기화 됩니다.

 

3. OUTPUT으로는 COUNTER의 현수치가 나타납니다.

  즉, COUNTER 입력을 3번 통전시켜 3이라는 수치를 저장하였다면 OUTPUT에는 3이라는 수치가 출력되는 것이죠.

 

카운터라는놈은 조금만 생각해보면 조금 의아한 부분이 있습니다.

 

COUNTER 입력에 통전이 되면 숫자가 1이 증가한다고 하는데 대체 통전을 몇초간 주어야 수치가 1이 증가할 수

 

있을까요?

 

초보자분들에겐 이런 질문이 조금 어려울수도 있겠습니다.

 

다음 그림을 볼까요?

 

                                     T1                                                                       T2                                         

                                                       

자 T1 시간에 LOW 신호가 HIGH 신호로 뒤바뀌고 T2까지 쭉 유지되고 있는 것을 볼 수 있죠?

 

앞서 언급한 4번핀인 COUNTER 입력에 현재와 같은 신호가 들어가고 있습니다.

 

카운터는 언제 수치를 증가시킬까요?

 

상식적으로 T1, T2라는 시간이 통전되는동안 계속 증가할 수는 없는 거겠죠.

 

직감적으로 T1 시점에 카운팅이 되어야 함을 알 수 있을겁니다.

 

즉 LOW 신호에서 HIGH 신호로 바뀌는 그찰나 말이죠.

 

LOW에서 HIGH로 바뀌는 것을 상승 EDGE구간이다 라고 표현하기도 합니다.

 

여기서 펄스 개념이 나오죠.

 

제어공학이라는 분야에 있어서 처음이자 끝입니다.

 

겁나게 중요합니다. 이 펄스라는놈!.

 

펄스는 아래그림을 보시면 이해하실 수 있습니다.

전압을 주는데 계속 전압을 인가하는 것이 아니라 일정 시간단위로 OFF와 ON을 반복하여 구형파를 만드는 것이죠.

 

사실 이것에 대해서 설명할 것은 무궁무진하지만 카운터라는 주제에서 다루고 있고 잘못하면 이야기가 삼천포로 

 

빠질 수 있기에 단순히 펄스의 개념만 설명하였습니다.

 

다시 본론으로 돌아와보겠습니다.

 

카운터라는 녀석은 HIGH 신호가 얼마나 오랫동안 지속되는냐가 아니라 상승엣지가 몇번이냐에 따라서 수치를

 

증가 또는 감소시킵니다.

상기 그림의 1PULSE는 COUNTER의 값을 1을 증가 또는 감소시키겠죠.

 

그럼 10PULSE는요?? COUNTER의 값을 10을 증가 또는 감소시키겠죠.

 

그럼 거꾸로 뒤집어 생각해봅시다. COUNTER의 값을 125를 만들고 싶어요. 어떻게 해야 할까요?

 

125번의 PULSE를 인가해주면 되는거죠.

 

즉 껏다 켯다를 125번 반복하면 됩니다.

 

이건 실로 엄청난 사실이에요.

 

이것과 연관되어 있는 주제인 PWM(Pulse Width Modulation)이라는 것을 이후의

 

MICOM 제어 포스팅에 대해서 자세히 다룰겁니다.

 

엄청나게 중요한겁니다. 꼭 기억해주세요

 

우리는 카운터라는 놈이 펄스의 상승엣지에 의하여 동작한다는 사실을 알아냈습니다.

 

그럼 수치를 초기화하기 위해서는요???

 

마찬가지겠죠.

 

3번핀인 RESET 입력에 상승엣지를 인가해주면 값이 초기화 됩니다.

 

저는 지금 중요한 개념에 대해서 설명했습니다. 

 

이쯤에서 다시 내용을 정리해주세요.

 

카운터라는 녀석이 대표적으로 산업에 활용되는 것은 엔코더라는 놈입니다.

 

엔코더는 모터의 회전을 측정해주는 기기로 자동차나 로봇 발전기 등등 회전기기가 들어가는

 

모든 분야에 활용될 수 있습니다.

 

엔코더에 대해서 잠시 설명드리지요.

 

그림을 참조해주세요

 

인크리멘탈 엔코더입니다.

 

우측그림에 보시면 원판디스크가 있죠.

 

원판디스크의 특정 부분에 구멍이 뚤려있고 외부에서 원판으로 빛을 비춥니다.

 

원판은 한바퀴 돌때마다 구멍으로 빛이 들어와서 1회전에 1번 빛이 비춘다는 특징이 있는것이죠.

 

간략하게 말해서 구멍이 있는 곳에서는 PULSE가 HIGH가 되고,

 

구멍이 없는 곳은 빛이 투과할 수 없기 때문에 PULSE가 LOW가 되는겁니다.

 

1회전에 1빛이죠.

 

모터가 도는 속도는 겁나빠르죠.

 

육안으로는 측정이 불가합니다.

 

하지만 1회전 1빛의 원리를 사용할 수 있다면 계산할 수 있겠죠, 어떻게 하냐구요?

 

펄스가 몇번 뛰었는지를 확인하는 겁니다.

 

1초에 PULSE가 100번 뛰었다면 모터는 1초에 100번 도는 것이라고 해석할 수 있는겁니다.

 

1초에 뛰는 펄스수를 계산하게 되면 뭐가좋냐???

 

자 다음 상황을 가정해봅시다.

 

우리는 기지값(알고 있는 값)을 통해 미지값(모르는 값)을 구하고 싶어요

 

쉽게 말할게요. 전기 자동차에 모터를 달아놨는데 1초에 몇m 자동차가 가는지 알고싶습니다.

 

기지값은 1초당 모터회전수

 

모터 1회전당 이동거리입니다.

 

1초에 10번 모터가 회전하고

 

1회전당 10m를 주행한다고 보겠습니다.

 

10(회전)/1(초) * 10(m)/1(회전) = 10(m)/1(초)로 계산할 수 있는 것이죠

 

이렇게나 PULSE가 중요합니다.

 

 

 

자... 이제 본격적으로 XG-5000에서 카운터를 어떻게 사용하느냐에 대해서 말씀드려야겠네요.

 

먼저 카운터의 종류에 대해서 알아봅시다

 

XG-5000에서 지원하는 카운터는 크게 4가지 종류가 있어요.

 

1. CTU (COUNTER UP)

2. CTD (COUNTER DOWN)

3. CTUD (COUNTER UP & DOWN)

4. CTR (COUNTER RING)

 

CTU는 이름에서 짐작할 수 있듯이 숫자를 1->2->3->4 .... 순으로 UP시켜주면서 수치를 셉니다.

 

CTD는 그 반대겠죠 CTU로 100이라는 수치를 만들었다면 CTD에 입력신호가 들어갈때마다 99->98->97-> ...로 DOWN하여 수치를 셉니다.

 

CTUD는 그럼 뭐냐

CTUD는 한계치를 설정해놓고 입력값을 계속 주면 한계치만큼 증가했다가 감소합니다.

무슨말이냐면...

7이라는 한계치를 지정해주고 CTUD카운터 입력 신호를 계속주면

1->2->3->4->5->6->7->6->5->4->3->2->1->2... 

이런식으로 되는거죠.

 

CTR은 또 뭘까요

결론만 말해서 CTR은 CTUD처럼 역시 세팅값을 주게 되는데

3을 세팅하였다면 CTR의 입력 신호를 계속 주게되었을때 다음과 같이 동작합니다.

1->2->3->1->2->3->1.....

숫자가 반복되는 것이 마치 원판의 시계바늘이 돌아가는것과 비슷하다고 하여 링카운터로 불립니다.

 

그럼 XG-5000에서는 위의 4가지 카운터를 어떻게 표현할까요.

 

아래를 보고 익혀보세요

 

1.CTU

 

F10은 명령어 창이라고 말씀드렸죠?

 

F10을 눌러서 CTU C0 5를 쳐보세요.

 

타이머처럼 카운터도 비슷한 방식으로 래더를 짤 수 있어요.

 

P0를 5번 눌렀다가 떼면 P20이 점등해야 합니다.

 

이번에 시뮬레이션을 돌릴때는 시스템모니터 창과 레더 창을 같이 봐주시면서 확인해보세요.

 

P0을 눌렀을때 C0위에 카운팅이 되는것이 보이시면 성공입니다.

 

위 실험으로부터 우리는 다음과 같은 사실을 얻을 수 있었습니다.

 

첫 번째. 카운터는 전원이 들어가지 않아도 수치를 기억하고 있다.

두 번째. 상승펄스에 의해서 카운팅이 된다.

 

포인트 1. 상승 펄스가 인가될 때마다 카운팅 수치가 증가한다.

포인트 2. 카운터 한계치에 다다르면 카운터 접점(C0)이 붙는다.

      

두 번째, 상승펄스에 의해서 카운팅이 되기 때문에 사실은 접점기호를 줄때

 

단순기호 접점을 주는 것이 아니라. PUSLE로 주는것이 더 훌륭하다고 할 수 있습니다.

 

지금의 문제에서 기능상의 문제는 없겠지만 프로그램이 복잡해지고 길어질수록 PULSE 접점의 위력은

 

진가를 발휘합니다.

 

펄스를 쓰기 위한 방법은 다음과 같습니다.

 

Shift+F1 상승펄스

Shift+F1 하강펄스 

상승펄스는 OFF에서 ON이된 순간을 1 스캔까지 기억하며

하강펄스는 ON에서 OFF가 된 순간을 1스캔까지 기억합니다.

(참고로 PULSE에 대한 자세한 포스팅은 SET, RESET 포스팅 강좌에서 자세하게 다루겠습니다.)

 

참고로 하나더 말씀드리면 CTU의 경우 전원이 끊어져도 값이 저장되는 특성을 지니고 있는데

 

Shift+F4 버튼을 눌러 카운터의 레지스터 값을 쓰시고 

 

코일을 통전시키면 초기화 됩니다.

 

아래 기호를 참고하세요.

 

 

2.CTD

 

CTD는 CTU의 반대개념이라고 보시면 됩니다. 위와 같이 래더를 만들어놓고 한번 시뮬레이션 돌려보세요.

 

특이한점은 C0의 초기치가 5로 셋팅되어 있죠.

 

그다음은 예상이 가시죠?

 

P0를 눌러 상승 엣지가 감지될 때마다 수치가 떨어지다가 0이 되면 P20이 점등되겠죠.

 

진짜로 그렇게 되는지 해보세요.

 

 

3.CTUD

 

얘는 좀 특이한 카운터에요. UP과 DOWN을 할 것이라는 것은 너무나 자명하지만.

 

앞서 살펴본 카운터와는 다르게 몇가지 특징이 있어요.

 

UP과 DOWN을 시켜주기 위해서 어떤 버튼을 UP으로 쓸건지 어떤 버튼을 DOWN 버튼으로 쓸건지에 대해서

 

지정해주어야 합니다.

 

또한 상시 통전이 되어있어야 한답니다.

 

차근차근 살펴봅시다.

 

입력 형식은 다음과 같아요.

 

[(CTUD) (저장할 공간명칭) (UP 버튼지정) (DOWN 버튼지정) (카운팅 세팅값)]

 

실제로 소괄호는 쓰이지 않습니다. 설명을 위해서 삽입한거에요.

 

다른거는 앞선 카운터와 비슷한데 UP버튼이랑 DOWN 버튼을 지정하게 되어있네요.

 

UP이나 DOWN버튼을 눌러서 카운팅 세팅값이 되도록 해야만 카운터 접점 C0가 통전된다는 의미이네요.

 

더 쉽게말하면 카운팅 세팅값이 10이라고 하면, UP이나 DOWN버튼을 눌러서 10을 만들어야만 C0 스위치가 닫힌다는

 

이야기이죠.

 

처음보는 것이 등장했죠 ON이라고 써져있는 스위치 버튼

 

이것은 무엇이냐 하면.

 

특수 접점이라고 해서

 

F3을 누른후에 F99를 아래와 같이 입력하면 설명이 나옵니다.

 

이 이외에도 많은 접점들이 정의되어 있어요.

 

다알면 좋겠지만 종종 사용하는 것들 위주로 익혀두시면 좋습니다.

 

PLC는 기능이 너무많아서 다알기가 힘들어요...

 

저는 개인적으로 C가 익숙해서 C코딩을 많이 사용합니다.

 

시뮬레이션을 한번 돌려보도록 하겠습니다.

 

 

초기값이 0이네요.

 

P0를 눌러볼까요.

 

C0 카운팅값이 하나 증가했죠?

 

이제 P1을 눌러보세요.

 

카운팅값 C0가 다시 0이 되어있네요.

 

이번엔 10이라는 수치를 맞춰 P20 램프를 켜보죠.

 

C0가 10이 되니 카운터 접점이 통전되어 P20이 불이켜졌습니다.

 

4.CTR

 

회로는 이렇게 짜주세요 

 

시뮬레이션으로 넘어가봅시다.

 

 

역시 C0 초기값은 0이네요.

 

P0를 한번 눌러봅시다.

 

C0가 증가했네요.

 

3이 될때까지 C0를 눌러봅시다.

 

자 우리는 여기서 P0를 한번 더 눌러보겠습니다.

 

어떻게 되는지 한번 봐봅시다.

 

??

 

초기 상태와 같은 모습이 돌아왔네요.

 

자 예측하셧죠...

 

그렇습니다. 이미 위에도 언급했었듯. CTR은 링처럼 계속 순환합니다.

 

 

 

 

 

 

 

대망의 QUEST 시간이 돌아왔습니다.

 

QUEST1.

 

움직이는 컨베이어에 자재가 실려있어요. 이를 센서 P0이 움직이는 자재를 감지합니다. 공작기계(P20)은 P0의

센싱결과에 따라서 반응하는데 10번 단위로 펀칭을 합니다.

(즉, 10, 20, 30번마다 컨베이어 위로 움직이는 자재를 펀칭해줍니다.)

 

위 시나리오를 고민해보세요.

 

완성된 래더입니다.

 

 

제가 왜 이문제를 냈을까요?

 

여러분이 아직 이문제를 풀어내지 못하셨다면 PLC를 공부하는데 있어서 아주 중요한 포인트를 놓치고 계신거에요.

 

현재 상황에서 알맞는 소자를 PLC도구와 매칭하지 못하시는 것으로 많은 훈련을 필요로 합니다~

 

이문제.. 바로위에 언급드렸던 CTR 예제와 동일합니다.

 

다만 접점에 센서라는 의미가 붙었고 QUEST1의 상황의 의미를 부여했을 뿐이지요.

 

현상황을 어떻게 회로로 풀어내느냐가 바로 PLC라고 할 수 있어요~

 

 

P0을 10번 누를때마다 P20이 점등되는지 보는거에요

 

QUEST2.

게임을 만들어 볼꺼에요.

 

사람 A와 사람 B가 있어요.

A와 B앞에는 PUSH 버튼 P0과 P1이 있습니다.

A와 B중 버튼을 먼저 누른 사람이 스코어 1점(COUNTER A, B)를 얻습니다.

단, 연속 2번 먼저 버튼을 누른 사람은 다음에도(3번째) 먼저 버튼을 누르게 될시 2점이 증가합니다.

 

먼저 20점 이상을 채운사람이 승리하게 되는 게임입니다.

 

이 문제는 펄스 입력을 사용해서 풀어보세요.

 

참고로 제가 앞서 설명드린 각 타이머의 특징과 접점의 특징, 스캐닝순서에 대해서 잘 이해하고 있어야만

 

이문제를 풀 수 있습니다.

 

힌트를 좀 드릴게요.

 

1. 카운터는 상승엣지 또는 하강엣지를 검출하여 동작한다.

2. CTU는 전원이 차단되어도 값이 유지되는 특성을 가지고있다.

3. CTUD는 전원이 차단되면 값도 역시 차단된다.

4. CTR은 숫자가 계속 순환된다.

 

완성된 래더도는 다음과 같습니다.

 

 

 

체크포인트 

 

1.P0이나 P1을 2번 연속누르고 수치가 증가하는지 확인한 뒤에 다시한번 버튼을 누르게 되었을때 수치가 2가 증가하는

  것을 확인해봅시다.

 -> 조금의 야매(?)를 부렸습니다. XG5000에는 한번에 2씩 증가하는 카운터는 애석하게도 존재하지 않아요.

      하지만 카운팅을 2초씩 증가하게끔 만들고 싶은데 포기할 순 없잖아요?

      3번째 연속으로 눌렀을 경우마다 P0 또는 P1을 누르는 순간, 떼는 순간에 모두 펄스를 주면 카운팅이 2씩

      될 수 있겟죠.

 2.P0이나 P1을 1번 또는 2번 누른뒤에 P1과 P0을 눌러 CTUD가 초기화 되는지 확인해봅시다.

   문제에 3번을 연속눌러야 2점이 증가하는 조건이 있기 때문에 연속해서 3번이라는 수치를 프로그램적으로 구현해야 

   합니다. 

   저는 CTUD의 전원 차단시 초기화되는 특징을 이용했어요.

  

이번 퀘스트는 시뮬레이션을 열거하는것이 의미가 없겠네요. 그림은 생략하겠습니다.

 

직접 돌려서 눈으로 한번 확인해보세요.

 

 

QUEST3.

 

우리가 배웠던 지식은 누적이 되어야만 합니다.

 

사이클 시작버튼 P0

사이클 중지버튼 P1

 

1. CYCLE 1이 2회전 하고나면 CYCLE 2로 진입합니다.

2. CYCLE 2도 2회전 합니다.

3. CYCLE 1(2회전)->CYLCLE 2(2회전)->CYCLE 1(2회전)->CYLCLE 2(2회전)->전체사이클 중지

 

다음 회로를 짜보세요. 좀 어려울겁니다. 

 

포기하지 않고 하시면 분명히 큰 실력향상이 있으리라 확신합니다.

 

 

CYCLE 1
CYCLE2
전체 도면
0~36
40~END

완성된 레더도를 보니까 꽤 길죠.

 

시뮬레이션 그림은 따로 삽입하지 않겠습니다.

 

P0를 눌렀을때 위 시퀀스에 의해 동작된다면 성공이에요.

 

무슨 포스팅이 이렇게 긴가요 하겠지만

 

잘 넣어두세요.

 

다 도움이 됩니다. 여기까지 읽어주신분은 복권에 당첨되거나 여자친구가 생기겠죠(?)!

 

ㅎㅎㅎ

 

다음주에 다시봐요.

 

반응형
블로그 이미지

Lubly0104

전기설계 엔지니어가 알려주는 찐전기

,