본문 바로가기

Programmable Logic Controller

[PLC 중급] MPS(Modular Production System) 제어

오늘은 자동화설비산업기사 시험과목인 MPS를 PLC로 제어해보겠습니다.

 

우선, MPS는 HMI로 구성이 불가능하기 때문에 실습장비 or 시뮬레이터가 필요합니다.

 

저는 한국기술교육대학교 산학협력단에서 제공되는 Unity기반 MPS 시뮬레이터를 사용하였습니다.

 

이에 관한 내용은 아래에 링크 첨부해두었습니다.

(시뮬레이터와 강의 모두 무료로 수강 및 다운로드 가능합니다.)

[출처]

https://sandan.koreatech.ac.kr/kor/Main.do

 

한국기술교육대학교 산학협력단

[과학기술정보통신부] 2025년도 제1차 정보통신․방송 기술개발사업 및 표준개발지원사업 신규지원 대상과제 공고

sandan.koreatech.ac.kr

https://www.step.or.kr/home/integrateMng/cmmSys?subRedirect_url=https%3A%2F%2Fekt23.step.or.kr%2FcrsDetailForm.do%3Fcrscd%3D374977%26crsseqId%3D222220

 

국민평생직업능력개발 STEP

 

www.step.or.kr

 

그럼 본격적으로 시작해보겠습니다.

 

1. 구성 살펴보기

전체적인 MPS 시뮬레이터의 모습은 다음과 같습니다.

 

MPS장비, PLC, 위치결정모듈로 구성되어 있습니다.

PLC는 위와 같이 구성되어있습니다.

 

Misbitshi사 모듈형 PLC로 좌측부터, 

 

Q03UDV 는 CPU

QX41은 32점 디지털 입력모듈

QY41P는 32점 디지털 출력모듈

QD75MH2는 32점 위치결정유닛 

입니다.

 

이때 32점이라는 말의 의미를 알려드리면,

