본문 바로가기

Programmable Logic Controller

[PLC 중급] 2축 서보모터 제어

지난 번 시간에는, MPS 장비를 PLC로 제어해보았습니다. 

 

당시, 적재공정에 1축 서보모터를 이용해 1,2,3층을 이동하며 적재를 하였었습니다.

 

이번에는 서보모터 PLC 제어에 대해 심화공부해보기 위해, 2축 서보모터 제어를 해보겠습니다.

 

1축 서보모터보다 더 공부해야 할 내용이 꽤 있으니, 2축 서보모터 제어를 해보시는 분들은 이 글을 참고해주세요:)

 

2축 서보모터 제어에 필요한 시뮬레이터는 한국기술교육대학교 산학협력단에서 제공되는 시뮬레이터를 사용하였습니다.

 

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

 

[출처]

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

 

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

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

sandan.koreatech.ac.kr

 

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

 

1. 구성 살펴보기

전체적인 2축 서보모터 공정 시뮬레이터의 모습은 다음과 같습니다.

MPS때와 유사하게 PLC CPU, 디지털I/O 모듈, 위치결정모듈로 구성되어 있습니다.

 

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

Q03UDV 는 CPU

QX41은 32점 디지털 입력모듈

QY41P는 32점 디지털 출력모듈

QD75MH2는 32점 위치결정유닛 

입니다.

추가된 점은 2축 서보모터 제어를 하기 때문에, 서보드라이브가 2개라는 점입니다. 

 

저번 MPS때도 말씀드렸듯이, 위치결정모듈의 특징은 미리 할당된 버퍼메모리가 있다는 점입니다. 이것이 기존 일반적인 제어때와 가장 크게 다른점입니다.

 

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

 

이중, 2축 서보모터 제어에 사용되는 주요 버퍼메모리를 RED COLOR로 표시하였습니다.

 

<위치결정모듈 인풋>

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번째 슬롯에 장착되었으므로, 0040~005F까지의 주소를 할당받습니다. 위표는 첫번째 슬롯에 장착되었다는 가정하에 작성된 표이므로, 

 

위 표에서 X0 버퍼메모리로 표기된 기능은 실질적으로 X40이 되고, X1F는 X5F가 됩니다.

이 부분은 글로벌디바이스 코멘트에 들어가셔서 마우스 우클릭 - Import from Sample Comment - Intelligent Function Module에 들어가시면 프로그램이 자동으로 입력해주는 기능도 있습니다! 이를 이용하면 일일이 입력해줄 필요 없이 훨씬 쉽게 이용가능합니다.

2. 제어 환경 구축

2-1. 배선

 

I/O MAP과 똑같이 배선작업을 진행해줍니다. (이 부분은 MPS제어부분에 자세히 기술하였으니, 여기서는 생략하고 넘어가겠습니다.) 

2-2. PLC 파라미터 설정

각 모듈을 위와 같이 PLC parameters-program에 입력해줍니다.

 

또한 다음과 같이 INPIT, OUTPUT, MAIN, SERVO로 구성된 프로그램을 구성하였습니다. 이때 !! 주의할 점은 이들 모두 스캔 프로그램에 등록해주어야 제대로 동작이 된다는 점입니다.

2-3. SERVO 파라미터 설정

서보 파라미터를 설정하려면 우선, 사용하는 하드웨어에 대한 정보가 있어야 합니다.

 

1. 서보기구부 : 볼스크류 [5mm/rev], 감속비 [1:1]

2. 서보모터 : 정격속도 [3000rpm], 최대속도 [6000rpm], 엔코더 분해능 [18bit=2^8=262144]

3. 서보드라이버 : MR-J3-10B

4. 위치결정모듈 : QD75MH2 [슬롯 No.2] [선두 I/O : 0040]

 

이에 대한 정보를 바탕으로 아래의 파라미터를 입력합니다.

 

디폴트 값을 제외하고 제가 변경한 값들 위주로 설명드리겠습니다.

 

1. Unit setting : 일반적으로는 mm로 설정(스텝모터는 주로 pulse로 설정)

2. Number of pulses per rotation  : 이는 모터 엔코더의 분해능을 의미합니다. 저희가 사용한 엔코더는 18bit이기 때문에 262144를 입력해줍니다.

3.Movement amount per rotation : 이는 모터 1회전시 볼스크류가 얼마나 이동하는지를 나타냅니다. 볼스크류의 스펙이 5mm/rev이므로 이 부분에는 5mm를 적으면 됩니다. 다만 단위가 마이크로미터(um)로 설정되어 있으므로 5000um를 적어줍니다.

