libmodbus 소스 코드 분석 (1) 기본 프레임 워 크, 핵심 데이터 구조, 인터페이스

7111 단어 Linux임 베 디 드
이전 글:
《 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;
 

좋은 웹페이지 즐겨찾기