EP.2-2 비교 연산과 조건문
Phase 2: Operations & Control Logic
EP.2-2 비교 연산과 조건문 — 프로그램의 인터록
판단하고, 거르고, 분기하는 지능형 로직의 핵심
비교 연산자
PLC의 CMP 명령어처럼, 두 값을 비교하여 참(1) 또는 거짓(0)의 전기 신호를 만듭니다. 이 신호는 명령어 포인터(IP)가 다음에 실행할 메모리 주소를 갈아타게 만드는 물리적 스위치가 됩니다.
- == (같다):
if (a == 10)(※ 주의:=는 대입,==는 비교!) - != (다르다): 비상 정지 신호가 OFF가 아닐 때 주로 사용
- && (AND / 직렬): 모든 접점이 닫혀야 가동 승인
- || (OR / 병렬): 어느 하나라도 눌리면 즉시 차단
현장 제어에서 가장 위험한 것은 '정의되지 않은 신호'입니다. 명확한 정상(0)과 위험(1, 2) 외의 모든 수치를 예외로 처리하여 시스템을 보호해야 합니다.
#include <stdio.h>
int main() {
int status, signal;
printf("[시스템 체크] 상태를 입력하세요 (0:정상, 1:비상, 2:과부하): ");
scanf_s("%d", &status);
if (status == 1 || status == 2) {
// 1단계 차단: 확실한 에러 상황
printf("!!! [EMERGENCY] 시스템 강제 중단 (비상/과부하) !!!\n");
} else if (status == 0) {
// 2단계 진입: 명확한 정상 상황
printf("정상 가동 중입니다. 제어 신호를 입력하세요: ");
scanf_s("%d", &signal);
// 세부 판단 로직 (중첩 인터록)
if (signal % 2 == 0) {
printf(">>> [STATUS: RUN] 릴레이 ON\n");
} else {
printf(">>> [STATUS: WAIT] 홀수 신호 대기 중\n");
}
} else {
// 예외 처리: 정의되지 않은 제3의 신호 차단
printf("??? [UNKNOWN] 알 수 없는 신호입니다. 시스템 대기 유지.\n");
}
return 0;
}
int main() {
int status, signal;
printf("[시스템 체크] 상태를 입력하세요 (0:정상, 1:비상, 2:과부하): ");
scanf_s("%d", &status);
if (status == 1 || status == 2) {
// 1단계 차단: 확실한 에러 상황
printf("!!! [EMERGENCY] 시스템 강제 중단 (비상/과부하) !!!\n");
} else if (status == 0) {
// 2단계 진입: 명확한 정상 상황
printf("정상 가동 중입니다. 제어 신호를 입력하세요: ");
scanf_s("%d", &signal);
// 세부 판단 로직 (중첩 인터록)
if (signal % 2 == 0) {
printf(">>> [STATUS: RUN] 릴레이 ON\n");
} else {
printf(">>> [STATUS: WAIT] 홀수 신호 대기 중\n");
}
} else {
// 예외 처리: 정의되지 않은 제3의 신호 차단
printf("??? [UNKNOWN] 알 수 없는 신호입니다. 시스템 대기 유지.\n");
}
return 0;
}
switch문: 다중 채널 셀렉터 스위치
입력값이 정수 형태로 딱딱 끊어질 때(운전 모드, 에러 번호 등)는 if문보다 switch문이 훨씬 직관적입니다. 이는 하드웨어의 로터리 셀렉터 스위치를 소프트웨어로 구현한 것과 같습니다.
switch (mode) {
case 1:
printf("[MANUAL] 수동 운전 모드입니다. 조이스틱을 사용하세요.\n");
break; // 채널 탈출
case 2:
printf("[AUTO] 자동 운전 모드입니다. 센서 감지를 시작합니다.\n");
break;
case 3:
printf("[SEMI] 반자동 모드입니다. 단계별 승인이 필요합니다.\n");
break;
default: // 명확하지 않은 명령 차단기
printf("[ERROR] 정의되지 않은 모드 번호(%d)입니다. 안전을 위해 대기합니다.\n", mode);
break;
}
case 1:
printf("[MANUAL] 수동 운전 모드입니다. 조이스틱을 사용하세요.\n");
break; // 채널 탈출
case 2:
printf("[AUTO] 자동 운전 모드입니다. 센서 감지를 시작합니다.\n");
break;
case 3:
printf("[SEMI] 반자동 모드입니다. 단계별 승인이 필요합니다.\n");
break;
default: // 명확하지 않은 명령 차단기
printf("[ERROR] 정의되지 않은 모드 번호(%d)입니다. 안전을 위해 대기합니다.\n", mode);
break;
}
3. 실습 검증: 나머지(%) 연산을 활용한 인터록
전달받은 신호가 짝수인지 홀수인지 판단하여 릴레이를 제어합니다. ALU가 낚아챈 나머지 값을 조건문의 스위치로 활용하는 실전 기법입니다.
// 2로 나눈 나머지가 0이면 '짝수'라는 논리
if (number % 2 == 0) {
printf("입력하신 %d는(은) [짝수]입니다. 릴레이 ON!\n", number);
}
else {
printf("입력하신 %d는(은) [홀수]입니다. 경보 발생!\n", number);
}
if (number % 2 == 0) {
printf("입력하신 %d는(은) [짝수]입니다. 릴레이 ON!\n", number);
}
else {
printf("입력하신 %d는(은) [홀수]입니다. 경보 발생!\n", number);
}



댓글
댓글 쓰기