예전 작업을 다시 찾아보는데
워낙 자동화가 잘된녀석이라 slave 모드에서 외부에 read / write 명령을 추가로 처리할 방법을 찾고 있는데 영 안보여서 고민하다
소스뜯어보기로 결정!
rtu나 tcp에서 아래와 같이 modbus_new 명령을 통해 수행중에
backend에 기본적인 녀석들을 추가해주는데
modbus_t* modbus_new_rtu(const char *device,
int baud, char parity, int data_bit,
int stop_bit)
{
_modbus_init_common(ctx);
ctx->backend = &_modbus_rtu_backend;
ctx->backend_data = (modbus_rtu_t *)malloc(sizeof(modbus_rtu_t));
if (ctx->backend_data == NULL) {
modbus_free(ctx);
errno = ENOMEM;
return NULL;
}
ctx_rtu = (modbus_rtu_t *)ctx->backend_data;
|
해당 backend 구조체는 아래와 같이 여러개의 함수 포인터 들을 포함하고 있고
const modbus_backend_t _modbus_rtu_backend = {
_MODBUS_BACKEND_TYPE_RTU,
_MODBUS_RTU_HEADER_LENGTH,
_MODBUS_RTU_CHECKSUM_LENGTH,
MODBUS_RTU_MAX_ADU_LENGTH,
_modbus_set_slave,
_modbus_rtu_build_request_basis,
_modbus_rtu_build_response_basis,
_modbus_rtu_prepare_response_tid,
_modbus_rtu_send_msg_pre,
_modbus_rtu_send,
_modbus_rtu_receive,
_modbus_rtu_recv,
_modbus_rtu_check_integrity,
_modbus_rtu_pre_check_confirmation,
_modbus_rtu_connect,
_modbus_rtu_close,
_modbus_rtu_flush,
_modbus_rtu_select,
_modbus_rtu_free
};
|
const modbus_backend_t _modbus_tcp_backend = {
_MODBUS_BACKEND_TYPE_TCP,
_MODBUS_TCP_HEADER_LENGTH,
_MODBUS_TCP_CHECKSUM_LENGTH,
MODBUS_TCP_MAX_ADU_LENGTH,
_modbus_set_slave,
_modbus_tcp_build_request_basis,
_modbus_tcp_build_response_basis,
_modbus_tcp_prepare_response_tid,
_modbus_tcp_send_msg_pre,
_modbus_tcp_send,
_modbus_tcp_receive,
_modbus_tcp_recv,
_modbus_tcp_check_integrity,
_modbus_tcp_pre_check_confirmation,
_modbus_tcp_connect,
_modbus_tcp_close,
_modbus_tcp_flush,
_modbus_tcp_select,
_modbus_tcp_free
};
|
그중 하나 찍어서 보면 static 함수로 되어있다.
static ssize_t _modbus_rtu_send(modbus_t *ctx, const uint8_t *req, int req_length)
|
진짜로 전송하고 보내는 쪽이라 신경안써도 되려나?
'프로그램 사용 > libmodbus' 카테고리의 다른 글
libmodbus pi 함수들 (0) | 2022.05.10 |
---|---|
libmodbus modbus_mapping_new() (0) | 2022.05.10 |
libmodbus poll 적용 (0) | 2022.05.04 |
modbus tcp (0) | 2022.05.04 |
libmodbus 예제 프로그램 (0) | 2022.05.04 |