我们主要从VB6.0的项目新建、函数库引用和PC函数使用方面讲起,最后通过项目实战——总线初始化例程讲解,来让大家熟悉它的项目开发。

在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618。这两款产品分别是4轴,6轴运动控制卡。

ECI2418支持4轴脉冲输入与编码器反馈,板载24点输入,16点输出,2AD,2DA,支持手轮接口,其中特定输出口支持高速PWM控制。ECI2618支持6轴脉冲输入与编码器反馈,板载24点输入,16点输出,2AD,2DA,支持手轮接口,其中特定输出口支持高速PWM控制。

ECI2418,ECI2618均使用同一套API函数,均支持C、C++、C#、LabVIEW、Python、Delphi等开发语言,支持VC6.0、VB6.0、Qt、.Net等平台,支持Windows、Linux、WinCE、iMac等操作系统。一新建EXE工程,加载函数库。

(一)新建工程

打开Microsoft Visual Basic菜单,在“文件”→“新建工程”,选择新建“标准EXE”工程。

新建工程自带一个起始窗口,可以通过菜单“工程”→“属性”更改起始窗口。

(二)加载PC函数库VB6.0需要对添加的dll文件进行加载,否则系统找不到函数所引用的函数库源,加载步骤如下。

1.找到厂家提供的光盘资料中的VB6.0资料。

2.将VB6.0压缩包解压,找到其中的dll库文件。

3.将dll文件zmotion.dll以及zauxdll.dll一起复制放入系统文件夹C:\Windows\System32中。假如编程系统是64位系统,也要把上述文件复制到C:\Windows\SysWOW64中。

4.通过“开始”菜单→“Windows系统”→“命令提示符”或者在“开始”菜单搜索“cmd”打开命令提示符窗口,使用如下指令:regsvr32 C:\Windows\SysWOW64\zmotion.dllregsvr32 C:\Windows\system32\zmotion.dll

regsvr32命令用于注册COM组件,是Windows系统提供的用来向系统注册控件或者卸载控件的命令,以命令行方式运行。Zmotion.dll加载后,才可以调用zauxdll的函数。

可以将该条指令复制到记事本上,然后把txt文件另存为bat文件来运行。另外,一些自己下载vb6.0的额外部件也可以用该方法加载,加载后能在菜单“工程”→“引用”,“工程”→“部件”中找到对应文件,本例程使用函数库无需加载部件或引用。

(三)函数库使用将zauxdll.bas与工程文件放入同一文件夹,方便管理。

在工程资源管理器中右键添加模块,或者在菜单“工程”→“添加模块”功能中将zauxdll.bas添加入工程。

这样就做好使用正运动PC函数库的准备了。二查看PC函数手册,了解其用法。

(一)PC函数手册也在光盘资料里面。

具体路径如下:

(二)PC编程。

一般先根据控制器连接方式选择对应的连接函数连接控制器,返回控制器句柄。接着用返回的控制器句柄,实现对控制器的控制,大部分函数都有对控制器的指向。通常有:Public g_handle As Long

控制器句柄是连接控制器的重要标志。

(三)通过网口连接控制器,获取句柄。

通过网口iret = ZAux_OpenEth(“127.0.0.1”, g_handle)或者串口iret = ZAux_OpenCom(1, g_handle)连接控制器,获取控制器句柄g_handle。

(四)下载总线初始化bas文件

下载总线初始化bas文件到控制器iret = ZAux_BasDown(g_handle, sFilePath, 1),sFilePath是对应总线初始化的文件地址,利用CommonDialog对话框操作部件,获取对象文件地址。

总线初始化文件是基于ZDevelop编写的EtherCAT和RTEX初始化程序,通过ZAux_BasDown方式下载到控制器以直接运行。

(五)EtherCAT数据字典读写

EtherCAT数据字典读写ZAux_BusCmd_SDORead和ZAux_BusCmd_SDOWrite。

其中对象字典编号、对象字典子编号、数据类型是十进制输入,手册上是十六进制表示,使用时注意转换。

(六)位置环增益与速度环增益调整

松下A6B系列EtherCAT总线驱动器中:

位置环增益对应数据字典为3100H-00H(第一位置环增益)和3105H-00H(第二位置环增益);

速度环增益对应数据字典为3101H-00H(第一速度环增益)和3106H-00H(第二速度环增益);

自动选择增益参数的标志位为3002H-00H。

具体请参考光盘资料(P315~P318):技术资料→ECAT通讯规格篇→MINAS_A6B系列→EtherCAT通讯/选择类型。

本篇文章使用第一位置环增益和第一速度环增益,通过实时自动增益调谐设置选择是否改变增益参数。三项目实战之连续插补运动例程讲解

(一)界面讲解

(二)例程简易流程图

//相关函数// 建立与控制器的网口通讯iret = ZAux_OpenEth(m_ipaddress, g_handle) '网口连接控制器//定时器刷新ret = ZAux_Direct_GetAxisEnable(g_handle, m_axisnum, i_AxisPara(0))ret = ZAux_Direct_GetAxisStatus(g_handle, m_axisnum, i_AxisPara(1))……//下载初始化bas文件到控制器iret = ZAux_BasDown(g_handle, sFilePath, 1) '下载到ROM//轴使能iret = ZAux_Direct_SetAxisEnable(g_handle, m_axisnum, 0) ‘轴使能关闭iret = ZAux_Direct_SetAxisEnable(g_handle, m_axisnum, 1) '轴使能打开//正转iret = ZAux_Direct_Single_Vmove(g_handle, m_axisnum, 1)//反转iret = ZAux_Direct_Single_Vmove(g_handle, m_axisnum, -1)//相对运动iret = ZAux_Direct_Single_Move(g_handle, m_axisnum, Val(T_Move_s))//绝对运动iret = ZAux_Direct_Single_MoveAbs(g_handle, m_axisnum, Val(T_Move_s))//停止iret = ZAux_Direct_Single_Cancel(g_handle, m_axisnum, 2)//运动增益读写iret =ZAux_BusCmd_SDORead(g_handle, 0, T_SdoNode, Val(CLng('&H' & '3100')), 0, 3, m_sdo_data2_1)iret =ZAux_BusCmd_SDORead(g_handle, 0, T_SdoNode, Val(CLng('&H' & '3101')), 0, 3, m_sdo_data2_2)// IO信号读写iret = ZAux_Direct_GetIn(g_handle, i , IN_status)iret = ZAux_Direct_GetOp(g_handle, i , OP_status)iret = ZAux_Direct_SetOp(g_handle, i , OP_status)

