1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | ChildObjectGuids AddAttributeSubsequent IF NOT xInit THEN UM ( sName := 'Normal Operation', dwAllowsLeavingFromStates := PACK_ML.State.Stopped OR PACK_ML.State.Aborted OR PACK_ML.State.Idle, IF SysStrCmp(Client.sCommandToPLC, Client.LockCommands[0]) = 0 THEN //First Lock Function ; ELSIF SysStrCmp(Client.sCommandToPLC, 'UnSuspend') = 0 THEN UnSuspend(); END_CASE Client.iCommandToPLC := 0; Client.sCommandToPLC := ''; Client.bReadyToPLC := FALSE; CASE UM.CurrentState OF PACK_ML.State.Stopped: ; PACK_ML.State.Aborted: PACK_ML.State.Idle: PACK_ML.State.Complete : PACK_ML.State.Execute : // NOTE: Remember that most math has the Y axis as positive above the X. //final double result = Math.toDegrees(Math.atan2(deltaY, deltaX)); //return (result < 0) ? (360d + result) : result; //actualPositionBoat := CMMT_ST_Rotery_Boot.ActualPosition; actualPositionLinear1 := CMMT_ST_Linear1.ActualPosition; deltaY := actualPositionLinear1 - 0; deltaX := actualPositionLinear2 - 500; angle := OSCAT_BASIC.ATAN2(deltaY,deltaX); targetPositionBoat := angle * 180 / 3.1415; IF targetPositionBoat <= 0 THEN targetPositionBoat := 0; ELSIF targetPositionBoat >= 360 THEN targetPositionBoat := 360; (*CMMT_ST_Rotery_Boot.MoveAbsolute(Position:= targetPositionBoat , Velocity:= 10000, Acceleration:= 100000, Deceleration:= 100000, Jerk:= 10000000, BufferMode:= MC_BUFFER_MODE.mcAborting, ErrorID=> , ErrorString=> ); *) CASE Client.ActualStep OF 0: CASE Client.Mode OF Mode.Mode1: CASE Client.Level OF Level.Beginner: speed := 100; Level.Placeholder1: speed := 200; Level.Intermediate: speed := 300; Level.Placeholder2: speed := 400; Level.Advanced: speed := 500; END_CASE Client.ActualStep := 100; executeBoat := TRUE; Mode.Mode2: Client.ActualStep := 200; Mode.Mode3: 100: Velocity:= speed, Deceleration:= 500, BufferMode:= MC_BUFFER_MODE.mcBuffered, Client.ActualStep := Client.ActualStep + 1; 101: END_IF bMove := CMMT_ST_Linear1.MoveAbsolute(Position:= 550 , Client.ActualStep := 100; 200: StateComplete(); PACK_ML.State.Resetting : executeBoat := FALSE; //CMMT_ST_Rotery_Boot.ResetHalt(); PACK_ML.State.Starting : //ELSIF NOT CMMT_ST_Rotery_Boot.Enabled THEN ELSE 10: Client.ActualStep := 110; //Client.ActualStep := 210; END_IF IF enable THEN Abort(); IF home THEN 120: Client.ActualStep := 10; ELSE 220: StateComplete(); CMMT_ST_Linear1.DisableDrive(); StateComplete(); CASE Client.ActualStep OF StopBoat.Execute := TRUE; Client.ActualStep := 10; IF BoatStatus.Stopping AND LinearStatus.Stopping THEN; StopBoat.Execute := FALSE; |