ubuntu下使用libmodbus

参照:非常感谢原文作者

https://blog.csdn.net/qq_30650153/article/details/83385626

https://blog.csdn.net/qq_23670601/article/details/82386946

https://blog.csdn.net/qq_23670601/article/details/82155378#%E8%AF%BB%E5%8F%96%E4%BF%9D%E6%8C%81%E5%AF%84%E5%AD%98%E5%99%A8%C2%A0int%20modbus_read_registers(modbus_t%20*ctx%2C%20int%C2%A0addr%2C%20int%C2%A0nb%2C%20uint16_t%20*dest)%3B

硬件平台:Exynos4412

源码安装

  • 安装工具

sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool

 

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

tar -zxvf libmodbus-3.0.6.tar.gz

下载地址https://www.libmodbus.org/download/

  • 进入libmodbus-3.0.6目录:

cd libmodbus-3.0.6

  • 配置:

./configure

  • 编译与安装:

make && make install


测试

  • 分别进入两个终端运行
  • 进入tests目录打开一个终端,启动server程序:

./unit-test-server tcp

  • 在目录打开另一个终端,启动client程序:

./unit-test-client tcp

运行结果:

ubuntu下使用libmodbus_第1张图片

说明配置编译安装正确

 

例程

  • 进入libmodbus-3.0.6目录: 并新建文件夹 mytest

cd libmodbus-3.0.6

mkdir mytest

  • 将src文件夹下的 modbus.h modbus-rtu.h modbus-tcp.h modbus-version.h复制到新建的文件夹下

cp modbus.h modbus-rtu.h modbus-tcp.h modbus-version.h ../mytest

新建main.c文件

内容如下:

  • 简单描述一下程序逻辑

liunx开发板作为modbus client,去链接192.168.0.111的IP 端口号为1502

读保持寄存器的值

读完后显示打印时间和读到的值

#include 
#include 
#include 
#include 
#include 
#include 

#include 

char* getDateTime();


int main(int argc, char const *argv[])
{
modbus_t *ctx;
uint16_t tab_reg[64];
int rc=0;
int i=0;

ctx = modbus_new_tcp("192.168.0.111", 1502);
if (modbus_connect(ctx) == -1) {
    fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
    modbus_free(ctx);
    return -1;
}

struct timeval t;
          t.tv_sec=0;
          t.tv_usec=1000000;        //set modbus time 1000ms
          modbus_set_response_timeout(ctx,&t);

rc = modbus_read_registers(ctx,0, 10, tab_reg);
if (rc == -1) {
    fprintf(stderr, "% error-test\n", modbus_strerror(errno));
    return -1;
}
 
for (i=0; i < rc; i++) {
    char* nowtime = getDateTime();
    printf("%s:reg[%d]=%d (0x%X)\n",nowtime, i, tab_reg[i], tab_reg[i]);
}
 
modbus_close(ctx);
modbus_free(ctx);

  return 0;
}

char* getDateTime()
{
	static char nowtime[20];
	time_t rawtime;
	struct tm* ltime;
	time(&rawtime);
	ltime = localtime(&rawtime);
	strftime(nowtime, 20, "%Y-%m-%d %H:%M:%S", ltime);
	return nowtime;
}

编译:

cc -o main main.c -lmodbus -I ./

  • 编译过程中会出现缺少 .so 文件,在libmodbus-3.0.6文件夹下查找对应文件并 复制到/usr/local/lib目录下,并运行ldonfig

find -name "libmodbus.so.5"

  • 详细的libmodbus的用法参照

https://www.libmodbus.org/docs/v3.0.6/

modbus slave 模拟软件

ubuntu下使用libmodbus_第2张图片ubuntu下使用libmodbus_第3张图片

你可能感兴趣的:(ubuntu下使用libmodbus)