• Daum
  • |
  • 카페
  • |
  • 테이블
  • |
  • 메일
  • |
  • 카페앱 설치
 
카페정보
카페 프로필 이미지
가족 공감
 
 
 
카페 게시글
검색이 허용된 게시물입니다.
우리들의 이야기 스크랩 PLC 기초
김춘영 추천 0 조회 185 10.05.16 07:31 댓글 2
게시글 본문내용

PLC란 무엇일까?

(P)rogrammable (L)ogical (C)ontroller는 (프)로그램가능한 (논)리적인 (제)어기입니다.

미국 Allen-bradley 사에서 이 글자를 등록하는 바람에 PLC라는 단어를 타 회사에서는 사용할 수 없었습니다. 타 회사는 부득이 PLC라는 글자를 쓰지 못했다고 합니다.


PLC 는 Hardware + 제어 프로그램인 Software로 구성됩니다. Hardware는 Chassis(=Rack=Base) 와 Power supply와 CPU 모듈과 I/O모듈과 퉁신을 위한 통신모듈로 구성이 됩니다. 이 제어 Software는 다시 프로그램과 Data로 나뉩니다. 이 PLC Program을 컴퓨터에서 작성하도록 해주는 Software가 필요합니다. 이 프로그램을 로더프로그램라고 합니다. 이 로더프로그램을 대체로 이동이 편리한 노트북 컴퓨터에 설치하여 사용합니다. 이 노트북과 로더프로그램을 그냥 로더라고 합니다. 그외에 통신설정용과 특수모듈 설정용 프로그램이 있습니다.

PLC Programming 언어는 Ladder,SFC,STL,국제규격 등이 있습니다.

- Ladder는 사다리형의 전기 회로형식으로 전기를 아시는 분이라면 익숙합니다.
- SFC는 조건별 제어를 하는 방식으로 Ladder를 포함합니다.
- STL언어는 Siemens에서 많이 사용합니다. Ladder를 글자로 표현한 것입니다.
- 국제규격이란 하도 많은 PLC들 언어가 날림하여 통일 규격으로 제시한 것으로 기능 BOX형 언어라고 보시면 됩니다.

PLC는 간단히 설명하면, 들어온 입력에 맞추어 프로그램된 대로 출력을 내어 보내는 장치입니다. 입력/출력은 접점(Digital Input/Output), 아날로그(Analog Input/Output), 펄스카운터(Pulse Input/Output), 특수제어용모듈 이 있습니다. CPU는 Central Processor Unit입니다. 즉 중앙처리장치입니다. CPU Module은 ALU+Memory+통신Bus로 구성이 됩니다. ALU는 Arithmatic & Logic Unit 로 산술논리계산 장치 입니다.
Memory는 프로그램과 데이타(CPU 상태, i/o image, Timer, Counter, Coil, 각종자료)으로 구성됩니다.

PLC는 각종 Maker별로 사양이 다르므로 구성을 주의하여 하여야 합니다. CPU능력, I/O능력, 처리속도, 통신속도, 메모리크기, 프로그램능력, 모듈능력, 확장능력, 통신프로그래밍능력, 신뢰도, 가격에 따라서 Maker를 정하게 됩니다.

프로그래밍은 직접 작성하고 시험하여보고 경험하여 배워야만 잘 할 수 있습니다. 교육을 받고 하는 것이 실수를 줄이고 빨리 프로젝트를 끝내는 좋은 방법이 됩니다. Ladder프로그래밍은 조건에 따른 작성 방법을 배우는 것이 중요합니다. 쉽게 설명하면 Ladder Programming은 조건에 따른 출력이라고 보시면 됩니다.

PLC PROGRAMMING - 1 (2진 대수와 수의 체계 및 계산)

PLC에서는 숫자나 상태를 어떻게 보관하는지 그 원리가 무었인지 알아 보아야 합니다. PLC는 논이제어를 해야 하므로 입력과 출력 상태 뿐만 아니라, 내부 계산상태를 보관할 곳이 필요합니다. 이 보관될 장소의 성질에 대한 내용을 배우고자 합니다.

PLC의 프로그램 방식과 특성을 이해하고 적용한는 방법에 대하여 생각해 보겠습니다. 전기는 살았는가 죽었는가에 따라서 판별 할 수 있습니다. 전자적으로는 전기가 유지되어 있는가 아닌가에 따라서 판별 할 수 있습니다. 전자 회로적으로는 RS Flip/Flop라는 회로방식으로 또는 전기가 저장되어 있는가 아닌가에 따라서 판별 할 수 있습니다. 아주 오래전에는 Core에 자화가 되어 있는가 안되어 있는가에 따라서 판별 했습니다. 이때는 읽고나면 기억이 지워지기 때문에 다시 쓰주어야 했습니다. 요즘도 이런 방식의 IC Chip도 있어서 한번씩 충전해 주어야 합니다. 그래서 Memory 종류는 크게 Ram(Ramdom Access Memory) 방식인가 Rom(Read Only Memory)이 있습니다.Ram은 Reflash해 주는 방식인가 아닌가에 따라서 Static Ram인가로 구분이 됩니다. ROM도 EPROM, EEPROM이 있습니다. 요즘은 Flash Rom/Ram이라고 하여 전기공급없이도 오랬동안 기억가능한 Ram이 개발되었습니다. 요즘 많이 가지고 다니는 Flash Drive입니다.

PLC도 그 추세에 따라서 Memory의 역사가 있습니다. 전에는 Memory가 비샀기 때문에 꼭 필요한 많큼만 PLC에 적재 하였고 가격도 많이 달랐습니다. 하지만 요즘은 Battery 도 필요없이 보존되는 Flash Ram을 사용하고 또 대용량을 사용함으로서 Hardware 기능면에서 많이 좋아 졌습니다.

Memory는 보통 1 Byte(8Bits)로 구성이 되어있습니다. 그 이유는 영문자의 모든 글자와 숫자를 담을 수 있기 때문입니다. 그래서 ASCii Code라는 규격이 생기게 되어서 지금까지 사용하고 있습니다. 요즘은 Uni-Code라고 하여 전세계에서 사용되는 32Bits 글자를 사용하기도 합니다.
PLC는 거의가 1 Word (16Bits) 단위로 계산하고 처리 합니다.
아마도 32 Bit까지는 커질 수 있으나 더이상 단위가 커지지 않을것은 32Bit이면 세상의 모든 글자의 표현이 가능하기 때문입니다. 지금의 한글은 2 Word로 구성이 되어 있습니다. 1 Word를 16개의 접점 보관용으로 또는 정수 보관용으로 사용합니다.
2개의 Word를 묶어서는 실수를 저장하거나 긴 정수를 저장하는데 사용합니다.

3개의 정수를 사용하여 1개는 상태를 보관하고 1개는 설정치를 남은 한개는 현재치를 보관합니다. (PLC 에 따라 조금씩은 다름)


그럼 이런 Memory에 저장되는 자료를 알아 봅시다.

접점 입력 및 접점출력으로 제어할 때에는 2진 논리로 계산하여 최적화한 표현으로 프로그램할 수 있겠지만, 그러면 이해하기가 대단히 어려워 집니다. 그러므로 최적화라기 보다는 조건에 맞는 실행을 사람이 보고 이해 할수 있어야 나중에 쉽게 수정이 가능해 집니다.

그러므로 필요에 따라서 최적화할 수도 있겠지만 최적화 하지 않는 것이 좋을 수도 있습니다.

최적화의 예를 들어 보겠습니다. (논리대수에서는 + = or, * = and, 1=True, 0=False 입니다.)
1+1+1+1+1+1+1 = 1
1 or 1 or ... or 1 = 1

1*1*1*1*1*1*1*1 = 1
1 and 1 and .... and 1 = 1

1 + A = 1, 0 + A = A, 0 + 0 = 0, 1 + 1 = 1, 0 + 1 = 1
1 * A = A, 0 * A = 0, O + 0 = 0, 1 * 1 = 1, 0 * 1 = 0
+ = or (또는)
* = and (그리고)

이런 계산을 2진대수(Boolean Algebra)라고 합니다.
이해가 안되시면 꼭 이해 하시도록 하셔야 합니다.

2진 대수는 논리대수로 깊이 들어가면, 인공지능처리에 까지 적용이 됩니다.