(三)模块程序

1.初始化变量Public g_handle As Long          '当前使用的卡句柄Public iret As Long          '函数返回值Public g_basflag As Boolean      '//BAS文件加载标志位Public g_InitStatus As Integer    '//总线初始化完成状态 0-失败 1-成功  -1-初始化未完成Public Bus_type As Single     '//BAS文件中变量判断总线类型,也作为BAS文件是否下载成功判断Public if_home As BooleanPublic m_axisnum As Integer

2.控制器连接Private Sub T_OpenCom_Click()   '串口连接If g_handle <> 0 Then  '断开前面的连接ZAux_Close (g_handle)g_handle=0End Ifiret=ZAux_OpenCom(Val(T_ComId.Text), g_handle)If (g_handle <> 0) ThenForm1.Caption='已连接'Timer1.Enabled=TrueT_AxisId_ChangeDim ret As Integeriret=ZAux_Direct_GetUserVar(g_handle, 'BUS_TYPE', Bus_type)'读取BAS文件中的变量判断是否有加载BAS文件If (iret=0 And Bus_type <> -1) Theng_basflag=True'//文件已经加载End IfElseForm1.Caption='未连接'MsgBox '控制器链接失败,请检测IP地址!', vbOKOnly, '警告'End IfEnd SubPrivate Sub T_IpAddress_DropDown()   '下拉搜索IPDim Buffer As String * 10240T_IpAddress.ClearT_IpAddress.AddItem ('127.0.0.1')iret=ZAux_SearchEthlist(Buffer, 10230, 200) '搜索IP地址列表Dim Ip_List() As StringIp_List=Split(Buffer, ' ')For i=0 To UBound(Ip_List)T_IpAddress.AddItem (Ip_List(i))NextEnd SubPrivate Sub T_OpenEth_Click()   '以太网连接Dim m_ipaddress As Stringm_ipaddress=T_IpAddress.TextIf g_handle <> 0 Then  '断开前面的连接ZAux_Close (g_handle)g_handle=0End Ifiret=ZAux_OpenEth(m_ipaddress, g_handle)'网口连接控制器If (g_handle <> 0) ThenForm1.Caption='已连接'Timer1.Enabled=TrueT_AxisId_Changeiret=ZAux_Direct_GetUserVar(g_handle, 'BUS_TYPE', Bus_type)'读取BAS文件中的变量判断是否有加载BAS文件If (iret=0 And Bus_type <> -1) Theng_basflag=True'//文件已经加载End IfElseForm1.Caption='未连接'MsgBox '控制器链接失败,请检测IP地址!', vbOKOnly, '警告'End IfEnd SubPrivate Sub T_PciId_DropDown()  '下拉搜索PCIDim m_maxpci As IntegerT_PciId.Clearm_maxpci=ZAux_GetMaxPciCards()For i=0 To m_maxpci - 1T_PciId.AddItem (i.ToString())NextEnd SubPrivate Sub T_OpenPci_Click()Dim m_cardid As IntegerIf g_handle <> 0 Then  '断开前面的连接ZAux_Close (g_handle)g_handle=0End Ifm_cardid=Val(PCIADDRESS.Text)iret=ZAux_OpenPci(m_cardid, g_handle)'PCI方式连接If g_handle <> 0 ThenForm1.Caption='已连接'Timer1.Enabled=TrueT_AxisId_ChangeDim ret As Integeriret=ZAux_Direct_GetUserVar(g_handle, 'BUS_TYPE', Bus_type)'读取BAS文件中的变量判断是否有加载BAS文件If (iret=0 And Bus_type <> -1) Theng_basflag=True'//文件已经加载End IfElseMsgBox '连接失败,请检查PCI', vbOKOnly, '提示'Form1.Caption='未连接'End IfEnd SubPrivate Sub T_Close_Click()'断开链接If (g_handle <> 0) ThenTimer1.Enabled=FalseZAux_Close (g_handle)g_handle=0Form1.Caption='未连接'End IfEnd Sub

3.总线初始化Private Sub T_DownLoad_Click() '下载文件到控制器If (g_handle = 0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseWith CommonDialog1.Filename = 'Basic1'.InitDir = App.Path.CancelError = True.Filter = '文件(*.bas)|*.bas'End WithMe.CommonDialog1.ShowOpensFilePath = Me.CommonDialog1.FilenameT_BasFile.Text = sFilePathiret = ZAux_BasDown(g_handle, sFilePath, 1)'//下载到ROMIf (iret <> 0) ThenMsgBox '文件下载失败!', vbOKOnly, '提示'ElseMsgBox '下载成功!', vbOKOnly, '提示'End IfEnd IfEnd Sub'重新初始化总线,下载ROM时程序会自动初始化一次Private Sub T_BusInit_Click()If (g_handle = 0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (g_basflag And (g_InitStatus <> -1)) Then '-1:可能正在执行初始化g_InitStatus = -1Dim Buffer As String * 10240T_BusStatus.Text = '初始化未完成''任务1重新运行BAS中的初始化函数iret = ZAux_Execute(g_handle, 'RUNTASK 1,Ecat_Init', Buffer, 0)ElseMsgBox 'Bas文件未加载!', vbOKOnly, '提示'End IfEnd IfEnd Sub

