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 라이 브 러 리 이며 , 안정 적인 성 능 과 풍부한 기능 으로 산업 제어 분야에서 널리 사용됩니다 .이 문서 에서 설명 하는 코 드는 직접 컴 파 일 하여 실행 할 수 있으며 , 실제 프로젝트에 통합 하기 전에 테스트 환경에서 통신 을 검 증 하는 것이 좋습니다 .
Leave a Reply