이전 버전(1.33.4)의 문서를 보고 있습니다. 이 버전은 계속 지원됩니다.
최신 버전 정보는 1.33.5에서 확인하세요.
최신 버전 정보는 1.33.5에서 확인하세요.
add_modbus_signal (수동 모드)
이 절에서는 수동(교시) 작업 중에 add_modbus_signal로 외부 PLC/인버터의 Modbus 포인트를 심볼 태그로 등록해 3.2.3 통신에서 빠르게 읽기/쓰기를 테스트하는 방법을 설명합니다.
일반적인 사용법
PLC/인버터 레지스터(Coil / Discrete Input / Holding / Input Register)를 심볼 이름에 매핑합니다.
교시 중 작은 테스트 앱으로 READY/FAULT 비트를 확인하거나 START/SPEED 명령을 씁니다.
깔끔한 심볼 세트를 준비한 다음, get_modbus_input, set_modbus_output을 사용하고, 마지막으로 del_modbus_signal로 정리합니다.
참고
데이터 폭/부호/엔디언은 장치 매뉴얼을 따릅니다. 여러 워드로 된 값은 장치에 맞는 처리가 필요할 수 있습니다.
디버깅할 때는 query_modbus_data_list로 등록된 태그를 확인하세요.
예제: READY(DI) + START(Coil) + SPEED(Holding Reg.) 등록 및 테스트
// 사전 조건:
// - 연결 완료(open_connection)
// - 수동(교시) 모드, 서보/안전 상태 정상
// - 네트워크로 외부 PLC/인버터에 접근 가능
// 1) 심볼 등록(IP, 포트, 유형, 주소, 기본값, 슬레이브 ID)
bool ok = true;
ok &= drfl.add_modbus_signal("PLC_READY", "192.168.0.10", 502,
MODBUS_REGISTER_TYPE_DISCRETE_INPUTS, 0, 0);
ok &= drfl.add_modbus_signal("PLC_START", "192.168.0.10", 502,
MODBUS_REGISTER_TYPE_COILS, 1, 0);
ok &= drfl.add_modbus_signal("INV_SPEED_CMD", "192.168.0.10", 502,
MODBUS_REGISTER_TYPE_HOLDING_REGISTER, 100, 0, 1);
if (!ok) {
printf("[Modbus] Failed to register one or more symbols\n");
return -1;
}
// 2) 외부 장치가 READY 상태가 될 때까지 대기(최대 약 3초)
bool ready = false;
for (int i = 0; i < 30; ++i) {
// DISCRETE_INPUT/INPUT_REGISTER 유형은 get_modbus_input()으로 읽으세요
if (drfl.get_modbus_input("PLC_READY")) {
ready = true;
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
printf("READY = %s\n", ready ? "ON" : "OFF");
if (!ready) goto CLEANUP;
// 3) 속도 명령 쓰기(예: 장치가 0.01 배율을 쓰면 1500은 15.00 Hz)
drfl.set_modbus_output("INV_SPEED_CMD", 1500);
// 4) START 코일 펄스 출력
drfl.set_modbus_output("PLC_START", 1);
std::this_thread::sleep_for(std::chrono::milliseconds(50));
drfl.set_modbus_output("PLC_START", 0);
// 선택 사항: 여기에서 get_modbus_input("...")으로 추가 상태 읽기
CLEANUP:
// 5) 테스트 심볼은 항상 정리
drfl.del_modbus_signal("PLC_READY");
drfl.del_modbus_signal("PLC_START");
drfl.del_modbus_signal("INV_SPEED_CMD");
팁
장치 매뉴얼에서 주소 지정(0 기반/1 기반), 바이트/워드 순서, 스케일링을 다시 확인하세요.
테스트 태그에는 네임스페이스를 붙이고(예:
"TEST/PLC_READY") 테스트 후에는 항상 삭제하세요.제한 시간 초과가 간헐적으로 발생하면 간단한 재시도/제한 시간 로직을 추가하고 query_modbus_data_list로 점검하세요.