복잡한 논리를 간략화하는 방법에는 카르노맵을 이용하는 방법도 있습니다. (설명 생략).

PLC에서 왜 이 2진 대수를 설명하는가 하면, 그래야 쉽게 논리적인 측면을 습득할 수 있기 때문입니다. 또한 PLC프로그램이 이 논리로 되어 있기 때문입니다.

PLC Ladder Program 구조.
i1 i2
|---| |---|/|-----------------(B1)-|

-| |- 는 A접점으로 입력이 ON(1)될때 성립합니다.
-|/|- 는 B접점으로 입력이 OFF(0)될때 성립합니다.
-( )-|는 앞의 조건이 맞아서 회로가 연결될때 ON(1)이되고
아니면 OFF(0)이 됩니다.

B1 = i1 and not i2 로 표현이 됩니다.

B1은 내부 코일로 보시면 됩니다.

2진 논리는 0,1 만 존재하므로 1 Bit에 저장이 됩니다.
PLC는 이 상태를 1 Bit에 저장합니다. 16Bit에는 16개의 상태를 저장 할 수 있습니다.

숫자의 표현에 대하여 배워 보겠습니다.
모든 숫자는
ABCD(b) = A*b^3 + B*b^2 + C*b^1 + D*b^0 방법으로 표현됩니다. 여기서 b는 진법(Radix)이고, ABCD는 각각이 0~(b-1)까지의 숫자입니다. 이 숫자는 0, 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , b , c , d , e , f , g . . . 로 사용합니다. 즉 16진수는 0~F까지의 글자를 사용합니다.

111(2) = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1 = 7(10) 입니다.
x^2 = x*x, x^1 = x, x^0 = 1입니다.

21(3) = 2*3^1 + 1*3^0 = 6 + 1 = 7(10) 입니다.
FF(16) = 16*16^1 + 16 = 255(10)입니다.
255(10) = 11111111(2) = FF(16)입니다.
FFFF(16) = 65535입니다.

소수인 0.###(10) = 0.mmmm..(b), m=계속 b를 곱해서 나온정수, 정수를 빼고 계속 b를 곱하여 계속 정수부분을 취하면 됩니다.

PLC에서의 계산은 저장될 방의 종류에 따라서 신중히 하여야 합니다.
결과가 실수인 것을 정수방에 넣으면 소숫점에서 반올림하여 넣습니다.
결과가 실수인 것을 실수방에 넣으면 유효자리수 많큼 들어가고 그 뒤부분은 잘립니다.

0.66666666666666666666.. 인 순환 소수를 유효자리 7개인 실수방에 넣으면 0.6666667 로 저장 됩니다.

PLC의 저장단위는 보통 Bit,Byte,Word, Doudle Word,Single Real, Double Real ... 이 있습니다.
1 Bit는 0,1 이 들어갈 수 있는 방입니다.
1 Byte = 8 Bit로 0~254까지 저장할 수 있습니다.
1 Word = 2 Byte = 16Bit로 0~65535까지 저장할 수 있습니다.
1 DoubleWord = 64Bit로 2^64-1 까지 저장할 수 있습니다.
1 Real 은 유효자리 6~7개에 10의 승수로 표현하므로 아주 큰 값도 저장할 수 있습니다.(하지만 유효자리수가 짤리므로 조심해야 합니다.)

PLC는 양수만 사용하는 것이 아니고 음수도 사용합니다.
음수는 2의 보수로 표현합니다.
즉 -1 은 +1을 2진수로 표현후 1=>0, 1=>0 으로 바꾼후 +1 한 표현입니다.

1 Byte = 8 Bits = -128 ~ + 127 까지 표현됩니다.
1 Word = 16 Bits = -32768 ~ + 32767 까지 표현됩니다.
공식은 n Bits = -2^(n-1) ~ +2^(n-1)-1 입니다.

* BCD 표현에 대하여 알아 보겠습니다.
Binary Coded Decimal의 약어로 이진화된 십진수의 의미입니다. 0~9까지의 십진 숫자를 4Bits로 표현됩니다. 이 4 Bits를 10진의 1자리로 표현저장하는 방식입니다. 1 Byte에는 2개의 BCD가 들어 갈 수 있습니다. 이 BCD 표현은 숫자 설정입력이나, 숫자 표시때에 사용하는 방식으로 각각의 숫자 한자리의 단위를 알 필요 없이 각각의 십진 한자리만 입력 또는 출력하게 하여 입력/표시장치를 단순화 한 것이라고 보시면 됩니다. 만약 Binary표시로 입력해주고 표시해 주는 부품이 있다면 이렇게 필요없이 BCD로 변환할 필요가 없어지고 입력/출력 i/o point도 출어 들 것입니다.
BCD의 표기 예.
(1234)10 => 0001 0010 0011 0100 = &H1234
이것을 Binary(0001001000110100)로 읽어서는 아무 의미가 없습니다.


PLC는 대체로
접점상태용 Memory (1Bit) ... M, L, B, R
정수 보관 Memory (1 Word=16 Bits) .... D, N, W
실수 보관 Memory (2 Words) .... F
긴 정수 보관용 Memory (2 Words) .... D
문자 보관용 Memory (N Word) .... ST
Timer보관용 Memory (3 Words) .... T
Counter보관용 Memory (3 Words) .... C
각종 상태나 보조 Moory는 모두 1 Word 들에 저장합니다. 

 
PLC PROGRAMMING - 2 (Scaling 계산)

아날로그 처리시 필요한 계산에 대하여 알아보겠습니다. PLC도 DCS 많큼은 아니겠지만, Analog 처리 능력이 있습니다. 이 Analog제어에 필요한 계산에 대하여 잘 인지 하고 계셔야 합니다. 먼저 PLC에 들어오는 A/D Converter의 신호를 알아 볼수 있는 Engineering Scale값으로 바꾸는 것이 좋을 것입니다. 이 계산에 필요한 지식을 배우겠습니다.

계산단련1. 수식
A + B = B + A = B + A + 0
A = a 이면, A*B = a*B, A+B = a+B

정의1 '=' 양변에 어떤 값을 더하든지 곱하든지 같은 값이면 같은 결과이다.
결과1 그러므로 한쪽변에서 반대로 넘길 경우 부호(+,-)만 바꾸면 같은 결과이다... 그 이유를 각자 증명(설명)하시오.
결과2 그러므로 한쪽변에 무슨수를 똑같이 나누어도 또는 곱하여도 같은 결과이다... 그 이유를 각자 증명(설명)하시오.

정의2 '/' 양변에 어떤 값을 곱해도 같은 결과이다... 이유 증명하시오.
결과3 그러므로 어떤 값을 나누어도 같은 결과이다. 이유 증명하시오.

1=1/1=2/2=100/100=1/1*100/100=0+100/100*1/1

A / B = A / B * 1 = A / B * 100 / 100 = (A * 100) / (B * 100)

계산단련2. 점 2개(x1,y1)-(x2,y2)로 직선함수 만들기
직선공식
Y = aX + b
그러고 기울기 a=(y2-y1)/(x2-x1)입니다.
다음으로 b값을 구하기 위해서 점1개를 대입합니다.
y1 = a*x1 + b
b = y1 - a*x1 이 됩니다.

계산단련3. 2차원 곡선함수 만들기.
y=ax^2+b
a=?,b=? 설명생략.

문제) 2 점이 있을 때 함수를 구하시오.
점1 (x1,y1)=(50,20),
점2 (x2,y2)=(30,10)
a=?, b=?, Y=aX+b ?
a = 기울기 = (y2-y1)/(x2-x1)=(10-20)/(30-50)
= -10 / -20 = 1/2 = 0.5
b = y1-a*x1 = 20-0.5*50 = 20-25=-5
점(x2,y2)를 대입해도 같은 결과 입니다.
b= y2-a*x2 = 10-0.5*30 = 10-15=-5

