1、modbus简介
Modbus服务器:接收处理来自客户端的请求,并返回相应的响应;
Modbus客户端:向Modbus服务器发送请求,并接收服务器返回的响应的设备或程序;
2、modbus poll调试工具下载
modbus poll用于测试和调试Modbus从设备;Modbus Slave用来模拟从站设备,接收主站的命令包,回送数据包。
官网地址 Modbus test and simulation
使用方法参考 Modbus Slave和Modbus Poll的使用说明-CSDN博客
3、windows系统libmodbus库编译与安装
libmodbus库的编译与安装参考博客 [开源库的使用]libModbus编译及使用_libmodbus库-CSDN博客
注意:根据自己电脑配置,编译对应版本的modbus库,作者第一次编译win32位的,导致拷贝项目中运行时出现库计算机类型“win32”与目标计算机类型“×64”冲突以及无法解析外部链接库的错误。
4、libmodbus库的使用
步骤一:*.h、*.lib、*.dll文件拷贝
将libmodbus-master\src目录下所有.h文件、libmodbus-master\src\win32目录下的config.h文件、编译生成的modbus.dll与modbus.lib文件复制到项目对应文件夹下。
步骤二:导入lib库
QT中配置方式:
VS中配置方式:导入附加库目录及附加依赖项。
步骤三:libmodbus库的使用
参考链接 Modbus通讯开发随记1——LibModbus库的学习-CSDN博客
从机测试代码:
//----------------从机--------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "modbus.h"
int main(int argc, char *argv[]) {
int socket = -1;
uint8_t *query;
modbus_t *mb;
int ret;
_modbus_mapping_t *mb_mapping;
mb = modbus_new_tcp("127.0.0.1", 502);
query = (uint8_t *)malloc(MODBUS_TCP_MAX_ADU_LENGTH);
//modbus_mapping_new_start_address:分配寄存器阵列
if ((mb_mapping = modbus_mapping_new_start_address(0, 0, 0, 0, 15, 3, 0, 0)) == NULL) {
modbus_free(mb);
printf("new map failed: %s\n", modbus_strerror(errno));
return 0;
}
mb_mapping->tab_registers[0] = 0x1001;
mb_mapping->tab_registers[1] = 0x1002;
mb_mapping->tab_registers[2] = 0x1003;
socket = modbus_tcp_listen(mb, 1);
modbus_tcp_accept(mb, &socket);
printf("create modbus slave success\n");
while (1) {
do {/*轮询串口数据*/
ret = modbus_receive(mb, query);
} while (ret == 0);
if (ret > 0) {
printf("len=%02d\t", ret); /*%02d格式限定符,其中0表示变量宽度不足时以0作为填充,2表示显示宽度至少为2,d表示十进制整数*/
for (int i = 0; i < ret; ++i)
printf("%02x", query[i]);
printf("\n");
modbus_reply(mb, query, ret, mb_mapping);
}
else {
printf("quit the loop: %s\n", modbus_strerror(errno));
break;
}
}
modbus_mapping_free(mb_mapping);
modbus_close(mb);
free(query);
modbus_free(mb);
return 0;
}
主机测试代码:
//----------------主机--------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "modbus.h"
int main(int argc, char *argv[]) {
uint16_t table[3];
modbus_t *mt;
mt = modbus_new_tcp("127.0.0.1", 502);
if (modbus_connect(mt) == -1) {
modbus_free(mt);
printf("connect failed: %s\n", modbus_strerror(errno));
return 0;
}
while (1) {
//modbus_read_registers:读取寄存器数据
if (modbus_read_registers(mt, 0X0F, 3, table) == 3)
printf("read success: 0x%04x 0x%04x 0x%04x \n", table[0], table[1], table[2]);/*%04x格式限定符
,其中0表示变量宽度不足时以0作为填充,4表示显示宽度至少为4,x表示十六进制整数*/
else {
printf("read error: %s\n", modbus_strerror(errno));
break;
}
for (int i = 0; i < 3; ++i)
table[i]++;
//modbus_write_registers:写多个寄存器
if (modbus_write_registers(mt, 0X0F, 3, table) == 3)
printf("write success: 0x%04x 0x%04x 0x%04x \n", table[0], table[1], table[2]);
else {
printf("write error: %s\n", modbus_strerror(errno));
break;
}
Sleep(1000);
}
modbus_close(mt);
modbus_free(mt);
system("pause");
return 0;
}