앞서 3-1 에서 변수 타입에 대해 간략히 설명 했습니다.

codesys 프로그램을 시작하기에 변수 설명이 반드시 필요했기 때문에 간단하게만 설명했죠.

이번에 변수 타입과 더불어 조금 더 심도있는 내용을 다루려 합니다. 

먼저 전역변수에 대한 내용을 설명하겠습니다.

전역변수

전역 변수는 prg, fb, fc 등 어디에서도 쓸 수 있는 변수 입니다.

한번만 선언되며, 동시에 2개 이상의 prg, fb, fc 등에서도 접근 가능합니다.

사용자 입장에서 사용하기 편리하지만 무분별한 사용 시 debug가 힘듭니다.

 

전역 변수의 사용 예로는 앞서 설명한 E-Stop 버튼, 장비 Start, Stop 등 프로그램 전체에서 알아야 되는 정보를 사용합니다.

 

사용법은 Application 에서 우클릭하여 Add Object -> Global Variable List 를 클릭합니다.

전역변수를 쓰임에 따라 나누기 위해서 별도의 이름이 필요한 경우 지정해 줍니다.

xStart, xStop , xEstop, xMachine, xError 5개의 변수를 전역 변수로 선언하였고, 사용하는 예시문 입니다.

선언 후 사용에는 앞서 선언한 이름.변수명 으로 사용합니다. ex ) GVL.xStart

 

조건문이 나온김에 간략히 소개하자면

IF 조건 THEN

    조건이 참일 때 실행할 명령 여러개 가능

ELSE

    조건이 거짓일 때 실 행할 명령 여러개 가능

END_IF

 

위 형식으로 되어 있습니다.

 

IF gvl.xStart AND NOT (gvl.xEstop) THEN            <-------------- 시작 버튼이 눌려졌고, Estop 버튼이 안눌러져 있다면
    gvl.xMachine:=TRUE;                                        <-------------- 장비를 가동상태로 둔다.
END_IF                                                                  <-------------- 조건문 종료
IF gvl.xStop THEN                                                 <-------------- 정지 버튼이 눌려졌다면
    gvl.xMachine:=FALSE;                                       <-------------- 장비를 정지상태로 둔다.
END_IF                                                                   <-------------- 조건문 종료
IF gvl.xEstop THEN                                                <-------------- 비상정지 버튼이 눌려졌다면
    gvl.xMachine:=FALSE;                                        <-------------- 장비를 정지상태로 둔다.
END_IF                                                                   <-------------- 조건문 종료

IF gvl.xStart AND gvl.xStop THEN                          <-------------- 시작과 정지가 동시에 눌러졌다면
    gvl.xError:=TRUE;                                               <-------------- 에러상태 on
ELSE                                                                       <-------------- 시작과 정지가 동시에 눌러진게 아니라면
    gvl.xError:=FALSE;                                              <-------------- 에러상태 off
END_IF                                                                   <-------------- 조건문 종료


IF gvl.xMachine THEN                                            <-------------- 장비가 가동상태라면
    fbDiv(                                                                   <-------------- fb를 실행
        iDataA:=Var1,
        iDataB:=Var2
    );
    fbDiv.iQuotient;
    fbDiv.iRemainder;

END_IF                                                                   <-------------- 조건문 종료

 

지역변수

지역변수 역시 어디서나 사용 가능하지만 동시에 여러군데서 접근할 수 없습니다.

사용자 입장에서 데이터를 주고 받을 때 까다로울 수 있지만 만들어진 함수 혹은 펑션블록의 에러 가능성을 없애주고 전역변수에 비해 상대적으로 debug가 용이합니다.

 

지역변수는 다시 크게 3가지로 나눠집니다.

내부 지역변수 VAR

입력 지역변수 VAR_INPUT

출력 지역변수 VAR_OUTPUT

입출력 지역변수도 있지만 여기선 생략하도록 하겠습니다.

 

내부 지역변수 VAR

    내부 지역변수의 대표적인 사용 예로 반복문 for 를 예로 들 수 있습니다.

    codesys 반복문 for는 다음과 같이 사용합니다.

 

     i 라는 변수가 1~100까지 1씩 증가하며, for 와 end_for 사이의 명령을 실행합니다.

     위 반복문은 i가 1에서 100까지 변할 때 까지 변화되는 값을 계속 a에 누적시키게 됩니다.

     위와 같은 경우 i 라는 변수는 큰 의미를 가지고 있지 않고, 반복문 for 를 돌리기 위한 수단으로 사용이 됩니다.

     이와 같은 경우 i 를 전역 변수로 사용한다면 다른 프로그램에서 반복 문 사용 시 중복사용 되며, 원하지 않는 결과를 가져올 수 있

     습니다. 따라서 각 프로그램에서 i 같은 변수는 내부 지역변수로 사용합니다.

 

입력 지역변수 VAR_INPUT

     입력 지역변수는 주로 fb, fc 에서 사용됩니다.

     예를 들어 a, b 두개의 데이터를 받아 몫과 나머지값을 반환하는 fb를 작성한다고 가정합시다.

     상위 에서 fb를 call 하면서 데이터 2개를 넘겨주게 됩니다.

     이 때 a, b 데이터를 받는 변수를 입력 지역변수로 처리합니다.

 