4. Speed limit value : 이 부분은 설정하고자 하는 최대속도를 적으면 됩니다. 보통 정격속도이하로 모터를 작동하기에 저는 이부분에 모터의 정격속도를 적었습니다. 다만 이 부분의 단위는 mm/min입니다. 저희가 알고있는 정보를 조합해보면 모터의 정격속도는 3000rpm(=rev/min), 볼스크류는 5mm/rev입니다. 따라서 이 두값을 곱하면 15000mm/min을 도출할 수 있습니다. 따라서 이 부분에 15000을 적어줍니다.

 

5. Jog speed : 이 부분은 정/역회전 조그 운전에서의 속도를 설정합니다. 조그 운전은 주로 좌표값을 얻기 위해 사용하므로 정확한 위치선정을 위해 조금 느린 속도로 설정합니다. 저는 2000mm/min으로 설정하였습니다.

6. Positioning complete signal output time : 이 부분은 위치결정완료신호를 얼마나 유지할 것인지 설정합니다. 디폴트값은 300ms인데, 가끔 이 신호를 놓치게 되면 다음 스텝으로 넘어가지 못하는 문제가 발생합니다. 따라서 저는 안정적으로 신호를 받기 위해 600ms로 증가시켰습니다.

 

 

Servo parameter 창에서는 Servo series를 MR-J3-B로 설정해주었고 Rotation direction selection 부분을 axis1,2 각각 CCW,CW로 설정하였습니다. 이 부분은 하드웨어 구성에 따라서 달라지는 부분이기에 사용하는 하드웨어적 구조를 생각하여 결정해야합니다.

3. 공정 설계 (제어 목표 수립)

제어 코드를 짜기 전에 어떤 공정을 만들지 목표를 수립합니다. 저는 2축 서보모터를 이용해 3개의 블록을 옮기는 공정을 만들어 보겠습니다.

 

빨간색으로 표기한 1,2,3 블록을 각각 검정색 위치에 맞게 이동하려 합니다.

이를 위해서는 각 점들에 대한 좌표값을 알아야 합니다. 이는 서보모터 버퍼메모리 기능중 하나인 위치측정 기능을 이용해 각 포인트들의 x,y값을 얻어 제어하면 됩니다.

U4\G800 D100 코드를 보면,

 

U4\는 0040부터 시작한는 위치결정유닛을 의미함

G800은 axis1의 현재위치를 담고있는 버퍼메모리

D100은 이 위치를 담기 위해 할당한 변수

마찬가지로,

 

G900은 axis2의 현재위치를 담고있는 버퍼메모리

D110은 이 위치를 담기 위해 할당한 변수

입니다. 이 기능을 통해 각 포인트들의 좌표값을 얻을 수 있습니다.

 

측정 결과는 위와 같습니다. 이를 바탕으로 

위의 Servo Parameter중 positioning axis에 기입합니다.

<x축 좌표입력>

 

<y축 좌표입력>

 

이를 바탕으로, 공정순서를 위한 표를 작성해보겠습니다.

서보모터이동순서 x y
첫번째 1 2
두번째 4 1
세번째 2 1
네번째 4 1
다섯번째 2 2
여섯번째 6 1

 

3개의 블록을 옮기기 위해 서보모터는 총 6번 움직여야 하고 위 공정을 생각해보면 서보모터의 이동좌표순서는 위 표와 같게 됩니다.

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

우선 MAIN 코드부터 살펴보겠습니다.

스위치를 통해 X0를 ON시켜 M0를 ON시킵니다.

 

3개의 블록을 옮길 것이기 때문에 C0를 이용해 옮긴 개수에 따라 D0에 10, 110, 210을 배정하여 코드를 분기 합니다.

 

첫블록을 옮긴다면, C0에 0값이 있을 것이기에 D0에 10이 할당되고 32번째줄로 넘어갑니다.

이 부분이 서보모터를 이용해 1번위치로 이동하는 것입니다. 이를 이해 하기 위해서는 SERVO코드를 우선 이해해야합니다. 서보모터 코드로 잠시 넘어가보겠습니다.

이 부분은 SERVO사용을 위한 초기 세팅 코드입니다. G1518,G1618은 1,2축의 조그스피드를 할당하는 부분이고,

G800,G900은 1,2축 서보모터의 현재위치를 표기하는 부분입니다.

이 부분은 조그 기능, 원점복귀 기능을 수행하는 부분입니다. 여기서 중요한 부분은

 

1. K9001은 기본값으로 배정된 것으로 원점을 의미한다.

2. G1500, G1600은 각각 1,2축에 위치결정데이터를 할당하는 버퍼메모리이다.

3. M100,M200에 PLS를 사용하는 이유는 서보모터가 펄스신호를 받아 기동하기 때문이다.

