※ 준비물 : C# , mx component , melsec Q

- mx component란 무엇인가?

PLC와 통신을 편하게 해주는 프로그램입니다.

 

※ 설치방법

https://kr.mitsubishielectric.com/fa/ko/board.do?act=modifyDefultBoard&depth=1&board_id=6&pageIndex=1&category_gubun=25&ut=w&num=20322&rurl=&log_id=&category_1=&category_2=&category_3=&searchItem=title&searchString=mx+component 

 

[로그인] | 한국미쓰비시전기오토메이션(주)

 

kr.mitsubishielectric.com

mx component를 다운로드 받습니다.(윈도우10용으로 받았습니다.)

그림1

압축 풀고 폴더를 엽니다.

그림2

1. EnvMEL폴더안에 setup 설치를 합니다.

2. 2번의 setup 설치를 합니다.

그림3

시리얼 넘버는 GX works2를 설치할 때 사용했던 것을 사용하시면 됩니다.

gxworks2 설치했던 곳

http://www.dawooservo.co.kr/

 

(주)다우에프에이

공장자동화 시스템, 제품 소개, 카탈로그, 프로그램, 교육 일정, 마스크및위생용품, 문의 안내

www.dawooservo.co.kr

※ 설정방법

그림4

윈도우 검색에서 위의 앱을 찾아 관리자 권한으로 실행 합니다.

- 시뮬레이션 설정을 먼저 하겠습니다.

그림5

1. ListView -> Wizard -> Logical Station number순으로 설정합니다.

시뮬레이션은 1번에 저장했습니다.

그림6

GX Simulator2로 설정을 해주시고 Next

그림7

코멘트 작성하고 Finish

- 테스트

그림8

1. Gxworks2를 켜고 melsec에 컴파일 된 파일을 넣는다

2. 시뮬레이션을 켠다.

3. 빨간색 1,2,3번 순서대로 확인해서 successful이 뜨면 성공.

 

- 이더넷 통신을 하도록 하겠습니다.

 

그림9

이더넷은 2번으로 설정

그림10

1. Ethernet board 설정

2. CPU module

3. TCP

설정해주기

그림 11

Host를 Melsec의 IP주소로 설정하면 되겠습니다.

- 테스트

그림 12

successful이 뜨면 성공

 

※ C#으로 프로그래밍 설정

그림13

API를 써야되기 때문에 라이브러리를 추가해줘야 됩니다.

그림 14

위와 동일한 라이브러리를 추가해야됩니다.

- C# Form 구조 만든 것

그림 15

여기서는 연결 버튼과 공급실린더 전후진 한 내용만 올리겠습니다.

- C# 프로그래밍

그림15

1. using ActUtlTypeLib -> 라이브러리를 사용하겠다고 추가하는 것 입니다. 

2. ActUtlType m_PLC -> m_PLC란 변수로 객체를 만드는 것 입니다.

3. 시리얼 통신 연결하는 함수입니다.

   void ComConnectBtn 의 함수는 위의 버튼 함수의 MouseDown을 눌렀을 때 실행되는 함수입니다.

MouseDown에 연결된 ComConnectBtn

   m_PLC.AclogicalStationNumber = 2 -> 위에서 이더넷 통신하는 번호를 적어줍니다.

                                                         (여기서는 이더넷으로 통신을 합니다.)

   int nRtn = m_PLC.Open() -> m_PLC.Open() 통신을 하기위해 접속을 하는 것입니다.

                                         (성공했으면 0을 반환합니다.)

4. 공급실린더 전진을 위한 함수입니다.

   m_PLC.SetDevice("B0" 1) -> SetDevice는 PLC의 메모리에 접근해서 직접 넣어주는 역할을 합니다. B0     의 메모리에 1, 즉 On을 시키는 것입니다. 단 여기서 B0가 항상 On이 되는게 문제가 됩니다. 

   그래서 Mouse Up이 됬을 때 B0를 0으로 바꿔주기 위해 delegate의 무명메서드를 사용합니다.

(Delegate가 어려우면 아래의 방법으로 해도됌)

Mouseup과 down의 함수를 따로 나눠서 씀

5. 공급실린더 후진을 위한 함수입니다.

- PLC 프로그래밍

PLC 프로그래밍

끝~

