一、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);
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) {
modbus_reply(ctx, query, rc, mb_mapping);
} else if (rc == -1) {
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;
}
|