首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2(五):Python编程调试
深圳市正运动技术有限公司
收藏本文     查看收藏

本节主要讲解如何通过Python编程调试ZMC432CL-V2的脉冲闭环功能。

ZMC432CL-V2产品简介

ZMC432CL-V2高性能多轴运动控制器是一款兼容EtherCAT总线和脉冲型的独立式运动控制器,具备高速实时反馈功能,支持脉冲全闭环控制,能够实现高精度、高响应速度的运动控制。高精度定位,有效消除机械传动误差,满足高精密加工场景应用要求。

步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2.png

ZMC432CL-V2硬件功能特性:

1.丰富的运动控制功能:支持直线、圆弧、空间圆弧、螺旋插补等。

2.硬件接口丰富:支持脉冲轴(带编码器反馈)和EtherCAT总线轴,具备24路输入和12路输出的通用IO,部分为高速IO,2路模拟量输出(DA)。

3.EtherCAT刷新周期最快达250us,满足高速通信需求。

4.支持4通道硬件比较输出、硬件定时器、运动中精准输出,适用于多通道视觉飞拍等场合。

5.支持掉电检测、掉电存储,多种程序加密方式,能够有效防止系统故障,保护项目工程文件数据,并提高系统的可靠性。

6.通过纯国产IDE开发环境RTSys进行项目开发,可实时仿真、在线跟踪以及诊断与调试,简便易用,支持多种高级上位机语言联合编程进行二次开发。

步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2接线图.png



 

更多关于ZMC432CL-V2详情介绍点击→步进控制的光栅尺全闭环解决方案:32轴EtherCAT总线运动控制器ZMC432CL-V2。

Python语言如何调用ZMotion的动态库进行项目开发

此案例Python开发环境

操作系统环境 :Win11_64位

Python版本:python-3.10.10-amd64.exe

Pycharm版本:pycharm-community-2024.1.3.exe

一.python开发前对环境、解析器进行配置。

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

1.png

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

2.png

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

3.png

自定义QtDesigner

目的:用于生成.ui文件

Name:QtDesigner

Group:Qt

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

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

Working directory:$ProjectFileDir$

自定义Pyside2-uic

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

Name:Pyside2-uic

Group:Qt

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

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

Arguments:$FileName$ -o $FileNameWithoutExtension$.py

Working directory:$FileDir$

自定义Pyside2-rcc

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

Name:Pyside2-rcc

Group:Qt

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

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

Arguments:$FileName$ -o $FileNameWithoutExtension$_rc.py

Working directory:$FileDir$

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

4.png

二.python+Qt进行项目创建与UI设置、添加ZMotion动态库。

1.新建项目:文件→新建项目。

5.png

6.png

2.UI设置界面。

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

7.png

8.png

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

9.png

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

10.png

3.python运行UI。

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

11.png

12.png

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

13.png

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,并添加主入口运行函数。

14.png

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界面。

15.png

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

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

a.进入厂商提供的光盘资料找到“04PC函数\01PC函数库V2.1\windows平台\Python”文件夹,据需要选择对应的函数库,这里选择64位库。

16.png

b.进入“64位”后打开文件夹“Python64”找到“dll库文件”与“zmcdll”。

17.png

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

a.进入“dll库文件”选中zauxdll.dl,zmotion.dll两个文件复制到项目中。

18.png

b.进入“zmcdll”选中zauxdllPython.py文件复制到项目中。

19.png

c.把对应的库文件与封装的运动Python文件粘贴到项目中后。

20.png

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

21.png

PC函数介绍

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

22.png

2.连接控制器。

指令11.png

3.万能指令之在线命令
有一些使用频率较低的Basic指令我们没有封装到上位机的辅助库中,如果用户上位机需要调用对应的Basic指令的话,可以通过在线命令自行进行相关指令封装。

指令265.png

指令264.png

Python编程调试ZMC432CL-V2的脉冲闭环功能

1.通过在线命令封装脉冲闭环功能对应的上位机接口。

(1)选中项目右键新建Python File新建一个MyFullClosedLoop类文件。

23.png

(2)查询Basic对应指令的使用说明,封装一个设置轴比例增益的上位机接口。

24.png

