Ⅲ型系统外部轴---非同步轴

(*PDO非同步轴外部轴*)
//外部轴运动模块,暂时支持高创、华数驱动
PROGRAM PDOMoveExtAxis
VAR
//操作相关变量
    bEnable:                     BOOL;
    bdisable:                    BOOL;    
    bReset:                      BOOL;

    iCounter:                    INT;                            //计数器
    iExtNum:                     INT;                            //外部轴个数
    
    diPos:                       DINT:=0;                        //位置增量,决定速度
    
//控制字
    uiControlWordOutput:         UINT;                           //控制字
    
//PDO      
    abControlWordBit:            ARRAY[0..15] OF BOOL;           //控制字
    abStatusWordBit:             ARRAY[0..15] OF BOOL;           //状态字
    
//实例化
    aPowerPDO:                   ARRAY[0..8] OF PDO.PowerPDO;    //PDO使能模块
    
//获取TCP速度
    lrVel:                       LREAL;
    alrVel:                      ARRAY[0..8] OF LREAL;
    Data:                        PDO.TMP.Data;
    
    //Home
    diExtAxisHome:               DINT;
    diSetPosMid:                 DINT;
    diPosMid:                    DINT;
    lrVelExt:                    LREAL;
    bRuning:                     BOOL;   //运行标志位
    EnableDone:                  BOOL;   //上使能完成标志
    abEnableLed:                 BOOL;
    bAxisNum:                    INT;    //机器人内部轴个数,视图填写
    statusNum:                   INT;    //状态机用
    insideAxisType0:              INT;
    insideAxisType1:              BOOL;    //内部轴类型
    insideAxisType2:              BOOL;    //内部轴类型
    insideAxisType3:              BOOL;    //内部轴类型
    outsideAxisType0:             INT;
    outsideAxisType1:             BOOL;    //外部轴类型
    outsideAxisType2:             BOOL;    //外部轴类型
    bstart:                       BOOL;
END_VAR


//1、通过CA来拿去非同步或者同步轴的开关状态,已经开放到全局变量
//内部轴
IF insideAxisType1=TRUE AND insideAxisType2=FALSE AND insideAxisType3=FALSE THEN
    insideAxisType0:=1;//高创
ELSIF insideAxisType1=FALSE AND insideAxisType2=TRUE AND insideAxisType3=FALSE THEN
    insideAxisType0:=2;//清能德创
ELSIF insideAxisType1=FALSE AND insideAxisType2=FALSE AND insideAxisType3=TRUE THEN
    insideAxisType0:=3;//华数
END_IF

IF outsideAxisType1=TRUE AND outsideAxisType2=FALSE THEN
    outsideAxisType0:=1;//高创
ELSIF outsideAxisType1=FALSE AND outsideAxisType2=TRUE THEN
    outsideAxisType0:=2;//华数
END_IF

GC_iInternalAxisNum:= bAxisNum;
//GC_bSyncAxis:= TRUE;    //视图里启动
//目前只支持外部轴是高创类型的
IF GC_bSyncAxis THEN //启动信号
    //判断是否具有外部轴
    IF UINT_TO_INT(Motion.auiActualNOSlavesServo[0])> GC_iInternalAxisNum     THEN
         iExtNum:= UINT_TO_INT(Motion.auiActualNOSlavesServo[0]) - GC_iInternalAxisNum;
    ELSE
         RETURN;
    END_IF
    IF insideAxisType0=1 AND outsideAxisType0=1 THEN
        iCounter:= 6;
    ELSIF insideAxisType0=2 AND outsideAxisType0=1 THEN
        iCounter:= 0;
    ELSIF insideAxisType0=3 AND outsideAxisType0=1 THEN
        iCounter:= 0;
    END_IF
    
    ACT_CDHD();

   (*
    FOR iCounter:= 0 TO (iExtNum-1) BY 1 DO
          CASE  UINT_TO_INT(Motion.auiServoType[GC_iInternalAxisNum + iCounter,0]) OF 
             Servotype.ST_CDHD:       //CDHD
                                      ACT_CDHD();
        
             Servotype.ST_HSS_LDE:    //HSS_LDE
                                      ACT_HSS_LDE();
          END_CASE
    END_FOR
    *)
END_IF
//非同步轴控制
//获取TCP合成速度
//Data.GetVelBaseCoord(VelBase:= ADR(lrVel));

abStatusWordBit:= UINT_16_TO_BOOL(GC_aPdoCDHD[iCounter].StatusWord);

//未使能
CASE statusNum OF
    0:
       IF NOT(abStatusWordBit[2]) THEN
           diExtAxisHome:= GC_aPdoCDHD[iCounter].PositionActualValue;
       END_IF
       statusNum:=100;
    100:
       ;
END_CASE

//使能控制
aPowerPDO[iCounter](
    bEnable:= bEnable, 
    bdisable:= bdisable, 
    abStatusWordBit:= abStatusWordBit, 
    abControlWordBit=> abControlWordBit, 
    bServoStatus=> abStatusWordBit[iCounter]);
IF uiControlWordOutput=15 THEN
    EnableDone:=TRUE;
END_IF     
//复位
IF bReset AND abStatusWordBit[3] THEN
    bReset:= FALSE;
   IF abControlWordBit[7] THEN
       abControlWordBit[7] := FALSE;
   ELSE
       abControlWordBit[7] := TRUE;
   END_IF
ELSE
    abControlWordBit[7] := FALSE;
END_IF

//bool-->Uint
GC_aPdoCDHD[iCounter].ControlWord:= BOOL_16_TO_UINT(abControlWordBit);

//下发
GC_aPdoCDHD[iCounter].ModesOfOperation:= 8;      //位置控制模式