CPU : QD75P1N , 앰프 : MR-J4-10A를 사용하였습니다.

QD75P1 : QD75 => 위치모듈종류 , P => 오픈컬렉터(만약 D=> 차동드라이버)

(참고 : 오픈 컬렉터는 노이즈잡기가 힘듬. 차동 드라이버는 노이즈잡기가 수월함.)

 

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

그림1

- PLC Parameter에서 I/O Assignment에서 Read PLC Data를 불러온다.

그림2

 

- Intelligent Function Module -> New Module로 파일을 새로 만든다.

- QD75 Type Positioning Module로 설정

- QD75P1N로 설정.

- Acknowledge I/O Assignment 클릭 -> Intelli. 클릭후 Setting 을 눌러서 설정

그림3

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

 

그림 4

- Intelligent Funtion Module -> Parameter 을 더블 클릭을 한다.

- Unit setting : mm로 설정(초기에 움직을 서보모터 단위)

- No, of pulses per rotation : 서보 모터 1번 회전 시 펄스 수

(참고 : hg-kr13의 모터의 경우 최대 분해능 2^22이므로 전자 기어비를 사용하여 최대 분해능 수치를 맞춘다. Ex) PLC 설정 분해능 값 : 2^13 => 8192 , 앰프 분해능 값 : 2^9 => 512로 설정 그래서 최대 분해능 2^22을 맞춘다.)

- Movement amount per rotation : 서보 모터 1번 회전 시 이동거리 설정 여기선 10mm로 설정이 되어있어 , 마이크로 단위로 변경 10000um인데 PLC에서 설정값을 초과하기 때문에 1000um로 설정한다.

- Unit magnification : Movement amount per rotation의 설정값의 배율을 설정한다.

위에서 1000um를 설정하고 10배로 설정하면 10000um가 설정이 되어진다.

- Roatation direction setting : 서보 모터 회전 방향을 결정하여 전진or 후진을 설정할 때 필요하다. (일단 돌려보고 전진,후진 선택을 하여 조정하면 되겠다.)

 

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

 

그림5

- JOG speed limit value : 수동으로 제어 하기 위해 JOG 스피드 조절.

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

 

그림 6

OPR : 원점복귀

- OPR method : Near - point Dog Method로 설정 (DOG 방식으로 설정. 아래에 설명)

- OPR direction : Reverse Direction(Address Decrease Direction) 으로 설정(아래에 설명)

- OPR speed : 500mm/min으로 설정

- Creep speed : 200mm/min으로 설정(아래에 설명)

- OPR retry : Retry OPR  with limit switch로 설정(아래에 설명)

 

아래는 왜 이렇게 설정했는지 설명이다.

그림6

RLS : 하한 센서 (하한 Limit 값)

FLS : 상항 센서 (상한 Limit 값 )

 

DOG : 전원을 껏다가 켰을 시 원점을 복귀하기 위해선 기준이 되는 무언가가 있어야된다. 그래서 서보모터가 움직였을 때 DOG의 기준으로 원점을 찾기 위해 달아둔 센서이다. 

% Creep speed 는 그림 6과 같이 OPR method(여기에선 DOG방식)와 원점 간의 사이에 Speed를 조정하는 값이다.

% OPR direction 는 원점 복귀를 FLS방향으로 시작을 할것이냐, 아니면 RLS 방향으로 시작을 할 것이냐라는 이야기임. 위에선 DOG방식으로 하니깐 DOG방향으로 설정함 그래서 Reverse Direction으로 설정

% Retry OPR 는 FSL, RSL에서 한번더 원점을 찾을지 설정하는 것이다. 여기선 한번더 원점 찾는걸로 함.

 

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

TEST

순서대로 누른다.

Select Function : JOG/Manual Pulse Generator /OPR 로 설정

JOG Speed : 300으로 설정

Forward RUN , Reverse RUN으로 서보모터 JOG 조정하면 끝.

아래의 내용은 "GXworks2"로 작업하였습니다.

그림 1

필자는 그림을 못그립니다... 이해좀 해주세요ㅋㅋ 전구입니니다.

 

위의 그림1을 보면 PB1을 눌렀을 때 전구가 빨간색 -> 노란색 -> 파란색 -> 녹색 -> 보라색 순으로 켜보려고 합니다.

