<< 点击显示目录 >> 主页 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;