继前面开发环境设置和libmodbus库的移植后,本文主要介绍通过米尔-全志T113-i开发板实现与modbus设备的连接和操作。
一、设备简介
刚好手头有个modbus温度传感设备。
各种参数也挺好,就直接拿来用了。
二、程序设计
目标功能就是读取温度传感设备的温度,libmodbus库提供了相关API,跟网络编程的socket一样好用。
涉及的主要API包括:modbus_new_rtu、modbus_set_slave、modbus_read_registers和modbus_close 以及 modbus_free等接口。顾名思义,各种API的功能都很清晰。
具体程序功能包括周期性读取连接到米尔-全志T113-i开发板上的温度传感器,源码如下:
#include < errno.h > #include < modbus.h > #include < stdio.h > #include < stdlib.h > #include < string.h > #include < unistd.h > int main(int argc, char *argv[]) { uint16_t tab_reg[2]; modbus_t *ctx; int i; int rc; uint32_t *ireal; ctx = modbus_new_rtu("/dev/ttyAS4", 115200, 'N', 8, 1); if (ctx == NULL) { fprintf(stderr, "Unable to allocate libmodbus contextn"); return -1; } modbus_set_debug(ctx, TRUE); modbus_set_slave(ctx, 1); if (modbus_connect(ctx) == -1) { fprintf(stderr, "Connection failed: %sn", modbus_strerror(errno)); modbus_free(ctx); return -1; } while(1) { printf("--------------------n"); rc = modbus_read_registers(ctx, 0x0000, 1, tab_reg); if(rc == -1) { fprintf(stderr,"%sn",modbus_strerror(errno)); return -1; } for(i=0; i< 2; i++) { printf("reg[%d] = %d(0x%x)n",i,tab_reg[i],tab_reg[i]); } ireal = (uint32_t *)tab_reg; printf("Resd data %f n", (*ireal)/10.0); usleep(1000000); } modbus_close(ctx); modbus_free(ctx); return 0; }
其它Modbus的协议在此不再接受,网络上到处都是。
三、功能执行
首先根据线序连接好温度传感器和米尔-全志T113-i开发板。
编译好源码。
root@EliteDesk800:~/libmodbus-3.1.10/tests$ make make all-am make[1]: Entering directory '/home/libmodbus-3.1.10/tests' CC mod-client.o CCLD mod-client make[1]: Leaving directory '/home/libmodbus-3.1.10/tests' root@EliteDesk800:~
再将编译后的可执行程序SCP至米尔-全志T113-i开发板上,chmod + x后再执行。
其中的debug信息是modbus_set_debug函数设置的结果打印log。
根据执行结果,读出的温度OK。
四、结论
1、米尔-全志T113-i开发板提供了丰富的接口和稳定的操作系统环境,很适合工业控制软件程序开发;
2、依托libmodbus这个modbus协议库,对于linux应用下的modbus通信开发,简直就是一款神器,能够极大的方便工业控制程序的开发。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !