EtherCAT运动控制器上位机之Python+Qt(一):链接与单轴运动

news2024/11/17 7:29:40

ZMC408CE硬件介绍

ZMC408CE是正运动推出的一款多轴高性能EtherCAT总线运动控制器,具有EtherCAT、EtherNET、RS232、CAN和U盘等通讯接口,ZMC系列运动控制器可应用于各种需要脱机或联机运行的场合。

在这里插入图片描述

ZMC408CE支持8轴运动控制,最多可扩展至32轴,支持直线插补、任意圆弧插补、空间圆弧、螺旋插补、电子凸轮、电子齿轮、同步跟随等功能。

ZMC408CE支持PLC、Basic、HMI组态三种编程方式。PC上位机API编程支持C#、C++、LabVIEW、Matlab、Qt、Linux、VB.Net、Python等接口。

在这里插入图片描述

ZMC408CE支持8轴运动控制,可采用脉冲轴(带编码器反馈)或EtherCAT总线轴,通用IO包含24路输入口和16路输出口,部分IO为高速IO,模拟量AD/DA各两路,EtherCAT最快125us的刷新周期。

ZMC408CE支持8个通道的硬件比较输出、硬件定时器、运动中精准输出,还支持8通道PWM输出,对应的输出口为OUT0-7,支持8个通道同时触发硬件比较输出。

PCIE464M硬件介绍

PCIE464M是一款基于PCIe的PCI Express的EtherCAT总线运动控制卡,具有多项实时和高精度运动控制控制功能。

在这里插入图片描述

用户可直接将PCIE464M嵌入标准PC机实现高性能的EtherCAT运动控制功能,实现高精多轴同步控制,EtherCAT控制周期最小可达100us!

PCIE464M内置多路高速IO输入输出,可满足用户的多样化高速IO应用需求,如:高速色标锁存、高速PWM、多维位置比较输出PSO、视觉飞拍、速度前瞻、编码器位置检测等应用。

在这里插入图片描述

PCIE464M运动控制卡上自带16进16出,第三方图像处理工控机或PC无需额外配置IO数据采集卡和PLC,即可实现IPC形态的机器视觉运动控制一体机,简化硬件架构,节省成本,软硬件一体化。

一、Python语言开发流程

本文案例Python开发环境:

  • 操作系统环境:Win10_64位
  • Python版本:python-3.10.10-amd64.exe
  • Pycharm版本:pycharm-community-2024.1.3.exe

1)安装汉化包:点击file → setting → plugins,然后搜索Chinese中文包。

在这里插入图片描述

2)python解析器安装Pyside2软件包(QT库):File → Settings → Project pythonProject。

在这里插入图片描述

3)配置自定义控件:File → Settings → Tools → External Tools点击+新增自定义工具。

在这里插入图片描述

自定义QtDesigner

目的:用于生成.ui文件

Name:QtDesigner

Group:Qt

Program:PySide2安装路径下的 designer.exe 路径

例如:C:\Python\Python39\Scripts\pyside2-designer.exe

Working directory P r o j e c t F i l e D i r ProjectFileDir ProjectFileDir

自定义Pyside2-uic

目的:将制作好的.ui文件转化为.py文件

Name:Pyside2-uic

Group:Qt

Program:Python安装目录下Scripts\pyside2-uic.exe

例如:C:\Python\Python39\Scripts\pyside2-uic.exe

Arguments F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension.py

Working directory F i l e D i r FileDir FileDir

自定义Pyside2-rcc

目的:将图片文件转化为.py文件

Name:Pyside2-rcc

Group:Qt

Program:Python安装目录下Scripts\pyside2-rcc.exe

例如:C:\Python\Python39\Scripts\pyside2-rcc.exe

Arguments F i l e N a m e FileName FileName -o F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension_rc.py

Working directory F i l e D i r FileDir FileDir

4)配置好自定义控件后,后续可以直接在pycharm菜单中使用。

在这里插入图片描述

二、Python+Qt进行运动控制开发

1、新建项目

在这里插入图片描述

在这里插入图片描述

2、UI设置界面

1)进入项目ui设置界面:工具 → Qt → QtDesigner。

在这里插入图片描述
在这里插入图片描述

2)设置项目Ui:通过拖动控件到界面设置ui。

在这里插入图片描述

3)ui设置完后保存文件:文件 → 保存。

在这里插入图片描述

3、Python运行UI

1)添加UI运行的python文件:选中项目右键 → 新建 → Python File。

在这里插入图片描述
在这里插入图片描述

2)Ui_Weiget文件里面添加UI处理的类。

在这里插入图片描述

