1.背景简介
这一段时间,我们要玩公司内的间歇式张力控制工作台(公司安排老员工培训我们)。而我们间歇式工作台是由AM600中型PLC以及伺服驱动器、变频器等产品组合而成的。涉及到张力控制、收放卷控制、PID参数整定、凸轮控制等等模式。AM600是汇川技术的中型PLC产品,支持PLCopen规范的6种编程语言,一般AM600使用ST文本编程比较多。关于AM600的介绍,我们在后期将详细的写一系列关于AM600从入门到精通的教程资料。
2.模块介绍
我们老师首先给我们分析了一波,将整个大的间歇式工作台项目进行分解。分解成了一个个小的PLC项目,而这篇文章的即为最简单的入门项目。我们距离上次实习培训已经有2个多月没碰过公司产品了,这次回到公司,也没来得及熟悉呢。所以第一个小项目算是熟悉汇川AM600产品的。
本篇文章代码主要使用的是MC_Power模块和MC_MoveRelative模块。这两个模块,实际上都是codesys系统自带的模块库,汇川的AM600中型PLC开发平台实际上是基于codesys系统进行二次开发的。codesys系统是德国的一家公司专门为PLC厂商开发的编程系统功能相当强大,后期我们出一系列文章专门为大家介绍codesys以及codesys模块库(PS:我还不熟悉)
我们首先看一下AM600的运动控制篇的手册,这些手册在 汇川技术 官网产品资料下载区下载使用。关于各种MC模块的说明,我们都可以在这个手册中查到。下面大家看一下手册截图:
MC其实就是功能块,是codesys系统自定义的功能块。我们实际在写程序的时候,也可以定义自己的功能块,下一篇博文将带大家定义一个简单的自定义功能块,并进行实例化。(如果学过面向对象编程语言的同学,可以将这里的功能块,可以理解成 类,实例化就相当于创建一个对象)
MC_Power模块,实际上就是用于伺服轴使能的,通过实例化这个MC_Power功能块,我们可以控制绑定的伺服轴的使能。如果使用伺服的话,这个功能块是必须使用实例化的。下面我们来看看这个功能块的格式,以及内部的参数说明:
大家可以看到这个功能块中,有很多很多的参数,而这些参数有的是输入参数,有的是输出参数,这里我们都需要传入相应的变量或者数据。而这些参数的意义如下:
这里的变量,在手册中已经分别列出的输入变量、输出变量、输入输出变量。
只有在输入Enable 为TRUE 的时候,其它的输入才会被功能块处理。如果功能块MC_Power 已经被调用,并且bRegulatorOn=FALSE,那么功能块将设置相关轴的轴状态(nAxisState)为power_off 状态,表明驱动器还没有做好运动准备。
如果功能块MC_Power 已经被调用,并且bRegulatorOn=TRUE,如果此时轴没有错误发生,那么功能块将设置相关轴的轴状态(nAxisState)为standstill 状态;如果有错误发生,将输出相应的错误状态。
如果Enable,bRegulatorOn 以及bDriveStart 都为TRUE,但是输出Status 在一定时间后仍为FALSE,那么输出Error 将会被置位。当在使能状态情况下产生一个硬件问题,可能会发生这种情况。
如果使能信号丢失(通常在操作模式下),相关轴的nAxisState 将会被置位ErrorStop 状态。
使用格式如下:
1 2 3 4 5 6 7 8 9 10 11 |
MC_Power_1( Axis:= Axis_0, Enable:= Axis0Enable, bRegulatorOn:= Axis0Enable, bDriveStart:= Axis0Enable, Status=> Axis0Status, bRegulatorRealState=> , bDriveStartRealState=> , Busy=> , Error=> , ErrorID=> ); |
第一行,绑定一个伺服轴。
第二行,控制该伺服轴是否使能的变量。
第三行,bRegulatorOn:= Axis0Enable,
第四行,bDriveStart:= Axis0Enable,
第三四行,也必须设置为true时,系统才能正常初始化。
系统初始化完成之后,会输出Status=> Axis0Status, 通过判断这个变量,可以知道系统是否初始化完成。
我们在控制伺服运动时,还用到了MC_MoveRelative_1功能块,这个是相对位置定位功能块,这个模块的详细说明在汇川技术AM600编程手册运动控制篇中有详细的说明,大家可以自己搜索查看。其配置方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
MC_MoveRelative_1( Axis:= Axis_0, Execute:= Axis0RelExecute, Distance:= Axis0Distance, Velocity:= Axis0Vel, Acceleration:= Axis0Acc, Deceleration:= Axis0Dec, Jerk:= , Done=> Axis0Done, Busy=> Axis0Busy, CommandAborted=> , Error=> , ErrorID=> ); |
3.整体代码
变量区:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
PROGRAM PLC_PRG VAR STEP: INT; MC_Power_1: MC_Power; Axis0Status: BOOL; Axis0Enable: BOOL; MC_Power_2: MC_Power; Axis1Enable: BOOL; Axis1Status: BOOL; MC_MoveRelative_1: MC_MoveRelative; MC_MoveRelative_2: MC_MoveRelative; Axis0RelExecute: BOOL; Axis0Distance: LREAL; Axis0Vel: LREAL; Axis0Down: BOOL; Axis0Busy: BOOL; Axis1RelExecute: BOOL; Axis1Vel: LREAL; Axis1Distancde: LREAL; Axis1Down: BOOL; Axis1Busy: BOOL; Axis0Done: BOOL; Axis1Done: BOOL; MC_Home_0: MC_Home; MC_Home_1: MC_Home; Home0Exe: BOOL; Home0Done: BOOL; Home1Exe: BOOL; Home1Done: BOOL; Axis0Acc: LREAL; Axis0Dec: LREAL; Axis1Distance: LREAL; Axis1Dec: LREAL; Axis1Acc: LREAL; Axis0Re0Execute: BOOL; END_VAR |
下面是程序部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
CASE STEP OF 0: Axis0Enable := TRUE; Axis1Enable := TRUE; MC_Power_1( Axis:= Axis_0, Enable:= Axis0Enable, bRegulatorOn:= Axis0Enable, bDriveStart:= Axis0Enable, Status=> Axis0Status, bRegulatorRealState=> , bDriveStartRealState=> , Busy=> , Error=> , ErrorID=> ); MC_Power_2( Axis:= Axis_1, Enable:= Axis1Enable, bRegulatorOn:= Axis1Enable, bDriveStart:= Axis1Enable, Status=> Axis1Status, bRegulatorRealState=> , bDriveStartRealState=> , Busy=> , Error=> , ErrorID=> ); IF Axis0Status = TRUE AND Axis1Status = TRUE THEN STEP := 1; END_IF 1: //第一个轴 Axis0RelExecute := TRUE; Axis0Distance := 20; Axis0Vel := 5; Axis0Acc := 50; Axis0Dec := 25; //第二个轴 Axis1RelExecute := TRUE; Axis1Distance := 20; Axis1Vel := 5; Axis1Acc := 50; Axis1Dec := 25; STEP := 2; 2: IF Axis0Done = TRUE AND Axis1Done = TRUE THEN Axis0RelExecute := FALSE; Axis1RelExecute := FALSE; STEP := 3; END_IF 3: //第一个轴 Axis0RelExecute := TRUE; Axis0Distance := -20; Axis0Vel := 5; Axis0Acc := 50; Axis0Dec := 25; //第二个轴 Axis1RelExecute := TRUE; Axis1Distance := -20; Axis1Vel := 5; Axis1Acc := 50; Axis1Dec := 25; STEP := 4; 4: IF Axis0Done = TRUE AND Axis1Done = TRUE THEN Axis0RelExecute := FALSE; Axis1RelExecute := FALSE; STEP := 5; END_IF 5: STEP := 1; END_CASE MC_MoveRelative_1( Axis:= Axis_0, Execute:= Axis0RelExecute, Distance:= Axis0Distance, Velocity:= Axis0Vel, Acceleration:= Axis0Acc, Deceleration:= Axis0Dec, Jerk:= , Done=> Axis0Done, Busy=> Axis0Busy, CommandAborted=> , Error=> , ErrorID=> ); MC_MoveRelative_2( Axis:= Axis_1, Execute:= Axis1RelExecute, Distance:= Axis1Distance, Velocity:= Axis1Vel, Acceleration:= Axis1Acc, Deceleration:= Axis1Dec, Jerk:= , Done=> Axis1Done, Busy=> Axis1Busy, CommandAborted=> , Error=> , ErrorID=> ); MC_Home_0( Axis:= Axis_0, Execute:= Home0Exe, Position:= 0, Done=> Home0Done, Busy=> , CommandAborted=> , Error=> , ErrorID=> ); MC_Home_1( Axis:= Axis_1, Execute:= Home1Exe, Position:= 0, Done=> Home1Done, Busy=> , CommandAborted=> , Error=> , ErrorID=> ); |
4.AM600在线虚拟仿真
这里我们新建的工程,设置的是EtherCAT通信协议。然后在这个通信协议上挂了两个伺服轴,这里我们使用虚拟的仿真时,还得点击这两个轴,将其设置为虚轴模式。然后点击仿真,登陆到,打开trace追踪界面,配置并添加变量用于查看曲线。进行下载跟踪,点击运行按钮,查看曲线:
最后上面的程序打印出结果如下:
没啥时间,写的比较简单,仅做学习记录
转载请注明:燕骏博客 » AM600中型PLC系列文章之一:控制双轴伺服IS620N相对位置定位
赞赏作者微信赞赏支付宝赞赏