CODESYS 枕式机应用

    //----色标中断信号响应处理:将传送带轴当前位置存放到位置缓存
    IF SensorTriger=1 THEN
    IF (BufDeep<0) THEN
    BufDeep:=0; //防止出错
    END_IF
    IF BufDeep>=2 THEN
    BufDeep:=2; //最多只支持2个缓存,多于2个,丢弃,防止出错
    END_IF

    CASE BufDeep OF //--缓存指针,最多记住3个标志
    0:
    TargetPointArry0:=Axis_CONVERY.fActPosition;
    1:
    TargetPointArry1:=Axis_CONVERY.fActPosition;
    2:
    TargetPointArry2:=Axis_CONVERY.fActPosition;
    END_CASE

    BufDeep:=BufDeep+1;
    SensorTriger:=0;

    END_IF

    //-----自由计时器刷新,可用于判断超时错误-------->>--
    IF PowerupTimerS < 32700 THEN
    PowerupTimerS:=PowerupTimerS+2; //EtherCAT Period is 2ms
    END_IF

    //----按系统运行状态0~5分别处理---------------->>
    IF Sysstatus<0 OR Sysstatus>5 THEN //万一状态指针错误,纠正为重新开始运行
    Sysstatus:=0;
    END_IF

    CASE Sysstatus OF
    // System status: 0=Selfchecking; 1=Error; 2=Stopped; 3=Man-Jogging; 4=SlaveAxis Origining;
    // 5=MasterAxis firstrun;
    0: //上电自诊断,伺服使能 Self checking
    IF NOT Inited THEN
    //-----使能两个伺服驱动器----->>------
    MC_Power2(Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE, Axis:=Axis_FlyCut,);
    MC_Power1(Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE, Axis:=Axis_CONVERY,);

    MC_Power3(Enable:=TRUE, bRegulatorOn:=TRUE, bDriveStart:=TRUE, Axis:=Axis_ZJ,);

    Inited:= MC_Power1.Status AND MC_Power2.Status AND MC_Power3.Status;

    //-----超时错误判断------>>-----
    IF (PowerupTimerS> 10000) AND (Ethercat.xConfigFinished = FALSE) THEN
    SysStatuMark:=1; //EtherCAT Network/Cable Error
    Sysstatus:=1; //Error State
    END_IF

    IF (PowerupTimerS> 12000) AND (Ethercat.xError = TRUE) THEN
    SysStatuMark:=2; //EtherCAT Network/Cable Error
    Sysstatus:=1; //Error State
    END_IF

    ELSE
    Sysstatus :=2; //If two servo can be ENABLED, Switch to statu 2;
    SysStatuMark:=0; //OK
    END_IF

    1: //停机告警状态 Stopped,Error Alarming

    AxisConvy_RUN:=0;

    IF Reset_key=TRUE THEN //----如果手动复位按钮,
    Sysstatus:=0; //--退回到起始状态
    PowerupTimerS:=0; //--重新计时
    SysStatuMark:=0; //--清除告警

    IF EtherCAT.xConfigFinished=FALSE THEN
    EtherCAT.xRestart :=Reset_key; //---如果EtherCAT网络有问题,重启网络
    END_IF

    Reset_key:=FALSE;
    END_IF

    IF Setup_key=TRUE AND SysStatuMark=0 THEN //----系统正常的情况下,如果手动调试按钮,转到调试状态
    Sysstatus:=3;

    END_IF
    //Setup_key:=TRUE;
    IF Setup_key=FALSE AND SysStatuMark=0 THEN //----系统正常的情况下,如果手动调试按钮,转到调试状态
    Sysstatus:=2;

    END_IF

    2: //正常停机 Stopped, Normal

    AxisConvy_RUN:=0;

    IF Axis_CONVERY.nAxisState=4 OR Axis_CONVERY.nAxisState=5 THEN
    AxisConvery_Stop:=1; //此处给出停机标志
    END_IF

    IF Axis_FlyCut.nAxisState=4 OR Axis_FlyCut.nAxisState=5 THEN
    AxisFlyCut_Stop:=1; //此处给出停机标志
    END_IF

    IF Setup_key= TRUE THEN
    Sysstatus:= 3; //goto JOG and Setting

    END_IF

    IF Run_key= TRUE THEN
    Sysstatus:= 4; //Proparing to run
    Run_key:=0;
    Run1Cmd:=1;
    END_IF

    3: // Manual Jogging and setting, Omitted because of no Set_Key here
    MC_Jog1( Axis:= Axis_Convery, JogForward:= JOG_AxisConvery_for, JogBackward:=JOG_AxisConvery_bak, Velocity:= 100,Acceleration:= 1000, Deceleration:= 1000, );

    MC_Jog2( Axis:= Axis_FlyCut, JogBackward:= JOG_AxisFlyCut_for,JogBackward:=JOG_AxisFlyCut_bak, Velocity:= 100,Acceleration:= 1000, Deceleration:= 1000, );

    IF FlyZero_key= TRUE THEN
    MC_SetPosition1(Axis:= Axis_FlyCut,Execute:=TRUE,Mode:=FALSE,);
    FlyZero_key:= FALSE;
    END_IF

    IF Setup_key= FALSE AND JOG_AxisConvery_for= FALSE AND JOG_AxisFlyCut_for=FALSE AND JOG_AxisConvery_bak= FALSE AND JOG_AxisFlyCut_bak=FALSE THEN
    Sysstatus:= 2;
    END_IF

    4: //SlaveAxis Adjusting, 若飞剪轴不在等待位置,先回到原点
    MC_MoveAbsolute2(Axis:= Axis_FlyCut ,Execute:=Run1Cmd ,Position:=0 ,Velocity:=360 ,Acceleration:=3600 ,Deceleration:=3600 , );
    Run1Cmd :=0;
    //MC_Home1(Axis:= Axis_FlyCut, Execute:= Run1Cmd, Position:= 0, );

    IF MC_MoveAbsolute2.done=TRUE THEN
    MC_MoveAbsolute2(Axis:= Axis_FlyCut ,Execute:=FALSE ,);
    CAM_TabEnable:=TRUE;//凸轮表使能
    Sysstatus:=5; //goto runing

    //初始化用于同步起始点的比较寄存器缓冲,这里设计了2级缓冲,Clear CMR buffer------>>--
    CMR0:=0;
    CMR1:=0;
    CMR_Pointer:=0;

    //让自由计时器从新计时,便于检查色标信号超时判断--------->>-----
    PowerupTimerS:=0;

    END_IF

    5: //MasterAxis firstRun
    //传送带开始以速度方式运动,运行速度Vspeed为按时间变化----------------->>--
    AxisConvy_RUN:=TRUE;

    CAM_InEnable:=TRUE;//凸轮同步使能,由CMR+Offset比对匹配时,触发同步

    END_CASE

    //---以下为所有状态都需要的处理---------------->>
    //-----前面作了MC的执行触发、使能标志的处理,下面统一放在这里------>>
    MC_CAMTableSelect1(
    Master:= Axis_CONVERY,
    Slave:= Axis_FlyCut,
    CamTable:= Cam1,
    Execute:= CAM_TabEnable,
    Periodic:= FALSE,
    MasterAbsolute:= FALSE,
    SlaveAbsolute:= 1,
    Done=> Tbldn,
    Busy=> ,
    Error=> ,
    ErrorID=> ,
    CamTableID=> Cam1_ID);

    //---比较目标缓冲区的长度,触发CAM同步的判断、CamIn的触发-----
    IF CAM_InEnable=TRUE THEN
    IF BufDeep >0 THEN
    tmp1:=Axis_CONVERY.fActPosition-(TargetPointArry0+SensorCut_Length);
    IF tmp1>-0.1 THEN
    CamIn_trig:=1;

    TargetPointArry0:=TargetPointArry1;
    TargetPointArry1:=TargetPointArry2;
    BufDeep:=BufDeep-1;
    END_IF
    //---防错处理:若传送带的当前位置比比较点的位置大,清掉无用的比较点----->>
    (* (tmp1>0.1) THEN
    TargetPointArry0:=TargetPointArry1;
    TargetPointArry1:=TargetPointArry2;
    IF BufDeep>0 THEN
    BufDeep:=BufDeep-1;
    END_IF

    END_IF *)

    END_IF
    END_IF

    pp:=Run_key;

    MC_CamIn1(
    Master:= Axis_CONVERY,
    Slave:= Axis_FlyCut,
    Execute:= CamIn_trig,
    MasterOffset:= 0,
    SlaveOffset:= 0,
    MasterScaling:= 1,
    SlaveScaling:= -1,
    StartMode:=0 ,
    CamTableID:= Cam1_ID,
    VelocityDiff:= 0,
    Acceleration:= 30,
    Deceleration:= 30, );

    CamIn_trig:=FALSE; //

    MC_CamOut1(
    Slave:= Axis_FlyCut,
    Execute:= Stop_key,
    Done=> ,
    Busy=> ,
    Error=> ,
    ErrorID=> );

    MC_MoveVelocity1(Axis:= Axis_CONVERY , Execute:=AxisConvy_RUN , Velocity:= Vspeed , Acceleration:= 60, Deceleration:=60 , );

    //如果2个轴都已停稳3=standstill,返回停机状态
    (*IF Sysstatus=5 AND Axis_CONVERY.nAxisState=3 AND Axis_FlyCut.nAxisState =3 THEN
    Sysstatus:=2;
    END_IF
    *)
    //只要有1个轴故障停机1=errorstop,就返回故障停机状态
    IF Axis_CONVERY.nAxisState=1 OR Axis_FlyCut.nAxisState =1 THEN
    AxisFlyCut_Stop:=1;
    AxisConvery_Stop:=1;
    Sysstatus:=1;
    END_IF

    IF Stop_key=1 THEN
    AxisFlyCut_Stop:=1;
    AxisConvery_Stop:=1;
    AxisConvy_RUN:=0;
    Stop_key:=0;
    END_IF

    //----测试位移----->>
    MC_MoveRelative1(
    Axis:= Axis_CONVERY,
    Execute:= test1,
    Distance:=120 ,
    Velocity:= Vspeed,
    Acceleration:=60 ,
    Deceleration:= 60,
    );

    //----测试位移------>>
    MC_MoveRelative2(
    Axis:= Axis_FlyCut,
    Execute:= test2,
    Distance:=360 ,
    Velocity:= Vspeed,
    Acceleration:=60 ,
    Deceleration:= 60,
    );

    MC_Stop1(Axis:= Axis_CONVERY,Execute:=AxisConvery_Stop,);
    MC_Stop2(Axis:= Axis_FlyCut,Execute:=AxisFlyCut_Stop,);
    AxisFlyCut_Stop:=0;
    AxisConvery_Stop:=0;

    MC_Reset1(Axis:= Axis_CONVERY, Execute:= r1, );
    MC_Reset2(Axis:= Axis_FlyCut, Execute:= r2, );
    MC_Reset3(Axis:= Axis_ZJ, Execute:= r3, );

    IF Sysstatus >0 AND ( 飞剪伺服.wstate <>8) THEN
    b:=b+1;
    SysStatuMark:=2; //第二个伺服网络断线
    END_IF

    IF Sysstatus >0 AND ( 追剪伺服.wstate <>8) THEN
    a:=a+1;
    SysStatuMark:=3; //第一个伺服网络断线
    END_IF

    //---下面的语句是为了让MC指令能得到下一次的上升沿------------>>---
    MC_MoveAbsolute2(Axis:= Axis_FlyCut ,Execute:=FALSE , );
    MC_MoveVelocity1(Axis:= Axis_CONVERY , Execute:=FALSE,);
    MC_SetPosition1(Axis:= Axis_FlyCut,Execute:=FALSE,Mode:=FALSE,);

    继续阅读
    • 我的微信
    • 这是我的微信扫一扫
    • weinxin
    • 我的微信公众号
    • 我的微信公众号扫一扫
    • weinxin
    视觉计数工业应用 其他

    视觉计数工业应用

    视觉计数是一种广泛应用于工业领域的计算机视觉技术,其应用包括但不限于以下几个方面: 生产线计数:在生产线上,使用视觉计数技术可以快速准确地计数制造过程中的产品、物料和零部件等。这对于监控生产过程并及时...
    视觉筛选机与筒膜包装机在新能源电池应用 其他

    视觉筛选机与筒膜包装机在新能源电池应用

    视觉计数是指使用计算机视觉技术来识别和计数一组对象的数量。这种技术在许多领域都有应用,例如工业、军事、医疗等。在进行视觉计数时,精度是非常重要的,因为一个错误的计数可能会导致错误的决策或操作。 视觉计...
    视觉筛选机与筒膜包装机在新能源电池应用 其他

    视觉筛选机与筒膜包装机在新能源电池应用

    视觉筛选机与筒膜包装机在新能源电池应用方面有着重要的作用。下面我会对它们各自的应用进行介绍。 视觉筛选机在新能源电池应用中的作用: 视觉筛选机是一种利用计算机视觉技术对产品进行检测和筛选的设备。在新能...
    视觉筛选机与筒膜包装机应用 其他

    视觉筛选机与筒膜包装机应用

      在紧固件领域中,视觉筛选机与筒膜包装也有着各自的应用: 视觉筛选机在紧固件应用: 视觉筛选机可以用于对各种紧固件(如螺钉、螺母、垫圈等)进行表面缺陷检测和尺寸精度检测。例如,在螺钉制造过...