当前位置:   article > 正文

libmodbus 开源库(第一部分)

libmodbus

下载地址

libmodbus 开源库地址:GitHub - stephane/libmodbus: A Modbus library for Linux, Mac OS, FreeBSD and Windows

编译方式

  1. 安装必要的软件    sudo apt-get install pkg-config autoconf automake make libtool
  2. 编译 libmodbus    ./autogen.sh && ./configure --prefix=/usr && && make && sudo make install
  3. 测试代码编译需要使用 pkg-config,例如:
  4. gcc random-test-server.c -o random-test-server `pkg-config --libs --cflags libmodbus`

函数说明

modbus_new_tcp

  1. /*
  2. 函数作用:创建一个 modbus_t 结构
  3. 参数说明:
  4. ip 指定该客户端要建立连接的服务器的IP地址。NULL值可用于侦听服务器模式下的任何地址
  5. port TCP端口。将端口设置MODBUS_TCP_DEFAULT_PORT为使用默认端口 (502)。使用大于或等于1024的端口号很方便,因为不需要管理员权限。
  6. 返回值:
  7. 如果成功,该函数应返回一个指向modbus_t结构的指针。否则,它将返回NULL并将errno设置为以下定义的值之一。
  8. */
  9. modbus_t *modbus_new_tcp(const char *ip, int port);
  10. 示例代码:
  11. modbus_t *ctx;
  12. ctx = modbus_new_tcp("127.0.0.1", 1502);
  13. if (ctx == NULL) {
  14. fprintf(stderr, "Unable to allocate libmodbus context\n");
  15. return -1;
  16. }

modbus_connect 

  1. /*
  2. 函数作用:连接到一个 Modbus TCP 服务器
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. 返回值:
  6. 成功:该函数应返回0
  7. 失败:将返回-1,并将errno设置为基础平台的系统调用所定义的值之一。
  8. */
  9. int modbus_connect(modbus_t *ctx);
  10. 示例代码:
  11. modbus_t *ctx;
  12. ctx = modbus_new_tcp("127.0.0.1", 502);
  13. if (modbus_connect(ctx) == -1) {
  14. fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
  15. modbus_free(ctx);
  16. return -1;
  17. }
  1. /*
  2. 函数作用:关闭 modbus 连接
  3. */
  4. void modbus_close(modbus_t *ctx);
  5. /*
  6. 函数作用:释放 modbus_t 环境
  7. */
  8. void modbus_free(modbus_t *ctx);

 modbus_read_bits

  1. /*
  2. 函数作用:读取线圈状态,使用功能码 0x01。地址范围:0区(00001-09999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 起始地址
  6. nb 地址长度
  7. dest 读取结果(必须注意分配足够的内存以将结果存储在dest中,注意数据类型为 uint8_t)
  8. 返回值:
  9. 如果成功,该函数应返回读取位数。否则它将返回-1并设置errno
  10. */
  11. int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
  12. 示例代码:
  13. int i, rc;
  14. uint8_t bit_reg[32];
  15. memset(bit_reg, 0, sizeof(bit_reg));
  16. rc = modbus_read_bits(mb, 0, 10, bit_reg);
  17. if(rc == -1)
  18. {
  19. printf("%s\n", modbus_strerror(errno));
  20. }
  21. for(i = 0; i < rc; i++)
  22. {
  23. printf("reg[%d]=%d\t(0x%X)\n", i, bit_reg[i], bit_reg[i]);
  24. }

modbus_read_input_bits 

  1. /*
  2. 函数作用:读取离散量输入,使用功能码 0x02,地址范围:1区(10001-19999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 起始地址
  6. nb 地址长度
  7. dest 读取结果(必须注意分配足够的内存以将结果存储在dest中,注意数据类型为 uint8_t)
  8. 返回值:
  9. 如果成功,该函数应返回读取位数。否则它将返回-1并设置errno
  10. */
  11. int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
  12. 示例代码:
  13. int i, rc;
  14. uint8_t bit_reg[32];
  15. memset(bit_reg, 0, sizeof(bit_reg));
  16. rc = modbus_read_input_bits(mb, 0, 10, bit_reg);
  17. if(rc == -1)
  18. {
  19. printf("%s\n", modbus_strerror(errno));
  20. }
  21. for(i = 0; i < rc; i++)
  22. {
  23. printf("reg[%d]=%d\t(0x%X)\n", i, bit_reg[i], bit_reg[i]);
  24. }

