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

ST로 Counter의 기능을 만들어 보자.

user_Counter 펑션블록을 하나 만들었다.

user_Counter의 로컬 라벨들이다.

 

Counter의 로직이다.

bReset = true가 되면 cntCount = 0 이 된다.

input이 False면 return 시킨다.

bOnce = False면 bOnce = True로 바꿔주고 cntCount를 1증가 시킨다. bOnce의 조건을 준 이유는 한번만 증가 시키게 하기 위함이다.

결론 : input에 전기적 신호가 들어오면 카운터를 증가시키는 거다.

 

Function Block에서 Structure Ladder로 가져온 모습이다.

M0 가 켜지면 cntCount는 증가한다.

M1을 누르면 Reset 된다.

 

M0가 켜지면 cntCount가 1증가 했다.

M0를 4번 눌러서 cntCount가 4번 증가가 되었다.

M1을 누르면 bReset이 켜져서 cntCount가 0이 되었다. 잘된다.

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

 

ST로 Timer의 기능을 만들어 보자.

그림1

user_Timer 펑션블록을 하나 만들었다. 

로컬 라벨은 input 2개 output 2개로 만들었다.

 

Timer의 로직이다.

그림 2

input = true가 되기 전까지는 return으로 끝내서 return 이하의 문으로 진행이 안된다. 

input = true면 cntTime 을 100ms로 더해준다. 

만약 cntTime(현재진행시간) >= inputTime(입력된 시간) 보다 크다면 result(결과를 ) true로 반환한다.

 

Function Block에서 Structure Ladder로 가져온 모습이다.

M0 , M1은 임의로 준 내부 메모리다.

inputTime은 초기 설정값 즉, 3초만 되면 result가 true로 반환하는거다.

 

M0를 켜기전 상태이다.

M0를 눌러서 진행되는 상태이다.

3초가 완료되면 M1이 켜지는 모습이다. 잘된다.

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

 

그림 1

▶ F2 또는 Edit -> List Operands 를 클릭하여 라벨을 만듭니다.

    1. 라벨이름

    2. 라벨이 위치하는 곳

    3. 라벨의 Class

    4. DataType

    5. 라벨을 만들었으면 표시되는 곳

 

※ 대입연산자이란?

말 그대로 대입하여 연산하는 녀석이라는 거다. 

 

그림 2

▶ 빨간 네모안에 처럼 작성을 한다.

▶ bStart := TRUE; , 설명 : bStart 에 TRUE을 넣는다.  := 이것이 대입연산자이다. 끝에는 ;(세미콜론)을 붙여야 한다. bStart의 Data Type이 Bit였으므로 0,1밖에 들어가질 못한다. 언어적인 측면에서는 0 -> FALSE가 되고 1 -> TRUE가 된다. ( bStart := 0 또는 1도 가능하다. )

 

※ 조건문이란?

어떠한 조건을 주어서 거기에 충족을 하면 조건 안에 있는 문장이 실행된다는 것이다.

그림 3

IF문

▶ IF <조건> THEN <실행할 문장> END_IF : ST언어의 IF문 입니다. C언어의 조건문과 비슷합니다.

▶ IF <조건> THEN <실행할 문장> ELSE <실행할 문장> END_IF 도 있습니다. (Gxworks2에선 ELSE IF 문을 써봣는데 에러가 떠서 안쓰는걸로 했습니다.)

▶ 설명 : IF을 적고 PB1이 TRUE면 iRoutine(Data type : Word)를 실행 시키고 END_IF로 조건을 닫습니다.

 

CASE문

▶ CASE <조건> OF <실행할 문장> ELSE <실행할 문장> END_CASE : ST언어의 CASE문입니다. C언어의 조건문과 동일합니다.