PLC에서는 16진수를 사용하죠(1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

이를 고려하여 생각해보면,

 

QX41에 할당된 인풋은 

x00,x01,x02,x03 ... x09,x0a,x0b,x0c,x0d,x0e,x0f

x10,x11,x12,x03 ... x19,x1a,x1b,x1c,x1d,x1e,x1f

으로 총 32개입니다. 

 

그렇기에 32점식 모듈이라고 명명합니다.

 

QX41에서 00~1f 까지 사용하였으므로,

QY41P에 할당된 아웃풋은

y20,y21,y22,y23 ... y29,y2a,y2b...y2f

y30,y31,y32,y33 ... y39,y3a,y3b...y3f

입니다.

 

마지막으로 위치결정모듈은 0040부터 x 32점, y 32점이 할당됩니다.

 

특이한 점은 위치결정모듈은 변수마다 이미 할당된 기능이 있다는 점입니다. 배선을 통해 자유롭게 변수를 사용할 수 없고 모델마다 고유의 버퍼메모리가 할당되어 있습니다.

 

QD75MH2 위치결정모듈의 버퍼메모리는 아래와 같습니다.

 

<위치결정모듈 인풋>

X00 QD75 준비완료
X01 동기용 플래그
X02 사용금지
X03 사용금지
X04 1-AXIS M 코드 ON
X05 2-AXIS M 코드 ON
X06 3-AXIS M 코드 ON
X07 4-AXIS M 코드 ON
X08 1-AXIS 에러검출
X09 2-AXIS 에러검출
X0A 3-AXIS 에러검출
X0B 4-AXIS 에러검출
X0C 1-AXIS BUSY
X0D 2-AXIS BUSY
X0E 3-AXIS BUSY
X0F 4-AXIS BUSY
X10 1-AXIS 기동완료
X11 2-AXIS 기동완료
X12 3-AXIS 기동완료
X13 4-AXIS 기동완료
X14 1-AXIS 위치결정 완료
X15 2-AXIS 위치결정 완료
X16 3-AXIS 위치결정 완료
X17 4-AXIS 위치결정 완료
X18 사용금지
X19 사용금지
X1A 사용금지
X1B 사용금지
X1C 사용금지
X1D 사용금지
X1E 사용금지
X1F 사용금지

 

<위치결정모듈 아웃풋>

Y00 PLC 준비완료
Y01 SERVO ON
Y02 사용금지
Y03 사용금지
Y04 1-AXIS 축정지
Y05 2-AXIS 축정지
Y06 3-AXIS 축정지
Y07 4-AXIS 축정지
Y08 1-AXIS 정전 JOG
Y09 1-AXIS 역전 JOG
Y0A 2-AXIS 정전 JOG
Y0B 2-AXIS 역전 JOG
Y0C 3-AXIS 정전 JOG
Y0D 3-AXIS 역전 JOG
Y0E 4-AXIS 정전 JOG
Y0F 4-AXIS 역전 JOG
Y10 1-AXIS 위치결정 기동
Y11 2-AXIS 위치결정 기동
Y12 3-AXIS 위치결정 기동
Y13 4-AXIS 위치결정 기동
Y14 1-AXIS 실행금지
Y15 2-AXIS 실행금지
Y16 3-AXIS 실행금지
Y17 4-AXIS 실행금지
Y18 사용금지
Y19 사용금지
Y1A 사용금지
Y1B 사용금지
Y1C 사용금지
Y1D 사용금지
Y1E 사용금지
Y1F 사용금지

 

2. 제어환경 구축

PLC를 제어할 때 가장 먼저 해야할 일은 input, output할당입니다. 이를 표로 나타낸 것을 I/O MAP이라고 하구요.

 

저는 다음과 같이 변수를 할당했습니다. 이를 GX Works2 글로벌 디바이스 코멘트에 기입합니다.

 

변수를 할당했다면, 그에 맞는 배선을 해야겠죠?

 

시뮬레이터를 통해 배선을 진행합니다.

 

 

I/O MAP과 똑같이 배선작업을 진행해줍니다. 

 

이렇게 하면, 제어를 위한 기본적인 밑작업이 끝나게 됩니다.

 

그럼 본격적으로 PLC 제어코드를 작성해보겠습니다.

 

3. Ladder Diagram 기반 PLC 제어코드 작성

 

대부분의 PLC강의들에서는 자기유지회로 기반으로 코드를 작성합니다. 하지만 이렇게 코드를 작성하면, 코드가 길어지고 저 개인적으로는 불편했습니다. 그래서 변수를 통한 조건문 활용 디지털 제어를 구현해보았습니다.

 

 

우선, 위와 같이 프로그램을 분리해서 작성하면 편리합니다. 코드를 통째로 작성하면 매우~~ 길어지겠죠? 그래서 각 파트별로 코드를 작성합니다. 입/출력, 공급부, 컨베이어부, 스토퍼부, 서보 이렇게 분리합니다.

 

첫번째로, 입출력부를 보면,

이런식으로 할당했던 x를 m변수와 매칭시켜줍니다. 이렇게 x변수를 직접적으로 활용하지 않는 이유는, 이후 수정이 간편해지고 이중코일 오류를 막기 쉬워지기 때문입니다.

 

 

출력부도 마찬가지로 작성해줍니다.

 

두번째로, 공급부를 보겠습니다.

 

여기서 핵심적인 건, D500 변수입니다. 이 변수를 통해 자기유지회로의 기능을 대체합니다. 위에서 부터 보면, 작동스위치를 켰을 때, D500에 K0이 할당됩니다. K0은 십진수로 0을 의미합니다.

 

이후 공급센서가 on되면, 공급실린더 전진출력을 on하고, 공급실린더 전진센서가 on되면 D500에 K110이 할당됩니다.

 

다음 스텝에서 D500이 K110과 같다는 조건문이 성립하게 되고, M101이 ON되어 공급실린더가 후진하게 됩니다.

 

이런식으로 코드를 쭉 작성해나갑니다.

 

 

쭉 진행되어 송출실린더가 후진까지 완료되면, D500에 K160이 할당됩니다. 그렇다면, 공급부는 초기상태로 돌아가고 이제 컨베이어가 움직여야 겠죠??

 

따라서 D500에는 다시 K0을 할당하고, D600에 K110을 할당합니다.

 

D600은 컨베이어부에서 D500처럼 사용되는 자취변수입니다.

 

이제 컨베이어부로 넘어가보죠.

 

 

컨베이어는 D600에 K100값을 가지고 공급부의 신호를 기다리고 있습니다. 앞전에 공급부에서 D600 K110을 할당했죠? 그러면, 10번째줄이 실행되게 됩니다. 컨베이어가 ON되고 물품감지 센서가 on될 때, D600에 K120이 할당됩니다. 

 

여기서,

파랑색부품= 금속

주황색부품=비금속이고,

 

 

금속은 금속센서on,비금속센서on

비금속은 금속센서 off, 비금속센서on 입니다.

 

따라서 18번째 줄에서 M18의 on 여부에 따라 분기를 하게됩니다.

 

M18이 on되면, 즉 금속이면 D600에 K200으로

M18이 off되면, 즉 비금속이면 D600에 K300으로

 

경우의 수를 나누어 분기합니다.(매우 중요한 개념)

 

 

금속이면, 배출실린더로 배출해야 하기 때문에, D600에 K200,210,220 스텝을 거쳐 배출합니다. 그리고 D600에 K0을 할당해 다시 초기화 합니다. 이때, 컨베이어 ON에 M1000,1001,1002,1003이 모두 사용되는 걸 볼 수 있는데요. 이는 이중코일의 오류를 방지하기 위함입니다. 

 

 

 

최종적으로 컨베이어를 돌리는 건, Y2E 입니다. 하지만 이를 계속 코드내에서 사용하게 되면 필연적으로 이중코일의 오류가 발생하게 되죠. (출력은 코드내에서 절대 반복되면 안됩니다.)

 

따라서 Y2E를 ON하기 위한 변수를 여러개 만들어서 코딩하는 것입니다.

 

다음으로, 비금속일 경우 D600에 K300이 할당되고, 스톱실린더를 하강시킵니다.

 

이후 스텝은 스토퍼부로 넘어갑니다.

 

D600에 K310이 할당되는 순간 10번째 줄에의해 D700에 K110이 할당되며 20번째줄로 넘어갑니다. 이때 M1101신호를 통해 서보모터를 제어하는데요, 서보모터는 조금 후에 설명될것입니다.

 

서보모터를 통해 1층으로 이동후, 흡착패드를 on시켜 비금속 물품을 집습니다. 이후 운반개수에 따라 이동할 층을 정하는데요,

운반개수가 0이라면, 1층으로

운반개수가 1이라면 2층으로,

운반개수가 2 이라면 3층으로 이동해야겠죠?

 

그것을 이렇게 구현할 수 있습니다. 조건문만 잘 사용해서 분기를 잘 한다면 코딩이 정말 쉬워집니다.

 

 

조건문을 통해 원하는 층으로 이동했다면, 흡착실린더를 통해 창고에 부품을 적재합니다. 이후 서보모터는 다시 2층으로 복귀하여 원위치 합니다.

 

이 동작이 모두 끝나면 102번째줄에 따라 C0가 하나 카운트되어 1 증가하고, D600, D700은 0으로 초기화 됩니다.

 

그렇다면 마지막으로, 서보모터부를 살펴보겠습니다.

 

서보모터를 사용하기 위해서는 y40, y41신호가 ON되어야 합니다. 

 

SM400 특수릴레이를 이용해 Y40을 on 시켜주면, x40이 켜지게 됩니다. 이후 y41이 on되어 서보모터가 사용될 준비가 끝납니다.

 

왜 이런 변수가 사용되는 지는 글의 앞부분 위치결정모듈의 버퍼메모리를 참고해주세요 !

 

 

DMOV K100000 U4\G1518을 이용해 모터 속도를 결정해주는데요,

 

이 의미를 설명해드리자면 U4(0040부터 시작하는 모듈)의 G1518(속도를 기입하는 버퍼메모리)

에 K100000을 할당해라라는 의미입니다. 

 

G800은 현재 서보모터의 위치를 나타내는 버퍼메모리이고,  G806은 오류발생시 오류번호를 나타내는 버퍼메모리입니다.

 

MOVP K9001 U4\G1500을 이용해 원점이동을 합니다. 이때 PLS M900이 중요한데요.

 

y50은 위치기동출력입니다.

 

이때!! 주의할점은 이를 계속 on시켜주면 안되고, 펄스on만 시켜주어햐 한다는 점입니다!!

 

그래서 PLS M900을 통해 M900을 순간적으로 on 시키면 y50이 펄스입력을 받고 위치기동을 시작합니다.

 

 

같은 원리로 1층,2층,3층 이동용 코드를 작성합니다.

 

 

y50을 통해 위치기동을 완료하게 되면, 위치기동을 끝냈다는 신호가 x54를 통해 나오게 됩니다.

따라서 이렇게 코드를 구성해 위치기동이 완료됨을 추출하는 M1200~M1204를 구성합니다.

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

최종적인 동작 수행과정을 동영상으로 첨부했습니다. 총6개(비금속3, 금속3)의 부품이 잘 분리되는 것을 볼 수 있습니다.

 

금속은 모두 배출되었고, 비금속은 각각 1,2,3층에 잘 적재되네요.

 

 

 

제가 작성한 GX Works2 코드 파일과 QD75MH2 버퍼메모리 엑셀표도 첨부하였습니다. 궁금한 점이 있으시다면, 댓글 달아주세요 ! 감사합니다.

MPS_control_real_frinal_jkh.gxw
0.99MB
12. Buffer_Devicelist_QD75.xls
0.24MB