using Bro.Common.Helper; using Bro.Device.SeerAGV; using System.Linq; using System.Threading.Tasks; namespace A032.Process { public partial class ProcessControl { private async void OnAGVBatteryLvlChanged(SeerAGVDriver agv, float preBatteryLvl, float batteryLvl) { await Task.Run(() => { var bind = Config.AGVBindCollection.FirstOrDefault(u => u.AGVId == agv.Id); SeerAGVInitialConfig iConfig = bind.AGV.InitialConfig as SeerAGVInitialConfig; if (bind.UnitState == AGVState.Idle) { if (batteryLvl <= iConfig.BatteryLvlToCharge) { bind.CurrentTaskId = "InCharge"; bind.UnitState = AGVState.InCharge; var chargePosition = Config.PositionCollection.FirstOrDefault(u => !u.IsOccupied && u.Description == PathPositionDefinition.Charge); if (chargePosition == null) { string warningMsg = $"{bind.AGV.Name}目前无可用充电地址"; bind.WarningMsg.Add(warningMsg); new ProcessException(warningMsg); bind.UnitState = AGVState.Warning; } else { bind.AGV.TaskOrder(chargePosition.PositionCode, true); } } else if (batteryLvl <= iConfig.BatteryLvlToCharge_Recommand) { ChargeWhenIdle(bind); } } else if (bind.UnitState == AGVState.InCharge) { if (batteryLvl >= iConfig.BatteryLvlChargeDone) { bind.UnitState = AGVState.Idle; } else if (batteryLvl >= iConfig.BatteryLvlToCharge_Recommand) { bind.UnitState = AGVState.IdleCharge; } } }); } private async void OnAGVTaskStatusChanged(SeerAGVDriver agv, AGVTaskStatus taskStatus) { await Task.Run(() => { //如果成功到达充电地点,开始充电 if (taskStatus == AGVTaskStatus.Completed && Config.PositionCollection.Any(u => u.Description == PathPositionDefinition.Charge && u.PositionCode == agv.CurrentPosition)) { var bind = Config.AGVBindCollection.FirstOrDefault(u => u.AGVId == agv.Id); if (bind != null) { //表示充电动作任务完成 bind.CurrentTaskId = ""; } } }); } private async void OnAGVPositionChanged(SeerAGVDriver agv, string positionCode) { await Task.Run(() => { }); } private void ChargeWhenIdle(AGVBindUnit bind) { bind.CurrentTaskId = "IdleCharge"; bind.UnitState = AGVState.IdleCharge; //设置为无需等待是为了方便执行过程中可以取消当前操作,执行任务 var chargePosition = Config.PositionCollection.FirstOrDefault(u => !u.IsOccupied && u.Description == PathPositionDefinition.Charge); if (chargePosition != null) { bind.AGV.TaskOrder(chargePosition.PositionCode, true); } else { new ProcessException($"{bind.AGV.Name}未能获取充电地址"); } } } }