libmodbus 소스 코드 분석 (1) 기본 프레임 워 크, 핵심 데이터 구조, 인터페이스
《 libmodbus 프로 토 콜 창고 1 - Linux 에서 상세 한 이식 절차 (설정, 생 성) 》
《 libmodbus 프로 토 콜 스 택 2 - Linux 에서 modbus RTU master 개발 사례 》
《 libmodbus 프로 토 콜 창고 3 - Linux 에서 modbus RTU 기계 개발 사례 》
《 libmodbus 프로 토 콜 창고 4 - 총 결 》
우 리 는 응용 측면 에서 libmodbus 의 사용 방법 을 알 게 되 었 다. 최근 한 동안 의 테스트 를 통 해 나 는 이 라 이브 러 리 파일 이 비교적 안정 적 이라는 것 을 알 게 되 었 다. 특히 고장 회복 기능 을 제공 하여 안정성 을 크게 향상 시 켰 다.다음은 소스 코드 의 측면 에서 libmodbus 의 기본 원 리 를 분석 하 겠 습 니 다. 여기 서 우 리 는 가장 자주 사용 하 는 modbus rtu 로 분석 합 니 다. 즉, 직렬 포트 에 사용 합 니 다.
1. 관건 적 인 데이터 구조, 인터페이스 함수
1、modbus_t
이 유형 은 libmodbus 의 가장 기본 적 인 데이터 구조 로 구조 체 입 니 다. 소스 코드 정 의 는 다음 과 같 습 니 다.
struct _modbus {
/* Slave address */
int slave;
/* Socket or file descriptor */
int s;
int debug;
int error_recovery;
struct timeval response_timeout;
struct timeval byte_timeout;
const modbus_backend_t *backend;
void *backend_data;
};
그 중:
/*
* , libmodbus , slave
* libmodbus ( ), slave
*/
int slave;
/*
* , modbus rtu , modbus tcp socket
*/
int s;
/*
* debug
*/
int debug;
/*
* , , libmodbus , 。
*/
int error_recovery;
/*
*
*/
struct timeval response_timeout;
/*
* , modbus , 3.5
*/
struct timeval byte_timeout;
/*
* , , ,modbus rtu
* modbus tcp , , 。
*/
const modbus_backend_t *backend;
/*
* , , modbus rtu , 。
*/
void *backend_data;
2、modbus_backend_t
이 데이터 구 조 는 modbus 의 리 턴 함수 집결 구조 이 고 소스 코드 는 다음 과 같다.
typedef struct _modbus_backend {
unsigned int backend_type;
unsigned int header_length;
unsigned int checksum_length;
unsigned int max_adu_length;
int (*set_slave) (modbus_t *ctx, int slave);
int (*build_request_basis) (modbus_t *ctx, int function, int addr,
int nb, uint8_t *req);
int (*build_response_basis) (sft_t *sft, uint8_t *rsp);
int (*prepare_response_tid) (const uint8_t *req, int *req_length);
int (*send_msg_pre) (uint8_t *req, int req_length);
ssize_t (*send) (modbus_t *ctx, const uint8_t *req, int req_length);
int (*receive) (modbus_t *ctx, uint8_t *req);
ssize_t (*recv) (modbus_t *ctx, uint8_t *rsp, int rsp_length);
int (*check_integrity) (modbus_t *ctx, uint8_t *msg,
const int msg_length);
int (*pre_check_confirmation) (modbus_t *ctx, const uint8_t *req,
const uint8_t *rsp, int rsp_length);
int (*connect) (modbus_t *ctx);
void (*close) (modbus_t *ctx);
int (*flush) (modbus_t *ctx);
int (*select) (modbus_t *ctx, fd_set *rset, struct timeval *tv, int msg_length);
void (*free) (modbus_t *ctx);
} modbus_backend_t;
저 자 는 코드 를 좋 은 패 키 징 인터페이스, modbus rtu 와 modbus tcp 의 접근 인 터 페 이 스 는 같 지만 초기 화 할 때 서로 다른 프로 토 콜 을 부여 하 는 함수 포인터 가 modbus 의 각종 조작 인터페이스 함수 입 니 다.
3、modbus_mapping_t
이 구 조 는 libmodbus 를 컴퓨터 에서 사용 할 때 modbus 각 지역 레지스터 집합 지침 으로 사용 되 며 소스 코드 는 다음 과 같 습 니 다.
typedef struct {
int nb_bits;
int start_bits;
int nb_input_bits;
int start_input_bits;
int nb_input_registers;
int start_input_registers;
int nb_registers;
int start_registers;
uint8_t *tab_bits;
uint8_t *tab_input_bits;
uint16_t *tab_input_registers;
uint16_t *tab_registers;
} modbus_mapping_t;
위의 정 의 를 통 해 알 수 있 듯 이 0x, 1x, 3x, 4x 총 4 개의 구역 레지스터 파라미터 에 대한 정의 이다.
4、modbus_new_tcp 、 modbus_new_rtu
이 두 함수 의 기능 은 같 습 니 다. modbus 를 신청 하고 초기 화 합 니 다.t * ctx 구조 지침, 뒤의 모든 modbus 작업 은 이 ctx 를 바탕 으로 합 니 다. 다른 것 은 modbus 입 니 다.new_tcp 는 modbus tcp 에 사용 되 며, modbusnew_rtu 는 modbus rtu 에 사용 되 는데 구체 적 인 기능 은 modbus 를 신청 하 는 것 입 니 다.t 구조 포인터 반전 함수.
예제 코드:
if (use_backend == TCP) {
ctx = modbus_new_tcp("127.0.0.1", 1502);
} else if (use_backend == TCP_PI) {
ctx = modbus_new_tcp_pi("::1", "1502");
} else {
ctx = modbus_new_rtu("/dev/ttyUSB1", 115200, 'N', 8, 1);
}
5、modbus_set_error_recovery
이 함 수 는 libmodbus 운행 과정 에서 오류 가 발생 했 을 때 어떻게 회복 하 는 지 설정 하 는 데 사 용 됩 니 다. 이 함 수 는 매우 중요 합 니 다. 프로그램의 운행 에 여러 가지 이상 이 없어 서 는 안 되 고 이상 이 두 렵 지 않 습 니 다. 대응 만 있 으 면 프로그램 이 안정 적 입 니 다. 예제 코드 는 다음 과 같 습 니 다.
modbus_set_error_recovery(ctx,
MODBUS_ERROR_RECOVERY_LINK |
MODBUS_ERROR_RECOVERY_PROTOCOL);
코드 중, MODBUSERROR_RECOVERY_링크 는 연결 을 끊 으 면 자동 으로 복구 된다 고 밝 혔 다.
MODBUS_ERROR_RECOVERY_PROTOCOL 은 프로 토 콜 차원 에서 고장 이 났 을 때 장치 에서 시간 초과 등 자동 으로 복구 된다 고 밝 혔 다.
6、modbus_set_slave
modbus 장치 주 소 를 설정 합 니 다. 만약 에 우리 장치 가 호스트 라면 이 함수 가 읽 을 컴퓨터 주 소 를 설정 합 니 다. 반대로 우리 장치 가 컴퓨터 에서 사용 된다 면 이 함수 가 이 컴퓨터 주 소 를 설정 합 니 다. 예제 코드 는 다음 과 같 습 니 다.
modbus_set_slave(ctx, SERVER_ID);
7、modbus_connect
이 함 수 는 말 그대로 '연결' 기능 을 실현 하 는 것 임 을 알 수 있 습 니 다. 이 함 수 를 호출 한 후에 야 통신 을 할 수 있 습 니 다. 앞의 함 수 는 모두 각종 매개 변 수 를 신청 하고 초기 화 하 며 하드웨어 장치 (직렬, 네트워크) 에 대해 실제 동작 이 없습니다. 이 함 수 는 바로 바 텀 하드웨어 인터페이스 에 대한 동작 입 니 다. modbus rtu 모드 에서 직렬 포트 를 설정 하고 열 수 있 습 니 다.modbus tcp 모드 에 서 는 socket 연결 을 만 듭 니 다.
8、modbus_read_xxxx
이 함 수 는 libmodbus 가 호스트 에 사 용 될 때 각 영역 (0x, 1x, 3x, 4x) 을 읽 습 니 다. 의 인터페이스 함수.설명 이 필요 한 것 은 이 함 수 는 '읽 기' 기능 만 포함 하 는 것 이 아니 라 '읽 기' 기능 의 모든 절 차 를 포함한다.
① 읽 기 명령 을 만 들 고 포장 합 니 다.
② 전송 절차 ① 의 읽 기 명령.
③ 컴퓨터 에서 데 이 터 를 되 돌려 받는다.
④ 되 돌아 오 는 데 이 터 를 각종 검사 하 는데 예 를 들 어 장치 주소, 주소, 수량, CRC 검사 등 이다.
⑤ 우리 가 지정 한 캐 시 에 올 바른 데 이 터 를 되 돌려 줍 니 다.
9、modbus_write_xxxx
libmodbus 가 호스트 로 사 용 될 때 0x, 4x 구역 의 인터페이스 함 수 를 쓰 는 것 은 modbus 와 유사 합 니 다.read_xxxx 는 모든 기능 을 포함 합 니 다.
10、modbus_receive
libmodbus 는 호스트 로 서 든 컴퓨터 로 사용 하 든 모두 이 함 수 를 사용 합 니 다. 즉, 수신 기능 입 니 다. 이 함 수 는 Liux 에서 select 체 제 를 사용 합 니 다. 다른 것 은 libmodbus 가 호스트 로 있 을 때 select 에 시간 이 초과 되 어 계속 막 히 지 않 습 니 다. 컴퓨터 로 서 select 의 시간 이 0, 즉 막 히 는 것 도 필연 적 입 니 다.그리고 이 함 수 는 한꺼번에 받 아들 이 는 것 이 아니 라 세 단계 로 나 누 어 받 는 경우 가 많다 는 점 은 뒤의 글 에서 상세 하 게 소개 할 것 이다.
11、modbus_mapping_new 、 modbus_mapping_new_start_address
이 두 함수 의 기능 은 본질 적 으로 같 고 전자 도 후 자 를 호출 하여 이 루어 진 것 이다.libmodbus 를 컴퓨터 (서버) 에서 사용 할 때 이 함 수 를 통 해 4 개의 구역 레지스터 캐 시 를 신청 하고 초기 화 합 니 다.
12、modbus_reply
함수 의 의미 에서 볼 때, libmodbus 를 컴퓨터 (서버) 에서 사용 할 때 호스트 에 대한 응답 에 사용 합 니 다.이 함수 의 실현 코드 는 비교적 많다. 왜냐하면 해당 호스트 의 모든 수요 가 정확 할 뿐만 아니 라 불법 수요 도 있어 야 한다.보통 저희 가 호출 만 하면... modbus_receive 수신 데이터 가 완료 되면 이 함 수 를 직접 호출 하면 libmodbus 는 자동 으로 패키지 에 해당 하 는 패 키 지 를 구성 하여 호스트 에 되 돌려 줍 니 다.
13、modbus_close
libmodbus 를 닫 습 니 다.
14、modbus_mapping_free
libmodbus 가 컴퓨터 (서버) 에서 사용 할 때 4 개의 영역 레지스터 의 캐 시 를 방출 합 니 다.
15、modbus_free
libmodbus 의 자원 을 방출 합 니 다. 즉, 신청 을 초기 화 하 는 것 입 니 다. modbus_t *ctx;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
바이너리 파일cat 또는tail, 터미널 디코딩 시 처리 방법cat으로 바이너리 파일을 보려고 할 때 코드가 엉망이 되어 식은땀이 났다. 웹에서 스크롤된 정보의 처리 방법과alias의 설정을 요약합니다. reset 명령을 사용하여 터미널을 재설정합니다.이렇게 하면 고치지 못하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.