각각의 전구들이 1초간 켜지고 꺼지면 바로 다음 전구가 켜지고 마지막 전구가 켜지면 다시 첫 번째 전구를 켜는걸 할겁니다. 

PB2는 정지버튼 입니다. 전구가 커져 있으면 전구가 꺼집니다.

 

제어 회로입니다.

그림 2

▶ PB1을 누르면 M1을 켜고 M1을 자기유지 시킵니다. 1번 빨간 네모를 보시면 M1으로 T0(타이머0번)을 K10(1초)가 지난뒤 T0가 ON이 되면 D0에 1의 값을 더해 줍니다. (D0는 초기값이 0입니다.) 그리고 T0가 켜지면 T0의 자기 자신을 B접점을 두어 T0를 초기화 시키고 M1이 켜져있기 때문에 다시 타이머를 켭니다.

결국 1초 간격으로 한번식 끊어주고 다시 타이머를 돌리는 원리가 됩니다.

 

▶ 2번 빨간 네모를 보시면 M1이 켜졌을 때 비교연산자를 사용하여 D0의 들어간 값들이랑 비교를 하여 M10 ~ M 14까지 순서대로 켜주게 됩니다.  M10~M14는 임의로 준 값이며 여기에선 M10(빨간 램프) , M11(노란 램프) , M12(파란색 램프) , M13(녹색 램프) , M14(보라색 램프)로 보시면 되겠습니다. 마지막 줄을 보면 [> D0 K4] ----[MOVP K0 D0] 보입니다. 이것은 D0 > 4보다 크다면 D0에 0을 넣겠다는 것입니다. 

그 말은 D0가 5가 될 때 D0에 0을 넣는다는 말입니다.

결론은 4 -> 5가 될때 1초가 지난 뒤에 1을 더해 주니까, M14(보라색 램프) 동작이 끝나고 M10(빨간 램프)로 다시 켜주게 됩니다.

 

▶ 3번 빨간 네모는 PB2가 정지 버튼이므로 정지를 했을 때 처음부터 시작을 하려면 D0의 값을 0으로 바꿔줘야 됩니다. 그래서 넣었습니다.

 

※ 이쯤하면 만들 수 없을까? 라고 생각이 드실수도 있을겁니다. 물론 아닌분들도 있지만... 그래도 해봐야 느니깐 한번 생각 해보시기 바랍니다. 생각이 안난다 싶으면 위의 방법으로 변형을 한번 해보시기 바랍니다. 한 2가지 방법을 더 적겠습니다.

 

첫 번째 방법

그림 3

▶ 1번 빨간 네모칸은 T0를 K50(5초) 동안 타이머를 진행시킵니다. 

아래 줄에 [> T0 K0] - [< T0 K10] 둘다 ON이 되면 M10(빨간 램프)이 켜집니다.

이말인 즉, T0가 0~1초 동안 M10(빨간 램프)를 ON 시킨다는 말입니다. 나머지도 똑같습니다 

0 ~ 1초동안 -> M10 ON

1 ~ 2초동안 -> M11 ON

2 ~ 3초동안 -> M12 ON

3 ~ 4초동안 -> M13 ON

4 ~ 5초동안 -> M14 ON

 

두 번째 방법

그림 4

▶ 위의 방법은 D0의 시작점이 0의 값부터 시작 했는데, 이 방법은 1부터 합니다. 1번 빨간 네모칸을 보면 PB1을 눌렀을 시 D0에 1의 값을 넣습니다. 

이유가 있습니다. 밑에서 설명 하겠습니다.

2번 빨간 네모칸을 보면 ROL이라는 명령어가 있습니다.  여기서 쓰인 명령어는 ROL , SFR , SFL을 썼습니다. 이걸 한번 짚어보고 가겠습니다. 추가로 ROR도 설명 하겠습니다.

 

D 메모리 크기(16Bit)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

이렇게 표현을 할 수 있습니다. 2진수로 표현 됩니다. 저기 한칸 한칸이 1Bit입니다.

 

D메모리 안에 10진수 1을 넣어 보겠습니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

1을 2진수로 16Bit에 표현하면 위쪽처럼 됩니다. 

아까 D0에 10진수 1을 넣었으니 위와 같이 표현이 됩니다.

 

