基于libmodbus库的Qt上位机控制伺服电机
前言
是的,经过一次又一次的调试修改,今天终于可以实现简单的对伺服电机的控制。接下来,我需要对这段时间的工作做个梳理总结。
一、利用YZ-ACSD608测试电机
YZ-ACSD608软件是厂商给的上位机软件,一则用来调试伺服电机,二则用来设置电机运行的参数。
1 上位机软件界面介绍
从上图中可看出,该上位机的软件界面主要8部分组成:
(1) 波形显示图框:从上图看出,总共有4个波形,分别是蓝色—电流,绿色—输出脉冲,红色—当前转速,黑色——电压。
(2)电机运行参数显示框:用来显示电机在运行时的实时参数。
(3) 驱动器设置参数显示框:显示当前运转的模式,1表示位置模式,0表示速度模式;显示当前转向方向,0表示正转,1表示反转;显示使能设置,1表示使能。
(4)Modbus读取设置框:设置读取设备地址,一般设为1,设置读取驱动器数据的周期,以及是否读取。
(5)驱动器运行状态显示:此栏在运行后如没报警,则会显示运行正常。
(6)串口连接项:选取对应的串口号,点击连接串口。
(7)Modbus 控制参数显示框:显示驱动器内部的所有相关参数。
(8)Mobus 发送设置框:用于修改驱动器的参数,先选好参数的类型,再设定要参数数据,点击发送即可。
2 上位机控制过程
(1)将485转USB口插入电脑端,并安装USB转485驱动,在设备管理器中查到相应的COM4端,如下图所示。
(2)打开上位机软件,选择COM4端口,连接串口,此时可看到485的A、B口有小灯在接替闪烁;
(3)选择Modbus使能,参数数据输入1点发送;
(4)选择PU步数,参数数据输入40000点击发送。此时电机根据计算,有转动相应的角度。
二、使用串口助手测试电机
之所以选用串口助手来测试电机,主要是验证直接用16进制的代码控制电机,效果是否和上位机软件的一致,如果一致的话,那直接用代码控制则有效。
1.串口工具SSCOM
在串口工具SSCOM界面中,需要进行以下设置:
(1)选择端口号:此处应该选择COM4,可在设备管理器查找到对应的COM端口号;
(2)波特率设置为:19200
(3)勾选HEX显示,HEX发送
(4)在加校验码后的下拉选项中,选择Modbus CRC16
使用串口工具控制伺服电机转动的步骤:
(1)点击打开串口按钮;
(2)输入 01 06 00 00 00 01
点击发送,在显示框中可看到
在图中可看到,通讯通了,这串功能码是使能1的功能码。
(3)继续输入 01 10 00 0C 00 02 04 9C 40 00 00 ,(对应上面的40000)点击发送,则看到电机旋转相应角度。
对于以上代码的相关都在Modbus协议中和电机控制手册中有阐述。如下图
上图显示了相关功能的寄存器的地址。
下图显示写操作相关的Modbus协议,包括了使能和写脉冲数。
串口助手测试成功后,接下来就需要在Window端,使用Qt上位机与虚拟串口进行通讯测试,通过communication选项查看通讯的代码是否正确,如正确,则表示Qt上位机与虚拟串口通讯测试成功。
三、Qt上位机与虚拟串口通讯测试
虚拟串口采用Configure Virtual Serial Port Driver虚拟得到虚拟串口端COM1和COM2,并以Qt上位机为Mobus Master,使用下载的Modbus Slave作为从端,建立通讯连接。
首先,在设备管理器中查到,虚拟的串口号,如下图所示:
在进行通讯时,数据类型需要做一个转换,即脉冲数的数据是2个寄存器的数据组合在一起,即是由高16位和低16位数据组成的无符号32位的整数型,因此在定义输入脉冲数时,需要将它定义为uint32类型的数据,而在寄存器中赋值时,需要有一个将32位无符号整型数拆分成高16位和低16位的无符号整型数:
tab_reg[0]=(uint16_t)(0x0000FFFF&num_1);
tab_reg[1]=(uint16_t)((0xFFFF0000&num_1)>>16);
数据输入4000,Slave端收到的数据,通讯代码显示如下:
数据输入40000,Slave端收到的数据,通讯代码显示如下:
由于40000对应的16进制数为9C40,超出了无符号16位整型数的范围,因此显示是错误的数。
但是从通讯代码看,是正确的。
因此,Qt上位机的代码无误,可直接来对电机进行控制。
四、 Qt上位机控制伺服电机
实物图连接如下。
将485转USB线端插入电脑,在设备管理器中查询到COM端口号为COM4,在原Qt的cpp代码中,修改如下:
ctx = modbus_new_rtu("COM4",19200,'N',8,1);
......
运行Qt程序,先在文本框中输入1,点击Modbus使能按钮,然后在文本框中输入40000,再点击脉冲数按钮,电机转动相应角度。从而实现利用libmodbus库实现了Qt上位机与电机的Modbus通讯。
总结
故不积跬步,无以至千里。不积小流,无以成江海。如果没有之前对libmodbus库的编译和理解,没有在vs上的编译运行,没有在Windows端与虚拟串口的通讯,没有Modbus通讯协议的理解,那么实现此功能则完全不可能,但是接下来还需要将功能进行完善,另外还需要最后将Qt项目编译到嵌入式开发板中,这才是最终的目的。路漫漫其修远兮,吾将上下而求索。