ubuntu下libmodbus库的使用
工作项目中,机器人要完成一个电源管理的功能,自带可充电触点接触充电的电池,具体参数不表,代码要完成通过无线网络与西门子的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库的使用相关推荐
- libevent 源码阅读 Ubuntu下muduo库的安装与使用
libevent源码分析--代码结构_鱼思故渊的专栏-CSDN博客 LINUX实战:Ubuntu下muduo库的安装与使用 LINUX实战:Ubuntu下muduo库的安装与使用-LINUX入门-维易 ...
- ubuntu下flann库编译报错处理
ubuntu下flann库编译报错处理 编译flann的时候显示以下报错: CMake Error at src/cpp/CMakeLists.txt:33 (add_library):No SOUR ...
- linux boost 卸载,Ubuntu下boost库的编译安装步骤及卸载方法详解
最近由于编译一个程序用到了C++的boost库,所以便安装了这个库.但是,其中遇到了一些小问题.所以记录下来,以供别人参考. 首先说一下我的环境:Ubuntu 12.04 32bit, gcc 4. ...
- 【属性基加密】Ubuntu下CP-ABE库安装及调用教程详解
目录 一.前言 二.CP-ABE 1.啥是CP-ABE 2.CP-ABE流程 三.CP-ABE库安装 1.下载 2.安装依赖项 3.gmp安装 4.pbc安装 5.libbswabe安装 6.cpab ...
- ubuntu下ccv库配置及DPM等算法demo
参考如下资料,感谢如下网友分享! http://blog.csdn.net/yzhang6_10/article/details/51011794 http://blog.csdn.net/shixi ...
- Ubuntu下动态库与静态库混合连接
一.在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库.使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库 ...
- ubuntu 下boost库交叉编译(Linux生成ARM的库)
1.环境 Linux系统:16.04.1-Ubuntu 编译工具:armv8l-linux-gnueabihf-g++ 2.下载boost源码: 地址:Boost C++ Libraries - Br ...
- Ubuntu下libpng库编译使用
1.下载地址:https://sourceforge.net/projects/libpng/files/ 这里下载版本:libpng-1.6.37 编译方法: cd libpng-1.6.37/ m ...
- Ubuntu下添加boost库
@Ubuntu下Boost库的链接 在CmakeLists.txt中添加Boost组件 Boost具有很好的平台独立性,因此可以作为首选api来完成特定功能. 最常用的为filesystem,用来获取 ...
最新文章
- python raise valueerror_raise ValueError('无法设置没有定义索引的帧'ValueError:
- 关于Spring boot使用心得
- 无向完全图k6有几条边_漫画:什么是 “图”?
- linux判断压缩文件类型,【shell】判断压缩包类型并解压
- 点击panel滚动条滚动到底部
- unix系统编码 java_Java 正确的做字符串编码转换
- linux 没有那个文件或目录_【新视频进度】国庆节至今更新6节quot;嵌入式Linux应用开发基础quot;...
- 聚划算的夜场新生意 “三叉戟”打通夜间消费命脉
- mvc 路由 .html 404,vs2017 mvc 自定义路由规则 出现 404.0 错误代码 0x80070002
- java -jar命令
- 【Tensor】(张量)的创建
- Linux内存管理之vmalloc与low_memory
- mysql 认证介绍,MySQL认证介绍 (转帖)
- 鬼畜视频制作必备——vegas pro特别版歌声合成工具UTAU
- oracle sqlldr decode,SQLLDR应用举例
- 安规电容可靠性试验项目、试验方法及要求
- 巧妙利用工厂方法+反射+配置类解决多个同一方法不同实现
- pytthon问题 pytcharm Automatic upload failed: could not resolve file “sftp://10.xx.xx.xx 【已解决】
- UTC世界协调时间和BJT北京时间的转换
- Js根据拼音首字母分组
热门文章
- 翌加:抖音账号想要更多关注和粉丝要做好背景图
- 怎样实现服务器端渲染?
- Java 随机实现“泰坦”与“宙斯”之间的模拟交战。说明:本题以希腊神话中宙斯和泰坦间的交战为背景。分别建立宙斯和泰坦类......
- 新锐摄影师罗冰个展《初绽》在洛杉矶举办 展现新概念东方文化美学
- NSIS MUI教程
- C语言 题目 1727: 首字母大写
- html ajax验证用户名密码,AJAX实现注册验证用户名
- 使用.net 操作 微信公众平台 —— 第三方登录
- 开发游戏陪玩平台系统,如何实现分布式存储?
- ​ES elasticsearch-analysis-dynamic-synonym​连接数据库动态更新synonym近义词