이때 , ROL K1을 하면

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

이렇게 됩니다. 설명을 하자면 "왼쪽으로 1 Bit 움직여라." 라는 뜻이다. 

 

특징은 아래와 같이 설명 하겠습니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

여기서 ROL K1을 하면 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

0자리에 1이 올라간다. 생각해보자. 15번째 자리랑 0번째 자리랑 원모양으로 이어져 있다고 생각하면 왼쪽으로 1Bit만큼 밀었다면 0번째 자리에 1이 올라간다고 생각할 수 있다. 그래서 ROL은 Roate of left 라고 생각하고 해석하면 왼쪽으로 회전 요렇게 생각하면 된다. 그래서 ROL K1을 다시 설명 하자면 "왼쪽으로 1Bit만큼 움직이고 회전할꺼 있으면 회전해라" 라는 뜻이된다.

나머지도 해석을 할 수 있다. "ROR(Rotate of Right) -> 오른쪽으로 Bit를 움직이고 회전해라." 라고 생각할 수 있다.

 

그럼 SFL,SFR은 뭘까? 이것도 똑같다 비트 수 만큼 움직이는 명령어다.  SFL -> Shift left , SFR -> Shift Right 뜻이다. 그럼 다른점은 뭘까? 아래를 보자.

 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

여기서 SFL K1을 하면

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

어떤가? 다 0이 된다. 아까는 회전해서 0번째 자리로 갔지만 이거는 옆으로 가면 아예 없어져 버린다. 

이정도 이해하면 된다. 더 알고 싶다면 C언어 중에 쉬프트 연산이있다. 그걸 참고하면 이해가 더 잘 될 것이다.

 

▶ 아까 위로 다시 가보면  3번 빨간 네모 칸에 D0.0 이 있습니다. 아까 위에서 봤듯이 D0의 메모리안에 0번째 자리를 쓴다는 이야기 입니다. D0.0가 A접점으로 쓰인걸로 보이죠? 네 맞습니다. 1Bit는 0 또는 1의 값을 가지는데 A접점으로 쓰고 D메모리에 0번째 자리에 1이 들어가면 커졌다고 생각할 수 있겠습니다. 그래서 D0.0이 켜지면 M10가 켜지고 ROL K1 한번식 Bit가 왼쪽으로 밀리면 D0.1, D0.2, D0.3... 요런식으로 커졌다 꺼졌다를 할 수 있습니다. 

4번 빨간 네모칸을 보면 SFR K5 오른쪽으로 밀었으니 다시 0번째 자리에 1이 있으므로 처음 상태값이 됩니다. 그래서 똑같은 결과가 됩니다.

5번 빨간 네모칸을 보면 SFL을 k15번 자리로 밀면 죄다 0의 값으로 채워지기 때문에 처음 아무것도 없는 상태가 되므로 [ MOVP K0 D0 ]와 똑같은 결과가 됩니다.

 

 

 

아래의 내용은 "GXworks2"로 작업하였습니다.

※ 타이머란?

어떠한 시간을 주어 그 시간을 이용하여 다음 동작을 하게 만드는 것이다.

그림 1

▶ F7번을 누르거나 코일을 만들어 2번에 다음과 같이 입력한다.

▶ T0 K50 을 누르고 OK를 누른다. (T0 한칸 띄우고 K50을 적는다.)

▶ 설명 : T0란 코일을 만들고 K50(5초동안) 동작 시킨다. PB1을 누르면 자기 유지가 되어 타이머는 동작하게 된다. ( T는 타이머의 약자이다. T의 0번을 만든다는 것이다. M0가 계속 켜져 있지 않으면 타이머는 꺼지는 상태가 된다.)

 

※ 카운터란?

목표 갯수를 적어놓고, 어떠한 동작이 실행되면 그 동작이 목표 갯수에 도달하면 다음 동작을 하게 만드는 것이다.

그림 2

▶ F7번을 누르거나 코일을 만들어 2번에 다음과 같이 입력한다.

▶ C0 K10 을 누르고 OK를 누른다. (C0 한칸 띄우고 K10을 적는다.)