4.轴运动Private Sub T_SetEnable_Click()  '//切换使能If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (T_EnableStatus.Text='on') Theniret=ZAux_Direct_SetAxisEnable(g_handle, m_axisnum, 0)Elseiret=ZAux_Direct_SetAxisEnable(g_handle, m_axisnum, 1)End IfEnd IfEnd SubPrivate Sub T_ClearAlm_Click()   '//清除轴报警If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'Elseiret=ZAux_BusCmd_DriveClear(g_handle, m_axisnum, 0)End IfEnd SubPrivate Sub T_FwdMove_Click()   '正转If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'Elseiret=ZAux_Direct_SetUnits(g_handle,m_axisnum,Val(T_Units.Text))iret=ZAux_Direct_SetSpeed(g_handle,m_axisnum,Val(T_Speed.Text))iret=ZAux_Direct_SetAccel(g_handle,m_axisnum,Val(T_Accel.Text))iret=ZAux_Direct_Single_Vmove(g_handle,m_axisnum,1)End IfEnd SubPrivate Sub T_RevMove_Click()   '反转If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'Elseiret=ZAux_Direct_SetUnits(g_handle,m_axisnum,Val(T_Units.Text))iret=ZAux_Direct_SetSpeed(g_handle,m_axisnum,Val(T_Speed.Text))iret=ZAux_Direct_SetAccel(g_handle,m_axisnum,Val(T_Accel.Text))iret=ZAux_Direct_Single_Vmove(g_handle,m_axisnum,-1)End IfEnd SubPrivate Sub T_Move_Click()          '运动If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'Elseiret=ZAux_Direct_SetUnits(g_handle,m_axisnum,Val(T_Units.Text))iret=ZAux_Direct_SetSpeed(g_handle,m_axisnum,Val(T_Speed.Text))iret=ZAux_Direct_SetAccel(g_handle,m_axisnum,Val(T_Accel.Text))If T_moveType(0).value=True Theniret=ZAux_Direct_Single_Move(g_handle, m_axisnum,Val(T_Move_s))ElseIf T_moveType(1).value=True Theniret=ZAux_Direct_Single_MoveAbs(g_handle,m_axisnum,Val(T_Move_s))End IfEnd IfEnd SubPrivate Sub T_Move_Click()          '运动If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'Elseiret=ZAux_Direct_SetUnits(g_handle,m_axisnum,Val(T_Units.Text))iret=ZAux_Direct_SetSpeed(g_handle,m_axisnum,Val(T_Speed.Text))iret=ZAux_Direct_SetAccel(g_handle,m_axisnum,Val(T_Accel.Text))If T_moveType(0).value=True Theniret=ZAux_Direct_Single_Move(g_handle,m_axisnum, Val(T_Move_s))ElseIf T_moveType(1).value=True Theniret=ZAux_Direct_Single_MoveAbs(g_handle,m_axisnum,Val(T_Move_s))End IfEnd IfEnd SubPrivate Sub T_Stop_Click()  '停止If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'Elseiret=ZAux_Direct_Single_Cancel(g_handle, m_axisnum, 2)End IfEnd Sub

5.总线回零Private Sub T_StartHome_Click()  '驱动器自身回零If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (Bus_type=0) Theniret=ZAux_Direct_SetSpeed(g_handle,m_axisnum,Val(T_HomeSp1.Text))iret=ZAux_Direct_SetCreep(g_handle,m_axisnum,Val(T_HomeSp2.Text))iret=ZAux_BusCmd_SetDatumOffpos(g_handle,m_axisnum, _Val(T_HomeOffpos.Text))iret=ZAux_BusCmd_Datum(g_handle,m_axisnum,Val(T_HomeMode.Text))ElseMsgBox 'rtex不支持!', vbOKOnly, '提示'End IfEnd IfEnd SubPrivate Sub T_StopHome_Click()  '停止T_Stop_ClickEnd Sub