그럼 본 문제인 PLC의 입력되는 아날로그를 PLC내부에서 어떻게 계산하는지 알아보겠습니다.
PLC로 들어오는 값은 PLC에 따라서 다릅니다.
즉 Engineering Scale로 바뀌어 오는가 아니면 AD Converter값을 그냥 오는가에 따라 다릅니다.
요즘은 16Bit해상도에 Eng.Scale되어 나오는 입력 모듈도 있습니다.
하지만 지금까지는 RAW VALUE라고 하여 Scaling되지 않은 값이 들어 옵니다.
RAW VALUE란 A/D CONVERTER의 값 즉 Scaling안된값을 말합니다.
4~20mA = 0~4000 도 있고 (Melsec)
4~20mA = 0~4095 도 있고 (AB PLC5)
4~20mA = -32768 ~ 32767 도 있고 (AB SLC500)
4~20mA = 0 ~ 32767 도 있고 (AB SLC500) 합니다.

그럼 이것을 PLC내부에서 쉽게 Eng.Scale화 하여 프로그램하기 위해서 변환을 해야 합니다.
변환하여 넣어둘 방이 정수이면 소숫점이 잘리므로 *10 또는 *100 또는 *1000 한 값으로 넣어야 합니다. 방이 실수이면 그냥 넣으면 됩니다.

그럼 변환공식을 보겠습니다.
입력 RAW VALUE : rmin ~ rmax
계산 ENG Value : emin ~ emax 이고,
입력이 N에 계산된 Eng값을 실수방 F에 넣도록 합니다.
그러면,
계산식 rRange = rmax - rmin
계산식 eRange = emax - emin
F = (N - rmin) / (rRange) * eRange - emin 입니다.
해석,
(N - rmin)하는 것은 입력을 입력전체 범위의 위치로 변경하기 위함입니다.
(N - rmin) / rRange 하면 계산 결과가 0~1 사이의 값으로 바꾸어 eRange를 여기에 곱하여 계산하기 위함입니다.
* eRange - emin은 0~1로 계산된 값을 Eng scale로 바꾸는 것입니다.

만일 실수방에 넣지 않고 정수 방에 넣을려면 본 결과에 10 또는 100을 곱하여 넣어야 합니다. 
PLC PROGRAMMING - 3 (SEQUENCE CONTROL LOGIC)

디지털제어의 중추적인 역활을 담당하는 SEQUENCE CONTROL에 대하여 알아보겠습니다. SEQUENCE CONTROL과 다른 개념이 있다면 Condition Control(조건제어)가 있다고 보시면 됩니다. 조건제어는 JIG 제어에 적합합니다. 거의 모든 공장의 생산 라인은 이 조건제어를 한다고 보시면 됩니다. Sequence 제어는 정수처리, 폐수처리, Batch 제어 등의 절차가 있는 곳을 자동으로 연속제어할 경우에 사용됩니다.

또한 SEQUENCE는 공정의 흐름을 규정한 것이라고 보셔도 됩니다. 이 SEQUENCE제어를 적합하게 표편한 프로그램이 바로 SFC방식의 프로그래밍 입니다. 이 SFC제어란 조건 Ladder Program이 있고 또 실행 Ladder Program이 있습니다. 조건에 따라서 처리 프로그램이 달라 지는 것입니다. 프로그램 블록간의 이해는 빠르겠지만 SFC가 복잡해지면 오히려 Ladder 표현보다 복잡해 집니다. 개인적으로 이 방식 보다는 Ladder에서 모두 처리 하는 것이 좋다고 사료됩니다.

- SEQUENCE CONTROL(연속단계제어) :: SFC + Ladder
연속적인 다단계 작업의 진행제어.

- CONDITION CONTROL(조건제어) : Ladder
간단한 조건적 움직임의 제어로 아무리 어려운 작업도 이 조건적인 제어로도 충분히 출력을 프로그램 할수 있습니다.조건적인 제어로 모든 경우의 조건을 or 로 묶어서 제어함으로서, 수정이 용이 합니다.

SEQUENCE 제어는 LADDER형식의 PLC 프로그래밍으로 쉽게 표현됩니다.

SEQUENCE란 연속적인 제어를 말합니다. 다른말로는 STEP(단계)제어라고도 할 수 있습니다. 또한 STATUS(상태)제어하고도 할 수 있습니다. 연속으로 무슨 일들을 처리해야 하는 일이 있다고 합시다. 각 단계별로 해야할 일들이 그때마다 다르다고 정의 합시다. 그러면 각 단계의 이전이 어떤 조건인지 또 해야할 일들이 어떤 것들인지 규정이 될 것입니다.

예를 들어 보겠습니다.
STATUS 0: 처음 조기 조건.
STATUS 1: STATUS 0 또는 STATUS 7에서 올수 있음.
- STATUS 0에서 올 조건은 S0-S1go
- STATUS 7에서 올 조건은 S7-S1go
* 해야할 처리는 출력 Y1,Y2를 살릴것.
STATUS 2: STATUS 1에서 올수 있음.
- STATUS 1에서 올 조건은 S1-2go
*해야할 처리는 Y3,Y4를 살릴것.
:
:

이렇게 정의가 될 수 있는데, 이를 Table형식으로 시간축으로 표시하면 이해가 쉽습니다.
Step : STATUS-0 STATUS-1 STATUS-2 STATUS-3
올조건 :
출력내용:
기타 :

이럴때 각 STATUS는 한개만 살아 있어야 합니다.
이런 것을 STEP CONTROL 이라고 합니다.
이것을 프로그램으로 표현할 때는 PLC에서 제공하는 STEP MEMORY를 사용하던지 아니면 직접 만들면 됩니다.
STEP MEMORY란 한개의 WORD안에서 어떤 BIT가 살면 다른 BIT는 OFF되도록 하는 메모리 입니다.
쉽게 구현하는 방법은 한개의 WORD에 각 STEP마다 숫자를 넣음으로 간단히 해결 할 수 있습니다.
즉 W1에 0부터 32767까지의 STEP을 지정할 수 있다는 것입니다(양수로일때 음수로도 사용하면 -32768~-1 까지도 사용 됩니다).

다른 방법으로 STEP 개수가 작을 경우에는 간단히 BIT 몇개를 사용함으로 해결 할 수도 있겠습니다.
각 STEP마다 다른 STEP Bit를 지워 주면 됩니다.
이때의 명령은 (SET) (RST) (L) (U) 라는 명령을 사용합니다.
(SET),(L) 는 앞 조건이 옳을때 "1"로 만들어 줍니다.
(RST),(U) 는 앞 조건이 옳을때 "0"로 만들어 줍니다.
* L = Latch, U = UnLatch 
 
PLC PROGRAMMING - 4 (출력처리)

프로그램의 최종은 출력 카드로 무었을 내어 보내는 것입니다. 또한 출력한 결과를 받아보는 Return 접점 또는 아날로그 신호가 있습니다. 출력을 Command라고 하고 되돌아 오는 신호를 Return이라고 합니다. Return에 의해서 출력이 확고하게 검정이 되고 다음 단계의 제어에 사용하게 됩니다. 또한 출력후 Return이 없을 경우 Alarm을 발생하여 주어야 합니다. Analog나 Digital이 모두 공히 Return에 의해서 Alarm이 발생 되어야 정상입니다. 이때 Return의 값이 들어오기 까지 기다리는 대기 시간이 있습니다. 이 대기 시간이 넘어갈 경우 Alarm이 발생되게 합니다.

상태출력은 1/0 으로 아날로그 출력은 4~20mA로 등이 있습니다.

먼저, 상태출력일 경우를 생각해 보겠습니다.
상태출력일 경우 거의가 SOL VALVE 제어, MCC MOTOR제어 등이 있습니다.
이럴 경우 상위에서의 자동 수동 모드가 있을 경우가 있고 또한 LOCAL S/W BOX에서 오는 제어 신호도 있을 수 있습니다.

이 모든 경우를 생각하여 각각의 경우에 대하여 병렬로 나열하면 쉽게 출력을 작성 할 수 있습니다.

|--|자동모드|----|자동조건|-----------|인터록|--(출력)-|
|............................|
|--|수동모드|-+--|수동조건|--+
|.............................
|--||--||-----------------------------------(자동조건)-|
|
|--||--||-----------------------------------(수동조건)-|
|
|--||--||--------------------------------[Timer]---|
|
|--||--||-----------------------------(Alarm발생)--|


이중에서 '자동조건'및 '수동조건'을 작성하는 방법에 대하여는 다음에 다루도록 하겠습니다. 그기에서 자기유지에 대한 것이나 TOGGLE에 관한 것 및 Timer, Counter등을 다루도록 하겠습니다.