▶ 설명 : C0란 코일을 만들고 K10(10번 목표갯수)가 완료되면 다음 동작을 하게 만드는 것이다. PB1이 켜지면 자기유지가 되어 카운터는 1식 올라간다. 하지만 전기가 한번 들어왔을 때만 올라가기 때문에 PB2로 전기를 한번 끊고 PB1을 눌러서 다시 카운터가 되게끔 하는 방식이다. (C는 카운터의 약자이다. C의 0번을 만든다는 것이다. )

 

※ 여기서 문제점이 있다. 카운터는 동작이 다되었을 때 0으로 초기화가 자동을 되지 않는다. 그래서 따로 0으로 만들어주는 것을 해줘야 된다. 아래를 보도록 하자.

그림 3

▶ C0의 카운터가 다되었다면 C0는 B접점(또는 1 또는 ON상태)이 되는 상태일 것이다. 이때 C0가 켜지면 C0가 초기화가 되는 아주 효율적인 프로그래밍이다. 이때 F8번 또는 Application Instruction 을 만들어서 RST C0로 설정을 해주면 된다

▶ 설명 : RST는 GXworks에서 만들어둔 Function(함수)이다. C언어를 배우지 않았다면 "리셋 하는 기능을 만들었으니 편하게 써라. 예약어는 RST다."라고 인식하면 되겠다.

▶ Application Instruction은 Gxworks에서 미리 만들어둔 기능들을 쓰려면 이걸 쓰고 써라. 정도로 인식하면 되겠다.

 

※ 다른 초기화 방법은 없을까? 아래를 보도록 하자.

그림 4

▶ PB1을 누르면 C0의 카운터가 올라간다. 2번이 올라가면 초기화를 해야된다.

▶ PB2를 누르면 MOVE 기능이 작동한다. Move란 K0 를 C0에 넣겠다는 뜻이다. 여러번 들어오는 경우를 막기 위해서 P를 붙여서 사용한다. 

 MOVP K0 C0 , 설명 : "0의 숫자를 C0"으로 이동 시킨다 라는 뜻이다.

 

※ P에 대해서 알아보자.

P는 Pulse의 약자이다. Pulse는 매우 짧은 시간에 흐르는 전류라는 정의가 있다. CPU는 클럭으로 동작된다. 클럭이란 전류가 흘렀다 멈췄다 요런 개념으로 보면 되겠다.클럭이 올라갔다가 내려갔다가 반복(교류의 파장을 보면 이해가 쉬울것이다.)을 하는데 클럭이 오를때 감지는 것이 P(양변환)라고 보면 되고 클럭이 내려갈때 N(음변환)이라고 보면 되겠다. 고로 올라가는 그 짧은 한순간만 감지 하기 때문에 한번만 동작 하게끔 할 수 있다.

 

※ 연산자란?

말 그대로 연산을 해주는 녀석이다. 사칙연산, 비교연산 두개가 있다.

사칙연산을 해보자.

그림 5
예제

(+ 한칸 띄우고 K30 한칸 띄우고 K50 한칸 띄우고 D1를 입력해야 된다.)

 

1. + K30 K50 D1 80  -> 설명 : 30+50의 값을 D1(80)에 넣는 것이다.

2. - K50 K30 D2 20   -> 설명 : 50-30의 값을 D2(20)에 넣는 것이다.

3. * K20 K30 D3 600 -> 설명 : 20*30의 값을 D3(600)에 넣는 것이다.

4. / K60 K20 D5 3    -> 설명 : 60/20의 값을 D5(3)에 넣는 것이다.

 

 

※ 이것도 문제점이 있다. 프로그램이 돌아가다보면 한번만 계산을 해야되는데 두번 세번 계산 되는 경우도 있을 것이다. 그래서 한번만 들어왔을 때만 계산이 되게끔 해줘야 된다. 아래와 같이 바꿔보자.

예제

※ +p K30 K50 D1식으로 +뒤에 p를 붙어주면 되겠다. 나머지도 동일하다. 

-p , *p , /p 이런식이다.

 

※ 비교 연산을 해보자.

그림 6

(= 한칸 띄우고 K20 한칸 띄우고 K20을 입력해야 된다.)

예제

▶ 1. = K20 K20 --> M1 설명 : 20 = 20 , 20이 20이랑 같다면 참이 된다. 그래서 M1이 켜진다.

