문서의 이전 판입니다!
목차
ILOGICS 내장 명령어 설명서
ILOGICS 내장 명령어는 산업용 아두이노를 쉽게 제어할 수 있도록 보드 코어에 포함된 명령어입니다. 별도 라이브러리를 설치하거나 #include <ILIB.h>를 추가하지 않고 Arduino 스케치에서 바로 사용할 수 있습니다.
이 설명서는 디지털 입출력, 입력 필터, 타이머, 카운터, 아날로그·온도 처리, PWM, PID, 표시 장치와 산업용 통신 명령어를 기능별로 안내합니다.
내장 명령어를 사용하는 순서
- Arduino IDE에 ILOGICS 보드 패키지를 설치합니다.
- 도구 → 보드에서 실제 사용하는 제품 모델을 정확히 선택합니다.
- 제품 설명서에서 전원, 단자, 핀 번호 또는 논리 채널을 확인합니다.
- 아래 기능별 명령어 형식과 주의사항을 확인한 뒤 작은 예제로 한 채널씩 시험합니다.
- 입출력 확인 후 타이머, 카운터, PID와 통신 기능을 단계적으로 추가합니다.
보드별 번호 사용 기준
| 제품군 | 프로그램에서 사용하는 번호 | 확인할 내용 |
|---|---|---|
| MPINO | 선택한 제품의 Arduino 핀 번호 | 해당 제품의 핀맵 확인 |
| MPAINO | 디지털 입력은 0부터, 디지털 출력은 64부터 시작하는 논리 채널 | 아날로그 입력 0~19, 아날로그 출력 0~11 등 장착 구성에 맞는 채널 확인 |
| MPS·MPA | MP STUDIO의 래더 접점과 메모리 사용 | Arduino 스케치용 내장 명령어를 사용하지 않음 |
| MNET | Modbus RTU 또는 LS산전 Cnet 통신으로 I/O 제어 | Arduino 스케치를 다운로드하지 않음 |
같은 숫자라도 MPINO에서는 Arduino 핀 번호, MPAINO에서는 모듈의 논리 채널일 수 있습니다. 다른 제품의 예제에서 숫자만 복사하지 마십시오.
기능별 빠른 선택
| 하고 싶은 작업 | 사용할 명령어 |
|---|---|
| 입력 노이즈와 스위치 채터링 제거 | IdigitalRead(), Ibounce(), IbounceOn(), IbounceOff() |
| 입력이 변하는 순간 한 번만 실행 | Iup(), Idown() |
| 버튼을 누를 때마다 출력 ON/OFF 전환 | Ialt() |
| 일정 시간 뒤 출력 ON/OFF | Iton(), Itof() |
| 일정 시간만 펄스 출력 | Itpl(), Itmon() |
| 동작 횟수 계산 | Ictu(), Ictd(), Ictud() |
| 센서값 범위 변환 | Iscale(), Iscalef(), IanalogRead(), IanalogReadf() |
| NTC·PT100 온도 측정 | ntcRead(), ntcReadf(), pt100Read() |
| 아날로그·PWM 출력 | IanalogWrite(), IanalogWritef(), PWM(), FDPWM() |
| 목표값 자동 제어 | IpidSet(), IpidRun() |
| 주기적인 작업 실행 | ItimerSet(), ItimerStart() |
| 통신으로 HMI·PLC 연결 | ImodbusRTU*(), ICnet*(), IMc*() |
기본 제어 명령어
| 명령어 형식 | 반환값 | 설명 |
|---|---|---|
Iup(id, input) | 상승 순간에만 true | OFF에서 ON으로 바뀌는 순간을 한 번 검출 |
Idown(id, input) | 하강 순간에만 true | ON에서 OFF로 바뀌는 순간을 한 번 검출 |
Ialt(input, state) | 없음 | 입력 상승 순간마다 state 값을 ON/OFF 반전 |
Iscale(x, inMin, inMax, outMin, outMax) | int32_t | 정수 입력 범위를 원하는 정수 범위로 변환 |
Iscalef(x, inMin, inMax, outMin, outMax) | float | 소수점을 유지하여 실수 범위 변환 |
Iup()과 Idown()의 id는 각 에지 검출 상태를 구분합니다. 서로 다른 입력에 같은 id를 사용하면 상태가 섞일 수 있습니다.
bool lampState = false; void loop() { bool button = Ibounce(0, 30); Ialt(button, lampState); digitalWrite(64, lampState); // MPAINO 첫 번째 디지털 출력 예시 }
디지털 입력과 노이즈 필터
| 명령어 형식 | 반환값 | 사용 기준 |
|---|---|---|
IdigitalRead(pin, samples) | 필터링된 HIGH 또는 LOW | 입력을 여러 번 즉시 읽어 짧은 노이즈를 줄임 |
Ibounce(pin, ms) | 안정화된 입력 상태 | ON과 OFF가 설정 시간 동안 유지될 때 상태 변경 |
IbounceOn(pin, ms) | ON 방향이 지연된 입력 상태 | OFF→ON 방향만 시간 필터 적용 |
IbounceOff(pin, ms) | OFF 방향이 지연된 입력 상태 | ON→OFF 방향만 시간 필터 적용 |
digitalReset() | 없음 | 코어가 관리하는 디지털 출력 상태 초기화 |
IdigitalRead()는 짧은 시간 동안 반복 샘플링하는 방식이고, Ibounce()는 millis() 기준으로 입력이 안정된 시간을 확인하는 방식입니다. 기계식 스위치에는 보통 Ibounce()가 알맞습니다.
PLC 스타일 타이머
| 명령어 형식 | 동작 |
|---|---|
Iton(id, state, ms) | 입력이 설정 시간 동안 ON이면 출력 ON |
Itof(id, state, ms) | 입력이 OFF된 뒤 설정 시간이 지나면 출력 OFF |
Itpl(id, state, ms) | 입력 상승 순간부터 설정 시간 동안 펄스 출력 |
Itmon(id, state, ms) | 실행 중 다시 입력되어도 연장되지 않는 단안정 펄스 |
Itmr(id, state, ms, reset) | 입력 ON 시간을 누적하며 reset으로 초기화 |
IgetTime(id), IgetState(id) | 경과시간과 출력 상태 확인 |
PLC 스타일 타이머는 delay()처럼 프로그램을 멈추지 않습니다. 대신 loop()가 반복될 때마다 계속 호출해야 합니다. 같은 id를 서로 다른 타이머에 중복 사용하지 마십시오.
void loop() { bool run = Ibounce(0, 30); bool delayedOutput = Iton(0, run, 1000); digitalWrite(64, delayedOutput); }
주기 콜백 타이머
| 명령어 형식 | 설명 |
|---|---|
ItimerSet(intervalMs, callback) | 기본 타이머의 실행 주기와 콜백 함수 설정 |
ItimerSet(timerNo, intervalMs, callback) | 하드웨어 타이머 번호를 지정하여 설정 |
ItimerStart(), ItimerStart(timerNo) | 콜백 타이머 시작 |
ItimerStop(), ItimerStop(timerNo) | 콜백 타이머 정지 |
ItimerStopAll() | 콜백 타이머 전체 정지 |
ItimerState(), ItimerState(timerNo) | 실행 상태 확인 |
콜백 함수는 인터럽트 안에서 실행됩니다. 콜백에서는 플래그나 짧은 카운트만 변경하고 delay(), Serial 출력, I²C, SPI와 긴 계산을 사용하지 마십시오.
volatile bool taskFlag = false; void onTimer() { taskFlag = true; } void setup() { ItimerSet(100, onTimer); ItimerStart(); } void loop() { if (taskFlag) { taskFlag = false; // 시간이 걸리는 실제 작업은 loop()에서 실행합니다. } }
카운터와 데이터 버퍼
| 명령어 형식 | 설명 |
|---|---|
Ictu(id, CU, RESET, PV) | CU 상승 에지를 세어 PV에 도달하면 ON |
Ictd(id, CD, LOAD, PV) | LOAD로 값을 불러온 뒤 CD 상승 에지마다 감소 |
Ictud(id, CU, CD, RESET, LOAD, PV) | 증가와 감소를 함께 처리 |
IgetCount(id), IsetCount(id, value) | 현재 카운트값 조회와 변경 |
IctudDownState(id) | Up/Down 카운터의 하한 완료 상태 확인 |
FIFO(…) | 먼저 저장한 16비트 데이터를 먼저 꺼내는 버퍼 |
FILO(…) | 나중에 저장한 16비트 데이터를 먼저 꺼내는 버퍼 |
카운터 명령어는 loop()에서 계속 호출합니다. id는 다른 카운터와 중복하지 않게 배정합니다.
아날로그 입력과 범위 변환
| 명령어 형식 | 반환값·용도 |
|---|---|
analogReadInit(sps) | MPAINO ADS1118 아날로그 모듈의 샘플링 속도 설정 |
analogRead(ch) | 선택 채널의 원시 아날로그 값 읽기 |
analogReadAvg(ch, samples), analogReadAvgf(ch, samples) | 정수 또는 실수 이동평균 입력 |
IanalogFilter(id, raw, samples) | 사용자가 전달한 임의 값을 이동평균 처리 |
IanalogRead(ch, min, max), IanalogReadf(ch, min, max) | 입력을 사용자 정수·실수 범위로 변환 |
analogRead2(ch), analogRead2Avg(ch, samples) | 4~20mA 보정 입력과 이동평균 |
IanalogRead2(ch, min, max), IanalogRead2f(ch, min, max) | 4~20mA 입력을 사용자 범위로 변환 |
MPAINO에서는 장착된 아날로그 입력 모듈과 딥스위치의 전압·전류 범위를 먼저 확인합니다. 샘플링 속도를 높이면 응답은 빨라지지만 노이즈와 측정 특성이 달라질 수 있습니다.
void setup() { Serial.begin(115200); analogReadInit(IANALOG_SPS_64); } void loop() { int32_t raw = analogReadAvg(0, 8); float value = Iscalef(raw, 0.0, 32767.0, 0.0, 100.0); Serial.println(value); }
온도 입력
| 명령어 형식 | 반환값 | 대상 |
|---|---|---|
ntcRead(ch) | 0.1℃ 단위 정수 | NTC 3950 10kΩ 온도센서 입력 |
ntcReadf(ch) | ℃ 단위 float | NTC 3950 10kΩ 온도센서 입력 |
pt100Read(ch) | 0.1℃ 단위 정수 | MPAINO PT100 입력 모듈 |
NTC와 PT100은 센서 종류와 입력 회로가 다릅니다. 서로 바꾸어 사용하지 말고 선택 제품에 해당 입력 기능이 있는지 확인하십시오.
아날로그 출력과 PWM
| 명령어 형식 | 설명 |
|---|---|
analogWriteInit(ch, top, prescaler) | PWM 타이머의 분해능과 분주비 설정 |
analogWriteFreq(ch, hz), analogWriteMax(ch) | PWM 주파수 설정과 현재 최댓값 확인 |
IanalogWriteInit(ch, max, min, mode) | MPAINO 아날로그 출력 범위 초기화 |
IanalogWrite(ch, min, max, value), IanalogWritef(…) | 정수·실수 사용자값을 아날로그 출력 범위로 변환 |
analogWrite2(ch, value), IanalogWrite2(…) | MPAINO 4~20mA 출력 변환 |
PWM(pin, value, bit16) | 8비트 또는 16비트 PWM 출력 |
FDPWM(pin, hz, duty) | 주파수와 Duty 비율을 지정한 PWM 출력 |
NPWM_BEGIN(pin, hz, duty, count), NPWM(pin) | 지정한 개수만큼 펄스 출력 |
PWMOFF(pin, off), PWM_RESET() | 개별 PWM 정지 또는 전체 초기화 |
PWM, 고속펄스, analogWrite()와 콜백 타이머는 같은 하드웨어 타이머를 공유할 수 있습니다. 여러 기능을 함께 사용할 때는 해당 제품의 타이머 지원표를 확인하십시오.
PID 제어
| 명령어 형식 | 설명 |
|---|---|
IpidSet(id, kp, ki, kd, sampleMs, outMin, outMax) | PID 계수, 계산 주기와 출력 범위 설정 |
IpidRun(id, pv, sv) | 현재값 PV와 설정값 SV로 출력 계산 |
IpidReset(id) | 내부 상태 초기화 |
IpidReverse(id, reverse) | 정동작 또는 역동작 선택 |
IpidItermLimit(id, min, max) | 적분항 범위 제한 |
IpidOutput(id) | 마지막 출력값 확인 |
void setup() { IpidSet(0, 2.0, 0.5, 0.1, 100, 0, 100); } void loop() { float pv = ntcReadf(0); float output = IpidRun(0, pv, 50.0); IanalogWritef(0, 0.0, 100.0, output); }
PID 출력은 계산값일 뿐 안전장치가 아닙니다. 센서 단선, 과온, 출력 고착과 비상정지는 별도의 안전회로로 처리하십시오.
표시 장치와 RTC
| 기능 | 주요 명령어 | 설명 |
|---|---|---|
| TM1637 4자리 FND | IsegBegin(), IsegBrightness(), IsegDecimal(), IsegHex(), IsegClear() | 최대 7개 장치를 device 번호로 구분 |
| PCF8574 문자 LCD | IclcdBegin(), IclcdSetCursor(), IclcdPrint(), IclcdClear() | 최대 4개 LCD를 device 번호로 구분 |
| DS3231 RTC | IrtcBegin(), IrtcRead(), IrtcSet(), IrtcGetTemperature(), IrtcSetAlarm1() | 날짜·시간, 온도, 알람과 주파수 출력 사용 |
표시 장치와 RTC는 각각의 Begin 명령어를 먼저 호출합니다. I²C 주소, 연결 핀과 다른 기능의 공유 여부를 확인하십시오.
Debug와 Watchdog
| 명령어 형식 | 설명 |
|---|---|
debugStart(), debugStart(baud), debugStart(serial, baud) | Debug 출력 시작과 포트 선택 |
debug(), debugln() | Debug가 활성화된 경우에만 값 출력 |
debugStop(), debugState() | Debug 중지와 상태 확인 |
WDT_ENABLE(time) | Watchdog 제한시간 설정 및 활성화 |
WDT(), WDT_DISABLE() | Watchdog 리셋과 비활성화 |
Watchdog를 활성화한 뒤 WDT() 호출이 늦어지면 보드가 재시작됩니다. 통신 대기와 긴 반복문의 최악 실행시간을 먼저 확인하십시오.
고속카운터
| 명령어 형식 | 설명 |
|---|---|
TCNTSETUP(timerNo, bit32) | 타이머 외부 클럭 입력과 32비트 확장 모드 설정 |
TCNTOUT(timerNo) | 32비트 확장 모드에서 누적된 상위 오버플로 횟수 확인 |
현재 타이머 외부 클럭 방식의 전용 고속카운터 지원 제품은 MPINO-8A8R과 MPINO-16A8R8T입니다. 다른 제품은 제품별 인터럽트 입력을 확인해 attachInterrupt() 방식을 사용합니다.
산업용 통신
| 프로토콜 | 초기 설정 | loop() 실행 명령어 |
|---|---|---|
| Modbus RTU Slave | ImodbusRTUMem(), ImodbusRTUAdr(), ImodbusRTUInit() | ImodbusRTU() |
| Modbus RTU Master | ImodbusRTUmasterInit(), ImodbusRTUmasterAdd() | ImodbusRTUmaster() 또는 ImodbusRTUmasterRun() |
| LS산전 Cnet Slave | ICnetMem(), ICnetAdr(), ICnetInit() | ICnet() |
| Mitsubishi MC Protocol Slave | IMcMem(), IMcAdr(), IMcInit() | IMcProtocol() |
void setup() { ImodbusRTUMem(128, 64); ImodbusRTUAdr(0, 0); ImodbusRTUInit(Serial2, 1, 9600); } void loop() { ImodbusRTU(); }
제품별 RS-232, RS-485와 UART의 Serial 번호가 다를 수 있습니다. 통신 전에 포트 역할, 전기 규격, 보레이트, 국번, 종단저항과 딥스위치 설정을 확인하십시오.
통합 입출력 예제
아래 예제는 MPAINO의 첫 번째 디지털 입력 0과 첫 번째 디지털 출력 64를 사용합니다. MPINO에서는 선택 모델의 실제 Arduino 핀 번호로 바꾸어야 합니다.
const uint8_t inputChannel = 0; const uint8_t outputChannel = 64; void setup() { pinMode(inputChannel, INPUT); pinMode(outputChannel, OUTPUT); } void loop() { bool stableInput = Ibounce(inputChannel, 30); bool delayedOutput = Iton(0, stableInput, 1000); digitalWrite(outputChannel, delayedOutput); }
문제가 생겼을 때
- 명령어를 찾을 수 없음: ILOGICS 보드 패키지 설치와 제품 보드 선택을 확인합니다.
- 입출력이 반응하지 않음: MPINO 핀 번호와 MPAINO 논리 채널을 혼동하지 않았는지 확인합니다.
- 타이머·카운터가 멈춤: 명령어를
loop()에서 계속 호출하는지, 같은id를 중복 사용하지 않았는지 확인합니다. - PWM 주파수가 이상함: 같은 하드웨어 타이머를 다른 PWM·펄스·콜백 기능이 사용 중인지 확인합니다.
- 아날로그값이 다름: 전압·전류·NTC·PT100 딥스위치와 채널, 샘플링 속도를 확인합니다.
- 통신이 되지 않음: Serial 포트, RS-232/RS-485 방식, 보레이트, 국번, 패리티와 배선을 확인합니다.
- 보드가 반복 재시작됨: Watchdog 제한시간보다 오래 걸리는 코드가 있는지 확인합니다.
필수 주의사항
- 과거
#include <ILIB.h>,tempRead(),Ipt100Read()예제를 현재 내장 명령어와 혼용하지 않습니다. - 전원과 배선을 변경할 때는 장비 전원을 끄고 극성, COM, 입력전압과 부하전원을 확인합니다.
- 릴레이와 트랜지스터 출력의 전기적 특성 및 허용전류를 구분합니다.
- 프로그램 출력만 비상정지나 과전류 보호수단으로 사용하지 않습니다.
- 제품별 핀맵, 전기 사양과 지원 타이머는 해당 제품 설명서를 최종 기준으로 확인합니다.