정도가 있겠습니다.

 

 

이제 중요한 부분인 POSITION DECISION부분을 보겠습니다.

 

아까 MAIN코드에서 M701, M801을 통해 1,2축 기동신호를 주었습니다. 이는 SERVO코드에서 위와같이 구현되어있습니다. 기본적인 틀은 원점복귀때와 비슷하지만, 차이점은 MOVP K1 U4\G1500 이부분에서 K9001이 아닌 K1을 사용한 것입니다.  K1을 G1500에 할당하게 되면 이전에 SERVO PARAMETER에 입력한 1번값 63081um가 G1500에 전달됩니다.

마찬가지로,

M801신호를 통해 2축의 위치결정데이터를 담당하는 G1600에 K2를 할당하여 아래 파라미터 표에서 2번값 80290um가 G1600에 할당됩니다.

그리고 PLS M101, M201을 통해 Y50,Y51에 펄스신호가 전달되어 서보 1,2축이 동작을 시작하게 됩니다. 이때! 직접 Y50, Y51을 바로 사용하지 않고 이렇게 다른 변수를 써서 제어하는 이유가 있습니다. PLC에서는 이중코일을 금지합니다. 따라서 서보모터를 여러번 기동하게 될텐데, 그때마다 Y50,Y51을 써서 기동하게 되면 이중코일의 오류때문에 기동이 되지 않습니다. 따라서 같은 기능을 수행하게 하는 변수 여러개를 만들어서 이중코일의 오류를 방지하는 것입니다.

 

기동을 완료하게 되면, X54,X55에 펄스신호가 들어오게 됩니다. 이는 각각 1,2축의 서보모터가 명령한 위치로 이동을 완료하였을 때 ON되게 됩니다. 우리는 이 신호를 받아서 다음 스텝으로 넘어가게 되는것입니다. 그러면 다시 MAIN코드로 돌아가보겠습니다.

M701, M801을 통해 1,2축 서보모터를 각각 위치1, 위치2로 이동시킵니다. 이 때 한가지 문제가 발생합니다. 1,2축의 서보모터가 위치결정을 끝내는 시점이 다르다는 것입니다. 위치결정완료신호 X54, X55는 펄스신호로 나오기 때문에 시점이 다르다면 AND를 통해 이를 결합할 수 없다는 문제가 발생합니다. 따라서 자기유지회로기능을 이용합니다. M900,M901이라는 새로운 변수를 도입해 펄스신호를 받고 계속 ON되도록 자기유지회로를 구성합니다. 이후 M900, M901을 AND로 연결하여 1,2축의 서보모터가 둘 다 위치기동을 끝내면 MOV K20 D0를 통해 다음스텝으로 넘어가도록 합니다. 이 부분이 매우 중요하니 잘 참고해주세요.

그리고 다음 스텝으로 넘어갔다면 M950을 통해 이전 자기유지를 하던 M900,M901을 끊어줍니다. 그리고 실린더를 하강하여 블록을 흡착할 위치로 이동합니다. 이후 흡착패드를 ON하여 블록을 접착하고 다음으로 이동합니다.

다음 스텝에 넘어가도 흡착패드는 계속 켜져있어야 합니다. 흡착을 계속하고 있는 채로 블록을 이송해야 블록이 떨어지지 않기 때문이죠. 그래서 흡착패드를 ON하는 Y27 출력을 여러번 써야하기에 앞서 말씀드린 것처럼 이중코일의 오류를 피하기 위해 아래와 같이이를 수행하는 변수 여러개를 사용합니다. M500, M501....M512.

M702, M802를 통해 위치4,위치1로 이동하는 명령을 주고, 이후 위치기동이 완료되면 자기유지회로를 통해 M1002,M1102신호를 보존하여 다음스텝으로 넘어갑니다.

 

이제 첫번째 이송의 마지막 부분입니다.

이송완료 위치에 도달한후 실린더를 하강하고 최종적으로 C0 카운트후 D0를 다시 초기값으로 만들어 2번째 블록공정으로 넘어갑니다.

2,3번째 블록 이송과정도 1번째 블록 이송과정과 구조는 똑같습니다. 다만 출력이 중복되지 않게 이중코일의 오류만 조심하여 변수명을 변경해주시면 됩니다.

5. 최종 공정 영상

 

 

제가 작성한 코드와 QD75 위치결정유닛 버퍼메모리 엑셀 파일 첨부하였으니, 참고해주시기 바랍니다.

 

궁금한점이나 더 좋은 방법 공유해주실 것이 있으시다면 댓글 작성해주세요! 감사합니다.

2축서보모터제어_정경호.gxw
0.99MB
12. Buffer_Devicelist_QD75.xls
0.24MB