▶ 설명 : PB1을 누를 때 마다 iRountine이 1식 증가하는데 , 한번 누르면 iRountine의 값이 1이 되어서 1: 조건으로 들어갑니다. PB1을 한번 더 누르면 2: 조건으로 들어 갑니다. PB1을 마지막으로 누르면 ELSE 이하 문으로 들어가서 문장을 실행합니다. 0: 은 안들어 가겠죠?

 

※ 반복문이란?

어떠한 조건들이나 숫자들을 반복적 되는것을 제어 하기 위하여 쓰입니다.

For문

그림 3

▶ FOR문은 정해진 목표값 동안 반복하는 문장입니다.

▶ FOR <초기값> TO <목표값> BY <증가> DO <실행할 문장> END_FOR : iRoutine := 0 에서부터 TO 5까지 BY 1씩 증가하면서 DO 아래의 조건문을 실행한다는 뜻입니다. iResult 의 값은 6이 됩니다.

 

WHILE문

그림 4

▶ WHILE문은 조건문이 참이면 문장을 계속 실행합니다.

▶ WHILE <조건> DO <실행할 문장> END_WHILE : iRoutine < 5가 참인 조건이면 while문은 계속 돌아갑니다. iRoutine의 값이 5가 되면 while문은 종료가 됩니다.

 

REPEAT문

그림 5

▶ REPEAT문은 결과가 한 번 나오고 UNTIL의 조건이 참이 될 때까지 문장을 반복합니다.

▶ REPEAT <실행할 문장> UNTIL <조건> END_REPEAT

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

그림 1

1. 새 파일을 만들어 준다.

2. Project Type : Structured Projects

3. PLC Series : QCPU(여기에선 QCPU로 씁니다.)

4. PLC Type : 제품에 맞게 설정.

5. Language : Structured Ladder/FBD로 설정.

 

※ 일반 Ladder로 설정하고 Function block의 ST언어로 프로그래밍을 할 때 use macromode 때문에 Function block의 기능들을 쓰지 못합니다.

ladder에서 ST언어로 Function을 써서 짜는건 가능합니다만, 일일히 기능들을 다 만들어야 되므로 Structured Ladder로 짜는걸 추천드립니다.

 

또한 프로그램상 ST언어로만 단독으로 짜는 방법이 없었읍니다. (아시는분은 댓글에 남겨주세요.)

그래서 Structed Ladder안에서 ST언어로 프로그래밍된 Function Block을 불러와서 쓰는걸로 했습니다.

 

 

그림 2

▶ 빨간색으로 표시된 아이콘을 누르면 오른쪽 편에 Function(함수) , Function block(함수 블록), Operator(연산자) 들이 나옵니다.

그림 3

1. FB/FUN

우클릭 한 후 Add New Data를 클릭하면 New Data창이 하나 뜹니다. 

2. Data Type

여러가지가 있습니다만 Function Block을 사용합니다.

3. Data Name

이름을 설정하면 됩니다.

4. Program Language

ST언어로 프로그램 할꺼니까 ST로 선택합니다.

 

 

※ Function Block의 로컬 라벨을 설정합니다.

그림 4

▶ Function Block을 Ladder에서 쓰러면 VAR_INPUT , VAR_OUTPUT 두개의 변수가 있어야 됩니다.

 

그림 5

▶오른쪽에 Function Block에 그림 3에서 만든 MainFunc이 있습니다. 드래그 앤 드롭으로 빨간색 네모 칸으로 끌고 오시면 펑션 블록을 만들고 ladder 로컬 라벨에 등록이 됩니다.

▶1번 쪽 네모 아이콘을 누르시면 input label이라고 뜹니다. 클릭하시고 MainFucn1의 Input옆에 클릭하시고 라벨을 하나 만드시면 됩니다. 여기에선 특수 릴레이 sm400을 넣었습니다.

▶2번 쪽 네모 아이콘을 누르시면 output label이라고 뜹니다. 클릭하시고 MainFunc1의 output 옆에 클릭하시고 라벨을 하나 만드시면 됩니다. 여기에선 내부 릴레이 M0를 썼습니다.

 

 

+ Recent posts