Modbus 개발 클래스 라이브러리: 개발 효율성과 품질을 향상시킵니다!

유료 ¥6.99유료 ¥6.99

이 콘텐츠는 회원/유료 시스템과 연동되어 있으며, 잠금 해제 후 전체 자료를 보거나 첨부파일을 다운로드할 수 있습니다.

보기解锁방식
Modbus 개발 클래스 라이브러리: 개발 효율성과 품질을 향상시킵니다!

Mod bus 개발 클래 스 라이 브 러 리는 Mod bus 프로토 콜 의 기본 세부 사항을 캡 슐 화 하고 개발 자가 Mod bus 통신 기능을 신속하게 구현 할 수있는 간단한 API 인터페 이 스를 제공 하여 산업 자동 화 개발 에서 중요한 도구 입니다 .이 문서 에서는 lib mod bus 라이 브 러 리의 헤 더 파일 , 기능 함 수 , 컴 파 일 및 설치 방법 및 실제 응용 프로그램 예 제를 자세히 설명 하여 개발 자가 Mod bus 개발 을 빠르게 시작할 수 있도록 도와 줍니다 .

lib mod bus 라이 브 러 리 개 요

lib mod bus 는 Mod bus R TU , Mod bus AS C II 및 Mod bus TCP 프로토 콜 을 지원 하는 크 로 스 플랫폼 Mod bus 프로토 콜 라이 브 러 리 입니다 .그것은 C 언어로 작성 되었으며 Linux , Mac OS , Free BS D , Windows 및 기타 운영 체 제 에서 실행 됩니다 . lib mod bus 는 안정 적이고 효율 적이며 사용하기 쉬운 특성 으로 산업 제어 분야에서 가장 인기있는 Mod bus 개발 라이 브 러 리 중 하나가 되었습니다 .

1. 1 주요 특징

  • 多프로토콜支持
  • 跨平台
  • 主슬레이브兼备
  • 线程安全
  • 功能完整
  • 오픈소스무료
  • 문서丰富

II . 라이 브 러 리 파일 구조 상세 해 석

lib mod bus 라이 브 러 리는 다음과 같은 핵심 헤 더 및 라이 브 러 리 파일을 포함 합니다 .

2. 1 mod bus . h - 마스터 헤 더 파일

mod bus . h 는 lib mod bus 의 주요 헤 더 파일 이며 , 모든 공 용 API , 데이터 구조 및 상 수를 정의 합니다 .다음 을 포함 합니다 .

  • modbus_t结构体
  • 기능 코드常量
  • 异常码常量
  • API函数声明
  • 데이터유형定义
/ / 기본 헤 더 파일 포함
#include >

