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}未能获取充电地址");
|
}
|
}
|
}
|
}
|