1搭建轴组:
1 【Application】右键,添加对象【轴组】
2 【虚轴】拖入【轴组】轴臂内。
3 【软轴总线】优先级,低于Main
轴组12108故障:PRG程序要在MainTask下。
急停 stop
暂停 halt
PRG管理用FBD
轴组模型显示坐标在CNC里
按住虚轴拖入轴组模型。
点动Jog2:
jog2 : SMC_GroupJog2 := (); // 点动
见 Robotics_Jogging.project 安装目录下的示例项目
CODESYS 在下面 ..\CODESYS SoftMotion\Examples.
此示例演示如何使用 SMC_GroupJog2 宝。
激活轴组(状态 0)
配置工具(状态 5)
配置 MCS(状态 6)
开始慢跑(状态 10)
Forward : ARRAY[0..5] OF BOOL ; '正转,对应0~5轴,点正'
Backward : ARRAY[0..5] OF BOOL ; '反转,对应0~5轴,点反'
输入:
AxisGroup AXIS_GROUP_REF_SM3 对一组轴的引用
【1】Enable 【True】
【2】Forward 正点动。'0~5轴,点正转'
【3】Backward 反点动。
MaxLinearDistance 单次最大【线距离】
MaxAngularDistance 单次最大【角度】
Velocity 速度
Acceleration 加速度
Deceleration 减速度
Jerk 【冲击速度】
VelFactor 速度系数【100%】
AccFactor 加速系数【100%】
JerkFactor 冲击系数【100%】
TorqueFactor 扭矩系数【100%】
CoordSystem 【坐标系统】
ABC_as_ACS 【1】混合运动,【0】笛卡尔 'ABC_as_ACS = FALSE'
输出:
Busy BOOL FB忙
Error BOOL 错误
ErrorID SMC_ERROR 错误码
CurrentPosition SMC_POS_REF 轴组【当前位置】
2数据类型:
VAR_IN_OUT
AxisGroup: AXIS_GROUP_REF_SM3;
END_VAR
AXIS_GROUP_REF_SM3 '轴组类型'
【】MC_SetCoordinateTransform (FB)'坐标变换'
PCS工件坐标
MCS机械坐标
ACS电机轴坐标
SMC_POS_REF (UNION) '空间坐标系oop'
TRAFO.AXISPOS_REF '机械轴坐标'【PCS工件坐标】【MCS笛卡尔】【ACS轴坐标】
MC_COORD_REF (STRUCT) '笛卡尔位置6'
MC_EXECUTION_MODE (ENUM) 执行模式
SMC_AXIS_GROUP_STATE '轴组状态'
SMC_COORD_SYSTEM (ALIAS) '坐标系统'
SMC_DYN_LIMITS (ALIAS) '极限位保护'
SMC_AXIS_GROUP_CONTINUE_DATA (FB) '中断运动'
3常用方法【FB】:
SMC_GroupPower (FB) '轴组【上电】'【1】
MC_GroupEnable (FB) '轴组【使能】'【2】
SMC_GroupJog2 (FB) ' 【点动】'【3】
MC_MoveLinearAbsolute (FB) '【线性】绝对定位'【4 直线插补】
MC_GroupSetPosition (FB)'轴组【重置定位】'
MC_GroupStop (FB) '【急停】'
MC_GroupHalt (FB) '【暂停】'
MC_GroupReset (FB) '【复位】'
MC_TrackConveyorBelt (FB) '追踪 传送带 上的工件。'
MC_TrackRotaryTable (FB) '追踪 转盘 上的工件。'
MC_MoveDirectAbsolute (FB) '【直接】绝对定位'【点】
MC_MoveDirectRelative (FB) '【直接】相对定位'
MC_MoveLinearAbsolute (FB) '【线性】绝对定位'【线】
MC_MoveLinearRelative (FB) '【线性】相对定位'
MC_MoveCircularAbsolute (FB) '【圆弧】绝对定位'【圆弧】
MC_MoveCircularRelative (FB) '【圆弧】相对定位'
MC_GroupDisable (FB) '轴组【关闭】'
SMC_GroupWait (FB) '轴组【等待】'
SMC_GroupEnableResumeAfterError (FB) '确认错误,继续运行'
SMC_StartupAxisGroup (FB) 【SMC启动轴组】
MC_AddAxisToGroup (FB)添加一个轴
MC_GroupDisable (FB)'关闭'
MC_GroupEnable (FB)'使能'
MC_GroupReset (FB)'复位'
MC_GroupSetPosition (FB)'重置坐标'
MC_RemoveAxisFromGroup (FB)删除一个轴
MC_UngroupAllAxes (FB)更新轴
SMC_GroupPower (FB)'电源'
SMC_GroupReadTool (FB) 【此FB用于读取刀具偏移。】
SMC_GroupSaveContinueData (FB)【保存连续数据。】
SMC_GroupSetLoad (FB) 负载
SMC_GroupSetPathTolerance (FB)设置用于新移动的路径公差。
SMC_GroupSetTool (FB) 配置新刀具。
SMC_GroupSetUnits (FB)国际单位的转换系数。
Computation'计算'
SMC_GroupUpdate (FB)此功能块可用于提前执行轴组的所有隐式计算。
SMC_SetMovementQueueBuffer (FB)用于引用外部缓冲区并给出其大小来修改内部使用的移动队列的大小。
【】SMC_TuneCPKernel (FB)此功能块可用于调整CP移动内核的行为。
Coordinate systems'坐标系统'
【】MC_SetCoordinateTransform (FB)坐标变换
MC_SetDynCoordTransform (FB)动态坐标变换耦合两个轴组。
【】MC_TrackConveyorBelt (FB)用于跟踪传送带上的工件。
【】MC_TrackRotaryTable (FB)用于跟踪转盘上的工件。
SMC_SetDynCoordTransformEx (FB)设置动态产品坐标系(PCS)。
Dynamics'运动'
MC_GroupSetOverride (FB)运动覆盖
SMC_GroupReadAxisLimitFactors (FB)限位
SMC_GroupSetAncillaryAxisLimits (FB)
SMC_GroupSetAncillaryPathLimits (FB)
SMC_GroupSetAxisLimitFactors (FB)
SMC_GroupSetDynamics (FB)
SMC_SetDynamicLimitFactors (FB)
Kinematics'运动学'
MC_SetKinTransform (FB)
SMC_KinConfigActivateAutomaticPeriods (FB)
SMC_SetKinConfiguration (FB)
Trigger'触发'
SMC_GroupPrepareTrigger (FB)
SMC_GroupReadTrigger (FB)
SMC_TRIGGER_ID (ALIAS)
SMC_TRIGGER_INFO (STRUCT)
SMC_TRIGGER_STATUS (ENUM)
SMC_TriggerPosition (UNION)
SMC_TriggerPositionType (ENUM)
SMC_TriggerPosition_Plane (STRUCT)
Diagnostics '诊断'
MC_GroupReadActualAcceleration (FB)
MC_GroupReadActualPosition (FB)
MC_GroupReadActualVelocity (FB)
MC_GroupReadConfiguration (FB)
MC_GroupReadError (FB)
MC_GroupReadStatus (FB)
MC_ReadCoordinateTransform (FB)
MC_ReadKinTransform (FB)
SMC_GroupAddOffset (FB)
SMC_GroupConvertPosition (FB)
SMC_GroupGetContinuePosition (FB)
SMC_GroupGetContinueToolOffset (FB)
SMC_GroupReadPathDynamics (FB)
SMC_GroupReadPlanningStatistics (FB)
SMC_GroupReadPositionInMovement (FB)
SMC_GroupReadRemainingTrajectoryDuration (FB)
SMC_GroupReadSetAcceleration (FB)
SMC_GroupReadSetJerk (FB)
SMC_GroupReadSetPosition (FB)
SMC_GroupReadSetVelocity (FB)
SMC_GroupTargetPosition (FB)
SMC_ReadKinTransformForAxis (FB)
Movement'移动'
GroupInterrupt 组中断
SMC_GroupInterruptAt (FB)
SMC_GroupInterruptPosition (UNION)
SMC_GroupInterruptPositionMvtRel (STRUCT)
MC_GroupContinue (FB)
MC_GroupHalt (FB)
MC_GroupInterrupt (FB)
MC_GroupStop (FB)
MC_MoveCircularAbsolute (FB)
MC_MoveCircularRelative (FB)
MC_MoveDirectAbsolute (FB) '直接,绝对定位'
MC_MoveDirectRelative (FB)
MC_MoveLinearAbsolute (FB)
MC_MoveLinearRelative (FB)
SMC_GroupEnableResumeAfterError (FB)
SMC_GroupJog (FB)
SMC_GroupJog2 (FB)'点动'
SMC_GroupUpdateContinueData (FB)
SMC_GroupWait (FB)
SMC_GroupReadTool (FB) '读取【刀具】偏置'
MC_TrackConveyorBelt (FB) '皮带'
MC_TrackRotaryTable (FB) '转盘'
SMC_SetDynCoordTransformEx (FB)'产品'
SMC_GroupSetTool (FB)
SMC_GroupSetUnits (FB) '坐标单位转换'
MC_SetCoordinateTransform (FB)
SMC_GroupSaveContinueData (FB) '保存【继续下一步】'
MC_GroupContinue (FB)
SMC_GroupUpdateContinueData (FB)
SMC_SetMovementQueueBuffer (FB)
SMC_StartupAxisGroup (FB) '添加轴组'
MC_AddAxisToGroup (FB) '添加单轴到轴组'
MC_SetDynCoordTransform (FB) '耦合其他轴组'
MC_RemoveAxisFromGroup (FB) '删除单轴'
MC_UngroupAllAxes (FB) '删除所有轴'
SMC_GroupUpdate (FB)
SMC_GroupSetLoad (FB)
PCS工件坐标
MCS机械臂坐标
ACS伺服轴坐标
轴组是单轴控制的进阶【实际可以直接学轴组】
轴组用法和单轴差不多,都是调用函数,但是函数名【不同】。
需要记关键字【power】【enable】等
输入助手里,也是输入关键字,再选取需要的FB
平时需要多看看库的函数名称,不用背下来,用多了,就熟悉了。
【使能】Enable
Power 电机使能【3个输入为True】 '上电'
Enable 轴组模型可用【2个输入为True】 '使能'
当用可视化时,FB输入必须悬空
轴组模型下,轴数不能超过模型总轴数。
【相对定位】
MC_MoveDirectRelative
(FB)
MC_MoveDirectRelative (FB) '【直接】相对定位'
【绝对定位】
MC_MoveDirectAbsolute (FB) '【直接】绝对定位'
【1】Execute 在上升边缘开始运动
【2】Position 坐标系统' SMC_POS_REF '
MovementType PTP运动的类型。不再支持。
这种过时的输入将在未来的版本中删除。
【3】CoordSystem 适用坐标系' SMC_COORD_SYSTEM.MCS '
【4】BufferMode 定义FB相对于前一个块的时间顺序。
TransitionMode 混合缓冲模式下的混合
TransitionParameter 混合的参数
VelFactor 【速度百分比】必须在[0,1]的范围内。
AccFactor 【加速百分比】必须在[0,1]的范围内。
JerkFactor 【冲击百分比】电机起跳速度%,该系数必须在[0,1]的范围内。
TorqueFactor 【力矩百分比】扭矩乘以该系数,该系数必须在[0,1]的范围内。
必须使用SMC_GroupSetDynamics设置动态模型,此因素才会产生影响。
4坐标系统:
定位:MC_COORD_REF 笛卡尔坐标
a:电机轴坐标,c:笛卡尔坐标(逆变换),v:坐标数组(电机组坐标)
SMC_POS_REF:在工具箱》合成器》然后拖到,输入SMC_POS_REF
SMC_TRAFO_5Axes(FB)// 五轴雕刻机【笛卡尔到电机】
SMC_TRAFOF_5Axes(FB)// 五轴雕刻机【正计算可绑定可视化控件】电机到笛卡尔
a 电机坐标
c 笛卡尔坐标
v 轴组坐标【单电机坐标】' v轴组坐标: ARRAY [0..(SMC_RCNST.MAX_AXES - 1)] OF LREAL; '
SMC_IMPLICIT_POS '隐藏的坐标'
' SMC_POS_REF '
' SMC_COORD_SYSTEM.MCS '
5从轴跟随:
轴组会用到主从关系【X1和X2】
我的思路是: 虚轴【主】》X1【从】
X2是X1的从轴。
因为X1实际位置有波动,那X2也必须跟随。要不然机械上扭大梁,尤其是双齿条X轴大梁,会损坏机械。
【X2伺服需要配置成 力矩位置混合模式 PRT模式 】
从轴1: SMC_TrackAxis( //移动轴
Master:=SM_Drive_Virtual_1 , //'主'
Slave:= x1, //从
bExecute:= 1, //【上升沿】块工作
Velocity:= , //最大速度[u/s]。
Acceleration:= , //最大加速度,单位为[u/s²]。
Deceleration:= , //最大减速度,单位为【u/s²】。
Jerk:= , // 起跳速度,单位为【u/s²】。【冲击速度】
bBusy=> , //TRUE:功能块的执行尚未完成。
bCommandAborted=> , //TRUE:命令已被另一个命令中止。
bError=> , //TRUE:功能块内发生错误。
iErrorID=> , //错误码
bInSync=> );//轴是否与给定的设定值同步。
从轴2:SMC_ControlAxisByPos(
Axis:= x1, //目标轴
iStatus:= ,// SMC_Interpolator实例的状态
bEnable:= , //TRUE:开始执行
bAvoidGaps:= , //TRUE:开始监测位置
fSetPosition:= SM_Drive_Virtual_1, //在[u]中设置轴的位置。
fGapVelocity:= , //跳过的速度,单位为[u/s]
fGapAcceleration:= , //跳过的加速度[u/s2]
fGapDeceleration:= , //跳跃绕过的减速[u/s2]
fGapJerk:= , //在[u/s3]中跳过跳跃的跳跃
bBusy=> , //TRUE:功能块运行
bCommandAborted=> , //TRUE:执行被另一个在轴上操作的功能块实例中断。
bError=> , //TRUE:出现错误
iErrorID=> , //错误码
bStopIpo=> );//TRUE:速度或位置发生跳跃,并且正在运行对新位置的适应。
6二次开发:
变量:
FUNCTION_BLOCK FB_Group轴组
VAR_IN_OUT
AxisGroup1: AXIS_GROUP_REF_SM3;//【轴组】
END_VAR
VAR_INPUT
u1电源:BOOL;
u1使能:BOOL;
u1关闭:BOOL;
u1复位:BOOL;
u1急停:BOOL;
u1暂停:BOOL;
u1中断:BOOL;
u1继续:BOOL;
u1点动:BOOL;
lf速度:LREAL:=5.0;
lf加速:LREAL:=5.0;
lf减速:LREAL:=5.0;
lf冲击速:LREAL:=5.0;
lf速度百分比:LREAL:=1.0;
lf加速百分比:LREAL:=1.0;
lf冲击速百分比:LREAL:=1.0;
lf减速百分比:LREAL:=1.0;
lf力矩百分比:LREAL:=1.0;
u1直线插补绝对:BOOL;
u1直线插补相对:BOOL;
u1圆弧插补绝对:BOOL;
u1圆弧插补相对:BOOL;
u1立即绝对:BOOL;
u1立即相对:BOOL;
END_VAR
VAR_OUTPUT
u1完成:BOOL;
u1忙碌: BOOL;
u1错误: BOOL;
u16故障码: SMC_ERROR;
u64当前轴数:udint;
END_VAR
VAR
SMC_GroupPower_0: SM3_Robotics.SMC_GroupPower;// 电源
MC_GroupEnable_0: SM3_Robotics.MC_GroupEnable;// 使能
MC_GroupDisable_0: SM3_Robotics.MC_GroupDisable;// 关闭
MC_GroupReset_0: SM3_Robotics.MC_GroupReset;// 【复位】
MC_GroupStop_0: SM3_Robotics.MC_GroupStop;//【急停】
MC_GroupHalt_0: SM3_Robotics.MC_GroupHalt;//【暂停】
SMC_GroupJog2_0: SMC_GroupJog2;// 点动
MC_AddAxisToGroup_0: MC_AddAxisToGroup;
MC_RemoveAxisFromGroup_0: MC_RemoveAxisFromGroup;
oop坐标: SMC_POS_REF;
oop刀头坐标: SMC_COORD_SYSTEM;
MC_MoveDirectAbsolute_0: MC_MoveDirectAbsolute;
MC_MoveDirectRelative_0: MC_MoveDirectRelative;
MC_UngroupAllAxes_0: MC_UngroupAllAxes;
虚0轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚1轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚2轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚3轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚4轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚5轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
BufferMode: SM3_Robotics.MC_BUFFER_MODE;
MC_GroupSetPosition_0: MC_GroupSetPosition;
SMC_TRAFO_5Axes_0: SMC_TRAFO_5Axes;
SMC_TRAFOF_5Axes_0: SMC_TRAFOF_5Axes;
v轴组坐标: ARRAY [0..(SMC_RCNST.MAX_AXES - 1)] OF LREAL;
imp: SMC_IMPLICIT_POS;// 隐式坐标
MC_TrackConveyorBelt_0: MC_TrackConveyorBelt;
MC_MoveLinearAbsolute_0: MC_MoveLinearAbsolute;
MC_MoveLinearRelative_0: MC_MoveLinearRelative;
END_VAR
程序:
练习:
1轴组对象: AXIS_GROUP_REF_SM3 (FB)
2轴组使能:SMC_GroupPower(电机使能) MC_GroupEnable(轴组使能)
power用于电机【上电】,enable用于轴组模型【可操作】。
先电机使能,再轴组使能。
电机群使能:SMC_GroupPower (3个bool为True)
电机群脱机:SMC_GroupPower (bRegulatorOn为电机群开关)另2个bool为True
轴组使能:MC_GroupEnable (使能下,才能控制轴组运动)
轴组关闭:MC_GroupDisable
2轴组状态:MC_GroupReadStatus ()
可配置:移动,回零,错停,待命,停止,关闭
绝对定位:MC_MoveDirectAbsolute
https://content.helpme-codesys.com/en/libs/SM3_Robotics/Current/SM3_Robotics/fld-SM3_Robotics.html
MC_MoveCircularAbsolute 绝对【圆弧插补】
MC_MoveCircularRelative 相对【圆弧插补】
MC_MoveDirectAbsolute 绝对【点到点】
MC_MoveDirectRelative 相对【点到点】
MC_MoveLinearAbsolute 绝对【直线插补】
MC_MoveLinearRelative 相对【直线插补】
SMC _ GroupEnableResumeAfterError 复位故障
SMC_GroupUpdateContinueData 下一个坐标
SMC_GroupWait 运动间隔(秒)
点动: SMC_GroupJog2
保存轴位置: SMC_GroupSaveContinueData
继续: MC_GroupContinue
暂停: MC_GroupHalt (暂停)
中断: MC_GroupInterrupt
MC_GroupInterrupt 运动中断(运动突然停止)
MC_GroupInterruptAt,在特定位置执行停止【中断】
急停: MC_GroupStop (急停)
脱机:
MC_GroupDisable
电机上电: SMC_GroupPower
轴组使能: MC_GroupEnable
复位: MC_GroupReset
零点坐标设置: MC _ group set position
增一个轴: MC _ AddAxisToGroup
删一个轴: MC_RemoveAxisFromGroup
刀具偏移: SMC _ group read tool SMC_GroupSetTool
传送带工件: MC _ trackcelpetorbelt MC_TrackConveyorBelt
转盘上工件: MC _ TrackRotaryTable
活动坐标工件: SMC_SetDynCoordTransformEx
附加轴: 获取附加轴坐标: SMC_POSINFO (STRUCT)
刀具修正:
CNC加工流程:
1 SMC_CNC_REF 实例对象
2 SMC_NCDecoder G代码解析(存储在SMC_OUTQUEUE)
3 SMC_Interpolator 插补器
xp:ARRAY[1..2] OF REAL:= [100,50];
yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path
VAR
iState : INT;
QUEUE : SMC_OUTQUEUE;
BUF : ARRAY[0..49] OF SMC_GEOINFO;
// Memory allocation
GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0);
// Initial path element
n : INT := 0;
QUEUE.nSize := SIZEOF(BUF);
END_VAR
CASE iState OF
0:
QUEUE.pbyBuffer := ADR(BUF[0]);
// Initialize QUEUE
SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF));
iState := iState + 1;
1:
// Fill QUEUE
WHILE NOT QUEUE.bFull DO
// When QUEUE is full, wait until it has been processed by the following FBs
n := n + 1;
GEO.iSourceLine_No := n;
GEO.piStartPos := GEO.piDestPos;
// Copying last destination
GEO.iMoveType := LIN;
// Generating linear movement
GEO.iObjNo := GEO.iObjNo + 1;
// Calculating number
GEO.piDestPos.dX := xp[n];
// Generatint position
GEO.piDestPos.dY := yp[n];
SMC_CalcLengthGeo(pg := ADR(GEO));
// Calculating length of object with the help of the standard function
SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO));
// Appending object to QUEUE
IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN
// All target positions processed
QUEUE.bEndOfList := TRUE;
n := 0;
iState := 2;
EXIT;
END_IF
END_WHILE
2:
//Done
;
END_CASE
CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing
获取单轴坐标:
这个是伺服坐标,取出后要做倍率计算。
ui上的坐标实际可以直接提取,在402轴对象Axis对象 内
io映射,实际就是对象,它存储在内存地址上。
dsp402_statemachine.axis.fsetPosition缩放UI坐标
.axis.diSetPosition伺服目标坐标32bit, ±214米
问题:
总线任务挂不上:
【不要勾选】带命名空间。
或者,点击【虚轴】拖入轴组内。
从轴对象句柄:
虚0轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚1轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚2轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚3轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚4轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
虚5轴地址: POINTER TO SM3_Basic.AXIS_REF_VIRTUAL_SM3;
u64当前轴数:=axisgroup.trafo.NumAxes;
虚0轴地址:=ADR(SM_Drive_Virtual);
虚1轴地址:=ADR(SM_Drive_Virtual_1);
虚2轴地址:=ADR(SM_Drive_Virtual_2);
虚3轴地址:=ADR(SM_Drive_Virtual_3);
虚4轴地址:=ADR(SM_Drive_Virtual_4);
虚5轴地址:=ADR(SM_Drive_Virtual_5);