NanoPi M2试用体验之Modbus-RTU主站开发
本菜鸟之前的几篇使用报告介绍了基于NanoPi M2无线网卡设置、NFS文件系统搭建、Mysql安装、Mysql可视化配置,以及基于QT的Mysql数据编程数据操作,以上这些报告当然不是独立的,每一篇报告都是基于本人关于板卡申请时,关于相关项目的一步一步实现过程,本篇报告介绍关于水泥搅拌站项目的一个关键核心部分:Modbus通讯。
Modubus通讯是工业应用领域使用非常广泛的一种基于串口的上层通讯协议,通过对底层串口信息的组合传输、解析、CRC校验,大大提高数据传输的准确性和数据的可靠性。
自从 1979 年出现工业串行链路的事实标准以来, MODBUS 使成千上万的自动化设备能够
通信。当前主流PLC控制器、传感器仪表均提供了对Modus协议支持,Modbus通讯协议与Profibus DP、CanOpen、DeviceNet并列为事实上的工业标准通讯标准协议,而Modbus通讯协议又具有开发简单、承载要求低,从51
单片机到
ARM Cortex处理器,再到X86 PC,只要以上处理器支持串口通讯,就可自定义编程实现Modbus通讯协议。
尽管我们可以Modbus协议标准自定义协议的实现,但是存在稳定性和可移植性的问题。目前开源Modbus协议源码的主要有FreeModbus和libmodbus,通过应用,我个人感觉libmodbus的平台移植性可开发快速性更好,所以本篇报告主要讲解基于libmodbus的开发。
modbus通讯协议又分为:Modbus-RTU、Modbus-ASCII、Modbus-TCP,由于多数控制仪表主要支持Modbus-RTU、Modbus-TCP,本篇报告主要介绍Modbus-RTU通讯协议测试程序的开发。
关于Modbus-RTU的更加详细介绍请自己搜索了解。
1.下载、配置libmodbus
libmodbus的下载地址:http://libmodbus.org/download/
当前稳定版本的最新版为3.0.6,我们基于这个版本开发。
下载源码后,通过samba将文件拷贝到Linux虚拟机,如图所示:
将 libmodbus-3.0.6.tar.gz拷贝到samba共享文件夹
在Linux命令行终端切入共享文件夹,输入命令:
tar -xzvf libmodbus-3.0.6.tar.gz,生成libmodbus源码文件夹,如图所示:
输入命令:cd libmodbus,如图示所示:
输入命令:./autogen.sh
生成configure文件,如图示:
输入命令:./configure && make install
命令完成后如图示:
生成config.h文件。
将src文件夹下的所有.h和.c文件,以及上一步生成的config.h文件拷贝通过NFS拷贝到M2的文件系统,如执行命令:
sudo mount -t nfs 192.168.1.xxx:nfsshare -onolock
sudo mkdir /libmodbus
cp ./src/*.h /mnt/libmodbus
cp ./src/.c /mnt/libmodbus/
cp config.h /mnt/libmodbus
2. 创建QT测试项目
搭建M2的硬件运行环境,开机启动系统,启动QTCreator,创建libmodbustest工程。项目创建结束后,通过命令行将libmodbus中的文件拷贝到项目目录下:
cp -r /nfsshare/libmodbus 项目文件夹路径
将libmodbus文件夹中文件添加到项目中:
右击项目名称,选择“Add Exis
ting Files...”,如图所示:
选择libmodbus文件夹:
修改libmodbus文件夹下的modbus-private.h和modbus.c代码中的”#include”为”#include”,保存。
设计界面如图示:
右击上图中的按钮,选择“goto slot...”,如下图所示:
弹出对话框,选择第一项,如所所示:
点击“OK”按钮,创建该按钮的命令执行函数,输入代码如下图所示:
详细代码如下:
modbus_t *mb;
uint16_t tab_reg[32]={0};
mb = modbus_new_rtu("/dev/ttyAMA2", 9600, 'N', 8, 1); //相同的端口只能同时打开一个
modbus_set_slave(mb, 17); //设置modbus从机地址
modbus_connect(mb);
struct timeval t;
t.tv_sec=0;
t.tv_usec=1000000; //设置modbus超时时间为1000毫秒
modbus_set_response_timeout(mb, &t);
int regs=modbus_read_registers(mb, 0, 10, tab_reg);
QMessageBox::about(NULL, "报告", QString("Rtu读取寄存器的个数:%1").arg(regs));
QString qs =QString("%1n%2n%3n%4n%5n%6n%7n%8n%9n%10n").arg(tab_reg[0]).arg(tab_reg[1]).arg(tab_reg[2]).arg(tab_reg[3]).arg(tab_reg[4]).arg(tab_reg[5]).arg(tab_reg[6]).arg(tab_reg[7]).arg(tab_reg[8]).arg(tab_reg[9]);
QMessageBox::information(this,"Info",qs);
modbus_close(mb);
modbus_free(mb);
输入以上代码后,在widget.cpp文件中输入头文件:
至此,QT项目工程创建完毕,下面开始搭建硬件环境。
3. 硬件测试环境搭建
由于Nanopi M2 40针扩展接口中支持UART3接口,我们就将UART3接口与外围
威廉希尔官方网站
连接。(需要注意的是,UART3接口的驱动程序文件为ttyAMA2,所以我们在上述程序中直接将打开的文件设置为“/dev/ttyAMA2”,请根据自己的实际情况适当修改)。
M2扩展的UART3接口为TTL电平,无法与PC机RS232接口电平直连,我们需要一个UART TTL电平转RS232电平的扩展板,可以使用友善官方的扩展板,也可以使用其他第三方的扩展板,本人采用的是自己手头现有的一块的TTL转RS232电平的接口板,如图示:
由于该转换板已经将RXD TXD做成交叉连接方式,所以本试验的连接如下
转换板 NanoPi M2
VCC 02(5VPower)
RXD 10(RX3)
TXD 08(TX3)
GND 06(DGND)
连接后的威廉希尔官方网站
如图所示:
4. PC端设置
由于手头没有相关的Modbus从站仪表,我们通过在PC端安装一个模拟软件,来测试我们以上的基于QT的测试程序是否可用。
下载一个Modbus Slave软件(试用版),然后启动该软件,如图所示:
在菜单“Setup”中,选择“Slave Definition...”,设置如下:
在“connection”菜单中点击“connect”,设置通讯参数如下:
然后设置从站的寄存器数据如下图示:
5. 启动测试
Modbus Slave软件根据上述设置,处于连接状态后,我们启动QT测试项目,点击“以modbus rtu方式读取地址1中前10个寄存器值”按钮,通讯结果如图所示:
出现结果“10,11,12,13,14,15,16,17,18,19”的对话框,说明我们的测试成功了。
对于本项目而言,我就可以通过Modbus-RTU通讯协议,RS232转RS485电气接口与市面上流行通用的称重仪表实现数据互联,达到了实时采集水泥配料的动态数据。而对于其他的应用,有了Modbus-RTU功能,基本上可以与车间内的绝大多数第三方设备、仪表通信,实现数据的共享,在通过Nanopi M2的有线或无线以太网,将采集的数据中继到其他主机或服务器,让车间的独立设备真正“动”起来,解决了车间级设备的“信息孤岛”问题。