2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块 ST和梯形图双语言

自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块 ST和梯形图双语言

时间:2022-11-17 23:20:06

相关推荐

自由落体运动c语言编程_欧姆龙NX PLC 轴运动功能块 ST和梯形图双语言

一. 前言

大部分主流品牌商编程时采用ST语言,如施耐德PLC等。ST是结构化文本编程,类似于C语言,不同于梯形图和顺序函数功能表。它的优点就是能简化复杂的数学方程,进行梯形图所难以执行的复杂计算,完成程式的建立;

少部分品牌商编程时采用C语言,可以通过C语言子函数调用的方式,加入到梯形图的体系中,主要起到辅助作用,它主要解决复杂的数字方程,解决梯形图无法达到的运算速度和效率,解决梯形图编程过于复杂的问题,用C语言编程可提高程序效率,如CRC校验,复杂浮点数运算,多项式函数运算,凸轮参数设置等

梯形图就是为了逻辑控制而产生的语言,平时大家用没必要死磕ST,ST在逻辑控制的直观性上肯定是不如梯形图,而ST在数据处理上的优势也很明显,所以各有所长,灵活运用即可,最重要的是白猫黑猫做出稳定设备的才是好猫.管你啥语言,干就完事.

二.轴运动功能块设计

1.运动控制需要的变量的建立

然后将这些变量放在一个结构体里面

这个轴控制结构体,包含配置,100个点位,报警,自动控制变量,手动控制变量,状态反馈

在全局变量在声明要使用轴变量,有几个轴就声明几个

参数配置可以用触摸屏直接访问相关变量设置即可

如设置0号轴的Jog速度

2.功能块设计--梯形图和ST混编

功能块输入输出

3.功能块设计--纯ST

注意:以下ST写未经测试

注意ST语言的上升沿下降沿是要自己写的