6.总线数据交互Private Sub T_EcatWrite_Click() 'ETHERCAT写If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (Bus_type=0) ThenDim m_sdo_node0 As LongDim m_sdo_index0 As LongDim m_sdo_sub0 As LongDim m_sdo_type0 As LongDim m_sdo_data0 As Longm_sdo_node0=Val(T_SdoNode0.Text)m_sdo_index0=Val(T_SdoIndex0.Text)m_sdo_sub0=Val(T_SdoSub0.Text)m_sdo_type0=T_SdoType0.ListIndex + 1m_sdo_data0=Val(T_SdoData0.Text)iret=ZAux_BusCmd_SDOWrite(g_handle,0, _m_sdo_node0,m_sdo_index0,m_sdo_sub0,m_sdo_type0,m_sdo_data0)If (iret <> 0) ThenMsgBox '写入失败!', vbOKOnly, '提示'End IfElseMsgBox '非ETHERCAT模块!', vbOKOnly, '提示'End IfEnd IfEnd SubPrivate Sub T_EcatRead_Click()  'ETHERCAT读取If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (Bus_type=0) ThenDim m_sdo_node1 As LongDim m_sdo_index1 As LongDim m_sdo_sub1 As LongDim m_sdo_type1 As LongDim m_sdo_data1 As Longm_sdo_node1=Val(T_SdoNode1.Text)m_sdo_index1=Val(T_SdoIndex1.Text)m_sdo_sub1=Val(T_SdoSub1.Text)m_sdo_type1=T_SdoType1.ListIndex + 1m_sdo_data1=0iret=ZAux_BusCmd_SDORead(g_handle,0, _m_sdo_node1, m_sdo_index1, m_sdo_sub1, m_sdo_type1, m_sdo_data1)If (iret <> 0) ThenMsgBox '读取失败!', vbOKOnly, '提示'ElseT_SdoData1.Text=Str(m_sdo_data1)End IfElseMsgBox '非ETHERCAT模块!', vbOKOnly, '提示'End IfEnd IfEnd SubPrivate Sub auto_gain_check_Click()     '自动增益标志设置If (Bus_type=0) ThenIf auto_gain_check.value=0 Theniret=ZAux_BusCmd_SDOWrite(g_handle,0, Val(T_SdoNode2.Text), Val(CLng('&H' & '3002')), 0, 3, 0)Elseiret=ZAux_BusCmd_SDOWrite(g_handle, 0, Val(T_SdoNode2.Text), Val(CLng('&H' & '3002')), 0, 3, 1)End IfElseMsgBox '非ETHERCAT模块!', vbOKOnly, '提示'End IfEnd SubPrivate Sub T_ECAT_W_Click()            '速度环、位置环增益写If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (Bus_type=0) Theniret=ZAux_BusCmd_SDOWrite(g_handle,0, Val(T_SdoNode2.Text), Val(CLng('&H'&'3100')), 0, 3, Val(T_PostGain_W.Text))  '位置环增益写iret=iret + ZAux_BusCmd_SDOWrite(g_handle, 0, Val(T_SdoNode2.Text), Val(CLng('&H' & '3101')), 0, 3, Val(T_VeloGain_W.Text))  '速度环增益写If (iret <> 0) ThenMsgBox '写入失败!', vbOKOnly, '提示'End IfElseMsgBox '非ETHERCAT模块!', vbOKOnly, '提示'End IfEnd IfEnd SubPrivate Sub T_ECAT_R_Click()            '速度环、位置环增益读If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseIf (Bus_type=0) Theniret=ZAux_BusCmd_SDORead(g_handle, 0, Val(T_SdoNode3.Text), Val(CLng('&H' & '3100')), 0, 3, m_sdo_data2_1)    '位置环增益读iret=iret + ZAux_BusCmd_SDORead(g_handle, 0, Val(T_SdoNode3.Text), Val(CLng('&H' & '3101')), 0, 3, m_sdo_data2_2)    '速度环增益读If (iret <> 0) ThenMsgBox '写入失败!', vbOKOnly, '提示'ElseT_PostGain_R=Str(m_sdo_data2_1)T_VeloGain_R=Str(m_sdo_data2_2)End IfElseMsgBox '非ETHERCAT模块!', vbOKOnly, '提示'End IfEnd IfEnd Sub

7.IO口操作Sub IN_OP_read()                    'IO口读取Dim IN_status As LongDim OP_status As LongDim in_page As LongDim op_page As Longin_page=T_IN_page.ListIndexop_page=T_OP_page.ListIndexDim iFor i=0 To 7iret=ZAux_Direct_GetIn(g_handle, i + in_page * 8, IN_status)iret=ZAux_Direct_GetOp(g_handle, i + op_page * 8, OP_status)T_IN_Check(i).value=IN_statusT_IN_Check(i).Caption=Str(i + in_page * 8)T_OP_Check(i).value=OP_statusT_OP_Check(i).Caption=Str(i + op_page * 8)NextEnd SubPrivate Sub T_OP_Check_Click(Index As Integer)      '输出口使能Dim OP_status As LongDim op_page As Longop_page=T_OP_page.ListIndexOP_status=T_OP_Check(Index).valueiret=ZAux_Direct_SetOp(g_handle, Index + op_page * 8, OP_status)End Sub

8.参数刷新

