1.前言
Modbus是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。
2.移植步骤
第一,进入libmodbus目录下,在交叉编译器是最好加上–prefix参数,叫相关的库直接集中起来,方便拷贝到开发板相应的目录中去;
嵌入式开发板: #./configure --build=i686 --host=arm-none-linux-gnueabi --enable-static --prefix=/root/libmodbus-3.1.1/install/ && make install
x86机器 : #./configure && make install
第二,进入libmodbus/test目录,修改unit-test-client.c (modbus主机测试) 中的”/dev/ttyUSB1”,改成你测试的串口设备号 ctx = modbus_new_rtu("/dev/ttyUSB1", 115200, 'N', 8, 1);
同样地,修改unit-test-server.c (modbus从机测试) 中的”/dev/ttyUSB0”,改成你测试的串口设备号 ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'N', 8, 1);
改好后重先进行编译 #make clean
#make all
编译完后就生成了unit-test-client,unit-test-server两个可执行文件,
第三,运行两个程序 #./unit-test-client
#./unit-test-server
3.测试
总体测试图
主机测试信息
从机测试信息
注:在test目录下的类似unit-test-server这个不是可执行文件,而是一个脚本,他会调用test目录下的.lib/下的unit-test-server可执行文件。在PC中需要执行对应的脚本文件,而在嵌入式平台上却是执行可执行文件;
4.自定义代码测试主机
4.1 测试对象
modbus主机 -> linux -> unit-test-client
modbus从机 -> windows -> modbus slave
4.2 代码修改
修改unit-test-client.c程序
int main(int argc, char *argv[])
{
uint8_t *tab_rp_bits;
uint16_t *tab_rp_registers;
uint16_t *tab_rp_registers_bad;
uint16_t tab_reg[64];
modbus_t *ctx;
int i;
uint8_t value;
int nb_points;
int rc;
float real;
uint32_t ireal;
struct timeval old_response_timeout;
struct timeval response_timeout;
int use_backend;
ctx = modbus_new_rtu("/dev/ttyUSB0", 115200, 'E', 8, 1);
if (ctx == NULL) {
fprintf(stderr, "Unable to allocate libmodbus context\n");
return -1;
}
modbus_set_debug(ctx, TRUE);
modbus_set_slave(ctx, 1);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n",
modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
while(1)
{
printf("--------------------\n");
rc = modbus_read_registers(ctx,0,10,tab_reg);
if(rc == -1)
{ fprintf(stderr,"%s\n",modbus_strerror(errno));
return -1;
}
for(i=0; i<10; i++)
{
printf("reg[%d] = %d(0x%x)\n",14,tab_reg[i],tab_reg[i]);
}
usleep(1000000);
}
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
4.3 重新编译运行
#make clean
#make all
#./unit-test-client
4.4 测试对比分析
打开windows下的modbus slave,设置好相关参数,如下图
那么linux端的modbus主机打印信息
结论:数据吻合,测试正常