LiftContext.cs
7.7 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary.lift
{
public class LiftContext
{
/// <summary>
/// 所有电梯
/// </summary>
static Dictionary<string, LiftStatus> lifts = new Dictionary<string, LiftStatus>();
public static void Init()
{
string[] names = Common.AppConfigHelper.GetValue(Common.SettingString.Lift_Names).Split(',');
foreach (var item in names)
{
lifts.Add(item, new LiftStatus());
}
Common.LogUtil.info($"加载电梯信息完成:{string.Join(",", names)}");
}
/// <summary>
/// 电梯是否开门
/// </summary>
/// <param name="liftId"></param>
/// <returns></returns>
public static bool IsDoorOpen(string liftId, int floor)
{
LiftStatus liftStatus = GetLiftStatus(liftId);
if (liftStatus.door.Equals("opened") && liftStatus.floor.Equals(floor))
return true;
return false;
}
/// <summary>
/// 电梯关门
/// </summary>
/// <param name="liftId"></param>
//public static void CloseDoor(string liftId,AgvInfo agvInfo)
//{
// bool rtn= HttpManager.CloseDoor(new service.model.DoorInfo() { liftId=liftId,sourceClient=agvInfo.Client,sourceFloor=agvInfo.Scope.Floor});
// Common.LogUtil.info($"{agvInfo.Name} 关门 {rtn}");
//}
/// <summary>
/// 请求使用电梯
/// </summary>
/// <param name="liftId"></param>
/// <param name="missionInfo"></param>
/// <param name="isback">是否是返回</param>
public static bool Request(service.model.MissionInfo missionInfo, AgvInfo agvInfo, bool isback = false)
{
service.model.SendInInfo info;
bool rtn=false;
if (isback)//返回
{
if (!AGVManager.GetsysClientBy(missionInfo.sourceFloor, missionInfo.liftName, out string destclient))
{
Common.LogUtil.error($"请求电梯失败,因目的系统标识获取失败:floor={agvInfo.Scope.Floor},lift={missionInfo.liftName}");
return false;
}
info = new service.model.SendInInfo()
{
liftId = missionInfo.liftName,
destinationFloor = missionInfo.sourceFloor,
destinationPoint = missionInfo.sourcePoint,
destinationClient = destclient,
sourceFloor = missionInfo.destinationFloor,
sourceClient = agvInfo.Client
};
rtn= HttpManager.RequestSendIn(info);
if (rtn)
HttpManager.AGVCall(new service.model.DoorInfo { liftId= missionInfo.liftName, sourceClient=agvInfo.Client, sourceFloor=missionInfo.destinationFloor});
}
else
{
if (!AGVManager.GetsysClientBy(missionInfo.destinationFloor, missionInfo.liftName, out string destclient))
{
Common.LogUtil.error($"请求电梯失败,因目的系统标识获取失败:floor={agvInfo.Scope.Floor},lift={missionInfo.liftName}");
return false;
}
info = new service.model.SendInInfo()
{
liftId = missionInfo.liftName,
sourceClient = agvInfo.Client,
sourceFloor = missionInfo.sourceFloor,
sourcePoint = missionInfo.sourcePoint,
destinationClient = destclient,
destinationFloor = missionInfo.destinationFloor,
destinationPoint = missionInfo.destinationPoint,
};
rtn = HttpManager.RequestSendIn(info);
if (rtn)
HttpManager.AGVCall(new service.model.DoorInfo { liftId = missionInfo.liftName, sourceClient = agvInfo.Client, sourceFloor = missionInfo.sourceFloor });
}
return rtn;
}
/// <summary>
/// AGV离开
/// </summary>
/// <param name="liftId"></param>
/// <param name="agvInfo"></param>
/// <returns></returns>
public static bool AGVLeave(string liftId, AgvInfo agvInfo)
{
bool rtn = HttpManager.AGVLeave(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
Common.LogUtil.info($"{agvInfo.Name} 离开 {rtn}");
return rtn;
}
/// <summary>
/// AGV呼叫
/// </summary>
/// <param name="liftId"></param>
/// <param name="agvInfo"></param>
/// <returns></returns>
public static bool AGVCall(string liftId, AgvInfo agvInfo)
{
bool rtn = HttpManager.AGVCall(new service.model.DoorInfo() { liftId = liftId, sourceClient = agvInfo.Client, sourceFloor = agvInfo.Scope.Floor });
Common.LogUtil.info($"{agvInfo.Name} 呼叫 {rtn}");
return rtn;
}
/// <summary>
/// 检查离开信号发送情况
/// </summary>
/// <param name="liftId"></param>
/// <returns></returns>
public static bool CheckAgvLeaveSig(string liftId)
{
if (!lifts[liftId].door.Equals("opened"))
return true;
return false;
}
/// <summary>
/// 运行到指定楼层
/// </summary>
/// <param name="liftId"></param>
/// <param name="floor"></param>
//public static void RunTo(string liftId,int floor)
//{
//}
/// <summary>
/// 有架子需要离开电梯
/// </summary>
/// <param name="liftId"></param>
/// <returns></returns>
public static bool HasShelfNeedLeave(string liftId, string client, out LiftStatus liftStatus)
{
liftStatus = GetLiftStatus(liftId);
if (liftStatus.destinationClient.Equals(client))
return true;
return false;
}
/// <summary>
/// 检查该任务agv是否获得电梯控制权
/// </summary>
/// <param name="liftId"></param>
/// <param name="missionId"></param>
/// <returns></returns>
public static bool CheckIfRequestOk(string liftId, service.model.MissionInfo mission)
{
LiftStatus liftStatus = GetLiftStatus(liftId);
if (liftStatus.missionId.Equals(mission.missionId))
return true;
return false;
}
/// <summary>
/// 获取电梯状态
/// </summary>
/// <param name="liftId"></param>
/// <returns></returns>
static LiftStatus GetLiftStatus(string liftId)
{
if (lifts.ContainsKey(liftId))
{
return lifts[liftId];
}
else
return new LiftStatus();
}
public static string[] GetLiftNames()
{
return lifts.Keys.ToArray();
}
public static void UpdateStatus(ClientStatus status)
{
try
{
LiftStatus lift = HttpManager.UpdateStatusToLift(status);
if (lift != null)
{
lifts[status.liftId] = lift;
}
}
catch (Exception e)
{
Common.LogUtil.error($"上报状态给电梯失败:{status.ToString()}", e);
}
}
}
}