def ZAux_Direct_SetPGain(self, iaxis,  fValue):
    '''
    :Description:设置轴的比例增益
    :param iaxis:轴号
    :param fValue:比例增益P的值
    :return:错误码,返回字符串
    '''
    # 判断轴数是否超标
    if  iaxis > self.MAX_AXIS_AUX:
        return self.ERR_AUX_PARAERR
    # 生成命令
    pszCommand = "P_Gain({0}) = {1}".format(iaxis, fValue)
    # 调用命令执行函数
    ret = self.Zmc.ZAux_DirectCommand(pszCommand)
    return ret[0],ret[1]

(3)查询Basic对应指令的使用说明,封装一个获取轴比例增益的上位机接口。

#连接控制器,一般使用网口连接,控制器默认IP是192.168.0.11,
def ZAux_Direct_GetPGain(self,iaxis):
    '''
    :Description:获取轴的比例增益
    :param iaxis:轴号
    :return:错误码,获取的轴比例增益P的值
    '''
    # 判断轴数是否超标
    if iaxis >self.MAX_AXIS_AUX:
        return self.ERR_AUX_PARAERR
    #生成命令
    pszCommand = "?P_Gain({0})".format(iaxis)
    #调用命令执行函数
    ret = self.Zmc.ZAux_Execute(pszCommand)
    if self.ERR_OK != ret[0]:
        return ret[0]
    # 解析返回的字符串
    if len(ret[1]) == 0:
       return self.ERR_NOACK
    else:
        value = float(ret[1])
        return self.ERR_OK,value

(4)封装好的脉冲闭环功能相关的上位机接口。

25.png

2.Python闭环功能的测试例程编写案例讲解。

(1)【连接】连接控制器。

def on_btn_Connect(self):
    if self.Zmc.handle.value is not None:
        self.Zmc.ZAux_Close()
        self.Zmc.handle.value = None
        self.ui.setWindowTitle("脉冲闭环测试(步进驱动器+编码器反馈)")
    Temptype = 2  # 2-ETH
    TempStr = self.ui.cb_strlist.currentText()
    if self.ui.cb_type.currentText() == "网口":
        Temptype = 2  # 2-ETH
    elif self.ui.cb_type.currentText() == "LOCAL":
        Temptype = 5  # MotionRT
    elif self.ui.cb_type.currentText() == "PCI":
        Temptype = 4  # PCI
    elif self.ui.cb_type.currentText() == "串口":
        Temptype = 1  # COM
    iresult = self.Zmc.ZAux_FastOpen(Temptype, TempStr, 1000)

(2)【更新PID参数】按钮如何打开和关闭脉冲闭环功能,如何更新PID参数。