MCC의 INTERLOCK은 ON/OFF명령 1개 또는 2개, 상태입력 RUN/FAULT/REMOTE(Auto) 를 받을 수 있습니다.
ON/OFF VALVE의 SOL VALVE의 경우 OPEN,CLOSE접점을 받을 수 있습니다.

그 다음으로 아날로그 출력이 있습니다. 출력 사용처는 주로 Control Valve, InverteR(VVVF), Actuator등이 있습니다.

출력은 폐루프의 경우 PID제어를 많이 사용합니다.
PID제어는 전용모듈을 사용할 수 도 있지만 프로그램으로 처리하는 것이 경제적이고 관리가 쉽습니다.

ANALOG제어 출력은 PID에서 바로 내어 보내기 보다는 한단계 거처서 각종 인터록을 대비하여 두는 것이 좋습니다. PID에서 바로 출력할 경우 출력을 강제로 0으로 한다든지 하는 조작이 조금 복잡할 수 있기 때문입니다(수동으로 변환후 출력을 0으로 해야함).

PID제어의 결과를 제어 조건에 따라서 정상 제어가 ON일 경우 PID출력으로 하고, 알람이 발생한다던지 하여 급정지를 해야 할 경우에는 PID출력을 차단하고 상수로 출력해 줄수 있습니다.
PID제어 명령에 대하여는 다음에 다루도록 하겠습니다.

ANALOG출력을 HMI에서 사람이 제어하거나, 어떤 조건에 따라 다단계 제어를 하거나 비례 제어만 한다면, PID LOOP명령은 필요가 없고 단지 출력에 계산식이나, HMI의 값을 그냥 출력만 해도 될 것입니다.

ANALOG출력은 D/A CONVERTER의 해상도에 따라서 0~4095등으로 상하한을 정할 수 있습니다. 출력 모듈 마다 그 특성이 다르나, HMI의 표시는 거의가 0~100%로 나타 냅니다.
Control Valve 100% Open
Motor 100% Running
Analog의 Return은 Control Valve의 경우에는 Full Open/Close의 접점을 받을수 있고 Positione의 값을 AI로 읽어 올수도 있습니다. INVERTER의 경우는 출력 HZ, 전류,전압등을 INVERTER에서 또는 외부 CT에서 AI로 읽어 올수 있습니다.

실제 출력은 하지 않지만 내부에서 계산을 하는 경우가 있는데, 예를 들어서 Totalizer를 만든다든지, 또는 변화치를 읽어서 순시 Flow양을 만든다든지 또는 1분까지의 평균값을 만든다든지 할때 PLC 내부의 MEMORY를 많이 사용합니다. 이런 것을 내부 출력이라고 명시화 해 둡시다.

내부 출력은 제어의 각 단계를 기억하는 SEQUENCE로 해당이 되겠습니다.
 
PLC PROGRAMMING - 5 (LADDER 작성-출력)

PLC PROGRAM중에서 기법적인 내용을 다루겠습니다. 먼저 들어가기 전에 PLC LADDER처리의 PLC CPU의 전반적인 내용을 먼저 아셔야 합니다.

- PLC는 계속 반복 프로그램을 SCAN하여 실행하는 반복처리 방식입니다. 그래서 1초에 약 50~200번의 생행을 수행 합니다. (주의 1SEC = 1000 Msec).한번 실행하는데 보통 5~50mSec가 걸립니다.

- PLC는 프로그램을 순차적으로 실행합니다. 전기는 동시에 들어가서 동시에 작동하는 것과는 다릅니다. 그러므로 프로그램의 순서는 중요합니다. 순서가 바뀌면 프로그램작동도 바뀌게 됩니다.

- PLC는 처리순서가 먼저 INPUT IMAGE MEMORY로 I/O모듈로 부터 읽어 들입니다. 그후 LADDER PROGRAM을 실행합니다. 그다음 출력IMAGE를 출력 모듈로 내어 보냅니다. 그다음 시스템관련 처리를 합니다. 그후 처음부터 이 반복을 다시 합니다. 이 한번의 실행을 1 SCAN이라고 합니다. 즉 한번 실행하는 것을 말합니다.
- PLC는 처음 실행할때를 FIRST SCAN 이라고 합니다. 이 FIRST SCAN에 LADDER PROGRAM의 초기조건을 설정하던지 특수 모듈로 설정치를 한번 보내던지 초기치화를 하는 중요한 작업을 해야 합니다. 그래서 거의 모든 PLC는 SYSTEM BIT로 FIRST BIT를 가지고 있습니다. PROGRAMMER는 이 BIT가 ON일때 초기화 작업을 하도록 프로그램을 작성해야 합니다.

- PLC는 내부 처리나 REAL CLOCK이나 FIRST SCAN BIT이나, FAULT 상태나 특수 메모리나 PULSE등을 가지고 있는 특별 MEMORY를 가지고 있습니다. 이 메모리를 SYSTEM MEMORY라고 합니다. 이 특수 메모리는 PLC MAKER마다 PLC SERIES마다 조금씩 다 다릅니다. 그러므로 MAKER의 USER MANUAL을 잘보고 잘 쓰는 것이 프로그램에 도음이 됩니다. 특히 REAL CLOCK이나, PULSE BIT, FIRST SCAN BIT는 자주 사용 됩니다.

- PLC는 WATCH DOG라는 TIMER를 내장하고 있습니다. 이 타이머는 1 SCAN 시작 전에 0이 됩니다. 1SCAN후에 이 시간의 최대 설정치보다 클 경우 PLC는 SHUTDOWN됩니다. 즉 PROGRAM FAULT의 한 종류입니다. 만약 FAULT를 발생하지 않으면 기계는 이상한 상태를 계속 유지하거나 오동작한다고 볼 수 있습니다.


- PLC LADDER PROGRAM은 실행되지 않으면 없는 것과 같습니다. 그 예로 SUBROUTINE이 있습니다. SUBROUTINE은 불려 지기 전에는 없는 것과 같습니다. --( )-| 이라는 COIL이 있어도 실행이 안되면 상태 그대로 있습니다.


이러한 내용을 아셨으면, 이제 본론인 수동조건, 자동조건의 작성에 대하여 알아 보겠습니다.

필료한 기본 명령을 한번 보겠습니다.

-| |- A 접점: 입력이 ON되면 TRUE(1)
-|/|- B 접점: 입력이 OFF되면 TRUE(1)

병령(Or)프로그램
|---||-----+
|..........|
|---||-----+
두 조건중 한개만 옳아도 True(1)

직렬(And)프로그램
|---||----||----
두 조건 모두 옳아야 True(1)

--( )-| 명령. 출력 명령이죠, 출력코일 또는 내부출력 등으로 불립니다. ( ) 안에 내부 접점이면 내부코일이고 출력주소이면 출력이 앞 조건에 따라서 ON/OFF됩니다.

이 출력 COIL은 프로그램 시작시 FIRST SCAN에서 모두 0 (OFF)가 됩니다. 어떤 PLC에서는 이 FIRST SCAN에서 이 출력 COIL을 모두 CLEAR(0)으로 할지 말지를 선택하는 OPTION이 있는 것도 요즘 있습니다. 하여간 모두 0으로 CLEAR해야 안전하다고 볼 수 있습니다. 왜냐하면 거의 모든 PLC의 설정은 CPU가 PROGRAM MODE나 고장이 날때 출력 상태를 0으로 하기 때문입니다. 만약 0으로 하지 않고 현상태 유지를 한다면 생각해 볼 일이죠. 이경우 여러가지 위험 요소가 있습니다. 하여 하여간 다 지우고 다시 하는 편이 났죠. 특별 CASE는 따로 특별 장치를 외부에 쓰는 편이 났습니다.

각 조건들은 자기유지 또는 SET/RESET(L/U) 방법으로 작성 되어 질 수 있습니다.