from PySide2.QtCore import QFile
from PySide2.QtUiTools import QUiLoader
class UiInterFace:
    def __init__(self):
        # 从文件中加载UI定义
        q_state_file = QFile("mainWeiget.ui")
        q_state_file.open(QFile.ReadOnly)
        q_state_file.close()
        # 从 UI 定义中动态 创建一个相应的窗口对象
        self.ui = QUiLoader().load(q_state_file)

3)同步骤1添加主运行python文件Main,并添加主入口运行函数。

在这里插入图片描述

from PySide2.QtWidgets import QApplication
from Ui_Weiget import UiInterFace
if __name__ == "__main__":
    app = QApplication([])  #加载所有控件
    ui_interface = UiInterFace()   #创建窗体对象
    ui_interface.ui.show()    #主窗口的控件,全部显示在界面上
    app.exec_()             #进入QApplication的事件处理循环

4)此时在Main文件点击运行按钮,可以运行程序显示UI界面。

在这里插入图片描述

4、添加库文件、库函数封装的Python文件。

1)找到厂家提供的光盘资料里面的python函数库,路径如下(64位库为例)。

A、进入厂商提供的光盘资料找到“04PC函数”文件夹,并点击进入。

在这里插入图片描述

B、选择“PC函数库V2.1”文件夹。

在这里插入图片描述

C、选择“Windows平台”文件夹。

在这里插入图片描述

D、根据需要选择对应的函数库,这里选择64位库。

在这里插入图片描述

E、解压Python64压缩包,里面有Python对应的函数库,与运动函数封装的python文件。

在这里插入图片描述

2)将厂商提供的python的库文件以及相关文件复制到新建的项目中。

A、进入dll文件夹,选中zauxdll.dl、zmotion.dll、zauxdllPython.py三个文件复制。

在这里插入图片描述

在这里插入图片描述

B、选中新建的项目粘贴,便把对应的库文件与封装的运动Python文件粘贴到了项目中。

在这里插入图片描述

3)进入ui的python文件在文件开头处导入zauxdllPython文件的ZAUXDLL类,并在界面类中创建ZAUXDLL对象。

在这里插入图片描述

三、相关PC函数介绍

1、PC函数手册可在光盘资料查看,具体路径如下。

在这里插入图片描述

2、连接控制器。

在这里插入图片描述

3、读取当前轴运动是否在运动中。

在这里插入图片描述

4、设置脉冲当量。

在这里插入图片描述

5、设置轴运动速度。

在这里插入图片描述

6、单轴持续运动。

在这里插入图片描述

7、单轴绝对运动。

在这里插入图片描述

8、单轴停止运动。

在这里插入图片描述

四、例程演示

1、连接控制器。

#连接控制器, 控制器默认IP是192.168.0.11,此处使用comboBox内输入的ip
def on_btn_open_clicked(self):
    strtemp = self.ui.comboBox.currentText()
    print("当前的ip是 :", strtemp)
    if self.Zmc.handle.value is not None:
        self.Zmc.ZAux_Close()
        self.time1.stop()
        self.ui.setWindowTitle("单轴运动")
    iresult = self.Zmc.ZAux_OpenEth(strtemp)#连接控制器
    if 0 != iresult:
        QMessageBox.warning(self.ui, "提示", "连接失败")
    else:
        QMessageBox.warning(self.ui, "提示", "连接成功")
        str_title = self.ui.windowTitle() + strtemp
        self.ui.setWindowTitle(str_title)
        self.Up_State()  #刷新函数
        self.time1.start(100)#开启定时器

2、轴运动。