▶ 2. > K30 K40 --> M2 설명 : 30 > 40 , 30이 40보다 크다면 참이 된다. 하지만 아니기 때문에 M2가 켜지지 않는다.

▶ 3. >= K30 K30 --> M3 설명 : 30 >= 30 , 30이 30보다 크거나 같다면 참이 된다. 그래서 M3가 켜진다.

▶ 4. < K30 K40 --> M4 설명 : 30 < 40 , 30이 40보다 작다면 참이 된다. 그래서 M4가 켜진다.

▶ 5. <= K50 K40 --> M5 설명 : 50 <= 40 , 50이 40보다 작거나 같다면 참이 된다. 하지만 아니기 때문에 M5가 켜지지 않는다.

▶ 6 <> K30 K40 --> M6 설명 : 30 <> 40 , 30이 40이랑 다르면 참이 된다. 그래서 M6가 켜진다. (C언어의 ! 연산자 두개가 같지 않다면 참인 조건이다.)

 

아래의 내용은 "GXworks2"로 작업하였습니다.

※스캔타임이란?

프로그램을 시작을 하면 위에서 아래쪽으로 진행하는 시간이라고 보면 되겠다. 그림을 보도록 하자.

 

그림 1

▶ 프로그램을 시작하고 PB1을 누르면 빨간 화살표에 숫자순서로 진행된다.

▶ 3 -> 4번은 1번라인에 병렬로 연결 했기 때문에 순서가 그림1과 같이 이동하고 나머진 직렬로 연결되어있어서 차례대로 동작이된다. 

▶ 시작 -> END 로 진행이 완료가 되면 한 번 스캔타임이 끝난 상태가 된다. 

 

※ 자기유지란?

버튼을 눌렀다 떼었을 때 동작이 지속적으로 일어나게 하고 싶을 때 쓴다. 말 그대로 받아들이면 자기 자신을 이용해서 유지를 계속 하겠다는 말이다. 그림을 보도록 하자.

그림 2

▶ 1번의 빨간색 화살표는 전기가 들어온다고 생각하면 된다. 하지만 PB1 이랑 M0는 A접점이라 전기가 통하지 않는 상태가 된다.

▶ PB1을 눌렀을 때 전기는 파란색 화살표로 이동을 하게 된다. 그리고 난 뒤 M0를 키면 앞의 M0의 A접점이 접지가 되고 M0의 쪽으로 전기가 통하게 된다. 이때 PB1을 때도 전기가 계속 통하게 되므로 자기 유지가 된다. 

 

※ 스텝퍼 방식이란?

보통 래더 구조를 생각하면서 짜다보면 프로그램 작성 수 가 늘어가면 이곳 저것 논리적으로도 안맞고 버그처럼 동작 하는 경우도 있을거다. 그걸 방지하기 위해서 스텝퍼 방식이라는 방법으로 래더 프로그램을 짜면 더 쉽게 짜고 나중에 문제가 일어났을 시 빨리 찾을 수 있다. 아래 그림을 보도록 하자

그림 3

▶ 빨간색 네모로 된 구조 형식이 스텝퍼 방식이다.

▶ Cy_forward_S(실린더 전진 센서)가 하나 있다고 가정하자.  실린더가 전진하여 센서에 감지가 되었다. 하지만 M0가 켜지지 않으면 다음이 진행이 안된다. 그래서 선행 조건이 PB1을 켜서 M0를 활성화 시키는 것이다. 이처럼 스텝퍼는 전 동작이 진행이 되면 다음 동작이 일어나게 하게끔 만드는 것이다.

 

 

보통 구조는 아래와 같이 짠다.

※ Y0 는 실린더다. Y0에 Cy_forward_S(실린더 전진 센서)가 부착 되어있다.

 

▶ 제어부 , 동작부로 나눈다.

▶ PB1이 켜지면 M0가 켜지고, 동작부에 M0가 켜지므로 Y0는 작동을 한다.

▶ Y0가 작동하여 Cy_forward_S가 감지가 되면 M1이 켜지고 Y0는 동작을 멈추게 된다.

▶ M1이 켜졌으므로 M0의 자기 유지도 끊겨서 동작이 멈추게 된다.

아래의 내용은 "GXworks2"로 작업하였습니다.

 