- 자기 유지 하는 방법 1.
아주 기본적인 기법입니다.
START/STOP 회로의 기본입니다. LADDER 표현은
|---|START 접점|-+-----|/STOP접점|------(보조1)--|
|................|
|---(보조1)------+
입니다.
사람이 START BUTTON을 누르면 START접점이 ON되면 보조1이 ON되고, 사람이 START BUTTON을 놓으면 보조1은 보조1자체의 접점으로 계속 ON되어 있습니다. 그후 사람이 STOP BUTTON을 누르면 STOP접점이 ON되고 "/" B접점이므로 조건이 False(OFF)되어 보조1은 OFF됩니다. 다음 START BUTTON이 눌러 질때까지 보조1은 OFF 됩니다.

- 자기 유지 하는 방법 2.
SET/RESET (Latch/Unlatch)명령어 사용.
이 방법은
|---|Start 조건|------------------(SET 보조1)--|
|
|---|정지 조건|-------------------(RST 보조1)--|
입니다.
SET/RESET의 장점은 앞 조건이 True일때만 실행 된다는 것입니다. 달리 --( )-|는 앞 조건이 True이면 On 아니면 Off됩니다.

- PULSE 만들기 - 1.
FLICKER가 있습니다. SYSTEM MEMORY에서 제공 하기도 합니다만, 직접 만들어 쓰는것이 났습니다.
직접 만들때는 Timer 2개가 있으면 됩니다. 또는 Flicker Timer를 지원 한다면 그 명령을 쓰면 되겠죠. 각자 Timer 2개를 가지고 어떻게 해야 FLICKER를 만들수 있는지 LADDER를 작성해 보십시오.

|---|/Timer2|-----------------(Timer1)---|
|---|Timer1|------------------(Timer2)---|
|---|Timer1|------------------(Flicker1)-|

다음에 Flicker1을 여러 프로그램에서 사용할 수 있습니다. Flikcker는 거의 Alarm Flicking(깜빡임)에 많이 사용합니다.

- PULSE 만들기 - 2.
프로그램을 작성하다보면 ON시 한번만,또는 OFF한번만 처리할 경우가 있습니다. 이때는 어떻게 할까요? 어떤 PLC에서는 각 명령이 한번만 실행 하도록 하는 명령이 있습니다만 없는 PLC의 경우에서는 PULSE명령을 사용 해야 합니다.
MELSEC에서는 MOV를 MOVP라고 함으로 조건이 옳을경우 한번만 실행할 수 있습니다 하지만 AB에서는 앞에 -(ONS)-라는 명령을 사용해야 합니다. 이 ONS는 한개의 BIT를 사용합니다.

그러면, 1초마다 1개의 PULSE를 발생시키는 LADDER PROGRAM을 작성해 보십시오. 시스템 CLOCK에서 SECOND MEMORY의 마지막 BIT를 사용합시다.

|---|초마지막 BIT|---(ONS)--+--------(1초 PULSE)-|
|...........................+
|---|/1초마지막 BIT|--(ONS)-+

라고 하면 거의 정확한 PULSE를 만들 수 있습니다. TIMER 를 사용하여 만들면 정확하지 않기 때문에 Totalizer등에 사용시 문제가 됩니다.


상기는 Bit에 대한 명령이 였습니다.
더 많은 명령이 있을 수 있으나, 이 기본 명령만 아셔도 LADDER PROGRAMMING하는데 문제가 거의 없습니다. 더 상세한 것은 MAER에서 나오는 명령집을 참조 하시기 바랍니다.

다음으로 내부 Data의 처리를 알아 보겠습니다.
모든 명령은 Ladder의 앞 조건이 True일때만 실행 합니다.
|------|조건들|-----------[ 명령 ]-|
이 명령은 MOV,COP,ADD,MUL,DIV,CPT,FAL,BTR,BTR,MSG,BSL,BSR,ROR,ROL,BCD,TOD,FRD,BTD 등의 명령이 있습니다.

각 명령들의 기능은 MAMUAL 을 참조하시고 프로그램 작성 때마다 사용되면 설명을 하겠습니다.

상기 명령 모두는 WORD 값을 다루는 명령들입니다.
이 WORD에는 -32768~32767의 Integer(정수)라는 값이 들어 갈수 도 있고, BCD(Binary Coded Decimal:10진코드), ASC CHAR, Bit정보, Floating(실수)등이 들어가 있을 수 있습니다.

하여 이 Bit를 Word로 또는 Word를 Bit로 다루는 명령을 잘 알아 두어야 합니다. Maker마다 이 Bit를 다루는 방법이 조금씩 상이하므로 그 특성도 알아 두어야 합니다. Melsec는 Bit/Word가 뚜렸이 구분이 되어서 Bit/Word서로 복사시 관련 지정을 하여야 합니다. 그러나 AB는 WORD를 Bit로 바로 지정하여 사용할 수 있기때문에 Bit라는 특별한 Memory가 필요 없다고 보실 수도 있습니다, 하지만 연속 번호 사용시에는 Bit Memory를 사용하여야 합니다. 연속 번호란 0~9999등의 연번 사용을 말합니다.

이럼으로 하여 기본적인 Ladder Programming명령을 보셨고 또 간단한 Ladder 기본을 보셨습니다.

이것을 기본으로하여 여러가지 프로그램을 작성 할 수 있습니다. 명령 Manual 은 필히 가지고 계셔야 합니다. 그래야 적재 적소에 적합한 명령을 찾아서 사용할 수 있기 때문입니다, 물론 자주 사용하다 보면 안보고도 바로 적합한 명령을 바로 사용 하실수 있게 됩니다. 하지만 기본은 가지고 계셔야 합니다. 아니면 HELP 기능을 잘 사용하여야 합니다. HELP기능에서 상세히 설명이 되어 있지 않으면, 필히 PROGRAMMING MANUAL은 구하여 가지고 계셔야 합니다.

그럼 좋은 PROGRAMMER가 되시길 바랍니다.

실습없이는 누구도 좋은 PROGRAMMER가 될 수 없습니다.
실습이란 각 명령이 어떻게 작동 하는지 실재로 시험하여 보는 것입니다. 왜냐하면 그 명령이 과연 어떤 POWER가 있는지는 사용하여 보기 전에는 그 용도를 잘 생각해 낼수 있는 사람은 드물기 때문입니다. 또한 그 명령을 안다고 하더라도 실재로 작동이 잘 되는지 확인을 해야 하기 때문입니다. 이 작업을 SHOP TEST라고도 합니다.

자동 출력 조건 및 수동 출력 조건이 모두 이런 방식으로 작성 될 수 있습니다. 이 방법은 Ladder Programming 방법에 의한 것입니다.
 
PLC PROGRAMMING - 6 (메모리의 배치 및 사용 방법)

메모리의 배치 및 사용 방법에 대하여 논하겠습니다. Memory는 PLC에서는 Program Memory와 Data Memory로 크게 분류 됩니다. Program+Data 로 보시면 되겠습니다.

앞에서 PLC의 MEMORY가 여러 종류가 있다고 하였었습니다.
기본적으로는 Size 별로 구분하면 다음과 같습니다.
ㄱ, Bit로 사용하는 Memory
ㄴ, Byte로 사용하는 Memory
ㄷ, Word로 사용하는 Memory
ㄹ, Dowble Word로 사용하는 Memory

기능별로는 다음과 같습니다.
- Input Memory (I, E, P))
- Output Memory (O, Q, P)
- System Status Memory (S, M9000~)
- Bit Coil Memory (B, M, R)
- Timer Memory (T)
- Counter Memory (C)
- Registers Memory (R)
- Word Integer Memory (N, D)
- Floating Real Memory (F )
- Double Integer Memory(D)
- BCD Memory(D)
- ASC-II Code Memory (A)
- PID Controller Memory (PD)
- Communication Memory (BT, W, L)
- String Memory (ST)

이런 Memory들을 적절히 사용하기 위해서는 PROGRAMMER마다 어떤 규정을 정해 두어야 추가 수정이 쉽습니다.

각 부분별로 묶여지는 공정 Group이 있을 것입니다. 이 Group마다 일정한 범위의 Memory를 할당 해 두고 사용하는 것이 좋습니다.

Allen-Bradley PLC는 사용자가 Memory를 0~254 또는 0~999까지 만들수 있습니다. 이럴 경우 만든 Memory마다 다른 용도로 사용함으로 프로그램의 해독속도가 향상되며, 수정시 쉽게 접근 할 수 있습니다.

Memory는 PLC에 따라서 다르고, 사용자가 만들어서 증설 가능한 PLC도 있지만 정해져서 나오는 PLC도 있습니다.

