摘要:ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。
ZMC408CE 高性能总线型运动控制器
ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。
ZMC408CE支持PLC、Basic、HMI组态三种编程方式。PC上位机API编程支持C#、C++、LabVIEW、Matlab、Qt、Linux、VB.Net、Python等接口。
ZMC408CE硬件功能特性:
1.支持8轴运动控制(脉冲+EtherCAT总线),EtherCAT同步周期可快至125us;
2.24路通用输入、16路通用输出,模拟量AD/DA各两路;
3.8路10MHz高速差分脉冲输出,总线轴、脉冲轴可混合插补;
4.高性能处理器,提升运算速度、响应时间和扫描周期等;
5.一维/二维/三维、多通道视觉飞拍,高速高精;
6.位置同步输出PSO,连续轨迹加工中对精密点胶胶量控制和激光能量控制等;
7.多轴同步控制,多坐标系独立控制等;
8.直线插补、任意空间圆弧插补、螺旋插补、样条插补等;
9.应用灵活,可PC上位机开发,也可脱机独立运行;
PCIE464M PCIe EtherCAT总线运动控制卡
PCIE464M是一款基于PCIe的PCI Express的EtherCAT总线运动控制卡,具有多项实时和高精度运动控制控制功能。
PCIE464M运动控制卡上自带16进16出,第三方图像处理工控机或PC无需额外配置IO数据采集卡和PLC,即可实现IPC形态的机器视觉运动控制一体机,简化硬件架构,节省成本,软硬件一体化。
PCIE464M硬件功能特性:
1.可选6-64轴运动控制,支持EtherCAT总线/脉冲/步进伺服驱动器;
2.联动轴数最高可达16轴,运动周期最小为100μs;
3.标配16进16出,其中4路高速锁存输入、4路高速PWM和12路高速硬件比较输出PSO;
4.支持PWM输出、1D/2D/3D PSO硬件位置比较输出、视觉飞拍、连续轨迹插补等;
5.支持30+机械手模型正逆解模型算法,比如SCARA、Delta、UVW、4轴/5轴 RTCP...;
6.支持掉电存储和掉电中断,多重加密,提供程序更安全机制;
7.8路单端脉冲轴、4路单端编码器轴;
8.具有一维、二维螺距补偿控制,实现更高的加工精度;
ECI2A18B 高性价比10轴运动控制卡
ECI2A18B是正运动推出的一款高性价比10轴脉冲型、模块化的网络型运动控制卡,采用优化的网络通讯协议可以实现实时的运动控制,同时支持多种通信协议,方便与其他工业控制设备连接和集成。安装配置相对便捷,适合于模块化和灵活性要求较高的控制系统。
ECI2A18B控制卡最大可扩展至12脉冲轴,支持8路高速输入和4路高速输出,集成丰富的运动控制功能,包含多轴点位运动、电子凸轮,直线插补,圆弧插补,连续插补运动等,满足多样化的工业应用需求。
ECI2A18B硬件功能特性:
1.支持6路差分脉冲轴+4路单端脉冲轴运动控制;
2.支持1路专用的手轮输入接口;
3.差分脉冲轴最大输出脉冲频率10MHz;
4.标配24+12进16+6出,其中支持4路高速锁存,4路高速PWM,2路高速硬件比较输出PSO(可选支持HW2功能);
5.可支持RTSys+其他高级上位机编程语言的混合编程支持;
6.支持RTBasic多任务编程;
一、RTSys示波器介绍
正运动RTSys软件提供了示波器采集与分析工具,通过该工具可以把系统内部的系统变量与数据转换成图形显示,便于研究各种信号的变化趋势与数据测量的过程。
示波器利用控制器内部处理的数据,把数据显示成波形,利用示波器可以显示各种不同的信号。
二、QT程序开发流程
1.在Qt Creator菜单选择“文件”→“新建文件或项目”,打开创建项目向导。选择Application项目集,创建Qt Widgets Application项目,设置项目名称和保存位置。
2.导入厂家提供的相关函数库及头文件。
(1)将zmotion.h和zauxdll2.h头文件、zauxdll.dll和zmotion.dll以及zmotion.lib和zauxdll.lib库复制到新建的项目文件夹中。
(2)在Qt Creator选择新建的Qt项目右击选择“添加库...”→“外部库”点击下一步,将刚才复制到项目文件夹上的zmotion.lib和zauxdll.lib库文件导入到项目中。
3.在Qt Creator下右击新建的Qt项目,选择“添加现有文件...”,将之前复制到项目文件下的头文件zmotion.h和zauxdll2.h添加到项目中。
三、相关指令介绍
1.相关BASIC指令介绍
(1)SCOPE -- 数据采样
(2)SCOPE_POS -- 采样点数
(3)TRIGGER -- 触发示波器
使用说明:
先使用SCOPE指令确定需要采集的数据、采集周期、数据存放位置及使能。(例如:SCOPE(ON,1,0,8000,MPOS(0),MSPEED(0),MPOS(1),MSPEED(1)),表示每间隔1个系统周期采集一次MPOS(0)、MSPEED(0)、MPOS(1)、MSPEED(1)的数据分别存储至被平均分割的TABLE(0)至TABLE(7999)中,如MPOS(0) → TABLE(0-1999)、MSPEED(0) → TABLE(2000-3999)、MPOS(1) → TABLE(4000-5999)、MSPEED(1) → TABLE(6000-7999)中),后续需要使用TRIGGER开始数据的抓取(如果需要使用连续采集需要带参数1如TRIGGER(1));
根据SCOPE_POS返回的值确定当前最新的数据保存至TABLE的何处(如SCOPE_POS的值为500表示最新的数据存放至TABLE(499)、TABLE(2499)、TABLE(4499)、TABLE(6499)中),根据上次与此次的最新数据存放位置即可确定此次需要加入至波形曲线中的内容,最后使用SCOPE(OFF)关闭数据采集。
RTSys示波器波形展示:
QT例程示波器波形展示:
2.上位机在线命令接口的使用
由于我们的函数库中暂时没有对上述的BASIC指令进行封装,所以需要通过在线命令这个万能的API接口进行上述BASIC指令的下发,下面给大家介绍一下ZAux_DirectCommand和ZAux_Execute这两个在线命令的API接口的使用。
通过在线命令下发BASIC指令的API接口有ZAux_DirectCommand(直接方式)和ZAux_Execute(缓冲方式)这两种。
①直接方式:该方式由PC直接下发BASIC指令至控制器,下发即执行,响应速度块,虽有部分BASIC指令不支持但仍然推荐使用。
②缓冲方式:该方式需要将BASIC指令放入缓冲列中等待执行,响应速度较慢但可以执行所有命令,只推荐在BASIC指令无法通过直接方式下发时使用。
例如:设置轴速度函数ZAux_Direct_SetSpeed(ZMC_HANDLE handle, int iaxis, float fValue)的源码如下:
/
Description: //设置轴速度,单位为units/s,当多轴运动时,作为插补运动的速度
Input: //卡链接handle
Output: //
Return: //错误码
/
int32 __stdcall ZAux_Direct_SetSpeed(ZMC_HANDLE handle, int iaxis, float fValue)
{
int i;
int32 iresult;
char cmdbuff[2048];
char cmdbuffAck[2048];
if( iaxis > MAX_AXIS_AUX)
{
return ERR_AUX_PARAERR;
}
//生成命令
sprintf(cmdbuff, "SPEED(%d)=%f", iaxis, fValue);
//调用命令执行函数
return ZAux_DirectCommand(handle, cmdbuff, cmdbuffAck, 2048);
}
四.例程原理及实现过程
1.连接控制器
代码说明:读取用户设置的IP地址并通过函数接口ZAux_OpenEth来连接控制器。
void MainWindow::on_ip_link_btn_clicked
{
int ret;
char * tmp_buff = new char[20];
QString str;
QString str_title;
//获取输入的控制器IP地址
str = ui->ip_list->currentText;
QByteArray ba = str.toLatin1;
tmp_buff = ba.data;
//判断控制器句柄是否为空,不为空则断开连接并置句柄为空
if(nullptr != g_handle)
{
//断开控制器的连接
ZAux_Close(g_handle);
g_handle = nullptr;
setWindowTitle(QString::fromLocal8Bit("示波器"));
}
//连接控制器
ret = ZAux_OpenEth(tmp_buff,&g_handle);
if( 0 != ret)
{
QMessageBox::warning(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("连接失败"));
}
else
{
QMessageBox::warning(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("连接成功"));
str_title = windowTitle + tmp_buff;
setWindowTitle(str_title);
}
}
2.开启示波器
代码说明:读取用户设置的示波器参数,通过字符串拼接的方式设置scope指令的参数,trigger(1)指令开启连续采集,由于ZAux_DirectCommand暂时不支持这两个指令的下发,所以通过ZAux_Execute下发拼接好的basic指令。
void MainWindow::on_start_scope_btn_clicked
{
int ret;
QString cmd;
QString temp;
char tmp_commandback_buff[20480] = {0};
if(nullptr == g_handle)
{
QMessageBox::warning(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("请先连接控制器"));
qDebug
return ;
}
//获取设置的通道数、采集周期数和采集间隔周期
channel_num = ui->channel_num->currentText.toUInt;
current_acqu_cycle = ui->acquisition_cycle->text.toUInt;
current_time_period = ui->time_period->currentText.toUInt;
/*拼接示波器所需的参数SCOPE(enable, period, table_start, table_stop, p0 [,p1 [,p2 [,p3 [,p4 [,p5 [,p6 [,p7]]]]]]])
enable:使能与否
period:采集周期间隔
table_start:采样数据存储在TABLE的起始位置
table_stop:TABLE结束位置,减去起始位置为采样个数
p0~p7:采样数据类型,等分存储在TABLE范围
拼接采集周期间隔及采样的起始终止TABLE地址*/
cmd = QString("scope(1,%1,0,%2,").arg(current_time_period).arg(current_acqu_cycle * channel_num - 1);
//拼接需采集的数据类型
for(int i = 0; i
{
QWidget *widgetSex=ui->tableWidget->cellWidget(i,2);
QComboBox *sex=(QComboBox*)widgetSex;
cmd.append(sex->currentText);
cmd.append("(");
cmd.append(ui->tableWidget->item(i,1)->text);
cmd.append(")");
cmd.append(",");
}
cmd.chop(1);
cmd.append(") ");
cmd.append("trigger(1)");
//清除波形图中的数据
for(int i = 0; i
{
ui->customPlot->graph(i)->data.data->clear;
ui->customPlot->xAxis->setRange(0, 5 * customplot_x_scale);
}
//重绘波形图
ui->customPlot->replot;
//通过ZAux_Execute函数接口下发上面拼接的BASIC指令
ret = ZAux_Execute(g_handle, QByteArray(cmd.toLatin1).data, tmp_commandback_buff, 20480);
if(ret == 0)
{
//把波形图参数信息传递给获取table数据至波形图的子线程中
emit emit_para_int(current_acqu_cycle, current_time_period, channel_num, customplot_x_scale);
//如果示波器已开启则先停止获取table数据至波形图的子线程再开启线程
if(scope_status == 1)
{
emit GetDataStop;
GetDataThread.wait;
GetDataThread.start;
}
else
{
//开启获取table数据至波形图的子线程
GetDataThread.start;
scope_status = 1;
}
}
else
{
qDebug
}
}
3.读取对应table中的数据并显示
代码说明:根据上次的TABLE数据更新位置与此次使用SCOPE_POS返回的最新数据存放的TABLE位置确定此次使用ZAux_Direct_GetTable获取控制器中TABLE寄存器中的数据位置,将从TABLE寄存器中获取到的数据加载进显示的曲线,最后重新绘制图形。
void GetData::SetData(int Type, int Num)
{
int ret;
//Type为0则表示当前采样至的table位置比上次的要大,只需采集两者之间的table数据即可
if(Type == 0)
{
//获取table中的数据
ret = ZAux_Direct_GetTable(g_handle, start_pos + current_acqu_cycle * Num, total_pos, NewData);
if(ret == 0)
{
//向波形曲线中写入从table中获取的数据
for(int i = 0;i
{
CustomPlot->graph(Num)->addData(CustomPlot->graph(Num)->dataCount * (current_time_period / 1000.0), NewData[i]);
}
}
else{
qDebug
}
}
//Type为1则表示当前采样至的table位置比上次的要小,需采集上次采样至的table位置至table结束位置,还需采集table开始位置至当前采样至的位置
else if(Type == 1)
{
//获取table中的数据
ret = ZAux_Direct_GetTable(g_handle, start_pos + current_acqu_cycle * Num, current_acqu_cycle - start_pos, NewData);
if(ret == 0)
{
//向波形曲线中写入从table中获取的数据
for(int i = 0;i
{
CustomPlot->graph(Num)->addData(CustomPlot->graph(Num)->dataCount * (current_time_period / 1000.0), NewData[i]);
}
}
else{
qDebug
}
if(current_pos != 0)
{
//获取table中的数据
ret = ZAux_Direct_GetTable(g_handle, current_acqu_cycle * Num, current_pos, NewData);
if(ret == 0)
{
//向波形曲线中写入从table中获取的数据
for(int i = 0;i
{
CustomPlot->graph(Num)->addData(CustomPlot->graph(Num)->dataCount * (current_time_period / 1000.0), NewData[i]);
}
}
else{
qDebug
}
}
}
}
4.例程使用与效果展示
(1)连接控制器,先通过下拉框选择控制器IP地址或直接输入IP地址,之后连接即可。
(2)设置参数开启示波器,先设置示波器参数再开启示波器。
(3)停止示波器,可通过滚动条调整显示位置,先停止示波器再通过滚动条调整显示位置,可修改波形参数使波形显示效果更好。
5.教学视频讲解:
完整代码获取地址
▼
本次,正运动技术EtherCAT运动控制器实时数据的Qt示波器,就分享到这里。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等。
来源:正运动技术