Math Instructions

11.1 Math Instructions

수학 명령어(math instruction)는 데이터 조작 명령어(data manipulation instruction)와 마찬가지로 프로그램 가능 컨트롤러(PLC)가 일반 컴퓨터의 특성을 더 많이 갖도록 해줍니다. PLC의 수학 기능은 메모리의 워드(word) 또는 레지스터(register)에 저장된 값에 대해 산술 연산을 수행할 수 있도록 합니다.

예를 들어, 제조된 부품 수를 추적하기 위해 카운터를 사용하고 있고, 목표 수량(quota)에 도달하기 위해 앞으로 얼마나 더 생산해야 하는지를 표시하고자 한다고 가정하겠습니다. 이를 표시하기 위해서는 카운터의 누적 값(accumulated value)을 목표 값에서 빼는 연산이 필요합니다. 다른 응용 예로는 각기 다른 부품 개수를 합산하거나, 검출된 불량품을 차감하거나, 생산 속도(run rate)를 계산하는 경우가 있습니다.

사용되는 프로세서 종류에 따라 다양한 수학 명령어를 프로그래밍할 수 있습니다. PLC가 수행하는 기본적인 네 가지 산술 기능은 다음과 같습니다.

Addition — 두 데이터 값을 더할 수 있는 기능

Subtraction — 한 데이터에서 다른 데이터를 뺄 수 있는 기능

Multiplication — 한 데이터를 다른 데이터와 곱할 수 있는 기능

Division — 한 데이터를 다른 데이터로 나눌 수 있는 기능

수학 명령어는 두 개의 워드 또는 레지스터에 저장된 내용을 사용하여 원하는 연산을 수행합니다. PLC의 데이터 조작 명령어(데이터 전송 및 데이터 비교)는 수학 기호와 함께 사용되어 수학 연산을 수행하게 됩니다. 수학 명령어는 모두 출력(output) 명령어입니다.

그림 11-1은 SLC 500 PLC와 해당 RSLogix 소프트웨어에서의 Compute/Math 메뉴 탭을 보여줍니다.

각 명령어는 다음과 같이 요약할 수 있습니다.

CPT (Compute) — 표현식을 계산하여 결과를 목적지(destination)에 저장합니다.

ADD (Add) — Source A와 Source B를 더한 결과를 목적지에 저장합니다.

SUB (Subtract) — Source A에서 Source B를 뺀 결과를 목적지에 저장합니다.

MUL (Multiply) — Source A와 Source B를 곱한 결과를 목적지에 저장합니다.

DIV (Divide) — Source A를 Source B로 나누어 그 결과를 수학 레지스터(math register)에 저장합니다.

SQR (Square Root) — Source의 제곱근을 계산하여, 정수 형태의 결과를 목적지(destination)에 저장합니다.

NEG (Negate) — Source의 부호를 반전시켜 그 값을 목적지에 저장합니다.

TOD (To BCD) — 16비트 정수(integer) 형태의 Source 값을 BCD로 변환하여 수학 레지스터 또는 목적지에 저장합니다.

FRD (From BCD) — 수학 레지스터 또는 Source에 있는 BCD 값을 정수로 변환하여 목적지에 저장합니다.

그림 11-2는 SLC 500 컨트롤러에서 사용되는 CPT(compute) 명령어를 보여줍니다. CPT 명령어가 실행되면, 해당 명령어의 표현식(expression) 필드에 포함된 복사(copy), 산술(arithmetic), 논리(logical), 또는 변환(conversion) 연산이 수행되며, 그 결과가 목적지에 전달됩니다. CPT 명령어의 실행 시간은 단일 산술 명령어보다 길고 더 많은 명령어 워드(instruction word)를 사용합니다.

11.2 Addition Instruction

대부분의 수학 명령어(math instruction)는 두 개의 입력 값을 받아 지정된 산술 연산을 수행한 뒤, 그 결과를 할당된 메모리 위치에 출력합니다. 예를 들어 ADD 명령어는 참조된 메모리 위치에 저장된 두 값을 더하는 기능을 수행합니다. 이러한 값이 어떻게 접근되는지는 사용하는 컨트롤러에 따라 달라집니다. 그림 11-3은 SLC 500 컨트롤러에서 사용되는 ADD 명령어를 보여줍니다. 해당 런(rung)의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 됩니다.

