Modbus-tcp通信例程

一、modbus移植

1.源码下载

(1)官方下载源码:https://libmodbus.org/download/

2.编译准备

编译环境:

VMware® Workstation 15 Pro
Ubuntu18.04

交叉编译工具:
arm-fsl-linux-gnueabi-gcc或者arm-linux-gnueabihf-gcc

3.交叉编译

1.解压libmodbus-3.1.7.tar.gz压缩包

tar -zxvf libmodbus-3.1.7.tar.gz

在这里插入图片描述
2.在当前源码同级目录创建install

mkdir install

在这里插入图片描述
3.进入“libmodbus-3.1.7”文件夹,分别执行如下三条命令,完成交叉编译

1. ./configure --host=arm-fsl-gnueabihf --prefix=/home/forlinx/install --enable-shared --enable-static
2. make
3. make install

*说明:–host //指定交叉编译链 --prefix= //指定交叉编译完成后生成的文件的存放路径,即安装位置。如果不指定则默认安装在/usr/local/目录下

4.库移植

1.进入到install/lib里面,将libmodbus.so libmodbus.so.5 libmodbus.so.5.1.0打包

tar -cjvf libmodbus.tar.bz2 libmodbus.so  libmodbus.so.5  libmodbus.so.5.1.0

在这里插入图片描述
2.将包放到板子里面,解压到usr/lib

tar -xjvf libmodbus.tar.bz2 -C /usr/lib

在这里插入图片描述
移植完成!

二、modbus服务端构建

1.创建源码 //见附录

2.交叉编译服务端源码

现将/install/include/modbus/里面的头文件拷到应用源码文件
然后交叉编译

arm-fsl-linux-gnueabi-gcc random-test-server.c -o modbustest  -L ~/源工具/modbus/install/lib/ -lmodbus   

//arm-fsl-linux-gnueabi-gcc 交叉编译器, random-test-server.c 源码, modbustest 编译后的名字, -L 指定库文件, -lmodbus 指定头文件

3.将modbustest放到板子里

4.给modbustest赋权限

chmod 777 modbustest

5.查看网络端口

netstat -a -n

在这里插入图片描述

6.运行服务端程序

./modbustest &

7.查看网络端口

netstat -a -n //可以发现已经有1502端口,并处于监听状态
在这里插入图片描述

三、modbus poll工具模仿客户端测试

仿真软件下载地址:file:///D:/ruanjian/Modbus%20Poll/quick.html

打开Modbus后,按F3
在这里插入图片描述

点击下图红框位置,
在这里插入图片描述

之后点ok
在这里插入图片描述

在打开之前,需要先运行ARM板子里面的modbus服务端程序
打开成功,如下图
在这里插入图片描述

当退出连接时,自动关闭服务端程序
在这里插入图片描述

*:本例程只是简单的modbus-tcp测试例程,modbus-rtu类似

附:modbus服务端源码

#include <stdio.h>
#ifndef _MSC_VER
#include <unistd.h>
#endif
#include <stdlib.h>
#include <errno.h>

#include "modbus.h"

int main(void)
{
    int s = -1;
    modbus_t *ctx;
    modbus_mapping_t *mb_mapping;

    ctx = modbus_new_tcp("172.16.0.129", 1502);     //172.16.0.129填写自己板子上IP(服务器IP),1502写自己想开辟的端口
    /* modbus_set_debug(ctx, TRUE); */

    mb_mapping = modbus_mapping_new(500, 500, 500, 500);
    if (mb_mapping == NULL) {
        fprintf(stderr, "Failed to allocate the mapping: %s\n",
                modbus_strerror(errno));
        modbus_free(ctx);
        return -1;
    }

    s = modbus_tcp_listen(ctx, 1);
    modbus_tcp_accept(ctx, &s);

    for (;;) {
        uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
        int rc;

        rc = modbus_receive(ctx, query);
        if (rc > 0) {
            /* rc is the query size */
            modbus_reply(ctx, query, rc, mb_mapping);
        } else if (rc == -1) {
            /* Connection closed by the client or error */
            break;
        }
    }

    printf("Quit the loop: %s\n", modbus_strerror(errno));

    if (s != -1) {
        close(s);
    }
    modbus_mapping_free(mb_mapping);
    modbus_close(ctx);
    modbus_free(ctx);

    return 0;
}
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,我明白了。关于你的问题,我可以提供一些基本思路。 Modbus是一种常用的通信协议,用于连接工业自动化设备,其中Modbus-TCP是基于TCP协议的Modbus协议。从站例程库的程序是指在Modbus-TCP通信中作为从站的程序库。 针对你的需求,基于Linux C,你可以使用一些现有的开源库来实现Modbus-TCP从站,如libmodbus。这个库提供了基本的Modbus协议支持,并且易于使用。 下面是一个简单的例程,使用libmodbus实现Modbus-TCP从站。 ```c #include <modbus.h> int main(void) { modbus_t *ctx = modbus_new_tcp("127.0.0.1", 502); // 创建一个TCP上下文 modbus_set_slave(ctx, 1); // 设置从站地址 modbus_tcp_listen(ctx, 1); // 启动监听 uint8_t* tab_registers = calloc(32, sizeof(uint16_t)); // 创建寄存器数组 while (1) { /* 等待连接 */ modbus_tcp_accept(ctx, &ctx); /* 处理数据 */ int rc = modbus_receive(ctx, tab_registers); if (rc > 0) { /* 解析数据 */ modbus_reply(ctx, tab_registers, rc, ctx); } else if (rc == -1) { /* 连接断开 */ break; } } free(tab_registers); modbus_close(ctx); modbus_free(ctx); return 0; } ``` 这个例子的基本思路是创建一个TCP上下文,设置从站地址和监听,然后等待连接。当连接建立后,处理数据并响应客户端请求。 需要注意的是,这个例子只是一个简单的实现,实际使用中可能还需要进行更多的定制和调整。 希望这些信息能对你有所帮助。如果还有其他问题,请继续向我提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北极……星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值