代码案例

<< 点击显示目录 >>

主页  ACOPOS 6D使用手册 > mapp 6D  > 功能块 > McAcp6D  > Function blocks  > MC_BR_AsmBuffer_Acp6D  >

代码案例

CASE Ctrl.aSh[Ctrl.i].uStep OF

                                 

 (**********************************************************************************************)

 (***   多个托盘同时执行,通过AsmBuffer锁定,接受命令后,释放来实现MoveInPlane动作同时执行   ***)

 (***                          只有两个都是MoveInPlane才需要这样做                           ***)

 (**********************************************************************************************)

 0:

         Ctrl.aSh[Ctrl.i].bMovingDone := TRUE; (*-- 为TRUE则此CASE均不执行--*)

         Ctrl.aSh[Ctrl.i].bStartRecordData := FALSE;

 

 1: (*-- 只有 Ctrl.i = 0 才执行--*)

         IF Ctrl.i = 0 THEN

                 Ctrl.FB_AsmBuffer.Execute := TRUE;

                 Ctrl.FB_AsmBuffer.Assembly := ADR(gAssembly6D);

                 Ctrl.FB_AsmBuffer.Option := mcACP6D_BUFFER_ASM_CLEAR;

                 Ctrl.aSh[Ctrl.i].uStep := 2;

                 g6DControlStatus.sRDICore_Status := '120 | 1 → 2 BUFFER_ASM_CLEAR';

         END_IF;

 2:

         IF Ctrl.i = 0 THEN

                 Ctrl.FB_AsmBuffer();

                 IF Ctrl.FB_AsmBuffer.Done THEN

                         Ctrl.FB_AsmBuffer.Execute := FALSE;

                         Ctrl.aSh[Ctrl.i].uStep := 3;

                         g6DControlStatus.sRDICore_Status := '120 | 2 → 3 BUFFER_ASM_CLEAR DONE';

                         FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

                 END_IF;

         END_IF;

         

 3:

         IF Ctrl.i = 0 THEN

                 Ctrl.FB_AsmBuffer.Execute := TRUE;

                 Ctrl.FB_AsmBuffer.Assembly := ADR(gAssembly6D);

                 Ctrl.FB_AsmBuffer.Option := mcACP6D_BUFFER_ASM_BLOCK;

                 Ctrl.aSh[Ctrl.i].uStep := 4;

                 g6DControlStatus.sRDICore_Status := '120 | 3 → 4 BUFFER_ASM_BLOCK';

                 FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

         END_IF;

 4:

         IF Ctrl.i = 0 THEN

                 Ctrl.FB_AsmBuffer();

                 IF Ctrl.FB_AsmBuffer.Done THEN

                         Ctrl.FB_AsmBuffer.Execute := FALSE;

                         FOR Ctrl.i := 0 TO Ctrl.uShuttleNum - 1 DO

                                 Ctrl.aSh[Ctrl.i].uStep := 5;

                                 g6DControlStatus.sRDICore_Status := '120 | 4 → 5 BUFFER_ASM_BLOCK DONE';

                                 FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

                         END_FOR;

                 END_IF;

         END_IF;

 

 5: (*-- 同步骤9,最后跳转改为6--*)

         Ctrl.aSh[Ctrl.i].uLastCommand := 1; //意味着在MoveInPlane

 

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Shuttle := Ctrl.aSh[Ctrl.i].pShuttleRef;

 

         (*-- 若第一个点没给加速度,则自动填充数据 --*)

         IF gTCPData[Ctrl.i].para_req_path[0].rSpeed < 0.0001 OR gTCPData[Ctrl.i].para_req_path[0].rAcceleration < 0.0001 THEN

                 gTCPData[Ctrl.i].para_req_path[0].rSpeed := 500;

                 gTCPData[Ctrl.i].para_req_path[0].rAcceleration := 200;

         END_IF;

 

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Position.X   := gTCPData[Ctrl.i].para_req_path[1].rX / 1000.0; //单位转换 mm转换为m

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Position.Y   := gTCPData[Ctrl.i].para_req_path[1].rY / 1000.0; //单位转换 mm转换为m

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Velocity     := gTCPData[Ctrl.i].para_req_path[1].rSpeed / 1000.0; //单位转换 mm转换为m

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Acceleration := gTCPData[Ctrl.i].para_req_path[1].rAcceleration / 1000.0; //单位转换 mm转换为m

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.EndVelocity  := gTCPData[Ctrl.i].para_req_path[1].rArrivalSpeed / 1000.0; //单位转换 mm转换为m

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Mode;

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Path;

 

         Ctrl.aSh[Ctrl.i].rLastMoveInPlanePointX := gTCPData[Ctrl.i].para_req_path[1].rX;

         Ctrl.aSh[Ctrl.i].rLastMoveInPlanePointY := gTCPData[Ctrl.i].para_req_path[1].rY;

 

         (*-- 边界判断是否执行 --*)(*-- 托盘的运动范围 X:240 ~ 1680 Y:240 ~ 1200 ,原点为240,240--*)

         IF     gTCPData[Ctrl.i].para_req_path[1].rX < MOVING_X_MIN

                 OR gTCPData[Ctrl.i].para_req_path[1].rX > MOVING_X_MAX

                 OR gTCPData[Ctrl.i].para_req_path[1].rY < MOVING_Y_MIN

                 OR gTCPData[Ctrl.i].para_req_path[1].rY > MOVING_Y_MAX THEN

                 Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Execute := FALSE;

 

                 Ctrl.aSh[Ctrl.i].uStep := 0;

                 uStepPath := 0;

                 g6DControlStatus.sRDICore_Status := '120 → 0 | 5 → 0 MoveInPlane TCPData[Ctrl.i].para_req_path[0].rX rY beyond limit';

         ELSE

                 Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Execute := TRUE;

         END_IF

 

         IF Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Acknowledge THEN

                 Ctrl.aSh[Ctrl.i].uPathIndex               := 2;

                 g6DControlStatus.sRDICore_Status := '120 | 5 → 6 FB_MoveInPlane Start ,Waiting for FB_MoveInPlane.DONE';

                 FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

                 Ctrl.aSh[Ctrl.i].uStep           := 6;

         ELSIF Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Error THEN                                                

                 Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Execute := FALSE;

 

                 g6DControlStatus.sRDICore_Status := '120 | 5 → 255 FB_MoveInPlane ERROR';

                 FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

                 Ctrl.aSh[Ctrl.i].uStep           := 255;

         END_IF;

 6:

         Ctrl.bAsmBufferAllMoveInPlaneAckOK := TRUE;

         FOR i := 0 TO Ctrl.uShuttleNum - 1 DO

                 Ctrl.bAsmBufferAllMoveInPlaneAckOK := Ctrl.bAsmBufferAllMoveInPlaneAckOK AND Ctrl.aSh[i].FB_MoveInPlane.Acknowledge;

         END_FOR;

         IF Ctrl.bAsmBufferAllMoveInPlaneAckOK THEN

                 Ctrl.FB_AsmBuffer.Execute := TRUE;

                 Ctrl.FB_AsmBuffer.Assembly := ADR(gAssembly6D);

                 Ctrl.FB_AsmBuffer.Option := mcACP6D_BUFFER_ASM_RELEASE;

                 Ctrl.aSh[Ctrl.i].uStep := 7;

                 g6DControlStatus.sRDICore_Status := '120 | 6 → 7 BUFFER_ASM_RELEASE';

                 FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

         END_IF;

         

 7:

         (*-- 一个周期只操作一次,避免负载过高 --*)

         i := 0;

         IF i = 0 THEN

                 i := i + 1;

                 Ctrl.FB_AsmBuffer();

         END_IF;

         

         IF Ctrl.FB_AsmBuffer.Done THEN

                 Ctrl.FB_AsmBuffer.Execute := FALSE;

                 FOR i := 0 TO Ctrl.uShuttleNum - 1 DO

                         (*-----------------------  开始记录标志位 -----------------------*)

                         Ctrl.aSh[Ctrl.i].bStartRecordDOFlag := TRUE; //清空动作在99步/111步

                         

                         Ctrl.aSh[i].uStep := 10; (*-- 等待MoveInPlane执行到位--*)

                 END_FOR;

                 g6DControlStatus.sRDICore_Status := '120 | 7 → 10 BUFFER_ASM_RELEASE DONE Wait MoveInPlane DONE';

                 FileWarnLogWrite(Ctrl.i,ADR(g6DControlStatus.sRDICore_Status));

         END_IF;

 

 10: (*-- MoveInPlane的状态机执行--*)

         IF Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Done THEN

                 Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Execute := FALSE;

                 (*----------------------- 判断数据是否完成 -----------------------*)

                 IF Ctrl.aSh[Ctrl.i].uPathIndex >= MIN(Ctrl.aSh[Ctrl.i].uPathTotalNum,REQ_PATH_DATA_NUM) THEN

                         Ctrl.aSh[Ctrl.i].uStep := 40;

                         g6DControlStatus.sRDICore_Status := '120 | 10 → 40 FB_MoveInPlane DONE Judge If ALL DONE';

                 ELSE

                         Ctrl.aSh[Ctrl.i].uStep := 20;

                         g6DControlStatus.sRDICore_Status := '120 | 10 → 0 FB_MoveCyclicPosition DONE Once';

                 END_IF;

         END_IF;

         

END_CASE;

 

(*-----------------------  功能块执行 -----------------------*)

FOR Ctrl.i := 0 TO Ctrl.uShuttleNum - 1 DO

 IF Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Velocity = 0.0 OR Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Acceleration = 0.0 THEN

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Velocity     := 0.5;

         Ctrl.aSh[Ctrl.i].FB_MoveInPlane.Parameters.Acceleration := 2;

 END_IF;

 Ctrl.aSh[Ctrl.i].FB_MoveInPlane(); (*-- 功能块执行 --*)

 

 Ctrl.aSh[Ctrl.i].FB_MoveCyclicPosition();

END_FOR;