创客神器NanoPi
直播中

zxl_zxl

8年用户 502经验值
擅长:自动化生产线 自动化生产线 模拟技术 自动化生产线 测量仪表 自动化生产线 EMC/EMI设计 自动化生产线 嵌入式技术 自动化生产线 自动化生产线 自动化生产线 自动化生产线 自动化生产线 处理器/DSP 自动化生产线 自动化生产线 自动化生产线 自动化生产线 自动化生产线 自动化生产线 EMC/EMI设计 嵌入式技术 处理器/DSP 自动化生产线 EMC/EMI设计 嵌入式技术 处理器/DSP EMC/EMI设计 嵌入式技术 处理器/DSP 嵌入式技术 处理器/DSP
私信 关注
[话题]

【NanoPi M2试用体验】之Modbus-RTU主站开发

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虚拟机,如图所示:
QQ图片20160522143708.png
libmodbus-3.0.6.tar.gz拷贝到samba共享文件夹
QQ图片20160522143922.png
在Linux命令行终端切入共享文件夹,输入命令:
tar -xzvf libmodbus-3.0.6.tar.gz,生成libmodbus源码文件夹,如图所示:
无标题13.png
输入命令:cd libmodbus,如图示所示:
无标题14.png
输入命令:./autogen.sh
生成configure文件,如图示:
无标题15.png
输入命令:./configure && make install
命令完成后如图示:
无标题16.png
生成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 Existing Files...”,如图所示:
无标题3.png
选择libmodbus文件夹:
QQ图片20160522152718.png
修改libmodbus文件夹下的modbus-private.h和modbus.c代码中的”#include”为”#include”,保存。
设计界面如图示:
QQ图片20160522150608.png
右击上图中的按钮,选择“goto slot...”,如下图所示:
无标1.png
弹出对话框,选择第一项,如所所示:
无标题2.jpg
点击“OK”按钮,创建该按钮的命令执行函数,输入代码如下图所示:
无标题8.png
详细代码如下:
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文件中输入头文件:
QQ图片20160522152338.png
至此,QT项目工程创建完毕,下面开始搭建硬件环境。
3. 硬件测试环境搭建
由于Nanopi M2 40针扩展接口中支持UART3接口,我们就将UART3接口与外围威廉希尔官方网站 连接。(需要注意的是,UART3接口的驱动程序文件为ttyAMA2,所以我们在上述程序中直接将打开的文件设置为“/dev/ttyAMA2”,请根据自己的实际情况适当修改)。
M2扩展的UART3接口为TTL电平,无法与PC机RS232接口电平直连,我们需要一个UART TTL电平转RS232电平的扩展板,可以使用友善官方的扩展板,也可以使用其他第三方的扩展板,本人采用的是自己手头现有的一块的TTL转RS232电平的接口板,如图示:
20160522_154115.jpg
由于该转换板已经将RXD TXD做成交叉连接方式,所以本试验的连接如下
转换板                       NanoPi M2
VCC                                                       02(5VPower)
RXD                                                       10(RX3)
TXD                                                       08(TX3)
GND                                                       06(DGND)
连接后的威廉希尔官方网站 如图所示:
20160525_232338.jpg
4. PC端设置
由于手头没有相关的Modbus从站仪表,我们通过在PC端安装一个模拟软件,来测试我们以上的基于QT的测试程序是否可用。
下载一个Modbus Slave软件(试用版),然后启动该软件,如图所示:
无标题4.png
在菜单“Setup”中,选择“Slave Definition...”,设置如下:
无标题9.png
在“connection”菜单中点击“connect”,设置通讯参数如下:
无标题10.png
然后设置从站的寄存器数据如下图示:
无标题12.png
5. 启动测试
Modbus Slave软件根据上述设置,处于连接状态后,我们启动QT测试项目,点击“以modbus rtu方式读取地址1中前10个寄存器值”按钮,通讯结果如图所示:
20160525_235907.jpg
出现结果“10,11,12,13,14,15,16,17,18,19”的对话框,说明我们的测试成功了。
对于本项目而言,我就可以通过Modbus-RTU通讯协议,RS232转RS485电气接口与市面上流行通用的称重仪表实现数据互联,达到了实时采集水泥配料的动态数据。而对于其他的应用,有了Modbus-RTU功能,基本上可以与车间内的绝大多数第三方设备、仪表通信,实现数据的共享,在通过Nanopi M2的有线或无线以太网,将采集的数据中继到其他主机或服务器,让车间的独立设备真正“动”起来,解决了车间级设备的“信息孤岛”问题。

回帖(4)

jinyi7016

2016-5-26 10:43:52
这个lib是不是所有的功能码都支持呢
举报

zxl_zxl

2016-5-26 10:48:19
引用: jinyi7016 发表于 2016-5-26 10:43
这个lib是不是所有的功能码都支持呢

都支持,功能很强大
举报

mrplplplpl

2016-5-28 08:43:36
谢谢楼主的帖子,学习了
举报

111

2017-8-2 17:57:43
学习学习
举报

更多回帖

发帖
×
20
完善资料,
赚取积分