Mod bus TCP 컨 텍 스트 생성
192.168.1.100 modbus_t *ctx = modbus_new_tcp("

/ / 슬 레이 브 주소 설정
mod bus _ set _ slave (ct x , 1);

/ / 연결 만들기
mod bus _ connect (ct x);

/ / 레 지 스터 읽기
u int 16 _ t reg s [10] ;
mod bus _ read _ register s (ct x , 0, 10, reg s);

자 원을 해 제 합니다 .
mod bus _ close (ct x);
mod bus _ free (ct x)

2. 2 mod bus - R tu . h - R TU 모 드 헤 더 파일

mod bus - R tu . h 는 직 렬 통신 을 위해 Mod bus R TU 모 드에 대한 전 용 함 수 와 상 수를 정의 합니다 .

  • modbus_new_rtu()
  • 시리얼 포트 매개변수常量
  • modbus_rtu_set_serial_mode()
  • modbus_rtu_get_serial_mode()
  • modbus_rtu_set_rts()
# include mod bus - r tu . h<>

/ / R TU 컨 텍 스트 만들기 : S erial / dev / t ty USB 0, 96 00 바 트 속도 , 8 비트 , 체크 없음 , 1 중지 비트
mod bus _ t * c t x = mod bus _ new _ r tu ( "/ dev / tt y US B 0 ", 96 00, ' N ', 8, 1);

RS 48 5 모 드 설정
mod bus _ r tu _ set _ serial _ mode (ct x , MO DB US _ R TU _ RS 48 5) ;

R TS 제어 설정 (RS 48 5 트 랜 시 버 전환)
mod bus _ r tu _ set _ r ts (ct x , MO DB US _ R TU _ R TS _ UP);

/ / 슬 레이 브 주소 설정
mod bus _ set _ slave (ct x , 1);

/ / 연결
mod bus _ connect (ct x);

2. 3 mod bus - TCP . h - TCP 모 드 헤 더 파일

mod bus - t c p . h 는 Mod bus TCP 모 드에 대한 전 용 함 수를 정의 합니다 .

  • modbus_new_tcp()
  • modbus_new_tcp_pi()
  • modbus_tcp_listen()
  • modbus_tcp_accept()
  • MODBUS_TCP_DEFAULT_PORT
# include mod bus - t c p . h<>

TCP 클 라이언 트 컨 텍 스트 생성
192.168.1.100 modbus_t *ctx = modbus_new_tcp("

또는 서비스 이름 사용 법
192.168.1.100 modbus_t *ctx2 = modbus_new_tcp_pi("

TCP 서버 의 예 제
0.0.0.0 modbus_t *ctx = modbus_new_tcp("
int so cket = mod bus _ TCP _ listen (ct x , 1);
modbus_tcp_accept(ctx, code>

2.4 modbus-version.h - 버전信息

modbus-version.h包含库的버전信息,用于编译时버전检测:

#include <modbus-version.h>

// 버전宏定义
#define LIBMODBUS_VERSION_MAJOR 3
#define LIBMODBUS_VERSION_MINOR 1
#define LIBMODBUS_VERSION_MICRO 6
#define LIBMODBUS_VERSION "3.1.6"

// 运行时获取버전
const char *version = modbus_version();
printf("libmodbus버전:%s\n", version);

2.5 modbus.lib / libmodbus.so - 库文件

  • Linux:libmodbus.so(动态库)、libmodbus.a(静态库)
  • Windows:modbus.lib(导入库)、modbus.dll(动态链接库)
  • Mac OS:libmodbus.dylib(动态库)

三、编译安装方法

3.1 Linux编译安装

# 下载源码
wget https://github.com/stephane/libmodbus/archive/v3.1.6.tar.gz
tar xzf v3.1.6.tar.gz
cd libmodbus-3.1.6

# 编译安装
./autogen.sh
./configure --prefix=/usr/local
make
sudo make install

# 설정库路径
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/libmodbus.conf
sudo ldconfig

# 验证安装
pkg-config --modversion libmodbus
# 출력:3.1.6

3.2 Windows编译安装

  • 方法一:使用预编译的2진수包,从官网下载modbus-3.1.6_*.zip
  • 方法二:使用MSYS2/MinGW编译:pacman -S mingw-w64-x86_64-libmodbus
  • 方法三:使用vcpkg:vcpkg install libmodbus

3.3 编译매개변수

# GCC编译예제
gcc -o modbus_demo modbus_demo.c `pkg-config --cflags --libs libmodbus`

# CMakeLists.txt예제
find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBMODBUS REQUIRED libmodbus)

add_executable(modbus_demo modbus_demo.c)
target_include_directories(modbus_demo PRIVATE ${LIBMODBUS_INCLUDE_DIRS})
target_link_libraries(modbus_demo ${LIBMODBUS_LIBRARIES})

四、核心API函数详解

4.1 연결管理函数

函数功能매개변수설명
modbus_new_tcp(ip, port)创建TCP上下文ip=设备주소,port=포트号
modbus_new_rtu(dev, baud, parity, 데이터, stop)创建RTU上下文dev=시리얼 포트设备,baud=통신 속도
modbus_connect(ctx)建立연결成功返回0,失败返回-1
modbus_close(ctx)닫기연결-
modbus_free(ctx)释放上下文-
modbus_set_slave(ctx, slave)设置슬레이브 주소slave=1-247
modbus_set_response_timeout(ctx, sec, usec)设置响应超时sec=秒,usec=微秒
modbus_set_debug(ctx, flag)开启디버깅모드flag=TRUE/FALSE

4.2 读操作函数

// 读코일(기능 코드01)
int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

// 读이산 입력(기능 코드02)
int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

// 读유지 레지스터(기능 코드03)
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

// 读입력 레지스터(기능 코드04)
int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

// 使用예제
uint16_t regs[10];
int rc = modbus_read_registers(ctx, 0, 10, regs);
if (rc == -1) {
    fprintf(stderr, "읽기失败:%s\n", modbus_strerror(errno));
}

4.3 写操作函数

// 写单个코일(기능 코드05)
int modbus_write_bit(modbus_t *ctx, int addr, int status);

// 写单个레지스터(기능 코드06)
int modbus_write_register(modbus_t *ctx, int addr, int value);

// 写多个코일(기능 코드15)
int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *데이터);

// 写多个레지스터(기능 코드16)
int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *데이터);

// 使用예제
modbus_write_bit(ctx, 0, TRUE);       // 吸合第1路릴레이
modbus_write_register(ctx, 0, 1234);  // 쓰기레지스터

uint16_t values[3] = {100, 200, 300};
modbus_write_registers(ctx, 0, 3, values); // 批量쓰기

4.4 데이터转换函数

// 浮点数转换(IEEE 754)
float modbus_get_float(const uint16_t *src);
void modbus_set_float(float f, uint16_t *dest);

// 32位整数转换
uint32_t modbus_get_int32(const uint16_t *src);
void modbus_set_int32(uint32_t value, uint16_t *dest);

// 使用예제
uint16_t regs[2];
modbus_read_registers(ctx, 10, 2, regs);
float temp = modbus_get_float(regs);
printf("온도:%.2f℃\n", temp);

// 쓰기浮点数
uint16_t write_regs[2];
modbus_set_float(25.5, write_regs);
modbus_write_registers(ctx, 10, 2, write_regs);

五、完整적용예제

5.1 TCP클라이언트예제

#include <stdio.h>
#include <stdlib.h>
#include <modbus.h>

int main(int argc, char *argv[]) {
    modbus_t *ctx;
    uint16_t regs[32];
    uint8_t bits[32];
    int rc;

    // 创建TCP上下文
    ctx = modbus_new_tcp("192.168.1.100", 502);
    if (ctx == NULL) {
        fprintf(stderr, "创建上下文失败\n");
        return -1;
    }

    // 设置디버깅모드(可选)
    modbus_set_debug(ctx, TRUE);

    // 设置슬레이브 주소
    modbus_set_slave(ctx, 1);

    // 设置超时
    modbus_set_response_timeout(ctx, 1, 0);

    // 建立연결
    if (modbus_connect(ctx) == -1) {
        fprintf(stderr, "연결失败:%s\n", modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    printf("연결成功!\n");

    // 읽기8路릴레이状态
    rc = modbus_read_bits(ctx, 0, 8, bits);
    if (rc != -1) {
        printf("릴레이状态:");
        for (int i = 0; i < 8; i++) {
            printf("%d ", bits[i]);
        }
        printf("\n");
    }

    // 읽기10个유지 레지스터
    rc = modbus_read_registers(ctx, 0, 10, regs);
    if (rc != -1) {
        printf("유지 레지스터:");
        for (int i = 0; i < 10; i++) {
            printf("%d ", regs[i]);
        }
        printf("\n");
    }

    // 控制第1路릴레이吸合
    modbus_write_bit(ctx, 0, TRUE);
    printf("第1路릴레이已吸合\n");

    // 닫기연결
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}

5.2 RTU슬레이브예제

#include <stdio.h>
#include <modbus.h>
#include <modbus-rtu.h>

#define NB_COILS 16
#define NB_REGISTERS 10

int main() {
    modbus_t *ctx;
    modbus_mapping_t *mb_mapping;
    uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
    int rc;

    // 创建RTU上下文
    ctx = modbus_new_rtu("/dev/ttyUSB0", 9600, 'N', 8, 1);
    modbus_set_slave(ctx, 1);
    modbus_rtu_set_serial_mode(ctx, MODBUS_RTU_RS485);
    modbus_connect(ctx);

    // 创建데이터映射
    mb_mapping = modbus_mapping_new(
        NB_COILS,      // 코일 수량
        NB_COILS,      // 이산 입력数量
        NB_REGISTERS,  // 保持레지스터 수량
        NB_REGISTERS   // 입력레지스터 수량
    );

    // 初始化一些데이터
    mb_mapping->tab_registers[0] = 100;  // 온도值
    mb_mapping->tab_registers[1] = 50;   // 湿度值

    printf("Modbus RTU슬레이브已启动,주소:1\n");

    // 主循环
    while (1) {
        rc = modbus_receive(ctx, query);
        if (rc > 0) {
            modbus_reply(ctx, query, rc, mb_mapping);
        } else if (rc == -1) {
            // 연결断开或错误
            break;
        }
    }

    modbus_mapping_free(mb_mapping);
    modbus_close(ctx);
    modbus_free(ctx);
    return 0;
}

일반적인 문제 및 솔루 션

  • 연결超时
  • 시리얼 포트权限不足
  • CRC 검증错误
  • RS485收发전환문제
  • 읽기데이터异常
  • 多线程冲突
  • 编译找不到头文件

다른 Mod bus 개발 라이 브 러 리 추천

库名
libmodbus
FreeModbus
modbus-tk
pymodbus
EasyModbus
NModbus
node-modbus

lib mod bus 는 C / C ++ 개발 자에게 선호 되는 Mod bus 라이 브 러 리 이며 , 안정 적인 성 능 과 풍부한 기능 으로 산업 제어 분야에서 널리 사용됩니다 .이 문서 에서 설명 하는 코 드는 직접 컴 파 일 하여 실행 할 수 있으며 , 실제 프로젝트에 통합 하기 전에 테스트 환경에서 통신 을 검 증 하는 것이 좋습니다 .

相关标签
실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注