• Source A 주소 N7:0에 저장된 값 25와 Source B 주소 N7:1에 저장된 값 50이 더해집니다.

• 계산 결과인 75는 목적지(destination) 주소 N7:2에 저장됩니다.

• Source A와 Source B는 값이거나 값을 포함한 주소 모두 가능하지만, A와 B가 모두 상수일 수는 없습니다.

그림 11-4의 프로그램은 두 개의 업카운터의 누적 값을 ADD 명령어로 더하는 방법을 보여줍니다. 이 응용에서는 두 카운터의 합이 350 이상이면 파일럿 라이트가 켜져야 합니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• ADD 명령어의 Source A는 카운터 C5:0의 누적 값(accumulated value)을 저장하는 주소에 할당됩니다.

• ADD 명령어의 Source B는 카운터 C5:1의 누적 값을 저장하는 주소에 할당됩니다.

• Source A의 값과 Source B의 값이 더해지고, 계산 결과는 목적지 주소 N7:1에 저장됩니다.

• GEQ(greater than or equal) 명령어의 Source A는 목적지 주소 N7:1의 값을 저장하는 주소로 할당됩니다.

• GEQ 명령어의 Source B는 상수 350을 포함합니다.

• 두 카운터의 누적 값 합이 350 이상이면 GEQ 명령어와 출력 PL1이 true가 됩니다.

• 두 카운터의 누적 값을 0으로 초기화(reset)하기 위한 리셋 버튼이 제공됩니다.

수학 연산을 수행할 때는 값이 데이터 테이블 또는 파일이 저장할 수 있는 범위를 벗어나지 않도록 주의해야 합니다. 범위를 초과할 경우 오버플로(overflow) 비트가 설정됩니다. SLC 500 컨트롤러의 산술 상태 비트(arithmetic status bit)는 프로세서 상태 파일 S2의 워드 0, 비트 0~3에 저장됩니다(그림 11-5). 명령어가 실행된 후 상태 파일의 산술 상태 비트는 다음과 같은 의미로 업데이트됩니다.

Carry (C) — 주소 S2:0/0, ADD 명령어에서 자리올림(carry)이 발생하거나 SUB 명령어에서 자리내림(borrow)이 발생하면 1로 설정됩니다.

Overflow (O) — 주소 S2:0/1, 결과가 목적지 레지스터에 저장할 수 있는 범위를 초과할 경우 1로 설정됩니다.

Zero (Z) — 주소 S2:0/2, subtract 연산 결과가 0일 때 1로 설정됩니다.

Sign (S) — 주소 S2:0/3, 결과가 음수일 때 1로 설정됩니다.

11.3 Subtraction Instruction

SUB(subtract) 명령어는 한 값을 다른 값에서 빼고 그 결과를 목적지(destination) 주소에 저장하는 출력 명령어입니다. 런(rung) 조건이 true이면 SUB 명령어는 Source A에서 Source B를 빼며, 그 결과를 목적지에 저장합니다. 그림 11-6은 SLC 500 컨트롤러에서 사용되는 SUB 명령어를 보여줍니다. 해당 런의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 됩니다.

• Source A 주소 N7:10에 저장된 값 520에서 Source B 주소 N7:05에 저장된 값 322가 빼집니다.

• 계산된 결과 198은 목적지 주소 N7:20에 저장됩니다.

• Source A와 Source B는 값이거나 값을 포함하는 주소 모두 가능하지만, 두 항목 모두 상수일 수는 없습니다.

그림 11-7의 프로그램은 SUB 기능을 사용하여 용기 과충전(overfill) 상태를 감지하는 방법을 보여줍니다. 이 응용에서는 용기의 중량이 설정값 500 lb에 도달한 후, 공급 시스템에서 5 lb 이상의 원료가 누설될 경우 경보가 울리도록 해야 합니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• 시작 버튼이 눌리면 채움 솔레노이드(rung 1)와 충전 표시등(rung 2)이 켜지고, 원료가 용기로 유입됩니다.

• 용기의 중량은 충전되는 동안 PLC 프로그램(rung 3)에 의해 지속적으로 모니터링됩니다.

• 중량이 500 lb에 도달하면 채움 솔레노이드는 소자되고 유입이 차단됩니다.

