void routeStatus_OnRouteStatusChanged(object sender, RouteStatusChangedEventArgs e) { if (e._available == RouteStatuses.Available) { //Start the timers if (restartBlocked && BlockedTimeout != 0) { BlockedTimer.Start(); } if (restartClear && ClearTimeout != 0) { ClearTimer.Start(); } restartBlocked = false; restartClear = false; } else { if (BlockedTimeout != 0 && BlockedTimer.Running) { BlockedTimer.Stop(); restartBlocked = true; } if (ClearTimeout != 0 && ClearTimer.Running) { ClearTimer.Stop(); restartClear = true; } } }
//Only the RHS has the attached conveyor void rhsConveyor_OnNextRouteStatusAvailableChanged(object sender, RouteStatusChangedEventArgs e) { if (e._available == RouteStatuses.Blocked) { ReleaseDelayTimer.Stop(); if (lhsConveyor.RouteAvailable == RouteStatuses.Available) { lhsTransfering = true; } if (rhsConveyor.RouteAvailable == RouteStatuses.Available) { rhsTransfering = true; } lhsConveyor.RouteAvailable = RouteStatuses.Blocked; rhsConveyor.RouteAvailable = RouteStatuses.Blocked; lhsConveyor.TransportSection.Route.Motor.Stop(); rhsConveyor.TransportSection.Route.Motor.Stop(); } else if (e._available == RouteStatuses.Available) { ReleaseDelayTimer.Start(); if (rhsTransfering) { rhsConveyor.RouteAvailable = RouteStatuses.Available; } else { rhsConveyor.RouteAvailable = RouteStatuses.Request; } if (lhsTransfering) { lhsConveyor.RouteAvailable = RouteStatuses.Available; } else { lhsConveyor.RouteAvailable = RouteStatuses.Request; } lhsConveyor.TransportSection.Route.Motor.Start(); rhsConveyor.TransportSection.Route.Motor.Start(); } if (!ReleaseDelayTimer.Running) { Release(); } }
protected void sensor_OnLeave(DematicSensor sender, Load load) { if (sender.PreviousActiveLoad == load) { BlockChargeCheck(); return; } int result; if (int.TryParse(sender.Name, out result)) { if (result == LineFullPosition - 1) { sensors[result].cube.Color = Color.Blue; } else if (PickPosition != 0 && result == PickPosition - 1) { sensors[result].cube.Color = Color.DarkGreen; } else if (result < (Positions - InfeedBlockChargePositions)) { sensors[result].cube.Color = Color.Yellow; } else { sensors[result].cube.Color = Color.Orange; } if (InfeedBlockChargePositions == 0 || result < (Positions - InfeedBlockChargePositions)) //Normal position (not block charge) { //If there is a sensor behind you and it has a load and this sensor has been cleared then release the one behind if (sensors.Count > (result + 1) && sensors[result + 1].sensor.Active) { if ((result + 1) != (PickPosition - 1) || ReleasePickLoad) // Also check if the position has stopped due to picking operation { ((Case_Load)sensors[result + 1].sensor.ActiveLoad).ReleaseLoad(); if (ReleasePickLoad) //Added by BG but shouldn't make any difference but it might { ReleasePickLoad = false; } } } } else //Block Charge Position { //Check all the positions behind and release the load if active for (int i = result + 1; i < Positions; i++) { if (i != (PickPosition - 1) || ReleasePickLoad) // Also check if the position has stopped due to picking operation { sensors[i].sensor.ReleaseActiveCaseLoads(); } } } if (result == 0) //Load has cleared front photocell { if (sensors[0].sensor.ActiveLoad != null) { SetLoadWaiting(false, sensors[0].sensor.ActiveLoad.StartDisposing, load); } else { SetLoadWaiting(false, false, load); } } //Set the route available status or start the timer if (LineFullPosition != 0 && result == LineFullPosition - 1) { if (BlockedTimer != null) { BlockedTimer.Stop(); BlockedTimer.Reset(); } if (LineAvailableTimeout == 0) { RouteAvailable = RouteStatuses.Available; } else { ClearTimer.Start(); } } } }
public void sensor_OnEnter(DematicSensor sender, Load load) { if (sender.PreviousActive) { BlockChargeCheck(); return; } int result; if (int.TryParse(sender.Name, out result)) { sensors[result].cube.Color = Color.Red; //Check if the location is a picking position if (result == (PickPosition - 1)) { load.Stop(); if (OnArrivedAtPickingPosition != null) { OnArrivedAtPickingPosition(this, new ManualPickArrivalArgs(load)); } } if (result != 0) // photocells are named 0 to n with 0 being the front photocell { //bool stopLoad = false; if (InfeedBlockChargePositions == 0 || result < (Positions - InfeedBlockChargePositions + 1)) { //Normal Position if (sensors[result - 1].sensor.Active) //Active means that there is a load on the sensor { //stopLoad = true; load.Stop(); } } if (result >= (Positions - InfeedBlockChargePositions)) { //Block Position BlockChargeCheck(); } } else //Load has arrived at front (zeroth) photocell { SetLoadWaiting(true, false, load); if (NextRouteStatus == null || NextRouteStatus.Available != RouteStatuses.Available) { ((Case_Load)load).StopLoad_PLCControl(); //load.Stop(); } } if (InfeedBlockChargePositions == 0 || result < (Positions - InfeedBlockChargePositions)) //Normal positions { //Stops the load behind if it's active to create a gap if (sensors.Count > (result + 1) && sensors[result + 1].sensor.Active) { sensors[result + 1].sensor.StopActiveLoads(); } } //Set the route available status or start the timer if (LineFullPosition != 0 && result == LineFullPosition - 1) { if (ClearTimer != null) { ClearTimer.Stop(); ClearTimer.Reset(); } if (BlockedTimeout == 0) { RouteAvailable = RouteStatuses.Blocked; } else { BlockedTimer.Start(); } } } }