libmodbus3.1.6版本搭建开发环境&&demo
- 解压:tar -zxvf libmodbus-3.1.6.tar.gz
- 创建安装目录:mkdir install
- 进入源文件里面:cd libmodbus-3.1.6
- 配置环境安装路径和交叉编译链:
./configure --host=交叉编译工具链 --enable-static --prefix=安装路径
安装路径:/home/hison/install/
交叉编译工具链:mipsel-linux-
交叉工具链地址查找方法:新打开一个标签页 输入命令 mipsel-linux-gcc -v
也就是查看自己的交叉工具链版本号 里面的目标环境就是交叉工具链
-
进入cd /libmodbus-3.1.6目录,执行 ./configure运行出现如下界面即可进行下一步
6、执行之后/libmodbus-3.1.6目录出现个Makefile,执行make
-
安装到工作路径:make install
-
大功告成 lib动态库即可大显身手哦!
Modbus_TCP 客户端小demo
#include <stdio.h>
#include "modbus.h"
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(int argc,char *argv[])
{
int i = 0;
int s, ser;
int rc = 0;
//创建套接字ctx
modbus_t *ctx = NULL;
//绑定 ip, port
ctx = modbus_new_tcp("192.168.1.2", 502);
//定义从机地址
modbus_set_slave(ctx, 2);
//监听从机连接
ser = modbus_tcp_listen(ctx, 128);
//定义映射内存空间
modbus_mapping_t *mb_mapping = NULL;
//modbus数据存储
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];
for(;;)
{
/*
接受客户端发来的信息 对于此函数本人的理解是这样的
服务器阻塞客户端连接
不能连续阻塞Listen就相当于中介 accept具体的卖家 手头有我要的东西
中介只负责往里接客 卖家就负责将自己的货卖出去
*/
s = modbus_tcp_accept(ctx, &ser);
printf("Master3:Connect to client's get ready!\n");
//映射虚拟内存
mb_mapping = modbus_mapping_new(MODBUS_MAX_READ_BITS, 0,
MODBUS_MAX_READ_REGISTERS, 0);//包含保持位、输入位、保持寄存器、输入寄存器
if (mb_mapping == NULL) {
fprintf(stderr, "Failed to allocate the mapping: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
//初始化几个保持寄存器
mb_mapping->tab_registers[0] = 1;
mb_mapping->tab_registers[1] = 2;
mb_mapping->tab_registers[2] = 3;
mb_mapping->tab_registers[3] = 4;
mb_mapping->tab_registers[4] = 5;
mb_mapping->tab_registers[5] = 6;
/*mb_mapping1 = modbus_mapping_new(0, MODBUS_MAX_WRITE_BITS,
0, MODBUS_MAX_WRITE_REGISTERS);
if (mb_mapping1 == NULL) {
fprintf(stderr, "Failed to allocate the mapping1: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}*/
for(;;)
{
/*
网络OSI模型 总共分为7层:
应用层 表示层 会话层 物理层 网络层 数据链路层 传输层
TCP/IP模型
应用层 物理层 网络层(IP层) 传输层(网络接口层)
*/
//MODBUS CTRL PROGRAM
memset(query, 0, sizeof(query)); //对寄存器清零
rc = modbus_receive(ctx, query); //接受信息函数
if (rc > 0) {
for(;i<12;i++){ //查看modbus协议码 判断功能码所在内存
printf("query[%d]=%d(0x%x)\n",i,query[i]);}
int rc = modbus_reply(ctx, query, rc, mb_mapping); //响应信息函数
if(rc==-1)
{
fprintf(stderr, "Write err: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
if(query[7]=0x03)
{
//保持寄存器
}
else if(query[7]==0x04)
{
//输入寄存器
}
}
else if (rc == -1) {
//Connection closed by the client or error
printf("Quit the loop2: %s\n", modbus_strerror(errno));
break;
}
}
}
close(s); //结束从机连接
modbus_close(ctx);
modbus_free(ctx);
modbus_mapping_free(mb_mapping); //释放申请的虚拟内存空间
return 0;
}
此程序仅限借鉴,希望各位大佬多提点建议,本人第一次解协议,modbus是工业通用的协议之一,默认端口502,好了 就是这些了。