상품
기계 설비 등에서, 주유나 정기 점검 시기를 알리기 위한 회로를 알려주세요.
- 등록일
- 2025. 12. 17.
기계 설비 등에서
사출 성형기 라인 등에서 수십 대, 수백 대가 줄줄이 늘어선 기계 설비의 주유나 정기 점검을 적절한 타이밍에 실시하는 것은 설비 보존상 매우 중요한 일입니다.
이를 위해서는 장시간 누적 타이머를 사용하여 개별 기계의 가동 시간을 누적해야 하지만, 이를 래더 회로로 처리하려고 하면 수십, 수백 개의 동일한 회로가 줄지어 배치되어 메모리 효율이나 디버깅 측면에서 문제가 발생하게 됩니다.
이에 메모리 효율과 디버깅 용이성을 고려한 프로그램을 아래에 소개합니다.
윤활유 공급 알림 시스템의 타임 차트
<동작 설명>
시스템 기동 신호가 ON이면, 각 설비의 가동 신호가 ON인 동안 1분 클록을 세어 해당 누적 타이머를 가산합니다.
각 누적 타이머가 해당 경보 설정 시간 이상이 되면 경보 출력 신호를 ON합니다.
윤활·점검 작업이 종료되어 리셋 신호를 ON하면, 누적 타이머를 0으로 초기화하고 경보 출력 신호도 OFF합니다.
<프로그램 구성 방법>
기존에는 이와 같은 동일한 회로를 여러 개 작성할 경우 인덱스 레지스터로 반복 처리를 수행했습니다.
그러나 인덱스 레지스터 방식에서는 포인터 역할을 하는 인덱스 레지스터의 내용을 확인하기 어려워, 잘못된 반복 처리가 이루어지면 I/O 메모리의 지정 범위를 벗어나 예상치 못한 영역까지 덮어쓰게 되어도 알 수 없는 등의 문제가 있었습니다.
여기서는 이러한 문제를 해결하는 방법으로 ① 주소 오프셋 방식과 ② 기능 블록 방식을 소개합니다.
또한, 말미에 기존의 ③ 인덱스 레지스터 방식에 대해서도 첨부하고 있습니다.
각 방식의 특징과 아래 표의 대응 기종을 확인하시고, 목적에 맞는 적절한 프로그램 작성을 부탁드립니다.
방식 | 대응 기종 |
주소 오프셋 방식 | CJ2M, CJ2H, NJ ※1, NX ※1 |
기능 블록 방식 | CP1L, CP1H, CJ1M, CS1, CJ2M, CJ2H, NJ ※1, NX ※1 |
| 인덱스 레지스터 방식 | CP1L, CP1H, CJ1M, CS1, CJ2M, CJ2H |
※1 ・・・ 개발 도구는 Sysmac Studio입니다. (기재 없는 기종은 CX-Programmer로 개발)
① 주소 오프셋 방식
인덱스 레지스터 방식과 마찬가지로 메모리 효율이 좋은 프로그램을 작성할 수 있습니다.
I/O 메모리를 배열 변수로 정의하고, 포인터도 변수 정의함으로써 배열 내 몇 번째 데이터인지 [ ] 안에 포인터의 첨자로 지정합니다.
설비 가동 신호: Run은 50개가 있으므로 BOOL형(비트 단위)으로 50개의 배열이 됩니다.
예를 들어 3번째 장비 가동 신호를 참조할 경우 Run[3]으로 표현하며, 포인터 ptr번째 장비 가동 신호는 Run[ptr]으로 표현합니다.
포인터 ptr을 가감산함으로써 참조하고자 하는 번째 데이터를 지정할 수 있습니다.
SV, PV, AlarmOut, Reset도 마찬가지로 포인터 ptr로 참조하고자 하는 순서의 데이터를 지정합니다.
포인터 ptr은 UINT형(부호 없는 정수)이므로 내용을 모니터링할 수 있으며, 배열 범위를 벗어났는지 여부도 쉽게 확인할 수 있습니다.
또한 1분 클럭의 상승 에지(rise edge)에 동기화하여 모든 장비의 누적 타이머를 한 바퀴 돌며 업데이트하고 싶기 때문에, 1분 클럭의 상승 에지에서 한 바퀴 돌기 위한 스트로브 신호(Strobe)를 만들어 처리하고 있습니다.
변수 ・・・ 메모리의 서랍과 같은 것으로, 서랍과 마찬가지로 이름의 레이블, 크기나 형태: 형, 칸막이 등이 있습니다.
배열 ・・・ 메모리의 하나의 서랍 안에 칸막이를 넣어 여러 등분으로 나눈 데이터의 집합입니다.
변수 테이블① 래더 프로그램①
② 함수 블록 방식
메모리 효율 측면에서의 효과는 크게 기대하기 어렵지만, 디버깅 효율에서는 큰 효과를 기대할 수 있습니다.
①에서는 I/O 메모리의 50개 접점을 전체 주소 분량으로 묶어 하나의 배열 변수로 만들고 주소 분량만큼 처리를 반복하여 구현했지만, ②에서는 I/O 메모리의 1개 주유 알림기 분량을 하나의 덩어리(객체)로 만들어 주소 정보를 가지지 않는 기능 블록 정의(설계도)로 묶어 처리합니다.
변수를 사용하는 것은 ①과 같지만, 여기서는 기능 블록 정의로 설계된 주유 알림기의 처리를 50개 주소 분 인스턴스(제품에 해당)를 나열하여 프로그래밍합니다.
그리고 펑션 블록 외부에서는 50개 분량의 배열 변수를 정의하여 각 인스턴스의 입력/출력 파라미터와 주고받습니다.
물체(객체)에 주목하여 프로그래밍하므로, 이러한 방식을 객체 지향 프로그래밍이라고 부릅니다.
함수 블록 정의의 설계 방법은 단순히 하나의 주유 알림 회로를 설계하는 것과 동일한 방법으로 설계할 수 있습니다.
한 번 함수 블록 정의를 설계하면, 주유 알림기의 수가 늘어나거나 줄어들어도 인스턴스를 추가하거나 삭제하기만 하면 대응할 수 있으며, 주유 알림기의 처리가 변경되어도 정의를 다시 작성하기만 하면 모든 인스턴스에 반영됩니다.
또한 반복 처리가 없으므로 잘못된 I/O 메모리 영역을 재작성할 염려도 없으며, 하나의 윤활유 공급 알림 장치마다 입출력을 도표로 확인하면서 디버깅할 수 있습니다.
변수 테이블②
래더 프로그램②(기능 블록 외부 프로그램) 설명
래더 모니터 화면 (기능 블록 인스턴스의 입력/출력을 한눈에 파악할 수 있습니다.) 기능 블록 정의: 내부 변수와 입력/출력 파라미터 (일반적으로 주소 정보를 가지지 않음)
기능 블록 정의: 래더 프로그램 (1개의 윤활유 공급 알림 회로와 동일)
③ 인덱스 레지스터 방식
기존 방식의 인덱스 레지스터 방식 프로그램은 아래 첨부 자료를 참조하십시오.
~「인덱스 레지스터를 활용하자」 시리즈에서~
indexreg7.pdf