PLC는 I/O 수용 능력에 따라서 i/o image table Memory가 커지거나 작아 집니다. 

PLC PROGRAMMING -7 (Toggle Switch 작성 및 Annunciator 회로)

프로그램을 작성하다 보면 어떤 기능을 하는 프로그램을 작성할 필요가 있습니다. 그 중에서 Toggle Switch와 Alarm Annunciator 회로에 대하여 알아보겠습니다.

Toggle Switch 회로는 한번 누르면 on되고 다시 한번 더 누르면 off되는 반복 작용을 하는 것으로 정의 합시다.

이 Toggle 회로 작성 방법은 여러가지가 있습니다.
- Sequence로 작성하는 방법-- Start Stop방식

|--|버턴|---(Pulse)+-----|결과|-------(Stop요구)--|
|..................+-----|/결과|------(Start요구)-|
|
|--|Start요구|-+--|/Stop요구|---------(결과)------|
|..............+
|--|결과|------+
* 주의: (Pulse)는 조건이 옳을때 한번만 출력을 내어 보내는 Pulse 명령입니다. 이 명령은 PLC Maker마다 다릅니다.
* 설명: 버턴을 누르면 그 그 순간에 출력을 Off할지 On할지를 결정해서 Start/Stop 형태로 자기유지 회로로 Start요구에 결과가 On 되고 Stop요구시 결과가 Off됩니다.

간단히 Not 명령을 사용 할 수도 있겠습니다.
|---|입력|----(Pulse)---[Not 결과]---|

다른 방법은 직접 실행하면서 만들어 보시기 바랍니다.



Alarm Annunciator회로에 대하여 알아 보겠습니다.
Annunciator 회로란 어떤 알람이 발생하면 그 알람을 자기 유지하고 [ACK] 버턴을 누를때까지 Lamp가 깜박이고 Buzzer가 On되고, ACK를 누르면 Lamp는 계속 켜져만 있고 Buzzer는 Off되게 합니다. 그후에 Reset를 누르면 Alarm 자기 유지가 해제 되는데, 이때 Alarm이 없어 져야만 해제 됩니다. 여기서 Alarm이 발생후 ACK가 되고난후 실제 Alarm이 없어지면 Lamp를 Reset까지 그냥 켜 놓으면 실제 알람이 없어 졌는지 알수 없습니다. 이때는 Lamp를 ACK이전과는 다르게(조금 느리게) 깜박이게 하면 좋을 것입니다.

이런 내용을 아시었으면 어떻게 회로를 구성 할지 생각해 보아야 합니다. 이것을 논리라고도 합니다만, 프로그램 작성 전에 먼저 논리적인 면을 따져 보는 것이 프로그램 작성때에 많은 도움이 됩니다. 자꾸 프로그램을 작성 하다 보면 감이 있어서 쉽게 프로그램을 짜는 것도 이런 능력이 잘 훈련이 되어 있기 때문입니다.

먼저, Alarm이 발생하면 Alarm이 사라져도 알려줄 의무가 있으므로 Alarm을 자기유지 해야 합니다. 해제는 ACK후 Reset까지 입니다.

다음으로 ACK를 누르면 Alarm이 자기된 상태라면, ACK되었음을 Reset를 누를때까지 또한 자기유지하고 있어야 합니다.

Lamp와 Alarm은 이 자기유지와 Alarm입력 조건을 가지고 만들면 되겠습니다.

|---[Alarm발생 조건 들]-------------(Alarm 보조)---|
|
|--[알람보조]---------------+-------(Alarm 홀딩)---|
|...........................+
|--[Alarm홀딩]-+-[/RST누름]-+
|..............+-[/ACK홀딩]-+
|
|--[ACK누름]----+-----[Alarm홀딩]------(ACK홀딩)---|
|--[ACK홀딩]----+

다음으로 Lamp는
|--[ACK홀딩|-+[/Alarm보조]--[천천히깜박임]-+-(알람Lamp)-|
|............+[ Alarm보조]-----------------+
|--[/ACK홀딩]--[Alarm보조]--[빠른깜박임]---+
|

다음으로 Buzzer는
|--[Alarm홀딩]--[/ACK홀딩]---[부져깜빡임]----(부져출력)-|
|

여기서는 한개의 Alarm만 만들었지만 현장에서는 많은 개수의 Alarm 회로가 필요합니다. 이때는 복사해서 주소를 바꾸어서 사용하시면 되고, Buzzer는 한개 이므로 Or로 출력 하시면 됩니다. 이런 기능을 Function회로로 만들어서 사용하면 참 좋을 것입니다. (이런 명령이 없으므로)

PLC PROGRAMMING - 8 (SEQUENCE 제어방법과 간접주소지정)

PLC LADDER PROGRAMMING을 기본으로 한 프로그램 작성의 방법에 대하여 알아 보겠습니다.
ㄱ, 단순히 Timer와 접점들을 사용한 프로그램.
ㄴ, 접점처리형을 기능별로 묶어서 한개의 기능을 하는 프로그램 Call.
ㄷ, 메모리를 명령어를 넣어서 LADDER가 이것을 해석하여 제어하는 메모리명령-MACRO방식.
ㄹ, 출력 SEQUENCE TABLE형 제어.

"ㄱ"방식은 익히 잘아는 LADDER입니다. "ㄴ"은 같은 작업을 하는 프로그램을 한개만 만들고 각각에 제어 메모리만 배당하고 이 제어 메모리를 가지고 외부에서 "ㄱ"방식으로 Call 하는 형식입니다. "ㄷ"방식은 한개 또는 단위 메모리에 작동에 관한 정보를 넣어두고 이것을 LADDER PROGRAM이 해석하여 실행하는 방식입니다. 이 방식은 MEMORY에 들어있는 DATA의 정의에 따라서 실행이 결정 되므로 처음 해석시 어렵게 됩니다, 장점은 이 명령구조를 이해한다면, 제어는 쉬워 질수도 있습니다. "ㄹ"은 각 STEP마다 출력할 자료를 메모리에 정해두고 각 상태때 마다 그 자료를 바로 출력으로 내어 보내는 방식입니다.

프로그램 작성시 어떤 프로그램으로 작성하면 유지 보수 이해하기 좋을지를 선정한 다음에 자신에 또는 현장여건에 맞는 방식을 채택해야 합니다.


대체로 기존의 전기 회로와 비슷한 RELAY SEQUENCE 제어를 선호하고 있습니다. 그 이유는 회로가 전기 회로와 비슷하기 때문에 이해하기 쉽다는 것입니다.

상기의 프로그램 방식에 대하여 논하시거나 실습을 해 보시기 바랍니다.

상기 "ㄴ" "ㄷ"형의 프로그램을 작성 할려면, INDIRECT 형의 주소지정에 대하여 알아야 합니다.

INDIRECT ADDRESSING이란 어떤 형의 자료화일내에서 어떤 메모리가 가지고 있는 위치 주소의 자료를 다루는 것을 말합니다. 작동 순서는 먼저 INDIRECT(간접) 위치를 가지고 있는 ADDRESS의 값을 가져오고 그 값에 해당하는 주소의 값을 읽거나 쓰게 하는 형식입니다. POINT형 지정이라고도 할 수 있습니다.

이 간접 주소 지정은 단지 OFFSET만 지정해 줌으로서 동일한 처리를 해줄수 있으므로 프로그램을 간략화 및 수정의 용이함을 제공합니다. 그러나 간접주솟 지정에 대하여 친숙하지 못하여 이해하는데 어려운 사람들도 있습니다. 그러므로 이 간접 주소지정이 어떤 것인지 충분히 인지하시고, PLC마다 어떻게 이 간접주소 지정을 하게 해 주는지 알아 보시길 바랍니다.

- MELSEC는 Z,V의 방에 간접 주소를 넣습니다.
- SLC500 구 버젼은 S:## 방에 간접 주소를 넣습니다.
- PLC5 및 신버젼 SLC500은 화일명 에 [ ]를 사용하여 바로 지정이 가능합니다.
기타 타 PLC의 간접 지정에 대한 것은 사용자 메뉴얼을 참조 하시길 바랍니다. 또한 상세한 사용은 실습해 보심으로 감을 잡으시길 바랍니다. 또한 사용 용도에 대하여 논해 보시길 바랍니다.



"ㄷ"방식 문제) 16Bit 한개의 Word에 기능을 구성하여 제어해 봅시다.
0~4 Bit: 4개의 입력조건
5~7 Bit: 처리시간.
8~11 Bit: 명령OPERAND
12~15 Bit : 제어 명령 종류