• 동시에 충전 파일럿 라이트는 꺼지고, 만수(full) 파일럿 라이트(rung 3)는 켜집니다.

• 만약 채움 솔레노이드가 누설되어 원료가 추가로 5 lb 이상 유입되면 경보(rung 5)가 여자되고, 과충전 수준이 5 lb 미만으로 떨어질 때까지 계속 여자 상태를 유지합니다.

11.4 Multiplication Instruction

Multiply(MUL) 명령어는 두 값을 곱해 그 결과를 목적지(destination) 주소에 저장하는 출력 명령어입니다. 그림 11-8은 SLC 500 컨트롤러에서 사용되는 MUL 명령어를 보여줍니다. 해당 런(rung)의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 됩니다.

• Source A(상수 20)의 데이터는 Source B(카운터 C5:10의 누적 값)의 데이터와 곱해집니다.

• 계산된 결과는 목적지 N7:2에 저장됩니다.

• 다른 수학 명령어와 마찬가지로 MUL 명령어의 Source A와 Source B는 값(상수) 또는 값을 포함하는 주소 모두 가능하지만, 두 항목이 모두 상수일 수는 없습니다.

그림 11-9의 프로그램은 MUL 명령어가 두 소스 값을 곱하여 결과를 계산하는 예를 보여줍니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 MUL 명령어가 실행됩니다.

• Source A 주소 N7:1에 저장된 값 123은 Source B 주소 N7:2에 저장된 값 61과 곱해집니다.

• 계산된 결과 7503은 목적지 워드 N7:3에 저장됩니다.

• 그 결과 equal 명령어가 true가 되어 출력 PL1이 켜집니다.

그림 11-10의 프로그램은 MUL 명령어가 오븐 온도 제어 프로그램의 일부로 사용되는 예를 보여줍니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• PLC는 설정값(set-point) 주변의 상·하한 데드밴드(deadband), 즉 off/on 한계를 계산합니다.

• 상한과 하한 온도 한계는 설정값의 크기와 관계없이 자동으로 설정값의 61%로 결정됩니다.

• 설정값 온도는 엄지휠 스위치로 조정됩니다.

• 아날로그 열전대(thermocouple) 인터페이스 모듈은 오븐의 현재 온도를 모니터링하는 데 사용됩니다.

• 예시에서 설정값 온도는 400°F입니다.

• 따라서 오븐 온도가 396°F 미만으로 떨어지면 전기 히터가 켜지며, 온도가 404°F를 초과할 때까지 켜진 상태가 유지됩니다.

• 설정값을 100°F로 변경하는 경우에도 데드밴드는 61%로 동일하며, 하한은 99°F, 상한은 101°F가 됩니다.

• 워드 N7:1에 저장된 값은 상한 온도(limit)를 나타내며, 워드 N7:2에 저장된 값은 하한 온도를 나타냅니다.

11.5 Division Instruction

DIV(divide) 명령어는 Source A의 값을 Source B의 값으로 나누고, 그 결과를 목적지(destination)와 수학 레지스터(math register)에 저장합니다. 그림 11-11은 DIV 명령어의 예를 보여줍니다. 로직 런(rung)의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 됩니다.

• Source A(카운터 C5:10의 누적 값)에 있는 데이터는 Source B(상수 2)의 값으로 나누어집니다.

• 계산된 결과는 목적지 N7:3에 저장됩니다.

• 나머지가 0.5 이상이면, 정수 목적지에 반올림(round‑up)된 값이 저장됩니다.

• 수학 레지스터에는 반올림되지 않은 몫(상위 워드에 저장)과 나머지(하위 워드에 저장)가 포함됩니다.

• 일부 PLC는 정수(integer) 값뿐 아니라 부동소수점(floating‑decimal) 값도 지원합니다. 예를 들어, 10 ÷ 3은 3.333333(부동소수점 표기) 또는 몫 3, 나머지 1로 표현될 수 있습니다.

그림 11-12의 프로그램은 DIV 명령어가 Source A를 Source B로 나눠 정수 결과를 계산하는 예를 보여줍니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 DIV 명령어가 실행됩니다.

• Source A 주소 N7:0에 저장된 값 120은 Source B 주소 N7:1에 저장된 값 4로 나누어집니다.

