工作项目中,机器人要完成一个电源管理的功能,自带可充电触点接触充电的电池,具体参数不表,代码要完成通过无线网络与西门子的PLC通信,从而控制充电房的开门与关门,以及控制充电处的继电器的开启与关闭,协议是modbus-tcp。因此在网上找来好用的开源库——libmodbus。记录下简单使用过程。
下载地址:
download 选择v3.0.6长期稳定版

本文分为以下部分:

  • 源码安装
  • 测试与使用

源码安装

下载完压缩包放至/home目录下,解压:

tar -zxvf libmodbus-3.0.6.tar.gz

进入libmodbus-3.0.6目录:
cd libmodbus-3.0.6

配置:
./configure

编译与安装:
make && make install

测试与使用

测试

demo:

  modbus_t *mb;uint16_t tab_reg[32];mb = modbus_new_tcp("127.0.0.1", 1502);modbus_connect(mb);/* Read 5 registers from the address 0 */modbus_read_registers(mb, 0, 5, tab_reg);modbus_close(mb);modbus_free(mb);

测试modbus-tcp协议通信,代码里使用本地回环地址,端口1502:
进入tests目录打开一个终端,启动server程序:
./unit-test-server tcp
在目录打开另一个终端,启动client程序:
./unit-test-client tcp
启动会打印出很多信息。

使用

而自己使用也需要精简例子代码,并按实际需要更改ip和端口:
libmodbus-3.0.6目录下新建一个mytest目录。
mkdir mytest

将所需头文件拷入,头文件均位于目录src中:
cp modbus.h modbus-rtu.h modbus-tcp.h ../mytest

进入该目录:
cd mytest

创建自己代码main.c如下:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <modbus.h>
#include <time.h>
const uint16_t UT_INPUT_REGISTERS_ADDRESS = 0x1;
const uint16_t UT_BITS_ADDRESS = 0x04;
const uint16_t UT_INPUT_REGISTERS_NB = 0xA;
const uint16_t UT_INPUT_REGISTERS_TAB[] = { 0x000A };
int main(int argc, char const *argv[])
{int nb = 0x25;int rc = 0;modbus_t *ctx;uint8_t *tab_rp_bits;tab_rp_bits = (uint8_t *) malloc(nb * sizeof(uint8_t));memset(tab_rp_bits, 0, nb * sizeof(uint8_t));ctx = modbus_new_tcp("192.168.1.120", 502);if(ctx == NULL){fprintf(stderr, "Unable to allocate libmodbus context\n");return -1;}if(modbus_connect(ctx) == -1){fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}while(1){rc = modbus_write_bit(ctx, UT_BITS_ADDRESS, 1);if (rc != 1) {printf("FAILED (nb points %d)\n", rc);}rc = modbus_read_bits(ctx, UT_BITS_ADDRESS, 1, tab_rp_bits);printf("modbus_read_bits 1 \n modbus_read_bits: \n");if (rc != 1) {printf("FAILED (nb points %d)\n", rc);}printf("tab_rp_bits [0] is %d\n",tab_rp_bits[0]);memset(tab_rp_bits, 0, nb * sizeof(uint8_t));sleep(1);rc = modbus_write_bit(ctx, UT_BITS_ADDRESS, 0);if (rc != 1) {printf("FAILED (nb points %d)\n", rc);}rc = modbus_read_bits(ctx, UT_BITS_ADDRESS, 1, tab_rp_bits);printf("modbus_read_bits 0 \n modbus_read_bits: \n");if (rc != 1) {printf("FAILED (nb points %d)\n", rc);}printf("tab_rp_bits [0] is %d\n",tab_rp_bits[0]);sleep(1);}modbus_close(ctx);modbus_free(ctx);return 0;
}

ip 192.168.1.120
端口 502
上述代码功能是:控制读写地址为0x04位的coil status状态,使其不停的反转,在PLC上表现就是指示灯的闪烁。

编译:
cc -o main main.c -lmodbus -I ./
如果链接不过,报错缺so文件,就找到相关的so文件,并复制到/usr/local/lib目录下,并运行ldonfig

运行:
./main