1)在主窗体Private Sub Form_Load()         '窗体加载时运行g_handle=0g_basflag=Falseg_InitStatus=-1Bus_type=-1if_home=Falsem_axisnum=0T_IN_page.ListIndex=0     '初始化IO列表初值T_OP_page.ListIndex=0End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)End '关闭主窗体时关闭程序End SubPrivate Sub Form_Unload(Cancel As Integer)'断开链接If (g_handle <> 0) ThenTimer1.Enabled=FalseZAux_Close (g_handle)g_handle=0End IfDim myForm     As FormFor Each myForm In FormsUnload myFormSet myForm=NothingPrivate Sub T_morePara_Click()Form2.ShowEnd SubPrivate Sub Timer1_Timer()Dim ret As LongDim f_AxisPara(10) As SingleDim i_AxisPara(10) As LongIf g_handle <> 0 Thenret=0m_axisnum=Val(T_AxisId.Text)ret=ZAux_Direct_GetAxisEnable(g_handle, m_axisnum, i_AxisPara(0))ret=ret + ZAux_Direct_GetMpos(g_handle, m_axisnum, f_AxisPara(0))ret=ret + ZAux_Direct_GetDpos(g_handle, m_axisnum, f_AxisPara(1))ret=ret + ZAux_Direct_GetAxisStatus(g_handle, m_axisnum, i_AxisPara(1))ret=ret + ZAux_Direct_GetIfIdle(g_handle, m_axisnum, i_AxisPara(2))If (ret=0) ThenIf i_AxisPara(0)=0 ThenT_EnableStatus.Text='off'ElseT_EnableStatus.Text='on'End IfT_Dpos.Text=Str(f_AxisPara(0))T_Mpos.Text=Str(f_AxisPara(1))Call re_transfro(i_AxisPara(1), i_AxisPara(2))End IfIf (((i_AxisPara(1) And 64)=64) And (if_home = False)) Then        '//第6位是否被置1T_HomeStatus.Text='回零中'if_home=TrueElseIf ((i_AxisPara(1)=0) And if_home) ThenDim homestatus As Longhomestatus=0ret=ZAux_BusCmd_GetHomeStatus(g_handle, m_axisnum, homestatus)If homestatus=1 ThenT_HomeStatus.Text='回零完成'ElseT_HomeStatus.Text='回零未完成'End Ifif_home=FalseEnd IfIf (g_basflag And g_InitStatus=-1) Then            '//已经加载文件并且正在初始化 读取状态Dim tempstatus As SingleDim m_BusNodeNum As LongDim m_BusAxisNum As Singletempstatus=-1m_BusNodeNum=0m_BusAxisNum = 0ret=ZAux_Direct_GetUserVar(g_handle, 'BUS_TYPE', Bus_type)'//读取BAS文件中的变量判断总线类型ret=ret + ZAux_Direct_GetUserVar(g_handle, 'Bus_InitStatus', tempstatus)               '//读取BAS文件中的变量判断总线初始化完成状态ret=ret + ZAux_BusCmd_GetNodeNum(g_handle, 0, m_BusNodeNum)'//读取槽位0上节点个数。ret=ret + ZAux_Direct_GetUserVar(g_handle, 'Bus_TotalAxisnum', m_BusAxisNum)'//读取BAS文件中的变量判断扫描的总轴数g_InitStatus=tempstatus'//初始化完成刷新状态If (ret=0 And g_InitStatus <> -1) ThenIf g_InitStatus=1 ThenT_BusStatus.Text='初始化成功'ElseT_BusStatus.Text='初始化失败'End IfT_NodeNum.Text=Str(m_BusNodeNum)T_AxisNum.Text=Str(m_BusAxisNum)End IfEnd IfCall IN_OP_readEnd IfEnd SubSub re_transfro(axisStatues, axisIdle)Dim axisStatues_str As StringDim axisIdle_str As StringaxisStatues_str=''If axisStatues=0 ThenaxisStatues_str='正常;'ElseDim quo As LongDim mod_tr(24) As LongDim i As Longquo=axisStatuesFor i=0 To 23mod_tr(i)=quo Mod 2quo=quo \ 2NextIf mod_tr(1) Then axisStatues_str=axisStatues_str + '随动误差超限告警;'If mod_tr(2) Then axisStatues_str=axisStatues_str + '与远程通讯出错;'If mod_tr(3) Then axisStatues_str=axisStatues_str + '远程驱动器报错;'If mod_tr(4) Then axisStatues_str=axisStatues_str + '正向硬限位;'If mod_tr(5) Then axisStatues_str=axisStatues_str + '反向硬限位;'If mod_tr(6) Then axisStatues_str=axisStatues_str + '找原点;'If mod_tr(7) Then axisStatues_str=axisStatues_str + 'hold速度保持信号输入;'If mod_tr(8) Then axisStatues_str=axisStatues_str + '随动误差超限出错;'If mod_tr(9) Then axisStatues_str=axisStatues_str + '超过正向软限位;'If mod_tr(10) Then axisStatues_str=axisStatues_str + '超过负向软限位;'If mod_tr(11) Then axisStatues_str=axisStatues_str + 'CANCEL执行中;'If mod_tr(12) Then axisStatues_str=axisStatues_str + '脉冲频率超过最大速度;'If mod_tr(14) Then axisStatues_str=axisStatues_str + '机械手指令坐标错误;'If mod_tr(18) Then axisStatues_str=axisStatues_str + '电源异常;'If mod_tr(21) Then axisStatues_str=axisStatues_str + '运动中触发特殊运动指令失败;'If mod_tr(22) Then axisStatues_str=axisStatues_str + '告警信号输入;'If mod_tr(23) Then axisStatues_str=axisStatues_str + '轴进入暂停状态;'End IfIf axisIdle=0 ThenaxisIdle_str='运动中'ElseaxisIdle_str='运动结束'End IfT_AxisStatus.Caption=axisStatues_strT_Idle.Text=axisIdle_strEnd SubPrivate Sub T_AxisId_Change()            '修改轴参数If (g_handle=0) ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseDim f_AxisPara(10) As SingleDim m_atype As Longm_atype=0m_axisnum=Val(T_AxisId.Text)iret=ZAux_Direct_GetUnits(g_handle, m_axisnum, f_AxisPara(0))iret=iret + ZAux_Direct_GetSpeed(g_handle, m_axisnum, f_AxisPara(1))iret=iret + ZAux_Direct_GetAccel(g_handle, m_axisnum, f_AxisPara(2))iret=iret + ZAux_Direct_GetDecel(g_handle, m_axisnum, f_AxisPara(3))iret=iret + ZAux_Direct_GetAtype(g_handle, m_axisnum, m_atype)If (iret=0) ThenT_Atype.Text=Str(m_atype)T_Units.Text=Str(f_AxisPara(0))T_Speed.Text=Str(f_AxisPara(1))T_Accel.Text=Str(f_AxisPara(2))T_Decel.Text=Str(f_AxisPara(3))End IfEnd IfEnd Sub