• 계산된 결과 30은 목적지 주소 N7:5에 저장됩니다.

• 이 결과로 equal 명령어가 true가 되어 출력 PL1이 켜집니다.

그림 11-13의 프로그램은 DIV 기능이 섭씨(Celsius) 온도를 화씨(Fahrenheit)로 변환하는 프로그램의 일부로 사용되는 예를 보여줍니다. 프로그램의 동작은 다음과 같이 요약됩니다.

• 입력 모듈에 연결된 엄지휠 스위치(thumbwheel switch)는 섭씨 온도를 나타냅니다.

• 프로그램은 데이터 테이블에 저장된 섭씨 온도를 화씨 값으로 변환하여 표시하도록 설계됩니다.

• 다음 변환 공식이 프로그램의 기반이 됩니다:

F = (9/5 × C) + 32

• 예시에서는 온도값으로 60°C가 사용됩니다.

• MUL 명령어는 60°C에 9를 곱해 540을 만들고, 이 값은 주소 N7:0에 저장됩니다.

• 다음으로 DIV 명령어는 540을 5로 나누고, 계산된 결과 108을 주소 N7:1에 저장합니다.

• 마지막으로 ADD 명령어는 108에 32를 더해 합계 140을 주소 O:13에 저장합니다.

• 따라서 60°C = 140°F가 됩니다.

11.6 Other Word‑Level Math Instructions

그림 11-14의 프로그램은 제곱근(square root, SQR) 명령어의 사용 예를 보여줍니다. 로직 런(rung)의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 SQR 명령어가 실행됩니다.

• 제곱근을 구하려는 값(144)이 Source에 저장됩니다.

• 명령어는 이 값의 제곱근을 계산하여 결과(12)를 목적지(destination)에 저장합니다.

• Source 값이 음수일 경우, 명령어는 해당 음수의 절댓값(positive value)의 제곱근을 계산하여 그 값을 목적지에 저장합니다.

그림 11-15의 프로그램은 NEG(negate) 명령어의 사용 예를 보여줍니다. 이 수학 기능은 Source 값의 부호를 양수에서 음수로 변경합니다. 런의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 NEG 명령어가 실행됩니다.

• Source 주소 N7:52에 저장된 양수 101은 부호가 반전되어 –101이 되며, 이 값은 목적지 주소 N7:53에 저장됩니다.

• 양수는 스트레이트 바이너리(straight binary) 형식으로 저장되고, 음수는 2’s complement(2의 보수) 형식으로 저장됩니다.

ㅇ그림 11-16의 프로그램은 CLR(clear) 명령어의 예를 보여줍니다. 로직 런의 동작은 다음과 같습니다.

• 입력 스위치 SW가 닫히면 CLR 명령어가 실행됩니다.

• 명령어는 실행되면 하나의 워드(word)에 포함된 모든 비트를 0으로 설정합니다.

• 이 예에서는 목적지 주소 N7:22에 저장된 모든 비트가 0으로 초기화됩니다.

TOD(convert to BCD) 명령어는 16비트 정수(integer)를 BCD(binary‑coded decimal) 값으로 변환하는 데 사용됩니다. 프로세서에서 저장하는 이진(binary) 데이터를 BCD 형식을 사용하는 외부 장치(예: BCD 방식 LED 표시기)로 전송할 때 사용됩니다. 그림 11-17은 TOD 명령어의 예를 보여줍니다. 런의 동작은 다음과 같습니다.

• 입력 스위치 SW가 닫히면 TOD 명령어가 실행됩니다.

• Source 주소 N7:23의 이진 비트 패턴은 동일한 십진 값을 갖는 BCD 비트 패턴으로 변환되어 목적지 주소 O:20에 저장됩니다.

• Source는 십진 값 10을 표시하지만, 목적지는 값 16을 표시합니다.

• 이는 프로세서가 모든 비트 패턴을 이진으로 해석하기 때문이며, BCD 10의 비트 패턴은 이진수 16의 비트 패턴과 동일합니다.

FRD(convert from BCD) 명령어는 BCD 값을 정수(integer) 값으로 변환하는 데 사용됩니다. BCD thumbwheel switch 등 BCD 형식으로 입력되는 외부 데이터를 프로세서의 이진 형식으로 변환해야 할 때 사용됩니다. 그림 11-18은 FRD 명령어의 예를 보여줍니다. 런의 동작은 다음과 같습니다.