※ 작업을 하다보면 입력접점 X0 , X1 ... , 출력접점 Y0, Y2 ... 이렇게 쓰다보면 실수를 하여 X0가 들어가야되는데 X1이 들어간다는 둥 헷갈리는 경우가 생길 수 밖에 없다. 그래서 라벨 기능을 활용 해보자.

그림 1

1. Global Label

Global Label은 어느 프로그램 파일에서도 다 쓰일수 있는 라벨이다. 예를 들어 Main에서도 쓰이고 Main2에서도 쓰이고 할 수 있는것이다. 그래서 입력 접점 X0,X1... 출력 접점 Y0, Y1...등을 써 넣는 것이 편하다.

2. Local Label

Local Label은 지금 쓰는 한 프로그램 파일에서만 쓰일 수 있는 라벨이다. 예를 들어 Main에서 쓰였던 라벨은 Main1에서는 못 쓰이는 것이다. 그래서 각각의 프로그램 파일에서 같은 이름의 라벨을 다르게 쓸 수 있다.

3. Class 

C++ 언어를 배웠으면 좀 더 이해하기가 쉽다. 같은 개념이라고 생각하면 되겠다.

배우지 않은 사람은 "이것 저것 담을 수 있는 상자를 담는 상자" 라고 생각하면 되겠다.

아래의 종류를 보자.]

Class 설명
VAR_GLOBAL 이것 저것 담을 수 있는 상자.(C언어의 변수의 개념)
VAR_GLOBAL_CONSTANT 이것 저것 담을 수 있는 상자에 한가지 값을 넣고 그 값이 변하지 않도록 하는 상자라고 보면 되겠다.(C언어의 상수의 개념)

4. Label Name

이름을 붙인다.

5. Data Type

C언어를 배운사람이면 이해가 편할 것이다. 어떤 데이터 타입 종류를 쓰는 것인지 고르는 것이다. 

C언어를 배우지 않은 사람은 어떤 값을 담을 상자 크기의 종류라고 보면 되겠다. 예를 들어 A 상자가 있다. 여기에는  1,2 만 담을 수 있다.  또 B 상자가 있다. 여기에는 1,2,3을 담을 수 있다. 근데 여기서 1,2,3 을 담아야 된다면, A라는 상자에는 3을 담을 수가 없다. 그래서 B라는 상자에 담아야 된다. 이처럼 어떤 값을 담을 수 있는 상자 크기의 종류가 바로 이런 이야기인 것이다.

나머지를 알고싶다면 컴퓨터의 메모리의 개념C언어 변수 타입을 배울 것을 권한다. 아래를 보자.

 

그림 2

1. Simple Type

일반적으로 쓰는 데이터 타입을 모아놨다. 아직은 Bit 데이터 타입 밖에 쓰지 않으니 나머진 참고용으로만 알자. 벌써부터 저거 다 알려고 머리 쓰면 머리만 아프고 도움이 안된다.

Data Type 설명
Bit 0 , 1  값을 표현 할 수 있다. 
Word[Singed] -32768 ~ 32767의 값을 표현 할 수 있다. (정수 표현)
Double Word[Signed] -2,147,483,648 ~ 2,147,483,647의 값을 표현 할 수 있다.(정수 표현)
FLOAT[Single Precision] -2^128 ~ -2^-126 , 0 , 2^-126 ~ 2^128의 값을 표현 할 수 있다.(실수 표현)
FLOAT[Double Precision] -2^1024 ~ -2^-1022,  0 ,  2^-1022 ~ 2^1024의 값을 표현 할 수 있다.(실수 표현)
String(32) 0 ~ 4,294,967,295의 값을 표현 할 수 있다.(문자를 숫자의 값으로 저장)
Counter 모르겠음.
Retentive Timer 모르겠음.
Pointer 모르겠음.

2. Structed Data Types

구조화 래더에 쓰이는 데이터 타입. 여기에선 안쓰인다.

3. Function Block

Function Block 타입 아직은 안쓰니 나중에 배우도록 하자.

 

※ 사용방법

그림 3

1. 화살표아래 아이콘 클릭해서 설정해주면 된다.

2. 클릭해서 라벨 이름 넣어주면 된다.

3. ... 클릭해서 Bit를 넣어주면 된다.

 

그림 4

※ 이렇게 넣어주면 끝이다.

+ Recent posts