2)在子窗体Private d_AxisPara(73) As Variant '变体类型,使数组包含single和long型Private d_AxisNum As LongPublic g_handle As LongPublic Sub para_reflash() '读取参数Dim ret As LongDim paraS(3) As Singleret = 0d_AxisNum = Val(S_Axisnum.Text)g_handle = Form1.g_handleIf (g_handle <> 0) Thenret = ZAux_Direct_GetAtype(g_handle, d_AxisNum, d_AxisPara(0))ret = ZAux_Direct_GetUnits(g_handle, d_AxisNum, d_AxisPara(1))ret = ZAux_Direct_GetAccel(g_handle, d_AxisNum, d_AxisPara(2))ret = ZAux_Direct_GetDecel(g_handle, d_AxisNum, d_AxisPara(3))ret = ZAux_Direct_GetSpeed(g_handle, d_AxisNum, d_AxisPara(4))ret = ZAux_Direct_GetCreep(g_handle, d_AxisNum, d_AxisPara(5))ret = ZAux_Direct_GetLspeed(g_handle, d_AxisNum, d_AxisPara(6))ret = ZAux_Direct_GetMerge(g_handle, d_AxisNum, d_AxisPara(7))ret = ZAux_Direct_GetSramp(g_handle, d_AxisNum, d_AxisPara(8))ret = ZAux_Direct_GetEndMove(g_handle, d_AxisNum, d_AxisPara(11))ret = ZAux_Direct_GetFsLimit(g_handle, d_AxisNum, d_AxisPara(12))ret = ZAux_Direct_GetRsLimit(g_handle, d_AxisNum, d_AxisPara(13))ret = ZAux_Direct_GetDatumIn(g_handle, d_AxisNum, d_AxisPara(14))ret = ZAux_Direct_GetFwdIn(g_handle, d_AxisNum, d_AxisPara(15))ret = ZAux_Direct_GetRevIn(g_handle, d_AxisNum, d_AxisPara(16))ret = ZAux_Direct_GetAllAxisInfo(g_handle, d_AxisNum, d_AxisPara(17), d_AxisPara(9), d_AxisPara(10), d_AxisPara(25))ret = ZAux_Direct_GetLoaded(g_handle, d_AxisNum, d_AxisPara(18))ret = ZAux_Direct_GetMspeed(g_handle, d_AxisNum, d_AxisPara(19))ret = ZAux_Direct_GetMtype(g_handle, d_AxisNum, d_AxisPara(20))'ret = ZAux_Direct_GetNtype(g_handle, d_AxisNum, d_AxisPara(21))ret = ZAux_Direct_GetRemain(g_handle, d_AxisNum, d_AxisPara(22))ret = ZAux_Direct_GetVectorBuffered(g_handle, d_AxisNum, d_AxisPara(23))ret = ZAux_Direct_GetVpSpeed(g_handle, d_AxisNum, d_AxisPara(24))ret = ZAux_Direct_GetMoveCurmark(g_handle, d_AxisNum, d_AxisPara(27))d_AxisPara(26) = d_AxisPara(27)'读取运动标号与当前运动标号相同ret = ZAux_Direct_GetAxisStopReason(g_handle, d_AxisNum, d_AxisPara(28))ret = ZAux_Direct_GetMovesBuffered(g_handle, d_AxisNum, d_AxisPara(29))ret = ZAux_Direct_GetAxisAddress(g_handle, d_AxisNum, d_AxisPara(30))ret = ZAux_Direct_GetAxisEnable(g_handle, d_AxisNum, d_AxisPara(31))ret = ZAux_Direct_GetForceSpeed(g_handle, d_AxisNum, d_AxisPara(32))ret = ZAux_Direct_GetStartMoveSpeed(g_handle, d_AxisNum, d_AxisPara(33))ret = ZAux_Direct_GetEndMoveSpeed(g_handle, d_AxisNum, d_AxisPara(34))ret = ZAux_Direct_GetFastDec(g_handle, d_AxisNum, d_AxisPara(35))ret = ZAux_Direct_GetAddax(g_handle, d_AxisNum, d_AxisPara(36))ret = ZAux_Direct_GetLinkax(g_handle, d_AxisNum, d_AxisPara(37))ret = ZAux_Direct_GetCornerMode(g_handle, d_AxisNum, d_AxisPara(38))ret = ZAux_Direct_GetDecelAngle(g_handle, d_AxisNum, d_AxisPara(39))ret = ZAux_Direct_GetStopAngle(g_handle, d_AxisNum, d_AxisPara(40))ret = ZAux_Direct_GetFullSpRadius(g_handle, d_AxisNum, d_AxisPara(41))d_AxisPara(42) = d_AxisPara(32) '限速值取SP速度ret = ZAux_Direct_GetZsmooth(g_handle, d_AxisNum, d_AxisPara(43))ret = ZAux_Direct_GetVectorBuffered(g_handle, d_AxisNum, d_AxisPara(44))ret = ZAux_Direct_GetEndMoveBuffer(g_handle, d_AxisNum, d_AxisPara(45))ret = ZAux_Direct_GetHomeWait(g_handle, d_AxisNum, d_AxisPara(46))ret = ZAux_Direct_GetFastJog(g_handle, d_AxisNum, d_AxisPara(47))ret = ZAux_Direct_GetFwdJog(g_handle, d_AxisNum, d_AxisPara(48))ret = ZAux_Direct_GetRevJog(g_handle, d_AxisNum, d_AxisPara(49))ret = ZAux_Direct_GetJogSpeed(g_handle, d_AxisNum, d_AxisPara(50))ret = ZAux_Direct_GetFholdIn(g_handle, d_AxisNum, d_AxisPara(51))ret = ZAux_Direct_GetFhspeed(g_handle, d_AxisNum, d_AxisPara(52))ret = ZAux_Direct_GetEncoder(g_handle, d_AxisNum, d_AxisPara(53))ret = ZAux_Direct_GetMark(g_handle, d_AxisNum, d_AxisPara(57))ret = ZAux_Direct_GetMarkB(g_handle, d_AxisNum, d_AxisPara(58))ret = ZAux_Direct_GetRegPos(g_handle, d_AxisNum, d_AxisPara(61))ret = ZAux_Direct_GetRegPosB(g_handle, d_AxisNum, d_AxisPara(62))ret = ZAux_Direct_GetAlmIn(g_handle, d_AxisNum, d_AxisPara(65))ret = ZAux_Direct_GetRepOption(g_handle, d_AxisNum, d_AxisPara(66))ret = ZAux_Direct_GetRepDist(g_handle, d_AxisNum, d_AxisPara(67))ret = ZAux_Direct_GetInvertStep(g_handle, d_AxisNum, d_AxisPara(68))ret = ZAux_Direct_GetMaxSpeed(g_handle, d_AxisNum, d_AxisPara(69))ret = ZAux_Direct_GetDAC(g_handle, d_AxisNum, d_AxisPara(71))ret = ZAux_Direct_GetErrormask(g_handle, d_AxisNum, d_AxisPara(72))End IfEnd SubPublic Sub para_reset() '写入参数Dim ret As Longret = 0d_AxisNum = Val(S_Axisnum.Text)g_handle = Form1.g_handleIf (g_handle <> 0) ThenDim iFor i = 0 To 72d_AxisPara(i) = Val(S_Axispara(i))Nextret = ZAux_Direct_SetAtype(g_handle, d_AxisNum, d_AxisPara(0))ret = ZAux_Direct_SetUnits(g_handle, d_AxisNum, d_AxisPara(1))ret = ZAux_Direct_SetAccel(g_handle, d_AxisNum, d_AxisPara(2))ret = ZAux_Direct_SetDecel(g_handle, d_AxisNum, d_AxisPara(3))ret = ZAux_Direct_SetSpeed(g_handle, d_AxisNum, d_AxisPara(4))ret = ZAux_Direct_SetCreep(g_handle, d_AxisNum, d_AxisPara(5))ret = ZAux_Direct_SetLspeed(g_handle, d_AxisNum, d_AxisPara(6))ret = ZAux_Direct_SetMerge(g_handle, d_AxisNum, d_AxisPara(7))ret = ZAux_Direct_SetSramp(g_handle, d_AxisNum, d_AxisPara(8))ret = ZAux_Direct_SetDpos(g_handle, d_AxisNum, d_AxisPara(9))ret = ZAux_Direct_SetMpos(g_handle, d_AxisNum, d_AxisPara(10))ret = ZAux_Direct_SetFsLimit(g_handle, d_AxisNum, d_AxisPara(12))ret = ZAux_Direct_SetRsLimit(g_handle, d_AxisNum, d_AxisPara(13))ret = ZAux_Direct_SetDatumIn(g_handle, d_AxisNum, d_AxisPara(14))ret = ZAux_Direct_SetFwdIn(g_handle, d_AxisNum, d_AxisPara(15))ret = ZAux_Direct_SetRevIn(g_handle, d_AxisNum, d_AxisPara(16))ret = ZAux_Direct_SetMovemark(g_handle, d_AxisNum, d_AxisPara(26))ret = ZAux_Direct_SetAxisAddress(g_handle, d_AxisNum, d_AxisPara(30))ret = ZAux_Direct_SetAxisEnable(g_handle, d_AxisNum, d_AxisPara(31))ret = ZAux_Direct_SetForceSpeed(g_handle, d_AxisNum, d_AxisPara(32))ret = ZAux_Direct_SetStartMoveSpeed(g_handle, d_AxisNum, d_AxisPara(33))ret = ZAux_Direct_SetEndMoveSpeed(g_handle, d_AxisNum, d_AxisPara(34))ret = ZAux_Direct_SetFastDec(g_handle, d_AxisNum, d_AxisPara(35))ret = ZAux_Direct_SetCornerMode(g_handle, d_AxisNum, d_AxisPara(38))ret = ZAux_Direct_SetDecelAngle(g_handle, d_AxisNum, d_AxisPara(39))ret = ZAux_Direct_SetStopAngle(g_handle, d_AxisNum, d_AxisPara(40))ret = ZAux_Direct_SetFullSpRadius(g_handle, d_AxisNum, d_AxisPara(41))ret = ZAux_Direct_SetZsmooth(g_handle, d_AxisNum, d_AxisPara(43))ret = ZAux_Direct_SetHomeWait(g_handle, d_AxisNum, d_AxisPara(46))ret = ZAux_Direct_SetFastJog(g_handle, d_AxisNum, d_AxisPara(47))ret = ZAux_Direct_SetFwdJog(g_handle, d_AxisNum, d_AxisPara(48))ret = ZAux_Direct_SetRevJog(g_handle, d_AxisNum, d_AxisPara(49))ret = ZAux_Direct_SetJogSpeed(g_handle, d_AxisNum, d_AxisPara(50))ret = ZAux_Direct_SetFholdIn(g_handle, d_AxisNum, d_AxisPara(51))ret = ZAux_Direct_SetFhspeed(g_handle, d_AxisNum, d_AxisPara(52))ret = ZAux_Direct_SetAlmIn(  g_handle, d_AxisNum, d_AxisPara(65))ret = ZAux_Direct_SetRepOption(g_handle, d_AxisNum, d_AxisPara(66))ret = ZAux_Direct_SetRepDist(g_handle, d_AxisNum, d_AxisPara(67))ret = ZAux_Direct_SetInvertStep(g_handle, d_AxisNum, d_AxisPara(68))ret = ZAux_Direct_SetMaxSpeed(g_handle, d_AxisNum, d_AxisPara(69))ret = ZAux_Direct_SetDAC(g_handle, d_AxisNum, d_AxisPara(71))ret = ZAux_Direct_SetErrormask(g_handle, d_AxisNum, d_AxisPara(72))End IfEnd SubPrivate Sub Form_Load()S_Axisnum.Text = Form1.T_AxisId.TextS_reflash.value = 1Timer1.Enabled = TrueEnd SubPrivate Sub Form_Unload(Cancel As Integer)Timer1.Enabled = FalseEnd SubPrivate Sub S_Setpara_Click()If Form1.g_handle = 0 ThenMsgBox '未链接到控制器!', vbOKOnly, '提示'ElseCall para_resetS_reflash.value = 1End IfEnd SubPrivate Sub Timer1_Timer()'刷新Dim iIf Form1.g_handle <> 0 And S_reflash.value = 1 ThenCall para_reflashFor i = 0 To 72S_Axispara(i).Text = Str(d_AxisPara(i))NextElseFor i = 0 To 72S_Axispara(i).Text = '*'NextEnd IfEnd SubPrivate Sub S_Axispara_Click(Index As Integer) '准备改参数时停止刷新S_reflash.value = 0End Sub