• 입력 스위치 SW가 닫히면 FRD 명령어가 실행됩니다.

• Source 주소 I:30에 저장된 BCD 비트 패턴은 동일한 십진 값을 갖는 이진 비트 패턴으로 변환되어 목적지 N7:24에 저장됩니다.

SCL(scale data) 명령어는 매우 큰 값 또는 작은 값을 비율(rate) 값에 따라 확대 또는 축소(scaling)하는 데 사용됩니다. 런 조건이 true이면 이 명령어는 Source 값을 지정된 rate로 곱한 뒤, 반올림된 결과를 offset 값과 더하여 목적지에 저장합니다. (일차변환) 그림 11-19는 SCL 명령어의 예입니다. 런의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 SCL 명령어가 실행됩니다.

• Source 주소 N7:0에 저장된 값 100은 25,000과 곱해지고, 10,000으로 나누어진 다음 offset 값 127이 더해집니다.

• 계산 결과 377은 목적지 주소 N7:1에 저장됩니다.

SCL 명령어는 아날로그 모듈의 데이터를 스케일링하여 공정 변수(process variable) 또는 다른 아날로그 모듈이 요구하는 범위로 변환할 때 사용할 수 있습니다. 예를 들어:

• 4–20 mA 입력 신호를 PID 공정 변수로 변환하거나

• 아날로그 입력 값을 스케일링하여 아날로그 출력 제어에 사용할 수 있습니다.

11.7 File Arithmetic Operations

파일 산술 기능(file arithmetic function)에는 파일 더하기(file add), 파일 빼기(file subtract), 파일 곱하기(file multiply), 파일 나누기(file divide), 파일 제곱근(file square root), 파일 BCD 변환(file convert from BCD), 파일 BCD 변환(file convert to BCD)이 포함됩니다. FAL(file arithmetic and logic) 명령어를 사용하면 산술 연산과 파일 전송 기능을 결합할 수 있습니다. FAL 명령어로 구현 가능한 산술 연산으로는 ADD, SUB, MULT, DIV, SQR이 있습니다.

그림 11-20의 프로그램은 FAL 명령어의 파일 더하기(file add) 기능 예입니다. 로직 런(rung)의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 되며, 표현식(expression)은 프로세서에게 파일 주소 N7:25의 데이터를 파일 주소 N7:50의 데이터에 더한 뒤 그 결과를 파일 주소 N7:100에 저장하도록 지시합니다.

• rate per scan 값이 All로 설정되어 있으므로, 명령어는 한 번의 스캔에서 완료됩니다.

그림 11-21의 프로그램은 FAL 명령어의 파일 빼기(file subtract) 기능 예입니다. 로직 런의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 되고, 프로세서는 프로그램 상수 255를 파일 주소 N10:0의 각 워드에서 빼고, 그 결과를 목적지 파일 주소 N7:255에 저장합니다.

• rate per scan 값이 2로 설정되어 있으므로, 명령어가 true가 된 순간부터 두 번의 스캔이 지나야 작업이 완료됩니다.

그림 11-22의 프로그램은 FAL 명령어의 파일 곱하기(file multiply) 기능 예입니다. 로직 런의 동작은 다음과 같습니다.

• 입력 스위치 SW가 닫히면 런이 true가 되고, 파일 주소 N7:330의 데이터는 요소(element) 주소 N7:23의 데이터와 곱해지며, 결과는 목적지 파일 주소 N7:500에 저장됩니다.

• rate per scan 값이 All이므로 명령어는 한 번의 스캔에서 완료됩니다.

그림 11-23의 프로그램은 FAL 명령어의 파일 나누기(file divide) 기능 예입니다. 로직 런의 동작은 다음과 같이 요약됩니다.

• 입력 스위치 SW가 닫히면 런이 true가 되고, 파일 주소 F8:20의 데이터는 파일 주소 F8:100의 데이터로 나누어지며, 결과는 요소 주소 F8:200에 저장됩니다.

• Mode는 Incremental로 설정되어 있으므로 명령어는 false‑to‑true 전이가 발생할 때마다 한 쌍의 요소에 대해 작업을 수행합니다.