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

Paid ¥6.99Paid ¥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编译インストール

  • 方法一:使用预编译的二进制包,从官网下载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.txtexample
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 连接管理函数

函数Function参数説明
modbus_new_tcp(ip, port)作成TCPContextよりip=Device address,port=ポート番号
modbus_new_rtu(dev, baud, parity, data, stop)作成RTUContextよりdev=Serial Port Device,baud=Baud rate
modbus_connect(ctx)建立连接成功戻る0,失敗戻る-1
modbus_close(ctx)接続を閉じる-
modbus_free(ctx)释放Contextより-
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 読み取り操作。函数

// リードコイルを読む(function code01)
int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

// read discrete inputs(function code02)
int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

// read holding registers(function code03)
int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

// read input registers(function code04)
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, "Read failed:%s\n", modbus_strerror(errno));
}

4.3 書き込み操作。函数

// write single coil(function code05)
int modbus_write_bit(modbus_t *ctx, int addr, int status);

// write single register(function code06)
int modbus_write_register(modbus_t *ctx, int addr, int value);

// write multiple coils(function code15)
int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);

// write multiple registers(function code16)
int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *data);

// 使用例の例
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("temperature:%.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;

    // 作成TCPContextより
    ctx = modbus_new_tcp("192.168.1.100", 502);
    if (ctx == NULL) {
        fprintf(stderr, "作成Contextより失敗\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");

    // read8路继电器ステータス
    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");
    }

    // read10レジスタを保持する。
    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("No.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;

    // 作成RTUContextより
    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スレーブ已启动,address: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 checkError
  • RS485收发切换問題
  • 読み取りデータ異常
  • 多线程冲突
  • 编译找不到头文件

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

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

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

Related Tags
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.