IF bstart=TRUE THEN
    //diSetPosMid:=diSetPosMid+  LREAL_TO_DINT(R100 * lrVel*0.004 * (1000000/360));
    diSetPosMid:=diSetPosMid+  LREAL_TO_DINT(lrVel*0.004 * (1000000/360));
END_IF
GC_aPdoCDHD[iCounter].TargetPosition:=  diExtAxisHome + diSetPosMid ;//* diPos;   //位置

//外部轴得速度
lrVelExt:= (DINT_TO_LREAL(GC_aPdoCDHD[iCounter].PositionActualValue - diPosMid)/(1000000/360.0)/0.004);
IF lrVelExt>1 OR lrVelExt<-1 THEN   //判断附加轴是否运动
    bRuning:=TRUE;                  //运行标志
END_IF
//上一个周期的实际位置
diPosMid:=  GC_aPdoCDHD[iCounter].PositionActualValue;
//非同步轴控制
//获取TCP合成速度
//Data.GetVelBaseCoord(VelBase:= ADR(lrVel));

abStatusWordBit:= UINT_16_TO_BOOL(GC_aPdoHSS_LDE[iCounter].StatusWord);

//未使能
CASE statusNum OF
    0:
       IF NOT(abStatusWordBit[2]) THEN
           diExtAxisHome:= GC_aPdoHSS_LDE[iCounter].PositionActualValue;
       END_IF
       statusNum:=100;
    100:
       ;
END_CASE

//使能控制
aPowerPDO[iCounter](
    bEnable:= bEnable, 
    bdisable:= bdisable, 
    abStatusWordBit:= abStatusWordBit, 
    abControlWordBit=> abControlWordBit, 
    bServoStatus=> abStatusWordBit[iCounter]);
IF uiControlWordOutput=15 THEN
    EnableDone:=TRUE;
END_IF     
//复位
IF bReset AND abStatusWordBit[3] THEN
    bReset:= FALSE;
   IF abControlWordBit[7] THEN
       abControlWordBit[7] := FALSE;
   ELSE
       abControlWordBit[7] := TRUE;
   END_IF
ELSE
    abControlWordBit[7] := FALSE;
END_IF

//bool-->Uint
GC_aPdoHSS_LDE[iCounter].ControlWord:= BOOL_16_TO_UINT(abControlWordBit);

//下发
GC_aPdoHSS_LDE[iCounter].ModesOfOperation:= 8;      //位置控制模式

IF bstart=TRUE THEN
    //diSetPosMid:=diSetPosMid+  LREAL_TO_DINT(R100 * lrVel*0.004 * (1000000/360));
    diSetPosMid:=diSetPosMid+  LREAL_TO_DINT(lrVel*0.004 * (1000000/360));
END_IF
GC_aPdoHSS_LDE[iCounter].TargetPosition:=  diExtAxisHome + diSetPosMid ;//* diPos;   //位置

//外部轴得速度
lrVelExt:= (DINT_TO_LREAL(GC_aPdoCDHD[iCounter].PositionActualValue - diPosMid)/(1000000/360.0)/0.004);
IF lrVelExt>1 OR lrVelExt<-1 THEN   //判断附加轴是否运动
    bRuning:=TRUE;                  //运行标志
END_IF
//上一个周期的实际位置
diPosMid:=  GC_aPdoHSS_LDE[iCounter].PositionActualValue;



(*
//PDO、附加轴处理
//反馈
//alrServoOutPara[iCounterCDHD,0]:= GC_aPdoHSS_LDE[iCounterCDHD].PositionActualValue;         //位置信息

//alrServoOutPara[iCounterCDHD,7]:= 8;                                                      //控制模式

abStatusWordBit:= UINT_16_TO_BOOL(GC_aPdoHSS_LDE[iCounter].StatusWord);



IF abStatusWordBit[1] THEN
    ;//alrServoOutPara[iCounterCDHD,6]:= 3;                                                 //轴状态  
ELSE
    ;//alrServoOutPara[iCounterCDHD,6]:= 0;                                                 //轴状态  
END_IF

//驱动故障
IF  abStatusWordBit[3] THEN
    //报错状态
    //alrServoOutPara[iCounterCDHD,8]:= GC_aPdoHSS_LDE[iCounterCDHD].ErrorCode+256*256*256*128*1;
    //alrServoOutPara[iCounterCDHD,6]:= 1;                                                 //轴状态  
ELSE
    //alrServoOutPara[iCounterCDHD,8]:= 0;
END_IF

//使能
aPowerPDO[iCounter](
            bEnable:= bEnable, 
            bdisable:= bdisable, 
            abStatusWordBit:= abStatusWordBit, 
            abControlWordBit=> abControlWordBit, 
            bServoStatus=> abStatusWordBit[iCounter]);

//使能控制
abControlWordBit:= UINT_16_TO_BOOL(uiControlWordOutput);

//复位
IF bReset THEN
   IF abControlWordBit[7] THEN
       abControlWordBit[7] := FALSE;
   ELSE
       abControlWordBit[7] := TRUE;
   END_IF
ELSE
    abControlWordBit[7] := FALSE;
END_IF

//bool-->Uint
GC_aPdoHSS_LDE[iCounter].ControlWord:= BOOL_16_TO_UINT(abControlWordBit);

//下发
GC_aPdoHSS_LDE[iCounter].ModesOfOperation:= 8;      //位置控制模式

GC_aPdoHSS_LDE[iCounter].TargetPosition:=  GC_aPdoHSS_LDE[iCounter].PositionActualValue + diPos;   //位置
*)
原文地址:https://www.cnblogs.com/csflyw/p/14648680.html