12~15 내용이 0,1,2,3,4,5,6,7 이 있습니다.
각각에 대하여 하위 Bit를 어떻게 해석할지 정합니다.
8~11 내용은 상위 Bit명령에 대한 조작 내용을 담습니다.
6~7 내용도 상위 Bit명령에 대한 조작 내용을 담습니다.
0~4 내용은 명령의 조건을 지정합니다.
 
PLC PROGRAMMING - 9 (Timer & Counter 사용하기)

제어 로직에서 빠질 수 없는 것 또는 없으면 제어가 부드럽지 못한 결과를 주는 것이 바로 Timer입니다.

기계적으로 시간이 지연되기도 하고 기계적으로 Cylinder에 Air Speed 조절기를 달아서 움직이는 속도 조절, Cylinder내부에 스프링이 있어서 마지막 종단이 다 되어서 속도를 느리게하여 기계적인 충격을 줄이는 등 기계 설계시 기계적 보완이 먼저 있습니다. 이러하지 못할때는 PLC 에서 이 기능을 하도록 프로그램을 작성 하여야 합니다.

또한 제어 논리의 가각의 Step에 진입할때 지연이나 나갈때 지연이 필요하기도 합니다. 가장 많이 쓰는 것이 일정시간 지연이 필요한 제어 논리가 있으며 이는 제어 논리에 명시적으로 표기가 되는 부분입니다. 논리에 명시된 대로 잘 작동 하는 기계라면, 설계가 잘된 기계 또는 제어 논리가 됩니다. 대체로 제어논리를 말로만 표현하기도 합니다. 그러다 보면 Timer를 몇초 작동 할지는 시운전 시에 기계의 상태와 환경을 보아야만 가능하게 됩니다. 이 유용한 Timer 의 종류와 용도에 대하여 그리고 사용법에 대하여 알아보겠습니다.

- ON Timer : 입력조건이 On이 계속유지될때 정해진 시간후에 출력이 사는 Timer입니다. 용도는 일정 시간 후에 작동될 사건의 처리에 사용합니다.

- OFF Timer : 입력조건이 On되면 출력이 살고(On=1) 입력이 Off된 때부터 정해진 시간까지만 출력이 살아 있는 Timer입니다. 용도는 작동이 조건에서 조건후 몇초 더 작동되게 할 경우에 사용합니다.

- RETENTIVE Timer : 적산 Timer입니다. 이 Timer는 입력이 Off되어도 Timer가 초기화가 되지 않는 Timer입니다. 즉 입력이 On 될 때마다 현재 Timer의 값이 증가 하여 정해진 시간까지 가면 출력이 On되는 Timer입니다. 그러므로 이 Timer는 프로그램에서 어떤 조건시 초기화(Reset)를 시켜주어야 합니다. 용도는 제어조건이 자주 꺼지던 말던 정해진 시간만큼만 작동 시키고자 할 경우에 사용합니다.

- 그외에 여러 Timer가 있습니다만 이 기본적인 Timer만 있으면 모두 조합하여 만들수 있을 것입니다.

예1) 자주 사용하는 Flicker를 하나 만들어 보겠습니다. 0.5초 On 0.5초 Off하도록 합니다.
|---|/Timer1|-------------(Timer0 0.5초)-|
|---| Timer0|---+---------(Timer1 0.5초)-|
|...............+---------(Flicker 출력)-|
상기 'Flicker 출력'은 내부 보조코일 입니다. 출력이 0.5/0.5로 깜박입니다. 램프 깜박임에 사용합니다.

예2) 1초마다 Pulse를 발생시키는 프로그램을 작성합니다.
|---|/Timer0|--------------(Timer0 1초)-|
|---| Timer0|------------(Pulse출력1초)-|
상기 'Pulse 출력1초'는 매 1초마다 1 Scan만 On하는 Pulse성 출력입니다. 일초마다 어떤 작업에 사용하면 됩니다. 이 1초 Pulse는 정확하게 매 1초마다 On Pulse가 발생하지는 않습니다. 그러므로 아주 정확한 용도에는 사용하지 않습니다. 대체로 맞다고 보고 사용합니다.

그러나 더 정확한 1초 Pulse를 만들 필요가 있습니다. 적산에서는 필수 요소입니다. 그럼 이 정확한 1초 Pulse를 어떻게 만드는지 알아 봅시다.

PLC내부 시스템에는 Clock기능이 있습니다. 이 Clock가 거의 잘 맞는다고 봅니다. (그래도 1달에 몇초는 틀림). 이 Clock의 1초를 사용하는 것입니다. 초 내용중 초의 마지막 Bit를 이용합니다. 이 Bit가 On일때 Pulse를 만들고 Off일때 Pulse를 만들어 이 2 Pulse를 Or로 묶어서 사용합니다. 그런데 간혹 이 초가 1초단위로 올라가지 않고 2초씩 올라가 버리는 경우가 있습니다. 아무리 생각해도 그럴 수 없는데도 말입니다. 1Scan Timer이 2~50(0.05Sec) mSec이므로 그 사이에 2초씩 바뀔 수는 없기 때문입니다. 아마도 PLC System이 Clock에서 값을 늦게 읽어다 두는 모양입니다. 그러므로 이런 부작용이 있는지도 PLC종류마다 한번씩 검사한 후에 적용하시기 바랍니다. 이럴 경우에는 시간이 몇초 지나 갔는지 검사도 해 봐야 합니다. 즉 각 1초 Pulse마다 실재 몇초 지나 갔는지 내부적으로 계산해 두어야 합니다.


* 중요: PLC 프로그램은 위에서 아래로 각 Scan시간마다 실행하므로 프로그램의 위치에 따라서 제어 결과가 다를 수 있습니다. 이 원리를 이용하면 각 Scan마다 어떤 값이 바뀌었는지 이전값과 현재값을 빼보면 알수 있습니다. 그리하여 각 Scan마다 변한 값의 정도를 알아볼 수 있으며, 이 값을 다 60초동안 모으면 분당 값이 됩니다. 물론 60초내의 값은 계속 1초마다 바뀌게 할려면 배열을 사용하여 60개를 계속 밀어 넣고 60개를 모두 합산 하여야 합니다. (매번 합산하지 않고 동기에 맞추어 한번 더하고 한번 뺌으로 60개의 합산은 가능합니다).

이 Timer의 내부 구조는
- 상태 Word 1개
- 설정(Preset) Word 1개
- 현재(Accumulator)값 Word 1개로 구성 됩니다.

또는 이전의 PLC는 Memory를 아낄려고 2개의 Word만 사용하고 설정이나 현재치는 BCD 3자 (000-999)까지만 사용할 수 있었습니다. 나머지 4 Bits 는 상태에 사용했습니다. (PLC2 기종).

다음으로 Counter의 구조도 동일 합니다.
- 상태 Word 1개
- 설정(Preset) Word 1개
- 현재(Accumulator)값 Word 1개로 구성 됩니다.

Counter는 입력 조건이 On될때에 한번만 작동 합니다. 그러므로 Counter입력 조건에 Pulse를 두면 Pulse의 개수를 셀 수 있습니다. Counter의 출력은 설정된 개수만큼 되면 Counter출력이 On됩니다. 출력이On된 이후에도 Reset이 안되면 계속 값이 바뀌는 PLC도 있습니다.(주의).

Counter는 UP Counter, Down Counter 2 종류가 있습니다. Counter는 자동 초기화가 안되므로 프로그램에서 어떤 조건시 초기화를 시켜 주어야 합니다.

Counter의 예.


예1) 입력접점의 Counting 10000개후 출력 Pulse 및 초기화 다시 계속 10000개 Counting.

|---| 입력접점 |----------------(CTU-1 10000개)--|
|---| CTU-1완료|-------+----------(Reset CTU-1)--|
|......................+-------------(완료펄스)--|

상기 '완료펄스'는 매 100000개의 입력이 들어 올때마다 1Scan On됩니다.