(四)编译运行演示

1.EtherCAT连接

连接控制器后点击“下载BAS文件到ROW”按钮,打开对应文件夹,选择“ECAT初始化”文件。

通过轴数量和节点数量可以看出,以及检测到驱动器并连接成功,接下来通过控制运动现象来确认驱动器受控制。

2.测试使能

使能状态off

使能状态on

轴使能正常。

3.运动测试

通过ZDevelop软件连接对应控制器时,可以通过“视图”→“示波器”调出示波器观察。

正反转运动:

定点运动:

4.数字字典测试

在EtherCAT通讯中,数据字典3002h-00h表示运动控制中位置环增益和速度环增益是否自动改变。1-自动,0-手动。

Linux qt 运动控制卡,运动控制卡应用开发教程之VB6.0相关推荐

  1. 运动控制卡应用开发教程之VB6.0

    今天,正运动小助手为大家分析一下应用VB6.0开发一个总线初始化的运动控制应用. 我们主要从VB6.0的项目新建.函数库引用和PC函数使用方面讲起,最后通过项目实战--总线初始化例程讲解,来让大家熟悉 ...

  2. 运动控制卡应用开发教程之VC6.0

    今天,我们来讲解一下正运动技术运动控制卡应用开发教程之VC6.0. 在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. ECI2 ...

  3. python 运动控制卡_运动控制卡应用开发教程之Linux

    今天,正运动技术为大家分享一下运动控制卡应用开发教程之Linux.我们将从新建Qt项目,添加函数库讲起,再详细讲解函数的用法,最后通过一个连续插补例程讲解来了解项目实操. 在正式学习之前,我们先了解一 ...

  4. 运动控制卡的函数库与Linux,运动控制卡应用开发教程之ROS(下)

    在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. ECI2418支持4轴脉冲输入与编码器反馈,板载24点输入,16点输出,2A ...

  5. EtherCAT运动控制卡开发教程之Qt(中):小线段连续轨迹加工、暂停与继续

    今天,正运动小助手给大家分享一下EtherCAT运动控制卡开发教程之Qt,主要介绍一下如何通过Qt编程实现小线段轨迹连续加工,暂停与继续. ECI2828运动控制卡的硬件介绍 ECI2828系列控制卡 ...

  6. wince 开发_正运动技术运动控制卡应用开发教程之Python

    众所周知,Python作为一门面向对象的新兴开发语言,具有完善的基础代码库,实用性与代码可读性强,被越来越多的人应用于智能装备的运动控制. 今天正运动技术与大家分享一下运动控制卡应用开发教程之Pyth ...

  7. 运动控制卡应用开发教程之LabVIEW

    今天,我们来讲解一下正运动技术运动控制卡应用开发教程之LabVIEW. 在正式学习之前,我们先了解一下正运动技术的运动控制卡ECI2418和ECI2618.这两款产品分别是4轴,6轴运动控制卡. EC ...

  8. EtherCAT运动控制卡开发教程之python

    众所周知,Python作为一门面向对象的新兴开发语言,具有非常完善的基础代码库,更注重实用,同时代码可读极强,编写完程序即可直接运行,被越来越多的人广泛将它用于机器视觉和自动化控制. 今天正运动技术与 ...

  9. 运动控制卡应用开发教程之MATLAB

    今天,正运动小助手给大家分享一下运动控制卡应用开发教程之MATLAB.  一 ECI2828硬件介绍 ECI2828系列运动控制卡支持多达16 轴直线插补.任意圆弧插补.空间圆弧.螺旋插补.电子凸轮. ...