ubuntu下libmodbus库的使用相关推荐

  1. libevent 源码阅读 Ubuntu下muduo库的安装与使用

    libevent源码分析--代码结构_鱼思故渊的专栏-CSDN博客 LINUX实战:Ubuntu下muduo库的安装与使用 LINUX实战:Ubuntu下muduo库的安装与使用-LINUX入门-维易 ...

  2. ubuntu下flann库编译报错处理

    ubuntu下flann库编译报错处理 编译flann的时候显示以下报错: CMake Error at src/cpp/CMakeLists.txt:33 (add_library):No SOUR ...

  3. linux boost 卸载,Ubuntu下boost库的编译安装步骤及卸载方法详解

    最近由于编译一个程序用到了C++的boost库,所以便安装了这个库.但是,其中遇到了一些小问题.所以记录下来,以供别人参考. 首先说一下我的环境:Ubuntu 12.04 32bit,  gcc 4. ...

  4. 【属性基加密】Ubuntu下CP-ABE库安装及调用教程详解

    目录 一.前言 二.CP-ABE 1.啥是CP-ABE 2.CP-ABE流程 三.CP-ABE库安装 1.下载 2.安装依赖项 3.gmp安装 4.pbc安装 5.libbswabe安装 6.cpab ...

  5. ubuntu下ccv库配置及DPM等算法demo

    参考如下资料,感谢如下网友分享! http://blog.csdn.net/yzhang6_10/article/details/51011794 http://blog.csdn.net/shixi ...

  6. Ubuntu下动态库与静态库混合连接

    一.在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库.使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库 ...

  7. ubuntu 下boost库交叉编译(Linux生成ARM的库)

    1.环境 Linux系统:16.04.1-Ubuntu 编译工具:armv8l-linux-gnueabihf-g++ 2.下载boost源码: 地址:Boost C++ Libraries - Br ...

  8. Ubuntu下libpng库编译使用

    1.下载地址:https://sourceforge.net/projects/libpng/files/ 这里下载版本:libpng-1.6.37 编译方法: cd libpng-1.6.37/ m ...

  9. Ubuntu下添加boost库

    @Ubuntu下Boost库的链接 在CmakeLists.txt中添加Boost组件 Boost具有很好的平台独立性,因此可以作为首选api来完成特定功能. 最常用的为filesystem,用来获取 ...

最新文章

  1. python raise valueerror_raise ValueError('无法设置没有定义索引的帧'ValueError:
  2. 关于Spring boot使用心得
  3. 无向完全图k6有几条边_漫画:什么是 “图”?
  4. linux判断压缩文件类型,【shell】判断压缩包类型并解压
  5. 点击panel滚动条滚动到底部
  6. unix系统编码 java_Java 正确的做字符串编码转换
  7. linux 没有那个文件或目录_【新视频进度】国庆节至今更新6节quot;嵌入式Linux应用开发基础quot;...
  8. 聚划算的夜场新生意 “三叉戟”打通夜间消费命脉
  9. mvc 路由 .html 404,vs2017 mvc 自定义路由规则 出现 404.0 错误代码 0x80070002
  10. java -jar命令
  11. 【Tensor】(张量)的创建
  12. Linux内存管理之vmalloc与low_memory
  13. mysql 认证介绍,MySQL认证介绍 (转帖)
  14. 鬼畜视频制作必备——vegas pro特别版歌声合成工具UTAU
  15. oracle sqlldr decode,SQLLDR应用举例
  16. 安规电容可靠性试验项目、试验方法及要求
  17. 巧妙利用工厂方法+反射+配置类解决多个同一方法不同实现
  18. pytthon问题 pytcharm Automatic upload failed: could not resolve file “sftp://10.xx.xx.xx 【已解决】
  19. UTC世界协调时间和BJT北京时间的转换
  20. Js根据拼音首字母分组

热门文章

  1. 翌加:抖音账号想要更多关注和粉丝要做好背景图
  2. 怎样实现服务器端渲染?
  3. Java 随机实现“泰坦”与“宙斯”之间的模拟交战。说明:本题以希腊神话中宙斯和泰坦间的交战为背景。分别建立宙斯和泰坦类......
  4. 新锐摄影师罗冰个展《初绽》在洛杉矶举办 展现新概念东方文化美学
  5. NSIS MUI教程
  6. C语言 题目 1727: 首字母大写
  7. html ajax验证用户名密码,AJAX实现注册验证用户名
  8. 使用.net 操作 微信公众平台 —— 第三方登录
  9. 开发游戏陪玩平台系统,如何实现分布式存储?
  10. ​ES elasticsearch-analysis-dynamic-synonym​连接数据库动态更新synonym近义词