modbus_read_registers 

  1. /*
  2. 函数作用:读取保持寄存器,使用功能码 0x03,地址范围:4区(40001-49999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 起始地址
  6. nb 地址长度
  7. dest 读取结果(必须注意分配足够的内存以将结果存储在dest中,注意数据类型为 uint16_t)
  8. 返回值:
  9. 如果成功,该函数应返回读取位数。否则它将返回-1并设置errno
  10. */
  11. int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
  12. 示例代码:
  13. int i, rc;
  14. uint16_t tab_reg[32];
  15. memset(tab_reg, 0, sizeof(tab_reg));
  16. rc = modbus_read_registers(mb, 0, 10, tab_reg);
  17. if(rc == -1)
  18. {
  19. printf("%s\n", modbus_strerror(errno));
  20. }
  21. for(i = 0; i < rc; i++)
  22. {
  23. printf("reg[%d]=%d\t(0x%X)\n", i, tab_reg[i], tab_reg[i]);
  24. }

modbus_read_input_registers

  1. /*
  2. 函数作用:读取输入寄存器,使用功能码 0x04,地址范围:3区(30001-39999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 起始地址
  6. nb 地址长度
  7. dest 读取结果(必须注意分配足够的内存以将结果存储在dest中,注意数据类型为 uint16_t)
  8. 返回值:
  9. 如果成功,该函数应返回读取位数。否则它将返回-1并设置errno
  10. */
  11. int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
  12. 示例代码:
  13. int i, rc;
  14. uint16_t tab_reg[32];
  15. memset(tab_reg, 0, sizeof(tab_reg));
  16. rc = modbus_read_input_registers(mb, 0, 10, tab_reg);
  17. if(rc == -1)
  18. {
  19. printf("%s\n", modbus_strerror(errno));
  20. }
  21. for(i = 0; i < rc; i++)
  22. {
  23. printf("reg[%d]=%d\t(0x%X)\n", i, tab_reg[i], tab_reg[i]);
  24. }

modbus_write_bit 

  1. /*
  2. 函数说明:写单个线圈,使用功能码 0x05,地址范围:0区(00001-09999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 线圈地址
  6. status 线圈状态。(线圈状态只有 ON 和 OFF 两种值,所以 status 传入非 0 值,线圈状态被设置为 ON,status 传入 0 值,线圈状态被设置为 OFF)
  7. 返回值:
  8. 如果成功,该函数应返回1。否则它将返回-1并设置errno。
  9. */
  10. int modbus_write_bit(modbus_t *ctx, int addr, int status);
  11. 示例代码:
  12. for(i = 0; i < 10; i++)
  13. {
  14. rc = modbus_write_bit(mb, i, 1);
  15. if(rc == -1)
  16. {
  17. printf("addr %d write failed\n", i);
  18. }
  19. sleep(1);
  20. }

modbus_write_register 

  1. /*
  2. 函数作用:写单个保持寄存器,使用功能码 0x06,地址范围:4区(40001-49999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 线圈地址
  6. value 要设置的寄存器值
  7. */
  8. int modbus_write_register(modbus_t *ctx, int addr, const uint16_t value);
  9. 示例代码:
  10. for(i = 0; i < 10; i++)
  11. {
  12. rc = modbus_write_register(mb, i, i*16);
  13. if(rc == -1)
  14. {
  15. printf("addr %d write failed\n", i);
  16. }
  17. sleep(1);
  18. }

modbus_write_bits 

  1. /*
  2. 函数作用:写多个线圈,使用功能码 0x0F,地址范围:0区(00001-09999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 起始地址
  6. nb 地址长度
  7. src 存储要设置的线圈值的数组
  8. 返回值:
  9. 如果成功,该函数应返回已写入的位数。否则它将返回-1并设置errno。
  10. */
  11. int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *src);
  12. 示例代码:
  13. const uint8_t src8_t[10] = {0, 1, 1, 0, 1, 0, 1, 0, 1, 1};
  14. rc = modbus_write_bits(mb, 0, 10, src8_t);
  15. if(rc == -1)
  16. {
  17. printf("write bits failed, %s\n", modbus_strerror(errno));
  18. }

 modbus_write_registers

  1. /*
  2. 函数作用:写多个保持寄存器,使用功能码 0x10,地址范围:4区(40001-49999)
  3. 参数说明:
  4. ctx modbus_new_tcp 创建的 modbus_t 结构体
  5. addr 起始地址
  6. nb 地址长度
  7. src 存储要设置的寄存器值的数组
  8. 返回值:
  9. 如果成功,该函数应返回已写寄存器的数量。否则它将返回-1并设置errno。
  10. */
  11. int modbus_write_registers(modbus_t *ctx, int addr, int nb, const uint16_t *src);
  12. 示例代码:
  13. const uint16_t src16_t[10] = {100, 200, 179, 213, 3254, 322, 432, 311, 442, 797};
  14. rc = modbus_write_registers(mb, 0, 10, src16_t);
  15. if(rc == -1)
  16. {
  17. printf("write registers failed, %s\n", modbus_strerror(errno));
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/566079
推荐阅读
相关标签
  

闽ICP备14008679号