松下Panasonic PLC FP0R C32CT控制张大头闭环步进电机
和步进电机或伺服电机控制相关的指令有:
F166_PulseOutput_Set
F167_PulseOutput_Reset
F168_PulseOutput_Trapezoidal
F168_PulseOutput_Home
F170_PulseOutput_PWM
F171_PulseOutput_Trapezoidal
F171_PulseOutput_Home
F171_PulseOutput_Jog_Positioning
F169_PulseOutput_Jog
F172_PulseOutput_Jog
F173_PulseOutput_PWM
F173_PulseOutput_PWM_Hz
F174_PulseOutput_DataTable
F175_PulseOutput_Linear
F176_PulseOutput_Center
F176_PulseOutput_Pass
F177_PulseOutput_Home
新建一个项目(Ctrl+N),选择PLC类型为“FP0R 32k C32”,语言选择“ST(结构化文本)”,然后在左侧的项目树中右键最下面的POU,新建POU,在“指令列表”(Shift+F2)中搜索F172,会出现F172_PulseOutput_Jog,右键指令后点击“显示帮助”可以打开在线帮助文档,双击指令可以把指令插入到代码编辑区域,会出现如下一行:
F172_PulseOutput_Jog(s_dutDataTable:=?ANY_DUT?, n_iPulseOutputChannel:=?INT?);
根据帮助文档,对于FP0R系列的PLC,?ANY_DUT?位置需要填一个F172_PulseOutput_Jog_Type0_DUT_1或F172_PulseOutput_Jog_Type1_DUT_1类型的变量,而?INT?位置需要填0,1,2,3中的一个。Type0是没有目标值的模式,只要执行条件为TRUE,就一直输出脉冲。Type1是目标值匹配停止模式,当达到目标值时,输出停止。本文以Type0为例,首先新建一个F172_PulseOutput_Jog_Type0_DUT_1类型的变量,并将标识符改为dut1(这个可以随意改),
再设置dut1的初始值,
ControlCode的类型是DWORD,用二进制表示会有32bit,用16进制表示会有8位(因为2^32=16^8),每个16进制位的含义如下:
弹出的窗口中设置初始值时,注意ControlCode参数值得写成16#10000011,不能写成H10000011(这样会报错误:C5004 无效语法在初始值),也不能写成10000011(前面没加16#就代表是10进制数值,会导致PLC错误E45。如果一定要写成10进制,那应该写268435473).
剩余参数含义如下:
- lnitialAndFinalSpeed,初始和最终速度
- TargetSpeed,目标速度
- AccelerationTime,加速时间
- DecelerationTime,减速时间
一般的两相四线步进电机的步距角为1.8°,在不细分的情况下转一圈需要200个脉冲,如果做了n倍的细分,那么转一圈的脉冲数就是200n.
除了在“设置初始值”窗体中修改参数值,还可以用ST代码修改,如下:
dut1.dwControlCode:=16#10000011;
dut1.diInitialAndFinalSpeed:=1;
dut1.diTargetSpeed:=1000;
dut1.diAccelerationTime:=200;
dut1.diDecelerationTime:=200;
//dut1.diTargetValue:=200;
注意:
- diInitialAndFinalSpeed必须小于diTargetSpeed ,否则PLC在执行到F172指令时会亮红灯,报错误E45.
- F172_PulseOutput_Jog_Type0_DUT_1没有diTargetValue,
- F172_PulseOutput_Jog_Type1_DUT_1才能用diTargetValue.
把ControlCode和以上(1)~(4)的参数设置完毕以后,把编辑区的代码改成:
F172_PulseOutput_Jog(s_dutDataTable:= dut1, n_iPulseOutputChannel:= 0);
然后点击“编译全部(Ctrl+Shift+A)”,会出现如下警告:
警告(行1):脉冲输出通道0是由功能'F172_PulseOutput_Jog'要求的,在系统寄存器中没有设置为有效。
警告(行1):脉冲输出通道0是由功能'F172_PLSH'要求的,在系统寄存器中没有设置为有效。
解决方案:在左侧项目树中,展开“系统寄存器”,“高速计数器,脉冲输出,中断输入,脉冲捕捉输入(400-405)”,“402 脉冲输出:通道0”(因为ST代码中指定n_iPulseOutputChannel:= 0,所以这里选 通道0),“脉冲输出(Y0-Y1),原点输入(X4)”,
张大头闭环步进电机控制器支持PLC的NPN/PNP的24V信号直接输入,无需降压,十分方便。
上图是张大头的说明书,下图是松下的手册,说明FP0R-C32CT的输出端为NPN型,
那么张大头控制板与FP0R-C32CT的接线方式为:
V+ → 24V
Gnd → 0V
Com → 24V
En → 不接
Stp → Y0
Dir → Y1
在张大头控制板的小屏幕上,把En项改为Hold,这样就能让En端口悬空不接了。如果不想这样(即屏幕上的En项是L或H),那就把En端口接到Y2等尚未用到的输出口上。
而Y0,Y1对应前面的“402 脉冲输出:通道0”,“脉冲输出(Y0-Y1)”,再结合下图(来源于松下PDF手册),在输出端口Y6,Y7以及YE,YF下方的两个端口,需要分别接上外部电源的正负极。因为FP0R-C32CT的负荷允许电压变动范围是4.75~26.4V,张大头的控制板可接受3.3V~28V的脉冲信号,前一个电压区间包含在后一个电压区间内,所以Y6,Y7下方的电源端口可以接4.75~26.4V的直流电源,不过既然给PLC供电的就是24V电源,那就直接给Y6,Y7下方的电源端口接上24V电源了。如果你用的是雷赛之类的驱动器,只能接受5V的脉冲信号,那要么给Y6,Y7下方的电源端口接上5V的电源,要么在信号进入雷赛驱动器之前串联电阻降压。
我在学习过程中还遇到一个问题:PLC故障红灯常亮,与电脑无法通讯,电脑设备管理器中看不到COM口,给PLC断电重启也无法解决。这是因为上电前切换开关被拨到了RUN位置,只要把切换开关拨到PROG位置,再重新上电,就能消除红灯了。造成这个问题的原因是,在ST代码中使用了死循环,
while (1<2) doif (X0) thenF172_PulseOutput_Jog(s_dutDataTable:= dut1, n_iPulseOutputChannel:= 0);end_if;
end_while;
所以不要使用这样的死循环。
while,do,if,then,end_if,end_while 等关键词都不区分大小写。
下面给一段能让电机正反转的代码,修改ControlCode的从右到左第2位即可改变方向。
dut1.diInitialAndFinalSpeed:=1; //DINT, 32bit
dut1.diTargetSpeed:=1000; //DINT
dut1.diAccelerationTime:=200; //DINT
dut1.diDecelerationTime:=200; //DINTif (X0) thendut1.dwControlCode:=16#10000011; //正转F172_PulseOutput_Jog(s_dutDataTable := dut1, n_iPulseOutputChannel := 0);
end_if;
if (X1) thendut1.dwControlCode:=16#10000001; //反转F172_PulseOutput_Jog(s_dutDataTable := dut1, n_iPulseOutputChannel := 0);
end_if;
可以在X0,X1输入点接上按钮或者限位开关,也可以啥都不接,靠Control FPWIN Pro 7的强制功能修改X0的值:在X0上右键,勾选“强制'X0'数值”,然后就能靠“Ctrl+Alt+单击”来改变X0的值,测试步进电机的运动效果。但是在仿真模式下不能强制。