출력 지역변수 VAR_OUTPUT

     fb에서 주로 사용하며, 위의 몫과 나머지 예시를 들었을 때 처리된 몫과 나머지를 상위로 넘겨주는 역할을 합니다.

     fc에서는 사용하지 않습니다. fc는 출력이 데이터가 1개일 경우 사용하며, 출력데이터는 return  값으로 반환하기 때문입니다.

위 작성한 프로그램에서 메인 프로그램 PLC_PRG의 지역변수는 VAr1,Var2가 됩니다.

fbDiv 도 지역변수라 불러야 되는지...는 애매하네요. 뭐 자격증 시험 보는거도 아니고 크게 따지지 맙시다. ^^

fbDivide의 지역변수는 iDataA, iDataB, iQuotient, iRemainder 입니다.

이 중 iDataA, iDataB는 입력 변수로 사용되었고, iQuotient, iRemainder 는 출력 변수로 사용되었습니다.

 

대부분의 변수는 지역변수를 사용할 일이 많을 것으로 예상됩니다.

 

잔류 변수 (Remanent variable) : Retain 변수, Persistent 변수

Remanent variable 은 일반적인 프로그램 런타임 이후에도 값을 유지할 수 있습니다.

일반적인 프로그램 런타임 이라는 말은 어렵지요? 쉽게 말해 전원이 꺼져도 값이 유지되는 것 입니다.

 

예를 들어 공장에 오전 9시에 전원을 켜고 오후 6시에 전원을 끄는 장비가 있다고 합시다.

이 때 6시에 전원이 꺼지고 나면 원래 장비는 시간을 기억하지 못하게 되겠죠?

이러한 시간을 기억하는 용도로 쓰일 수 있다고 보면 됩니다.

 

물론 시간과 관련된 장비는 장비 전원이 꺼지더라도 전원이 공급 되게끔 설계 되었을 겁니다.

하지만 공장에 순간 정전이 온 경우라면 어떨까요?

정전 복구 후 값을 유지 못하는 장비들은 사람들이 일일이 돌아다니며 수동으로 시간을 맞춰줘야 할 것입니다.

또한 시간이 맞춰지지 않더라도 동작이 가능한 장비들의 경우 시간과 맞춰 동작하는 장비와 다시금 연결되었을 때 알수 없는 오작동을 일으킬 가능성이 있습니다. (물론 요즘은 인터넷 때문에 자동으로 시간이 맞춰지겠지만)

 

하지만 또 다른 예를 들어 봅시다.

공장에서 20개 한 묶음으로 포장하던 라인에서 갑자기 전원이 꺼진 경우 현재 19개 밖에 담지 못했다가 초기화 되면 어떨까요?

이러한 현상들을 방지하기 위해 Retain Persistent  변수가 생긴 겁니다.

 

Retain, Persistent 변수는 옵션이 나눠져 있지만 정확히 어떤 의미 인지는 잘 이해 못했습니다.

그냥 사용할 때 같이 사용해 주세요. 

선언 및 사용은 위와 같습니다.

uiTest1은 일반적인 unsigned integer를 선언한 것이고,

uiTest2은 일반적인 Retain Persistent Unsigned Integer를 선언한 것입니다.

각각 20 이라는 값을 강제로 써주고 reset warm 했을 때 Retain Persistent 변수의 경우 초기화 되지 않습니다.

reset cold 했을 때도 값은 유지되지만 reset origin 하게되면 값은 초기화 됩니다.

 

reset 이 나온김에 간단히 설명하자면

 

Reset Warm

    지속 변수를 제외한 변수를 재설정하는 동작

Reset Cold

    PLC를 껏다 켜는 동작과 유사

Reset Origin

    PLC 내부 프로그램을 삭제 공장 초기화 상태로 생각하면 좋음

 

PLC 내부 회로에서는 전원 차단 이후에도 내부에 건전지 혹은 커패시터로 인해 일정 시간동안 PLC가 완전 off 되지 않는 상태로 있습니다. 아주 미세 전원으로 동작하기 때문에 감전에 위험이 없는 수준의 전기로요.

건전지 타입 PLC의 경우 건전지를 주기적으로 갈아줘야 하는 단점이 있지만 전원 차단 이후 시간이 더 오래 지속될 수 있는 ( 몇일  이상 ) 장점이 있습니다.

반대로 커패시터 타입의 경우 건전지를 갈아주지 않아도 되는 장점이 있지만 전원 차단 이후 건전지 타입에 비해 오래 지속되지 못하는 단점이 있습니다. 

 

변수에 대해 추가 설명 하려는데 앞서 설명하지 못한 반복문, 조건문 및 reset에 대해 너무 장황하게 나열한 느낌이 있네요.

다음장에 반복문, 조건문 및 배열 그리고 변수 선언 팁에 대해 소개하도록 하겠습니다.

+ Recent posts