#轴运行函数
def on_btn_Run_clicked(self):
    if self.Zmc.handle.value is None:
        QMessageBox.warning(self.ui, "警告", "未连接控制器")
        return
    # 获取轴运动状态0 –运动中,-1-未运动
    isidle=self.Zmc.ZAux_Direct_GetIfIdle(self.axis_Num)[1].value 
    isidle=int(isidle)
    if self.mode == 1 and not isidle:
        QMessageBox.warning(self.ui, "警告", "未停止")
        return
    # 设置脉冲当量
    str_tmp = self.ui.edit_Units.text()
    float_tmp = float(str_tmp)
    self.Zmc.ZAux_Direct_SetUnits(self.axis_Num, float_tmp)#设置脉冲单量
    # 设置运动速度
    str_tmp = self.ui.edit_Speed.text()
    float_tmp = float(str_tmp)
    self.Zmc.ZAux_Direct_SetSpeed(self.axis_Num, float_tmp)#设置运动速度
    # 设置加速度
    str_tmp = self.ui.edit_Accel.text()
    float_tmp = float(str_tmp)
    self.Zmc.ZAux_Direct_SetAccel(self.axis_Num, float_tmp)#设置加速度
    # 设置减速度
    str_tmp = self.ui.edit_Decel.text()
    float_tmp = float(str_tmp)
    self.Zmc.ZAux_Direct_SetDecel(self.axis_Num, float_tmp)#设置减速
    # 设置S曲线
    str_tmp = self.ui.edit_Sramp.text()
    float_tmp = float(str_tmp)
    self.Zmc.ZAux_Direct_SetSramp(self.axis_Num, float_tmp)# 设置S曲线
    if 0 == self.mode:
        # 单轴持续运动
        self.Zmc.ZAux_Direct_Single_Vmove(self.axis_Num, self.direction)
    elif 1 == self.mode:
        str_tmp = self.ui.edit_Distance.text()
        float_tmp = float(str_tmp)
        # 单轴相对运动运动
        self.Zmc.ZAux_Direct_Single_Move(self.axis_Num, -float_tmp if self.direction == -1 else float_tmp)

3、停止轴运动。

#停止轴运动
def on_btn_Stop_clicked(self):
    if self.Zmc.handle.value is None:
        QMessageBox.warning(self.ui, "警告", "未连接控制器")
        return
    #获取轴运动状态0 –运动中,-1-未运动
    isidle=self.Zmc.ZAux_Direct_GetIfIdle(self.axis_Num)[1].value
    if isidle:
        QMessageBox.warning(self.ui, "警告", "已停止")
        return
    #停止单轴运动
    self.Zmc.ZAux_Direct_Single_Cancel(self.axis_Num, 2)

4、运行程序观察运行效果。

运行python程序,通过RTSys软件观察运行情况。

在这里插入图片描述

5、教学视频。

EtherCAT运动控制器上位机之Python+Qt

本次,正运动技术EtherCAT运动控制器上位机开发之Python+Qt(一):链接与单轴运动,就分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师。

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1963264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI初学者必看: 什么是大型语言模型 (LLM)?

介绍 “人工智能(AI)”一词于 1956 年问世,如今已为大家所熟知。然而,在 ChatGPT 迅速流行之前,AI 的使用和讨论大多局限于科学研究或虚构电影。如今,AI 尤其是生成式 AI 已成为大家热议的话题。 初学者生…

使用Process Explorer和Dependency Walker排查dll动态库加载失败的问题

目录 1、问题描述 2、如何调试Release版本的代码? 3、使用Process Explorer查看exe主程序加载的dll库列表,发现mediaplay.dll没有加载起来 4、使用Dependency Walker查看rtcmpdll.dll的库依赖关系和接口调用情况,定位问题 4.1、使用Depe…

html+css+js 实现3D透视倾斜按钮,javascript库之vanilla-tilt.js详解

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

常用游戏运行库 v4 官方版下载与安装教程 (游戏DLL补全包)

前言 游戏运行库包含了VC运行库合集,.NET2.0到.NET4.8合集,DirectX9.0 Rapture3D 等游戏必备的系统组件,如果你的游戏安装后无法运行,那么安装这些组件基本上就可以解决。本必备运行库安装包集成32位和64位运行库,是目…

(自用)MyLog 简单日志 .net6.0 等

