patrick
2019-12-10 1c4426810c71eead57084be8a18ade8d314dd8c4
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
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}未能获取充电地址");
            }
        }
    }
}