def PidParaSet(self):
    TempFloat = 0
    TempDpos = 0
    TempMpos = 0
    TempInt = 0
    Axis_Num = int(self.ui.edit_AxisId.text())  # 轴号
    CloseLoop = MyFullClosedLoop()  # 创建 MyFullClosedLoop 控制器对象
    CloseLoop.Zmc.handle=self.Zmc.handle  #设置控制器句柄为当前连接控制器句柄
    CompareStr = "闭环已开"
    TempStr = self.ui.btn_IsClosedLoop.text()
    #打开全闭环去控制轴运动
    if TempStr == CompareStr:
        #获取轴位置,如果DPOS和MPOS相差太大不能打开脉冲闭环
        TempDpos = self.Zmc.ZAux_Direct_GetDpos(Axis_Num)[1].value
        TempMpos = self.Zmc.ZAux_Direct_GetMpos(Axis_Num)[1].value
        if ((TempDpos - TempMpos) > 4  or (TempDpos - TempMpos < -4)):
            print("规划位置和反馈位置相差太大,无法启动闭环功能!!!!")
            QMessageBox.warning(self.ui, "提示", "规划位置和反馈位置相差太大,无法启动闭环功能!!!!")
            return -1
        #更新比例增益
        TempFloat=self.ui.edit_ParaP.text()
        CloseLoop.ZAux_Direct_SetPGain(Axis_Num, TempFloat)
        #更新积分增益
        TempFloat=self.ui.edit_ParaI.text()
        CloseLoop.ZAux_Direct_SetIGain(Axis_Num,TempFloat)
        # 更新微分增益
        TempFloat=self.ui.edit_ParaD.text()
        CloseLoop.ZAux_Direct_SetDGain(Axis_Num,TempFloat)
        #更新速度前馈增益
        TempFloat = self.ui.edit_ParaVF.text()
        CloseLoop.ZAux_Direct_SetVffGain(Axis_Num, TempFloat)
        #更新加速度前馈增益
        TempFloat = self.ui.edit_ParaAF.text()
        CloseLoop.ZAux_Direct_SetAffGain(Axis_Num, TempFloat)
        # 更新速度增益
        TempFloat = self.ui.edit_ParaOV.text()
        CloseLoop.ZAux_Direct_SetOvGain(Axis_Num, TempFloat)
        #注意:在打开servo之前打开encoder_servo后要完成一次atype由0变为4的切换,否则会报axis: axis:0 config not support Servo#1、先打开encoder_servo
        CloseLoop.ZAux_Direct_SetEncoderServo(Axis_Num, 1)
        time.sleep(0.02)
        TempInt=CloseLoop.ZAux_Direct_GetEncoderServo(Axis_Num)[1]
        if TempInt==1:
            #2、完成一次Atype由0变为4的切换
            self.Zmc.ZAux_Direct_SetAtype(Axis_Num, 0);
            time.sleep(0.02)
            self.Zmc.ZAux_Direct_SetAtype(Axis_Num, 4);
            #3、打开Servo
            CloseLoop.ZAux_Direct_SetServo(Axis_Num, 1);
            time.sleep(0.02)
            TempInt=CloseLoop.ZAux_Direct_GetServo(Axis_Num)[1]
            if TempInt==1:
                print("闭环参数配置完成, 轴全闭环功能打开成功。");
            else:
                print("轴闭环开关Servo打开失败, 导致脉冲全闭环开启失败");
                return -1;
        else:
            print("轴编码器闭环EncoderServo打开失败, 导致脉冲全闭环开启失败!!!");
            return -1;
    else:
        #关闭全闭环的功能
        #1、关闭EncoderServo
        CloseLoop.ZAux_Direct_SetEncoderServo(Axis_Num, 0);
        time.sleep(0.02)
        TempInt=CloseLoop.ZAux_Direct_GetEncoderServo(Axis_Num)[1]
        if TempInt==1:
            Console.WriteLine("轴EncoderServo关闭失败!!!");
            return -1;
        # 2、关闭EncoderServo后需要完成ATYPE的切换,保证完全关闭闭环功能
        self.Zmc.ZAux_Direct_SetAtype(Axis_Num, 0);
        time.sleep(0.02)
        self.Zmc.ZAux_Direct_SetAtype(Axis_Num, 4);
        # 3、关闭Servo
        CloseLoop.ZAux_Direct_SetServo(Axis_Num, 0);
        time.sleep(0.02)
        TempInt=CloseLoop.ZAux_Direct_GetServo(Axis_Num)[1]
        if TempInt==1:
            print("轴Servo关闭失败!!!");
            return -1;
    return 0;