*주의: 입력 접점이 PLC 2 Scanning Time보다 짧으면 안됩니다. 즉 입력접점의 변화 속도는 최소한 2 * Max ScanTime보다 커야 합니다.
 
PLC PROGRAMMING - 10 ( Memory 계산 )

PLC 프로그램에서 어떤 입력을 다른 방법으로 표현하기 위하여 내부 계산을 해야 하는 경우가 많습니다.
- PULSE 누적.
- PULSE 를 순시유량으로 바꾸기.
- 순시총변화량을 순치공급량으로 바꾸기.
- FIFO,LIFO STACK 처리.
- 명령접수 보관.
- 내부 상태 보관.
- 현재입력 값을 평균내기.

이 경우들에서 각각의 필요한 메모리 구조가 있을 것입니다.
정수로 보관 하는지 실수로 보관하는지 BIT로 보관하는지를 결정한 후에, 필요한 많큼의 메모리를 할당 합니다. 할당한 메모리를 어떻게 사용할지를 생각한 다음에 프로그램을 작성한 후에 부분부분에 대한 작동을 시험합니다. 항상 복잡한 프로그램은 작성후에 부분부분의 작동이 잘 되는지 시험하여 보아야 합니다. 생각지 못한 부분이 생길 것이기 때문입니다.

메모리는 연번으로 0000 ~ #### 식으로 할당되고 지정하여 사용합니다. 이렇게 1차원적인 배열을 어떻게 다룰 수 있는지 시험해 보아야 합니다.
- 먼저 복사 명령을 이용하여 밑에 있는 주소를 바로 위의 주소로 복사하면 어떻게 될까요? 실행하여 보면 아래에 있는 자료들이 모두 한개씩 위로 당겨진 것을 볼 수 있을 것입니다. 이렇게 하여 메모리의 이동을 생각해 보았습니다.
- 이 만들어진 1차원 배열의 입 출력을 어떻게 할 것인지 생각해 보아야 합니다. 어디에다 값을 집어 넣고 또 빼어내야 할지 또 프로그램은 어떻게 처리해야 할지 말입니다. 빼어 내는 것은 최고 위의 주소의 값을 가져가고 밀어 올리라고 신호를 주던지 '0'을 사용하지 않는다면 '0'을 집어 넣고 프로그램은 '0'을 발견하면 하나씩 당기도록 프로그램을 작성하면 됩니다. 이렇게 '0'을 빈자리로 설정하고 '0'일 경우 당겨주는 프로그램을 작성 했다면 이 메모리에 값을 낳는 것은 쉽게 마지막 주소에다가 값을 넣어 주는 것만으로도 됩니다.

이런 방법을 사용하면 PLC에서 제공하는 FIFO,LIFO라는 명령을 사용할 필요가 없습니다. 직접 만들어서 사용할 수 있습니다.

그다음으로 값을 평균내는 방법에 대하여 생각해 보겠습니다.
- 10 ~ 60 초 사이의 값을 평균내어 사용한다고 합시다.
- 60초동안 값을 초당으로 모아서 모두 합산하면 단위는 분당 공급량이 됩니다.
* 우선 들어온 값을 초당 또는 2초당 등의 적절한 값으로 바꿉니다. 이 값을 위에서 다른 배열 60개 중에서 최고 뒤에 넣고 위로 이동시킴니다. 그런데 계속 60개를 합산한다는 것은 번거럽고 PLC의 SCAN TIME을 길게하므로 좋지 않습니다. 이 경우에는 배열을 어떤 시점에 모두 0으로 초기화 하고 합산한 값도 0으로 합니다. 그런후에 새로운 값이 들어오면 합산값에 더하고 빠져 나가는 값을 빼주면 됩니다. 이경우 유효자리가 짤리는지 확인해야 합니다. 합산한 값의 변수형은 충분히 큰 변수여야 합니다. 이 합산한 값을 개수 많큼 나누면 현재 초당 또는 2초당 공급한 량이 될 것이고, 합산한 값은 그대로 분당 공급량이 될 것입니다.

상기 방식은 모두 간접주소 지정방법을 사용해야 하며, 간접주소 지정할 INDEX POINT 방이 있어야 합니다. 

PLC PROGRAMMING - 10 ( Memory 계산 )

PLC 프로그램에서 어떤 입력을 다른 방법으로 표현하기 위하여 내부 계산을 해야 하는 경우가 많습니다.
- PULSE 누적.
- PULSE 를 순시유량으로 바꾸기.
- 순시총변화량을 순치공급량으로 바꾸기.
- FIFO,LIFO STACK 처리.
- 명령접수 보관.
- 내부 상태 보관.
- 현재입력 값을 평균내기.

이 경우들에서 각각의 필요한 메모리 구조가 있을 것입니다.
정수로 보관 하는지 실수로 보관하는지 BIT로 보관하는지를 결정한 후에, 필요한 많큼의 메모리를 할당 합니다. 할당한 메모리를 어떻게 사용할지를 생각한 다음에 프로그램을 작성한 후에 부분부분에 대한 작동을 시험합니다. 항상 복잡한 프로그램은 작성후에 부분부분의 작동이 잘 되는지 시험하여 보아야 합니다. 생각지 못한 부분이 생길 것이기 때문입니다.

메모리는 연번으로 0000 ~ #### 식으로 할당되고 지정하여 사용합니다. 이렇게 1차원적인 배열을 어떻게 다룰 수 있는지 시험해 보아야 합니다.
- 먼저 복사 명령을 이용하여 밑에 있는 주소를 바로 위의 주소로 복사하면 어떻게 될까요? 실행하여 보면 아래에 있는 자료들이 모두 한개씩 위로 당겨진 것을 볼 수 있을 것입니다. 이렇게 하여 메모리의 이동을 생각해 보았습니다.
- 이 만들어진 1차원 배열의 입 출력을 어떻게 할 것인지 생각해 보아야 합니다. 어디에다 값을 집어 넣고 또 빼어내야 할지 또 프로그램은 어떻게 처리해야 할지 말입니다. 빼어 내는 것은 최고 위의 주소의 값을 가져가고 밀어 올리라고 신호를 주던지 '0'을 사용하지 않는다면 '0'을 집어 넣고 프로그램은 '0'을 발견하면 하나씩 당기도록 프로그램을 작성하면 됩니다. 이렇게 '0'을 빈자리로 설정하고 '0'일 경우 당겨주는 프로그램을 작성 했다면 이 메모리에 값을 낳는 것은 쉽게 마지막 주소에다가 값을 넣어 주는 것만으로도 됩니다.

이런 방법을 사용하면 PLC에서 제공하는 FIFO,LIFO라는 명령을 사용할 필요가 없습니다. 직접 만들어서 사용할 수 있습니다.

그다음으로 값을 평균내는 방법에 대하여 생각해 보겠습니다.
- 10 ~ 60 초 사이의 값을 평균내어 사용한다고 합시다.
- 60초동안 값을 초당으로 모아서 모두 합산하면 단위는 분당 공급량이 됩니다.
* 우선 들어온 값을 초당 또는 2초당 등의 적절한 값으로 바꿉니다. 이 값을 위에서 다른 배열 60개 중에서 최고 뒤에 넣고 위로 이동시킴니다. 그런데 계속 60개를 합산한다는 것은 번거럽고 PLC의 SCAN TIME을 길게하므로 좋지 않습니다. 이 경우에는 배열을 어떤 시점에 모두 0으로 초기화 하고 합산한 값도 0으로 합니다. 그런후에 새로운 값이 들어오면 합산값에 더하고 빠져 나가는 값을 빼주면 됩니다. 이경우 유효자리가 짤리는지 확인해야 합니다. 합산한 값의 변수형은 충분히 큰 변수여야 합니다. 이 합산한 값을 개수 많큼 나누면 현재 초당 또는 2초당 공급한 량이 될 것이고, 합산한 값은 그대로 분당 공급량이 될 것입니다.

상기 방식은 모두 간접주소 지정방법을 사용해야 하며, 간접주소 지정할 INDEX POINT 방이 있어야 합니다. 

 
다음검색
댓글
  • 작성자 10.05.16 07:31

    첫댓글 머리 부셔지네...

  • 10.05.19 09:13

    어렵군요 ㅋㅋ

최신목록