最新文章

  1. [BZOJ2653]middle
  2. boost::hana::template_用法的测试程序
  3. 深入理解C++内存管理
  4. 对象的克隆——原型模式
  5. java实现可视化报表_如何在Power BI中记录报表可视化?
  6. vb.net 如何文件指定打印机打印文件_使用Dropbox文件请求配合Canon Inkjet实现多用户文件打印...
  7. gc就是fullgc吗 major_线上出现fullgc问题如何排查?
  8. pycharm和python在mac里安装_MAC安装python-opencv及在pycharm下的配置
  9. Ethercat解析(十四)之初始化流程
  10. 1215 数组的宽度
  11. 单体应用微服务改造实践
  12. CIO:让IT成为企业的一种竞争优势
  13. Go,11 岁生日快乐!
  14. 把执行结果转成json对象报错_于一次JSON格式错误 之 手把手带你走一波FastJSON将对象转成JSON字符串流程...
  15. 高等数学_第一章第3节_函数的极限
  16. RMAN备份与恢复资料
  17. 银行测试(2)-专有名词
  18. 虚拟机安装Ubuntu解决自带Firefox浏览器不能看视频,提示无Flash插件问题!安装flash!
  19. 李沐老师 PyTorch版——线性回归 + softmax回归的简洁实现(3)
  20. 17周(胖子 大胖子 )

热门文章

  1. 六十星系之29武曲独坐辰戌
  2. Erlang之父Joe Armstrong近期回顾的一些旧事
  3. 达梦8之管理工具超实用小技巧
  4. 这次生日我想写点什么
  5. 求知若饥,虚心若愚Stay Hungry, Stay Foolish--2005斯坦福大学05年毕业演讲
  6. Windows 故障恢复控制台应用详解
  7. laravel小程序微信支付
  8. 贱人就是矫情——当打假成为一门生意
  9. C与C++游戏项目练习1:弹跳的小球简易版
  10. go区块链培训学习:密码学算法家族