The value of Zmotion is to bring customers more success!
本节主要讲解如何通过Python编程调试ZMC432CL-V2的脉冲闭环功能。
ZMC432CL-V2产品简介
ZMC432CL-V2高性能多轴运动控制器是一款兼容EtherCAT总线和脉冲型的独立式运动控制器,具备高速实时反馈功能,支持脉冲全闭环控制,能够实现高精度、高响应速度的运动控制。高精度定位,有效消除机械传动误差,满足高精密加工场景应用要求。
1.丰富的运动控制功能:支持直线、圆弧、空间圆弧、螺旋插补等。
2.硬件接口丰富:支持脉冲轴(带编码器反馈)和EtherCAT总线轴,具备24路输入和12路输出的通用IO,部分为高速IO,2路模拟量输出(DA)。
3.EtherCAT刷新周期最快达250us,满足高速通信需求。
4.支持4通道硬件比较输出、硬件定时器、运动中精准输出,适用于多通道视觉飞拍等场合。
5.支持掉电检测、掉电存储,多种程序加密方式,能够有效防止系统故障,保护项目工程文件数据,并提高系统的可靠性。
6.通过纯国产IDE开发环境RTSys进行项目开发,可实时仿真、在线跟踪以及诊断与调试,简便易用,支持多种高级上位机语言联合编程进行二次开发。
更多关于ZMC432CL-V2详情介绍点击→步进控制的光栅尺全闭环解决方案:32轴EtherCAT总线运动控制器ZMC432CL-V2。
Python语言如何调用ZMotion的动态库进行项目开发
Win11_64位
python-3.10.10-amd64.exe
pycharm-community-2024.1.3.exe
一.python开发前对环境、解析器进行配置。
1.安装汉化包:点击file→setting→plugins,然后搜索Chinese中文包。
2.python解析器安装Pyside2软件包(QT库):File→Settings→Project pythonProject。
3.配置自定义控件:File→Settings→Tools→External Tools点击+新增自定义工具。
Name:QtDesigner
Group:Qt
Program:PySide2安装路径下的 designer.exe 路径
例如:C:\Python\Python39\Scripts\pyside2-designer.exe
Name:Pyside2-uic
Group:Qt
Program:Python安装目录下Scripts\pyside2-uic.exe
例如:C:\Python\Python39\Scripts\pyside2-uic.exe
Arguments:$FileName$ -o $FileNameWithoutExtension$.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
4.配置好自定义控件后,后续可以直接在pycharm菜单中使用。
二.python+Qt进行项目创建与UI设置、添加ZMotion动态库。
1.新建项目:文件→新建项目。
2.UI设置界面。
(1)进入项目ui设置界面:工具→Qt→QtDesigner。
3.python运行UI。
(1)添加UI运行的python文件:选中项目右键→新建→Python File。
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)
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函数\01PC函数库V2.1\windows平台\Python”文件夹,据需要选择对应的函数库,这里选择64位库。
b.进入“64位”后打开文件夹“Python64”找到“dll库文件”与“zmcdll”。
(2)将厂商提供的python的库文件以及相关文件复制到新建的项目中。
a.进入“dll库文件”选中zauxdll.dl,zmotion.dll两个文件复制到项目中。
b.进入“zmcdll”选中zauxdllPython.py文件复制到项目中。
c.把对应的库文件与封装的运动Python文件粘贴到项目中后。
PC函数介绍
Python编程调试ZMC432CL-V2的脉冲闭环功能
1.通过在线命令封装脉冲闭环功能对应的上位机接口。
(1)选中项目右键→新建→Python File新建一个MyFullClosedLoop类文件。
(2)查询Basic对应指令的使用说明,封装一个设置轴比例增益的上位机接口。
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)封装好的脉冲闭环功能相关的上位机接口。
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;
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的示波器对比开环控制和全闭环控制的情况
1.开环控制情况分析
测试发现:步进驱动器的开环控制,运动过程中随动误差(规划位置和光栅尺反馈位置的差值)一直维持在0.02个用户单位左右(这里一个用户单位即一个UNITS设置的是1mm),当运动结束时光栅尺的反馈位置和指令规划位置也不相等,大概差了0.0015个用户单位,折算为脉冲数是0.0015*用户单位=3个脉冲。
2.闭环控制情况分析
测试发现:步进驱动器的闭环控制,运动过程中随动误差(规划位置和光栅尺反馈位置的差值)除了启动和停止以外大部分保持在0个脉冲当量左右,相比较开环控制有较大的提升,当运动结束时光栅尺的反馈位置和指令规划位置也是相等的。
3.教学视频可点击→“步进控制的光栅尺全闭环EtherCAT运动控制器ZMC432CL-V2(五):Python编程调试”查看。
完整代码获取地址
更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936。
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统_视觉控制器__运动控制PLC_运动控制_机器人控制器_视觉定位_XPCIe/XPCI系列运动控制卡等等。