//手动使能IF Sys_Manual AND NOT tempMaualServoOn AND Axis.MaualControl.ServoOn AND NOT MaualServoOnLastSta THENtempMaualServoOn:=TRUE;END_IF;手动使能延时器(tempMaualServoOn,T#0.1s,手动使能置位延时,ET);IF (Axis.MaualControl.ServoOn AND MaualServoOnLastSta=FALSE AND 手动使能置位延时 )OR(Axis.AutoControl.ServoOn AND AutoServoOnLastSta=FALSE)OR(Axis.Status.Error AND ErrorLastSta=FALSE) THEN tempMaualServoOn:=FALSE;END_IF;AutoServoOnLastSta:=Axis.AutoControl.ServoOn;MaualServoOnLastSta:=Axis.MaualControl.ServoOn;ErrorLastSta:=Axis.Status.Error;//使能IF EStop THENIF Sys_Manual THENPower_On(Axis.Config.sAXIS_REF,tempMaualServoOn,FunctionStatus,FunctionBusy,FunctionError,FunctionErrorID);ELSEPower_On(Axis.Config.sAXIS_REF,Axis.AutoControl.ServoOn,FunctionStatus,FunctionBusy,FunctionError,FunctionErrorID);END_IF;END_IF;//使能状态Axis.Status.ServoOn:=Axis.Config.sAXIS_REF.DrvStatus.ServoOn;//复位Axis.AutoControl.Reset:=Reset;IF Axis.Config.sAXIS_REF.MFaultLvl.Active THENIF Axis.AutoControl.Reset OR Axis.MaualControl.Reset THEN Error_Reset( Axis.Config.sAXIS_REF,TRUE,FunctionDone,FunctionBusy,FunctionStatus,Axis.Error.ResetError,FunctionErrorID);END_IF;END_IF;//回零IF Axis.Status.ServoOn AND Axis.Config.Home_Interlock THEN IF Sys_Manual THENHome(Axis.Config.sAXIS_REF, Axis.MaualControl.StartHardHome, FunctionDone, HomeBusy, Axis.Error.HHomeCommandAbortedError, Axis.Error.HardHomeError, FunctionErrorID );ELSEHome(Axis.Config.sAXIS_REF, Axis.AutoControl.StartHardHome, FunctionDone, HomeBusy, Axis.Error.HHomeCommandAbortedError, Axis.Error.HardHomeError, FunctionErrorID );END_IF;END_IF;//回零状态Axis.Status.Homing:=Axis.Config.sAXIS_REF.Status.Homing;Axis.Status.HardHomed:=Axis.Config.sAXIS_REF.Details.Homed;//限位状态IF NOT Axis.Status.Homing AND NOT HomeBusy AND Axis.Config.sAXIS_REF.DrvStatus.P_OT THEN Axis.Status.HardPositiveSignal:=TRUE;ELSIF Axis.Status.HardPositiveSignal AND ( Axis.MaualControl.Reset OR Axis.AutoControl.Reset )THENAxis.Status.HardPositiveSignal:=FALSE;END_IF;IF NOT Axis.Status.Homing AND NOT HomeBusy AND Axis.Config.sAXIS_REF.DrvStatus.N_OT THENAxis.Status.HardNegativeSignal:=TRUE;ELSIF Axis.Status.HardNegativeSignal AND ( Axis.MaualControl.Reset OR Axis.AutoControl.Reset )THENAxis.Status.HardNegativeSignal:=FALSE;END_IF;//JOGIF Axis.Status.ServoOn THENIF NOT Axis.Status.HardPositiveSignal THEN IF NOT Sys_Manual AND Axis.AutoControl.JogPositive AND NOT Axis.AutoControl.JogNegative THEN tempJogPositive:=TRUE;ELSIF Sys_Manual AND Axis.MaualControl.JogPositive AND NOT Axis.MaualControl.JogNegative THENtempJogPositive:=TRUE;ELSEtempJogPositive:=FALSE;END_IF;END_IF;IF NOT Axis.Status.HardNegativeSignal THENIF NOT Sys_Manual AND Axis.AutoControl.JogNegative AND NOT Axis.AutoControl.JogPositive THENtempJogNegative:=TRUE;ELSIF Sys_Manual AND Axis.MaualControl.JogNegative AND NOT Axis.MaualControl.JogPositive THENtempJogNegative:=TRUE;ELSEtempJogNegative:=FALSE;END_IF;END_IF;END_IF;JOG(Axis.Config.sAXIS_REF,tempJogPositive,tempJogNegative,Axis.Config.Jog_velocity,Axis.Config.Manual_AccDec,Axis.Config.Manual_AccDec,FunctionBusy,FunctionAborted,Axis.Error.JogError,FunctionErrorID);//停止IF (MoveAbsoluteBusy OR MoveRelativeBusy) AND NOT Axis.Config.Move_Interlock THENStop(Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );ELSIF (HomeBusy OR MoveSoftZeroBusy) AND NOT Axis.Config.Home_Interlock THENStop(Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );ELSIF MoveAbsoluteBusy OR MoveRelativeBusy OR HomeBusy OR MoveSoftZeroBusy THENIF NOT Sys_Manual AND Axis.AutoControl.StopMove THENStop(Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );ELSIF Sys_Manual AND Axis.MaualControl.StopMove THENStop(Axis.Config.sAXIS_REF, TRUE, 10000, 10000, BuffMode, FunctionDone,stopBusy, FunctionActive, FunctionAborted, Axis.Error.StopError, FunctionErrorID );END_IF;END_IF;//绝对位移速度坐标设置IF Sys_Manual=TRUE THENtempDistance:=Axis.Config.Manual_RelativeMove_Pulse;tempPos:=Axis.Config.Manual_AbsoluteMovePulse;tempVel:=Axis.Config.Manual_velocity;tempAccDec:=Axis.Config.Manual_AccDec;tempJerk:=Axis.Config.Manual_jerk;ELSEtempDistance:=Axis.Config.Auto_RelativeMove_Pulse;tempPos:=Axis.Position_Table[PosIndex].Auto_AbsoluteMovePulse;tempVel:=Axis.Position_Table[PosIndex].Auto_AbsoluteMoveVelocity;tempAccDec:=Axis.Position_Table[PosIndex].Auto_AbsoluteMoveAccDec;tempJerk:=Axis.Position_Table[PosIndex].Auto_AbsoluteMoveJerk;END_IF;//移动限制,碰到极限只能往反方向移动IF Axis.Status.HardPositiveSignal =TRUE AND tempPos>0 THENtempAbsCondition:=FALSE;ELSIF Axis.Status.HardNegativeSignal =TRUE AND tempPos<0 THENtempAbsCondition:=FALSE;ELSEtempAbsCondition:=TRUE;END_IF;IF Axis.Status.HardPositiveSignal =TRUE AND tempDistance>0 THEN tempRelCondition:=FALSE;ELSIF Axis.Status.HardNegativeSignal =TRUE AND tempDistance<0 THEN tempRelCondition:=FALSE;ELSEtempRelCondition:=TRUE;END_IF;//绝对位移IF Axis.Config.Move_Interlock AND Axis.Status.ServoReady AND tempAbsCondition THENIF NOT Sys_Manual THENMoveAbsolute(Axis.Config.sAXIS_REF,Axis.AutoControl.AbsoluteMove,tempPos,tempVel,tempAccDec,tempAccDec,tempJerk,Direction,BuffMode,FunctionDone,MoveAbsoluteBusy,FunctionActive,Axis.Error.AbsCommandAbortedError,Axis.Error.AbsoluteMoveError,FunctionErrorID);ELSEMoveAbsolute(Axis.Config.sAXIS_REF,Axis.MaualControl.AbsoluteMove,tempPos,tempVel,tempAccDec,tempAccDec,tempJerk,Direction,BuffMode,FunctionDone,MoveAbsoluteBusy,FunctionActive,Axis.Error.AbsCommandAbortedError,Axis.Error.AbsoluteMoveError,FunctionErrorID);END_IF;END_IF;//相对位移IF Axis.Config.Move_Interlock AND Axis.Status.ServoReady AND tempRelCondition THENIF NOT Sys_Manual THENMoveRelative( Axis.Config.sAXIS_REF, Axis.AutoControl.RelativeMove, tempDistance,tempVel,tempAccDec, tempAccDec,tempJerk,BuffMode, FunctionDone, MoveRelativeBusy, FunctionActive, FunctionAborted, Axis.Error.RelativeMoveError, FunctionErrorID );ELSEMoveRelative( Axis.Config.sAXIS_REF, Axis.MaualControl.RelativeMove, tempDistance,tempVel,tempAccDec, tempAccDec,tempJerk,BuffMode, FunctionDone, MoveRelativeBusy, FunctionActive, FunctionAborted, Axis.Error.RelativeMoveError, FunctionErrorID );END_IF;END_IF;//软回零IF Axis.Config.Home_Interlock AND Axis.Status.ServoReady THENIF NOT Sys_Manual THENMoveSoftZero(Axis.Config.sAXIS_REF,Axis.AutoControl.StartSorftHome,Axis.Config.Manual_velocity,Axis.Config.Manual_AccDec,Axis.Config.Manual_AccDec,Axis.Config.Manual_jerk,BuffMode,FunctionDone,MoveSoftZeroBusy,FunctionActive,Axis.Error.SHomeCommandAbortedError,Axis.Error.SorftHomeError,FunctionErrorID);ELSEMoveSoftZero(Axis.Config.sAXIS_REF,Axis.MaualControl.StartSorftHome,Axis.Config.Manual_velocity,Axis.Config.Manual_AccDec,Axis.Config.Manual_AccDec,Axis.Config.Manual_jerk,BuffMode,FunctionDone,MoveSoftZeroBusy,FunctionActive,Axis.Error.SHomeCommandAbortedError,Axis.Error.SorftHomeError,FunctionErrorID);END_IF;END_IF;//位置到位检测FOR i:=0 TO SizeOfAry(Axis.Position_Table) BY 1 DOtempFirstPos:=Axis.Position_Table[i].Auto_AbsoluteMovePulse-PosCheckValue;tempLastPos:=Axis.Position_Table[i].Auto_AbsoluteMovePulse+PosCheckValue;Axis.Position_Table[i].Auto_InPositionedMark:=ZoneCmp(tempFirstPos,Axis.Config.sAXIS_REF.Act.Pos,tempLastPos);END_FOR;//轴运动Busy检测SvonBusy:=MoveAbsoluteBusy OR HomeBusy OR MoveSoftZeroBusy OR MoveRelativeBusy;IF SvonBusy AND SvonBusyLastSta=FALSE THENAxis.AutoControl.AbsoluteMove:=FALSE; Axis.AutoControl.StartSorftHome:=FALSE; Axis.AutoControl.RelativeMove:=FALSE; Axis.AutoControl.StartHardHome:=FALSE;END_IF;SvonBusyLastSta:=SvonBusy;//伺服状态Axis.Status.ServoIdle:=Axis.Config.sAXIS_REF.Details.Idle;Axis.Status.ServoReady:=NOT SvonBusy AND Axis.Status.ServoIdleAND Axis.Status.HardHomed AND Axis.Status.ServoOnAND NOT Axis.Status.AlarmingAND NOT Axis.Status.ErrorAND NOT Axis.AutoControl.StopMove;IF Axis.Status.ErrorCode=WORD#16#6440 THENAxis.Status.SoftPositiveSignal:=TRUE;ELSIF Axis.Status.ErrorCode=WORD#16#6441 THENAxis.Status.SoftNegativeSignal:=TRUE;ELSEAxis.Status.SoftPositiveSignal:=FALSE;Axis.Status.SoftNegativeSignal:=FALSE;END_IF;Axis.Status.EncoderPos:=LREAL_TO_REAL(Axis.Config.sAXIS_REF.Act.Pos);mandPos:=LREAL_TO_REAL(Axis.Config.sAXIS_REF.Cmd.Pos);//软回零状态确定IF MoveSoftZeroBusy THENAxis.Status.SorftHomed:=FALSE;END_IF;IF NOT MoveSoftZeroBusy AND MoveSoftZeroBusyLastSta THENIF Axis.Status.EncoderPos<0.5 AND Axis.Status.EncoderPos>-0.5 AND Axis.Status.HardHomed THENAxis.Status.SorftHomed:=TRUE; ELSEAxis.Status.SorftHomed:=FALSE;END_IF;END_IF;MoveSoftZeroBusyLastSta:= MoveSoftZeroBusy;//报警检测IF Axis.Config.sAXIS_REF.MFaultLvl.Active THEN Axis.Status.ErrorCode:=Axis.Config.sAXIS_REF.MFaultLvl.Code;Axis.Status.Error:=TRUE;ELSIF Axis.Status.HardPositiveSignal THENAxis.Status.Error:=TRUE;ELSIF Axis.Status.HardNegativeSignal THENAxis.Status.Error:=TRUE;ELSEAxis.Status.Error:=FALSE;END_IF;Axis.Status.Alarming:=Axis.Config.sAXIS_REF.DrvStatus.DrvAlarm OR Axis.Config.sAXIS_REF.DrvStatus.DrvWarning;

三.功能块调用

axisX:=0; axisY:=1; axisZ:=2; axisR:=3;Z上料位:=0;Z首片位:=1;R初始位:=0;R取片位:=1; R放片位:=2;Y初始位:=0;Y整形位:=1; X初始位:=0;X预取料位:=1; X取料位:=2;X物料整形位:=3;Axis[axisX].Config.sAXIS_REF:=MC_Axis000;Axis[axisY].Config.sAXIS_REF:=MC_Axis001;Axis[axisZ].Config.sAXIS_REF:=MC_Axis002;Axis[axisR].Config.sAXIS_REF:=MC_Axis003;

四.程序中使用

使能

回零

运动

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。