appsettings.json {"LogOnOff": true //true 开启日志&#xff1b;false 关闭日志 } MyLog.cs using System.ComponentModel;namespace Namespace {/// <summary>/// 日志类型 枚举/// </summary>public enum LogType{[Description("调试日志&q…

Android经典面试题之实战经验分享:如何简单实现App的前后台监听判断

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 在Android中判断一个应用是否处于前台或后台&#xff0c;可以使用ActivityLifecycleCallbacks 和 ProcessLifecycleOwner。在Kotlin中&#xff…

实验2-5-3 求平方根序列前N项和

//实验2-5-3 求平方根序列前N项和/*本题要求编写程序&#xff0c; 计算平方根序列123⋯的前N项之和。 可包含头文件math.h&#xff0c;并调用sqrt函数求平方根。*/#include<stdio.h> #include<math.h> int main(){int n0;scanf("%d",&n);//输入Nint …

【Canvas与艺术】三环莫比乌斯圈

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>三环莫比乌斯圈</title><style type"text/css"&g…

测桃花运(算姻缘)的网站系统源码

简介&#xff1a; 站长安装本源码后只要有人在线测算&#xff0c;就可以获得收入哦。是目前市面上最火的变现利器。 本版本无后台&#xff0c;无数据。本版本为开发的逗号联盟接口版本。直接对接逗号联盟&#xff0c;修改ID就可以直接运营收费赚钱。 安装环境&#xff1a;PH…

可以个性化的网盘与相册服务 PDS

可以个性化的网盘与相册服务 PDS 什么是PDS企业版企业网盘团队管理用户管理安全策略企业设置文件设置及其他设置专属登录配置 使用建议企业网盘用户端开发者版体验感受 什么是PDS 在正式开始测评PDS之前&#xff0c;首先来了解一下什么是PDS。PDS 网盘与相册服务&#xff08;D…

Pythonic 的从远程列表中提取分支名称方法

1、问题背景 在 Git 版本控制系统中&#xff0c;我们需要经常使用 git ls-remote 命令来获取远程仓库的分支列表。 这个命令的输出通常包含分支的哈希值和分支名称&#xff0c;就像这样&#xff1a; db6ad7246abf74cb845baa60e6fe45dacf897612 HEAD 1fc347b17201054d8b5b9…

YOLOv8 基于BN层的通道剪枝

YOLOv8 基于BN层的通道剪枝 1. 稀疏约束训练 在损失项中增加对BN层的缩放系数 γ \gamma γ和偏置项 β \beta β的稀疏约束&#xff0c; λ \lambda λ系数越大&#xff0c;稀疏约束越严重 L ∑ ( x , y ) l ( f ( x ) , y ) λ 1 ∑ γ g ( γ ) λ 2 ∑ β g ( β ) L…

华杉研发九学习日记18 集合 泛型

华杉研发九学习日记18 一&#xff0c;集合框架 1.1 集合和数组的区别 集合就是在java中用来保存多个对象的容器 集合是数组的升级版&#xff0c;集合中只能放置对象[object]. 数组: 在java中用来保存多个具有相同数据类型数据的容器 数组弊端&#xff1a; 1.数组只能保存…

2024AICoding公司全景图及评分

AI Coding背景 AI coding 领域的产品和公司在 2024 年开始爆发了&#xff0c;主要涉及技术进步、市场需求和开发者生态系统的变化。 本文会从技术背景&#xff0c;市场需求&#xff0c;生态以及相关评分为大家完整梳理一下相关内容。 底层技术 大规模预训练模型 技术背景&#…

C#使用OPC组件方式和AB的PLC通信

目录 一、PLC硬件配置 1、创建PLC程序 &#xff08;1&#xff09;程序工程选择 &#xff08;2&#xff09;变量和程序 2、配置程序在模拟器中运行 &#xff08;1&#xff09;打开RSLkin Classic &#xff08;2&#xff09;仿真器配置 &#xff08;3&#xff09;PLC程序…

我终于搭建完成了我的个人网站!(仅分享,非教程)

先看看我的个人网站~ https://yaoqx.pages.devhttps://yaoqx.pages.dev 来看看我搭建的过程吧&#xff01; &#xff08;仅分享&#xff0c;非教程&#xff09; 网站技术 前端框架&#xff1a;Astro主题&#xff1a;Frosti代码托管&#xff1a;Github网页部署&#xff1a;Cl…

Vscode ssh Could not establish connection to

错误表现 上午还能正常用vs code连接服务器看代码&#xff0c;中午吃个饭关闭vscode再重新打开输入密码后就提示 Could not establish connection to 然后我用终端敲ssh的命令连接&#xff0c;结果是能正常连接。 解决方法 踩坑1 网上直接搜Could not establish connectio…

浮点数如何存储

一、浮点数存储格式 符号&#xff08;sign&#xff09; s是符号位&#xff0c;1表示负&#xff0c;0表示正阶码&#xff08;exponent&#xff09; E的作用是对浮点数加权&#xff0c;这个权重是2的E次幂尾数&#xff08;significand&#xff09; M是一个二进制小数 二、举例说…

被爬网站用fingerprintjs来对selenium进行反爬,怎么破?

闲暇逛乎的时候&#xff0c;看到了这个问题&#xff1a; Fingerprintjs实际上就是专门用来识别和追踪浏览器的&#xff0c;要应对起来&#xff0c;确实并非易事。那么&#xff0c;我们要如何应对FingerprintJS的唯一标记技术呢&#xff1f; 接下来&#xff0c;我们将一起来探讨…

【自学深度学习梳理2】深度学习基础

一、优化方法 上一篇说到,使用梯度下降进行优化模型参数,可能会卡在局部最小值,或优化方法不合适永远找不到具有最优参数的函数。 1、局部最小值 梯度下降如何工作? 梯度下降是一种优化算法,用于最小化损失函数,即寻找一组模型参数,使得损失函数的值最小(局部最小值…