青益云记

平凡的人,平凡的事,平凡心做平凡事

  • 139
  • 文章数
  • 6
  • 分类数
  • 352
  • 评论数
标题

「 [学习记录] Twincat 3 虚拟轴运动练习 -1- 」

青益   |  2024年12月02日 前言 攥写偏主观,有问题在评论区提出; 另外,本站更换了Giscuz评论,任何人评论都需要登录Github! 根据Beckhoff...
内容

前言

攥写偏主观,有问题在评论区提出;

另外,本站更换了Giscuz评论,任何人评论都需要登录Github!

根据Beckhoff官方视频教程如下几个标题:

 Gear.mp4、PLC_code.mp4、System_config.mp4、TC3_Connet_ScanIO_Freerun.mp4、TC3_Motion_Gear1.mp4、TC3_Motion_Gear2.mp4、TC3_Program_Autostart.mp4 

其中主要学习了两个实践:

  1. 轴运动,轴的耦合运动,传感器模拟设置原点 ...
  2. 关于扫描IO部分,使用了大寰系夹爪,和他家的XML通讯文件进行Freerun调试(这里其实更想用电机做实验,就可以两个实践合并为单个实践,电机是有,但是伺服驱动器没有多余的可练习的便使用了同样使用Ethercat通讯的大寰PGE系列的夹爪进行学习)
  • 本文不记录(2)

内容

  1. 在最开始的时候先依次建立两个POU程序AXIScontrolHmiControl两个文件,创立的意义在于分清Axis轴动控制,和Hmi触摸屏控制; 然后在Main程序中依次引入就可以了如下:
AXIScontrol();
//引入HMI控制
HmiControl();
  1. 在 (1)之前理应创立好对应的nc虚拟轴,master主轴和slave跟踪轴,(如果是硬件连接了ethercat实体伺服+电机,Twincat系统会自动创建Nc轴)

  2. 根据让轴运动的思路,理应给轴使能,我们需要MC_power功能块;在Twincat3中的references中可引入Tc2_MC2后才能在输入助手中找到该功能块,同时我还引入了Tc2_MC2_Camming,这样就可以引入耦合功能块

我建立了两个轴,一个叫做axis 一个叫做axis2

//变量表
PROGRAM AXIScontrol
VAR
	bstart : int :=0;
	axis,axis2:axis_ref;	
	power_do: BOOL;
	axis_power : MC_Power;
	axis_power2 : MC_Power;
	axis_jog :MC_Jog;
	axis_jog2:MC_Jog;
	axis_headmove: BOOL;
	axis_rela : MC_MoveRelative;
	axismoverela_distance: LREAL;
	axismoverela_velocity: LREAL;
	axismoverela_staus : BOOL;
	ton1 :TON;
	gearin :MC_GearIn;
	gearout :MC_GearOut;
	axis_headmove2: BOOL;
	AxisReset1:MC_Reset;
	AxisReset2:MC_Reset;
	Axis1Setpos:MC_SetPosition;
	Axis1Setpos_do:BOOL;
	Axis1SetposWord:REAL;
	Axis2SetposWord:REAL;
	Axis2Setpos:MC_SetPosition;
	Axis2Setpos_do:BOOL;
	Axis1Home:MC_Home;
	Axis2Home:MC_Home;
	Axis1Home_do :BOOL;
	Axis2Home_do :BOOL;
	HomeSensor : BOOL;
	AxisCamIn:MC_CamIn;
	AxisCamIn_do :BOOL;
	AxisCamout :MC_CamOut;
	AxisCamout_do :BOOL;
	

END_VAR
VAR_INPUT
	axismoverela_do: BOOL :=FALSE;
	AxisReset_do : BOOL :=FALSE ;
	gearin_do : BOOL;
	gearout_do : bool;
END_VAR
//给nc轴上使能
axis_power(
	Axis:= axis, 
	Enable:= power_do, 
	Enable_Positive:= TRUE, 
	Enable_Negative:=TRUE, 
	Override:= , 
	BufferMode:= , 
	Options:= , 
	Status=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );
axis_power2(
	Axis:= axis2, 
	Enable:= power_do, 
	Enable_Positive:= TRUE, 
	Enable_Negative:=TRUE, 
	Override:= , 
	BufferMode:= , 
	Options:= , 
	Status=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );
//JOG
axis_jog(
	Axis:=axis , 
	JogForward:= axis_headmove , 
	JogBackwards:= , 
	Mode:= , 
	Position:= , 
	Velocity:= , 
	Acceleration:= , 
	Deceleration:= , 
	Jerk:= , 
	Done=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
axis_jog2(
	Axis:=axis2, 
	JogForward:= axis_headmove2 , 
	JogBackwards:= , 
	Mode:= , 
	Position:= , 
	Velocity:= , 
	Acceleration:= , 
	Deceleration:= , 
	Jerk:= , 
	Done=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
//相对运动
axis_rela(
	Axis:= axis, 
	Execute:= axismoverela_do, 
	Distance:= axismoverela_distance, 
	Velocity:= axismoverela_velocity, 
	Acceleration:= , 
	Deceleration:= , 
	Jerk:= , 
	BufferMode:= , 
	Options:= , 
	Done=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
//ALL轴复位
AxisReset1(
	Axis:= axis, 
	Execute:= AxisReset_do, 
	Done=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );

AxisReset2(
	Axis:= axis2, 
	Execute:= AxisReset_do, 
	Done=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );
//设置当前位置
Axis1Setpos(
	Axis:= Axis, 
	Execute:= Axis1Setpos_do , 
	Position:=Axis1SetposWord , 
	Mode:= , 
	Options:= , 
	Done=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );
Axis2Setpos(
	Axis:= Axis2, 
	Execute:= Axis2Setpos_do , 
	Position:=Axis2SetposWord , 
	Mode:= , 
	Options:= , 
	Done=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );
//电子齿轮-两轴耦合
gearin(
	Master:= axis, 
	Slave:= axis2, 
	Execute:=gearin_do , 
	RatioNumerator:= 1, 
	RatioDenominator:= 1, 
	Acceleration:= , 
	Deceleration:= , 
	Jerk:= , 
	BufferMode:= , 
	Options:= , 
	InGear=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
//电子齿轮-两轴解耦合
gearout(
	Slave:= axis2, 
	Execute:=gearout_do , 
	Options:= , 
	Done=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );
//设置原点home位
Axis1Home(
	Axis:= axis, 
	Execute:= Axis1Home_do, 
	Position:= 0, 
	HomingMode:= , 
	BufferMode:= , 
	Options:= , 
	bCalibrationCam:= HomeSensor, 
	Done=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
Axis2Home(
	Axis:= axis2, 
	Execute:= Axis2Home_do, 
	Position:= 0, 
	HomingMode:= , 
	BufferMode:= , 
	Options:= , 
	bCalibrationCam:=HomeSensor , 
	Done=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
//电子凸轮表
AxisCamIn(
	Master:= axis, 
	Slave:= axis2, 
	Execute:= AxisCamIn_do, 
	MasterOffset:= , 
	SlaveOffset:= , 
	MasterScaling:= , 
	SlaveScaling:= , 
	StartMode:= , 
	CamTableID:= 1, 
	BufferMode:= , 
	Options:= , 
	InSync=> , 
	Busy=> , 
	Active=> , 
	CommandAborted=> , 
	Error=> , 
	ErrorID=> );
AxisCamout(
	Slave:= axis2, 
	Execute:= AxisCamout_do, 
	Options:= , 
	Done=> , 
	Busy=> , 
	Error=> , 
	ErrorID=> );

在所有功能块中Execute均指向触发变量,都由触发变量来决定是否启用,这样就可以编写触摸屏程序达到目的

完,随便写了这样一篇,主要是为了存档记录,其中细节不做阐述,都可以在Beckhoff的infosys中可查,有误可在评论区指出