(3)【更新轴参数】按钮如何完成轴参数的更新。
def AxisParaSet (self):
    TempFloat = 0
    TempInt1 = 0
    TempInt2 = 0
    Axis_Num = int(self.ui.edit_AxisId.text())  # 轴号
    # 设置最大随动误差FE_LIMIT
    self.Zmc.ZAux_Direct_SetFeLimit(Axis_Num, 500)
    # 更新编码器齿轮比 (如果发N个脉冲,实际编码器反馈M个脉冲,编码器齿轮比要设置成 N/M)
    TempInt1 = int(self.ui.edit_EncoderRatioMol.text())
    TempInt2 = int(self.ui.edit_EncoderRatioDenom.text())
    self.Zmc.ZAux_Direct_EncoderRatio(Axis_Num, TempInt1, TempInt2)
    # 更新脉冲当量,一般脉冲当量设置成机台运动1mm需要的脉冲数
    TempFloat = float(self.ui.edit_ParaUnits.text())
    self.Zmc.ZAux_Direct_SetUnits(Axis_Num, TempFloat);
    # 全闭环的功能需要把ATYPE设置成4
    self.Zmc.ZAux_Direct_SetAtype(Axis_Num, 4);
    # 更新速度
    TempFloat = float(self.ui.edit_ParaSpeed.text())
    self.Zmc.ZAux_Direct_SetSpeed(Axis_Num, TempFloat);
    # 更新加速度、减速度
    TempFloat = float(self.ui.edit_ParaAccel.text())
    self.Zmc.ZAux_Direct_SetAccel(Axis_Num, TempFloat);
    TempFloat = float(self.ui.edit_ParaDecel.text())
    self.Zmc.ZAux_Direct_SetDecel(Axis_Num, TempFloat);
    # 是否启用SS曲线
    if self.CurveIsSS == 1:
        # 启用SS曲线,VP_MODE模式设置成7即可
        # 上位机没有现场设置VP_MODE的接口,直接在线命令去封装,在线命令是万能指令
        pszCommand = "VP_MODE({0}) = 7 ".format(Axis_Num)
        self.Zmc.ZAux_DirectCommand(pszCommand)
        print("启用SS曲线,VP_MODE模式设置成7!!")
    else:
        # 启用S曲线,VP_MODE模式设置成0即可
        # 上位机没有现场设置VP_MODE的接口,直接在线命令去封装,在线命令是万能指令
        pszCommand = "VP_MODE({0}) = 0 ".format(Axis_Num)
        self.Zmc.ZAux_DirectCommand(pszCommand)
        # S曲线模式,S曲线时间sramp是有效果的,需要设置一下
        TempFloat = float(self.ui.edit_ParaSramp.text())
        self.Zmc.ZAux_Direct_SetSramp(Axis_Num, TempFloat);
        print("启用S曲线,VP_MODE模式设置成0!!")
    print("轴参数设置完成!!")

通过RTSys的示波器对比开环控制和全闭环控制的情况

示波器的使用可以参考正运动小助手的历史推文《运动控制看的更清楚细致!RTSys示波器功能简介 (qq.com)》。

1.开环控制情况分析

26.png

27.png

测试发现:步进驱动器的开环控制,运动过程中随动误差(规划位置和光栅尺反馈位置的差值)一直维持在0.02个用户单位左右(这里一个用户单位即一个UNITS设置的是1mm),当运动结束时光栅尺的反馈位置和指令规划位置也不相等,大概差了0.0015个用户单位,折算为脉冲数是0.0015*用户单位=3个脉冲。

2.闭环控制情况分析

28.png

29.png

测试发现:步进驱动器的闭环控制,运动过程中随动误差(规划位置和光栅尺反馈位置的差值)除了启动和停止以外大部分保持在0个脉冲当量左右,相比较开环控制有较大的提升,当运动结束时光栅尺的反馈位置和指令规划位置也是相等的。

3.教学视频可点击→“步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2(五):Python编程调试”查看。

 

完整代码获取地址

二维码.png

本次,正运动技术步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2(五):Python编程调试,就分享到这里。

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

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

二维码.png


正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。


 

状 态: 离线

公司简介
产品目录

公司名称: 深圳市正运动技术有限公司
联 系 人: 戴德弟
电  话: 0755-32976042
传  真: 0755-2606 6955
地  址: 深圳市宝安区西乡洲石路阳光工业园A1栋5楼
邮  编: 518100
主  页:
 
该厂商相关技术文摘:
单旋转台XYR在精密点胶/外观检测/精密焊接的C#应用
强实时运动控制内核MotionRT750(二):精密点胶的PSO应用
正运动与您相聚2025青岛国际工业自动化技术及装备展览会!
电子装备柔性智造创新技术论坛诚邀您的莅临!
快速导入CAD的dxf图形加工验证
机器视觉运动控制一体机在SCARA机器人柔振盘上下料的应用
强实时运动控制内核MotionRT750(一):驱动安装、内核配置与使用
AI视觉外观检测在全自动测包机中的应用
C#上位机与运动控制卡网络通讯的周期上报
DELTA机械手多物料视觉分拣的应用
正运动×Eplan再启新篇 | 24款新品模型上线,打造电气设计全链路闭环
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved