Commit 5340dbb9 张东亮

1

2 个父辈 40aa4308 927a4371
正在显示 44 个修改的文件 包含 2011 行增加2074 行删除
...@@ -83,6 +83,7 @@ ...@@ -83,6 +83,7 @@
<Compile Include="bean\node\ClientNode.cs" /> <Compile Include="bean\node\ClientNode.cs" />
<Compile Include="bean\node\DoubleLineNodeFor4D.cs" /> <Compile Include="bean\node\DoubleLineNodeFor4D.cs" />
<Compile Include="bean\node\DoubleLineNodeFor4C.cs" /> <Compile Include="bean\node\DoubleLineNodeFor4C.cs" />
<Compile Include="bean\UnlockedShelf.cs" />
<Compile Include="BLL\AGVManager.cs" /> <Compile Include="BLL\AGVManager.cs" />
<Compile Include="BLL\AgvServer.cs" /> <Compile Include="BLL\AgvServer.cs" />
<Compile Include="BLL\Common.cs" /> <Compile Include="BLL\Common.cs" />
...@@ -95,6 +96,8 @@ ...@@ -95,6 +96,8 @@
<SubType>Component</SubType> <SubType>Component</SubType>
</Compile> </Compile>
<Compile Include="BLL\LineWebService.cs" /> <Compile Include="BLL\LineWebService.cs" />
<Compile Include="BLL\StationRFIDManager.cs" />
<Compile Include="BLL\UnlockMissionManager.cs" />
<Compile Include="FrmMain.cs"> <Compile Include="FrmMain.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
......
...@@ -18,13 +18,17 @@ ...@@ -18,13 +18,17 @@
</layout> </layout>
</appender> </appender>
<appender name="LineWebService" type="log4net.Appender.RollingFileAppender"> <appender name="LineWebService" type="log4net.Appender.RollingFileAppender">
<file value="logs/LineWebService.log"/> <file value="logs/UnlockInfo.log"/>
<param name="Encoding" value="UTF-8"/> <param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/> <appendToFile value="true"/>
<rollingStyle value="Date"/> <param name="MaxSizeRollBackups" value="10" />
<datePattern value="yyyy-MM-dd"/> <!-- 切割最多文件数 -->
<param name="MaximumFileSize" value="100MB" />
<!-- 每个文件的大小 -->
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/> <conversionPattern value="[%date]%-5p %m%n"/>
</layout> </layout>
</appender> </appender>
<logger name ="LineWebService"> <logger name ="LineWebService">
...@@ -43,7 +47,8 @@ ...@@ -43,7 +47,8 @@
<add key="FLEET" value="10.85.199.3" /> <add key="FLEET" value="10.85.199.3" />
<add key="AutoCharge" value="True" /> <add key="AutoCharge" value="True" />
<add key="ChargeWait" value="1" /> <add key="ChargeWait" value="1" />
<add key="ChargeThreshold" value="20,70" /> <add key="ChargeThreshold" value="20,90" />
<add key="IP_4D_Light" value="10.85.196.40:8088" />
<add key="IP_4C_Light" value="10.85.197.40:8088" />
</appSettings> </appSettings>
</configuration> </configuration>
\ No newline at end of file \ No newline at end of file
...@@ -5,9 +5,10 @@ using System.Linq; ...@@ -5,9 +5,10 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using AGVControl; using AGVControl;
using BLL;
using RestSharp; using RestSharp;
namespace BLL namespace AGVControl
{ {
public class AGVManager public class AGVManager
{ {
...@@ -42,7 +43,7 @@ namespace BLL ...@@ -42,7 +43,7 @@ namespace BLL
} }
else else
{ {
if(workOrder.data.line !=null) if (workOrder.data.line != null)
{ {
string tempLocation = workOrder.data.line; string tempLocation = workOrder.data.line;
if (workOrder.data.line.Equals("Feeder")) if (workOrder.data.line.Equals("Feeder"))
...@@ -57,9 +58,9 @@ namespace BLL ...@@ -57,9 +58,9 @@ namespace BLL
woData = workOrder.data; woData = workOrder.data;
return true; return true;
} }
} }
} }
} }
...@@ -90,7 +91,7 @@ namespace BLL ...@@ -90,7 +91,7 @@ namespace BLL
public string ToTxt(string nodeName) public string ToTxt(string nodeName)
{ {
return string.Format("[hSerial={0},line={1}[{3}],so={2}]", hSerial,line,so,nodeName); return string.Format("[hSerial={0},line={1}[{3}],so={2}]", hSerial, line, so, nodeName);
} }
} }
public static string A6_Target = ""; public static string A6_Target = "";
...@@ -167,7 +168,7 @@ namespace BLL ...@@ -167,7 +168,7 @@ namespace BLL
#endregion #endregion
res[0].location = loc; res[0].location = loc;
dest = res[0]; dest = res[0];
Common.GetLineNameByNodeName(loc,out string line); Common.GetLineNameByNodeName(loc, out string line);
A6_Target = res[0].ShowInfo(line); A6_Target = res[0].ShowInfo(line);
Common.log.Debug("查找满料架任务[RFID=" + rfid + "]:目的地为 " + loc + " [产线名 " + line + "]"); Common.log.Debug("查找满料架任务[RFID=" + rfid + "]:目的地为 " + loc + " [产线名 " + line + "]");
return true; return true;
...@@ -203,7 +204,7 @@ namespace BLL ...@@ -203,7 +204,7 @@ namespace BLL
public string ShowInfo(string loc) public string ShowInfo(string loc)
{ {
return string.Format("RFID={0},SO={1},location={2}[{3}]", id, SO, loc,location); return string.Format("RFID={0},SO={1},location={2}[{3}]", id, SO, loc, location);
} }
} }
...@@ -331,7 +332,12 @@ namespace BLL ...@@ -331,7 +332,12 @@ namespace BLL
{ {
public string msg { get; set; } public string msg { get; set; }
} }
public class Msg1
{
//{"Code":0,"Msg":"D14,,D7,D33"}
public int Code { get; set; }
public string Msg { get; set; }
}
private static string Addr_updateDeviceAlarmMsg = "/rest/api/qisda/device/updateDeviceAlarmMsg"; private static string Addr_updateDeviceAlarmMsg = "/rest/api/qisda/device/updateDeviceAlarmMsg";
/// <summary> /// <summary>
/// 异常看板 /// 异常看板
...@@ -420,6 +426,178 @@ namespace BLL ...@@ -420,6 +426,178 @@ namespace BLL
return e.ToString(); return e.ToString();
} }
} }
/// <summary>
/// 获取接驳台料架情况
/// </summary>
/// <param name="lineName"></param>
/// <returns></returns>
public static string GetRFIDs(string lineName)
{
string addr = "";
if (lineName.StartsWith(SettingString.D4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4D_Light), lineName);
}
else if (lineName.StartsWith(SettingString.C4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4C_Light), lineName);
}
try
{
string result = HttpHelper.Get(addr);
if (!result.Equals(""))
{
Msg1 msgs = JsonHelper.DeserializeJsonToObject<Msg1>(result);
if (msgs == null)
return ",,,";
else
{
Common.log.Debug(string.Format("{0}接驳台状态:{1}", lineName, msgs.Msg));
return msgs.Msg;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex.Message);
return ",,,";
}
return ",,,";
}
/// <summary>
/// 获取接驳台最外面料架
/// </summary>
/// <param name="lineName"></param>
/// <returns></returns>
public static string GetFirstRFID(string lineName)
{
string addr = "";
if (lineName.StartsWith(SettingString.D4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4D_Light), lineName);
}
else if (lineName.StartsWith(SettingString.C4_Name_Prefix))
{
addr = string.Format("http://{0}/LineGetRFID?line={1}", ConfigAppSettings.GetValue(SettingString.IP_4C_Light), lineName);
}
try
{
string result = HttpHelper.Get(addr);
if (!result.Equals(""))
{
Msg1 msgs = JsonHelper.DeserializeJsonToObject<Msg1>(result);
if (msgs == null)
return "";
else
{
Common.log.Debug(string.Format("{0}接驳台状态:{1}", lineName, msgs.Msg));
string rfid = "";
foreach (string item in msgs.Msg.Split(','))
{
if (!item.Equals(""))
{
rfid = item;
}
}
return rfid;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex.Message);
return "";
}
return "";
}
/// <summary>
/// 删除接驳台料架
/// </summary>
/// <param name="lineName"></param>
/// <param name="rfid"></param>
/// <returns></returns>
public static bool ClearRFID(string lineName, string rfid)
{
string addr = "";
if (lineName.StartsWith(SettingString.D4_Name_Prefix))
{
addr = string.Format("http://{0}/LineClearRFID?line={1}&rfid={2}", ConfigAppSettings.GetValue(SettingString.IP_4D_Light), lineName, rfid);
}
else if (lineName.StartsWith(SettingString.C4_Name_Prefix))
{
addr = string.Format("http://{0}/LineClearRFID?line={1}&rfid={2}", ConfigAppSettings.GetValue(SettingString.IP_4C_Light), lineName, rfid);
}
try
{
string result = HttpHelper.Get(addr);
if (!result.Equals(""))
{
Msg1 msgs = JsonHelper.DeserializeJsonToObject<Msg1>(result);
if (msgs == null)
return false;
else
{
Common.log.Info(string.Format("删除{0}接驳台料架{1}:{2}", lineName, rfid, msgs.Msg));
return true;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex.Message);
return false;
}
return false;
}
private static string Addr_agvRemoveRfid = "/rest/api/qisda/device/agvRemoveRfid";
/// <summary>
/// 根据RFID清理料架的缓存信息
/// </summary>
/// <param name="rfid"></param>
/// <returns></returns>
public static bool AgvRemoveRfid(string rfid)
{
try
{
Dictionary<string, string> paramMap = new Dictionary<string, string>();
paramMap.Add("rfid", rfid.ToUpper());
string server = GetAddr(Addr_agvRemoveRfid, paramMap);
DateTime startTime = DateTime.Now;
string resultStr = HttpHelper.Get(server);
Common.log.Info("清理料架的缓存信息【" + server + "】【" + resultStr + "】");
RfidData rfidData = JsonHelper.DeserializeJsonToObject<RfidData>(resultStr);
if (rfidData == null)
{
return false;
}
else
{
if (rfidData.code.Equals(0))
{
return true;
}
}
}
catch (Exception ex)
{
Common.log.Error(ex);
return false;
}
return false;
}
} }
public class ShelfLockInfo public class ShelfLockInfo
{ {
...@@ -514,7 +692,7 @@ namespace BLL ...@@ -514,7 +692,7 @@ namespace BLL
/// <param name="name">异常位置名称</param> /// <param name="name">异常位置名称</param>
/// <param name="key">异常信息唯一标识</param> /// <param name="key">异常信息唯一标识</param>
/// <param name="value">异常信息</param> /// <param name="value">异常信息</param>
public AlarmMsg(string name, string key, string value,int type=0) public AlarmMsg(string name, string key, string value, int type = 0)
{ {
this.name = name; this.name = name;
this.msgKey = key; this.msgKey = key;
......
...@@ -24,6 +24,8 @@ namespace AGVControl ...@@ -24,6 +24,8 @@ namespace AGVControl
public const string CheckShelf = "CheckShelf"; public const string CheckShelf = "CheckShelf";
public const string DoorDToC = "DoorDToC"; public const string DoorDToC = "DoorDToC";
public const string DoorCToD = "DoorCToD"; public const string DoorCToD = "DoorCToD";
public const string DoorAirIn = "DoorAirIn";
public const string DoorAirOut = "DoorAirOut";
public const string DoubleLine_Name_Prefix = "A"; public const string DoubleLine_Name_Prefix = "A";
public const string Wait = "Wait"; public const string Wait = "Wait";
public const string Done = "Done"; public const string Done = "Done";
...@@ -42,6 +44,7 @@ namespace AGVControl ...@@ -42,6 +44,7 @@ namespace AGVControl
public const string IsUse = "IsUse"; public const string IsUse = "IsUse";
public const string RFID = "RFID"; public const string RFID = "RFID";
public const string EmptyShelfCnt = "EmptyShelfCnt"; public const string EmptyShelfCnt = "EmptyShelfCnt";
public const string EmptyShelfRFIDs = "EmptyShelfRFIDs";
/// <summary> /// <summary>
/// 去4C的3辆车IP /// 去4C的3辆车IP
/// </summary> /// </summary>
...@@ -63,6 +66,11 @@ namespace AGVControl ...@@ -63,6 +66,11 @@ namespace AGVControl
public const string A5 = "A5"; public const string A5 = "A5";
public const string D4_Name_Prefix = "D"; public const string D4_Name_Prefix = "D";
public const string C4_Name_Prefix = "C"; public const string C4_Name_Prefix = "C";
public const string IP_4D_Light = "IP_4D_Light";
public const string IP_4C_Light = "IP_4C_Light";
public const string Lines_In_Air_Door = "C8,C9,C10";
} }
...@@ -93,7 +101,7 @@ namespace AGVControl ...@@ -93,7 +101,7 @@ namespace AGVControl
public static Dictionary<string, string> showNameMissionName; public static Dictionary<string, string> showNameMissionName;
//public static Dictionary<string, string> agvProductionLine; //public static Dictionary<string, string> agvProductionLine;
public static System.Configuration.Configuration appConfig; public static System.Configuration.Configuration appConfig;
public static MissionManager missionManager; public static UnlockMissionManager missionManager;
public static StandbyStation StandbyStation = new StandbyStation() { C4_Station1 = "", C4_Station2 = "" }; public static StandbyStation StandbyStation = new StandbyStation() { C4_Station1 = "", C4_Station2 = "" };
private static List<string> msg = new List<string>(); private static List<string> msg = new List<string>();
...@@ -201,9 +209,9 @@ namespace AGVControl ...@@ -201,9 +209,9 @@ namespace AGVControl
} }
else else
{ {
tarIdx = Common.agvInfo.FindIndex(s=> !s.IP.Equals(agv.IP) && s.CurJob !=null && s.CurJob is EmptyShelfBackJob tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace)!=null ) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5)); && ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5));
if(tarIdx==-1) if (tarIdx == -1)
{ {
nodeName = SettingString.A5; nodeName = SettingString.A5;
Common.log.Debug(string.Format("{0} {1}需要小料架", agv.Name, SettingString.A5)); Common.log.Debug(string.Format("{0} {1}需要小料架", agv.Name, SettingString.A5));
...@@ -231,7 +239,7 @@ namespace AGVControl ...@@ -231,7 +239,7 @@ namespace AGVControl
{ {
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A6)); && ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A6));
if(tarIdx==-1) if (tarIdx == -1)
{ {
nodeName = SettingString.A6; nodeName = SettingString.A6;
Common.log.Debug(string.Format("{0} {1}需要小料架", agv.Name, SettingString.A6)); Common.log.Debug(string.Format("{0} {1}需要小料架", agv.Name, SettingString.A6));
...@@ -263,8 +271,8 @@ namespace AGVControl ...@@ -263,8 +271,8 @@ namespace AGVControl
else else
{ {
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5)); && ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A5));
if(tarIdx==-1) if (tarIdx == -1)
{ {
nodeName = SettingString.A5; nodeName = SettingString.A5;
Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5)); Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5));
...@@ -292,7 +300,7 @@ namespace AGVControl ...@@ -292,7 +300,7 @@ namespace AGVControl
{ {
tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob tarIdx = Common.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null && s.CurJob is EmptyShelfBackJob
&& ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A6)); && ((((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace) != null) && ((EmptyShelfBackJob)s.CurJob).EmptyShelfTargetPlace.Equals(SettingString.A6));
if(tarIdx==-1) if (tarIdx == -1)
{ {
nodeName = SettingString.A6; nodeName = SettingString.A6;
Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A6)); Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A6));
...@@ -490,50 +498,31 @@ namespace AGVControl ...@@ -490,50 +498,31 @@ namespace AGVControl
} }
else if (shelfType.Equals(eShelfType.BigShelf)) else if (shelfType.Equals(eShelfType.BigShelf))
{ {
//int tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A5 int tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A5
// && (s.StateEquals(eNodeStatus.NeedC) || s.StateEquals(eNodeStatus.NeedEnter)) && s.IsUse); && (s.StateEquals(eNodeStatus.NeedC) || s.StateEquals(eNodeStatus.NeedEnter)) && s.IsUse);
//if (tarIdx == -1) if (tarIdx == -1)
//{ {
// Common.log.Debug(string.Format("{0} {1}不需要大料架", agv.Name, SettingString.A5)); Common.log.Debug(string.Format("{0} {1}不需要大料架", agv.Name, SettingString.A5));
//} }
//else else
//{ {
// nodeName = SettingString.A5; nodeName = SettingString.A5;
// Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5)); Common.log.Debug(string.Format("{0} {1}需要大料架", agv.Name, SettingString.A5));
// return true; return true;
//} }
int tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A6 && tarIdx = Common.nodeInfo.FindIndex(s => s.Name == SettingString.A6 &&
(s.StateEquals(eNodeStatus.NeedEnter) || s.StateEquals(eNodeStatus.NeedEnterLeave)) && s.IsUse); (s.StateEquals(eNodeStatus.NeedEnter) || s.StateEquals(eNodeStatus.NeedEnterLeave)) && s.IsUse);
if (tarIdx == -1) if (tarIdx == -1)
{ {
Common.log.Debug(string.Format("{0} {1}不需要大料架", agv.Name, SettingString.A6)); Common.log.Debug(string.Format("{0} {1}不需要料架", agv.Name, SettingString.A6));
//rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.MoveStandby]);
//if (rtn)
//{
// agv.NextPlace = "";
// agv.TaskSend = rtn ? SettingString.MoveStandby : "";
// agv.Msg = string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.MoveStandby);
// Common.LogInfo(string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.MoveStandby));
//}
} }
else else
{ {
nodeName = SettingString.A6; nodeName = SettingString.A6;
Common.log.Debug(string.Format("{0} {1}需要料架", agv.Name, SettingString.A6)); Common.log.Debug(string.Format("{0} {1}需要料架", agv.Name, SettingString.A6));
return true; return true;
//rtn = Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + SettingString.A6]);
//if (rtn)
//{
// agv.NextPlace = "";
// tarNodeName = SettingString.A6;
// Common.nodeInfo[tarIdx].AgvName = agv.Name;
// agv.TaskSend = rtn ? SettingString.Move + SettingString.A6 : "";
// agv.Msg = string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.A6);
// Common.LogInfo(string.Format("{0} 在{1}已装载大料架,送往{2}", agv.Name, place, SettingString.A6));
// return true;
//}
} }
} }
...@@ -541,6 +530,7 @@ namespace AGVControl ...@@ -541,6 +530,7 @@ namespace AGVControl
return false; return false;
} }
/// <summary> /// <summary>
/// 检查AGV是否有负载 /// 检查AGV是否有负载
/// </summary> /// </summary>
...@@ -555,17 +545,25 @@ namespace AGVControl ...@@ -555,17 +545,25 @@ namespace AGVControl
agv.Place = doorName; agv.Place = doorName;
return Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + doorName]); return Common.mir.Add_Mission_Fleet(agv, Common.agvMission[SettingString.Move + doorName]);
} }
/// <summary>
/// 检查是否在4C风淋门内
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool CheckIsInAirDoor(string nodeName)
{
return SettingString.Lines_In_Air_Door.Split(',').Contains(nodeName);
}
/// <summary> /// <summary>
/// 检查当前任务是否结束 /// 检查当前任务是否结束
/// </summary> /// </summary>
/// <param name="taskName">任务名称</param> /// <param name="taskName">任务名称</param>
/// <param name="taskGUID">任务GUID</param> /// <param name="taskGUID">任务GUID</param>
/// <returns></returns> /// <returns></returns>
public static bool CheckTaskFinished(Agv_Info agv,string nodeName, string curTaskState) public static bool CheckTaskFinished(Agv_Info agv, string nodeName, string curTaskState)
{ {
log.Debug(agv.Name + " 检查当前任务是否结束: " +SettingString.Move + nodeName + " " + curTaskState); log.Debug(agv.Name + " 检查当前任务是否结束: " + SettingString.Move + nodeName + " " + curTaskState);
return Common.agvMission[SettingString.Move+nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done); return Common.agvMission[SettingString.Move + nodeName].Equals(agv.CurTaskGUID) && curTaskState.Equals(SettingString.Done);
} }
/// <summary> /// <summary>
/// 检查充电任务是否分配完成 /// 检查充电任务是否分配完成
...@@ -584,6 +582,7 @@ namespace AGVControl ...@@ -584,6 +582,7 @@ namespace AGVControl
} }
//双层线工单信息 //双层线工单信息
public static string doubleLine_WO = ""; public static string doubleLine_WO = "";
public static string warnMsg = "";
/// <summary> /// <summary>
/// 查找空架任务 /// 查找空架任务
/// </summary> /// </summary>
...@@ -597,6 +596,8 @@ namespace AGVControl ...@@ -597,6 +596,8 @@ namespace AGVControl
nodeName = ""; nodeName = "";
if (!Common.CheckCanExecuteMission(agv)) if (!Common.CheckCanExecuteMission(agv))
return false; return false;
///双层线出口检查
int idx = nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A6) int idx = nodeInfo.FindIndex(s => s.Name.Equals(SettingString.A6)
&& (s.StateEquals(eNodeStatus.NeedEnterLeave) || (s.StateEquals(eNodeStatus.NeedLeave))) && !s.RFID.Equals("")); && (s.StateEquals(eNodeStatus.NeedEnterLeave) || (s.StateEquals(eNodeStatus.NeedLeave))) && !s.RFID.Equals(""));
if (idx > -1) if (idx > -1)
...@@ -610,14 +611,14 @@ namespace AGVControl ...@@ -610,14 +611,14 @@ namespace AGVControl
{ {
nodeName = FullShelfDestInfo.location; nodeName = FullShelfDestInfo.location;
Common.GetLineNameByNodeName(nodeName, out string line); Common.GetLineNameByNodeName(nodeName, out string line);
Common.LogInfo("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line)); Common.log.Debug("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
return true; return true;
} }
else if (FullShelfDestInfo.location.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(agv.IP)) else if (FullShelfDestInfo.location.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
nodeName = FullShelfDestInfo.location; nodeName = FullShelfDestInfo.location;
Common.GetLineNameByNodeName(nodeName, out string line); Common.GetLineNameByNodeName(nodeName, out string line);
Common.LogInfo("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line)); Common.log.Debug("A6出满料架的产线有空料架,优先处理 " + FullShelfDestInfo.ShowInfo(line));
return true; return true;
} }
...@@ -627,7 +628,7 @@ namespace AGVControl ...@@ -627,7 +628,7 @@ namespace AGVControl
{ {
if (FullShelfDestInfo != null) if (FullShelfDestInfo != null)
{ {
Common.LogInfo("A6的出料信息不正确,请检查:" + FullShelfDestInfo.ShowInfo("ERROR")); Common.log.Error("A6的出料信息不正确,请检查:" + FullShelfDestInfo.ShowInfo("ERROR"));
//return false; //return false;
} }
} }
...@@ -648,13 +649,13 @@ namespace AGVControl ...@@ -648,13 +649,13 @@ namespace AGVControl
if (loc.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP)) if (loc.StartsWith(SettingString.C4_Name_Prefix) && SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
nodeName = loc; nodeName = loc;
Common.LogInfo("双层线正在出的工单目标产线有空料架,优先处4C-" + loc); //Common.LogInfo("双层线正在出的工单目标产线有空料架,优先处4C-" + loc);
return true; return true;
} }
else if (loc.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(agv.IP)) else if (loc.StartsWith(SettingString.D4_Name_Prefix) && !SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
nodeName = loc; nodeName = loc;
Common.LogInfo("双层线正在出的工单目标产线有空料架,优先处理4D-" + loc); Common.log.Debug("双层线正在出的工单目标产线有空料架,优先处理4D-" + loc);
return true; return true;
} }
} }
...@@ -668,8 +669,6 @@ namespace AGVControl ...@@ -668,8 +669,6 @@ namespace AGVControl
//双层线是否需要小料架 //双层线是否需要小料架
if (CheckA5A6State(agv, eShelfType.SmallShelf, out string lineNodeName)) if (CheckA5A6State(agv, eShelfType.SmallShelf, out string lineNodeName))
{ {
//if (curPlace.Equals(""))//待机位
// {
//4C车间寻找 //4C车间寻找
if (SettingString.C4_AGV_IPs.Contains(agv.IP)) if (SettingString.C4_AGV_IPs.Contains(agv.IP))
...@@ -733,32 +732,32 @@ namespace AGVControl ...@@ -733,32 +732,32 @@ namespace AGVControl
} }
} }
else if (CheckA6State(agv, eShelfType.SmallShelf, out string lineNodeName1)) else if (CheckA6State(agv, eShelfType.BigShelf, out string lineNodeName1))
{ {
//4C车间寻找 //4C车间备料区寻找
if (SettingString.C4_AGV_IPs.Contains(agv.IP)) if (SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.C4FeederOut) && s.IsUse); idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.C4FeederOut) && !s.RFID.StartsWith("0") && s.IsUse);
if (idx > -1) if (idx > -1)
{ {
int idx1 = agvInfo.FindIndex(s => s.CurJob is EnterLeaveShelfJob && ((EnterLeaveShelfJob)s.CurJob).LineName.Equals(SettingString.C4FeederOut)); int idx1 = agvInfo.FindIndex(s => s.CurJob is EnterLeaveShelfJob && ((EnterLeaveShelfJob)s.CurJob).LineName.Equals(SettingString.C4FeederOut));
if(idx1==-1) if (idx1 == -1)
{ {
nodeName = nodeInfo[idx].Name; nodeName = nodeInfo[idx].Name;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4C-" + nodeName); Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4C-" + nodeName);
return true; return true;
} }
} }
} }
//4D车间寻找 //4D车间备料区寻找
if (!SettingString.C4_AGV_IPs.Contains(agv.IP)) if (!SettingString.C4_AGV_IPs.Contains(agv.IP))
{ {
idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.D4FeederOut) && s.IsUse); idx = nodeInfo.FindIndex(s => s.EmptyShelfCnt > 0 && s.Name.Equals(SettingString.D4FeederOut) && !s.RFID.StartsWith("0") && s.IsUse);
if (idx > -1) if (idx > -1)
{ {
nodeName = nodeInfo[idx].Name; nodeName = nodeInfo[idx].Name;
Common.log.Debug(agv.Name + " 双层线需要小料架,准备去4D-" + nodeName); Common.log.Debug(agv.Name + " 双层线右侧需要料架,准备去4D-" + nodeName);
return true; return true;
} }
...@@ -847,6 +846,75 @@ namespace AGVControl ...@@ -847,6 +846,75 @@ namespace AGVControl
return false; return false;
} }
/// <summary> /// <summary>
/// 检查接驳台状态
/// </summary>
/// <returns></returns>
public static bool CheckStationState(ClientNode clientNode, out string rfid)
{
rfid = "";
if (!Common.missionManager.GetUnlockRfids(clientNode.Name).Contains(clientNode.RFID))
{
if (clientNode.Name.Equals(SettingString.C4FeederOut) || clientNode.Name.Equals(SettingString.D4FeederOut))
{
warnMsg = string.Format("[{1}]最外侧是料架[{0}],但没有解绑信息,请检查接驳台", clientNode.RFID, clientNode.Name);
Common.log.Debug(warnMsg);
}
else
{
string res = AGVManager.GetRFIDs(clientNode.Name);
warnMsg = string.Format("[{1}]最外侧是料架[{0}],但没有解绑信息,请检查接驳台:料架由里到外顺序:{2}", clientNode.RFID, clientNode.Name,res);
Common.log.Debug(warnMsg);
}
return false;
}
rfid = clientNode.RFID;
warnMsg = "";
return true;
}
/// <summary>
/// 上报接驳台状态
/// </summary>
/// <param name="clientNode"></param>
/// <returns>true:表示正常</returns>
public static bool UpdateStationState(ClientNode clientNode)
{
if (!Common.missionManager.GetUnlockRfids(clientNode.Name).Contains(clientNode.RFID))
{
if (clientNode.Name.Equals(SettingString.C4FeederOut) || clientNode.Name.Equals(SettingString.D4FeederOut))
{
clientNode.WarnMsg = string.Format("接驳台最外侧料架[{0}]没有解绑信息,请检查接驳台状况", clientNode.RFID);
return false;
}
else
{
string res = AGVManager.GetRFIDs(clientNode.Name);
clientNode.WarnMsg = string.Format("接驳台最外侧料架[{0}]没有解绑信息,当前料架由里到外顺序:{1}", clientNode.RFID, res);
return false;
}
}
clientNode.WarnMsg = "";
return true;
}
/// <summary>
/// 出料前检查接驳台状态
/// </summary>
/// <returns></returns>
public static bool CheckStationState(ClientNode clientNode)
{
if (Common.missionManager.GetUnlockCnt(clientNode.Name)>0)
{
// if (warnMsg.Equals(""))
{
warnMsg = string.Format("接驳台[{1}]有空料架未回收完,无法出满料,请检查接驳台RFID读取情况", clientNode.RFID, clientNode.Name);
Common.LogInfo(warnMsg);
}
return false;
}
return true;
}
/// <summary>
/// 计算当前小车距离最近的任务点(只针对产线) /// 计算当前小车距离最近的任务点(只针对产线)
/// </summary> /// </summary>
/// <param name="agv"></param> /// <param name="agv"></param>
...@@ -1053,122 +1121,24 @@ namespace AGVControl ...@@ -1053,122 +1121,24 @@ namespace AGVControl
//logTextBox.ScrollToCaret(); //logTextBox.ScrollToCaret();
} }
} }
public static void ReadLinePlace()
{
if (!System.IO.File.Exists(CONFIG_PATH + "LinePlace.txt"))
{
File.Create(CONFIG_PATH + "LinePlace.txt");
return;
}
string[] s = System.IO.File.ReadAllLines(CONFIG_PATH + "LinePlace.txt");
for (int i = 0; i < s.Count(); i++)
{
string[] mission = s[i].Split(',');
if (mission.Length != 2)
continue;
//missionManager.missionList.Add(new MissionStru(mission[0], mission[1]));
missionManager.AddMission(new MissionStru(mission[0], mission[1]));
}
}
/// <summary> /// <summary>
/// 添加空料架解绑 /// 读取料架解绑信息
/// </summary> /// </summary>
/// <param name="nodeName"></param> public static void ReadUnlockLineInfo()
/// <returns></returns>
public static bool AddEmptyShelfTask(string nodeName)
{ {
int idx = Common.nodeInfo.FindIndex(s => s.Name == nodeName); if (!System.IO.File.Exists(Common.CONFIG_PATH + "UnlockInfo.json"))
if (idx > -1)
{ {
// Common.missionManager.missionList.Add(new MissionStru(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nodeName)); File.Create(Common.CONFIG_PATH + "UnlockInfo.json");
Common.missionManager.AddMission(new MissionStru(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), nodeName)); missionManager = new UnlockMissionManager(nodeInfo);
Common.nodeInfo[idx].IncreEmptyShelfCnt(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); return;
using (System.IO.StreamWriter file = new System.IO.StreamWriter(CONFIG_PATH + "LinePlace.txt"))
{
foreach (var item in Common.missionManager.missionList)
{
file.WriteLine(string.Format("{0},{1}", item.CreateTime, item.NodeName));
}
}
return true;
}
else
{
log.Error("AddLinePlace 失败 节点" + nodeName + "不存在");
return false;
}
}
/// <summary>
/// 删除空架任务
/// </summary>
/// <param name="nodeName"></param>
/// <returns></returns>
public static bool DelEmptyShelfTask(string nodeName)
{
int idx = Common.nodeInfo.FindIndex(s => s.Name == nodeName);
if (idx > -1)
{
Common.nodeInfo[idx].DecreEmptyShelfCnt();
idx = Common.missionManager.missionList.FindIndex(s => s.NodeName == nodeName);
if (idx > -1)
{
LogInfo("删除一个空料架任务:" + nodeName);
Common.missionManager.DelMission(idx);
//Common.missionManager.missionList.RemoveAt(idx);
using (System.IO.StreamWriter file = new System.IO.StreamWriter(CONFIG_PATH + "LinePlace.txt"))
{
foreach (var item in Common.missionManager.missionList)
{
file.WriteLine(string.Format("{0},{1}", item.CreateTime, item.NodeName));
}
}
return true;
}
log.Error("DelLinePlace 失败 节点任务" + nodeName + "不存在");
return false;
}
else
{
log.Error("DelLinePlace 失败 节点" + nodeName + "不存在");
return false;
} }
string s = File.ReadAllText(Common.CONFIG_PATH + "UnlockInfo.json");
missionManager = JsonHelper.DeserializeJsonToObject<UnlockMissionManager>(s);
if (missionManager == null)
missionManager = new UnlockMissionManager(nodeInfo);
missionManager.Init();
} }
//public static void CheckAGVMissionState()
//{
// foreach (Agv_Info agv in agvInfo)
// {
// Thread.Sleep(50);
// bool rtn = Common.mir.Get_Register(agv, 20, out int regValue);
// if (rtn)
// {
// agv.GetPlace(regValue);
// Common.log.Debug(string.Format("软件开启:{0} Get_Register PLC{1}={2} Place={3} PlaceState={4}", agv.Name, 20, regValue, agv.Place, agv.PlaceState));
// if (!agv.Place.Equals(""))
// {
// int idx = nodeInfo.FindIndex(s => s.Name == agv.Place);
// if (idx > -1)
// {
// nodeInfo[idx].AgvName = agv.Name;
// }
// agv.TaskSend = "Move" + agv.Place;
// }
// }
// else
// {
// Common.log.Debug("CheckAGVMissionState 获取PLC20失败");
// }
// }
//}
public static void GetNodesPosition() public static void GetNodesPosition()
{ {
Agv_Info agv = agvInfo[0]; Agv_Info agv = agvInfo[0];
...@@ -1184,7 +1154,7 @@ namespace AGVControl ...@@ -1184,7 +1154,7 @@ namespace AGVControl
} }
else else
{ {
Common.log.Error(clientNode.Name+ " GetNodesPosition 获取节点位置失败"); Common.log.Error(clientNode.Name + " GetNodesPosition 获取节点位置失败");
} }
} }
} }
...@@ -1244,7 +1214,7 @@ namespace AGVControl ...@@ -1244,7 +1214,7 @@ namespace AGVControl
StandbyStation.C4_Station2 = agv.Name; StandbyStation.C4_Station2 = agv.Name;
Common.MoveToNode(agv, SettingString.C4_STANDBY2); Common.MoveToNode(agv, SettingString.C4_STANDBY2);
} }
} }
/// <summary> /// <summary>
/// 清除该小车在待机位的信息 /// 清除该小车在待机位的信息
...@@ -1452,63 +1422,5 @@ namespace AGVControl ...@@ -1452,63 +1422,5 @@ namespace AGVControl
public string C4_Station1; public string C4_Station1;
public string C4_Station2; public string C4_Station2;
} }
/// <summary>
/// 任务信息结构
/// </summary>
public struct MissionStru
{
public string NodeName;
public string CreateTime;
/// <summary>
/// 任务结构
/// </summary>
/// <param name="dateTime">创建时间</param>
/// <param name="name">节点名称</param>
public MissionStru(string dateTime, string name)
{
NodeName = name;
CreateTime = dateTime;
}
}
/// <summary>
/// 任务管理
/// </summary>
public class MissionManager
{
public delegate void MissionChangedHandler();
public event MissionChangedHandler MissionChanged;
/// <summary>
/// 任务列表
/// </summary>
public List<MissionStru> missionList;
/// <summary>
/// 空料架解绑总数
/// </summary>
public Int32 EmptyMissionCount
{
get { return missionList.Count; }
}
public void AddMission(MissionStru missionStru)
{
missionList.Add(missionStru);
MissionChanged?.Invoke();
}
public void DelMission(int idx)
{
if (idx == -1)
return;
Common.missionManager.missionList.RemoveAt(idx);
MissionChanged?.Invoke();
}
public MissionManager()
{
missionList = new List<MissionStru>();
}
}
} }
\ No newline at end of file \ No newline at end of file
...@@ -7,24 +7,25 @@ using System.Threading; ...@@ -7,24 +7,25 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Web.Script.Serialization; using System.Web.Script.Serialization;
using AGVControl; using AGVControl;
using BLL;
using log4net.Util; using log4net.Util;
using RestSharp; using RestSharp;
namespace BLL namespace AGVControl.BLL
{ {
public class Control public class Control
{ {
//private int areaC_Index; //private int areaC_Index;
private System.Timers.Timer AgvCallTimer; private System.Timers.Timer AgvCallTimer;
private System.Timers.Timer AgvStateTimer; private System.Timers.Timer AgvStateTimer;
private System.Timers.Timer NodeStateTimer;
//public List<string> Marks; //public List<string> Marks;
private const int REG_STATUS = 20; private const int REG_STATUS = 20;
//private List<string> shelfLockedNodeNames; //private List<string> shelfLockedNodeNames;
public delegate void AgvChangedEvent(int agvIndex); public delegate void AgvChangedEvent(int agvIndex);
public delegate void AgvMissionEvent();
public event AgvChangedEvent AgvChanged; public event AgvChangedEvent AgvChanged;
public event AgvChangedEvent AgvOnline; public event AgvChangedEvent AgvOnline;
public event AgvChangedEvent NodeChangedEvent;
public Control() public Control()
{ {
AgvCallTimer = new System.Timers.Timer AgvCallTimer = new System.Timers.Timer
...@@ -37,11 +38,18 @@ namespace BLL ...@@ -37,11 +38,18 @@ namespace BLL
AgvStateTimer = new System.Timers.Timer AgvStateTimer = new System.Timers.Timer
{ {
Interval = 1500, Interval = 3000,
AutoReset = true, AutoReset = true,
Enabled = false Enabled = false
}; };
AgvStateTimer.Elapsed += AgvStateTimer_Elapsed; AgvStateTimer.Elapsed += AgvStateTimer_Elapsed;
NodeStateTimer = new System.Timers.Timer
{
Interval = 5000,
AutoReset = true,
Enabled = false
};
NodeStateTimer.Elapsed += NodeStateTimer_Elapsed;
} }
...@@ -49,42 +57,93 @@ namespace BLL ...@@ -49,42 +57,93 @@ namespace BLL
{ {
AgvCallTimer.Enabled = true; AgvCallTimer.Enabled = true;
AgvStateTimer.Enabled = true; AgvStateTimer.Enabled = true;
NodeStateTimer.Enabled = true;
AgvCallTimer.Start(); AgvCallTimer.Start();
AgvStateTimer.Start(); AgvStateTimer.Start();
NodeStateTimer.Start();
} }
public void Stop() public void Stop()
{ {
AgvCallTimer.Enabled = false; AgvCallTimer.Enabled = false;
AgvStateTimer.Enabled = false; AgvStateTimer.Enabled = false;
NodeStateTimer.Enabled = false;
AgvCallTimer.Stop(); AgvCallTimer.Stop();
AgvStateTimer.Stop(); AgvStateTimer.Stop();
NodeStateTimer.Stop();
} }
private bool NodeStateInProcess = false;
private void NodeStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (NodeStateInProcess) return;
NodeStateInProcess = true;
List<AlarmMsg> msglist = new List<AlarmMsg>();
try
{
String tmp = "";
for (int j = 0; j < Common.nodeInfo.Count; j++)
{
bool isAlarm = false;
if (!Common.UpdateStationState(Common.nodeInfo[j]))
{
isAlarm = true;
msglist.Add(new AlarmMsg(Common.nodeInfo[j].AliceName, "lineAgv." + Common.nodeInfo[j].Name + ".WarnMsg", Common.nodeInfo[j].WarnMsg));
}
if (!isAlarm && !Common.nodeInfo[j].Online)
{
msglist.Add(new AlarmMsg(Common.nodeInfo[j].AliceName, "lineAgv." + Common.nodeInfo[j].Name + ".OffLine", "离线"));
}
if (Common.nodeInfo[j].Name.StartsWith(SettingString.D4_Name_Prefix) || Common.nodeInfo[j].Name.StartsWith(SettingString.C4_Name_Prefix))
{
if (!Common.nodeInfo[j].Name.Equals(SettingString.C4FeederIn) && !Common.nodeInfo[j].Name.Equals(SettingString.C4FeederOut) &&
!Common.nodeInfo[j].Name.Equals(SettingString.D4FeederIn) && !Common.nodeInfo[j].Name.Equals(SettingString.D4FeederOut))
{
tmp = AGVManager.GetFirstRFID(Common.nodeInfo[j].Name);
if (!tmp.Equals(Common.nodeInfo[j].RFID))
{
Common.nodeInfo[j].RFID = tmp;
NodeChangedEvent?.Invoke(j);
}
}
if (Common.nodeInfo[j].Name.Equals(SettingString.C4FeederOut) || Common.nodeInfo[j].Name.Equals(SettingString.D4FeederOut))
{
if (Common.missionManager.GetUnlockCnt(Common.nodeInfo[j].Name) > 0)
{
tmp = Common.missionManager.GetUnlockRfids(Common.nodeInfo[j].Name)[0];
if (!tmp.Equals(Common.nodeInfo[j].RFID))
{
Common.nodeInfo[j].RFID = tmp;
NodeChangedEvent?.Invoke(j);
}
}
}
}
}
AGVManager.updateDeviceAlarmMsg(msglist);
}
catch(Exception ex)
{
Common.log.Error("NodeStateTimer " + ex.Message + ex.StackTrace);
}
NodeStateInProcess = false;
}
private bool AgvStateInProcess = false; private bool AgvStateInProcess = false;
private eAGVState preAGVState = eAGVState.None; //private eAGVState preAGVState = eAGVState.None;
private void AgvStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) private void AgvStateTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{ {
bool rtn; bool rtn;
if (AgvStateInProcess) return; if (AgvStateInProcess) return;
AgvStateInProcess = true; AgvStateInProcess = true;
List<AlarmMsg> msglist = new List<AlarmMsg>(); List<AlarmMsg> msglist = new List<AlarmMsg>();
for (int j = 0; j < Common.nodeInfo.Count; j++)
{
if (!Common.nodeInfo[j].Online)
{
msglist.Add(new AlarmMsg(Common.nodeInfo[j].AliceName, "lineAgv." + Common.nodeInfo[j].Name + ".OffLine", "离线"));
}
}
BLL.AGVManager.updateDeviceAlarmMsg(msglist);
for (int i = 0; i < Common.agvInfo.Count; i++) for (int i = 0; i < Common.agvInfo.Count; i++)
{ {
//上报异常 //上报异常
bool isAlarm = false; bool isAlarm = false;
if (msglist.Count > 0) //if (msglist.Count > 0)
msglist.Clear(); // msglist.Clear();
try try
{ {
if (!CheckOnline(i)) continue; if (!CheckOnline(i)) continue;
...@@ -96,30 +155,24 @@ namespace BLL ...@@ -96,30 +155,24 @@ namespace BLL
Thread.Sleep(50); Thread.Sleep(50);
if (rtn) change = Common.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position); if (rtn) change = Common.agvInfo[i].SetState(stateID, stateStr, battery, mission_text, position);
//更新状态stateID.Equals(eAGVState.Executing) // if (change)
if (change)
{ {
AgvChanged?.Invoke(i); AgvChanged?.Invoke(i);
} }
Common.log.Debug("获取AGV状态");
Thread.Sleep(50); Thread.Sleep(50);
rtn = Common.mir.Get_IO_Status(Common.agvInfo[i], out bool[] input, out bool[] output); if (stateText.Equals("Error") || stateText.Equals("EmergencyStop") || stateText.Equals("Pause"))
Common.log.Debug("获取IO状态");
preAGVState = Common.agvInfo[i].StateID;
if (Common.agvInfo[i].StandTimeOut)
{ {
isAlarm = true; isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".StandTimeOut", "在" + Common.agvInfo[i].PlaceAliceName + "停留超时" + (DateTime.Now - Common.agvInfo[i].StandStartTime).TotalMinutes.ToString("f2") + "分钟")); msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Error.EmergencyStop", "agv状态:" + stateText + ""));
} }
if (stateText.Equals("Error") || stateText.Equals("EmergencyStop") || stateText.Equals("Pause")) if (!isAlarm && Common.agvInfo[i].StandTimeOut)
{ {
isAlarm = true; isAlarm = true;
msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".Error.EmergencyStop", "agv状态:" + stateText + "")); msglist.Add(new AlarmMsg(Common.agvInfo[i].Name, "lineAgv." + Common.agvInfo[i].Name + ".StandTimeOut", "在" + Common.agvInfo[i].PlaceAliceName + "停留超时" + (DateTime.Now - Common.agvInfo[i].StandStartTime).TotalMinutes.ToString("f2") + "分钟"));
} }
if (!isAlarm) if (!isAlarm)
{ {
try try
...@@ -139,7 +192,7 @@ namespace BLL ...@@ -139,7 +192,7 @@ namespace BLL
Common.log.Error(Common.agvInfo[i].Name + "上报小车运行步骤失败" + ex.Message + ex.StackTrace); Common.log.Error(Common.agvInfo[i].Name + "上报小车运行步骤失败" + ex.Message + ex.StackTrace);
} }
} }
BLL.AGVManager.updateDeviceAlarmMsg(msglist); AGVManager.updateDeviceAlarmMsg(msglist);
} }
catch (Exception ex) catch (Exception ex)
{ {
...@@ -147,7 +200,6 @@ namespace BLL ...@@ -147,7 +200,6 @@ namespace BLL
} }
} }
AgvStateInProcess = false; AgvStateInProcess = false;
} }
......
...@@ -4,7 +4,7 @@ using System; ...@@ -4,7 +4,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
namespace BLL namespace AGVControl
{ {
/// <summary> /// <summary>
/// Json帮助类 /// Json帮助类
......
...@@ -20,7 +20,7 @@ namespace BLL ...@@ -20,7 +20,7 @@ namespace BLL
//?emptyStation={line} //?emptyStation={line}
[OperationContract] [OperationContract]
[WebInvoke(UriTemplate = "CreateEmptyRecycleTask?emptyStation={line}&rfid={RFID}", Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)] [WebInvoke(UriTemplate = "CreateEmptyRecycleTask?emptyStation={line}&rfid={RFID}", Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
string CreateEmptyRecycleTaskGET(string line,string RFID=""); string CreateEmptyRecycleTaskGET(string line, string RFID = "");
} }
...@@ -70,38 +70,35 @@ namespace BLL ...@@ -70,38 +70,35 @@ namespace BLL
} }
if (Common.GetNodeNameByLineName(emptyStation, out string value)) if (Common.GetNodeNameByLineName(emptyStation, out string value))
{ {
if (!Common.AddEmptyShelfTask(value)) if (rfid == null)
{ {
Common.log.Error("CreateEmptyRecycleTask(POST) 节点[" + value + "]不存在"); res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "rfid=null" };
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + emptyStation }; Log.Error(string.Format("Unlock Request(POST) Failed [emptyStation={0},rfid=null]", emptyStation));
} }
else else
{ {
if (rfid == null) res = new Result() { Succeed = true, ResultData = rfid, ErrorMessage = "" };
Log.Info(string.Format("Unlock Request(POST) [emptyStation={0},rfid={1}]", emptyStation, rfid.ToUpper()));
if (!Common.missionManager.AddMission(value, rfid.ToUpper()))
{ {
res = new Result() { Succeed = true, ResultData = null, ErrorMessage = "" }; Common.log.Error("CreateEmptyRecycleTask(POST) 节点[" + value + "]不存在");
Log.Info(string.Format("WebService Request(POST) emptyStation={0},rfid=null", emptyStation)); res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + emptyStation + " rfid=" + rfid };
Common.LogInfo("任务[POST]:" + value + " 出空料架 [" + emptyStation + "]");
} }
else else
{ Common.LogInfo("任务[POST]:" + value + " 出空料架 [location=" + emptyStation + ",rfid=" + rfid.ToUpper() + "]");
res = new Result() { Succeed = true, ResultData = rfid, ErrorMessage = "" };
Log.Info(string.Format("WebService Request(POST) emptyStation={0},rfid={1}", emptyStation, rfid));
Common.LogInfo("任务[POST]:" + value + " 出空料架 [location=" + emptyStation + ",rfid=" + rfid + "]");
}
} }
// AGVControl.Common.log.Debug("WebService POST Response OK"); // AGVControl.Common.log.Debug("WebService POST Response OK");
} }
else else
{ {
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "Not find " + emptyStation }; res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "Not find " + emptyStation };
AGVControl.Common.log.Error("WebService POST Response false " + "Not find " + emptyStation); AGVControl.Common.log.Error("Unlock POST Response false " + "Not find " + emptyStation);
} }
} }
return JsonHelper.SerializeObject(res); return JsonHelper.SerializeObject(res);
} }
public string CreateEmptyRecycleTaskGET(string line,string RFID) public string CreateEmptyRecycleTaskGET(string line, string RFID)
{ {
Result res; Result res;
if (line.Equals("Feeder")) if (line.Equals("Feeder"))
...@@ -115,7 +112,7 @@ namespace BLL ...@@ -115,7 +112,7 @@ namespace BLL
if (Common.GetNodeNameByLineName(line, out string value)) if (Common.GetNodeNameByLineName(line, out string value))
{ {
if (!Common.AddEmptyShelfTask(value)) if (!Common.missionManager.AddMission(value,RFID.ToUpper()))
{ {
Common.log.Error("CreateEmptyRecycleTask 节点[" + value + "]不存在"); Common.log.Error("CreateEmptyRecycleTask 节点[" + value + "]不存在");
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + line }; res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "CreateEmptyRecycleTask failed: " + line };
...@@ -123,14 +120,14 @@ namespace BLL ...@@ -123,14 +120,14 @@ namespace BLL
else else
{ {
res = new Result() { Succeed = true, ResultData = RFID, ErrorMessage = "" }; res = new Result() { Succeed = true, ResultData = RFID, ErrorMessage = "" };
Log.Info(string.Format("WebService Request(GET) emptyStation={0},rfid={1}", line, RFID)); Log.Info(string.Format("Unlock Request(GET) [emptyStation={0},rfid={1}]", line, RFID.ToUpper()));
Common.LogInfo("任务[GET]:" + value + " 出空料架 [emptyStation=" + line + ",rfid="+RFID+"]"); Common.LogInfo("任务[GET]:" + value + " 出空料架 [emptyStation=" + line + ",rfid=" + RFID.ToUpper() + "]");
} }
} }
else else
{ {
res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "Not find " + line }; res = new Result() { Succeed = false, ResultData = null, ErrorMessage = "Not find " + line };
AGVControl.Common.LogInfo("WebService GET Response false " + "Not find " + line); AGVControl.Common.LogInfo("Unlock GET Response false " + "Not find " + line);
} }
//Log.Info(string.Format("WebService GET Request emptyStation={0},rfid={1}", line, RFID)); //Log.Info(string.Format("WebService GET Request emptyStation={0},rfid={1}", line, RFID));
return JsonHelper.SerializeObject(res); return JsonHelper.SerializeObject(res);
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl.BLL
{
/// <summary>
/// 接驳台RFID管理
/// </summary>
public class StationRFIDManager
{
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl
{
/// <summary>
///解绑料架任务管理
/// </summary>
public class UnlockMissionManager
{
public delegate void MissionChangedHandler(Dictionary<string, UnlockInfo> pairs);
public event MissionChangedHandler MissionChanged;
/// <summary>
/// 任务列表
/// </summary>
public Dictionary<string, UnlockedShelf> NodeUnlockMissions { get; private set; }
Dictionary<string, UnlockInfo> UnlockMissions;
public UnlockMissionManager(List<ClientNode> clientNodes)
{
NodeUnlockMissions = new Dictionary<string, UnlockedShelf>();
UnlockMissions = new Dictionary<string, UnlockInfo>();
foreach (ClientNode item in clientNodes)
{
if (item.Name.StartsWith("A") || item.Name.Equals(SettingString.D4FeederIn) || item.Name.Equals(SettingString.C4FeederIn))
continue;
NodeUnlockMissions.Add(item.Name, new UnlockedShelf());
UnlockMissions = new Dictionary<string, UnlockInfo>();
}
}
public UnlockMissionManager()
{
NodeUnlockMissions = new Dictionary<string, UnlockedShelf>();
UnlockMissions = new Dictionary<string, UnlockInfo>();
}
public void Init()
{
foreach (var item in NodeUnlockMissions.Keys)
{
UnlockMissions.Add(item, new UnlockInfo(item, NodeUnlockMissions[item].EmptyCnt, NodeUnlockMissions[item].GetRfidWithTime()));
}
MissionChanged?.Invoke(UnlockMissions);
}
public UnlockedShelf GetUnlockInfo(string nodeName)
{
if (NodeUnlockMissions.ContainsKey(nodeName))
{
return NodeUnlockMissions[nodeName];
}
return null;
}
public int GetUnlockCnt(string nodeName)
{
if (NodeUnlockMissions.ContainsKey(nodeName))
{
return NodeUnlockMissions[nodeName].EmptyCnt;
}
return -1;
}
public List<string> GetUnlockRfids(string nodeName)
{
if (NodeUnlockMissions.ContainsKey(nodeName))
{
return NodeUnlockMissions[nodeName].GetRfids();
}
return new List<string>();
}
public bool AddMission(string nodeName, string rfid)
{
bool rtn = NodeUnlockMissions[nodeName].Add(rfid);
if (rtn)
{
UnlockMissions[nodeName] = new UnlockInfo(nodeName, NodeUnlockMissions[nodeName].EmptyCnt, NodeUnlockMissions[nodeName].GetRfidWithTime());
WriteUnlockLineInfo();
Common.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
Common.LogInfo(string.Format("{0}解绑任务添加成功:RFID={1}", nodeName, rfid));
MissionChanged?.Invoke(UnlockMissions);
}
else
Common.LogInfo(string.Format("{0}解绑任务添加失败:RFID={1}", nodeName, rfid));
return rtn;
}
public bool DelMission(string nodeName, string rfid)
{
bool rtn = NodeUnlockMissions[nodeName].Delete(rfid);
if (rtn)
{
UnlockMissions[nodeName] = new UnlockInfo(nodeName, NodeUnlockMissions[nodeName].EmptyCnt, NodeUnlockMissions[nodeName].GetRfidWithTime());
WriteUnlockLineInfo();
Common.WriteIni(nodeName, SettingString.EmptyShelfCnt, NodeUnlockMissions[nodeName].EmptyCnt.ToString());
Common.LogInfo(string.Format("{0}解绑任务删除成功:RFID={1}", nodeName, rfid));
MissionChanged?.Invoke(UnlockMissions);
}
else
Common.LogInfo(string.Format("{0}解绑任务删除失败:RFID={1}", nodeName, rfid));
return rtn;
}
/// <summary>
/// 保存料架解绑信息
/// </summary>
void WriteUnlockLineInfo()
{
using (System.IO.StreamWriter file = new System.IO.StreamWriter(Common.CONFIG_PATH + "UnlockInfo.json"))
{
string s = JsonHelper.SerializeObject(this);
file.WriteLine(s);
}
}
}
public class UnlockInfo
{
public string Line { get; set; }
public int Count { get; set; }
public string RFID { get; set; }
public List<UnlockRfid> UnlockRfids { get; private set; }
public UnlockInfo(string nodeName, int count, Dictionary<string, string> rfids)
{
if (Common.GetLineNameByNodeName(nodeName, out string line))
{
Line = line;
}
else
{
Line = nodeName;
}
Count = count;
RFID = string.Join(",", rfids.Keys);
UnlockRfids = new List<UnlockRfid>();
foreach (var item in rfids.Keys)
{
UnlockRfids.Add(new UnlockRfid(nodeName, rfids[item], item));
}
}
}
public class UnlockRfid
{
public String Line { get; set; }
public string RFID { get; set; }
public string Time { get; set; }
public UnlockRfid(string line, string time, string rfid)
{
Time = time;
RFID = rfid;
Line = line;
}
}
}
...@@ -28,11 +28,19 @@ ...@@ -28,11 +28,19 @@
/// </summary> /// </summary>
private void InitializeComponent() private void InitializeComponent()
{ {
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
this.DgvAgv = new System.Windows.Forms.DataGridView(); this.DgvAgv = new System.Windows.Forms.DataGridView();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column14 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column21 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column18 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column23 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column13 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column19 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column11 = new System.Windows.Forms.DataGridViewButtonColumn();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.tabControl1 = new System.Windows.Forms.TabControl(); this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage1 = new System.Windows.Forms.TabPage(); this.tabPage1 = new System.Windows.Forms.TabPage();
...@@ -53,26 +61,33 @@ ...@@ -53,26 +61,33 @@
this.groupBox3 = new System.Windows.Forms.GroupBox(); this.groupBox3 = new System.Windows.Forms.GroupBox();
this.lblWO = new System.Windows.Forms.Label(); this.lblWO = new System.Windows.Forms.Label();
this.tableLayoutPanel7 = new System.Windows.Forms.TableLayoutPanel(); this.tableLayoutPanel7 = new System.Windows.Forms.TableLayoutPanel();
this.groupBox4 = new System.Windows.Forms.GroupBox(); this.lblWarn = new System.Windows.Forms.Label();
this.dgvLineMission = new System.Windows.Forms.DataGridView(); this.grpUnlock = new System.Windows.Forms.GroupBox();
this.Column24 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.tblLayoutUnlock = new System.Windows.Forms.TableLayoutPanel();
this.Column8 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.dgvUnlockDetail = new System.Windows.Forms.DataGridView();
this.dgvUnlockInfo = new System.Windows.Forms.DataGridView();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.groupBox8 = new System.Windows.Forms.GroupBox(); this.groupBox8 = new System.Windows.Forms.GroupBox();
this.lblStandy2 = new System.Windows.Forms.Label(); this.lblStandy2 = new System.Windows.Forms.Label();
this.lblStandy1 = new System.Windows.Forms.Label(); this.lblStandy1 = new System.Windows.Forms.Label();
this.lblCharge4 = new System.Windows.Forms.Label(); this.lblCharge4 = new System.Windows.Forms.Label();
this.lblCharge3 = new System.Windows.Forms.Label(); this.lblCharge3 = new System.Windows.Forms.Label();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.TxtLog = new System.Windows.Forms.TextBox(); this.TxtLog = new System.Windows.Forms.TextBox();
this.tabPage3 = new System.Windows.Forms.TabPage(); this.tabPage3 = new System.Windows.Forms.TabPage();
this.groupBox7 = new System.Windows.Forms.GroupBox(); this.groupBox4 = new System.Windows.Forms.GroupBox();
this.btnClearStationRFID = new System.Windows.Forms.Button();
this.label11 = new System.Windows.Forms.Label();
this.txtBoxLineName = new System.Windows.Forms.TextBox(); this.txtBoxLineName = new System.Windows.Forms.TextBox();
this.btnUpdateStatus = new System.Windows.Forms.Button();
this.btnGetStationRfid = new System.Windows.Forms.Button();
this.label8 = new System.Windows.Forms.Label(); this.label8 = new System.Windows.Forms.Label();
this.label7 = new System.Windows.Forms.Label(); this.label7 = new System.Windows.Forms.Label();
this.btnUpdateStatus = new System.Windows.Forms.Button();
this.txtBoxRFID = new System.Windows.Forms.TextBox(); this.txtBoxRFID = new System.Windows.Forms.TextBox();
this.groupBox6 = new System.Windows.Forms.GroupBox(); this.groupBox6 = new System.Windows.Forms.GroupBox();
this.label10 = new System.Windows.Forms.Label();
this.label9 = new System.Windows.Forms.Label();
this.txtRfid = new System.Windows.Forms.TextBox();
this.btnDeleteMission = new System.Windows.Forms.Button(); this.btnDeleteMission = new System.Windows.Forms.Button();
this.btnAddMission = new System.Windows.Forms.Button(); this.btnAddMission = new System.Windows.Forms.Button();
this.cmbBoxLineName = new System.Windows.Forms.ComboBox(); this.cmbBoxLineName = new System.Windows.Forms.ComboBox();
...@@ -91,17 +106,9 @@ ...@@ -91,17 +106,9 @@
this.label3 = new System.Windows.Forms.Label(); this.label3 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label(); this.label1 = new System.Windows.Forms.Label();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.agvRemoveRfid = new System.Windows.Forms.Button();
this.Column4 = new System.Windows.Forms.DataGridViewTextBoxColumn(); this.label12 = new System.Windows.Forms.Label();
this.Column14 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column21 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column18 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column23 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column13 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column19 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column11 = new System.Windows.Forms.DataGridViewButtonColumn();
((System.ComponentModel.ISupportInitialize)(this.DgvAgv)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.DgvAgv)).BeginInit();
this.tableLayoutPanel3.SuspendLayout(); this.tableLayoutPanel3.SuspendLayout();
this.tabControl1.SuspendLayout(); this.tabControl1.SuspendLayout();
...@@ -113,13 +120,15 @@ ...@@ -113,13 +120,15 @@
this.groupBox5.SuspendLayout(); this.groupBox5.SuspendLayout();
this.groupBox3.SuspendLayout(); this.groupBox3.SuspendLayout();
this.tableLayoutPanel7.SuspendLayout(); this.tableLayoutPanel7.SuspendLayout();
this.groupBox4.SuspendLayout(); this.grpUnlock.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dgvLineMission)).BeginInit(); this.tblLayoutUnlock.SuspendLayout();
this.groupBox8.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dgvUnlockDetail)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.dgvUnlockInfo)).BeginInit();
this.tabPage2.SuspendLayout(); this.tabPage2.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout();
this.groupBox8.SuspendLayout();
this.tabPage3.SuspendLayout(); this.tabPage3.SuspendLayout();
this.groupBox7.SuspendLayout(); this.groupBox4.SuspendLayout();
this.groupBox6.SuspendLayout(); this.groupBox6.SuspendLayout();
this.groupBox2.SuspendLayout(); this.groupBox2.SuspendLayout();
this.tableLayoutPanel4.SuspendLayout(); this.tableLayoutPanel4.SuspendLayout();
...@@ -157,9 +166,97 @@ ...@@ -157,9 +166,97 @@
this.DgvAgv.RowHeadersVisible = false; this.DgvAgv.RowHeadersVisible = false;
this.DgvAgv.RowHeadersWidth = 51; this.DgvAgv.RowHeadersWidth = 51;
this.DgvAgv.RowTemplate.Height = 23; this.DgvAgv.RowTemplate.Height = 23;
this.DgvAgv.Size = new System.Drawing.Size(1061, 125); this.DgvAgv.Size = new System.Drawing.Size(1105, 141);
this.DgvAgv.TabIndex = 3; this.DgvAgv.TabIndex = 3;
this.DgvAgv.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvAgv_CellClick); this.DgvAgv.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvAgv_CellClick);
this.DgvAgv.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvAgv_CellContentClick);
//
// Column1
//
this.Column1.HeaderText = "名称";
this.Column1.MinimumWidth = 6;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column2
//
this.Column2.HeaderText = "IP";
this.Column2.MinimumWidth = 6;
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column4
//
this.Column4.HeaderText = "小车状态";
this.Column4.MinimumWidth = 6;
this.Column4.Name = "Column4";
this.Column4.ReadOnly = true;
this.Column4.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column14
//
this.Column14.HeaderText = "任务ID";
this.Column14.MinimumWidth = 6;
this.Column14.Name = "Column14";
this.Column14.ReadOnly = true;
this.Column14.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column21
//
this.Column21.HeaderText = "任务名称";
this.Column21.MinimumWidth = 6;
this.Column21.Name = "Column21";
this.Column21.ReadOnly = true;
this.Column21.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column3
//
this.Column3.HeaderText = "任务状态";
this.Column3.MinimumWidth = 6;
this.Column3.Name = "Column3";
this.Column3.ReadOnly = true;
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column18
//
this.Column18.HeaderText = "目的地";
this.Column18.MinimumWidth = 6;
this.Column18.Name = "Column18";
this.Column18.ReadOnly = true;
this.Column18.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column23
//
this.Column23.HeaderText = "负载";
this.Column23.MinimumWidth = 6;
this.Column23.Name = "Column23";
this.Column23.ReadOnly = true;
this.Column23.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column13
//
this.Column13.HeaderText = "连接";
this.Column13.MinimumWidth = 6;
this.Column13.Name = "Column13";
this.Column13.ReadOnly = true;
this.Column13.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column19
//
this.Column19.HeaderText = "电量";
this.Column19.MinimumWidth = 6;
this.Column19.Name = "Column19";
this.Column19.ReadOnly = true;
this.Column19.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column11
//
this.Column11.HeaderText = "自动";
this.Column11.MinimumWidth = 6;
this.Column11.Name = "Column11";
this.Column11.ReadOnly = true;
// //
// tableLayoutPanel3 // tableLayoutPanel3
// //
...@@ -170,13 +267,13 @@ ...@@ -170,13 +267,13 @@
this.tableLayoutPanel3.Controls.Add(this.tableLayoutPanel4, 0, 1); this.tableLayoutPanel3.Controls.Add(this.tableLayoutPanel4, 0, 1);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0); this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 0);
this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tableLayoutPanel3.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel3.Name = "tableLayoutPanel3"; this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 3; this.tableLayoutPanel3.RowCount = 3;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F)); this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 20F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F)); this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 30F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(1067, 656); this.tableLayoutPanel3.Size = new System.Drawing.Size(1111, 735);
this.tableLayoutPanel3.TabIndex = 7; this.tableLayoutPanel3.TabIndex = 7;
// //
// tabControl1 // tabControl1
...@@ -185,10 +282,10 @@ ...@@ -185,10 +282,10 @@
this.tabControl1.Controls.Add(this.tabPage2); this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage3); this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(3, 330); this.tabControl1.Location = new System.Drawing.Point(3, 370);
this.tabControl1.Name = "tabControl1"; this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0; this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(1061, 323); this.tabControl1.Size = new System.Drawing.Size(1105, 362);
this.tabControl1.TabIndex = 7; this.tabControl1.TabIndex = 7;
// //
// tabPage1 // tabPage1
...@@ -196,8 +293,8 @@ ...@@ -196,8 +293,8 @@
this.tabPage1.Controls.Add(this.tableLayoutPanel2); this.tabPage1.Controls.Add(this.tableLayoutPanel2);
this.tabPage1.Location = new System.Drawing.Point(4, 22); this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1"; this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3); this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(1053, 297); this.tabPage1.Size = new System.Drawing.Size(1097, 336);
this.tabPage1.TabIndex = 0; this.tabPage1.TabIndex = 0;
this.tabPage1.Text = "节点状态&产线任务"; this.tabPage1.Text = "节点状态&产线任务";
this.tabPage1.UseVisualStyleBackColor = true; this.tabPage1.UseVisualStyleBackColor = true;
...@@ -211,11 +308,11 @@ ...@@ -211,11 +308,11 @@
this.tableLayoutPanel2.Controls.Add(this.groupBox1, 1, 0); this.tableLayoutPanel2.Controls.Add(this.groupBox1, 1, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3); this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tableLayoutPanel2.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel2.Name = "tableLayoutPanel2"; this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 1; this.tableLayoutPanel2.RowCount = 1;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(1047, 291); this.tableLayoutPanel2.Size = new System.Drawing.Size(1091, 330);
this.tableLayoutPanel2.TabIndex = 34; this.tableLayoutPanel2.TabIndex = 34;
// //
// DgvNode // DgvNode
...@@ -247,7 +344,7 @@ ...@@ -247,7 +344,7 @@
this.DgvNode.RowHeadersVisible = false; this.DgvNode.RowHeadersVisible = false;
this.DgvNode.RowHeadersWidth = 50; this.DgvNode.RowHeadersWidth = 50;
this.DgvNode.RowTemplate.Height = 23; this.DgvNode.RowTemplate.Height = 23;
this.DgvNode.Size = new System.Drawing.Size(584, 285); this.DgvNode.Size = new System.Drawing.Size(609, 324);
this.DgvNode.TabIndex = 1; this.DgvNode.TabIndex = 1;
this.DgvNode.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvNode_CellClick); this.DgvNode.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvNode_CellClick);
// //
...@@ -326,11 +423,11 @@ ...@@ -326,11 +423,11 @@
this.groupBox1.Controls.Add(this.tableLayoutPanel5); this.groupBox1.Controls.Add(this.tableLayoutPanel5);
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill; this.groupBox1.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox1.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.groupBox1.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox1.Location = new System.Drawing.Point(592, 2); this.groupBox1.Location = new System.Drawing.Point(617, 2);
this.groupBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox1.Margin = new System.Windows.Forms.Padding(2);
this.groupBox1.Name = "groupBox1"; this.groupBox1.Name = "groupBox1";
this.groupBox1.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox1.Padding = new System.Windows.Forms.Padding(2);
this.groupBox1.Size = new System.Drawing.Size(453, 287); this.groupBox1.Size = new System.Drawing.Size(472, 326);
this.groupBox1.TabIndex = 33; this.groupBox1.TabIndex = 33;
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "任务信息"; this.groupBox1.Text = "任务信息";
...@@ -342,26 +439,28 @@ ...@@ -342,26 +439,28 @@
this.tableLayoutPanel5.Controls.Add(this.groupBox5, 0, 1); this.tableLayoutPanel5.Controls.Add(this.groupBox5, 0, 1);
this.tableLayoutPanel5.Controls.Add(this.groupBox3, 0, 0); this.tableLayoutPanel5.Controls.Add(this.groupBox3, 0, 0);
this.tableLayoutPanel5.Controls.Add(this.tableLayoutPanel7, 0, 2); this.tableLayoutPanel5.Controls.Add(this.tableLayoutPanel7, 0, 2);
this.tableLayoutPanel5.Controls.Add(this.grpUnlock, 0, 3);
this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel5.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel5.Location = new System.Drawing.Point(2, 19); this.tableLayoutPanel5.Location = new System.Drawing.Point(2, 19);
this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tableLayoutPanel5.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel5.Name = "tableLayoutPanel5"; this.tableLayoutPanel5.Name = "tableLayoutPanel5";
this.tableLayoutPanel5.RowCount = 3; this.tableLayoutPanel5.RowCount = 4;
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F)); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F)); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 15F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 70F)); this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 55F));
this.tableLayoutPanel5.Size = new System.Drawing.Size(449, 266); this.tableLayoutPanel5.Size = new System.Drawing.Size(468, 305);
this.tableLayoutPanel5.TabIndex = 2; this.tableLayoutPanel5.TabIndex = 2;
// //
// groupBox5 // groupBox5
// //
this.groupBox5.Controls.Add(this.lblDestInfo); this.groupBox5.Controls.Add(this.lblDestInfo);
this.groupBox5.Dock = System.Windows.Forms.DockStyle.Fill; this.groupBox5.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox5.Location = new System.Drawing.Point(2, 41); this.groupBox5.Location = new System.Drawing.Point(2, 47);
this.groupBox5.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox5.Margin = new System.Windows.Forms.Padding(2);
this.groupBox5.Name = "groupBox5"; this.groupBox5.Name = "groupBox5";
this.groupBox5.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox5.Padding = new System.Windows.Forms.Padding(2);
this.groupBox5.Size = new System.Drawing.Size(445, 35); this.groupBox5.Size = new System.Drawing.Size(464, 41);
this.groupBox5.TabIndex = 2; this.groupBox5.TabIndex = 2;
this.groupBox5.TabStop = false; this.groupBox5.TabStop = false;
this.groupBox5.Text = "出料信息"; this.groupBox5.Text = "出料信息";
...@@ -373,7 +472,7 @@ ...@@ -373,7 +472,7 @@
this.lblDestInfo.Location = new System.Drawing.Point(2, 19); this.lblDestInfo.Location = new System.Drawing.Point(2, 19);
this.lblDestInfo.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblDestInfo.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblDestInfo.Name = "lblDestInfo"; this.lblDestInfo.Name = "lblDestInfo";
this.lblDestInfo.Size = new System.Drawing.Size(441, 14); this.lblDestInfo.Size = new System.Drawing.Size(460, 20);
this.lblDestInfo.TabIndex = 40; this.lblDestInfo.TabIndex = 40;
this.lblDestInfo.Text = "lblDestInfo"; this.lblDestInfo.Text = "lblDestInfo";
// //
...@@ -382,10 +481,10 @@ ...@@ -382,10 +481,10 @@
this.groupBox3.Controls.Add(this.lblWO); this.groupBox3.Controls.Add(this.lblWO);
this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill; this.groupBox3.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox3.Location = new System.Drawing.Point(2, 2); this.groupBox3.Location = new System.Drawing.Point(2, 2);
this.groupBox3.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox3.Margin = new System.Windows.Forms.Padding(2);
this.groupBox3.Name = "groupBox3"; this.groupBox3.Name = "groupBox3";
this.groupBox3.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox3.Padding = new System.Windows.Forms.Padding(2);
this.groupBox3.Size = new System.Drawing.Size(445, 35); this.groupBox3.Size = new System.Drawing.Size(464, 41);
this.groupBox3.TabIndex = 0; this.groupBox3.TabIndex = 0;
this.groupBox3.TabStop = false; this.groupBox3.TabStop = false;
this.groupBox3.Text = "双层线工单信息"; this.groupBox3.Text = "双层线工单信息";
...@@ -397,95 +496,120 @@ ...@@ -397,95 +496,120 @@
this.lblWO.Location = new System.Drawing.Point(2, 19); this.lblWO.Location = new System.Drawing.Point(2, 19);
this.lblWO.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.lblWO.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblWO.Name = "lblWO"; this.lblWO.Name = "lblWO";
this.lblWO.Size = new System.Drawing.Size(441, 14); this.lblWO.Size = new System.Drawing.Size(460, 20);
this.lblWO.TabIndex = 40; this.lblWO.TabIndex = 40;
this.lblWO.Text = "lblWO"; this.lblWO.Text = "lblWO";
// //
// tableLayoutPanel7 // tableLayoutPanel7
// //
this.tableLayoutPanel7.ColumnCount = 2; this.tableLayoutPanel7.ColumnCount = 1;
this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 56.58784F)); this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 43.41216F)); this.tableLayoutPanel7.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel7.Controls.Add(this.groupBox4, 0, 0); this.tableLayoutPanel7.Controls.Add(this.lblWarn, 0, 0);
this.tableLayoutPanel7.Controls.Add(this.groupBox8, 1, 0);
this.tableLayoutPanel7.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel7.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel7.Location = new System.Drawing.Point(2, 80); this.tableLayoutPanel7.Location = new System.Drawing.Point(2, 92);
this.tableLayoutPanel7.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tableLayoutPanel7.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel7.Name = "tableLayoutPanel7"; this.tableLayoutPanel7.Name = "tableLayoutPanel7";
this.tableLayoutPanel7.RowCount = 1; this.tableLayoutPanel7.RowCount = 1;
this.tableLayoutPanel7.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel7.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel7.Size = new System.Drawing.Size(445, 184); this.tableLayoutPanel7.Size = new System.Drawing.Size(464, 41);
this.tableLayoutPanel7.TabIndex = 3; this.tableLayoutPanel7.TabIndex = 3;
// //
// groupBox4 // lblWarn
//
this.lblWarn.Dock = System.Windows.Forms.DockStyle.Fill;
this.lblWarn.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.lblWarn.ForeColor = System.Drawing.Color.Red;
this.lblWarn.Location = new System.Drawing.Point(2, 0);
this.lblWarn.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.lblWarn.Name = "lblWarn";
this.lblWarn.Size = new System.Drawing.Size(460, 41);
this.lblWarn.TabIndex = 41;
this.lblWarn.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// grpUnlock
//
this.grpUnlock.Controls.Add(this.tblLayoutUnlock);
this.grpUnlock.Dock = System.Windows.Forms.DockStyle.Fill;
this.grpUnlock.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.grpUnlock.Location = new System.Drawing.Point(3, 138);
this.grpUnlock.Name = "grpUnlock";
this.grpUnlock.Size = new System.Drawing.Size(462, 164);
this.grpUnlock.TabIndex = 4;
this.grpUnlock.TabStop = false;
this.grpUnlock.Text = "解绑信息";
//
// tblLayoutUnlock
//
this.tblLayoutUnlock.AutoSize = true;
this.tblLayoutUnlock.ColumnCount = 2;
this.tblLayoutUnlock.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tblLayoutUnlock.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tblLayoutUnlock.Controls.Add(this.dgvUnlockDetail, 1, 0);
this.tblLayoutUnlock.Controls.Add(this.dgvUnlockInfo, 0, 0);
this.tblLayoutUnlock.Dock = System.Windows.Forms.DockStyle.Fill;
this.tblLayoutUnlock.Location = new System.Drawing.Point(3, 19);
this.tblLayoutUnlock.Name = "tblLayoutUnlock";
this.tblLayoutUnlock.RowCount = 1;
this.tblLayoutUnlock.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tblLayoutUnlock.Size = new System.Drawing.Size(456, 142);
this.tblLayoutUnlock.TabIndex = 1;
//
// dgvUnlockDetail
//
this.dgvUnlockDetail.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.dgvUnlockDetail.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dgvUnlockDetail.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvUnlockDetail.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvUnlockDetail.Location = new System.Drawing.Point(231, 3);
this.dgvUnlockDetail.Name = "dgvUnlockDetail";
this.dgvUnlockDetail.ReadOnly = true;
this.dgvUnlockDetail.RowHeadersVisible = false;
this.dgvUnlockDetail.RowHeadersWidthSizeMode = System.Windows.Forms.DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
this.dgvUnlockDetail.RowTemplate.Height = 23;
this.dgvUnlockDetail.Size = new System.Drawing.Size(222, 136);
this.dgvUnlockDetail.TabIndex = 1;
//
// dgvUnlockInfo
//
this.dgvUnlockInfo.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.AllCells;
this.dgvUnlockInfo.AutoSizeRowsMode = System.Windows.Forms.DataGridViewAutoSizeRowsMode.AllCells;
this.dgvUnlockInfo.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dgvUnlockInfo.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvUnlockInfo.Location = new System.Drawing.Point(3, 3);
this.dgvUnlockInfo.Name = "dgvUnlockInfo";
this.dgvUnlockInfo.ReadOnly = true;
this.dgvUnlockInfo.RowHeadersVisible = false;
this.dgvUnlockInfo.RowTemplate.Height = 23;
this.dgvUnlockInfo.Size = new System.Drawing.Size(222, 136);
this.dgvUnlockInfo.TabIndex = 0;
// //
this.groupBox4.Controls.Add(this.dgvLineMission); // tabPage2
this.groupBox4.Dock = System.Windows.Forms.DockStyle.Fill; //
this.groupBox4.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.tabPage2.Controls.Add(this.tableLayoutPanel1);
this.groupBox4.Location = new System.Drawing.Point(2, 2); this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.groupBox4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tabPage2.Name = "tabPage2";
this.groupBox4.Name = "groupBox4"; this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.groupBox4.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tabPage2.Size = new System.Drawing.Size(1097, 336);
this.groupBox4.Size = new System.Drawing.Size(247, 180); this.tabPage2.TabIndex = 3;
this.groupBox4.TabIndex = 2; this.tabPage2.Text = "日志";
this.groupBox4.TabStop = false; this.tabPage2.UseVisualStyleBackColor = true;
this.groupBox4.Text = "产线解绑信息"; //
// // tableLayoutPanel1
// dgvLineMission //
// this.tableLayoutPanel1.ColumnCount = 2;
this.dgvLineMission.AllowUserToAddRows = false; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 181F));
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; this.tableLayoutPanel1.Controls.Add(this.groupBox8, 0, 0);
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.tableLayoutPanel1.Controls.Add(this.TxtLog, 0, 0);
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2);
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.dgvLineMission.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; this.tableLayoutPanel1.RowCount = 1;
this.dgvLineMission.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.dgvLineMission.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.tableLayoutPanel1.Size = new System.Drawing.Size(1091, 330);
this.Column24, this.tableLayoutPanel1.TabIndex = 6;
this.Column8});
dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.dgvLineMission.DefaultCellStyle = dataGridViewCellStyle2;
this.dgvLineMission.Dock = System.Windows.Forms.DockStyle.Fill;
this.dgvLineMission.Location = new System.Drawing.Point(2, 16);
this.dgvLineMission.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.dgvLineMission.Name = "dgvLineMission";
dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle3.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.dgvLineMission.RowHeadersDefaultCellStyle = dataGridViewCellStyle3;
this.dgvLineMission.RowHeadersVisible = false;
this.dgvLineMission.RowHeadersWidth = 51;
this.dgvLineMission.RowTemplate.Height = 27;
this.dgvLineMission.Size = new System.Drawing.Size(243, 162);
this.dgvLineMission.TabIndex = 28;
this.dgvLineMission.Click += new System.EventHandler(this.dgvLineMission_Click);
//
// Column24
//
this.Column24.HeaderText = "时间";
this.Column24.MinimumWidth = 6;
this.Column24.Name = "Column24";
this.Column24.Width = 150;
//
// Column8
//
this.Column8.HeaderText = "任务";
this.Column8.MinimumWidth = 6;
this.Column8.Name = "Column8";
this.Column8.Width = 150;
// //
// groupBox8 // groupBox8
// //
...@@ -495,12 +619,12 @@ ...@@ -495,12 +619,12 @@
this.groupBox8.Controls.Add(this.lblCharge3); this.groupBox8.Controls.Add(this.lblCharge3);
this.groupBox8.Dock = System.Windows.Forms.DockStyle.Fill; this.groupBox8.Dock = System.Windows.Forms.DockStyle.Fill;
this.groupBox8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.groupBox8.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox8.Location = new System.Drawing.Point(253, 2); this.groupBox8.Location = new System.Drawing.Point(912, 2);
this.groupBox8.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox8.Margin = new System.Windows.Forms.Padding(2);
this.groupBox8.Name = "groupBox8"; this.groupBox8.Name = "groupBox8";
this.groupBox8.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox8.Padding = new System.Windows.Forms.Padding(2);
this.groupBox8.Size = new System.Drawing.Size(190, 180); this.groupBox8.Size = new System.Drawing.Size(177, 326);
this.groupBox8.TabIndex = 3; this.groupBox8.TabIndex = 6;
this.groupBox8.TabStop = false; this.groupBox8.TabStop = false;
this.groupBox8.Text = "位置占用情况"; this.groupBox8.Text = "位置占用情况";
// //
...@@ -548,32 +672,6 @@ ...@@ -548,32 +672,6 @@
this.lblCharge3.TabIndex = 0; this.lblCharge3.TabIndex = 0;
this.lblCharge3.Text = "lblCharge3"; this.lblCharge3.Text = "lblCharge3";
// //
// tabPage2
//
this.tabPage2.Controls.Add(this.tableLayoutPanel1);
this.tabPage2.Location = new System.Drawing.Point(4, 22);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3);
this.tabPage2.Size = new System.Drawing.Size(1053, 297);
this.tabPage2.TabIndex = 3;
this.tabPage2.Text = "日志";
this.tabPage2.UseVisualStyleBackColor = true;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.ColumnCount = 1;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 15F));
this.tableLayoutPanel1.Controls.Add(this.TxtLog, 0, 0);
this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 3);
this.tableLayoutPanel1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 1;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(1047, 291);
this.tableLayoutPanel1.TabIndex = 6;
//
// TxtLog // TxtLog
// //
this.TxtLog.Dock = System.Windows.Forms.DockStyle.Fill; this.TxtLog.Dock = System.Windows.Forms.DockStyle.Fill;
...@@ -581,52 +679,98 @@ ...@@ -581,52 +679,98 @@
this.TxtLog.Multiline = true; this.TxtLog.Multiline = true;
this.TxtLog.Name = "TxtLog"; this.TxtLog.Name = "TxtLog";
this.TxtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both; this.TxtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.TxtLog.Size = new System.Drawing.Size(1041, 285); this.TxtLog.Size = new System.Drawing.Size(904, 324);
this.TxtLog.TabIndex = 5; this.TxtLog.TabIndex = 5;
// //
// tabPage3 // tabPage3
// //
this.tabPage3.Controls.Add(this.groupBox7); this.tabPage3.Controls.Add(this.label12);
this.tabPage3.Controls.Add(this.groupBox4);
this.tabPage3.Controls.Add(this.groupBox6); this.tabPage3.Controls.Add(this.groupBox6);
this.tabPage3.Controls.Add(this.groupBox2); this.tabPage3.Controls.Add(this.groupBox2);
this.tabPage3.Controls.Add(this.BtnMissionAdd); this.tabPage3.Controls.Add(this.BtnMissionAdd);
this.tabPage3.Controls.Add(this.LstAgvPlace); this.tabPage3.Controls.Add(this.LstAgvPlace);
this.tabPage3.Location = new System.Drawing.Point(4, 22); this.tabPage3.Location = new System.Drawing.Point(4, 22);
this.tabPage3.Name = "tabPage3"; this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3, 3, 3, 3); this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(1053, 297); this.tabPage3.Size = new System.Drawing.Size(1097, 336);
this.tabPage3.TabIndex = 2; this.tabPage3.TabIndex = 2;
this.tabPage3.Text = "手动"; this.tabPage3.Text = "手动";
this.tabPage3.UseVisualStyleBackColor = true; this.tabPage3.UseVisualStyleBackColor = true;
// //
// groupBox7 // groupBox4
// //
this.groupBox7.Controls.Add(this.txtBoxLineName); this.groupBox4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(224)))), ((int)(((byte)(224)))));
this.groupBox7.Controls.Add(this.label8); this.groupBox4.Controls.Add(this.agvRemoveRfid);
this.groupBox7.Controls.Add(this.label7); this.groupBox4.Controls.Add(this.btnClearStationRFID);
this.groupBox7.Controls.Add(this.btnUpdateStatus); this.groupBox4.Controls.Add(this.label11);
this.groupBox7.Controls.Add(this.txtBoxRFID); this.groupBox4.Controls.Add(this.txtBoxLineName);
this.groupBox7.Location = new System.Drawing.Point(518, 24); this.groupBox4.Controls.Add(this.btnUpdateStatus);
this.groupBox7.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox4.Controls.Add(this.btnGetStationRfid);
this.groupBox7.Name = "groupBox7"; this.groupBox4.Controls.Add(this.label8);
this.groupBox7.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox4.Controls.Add(this.label7);
this.groupBox7.Size = new System.Drawing.Size(153, 121); this.groupBox4.Controls.Add(this.txtBoxRFID);
this.groupBox7.TabIndex = 36; this.groupBox4.Location = new System.Drawing.Point(800, 24);
this.groupBox7.TabStop = false; this.groupBox4.Name = "groupBox4";
this.groupBox7.Text = "物料状态上报"; this.groupBox4.Size = new System.Drawing.Size(291, 262);
this.groupBox4.TabIndex = 38;
this.groupBox4.TabStop = false;
this.groupBox4.Text = "操作";
//
// btnClearStationRFID
//
this.btnClearStationRFID.Location = new System.Drawing.Point(8, 142);
this.btnClearStationRFID.Margin = new System.Windows.Forms.Padding(2);
this.btnClearStationRFID.Name = "btnClearStationRFID";
this.btnClearStationRFID.Size = new System.Drawing.Size(125, 35);
this.btnClearStationRFID.TabIndex = 46;
this.btnClearStationRFID.Text = "清除接驳台RFID";
this.btnClearStationRFID.UseVisualStyleBackColor = true;
this.btnClearStationRFID.Click += new System.EventHandler(this.btnClearStationRFID_Click);
//
// label11
//
this.label11.AutoSize = true;
this.label11.Location = new System.Drawing.Point(4, 200);
this.label11.Name = "label11";
this.label11.Size = new System.Drawing.Size(29, 12);
this.label11.TabIndex = 45;
this.label11.Text = "null";
// //
// txtBoxLineName // txtBoxLineName
// //
this.txtBoxLineName.Location = new System.Drawing.Point(60, 50); this.txtBoxLineName.Location = new System.Drawing.Point(111, 54);
this.txtBoxLineName.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.txtBoxLineName.Margin = new System.Windows.Forms.Padding(2);
this.txtBoxLineName.Name = "txtBoxLineName"; this.txtBoxLineName.Name = "txtBoxLineName";
this.txtBoxLineName.Size = new System.Drawing.Size(77, 21); this.txtBoxLineName.Size = new System.Drawing.Size(111, 21);
this.txtBoxLineName.TabIndex = 44; this.txtBoxLineName.TabIndex = 44;
// //
// btnUpdateStatus
//
this.btnUpdateStatus.Location = new System.Drawing.Point(147, 91);
this.btnUpdateStatus.Margin = new System.Windows.Forms.Padding(2);
this.btnUpdateStatus.Name = "btnUpdateStatus";
this.btnUpdateStatus.Size = new System.Drawing.Size(125, 35);
this.btnUpdateStatus.TabIndex = 41;
this.btnUpdateStatus.Text = "物料状态上报";
this.btnUpdateStatus.UseVisualStyleBackColor = true;
this.btnUpdateStatus.Click += new System.EventHandler(this.btnUpdateStatus_Click);
//
// btnGetStationRfid
//
this.btnGetStationRfid.Location = new System.Drawing.Point(8, 91);
this.btnGetStationRfid.Margin = new System.Windows.Forms.Padding(2);
this.btnGetStationRfid.Name = "btnGetStationRfid";
this.btnGetStationRfid.Size = new System.Drawing.Size(125, 35);
this.btnGetStationRfid.TabIndex = 41;
this.btnGetStationRfid.Text = "获取接驳台RFID";
this.btnGetStationRfid.UseVisualStyleBackColor = true;
this.btnGetStationRfid.Click += new System.EventHandler(this.btnGetStationRfid_Click);
//
// label8 // label8
// //
this.label8.AutoSize = true; this.label8.AutoSize = true;
this.label8.Location = new System.Drawing.Point(4, 58); this.label8.Location = new System.Drawing.Point(60, 63);
this.label8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label8.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label8.Name = "label8"; this.label8.Name = "label8";
this.label8.Size = new System.Drawing.Size(47, 12); this.label8.Size = new System.Drawing.Size(47, 12);
...@@ -636,52 +780,71 @@ ...@@ -636,52 +780,71 @@
// label7 // label7
// //
this.label7.AutoSize = true; this.label7.AutoSize = true;
this.label7.Location = new System.Drawing.Point(4, 24); this.label7.Location = new System.Drawing.Point(62, 31);
this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label7.Name = "label7"; this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(35, 12); this.label7.Size = new System.Drawing.Size(35, 12);
this.label7.TabIndex = 42; this.label7.TabIndex = 42;
this.label7.Text = "RFID:"; this.label7.Text = "RFID:";
// //
// btnUpdateStatus
//
this.btnUpdateStatus.Location = new System.Drawing.Point(37, 78);
this.btnUpdateStatus.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2);
this.btnUpdateStatus.Name = "btnUpdateStatus";
this.btnUpdateStatus.Size = new System.Drawing.Size(75, 39);
this.btnUpdateStatus.TabIndex = 41;
this.btnUpdateStatus.Text = "上报";
this.btnUpdateStatus.UseVisualStyleBackColor = true;
this.btnUpdateStatus.Click += new System.EventHandler(this.btnUpdateStatus_Click);
//
// txtBoxRFID // txtBoxRFID
// //
this.txtBoxRFID.Location = new System.Drawing.Point(60, 19); this.txtBoxRFID.Location = new System.Drawing.Point(111, 23);
this.txtBoxRFID.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.txtBoxRFID.Margin = new System.Windows.Forms.Padding(2);
this.txtBoxRFID.Name = "txtBoxRFID"; this.txtBoxRFID.Name = "txtBoxRFID";
this.txtBoxRFID.Size = new System.Drawing.Size(77, 21); this.txtBoxRFID.Size = new System.Drawing.Size(111, 21);
this.txtBoxRFID.TabIndex = 0; this.txtBoxRFID.TabIndex = 0;
// //
// groupBox6 // groupBox6
// //
this.groupBox6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
this.groupBox6.Controls.Add(this.label10);
this.groupBox6.Controls.Add(this.label9);
this.groupBox6.Controls.Add(this.txtRfid);
this.groupBox6.Controls.Add(this.btnDeleteMission); this.groupBox6.Controls.Add(this.btnDeleteMission);
this.groupBox6.Controls.Add(this.btnAddMission); this.groupBox6.Controls.Add(this.btnAddMission);
this.groupBox6.Controls.Add(this.cmbBoxLineName); this.groupBox6.Controls.Add(this.cmbBoxLineName);
this.groupBox6.Location = new System.Drawing.Point(297, 21); this.groupBox6.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.groupBox6.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox6.Location = new System.Drawing.Point(320, 21);
this.groupBox6.Margin = new System.Windows.Forms.Padding(2);
this.groupBox6.Name = "groupBox6"; this.groupBox6.Name = "groupBox6";
this.groupBox6.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox6.Padding = new System.Windows.Forms.Padding(2);
this.groupBox6.Size = new System.Drawing.Size(191, 124); this.groupBox6.Size = new System.Drawing.Size(247, 180);
this.groupBox6.TabIndex = 35; this.groupBox6.TabIndex = 37;
this.groupBox6.TabStop = false; this.groupBox6.TabStop = false;
this.groupBox6.Text = "产线绑定"; this.groupBox6.Text = "产线手动绑定";
//
// label10
//
this.label10.AutoSize = true;
this.label10.Location = new System.Drawing.Point(14, 61);
this.label10.Name = "label10";
this.label10.Size = new System.Drawing.Size(41, 12);
this.label10.TabIndex = 44;
this.label10.Text = "RFID:";
//
// label9
//
this.label9.AutoSize = true;
this.label9.Location = new System.Drawing.Point(14, 26);
this.label9.Name = "label9";
this.label9.Size = new System.Drawing.Size(41, 12);
this.label9.TabIndex = 43;
this.label9.Text = "产线:";
//
// txtRfid
//
this.txtRfid.Location = new System.Drawing.Point(79, 52);
this.txtRfid.Name = "txtRfid";
this.txtRfid.Size = new System.Drawing.Size(137, 21);
this.txtRfid.TabIndex = 42;
// //
// btnDeleteMission // btnDeleteMission
// //
this.btnDeleteMission.Location = new System.Drawing.Point(92, 50); this.btnDeleteMission.Location = new System.Drawing.Point(129, 105);
this.btnDeleteMission.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.btnDeleteMission.Margin = new System.Windows.Forms.Padding(2);
this.btnDeleteMission.Name = "btnDeleteMission"; this.btnDeleteMission.Name = "btnDeleteMission";
this.btnDeleteMission.Size = new System.Drawing.Size(75, 52); this.btnDeleteMission.Size = new System.Drawing.Size(104, 52);
this.btnDeleteMission.TabIndex = 41; this.btnDeleteMission.TabIndex = 41;
this.btnDeleteMission.Text = "删除绑定任务"; this.btnDeleteMission.Text = "删除绑定任务";
this.btnDeleteMission.UseVisualStyleBackColor = true; this.btnDeleteMission.UseVisualStyleBackColor = true;
...@@ -689,10 +852,10 @@ ...@@ -689,10 +852,10 @@
// //
// btnAddMission // btnAddMission
// //
this.btnAddMission.Location = new System.Drawing.Point(4, 50); this.btnAddMission.Location = new System.Drawing.Point(4, 105);
this.btnAddMission.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.btnAddMission.Margin = new System.Windows.Forms.Padding(2);
this.btnAddMission.Name = "btnAddMission"; this.btnAddMission.Name = "btnAddMission";
this.btnAddMission.Size = new System.Drawing.Size(75, 52); this.btnAddMission.Size = new System.Drawing.Size(93, 52);
this.btnAddMission.TabIndex = 40; this.btnAddMission.TabIndex = 40;
this.btnAddMission.Text = "添加绑定任务"; this.btnAddMission.Text = "添加绑定任务";
this.btnAddMission.UseVisualStyleBackColor = true; this.btnAddMission.UseVisualStyleBackColor = true;
...@@ -701,31 +864,32 @@ ...@@ -701,31 +864,32 @@
// cmbBoxLineName // cmbBoxLineName
// //
this.cmbBoxLineName.FormattingEnabled = true; this.cmbBoxLineName.FormattingEnabled = true;
this.cmbBoxLineName.Location = new System.Drawing.Point(4, 18); this.cmbBoxLineName.Location = new System.Drawing.Point(79, 18);
this.cmbBoxLineName.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.cmbBoxLineName.Margin = new System.Windows.Forms.Padding(2);
this.cmbBoxLineName.Name = "cmbBoxLineName"; this.cmbBoxLineName.Name = "cmbBoxLineName";
this.cmbBoxLineName.Size = new System.Drawing.Size(137, 20); this.cmbBoxLineName.Size = new System.Drawing.Size(137, 20);
this.cmbBoxLineName.TabIndex = 39; this.cmbBoxLineName.TabIndex = 39;
// //
// groupBox2 // groupBox2
// //
this.groupBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(128)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
this.groupBox2.Controls.Add(this.btnReSendTask); this.groupBox2.Controls.Add(this.btnReSendTask);
this.groupBox2.Controls.Add(this.BtnClearError); this.groupBox2.Controls.Add(this.BtnClearError);
this.groupBox2.Controls.Add(this.BtnMissionReady); this.groupBox2.Controls.Add(this.BtnMissionReady);
this.groupBox2.Controls.Add(this.BtnMissionPause); this.groupBox2.Controls.Add(this.BtnMissionPause);
this.groupBox2.Location = new System.Drawing.Point(701, 24); this.groupBox2.Location = new System.Drawing.Point(583, 24);
this.groupBox2.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox2.Margin = new System.Windows.Forms.Padding(2);
this.groupBox2.Name = "groupBox2"; this.groupBox2.Name = "groupBox2";
this.groupBox2.Padding = new System.Windows.Forms.Padding(2, 2, 2, 2); this.groupBox2.Padding = new System.Windows.Forms.Padding(2);
this.groupBox2.Size = new System.Drawing.Size(262, 177); this.groupBox2.Size = new System.Drawing.Size(193, 177);
this.groupBox2.TabIndex = 32; this.groupBox2.TabIndex = 32;
this.groupBox2.TabStop = false; this.groupBox2.TabStop = false;
this.groupBox2.Text = "操作"; this.groupBox2.Text = "小车操作";
// //
// btnReSendTask // btnReSendTask
// //
this.btnReSendTask.Location = new System.Drawing.Point(152, 102); this.btnReSendTask.Location = new System.Drawing.Point(96, 102);
this.btnReSendTask.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.btnReSendTask.Margin = new System.Windows.Forms.Padding(2);
this.btnReSendTask.Name = "btnReSendTask"; this.btnReSendTask.Name = "btnReSendTask";
this.btnReSendTask.Size = new System.Drawing.Size(75, 52); this.btnReSendTask.Size = new System.Drawing.Size(75, 52);
this.btnReSendTask.TabIndex = 45; this.btnReSendTask.TabIndex = 45;
...@@ -735,7 +899,7 @@ ...@@ -735,7 +899,7 @@
// //
// BtnClearError // BtnClearError
// //
this.BtnClearError.Location = new System.Drawing.Point(35, 102); this.BtnClearError.Location = new System.Drawing.Point(5, 102);
this.BtnClearError.Name = "BtnClearError"; this.BtnClearError.Name = "BtnClearError";
this.BtnClearError.Size = new System.Drawing.Size(75, 52); this.BtnClearError.Size = new System.Drawing.Size(75, 52);
this.BtnClearError.TabIndex = 19; this.BtnClearError.TabIndex = 19;
...@@ -745,7 +909,7 @@ ...@@ -745,7 +909,7 @@
// //
// BtnMissionReady // BtnMissionReady
// //
this.BtnMissionReady.Location = new System.Drawing.Point(35, 19); this.BtnMissionReady.Location = new System.Drawing.Point(5, 23);
this.BtnMissionReady.Name = "BtnMissionReady"; this.BtnMissionReady.Name = "BtnMissionReady";
this.BtnMissionReady.Size = new System.Drawing.Size(75, 52); this.BtnMissionReady.Size = new System.Drawing.Size(75, 52);
this.BtnMissionReady.TabIndex = 1; this.BtnMissionReady.TabIndex = 1;
...@@ -755,7 +919,7 @@ ...@@ -755,7 +919,7 @@
// //
// BtnMissionPause // BtnMissionPause
// //
this.BtnMissionPause.Location = new System.Drawing.Point(152, 15); this.BtnMissionPause.Location = new System.Drawing.Point(96, 23);
this.BtnMissionPause.Name = "BtnMissionPause"; this.BtnMissionPause.Name = "BtnMissionPause";
this.BtnMissionPause.Size = new System.Drawing.Size(75, 52); this.BtnMissionPause.Size = new System.Drawing.Size(75, 52);
this.BtnMissionPause.TabIndex = 2; this.BtnMissionPause.TabIndex = 2;
...@@ -781,7 +945,7 @@ ...@@ -781,7 +945,7 @@
this.LstAgvPlace.ItemHeight = 12; this.LstAgvPlace.ItemHeight = 12;
this.LstAgvPlace.Location = new System.Drawing.Point(3, 3); this.LstAgvPlace.Location = new System.Drawing.Point(3, 3);
this.LstAgvPlace.Name = "LstAgvPlace"; this.LstAgvPlace.Name = "LstAgvPlace";
this.LstAgvPlace.Size = new System.Drawing.Size(150, 291); this.LstAgvPlace.Size = new System.Drawing.Size(150, 330);
this.LstAgvPlace.TabIndex = 0; this.LstAgvPlace.TabIndex = 0;
// //
// tableLayoutPanel4 // tableLayoutPanel4
...@@ -790,13 +954,13 @@ ...@@ -790,13 +954,13 @@
this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel4.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.Controls.Add(this.tableLayoutPanel6, 0, 0); this.tableLayoutPanel4.Controls.Add(this.tableLayoutPanel6, 0, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel4.Location = new System.Drawing.Point(2, 133); this.tableLayoutPanel4.Location = new System.Drawing.Point(2, 149);
this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tableLayoutPanel4.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel4.Name = "tableLayoutPanel4"; this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 1; this.tableLayoutPanel4.RowCount = 1;
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 169F)); this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 169F));
this.tableLayoutPanel4.Size = new System.Drawing.Size(1063, 192); this.tableLayoutPanel4.Size = new System.Drawing.Size(1107, 216);
this.tableLayoutPanel4.TabIndex = 8; this.tableLayoutPanel4.TabIndex = 8;
// //
// tableLayoutPanel6 // tableLayoutPanel6
...@@ -815,12 +979,12 @@ ...@@ -815,12 +979,12 @@
this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel6.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel6.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.tableLayoutPanel6.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tableLayoutPanel6.Location = new System.Drawing.Point(2, 2); this.tableLayoutPanel6.Location = new System.Drawing.Point(2, 2);
this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.tableLayoutPanel6.Margin = new System.Windows.Forms.Padding(2);
this.tableLayoutPanel6.Name = "tableLayoutPanel6"; this.tableLayoutPanel6.Name = "tableLayoutPanel6";
this.tableLayoutPanel6.RowCount = 2; this.tableLayoutPanel6.RowCount = 2;
this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel6.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel6.Size = new System.Drawing.Size(1059, 188); this.tableLayoutPanel6.Size = new System.Drawing.Size(1103, 212);
this.tableLayoutPanel6.TabIndex = 0; this.tableLayoutPanel6.TabIndex = 0;
// //
// label6 // label6
...@@ -828,10 +992,10 @@ ...@@ -828,10 +992,10 @@
this.label6.AutoSize = true; this.label6.AutoSize = true;
this.label6.Dock = System.Windows.Forms.DockStyle.Fill; this.label6.Dock = System.Windows.Forms.DockStyle.Fill;
this.label6.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label6.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label6.Location = new System.Drawing.Point(708, 95); this.label6.Location = new System.Drawing.Point(737, 107);
this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(346, 90); this.label6.Size = new System.Drawing.Size(361, 102);
this.label6.TabIndex = 5; this.label6.TabIndex = 5;
this.label6.Text = "label6"; this.label6.Text = "label6";
// //
...@@ -840,10 +1004,10 @@ ...@@ -840,10 +1004,10 @@
this.label5.AutoSize = true; this.label5.AutoSize = true;
this.label5.Dock = System.Windows.Forms.DockStyle.Fill; this.label5.Dock = System.Windows.Forms.DockStyle.Fill;
this.label5.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label5.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label5.Location = new System.Drawing.Point(356, 95); this.label5.Location = new System.Drawing.Point(371, 107);
this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label5.Name = "label5"; this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(345, 90); this.label5.Size = new System.Drawing.Size(359, 102);
this.label5.TabIndex = 4; this.label5.TabIndex = 4;
this.label5.Text = "label5"; this.label5.Text = "label5";
// //
...@@ -852,10 +1016,10 @@ ...@@ -852,10 +1016,10 @@
this.label4.AutoSize = true; this.label4.AutoSize = true;
this.label4.Dock = System.Windows.Forms.DockStyle.Fill; this.label4.Dock = System.Windows.Forms.DockStyle.Fill;
this.label4.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label4.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label4.Location = new System.Drawing.Point(5, 95); this.label4.Location = new System.Drawing.Point(5, 107);
this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label4.Name = "label4"; this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(344, 90); this.label4.Size = new System.Drawing.Size(359, 102);
this.label4.TabIndex = 3; this.label4.TabIndex = 3;
this.label4.Text = "label4"; this.label4.Text = "label4";
// //
...@@ -864,10 +1028,10 @@ ...@@ -864,10 +1028,10 @@
this.label3.AutoSize = true; this.label3.AutoSize = true;
this.label3.Dock = System.Windows.Forms.DockStyle.Fill; this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label3.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label3.Location = new System.Drawing.Point(708, 3); this.label3.Location = new System.Drawing.Point(737, 3);
this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label3.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label3.Name = "label3"; this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(346, 89); this.label3.Size = new System.Drawing.Size(361, 101);
this.label3.TabIndex = 2; this.label3.TabIndex = 2;
this.label3.Text = "label3"; this.label3.Text = "label3";
// //
...@@ -876,10 +1040,10 @@ ...@@ -876,10 +1040,10 @@
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.Dock = System.Windows.Forms.DockStyle.Fill; this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label2.Font = new System.Drawing.Font("宋体", 10.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.label2.Location = new System.Drawing.Point(356, 3); this.label2.Location = new System.Drawing.Point(371, 3);
this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label2.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(345, 89); this.label2.Size = new System.Drawing.Size(359, 101);
this.label2.TabIndex = 1; this.label2.TabIndex = 1;
this.label2.Text = "label2"; this.label2.Text = "label2";
// //
...@@ -891,102 +1055,37 @@ ...@@ -891,102 +1055,37 @@
this.label1.Location = new System.Drawing.Point(5, 3); this.label1.Location = new System.Drawing.Point(5, 3);
this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.label1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(344, 89); this.label1.Size = new System.Drawing.Size(359, 101);
this.label1.TabIndex = 0; this.label1.TabIndex = 0;
this.label1.Text = "label1"; this.label1.Text = "label1";
// //
// Column1 // agvRemoveRfid
//
this.Column1.HeaderText = "名称";
this.Column1.MinimumWidth = 6;
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column2
//
this.Column2.HeaderText = "IP";
this.Column2.MinimumWidth = 6;
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column4
// //
this.Column4.HeaderText = "小车状态"; this.agvRemoveRfid.Location = new System.Drawing.Point(147, 142);
this.Column4.MinimumWidth = 6; this.agvRemoveRfid.Margin = new System.Windows.Forms.Padding(2);
this.Column4.Name = "Column4"; this.agvRemoveRfid.Name = "agvRemoveRfid";
this.Column4.ReadOnly = true; this.agvRemoveRfid.Size = new System.Drawing.Size(125, 35);
this.Column4.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; this.agvRemoveRfid.TabIndex = 47;
this.agvRemoveRfid.Text = "清理料架的缓存信息";
this.agvRemoveRfid.UseVisualStyleBackColor = true;
this.agvRemoveRfid.Click += new System.EventHandler(this.agvRemoveRfid_Click);
// //
// Column14 // label12
// //
this.Column14.HeaderText = "任务ID"; this.label12.AutoSize = true;
this.Column14.MinimumWidth = 6; this.label12.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(224)))), ((int)(((byte)(192)))));
this.Column14.Name = "Column14"; this.label12.Location = new System.Drawing.Point(302, 224);
this.Column14.ReadOnly = true; this.label12.Name = "label12";
this.Column14.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable; this.label12.Size = new System.Drawing.Size(407, 60);
// this.label12.TabIndex = 46;
// Column21 this.label12.Text = "说明:\r\n1、获取接驳台RFID:获取指定产线上的料架RFID信息\r\n2、物料状态上报:上报料车的产线信息\r\n3、清除接驳台RFID:清理指定产线的RFID信息\r" +
// "\n4、清理料架的缓存信息:输入RFID,清除RFID的缓存信息,使料架可以复用\r\n";
this.Column21.HeaderText = "任务名称";
this.Column21.MinimumWidth = 6;
this.Column21.Name = "Column21";
this.Column21.ReadOnly = true;
this.Column21.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column3
//
this.Column3.HeaderText = "任务状态";
this.Column3.MinimumWidth = 6;
this.Column3.Name = "Column3";
this.Column3.ReadOnly = true;
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column18
//
this.Column18.HeaderText = "目的地";
this.Column18.MinimumWidth = 6;
this.Column18.Name = "Column18";
this.Column18.ReadOnly = true;
this.Column18.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column23
//
this.Column23.HeaderText = "负载";
this.Column23.MinimumWidth = 6;
this.Column23.Name = "Column23";
this.Column23.ReadOnly = true;
this.Column23.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column13
//
this.Column13.HeaderText = "连接";
this.Column13.MinimumWidth = 6;
this.Column13.Name = "Column13";
this.Column13.ReadOnly = true;
this.Column13.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column19
//
this.Column19.HeaderText = "电量";
this.Column19.MinimumWidth = 6;
this.Column19.Name = "Column19";
this.Column19.ReadOnly = true;
this.Column19.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column11
//
this.Column11.HeaderText = "自动";
this.Column11.MinimumWidth = 6;
this.Column11.Name = "Column11";
this.Column11.ReadOnly = true;
// //
// FrmMain // FrmMain
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(1067, 656); this.ClientSize = new System.Drawing.Size(1111, 735);
this.Controls.Add(this.tableLayoutPanel3); this.Controls.Add(this.tableLayoutPanel3);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmMain"; this.Name = "FrmMain";
...@@ -1005,17 +1104,22 @@ ...@@ -1005,17 +1104,22 @@
this.groupBox5.ResumeLayout(false); this.groupBox5.ResumeLayout(false);
this.groupBox3.ResumeLayout(false); this.groupBox3.ResumeLayout(false);
this.tableLayoutPanel7.ResumeLayout(false); this.tableLayoutPanel7.ResumeLayout(false);
this.groupBox4.ResumeLayout(false); this.grpUnlock.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.dgvLineMission)).EndInit(); this.grpUnlock.PerformLayout();
this.groupBox8.ResumeLayout(false); this.tblLayoutUnlock.ResumeLayout(false);
this.groupBox8.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.dgvUnlockDetail)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.dgvUnlockInfo)).EndInit();
this.tabPage2.ResumeLayout(false); this.tabPage2.ResumeLayout(false);
this.tableLayoutPanel1.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel1.PerformLayout(); this.tableLayoutPanel1.PerformLayout();
this.groupBox8.ResumeLayout(false);
this.groupBox8.PerformLayout();
this.tabPage3.ResumeLayout(false); this.tabPage3.ResumeLayout(false);
this.groupBox7.ResumeLayout(false); this.tabPage3.PerformLayout();
this.groupBox7.PerformLayout(); this.groupBox4.ResumeLayout(false);
this.groupBox4.PerformLayout();
this.groupBox6.ResumeLayout(false); this.groupBox6.ResumeLayout(false);
this.groupBox6.PerformLayout();
this.groupBox2.ResumeLayout(false); this.groupBox2.ResumeLayout(false);
this.tableLayoutPanel4.ResumeLayout(false); this.tableLayoutPanel4.ResumeLayout(false);
this.tableLayoutPanel6.ResumeLayout(false); this.tableLayoutPanel6.ResumeLayout(false);
...@@ -1063,23 +1167,9 @@ ...@@ -1063,23 +1167,9 @@
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5;
private System.Windows.Forms.GroupBox groupBox5; private System.Windows.Forms.GroupBox groupBox5;
private System.Windows.Forms.Label lblDestInfo; private System.Windows.Forms.Label lblDestInfo;
private System.Windows.Forms.GroupBox groupBox6;
private System.Windows.Forms.Button btnDeleteMission;
private System.Windows.Forms.Button btnAddMission;
private System.Windows.Forms.ComboBox cmbBoxLineName;
private System.Windows.Forms.GroupBox groupBox7;
private System.Windows.Forms.Button btnUpdateStatus; private System.Windows.Forms.Button btnUpdateStatus;
private System.Windows.Forms.TextBox txtBoxRFID; private System.Windows.Forms.TextBox txtBoxRFID;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel7; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel7;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.DataGridView dgvLineMission;
private System.Windows.Forms.DataGridViewTextBoxColumn Column24;
private System.Windows.Forms.DataGridViewTextBoxColumn Column8;
private System.Windows.Forms.GroupBox groupBox8;
private System.Windows.Forms.Label lblCharge4;
private System.Windows.Forms.Label lblCharge3;
private System.Windows.Forms.Label lblStandy2;
private System.Windows.Forms.Label lblStandy1;
private System.Windows.Forms.TextBox txtBoxLineName; private System.Windows.Forms.TextBox txtBoxLineName;
private System.Windows.Forms.Label label8; private System.Windows.Forms.Label label8;
private System.Windows.Forms.Label label7; private System.Windows.Forms.Label label7;
...@@ -1095,6 +1185,30 @@ ...@@ -1095,6 +1185,30 @@
private System.Windows.Forms.DataGridViewTextBoxColumn Column13; private System.Windows.Forms.DataGridViewTextBoxColumn Column13;
private System.Windows.Forms.DataGridViewTextBoxColumn Column19; private System.Windows.Forms.DataGridViewTextBoxColumn Column19;
private System.Windows.Forms.DataGridViewButtonColumn Column11; private System.Windows.Forms.DataGridViewButtonColumn Column11;
private System.Windows.Forms.GroupBox groupBox6;
private System.Windows.Forms.Label label10;
private System.Windows.Forms.Label label9;
private System.Windows.Forms.TextBox txtRfid;
private System.Windows.Forms.Button btnDeleteMission;
private System.Windows.Forms.Button btnAddMission;
private System.Windows.Forms.ComboBox cmbBoxLineName;
private System.Windows.Forms.GroupBox groupBox8;
private System.Windows.Forms.Label lblStandy2;
private System.Windows.Forms.Label lblStandy1;
private System.Windows.Forms.Label lblCharge4;
private System.Windows.Forms.Label lblCharge3;
private System.Windows.Forms.Label lblWarn;
private System.Windows.Forms.GroupBox grpUnlock;
private System.Windows.Forms.DataGridView dgvUnlockInfo;
private System.Windows.Forms.TableLayoutPanel tblLayoutUnlock;
private System.Windows.Forms.DataGridView dgvUnlockDetail;
private System.Windows.Forms.GroupBox groupBox4;
private System.Windows.Forms.Button btnGetStationRfid;
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private System.Windows.Forms.Label label11;
private System.Windows.Forms.Button btnClearStationRFID;
private System.Windows.Forms.Button agvRemoveRfid;
private System.Windows.Forms.Label label12;
} }
} }
...@@ -5,6 +5,7 @@ using System.Collections.Generic; ...@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
using System.Drawing; using System.Drawing;
using System.IO;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading; using System.Threading;
...@@ -61,7 +62,7 @@ namespace AGVControl ...@@ -61,7 +62,7 @@ namespace AGVControl
cmbBoxLineName.Items.Add("产线名称"); cmbBoxLineName.Items.Add("产线名称");
foreach (var item in Common.nodeInfo) foreach (var item in Common.nodeInfo)
{ {
if (item.Name.StartsWith("A")) if (item.Name.StartsWith("A") || item.Name.Equals(SettingString.D4FeederIn) || item.Name.Equals(SettingString.C4FeederIn))
continue; continue;
cmbBoxLineName.Items.Add(item.AliceName); cmbBoxLineName.Items.Add(item.AliceName);
} }
...@@ -115,10 +116,6 @@ namespace AGVControl ...@@ -115,10 +116,6 @@ namespace AGVControl
})); }));
System.GC.Collect(); System.GC.Collect();
} }
private void MissionManager_MissionChanged()
{
ShowEmptyTask();
}
private void Control_AgvOnline(int agvIndex) private void Control_AgvOnline(int agvIndex)
{ {
Invoke(new Action(() => { DgvAgv.Rows[agvIndex].DefaultCellStyle.ForeColor = Common.agvInfo[agvIndex].IsCon ? Color.Black : Color.Red; })); Invoke(new Action(() => { DgvAgv.Rows[agvIndex].DefaultCellStyle.ForeColor = Common.agvInfo[agvIndex].IsCon ? Color.Black : Color.Red; }));
...@@ -176,14 +173,59 @@ namespace AGVControl ...@@ -176,14 +173,59 @@ namespace AGVControl
Common.control.AgvChanged += Control_AgvChanged; Common.control.AgvChanged += Control_AgvChanged;
Common.control.AgvOnline += Control_AgvOnline; Common.control.AgvOnline += Control_AgvOnline;
Common.server.NodeChanged += Server_NodeChanged; Common.server.NodeChanged += Server_NodeChanged;
Common.control.NodeChangedEvent += Server_NodeChanged;
Common.server.NodeOnline += Server_NodeOnline; Common.server.NodeOnline += Server_NodeOnline;
ReadUnlockLineInfo();
}
void ReadUnlockLineInfo()
{
if (!System.IO.File.Exists(Common.CONFIG_PATH + "UnlockInfo.json"))
{
File.Create(Common.CONFIG_PATH + "UnlockInfo.json");
Common.missionManager = new UnlockMissionManager(Common.nodeInfo);
Common.missionManager.MissionChanged += MissionManager_MissionChanged;
return;
}
string s = File.ReadAllText(Common.CONFIG_PATH + "UnlockInfo.json");
Common.missionManager = JsonHelper.DeserializeJsonToObject<UnlockMissionManager>(s);
if (Common.missionManager == null)
Common.missionManager = new UnlockMissionManager(Common.nodeInfo);
Common.missionManager.MissionChanged += MissionManager_MissionChanged; Common.missionManager.MissionChanged += MissionManager_MissionChanged;
//foreach (var item in Common.agvInfo) Common.missionManager.Init();
//{ }
// cmbBoxAGVName.Items.Add(item.Name); private void MissionManager_MissionChanged(Dictionary<string, UnlockInfo> pairs)
//} {
//cmbBoxAGVName.Items.Add("None"); BindingSource bs = new BindingSource();
//cmbBoxAGVName.SelectedIndex = Common.agvInfo.Count; BindingSource bs2 = new BindingSource();
try
{
dgvUnlockInfo.BeginInvoke(new MethodInvoker(delegate
{
foreach (var item in pairs.Values)
{
if (item.Count > 0)
{
bs.Add(item);
foreach (var item1 in item.UnlockRfids)
{
bs2.Add(item1);
}
}
}
dgvUnlockInfo.DataSource = bs; //赋值控件自动更新
dgvUnlockDetail.DataSource = bs2;
}));
this.Invoke(new Action(() =>
{
//grpUnlock.Text = "解绑总数:"+count;
}
));
}
catch (Exception e)
{
Common.log.Error("ShowUnlockInfo", e);
}
} }
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
...@@ -236,7 +278,8 @@ namespace AGVControl ...@@ -236,7 +278,8 @@ namespace AGVControl
Common.LogInfo(string.Format("手动开启小车自动模式,并清除上一次的自动模式的运行信息{0} {1}", Common.agvInfo[e.RowIndex].Name, Common.agvInfo[e.RowIndex].RunInfo())); Common.LogInfo(string.Format("手动开启小车自动模式,并清除上一次的自动模式的运行信息{0} {1}", Common.agvInfo[e.RowIndex].Name, Common.agvInfo[e.RowIndex].RunInfo()));
//Common.agvInfo[e.RowIndex].CurJob = null; //Common.agvInfo[e.RowIndex].CurJob = null;
Common.agvInfo[e.RowIndex].RFID = ""; Common.agvInfo[e.RowIndex].RFID = "";
// Common.agvInfo[e.RowIndex].Place = ""; if (Common.agvInfo[e.RowIndex].Place.Equals(SettingString.AutoCharge) || Common.agvInfo[e.RowIndex].Place.Equals(SettingString.Standby))
Common.agvInfo[e.RowIndex].Place = "";
Common.agvInfo[e.RowIndex].IsUse = true; Common.agvInfo[e.RowIndex].IsUse = true;
// } // }
//else //else
...@@ -269,23 +312,10 @@ namespace AGVControl ...@@ -269,23 +312,10 @@ namespace AGVControl
else if (e.ColumnIndex == 8) //清除缓存 else if (e.ColumnIndex == 8) //清除缓存
{ {
//清除节点缓存 //清除节点缓存
Common.LogInfo(string.Format("手动清除缓存,{0} {1}", Common.nodeInfo[e.RowIndex].AgvName, Common.nodeInfo[e.RowIndex].Name)); Common.LogInfo(string.Format("手动清除缓存,{0}", Common.nodeInfo[e.RowIndex].Name));
string name = Common.nodeInfo[e.RowIndex].AgvName;
Common.nodeInfo[e.RowIndex].AgvName = "";
DgvNode.Rows[e.RowIndex].Cells[5].Value = ""; DgvNode.Rows[e.RowIndex].Cells[5].Value = "";
Common.nodeInfo[e.RowIndex].RFID = ""; Common.nodeInfo[e.RowIndex].RFID = "";
DgvNode.Rows[e.RowIndex].Cells[4].Value = ""; DgvNode.Rows[e.RowIndex].Cells[4].Value = "";
//清除小车缓存
int idx = Common.agvInfo.FindIndex(s => s.Name == name);
if (idx > -1)
{
Common.agvInfo[idx].Place = "";
Common.agvInfo[idx].RFID = "";
DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());
//添加Init任务
Common.mir.Add_Mission_Fleet(Common.agvInfo[idx], Common.agvMission["Init"]);
Common.mir.State_Ready(Common.agvInfo[idx]);
}
DgvNode.Rows[e.RowIndex].SetValues(Common.nodeInfo[e.RowIndex].ToRow()); DgvNode.Rows[e.RowIndex].SetValues(Common.nodeInfo[e.RowIndex].ToRow());
} }
} }
...@@ -373,53 +403,27 @@ namespace AGVControl ...@@ -373,53 +403,27 @@ namespace AGVControl
try try
{ {
agvRunInfo[i].Text = Common.agvInfo[i].RunInfo(); agvRunInfo[i].Text = Common.agvInfo[i].RunInfo();
Application.DoEvents();
} }
catch (Exception ex) catch (Exception ex)
{ {
Common.log.Error("显示"+ Common.agvInfo[i].Name+"运行信息异常"); Common.log.Error("显示" + Common.agvInfo[i].Name + "运行信息异常");
} }
} }
Application.DoEvents();
if (!Common.doubleLine_WO.Equals("")) //if (!Common.doubleLine_WO.Equals(""))
lblWO.Text = Common.doubleLine_WO; lblWO.Text = Common.doubleLine_WO;
if (!AGVManager.A6_Target.Equals("")) // if (!AGVManager.A6_Target.Equals(""))
lblDestInfo.Text = AGVManager.A6_Target; lblDestInfo.Text = AGVManager.A6_Target;
lblCharge3.Text = "充电桩3:" + Common.chargeStatus.charge3; lblCharge3.Text = "充电桩3:" + Common.chargeStatus.charge3;
lblCharge4.Text = "充电桩6:" + Common.chargeStatus.charge6; lblCharge4.Text = "充电桩6:" + Common.chargeStatus.charge6;
lblStandy1.Text = "4C待机位1:" + Common.StandbyStation.C4_Station1; lblStandy1.Text = "4C待机位1:" + Common.StandbyStation.C4_Station1;
lblStandy2.Text = "4C待机位2:" + Common.StandbyStation.C4_Station2; lblStandy2.Text = "4C待机位2:" + Common.StandbyStation.C4_Station2;
lblWarn.Text = Common.warnMsg;
})); }));
InShhow = false; InShhow = false;
} }
private void ShowEmptyTask()
{
if (dgvLineMission.InvokeRequired)
{
dgvLineMission.Invoke(new Action(() => ShowEmptyTask()));
return;
}
try
{
if (dgvLineMission.Rows.Count != 0)
dgvLineMission.Rows.Clear();
foreach (var item in Common.missionManager.missionList)
{
var key = Common.nodeInfo.Where(q => q.Name == item.NodeName).Select(q => q.AliceName);
if (key.ToList().Count > 0)
dgvLineMission.Rows.Add(item.CreateTime, key.ToList()[0]);
}
groupBox4.Text = "产线解绑信息:共" + Common.missionManager.EmptyMissionCount.ToString() + "个";
}
catch (Exception ex)
{
Common.log.Error(ex);
}
}
private void ChkAutoCharge_CheckedChanged(object sender, EventArgs e) private void ChkAutoCharge_CheckedChanged(object sender, EventArgs e)
{ {
...@@ -438,21 +442,23 @@ namespace AGVControl ...@@ -438,21 +442,23 @@ namespace AGVControl
} }
if (MessageBox.Show("确定删除产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动删除解绑任务", MessageBoxButtons.YesNo) == DialogResult.No) if (MessageBox.Show("确定删除产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动删除解绑任务", MessageBoxButtons.YesNo) == DialogResult.No)
return; return;
//int idx=Common.missionList.FindIndex(s => s.NodeName == Common.agvProductionLine[txtBoxMission.Text]); if (txtRfid.Text.ToUpper().StartsWith("D") || txtRfid.Text.ToUpper().StartsWith("C"))
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
if (idx > -1)
{ {
if (Common.DelEmptyShelfTask(Common.nodeInfo[idx].Name)) int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
{ if (idx > -1)
Common.LogInfo("手动删除任务成功:" + cmbBoxLineName.SelectedItem.ToString());
}
else
{ {
Common.LogInfo("手动删除任务失败"); if (Common.missionManager.DelMission(Common.nodeInfo[idx].Name, txtRfid.Text.ToUpper()))
{
Common.LogInfo(string.Format("手动删除任务成功:{0} {1}", cmbBoxLineName.SelectedItem.ToString(), txtRfid.Text.ToUpper()));
}
else
{
Common.LogInfo("手动删除任务失败");
}
} }
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
...@@ -465,32 +471,35 @@ namespace AGVControl ...@@ -465,32 +471,35 @@ namespace AGVControl
{ {
try try
{ {
if (cmbBoxLineName.SelectedItem == null || cmbBoxLineName.SelectedIndex == 0) if (cmbBoxLineName.SelectedItem == null || cmbBoxLineName.SelectedIndex == 0 || txtRfid.Text.Equals(""))
{ {
return; return;
} }
if (cmbBoxLineName.SelectedItem.ToString().StartsWith("A")) if (cmbBoxLineName.SelectedItem.ToString().StartsWith("A"))
return; return;
if (MessageBox.Show("确定添加产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动1添加解绑", MessageBoxButtons.YesNo) == DialogResult.No) if (MessageBox.Show("确定添加产线任务[" + cmbBoxLineName.SelectedItem.ToString() + "]", "手动添加解绑", MessageBoxButtons.YesNo) == DialogResult.No)
return; return;
int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString())); if (txtRfid.Text.ToUpper().StartsWith("D") || txtRfid.Text.ToUpper().StartsWith("C"))
if (idx > -1)
{ {
if (Common.AddEmptyShelfTask(Common.nodeInfo[idx].Name)) int idx = Common.nodeInfo.FindIndex(s => s.AliceName.Equals(cmbBoxLineName.SelectedItem.ToString()));
{ if (idx > -1)
Common.LogInfo("手动添加任务成功:" + cmbBoxLineName.SelectedItem.ToString());
}
else
{ {
Common.LogInfo("手动添加任务失败"); if (Common.missionManager.AddMission(Common.nodeInfo[idx].Name, txtRfid.Text.ToUpper()))
} {
Common.LogInfo(string.Format("手动添加任务成功:{0} {1}", cmbBoxLineName.SelectedItem.ToString(), txtRfid.Text.ToUpper()));
}
else
{
Common.LogInfo("手动添加任务失败");
}
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
ShowEmptyTask();
Common.log.Error("手动添加任务失败:" + ex.Message); Common.log.Error("手动添加任务失败:" + ex.Message);
} }
} }
...@@ -606,9 +615,11 @@ namespace AGVControl ...@@ -606,9 +615,11 @@ namespace AGVControl
{ {
Task.Factory.StartNew(() => Task.Factory.StartNew(() =>
{ {
AGVManager.UpdateStatus(txtBoxRFID.Text.ToUpper(), txtBoxLineName.Text.ToUpper()); bool rtn = AGVManager.UpdateStatus(txtBoxRFID.Text.ToUpper(), txtBoxLineName.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = rtn ? "状态上报成功" : "状态上报失败"; }));
Common.LogInfo(string.Format("手动上报状态 产线{0} 物料状态更新成功[{1}]", txtBoxLineName.Text.ToUpper(), txtBoxRFID.Text.ToUpper())); Common.LogInfo(string.Format("手动上报状态 产线{0} 物料状态更新成功[{1}]", txtBoxLineName.Text.ToUpper(), txtBoxRFID.Text.ToUpper()));
txtBoxLineName.Text = "";
txtBoxRFID.Text = "";
}); });
} }
catch (Exception ex) catch (Exception ex)
...@@ -617,11 +628,6 @@ namespace AGVControl ...@@ -617,11 +628,6 @@ namespace AGVControl
} }
} }
private void dgvLineMission_Click(object sender, EventArgs e)
{
ShowEmptyTask();
}
private void btnClearC4StandyInfo_Click(object sender, EventArgs e) private void btnClearC4StandyInfo_Click(object sender, EventArgs e)
{ {
Common.StandbyStation.C4_Station1 = ""; Common.StandbyStation.C4_Station1 = "";
...@@ -656,5 +662,79 @@ namespace AGVControl ...@@ -656,5 +662,79 @@ namespace AGVControl
DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow()); DgvAgv.Rows[idx].SetValues(Common.agvInfo[idx].ToRow());
} }
} }
private void btnGetStationRfid_Click(object sender, EventArgs e)
{
if (txtBoxLineName.Text.Equals(""))
return;
try
{
Task.Factory.StartNew(new Action(() => {
string res = AGVManager.GetRFIDs(txtBoxLineName.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = string.Format("由里到外料架顺序:{0}", res); }));
}));
}
catch { }
}
private void btnClearStationRFID_Click(object sender, EventArgs e)
{
if (!txtBoxLineName.Text.Equals("") && !txtBoxRFID.Text.Equals(""))
{
try
{
Task.Factory.StartNew(new Action(() => {
bool rtn = AGVManager.ClearRFID(txtBoxLineName.Text.ToUpper(), txtBoxRFID.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = rtn ? "清除接驳RFID成功:" + txtBoxLineName.Text + " " + txtBoxRFID.Text : "清除接驳RFID失败:" + txtBoxLineName.Text + " " + txtBoxRFID.Text; }));
txtBoxLineName.Text = "";
txtBoxRFID.Text = "";
Common.LogInfo(rtn ? "手动清除接驳RFID成功:" + txtBoxLineName.Text + " " + txtBoxRFID.Text : "手动清除接驳RFID失败:" + txtBoxLineName.Text + " " + txtBoxRFID.Text);
}));
}
catch { }
}
}
/// <summary>
/// 点击小车状态刷新
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DgvAgv_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
Invoke(new Action(() =>
{
try
{
for (int i = 0; i < Common.agvInfo.Count; i++)
{
DgvAgv.Rows[i].SetValues(Common.agvInfo[i].ToRow());
}
}
catch { }
}));
}
private void agvRemoveRfid_Click(object sender, EventArgs e)
{
try
{
Task.Factory.StartNew(() =>
{
if(txtBoxRFID.Text.StartsWith("C") || txtBoxRFID.Text.StartsWith("D"))
{
bool rtn = AGVManager.AgvRemoveRfid(txtBoxRFID.Text.ToUpper());
this.Invoke(new Action(() => { label11.Text = rtn ? "清理料架的缓存信息成功" : "清理料架的缓存信息失败"; }));
Common.LogInfo(string.Format("手动清理料架的缓存信息成功[{0}]", txtBoxRFID.Text.ToUpper()));
}
txtBoxLineName.Text = "";
txtBoxRFID.Text = "";
});
}
catch (Exception ex)
{
}
}
} }
} }
...@@ -174,1011 +174,103 @@ ...@@ -174,1011 +174,103 @@
<metadata name="Column16.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="Column16.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata> </metadata>
<metadata name="Column24.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="backgroundWorker1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>True</value> <value>17, 17</value>
</metadata>
<metadata name="Column8.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata> </metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAABAAEAgHEAAAEAIAA46QAAFgAAACgAAACAAAAA4gAAAAEAIAAAAAAAAOIAAGEPAABhDwAAAAAAAAAA AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAADAE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAAQgAAAC0AAAAAAAAACAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ABEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKCsrK60hISHBAAAABhsb
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA G54mJibCFBQUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExNpKSkpugAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAXFxeeFxcXmwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAA0AAAAACQkJbRER
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA EcUAAAAAGRkZoRcXF5IAAAAAAAAAAAAAACcAAAANAAAAAAAAAAAAAAAAHx8Ra1NRLrA9PSOLAAAASQUF
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BZwLCwvSAAAANBISEroMDAypAAAANwAAABY5OR+8BgYEgQAAABMAAAAAAAAAACUlFWFUVDO6ICAYiF9f
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA WazV1cfs1NTG38vLveCFhXzDG0lXsjk5NrMAAAATNDQjvjQ0HbAAAAAGAAAAAAAAAAAAAAAAFxcXjiYm
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA JrNmZl6j5eXW/+Xl1v/l5db/e354ww+z7fA6Oja0ExMTeUpKSr4AAAAnAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADI1NTXAPz87veXl1v/l5db/5eXW/5WaksozXGe0U1NMuCoqKr0bGxuCAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAABGBgYsWBgWrjl5db/5eXW/7y8r90aGhnFMDAtv1VVUbYiIiK1AAAAEwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAwMDEAlJSOYMTEssi8vLKQvLyykNDQxnDY2M5skJCKIBQUFMgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAATcnJvOfV1cjvrq6k1dPTxezFxbjjMzMudAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFDa2s3zkpKIys7OweqwsKTX3NzN9jo6NXMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEA1fzs7B6mZmYLzl5db/UVFPuby8sN4cHBpkAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwZZmVlXrhiYly5dXVusG1tZrRaWlSbAAAAHQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALCwt5AAAANgAAAAAAAABNDQ0NhQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOwAAAAIAAAAAAAAAAQQE
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BEUAAAAAAAAAAAAAAAAAAAAAAAAAAP//AAD8jwAA/p8AAP6fAADkmQAA4AkAAOALAADwAwAA8AcAAPgP
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAD8HwAA/B8AAPwfAAD8HwAA/98AAP//AAAoAAAAIAAAAEAAAAABACAAAAAAAIAQAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ACMAAACFAAAAhwAAAHMAAAA2AAAAAAAAAAAAAAADAAAAMgAAADMAAAAmAAAAGQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAhlBQUL9ZWVnCPDw8wAYGBtwAAAAVAAAAAAAAAG07Ozu/TU1NwDc3N78WFhbJAAAAQwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAcAAAAdwQEBNZZWVnCBQUF1AAAAAQAAAAAAAAAfxISEswWFhbJCwsLzwYG
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA BskAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAQEzR8fH8QCAgLOAAAAAAAAAAAAAABhCAgI1woK
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA CtYAAABuAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAzAn5+f4ggICMIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AF4xMTHAMjIywAAAAF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBM82NjbABQUFywAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAcTk5Ob8eHh7FAAAASwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOAAAAowAAADUAAAAAAAAAAAAAAAAAAAAABAQE0yMj
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I74EBATWAAAAAAAAAAAAAACHHx8fxA0NDdEAAABIAAAAAAAAAAAAAAAAAAAAAAAAABcAAAB9AAAANgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAOQAAAIyOjFDPHh4RxgAAACsAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAEBATSNDQ0wAYGBtoAAAAAAAAAAAAAAKIXFxfICAgI2AAAAEgAAAAAAAAAAAAAAAAAAAAPCgoFw0tJ
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Kb8AAACDAAAAFwAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIs2Nh7CFBQLzKGeWtiLiE7OAAAAbAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AH0AAACnAAAAmQICAuQbGxvGAgIC5QAAAHkAAAB3AAAA00ZGRsAXFxfJAAAAtgAAAJYAAABiAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AFNraTzELCwZwQAAAJIDAwLhAAAAUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVUNBJb/PzHT/x8Rw9hsb
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA D8YAAAAqBAQEsdXVyO/U1MbjzMy/2sDAs9O0tKjVrq6j1q6uo9aurqPWcnJqvDQ0L7dHR0O0hoZ9vhQU
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA E8kAAAACAAAAFxoYDsbEwW/0oZ9a1ywrGMAAAAAqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZwUF
AAAAAAAAAAAAAwAAAEAAAACEAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA AtcQEA/NGhoaxwAAAFIAAACb19fJ8uXl1v/l5db/5eXW/+Xl1v/l5db/5eXW/+Xl1v8gIB3HC4q30guH
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA stAeHhzKIyMixQAAAAgAAAAwDAwM1QwMCNMWFgzNAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAABqAAAAEHFKLAD7pGIAYkAmAAAAACwAAACAAAAAjwAA AAAAAAAAAAAAdh4eHsUQEBDNAAAAmAAAAJPKyr3n5eXW/+Xl1v/l5db/5eXW/+Xl1v/l5db/5eXW/yMj
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA IMUQuvf4D67o7SsrJ8kdHRzIAAAABAEBAbigoKDkg4OD0AAAAIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA AAAAAAAAAAAAAAAAAAAAAAANCgoKy7e3t/gGBgbSAAAAl8LCteHl5db/5eXW/+Xl1v/l5db/5eXW/+Xl
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA 1v/l5db/EhgayBC//v8NndDdPj46xhsbGMkAAABNGBgYyBYWFsgJCQnPAAAAFgAAAAAAAAAAAAAAAAAA
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAACPAAAAjwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJERERzS4uLsAAAADvvLyw3uXl1v/l5db/5eXW/+Xl
AI8AAACPAAAAjwAAAI8AAACPAAAAjwAAAI8AAABvAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 1v/l5db/5eXW/+Xl1v8FCgvWB1JuwQVDWb9bW1XCFBQTzQoKCs8UFBTIPDw8vwAAAG8AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAAAA7gAAAP8AAAD/AAAA/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk4ODi/c3NzyAEBAe3Gxrnk5eXW/+Xl
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA 1v/l5db/5eXW/+Xl1v/k5NX+uLis26ammtKVlYvMg4N6xsjIu+UQEA/QFhYWyZOTk9YBAQHTAAAABAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAN5MTEzAGxsbxs/P
AP8IBQN8/75yDP+yaw1rRiobAQEBvwAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA wuvl5db/5eXW/+Xl1v/l5db/5eXW/0tLRb8sLCzADAwM0C8vK8MPDw/NlZWNyxQUE8qKiorTBQUF3wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbxUV
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA Fc8DAwPk2NjJ8eXl1v/l5db/5eXW/+Xl1v/l5db/sbGm1xYWFMk/Pzu+h4d+xx4eG8aysqfWBwcH2hIS
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA EskFBQWlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AAAAAAALCAgIxAcHB9qQkIjNeXlwyFtbVsdJSUTHSUlEx0lJRMdJSUTHSUlEx0lJRMdRUUzCVlZRwFZW
AP8AAADCAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA UcACAgLnBgYGsQAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAFQAAANAAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AAAAAAAAAAAAAAAAAAAAAAASAAAAXAAAAIYAAACjAAAAowAAAKAAAACgAAAAoAAAAKAAAACVAAAAkgAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AJIAAACMAAAAawAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/1s7I+v7pGLI/aVjx9yPVs8fFAz6AAAA/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmJGRiMy4uKzUwcG11sLCteLCwrXiwsK14sDA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA tN+urqPWn5+Uz5mZj80TExHNAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWycm85+Xl1v/l5db/5eXW/6ur
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA otVwcGnC2trM9OXl1v/l5db/5eXW/ycnJcMAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJrS0sTt5eXW/+Xl
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAB9AAAAAAAAAAAAAAAAAAAAAAAA 1v/l5db/w8O345KSiMrU1Mbu5eXW/+Xl1v/l5db/JyclwwAAAA0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtAAAA7AAAAP8AAAD/EwsG/yMV AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo9fX
DP8jFAz/IxQM/yMUDP8jFAz/IxQM/yMUDP8jEwv/IxIK/yMSCv8jEgr/IxIK/xcMB/8AAAD/AAAA/wEB yfLY2MvzLCwqwzo6NcDl5db/5eXW/35+dcRcXFXAv7+z4OXl1v8fHxzGAAAABAAAAAAAAAAAAAAAAAAA
AP8aEQr/JBcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yIX AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Df8/KRn/xoJN//2lY//7pGL/+aNh/5JfOf8qHBH/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX AAABAQGw4ODR+oWFfMcNDQ3REREQzeXl1v/j49P8CAgI1x4eHsUqKifE5eXW/xkZFsQAAAAAAAAAAAAA
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX AAAAAAAAAAAAAAwMC73l5db/5eXW/9fXyPHg4NH55eXW/+Xl1v/MzL7okpKIytray/Xj49T9CAgIuwAA
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMX AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Dv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDv8jFw7/IxcO/yMXDf8jFQz/IxQM/yMUDP8jFQz/IRML/wcE AAAAAAAAAAAAAAAAAAAAAAABFxcWyOXl1v/l5db/5eXW/+Xl1v/l5db/5eXW/+Xl1v/l5db/3d3O9ltb
Av8AAAD/AAAA/wAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA VL8AAABxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP92RSf/4oRL/9+DSv/fg0r/34NK/9+DSv/fg0r/34NK/958 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQGxBQUFwAUFBcAAAADzAAAAzwAAALoAAACqAAAA4AAA
R//ec0H/3nNB/95zQf/idUL/kUwr/wEBAP8AAAD/BgQC/6FpP//klVn/4JNY/+CTWP/gk1j/4JNY/+CT AL0AAAClAAAAaAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4ZNY/+2bXf/8pWL/+6Ri//ukYv/7pGL/+qNi/+aX AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAZwAAAJIAAAACAAAAAAAA
Wv/gklj/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT AAAAAAAvAAAAtgAAACsAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDA5gMDAzSAAAAOgAA
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT AAAAAAAAAAAAAAAAAAAAAABPBwcH2QcHB84AAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
WP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CTWP/gk1j/4JNY/+CT AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZgAA
WP/gk1j/4JFW/9+ETP/fgkr/34NK/9+DSv/QekX/KxkO/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAA AIEAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwOfAwMDmgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4RO AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
LP/+lVX/+5NU//uTVP/7k1T/+5NU//uTVP/7k1T/+oxP//qCSf/6gkn/+oJJ//6ES/+kVTD/AQEA/wAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AP8HBAP/tXZH//+oZP/9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l AAAAAAAAAAAAAAAAAAAAAAAAAAAAAP//////8////+Dh///44f//+Of///jn///45//++Mf//HjHx/Bg
Y//9pWP//KVi//ukYv/7pGL/+6Ri//ukYv/7pGL//KVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l wcP4QADD/EAAx/4AAIf+AACP/gAAH/8AAB//AAA//4AAP/+AAH//4AP//+AB///gAf//4AH//+AB///g
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l Af//4AH//+AD///gB////e////Pz///78///////
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2l
Y//9pWP//aVj//2lY//9pWP//aVj//2lY//9pWP//aVj//2lY//8o2H/+5VV//uTU//7k1T//JRU/+qJ
Tv8wHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mS
U//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAA
AP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEB
AP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qT
U//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAA
AP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NV
MP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mS
U//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mS
U//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAA
AO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yD
Sv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7omD/+ZRV//mS
U//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mS
U//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAA
AKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iB
Sf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mU
Vf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mS
U//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+n
ZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAA
AP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iB
Sf/4gUn//INK/6NVMP8BAQD/AAAA/wcEA/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ui
YP/5lFX/+ZJT//mSU//6k1P/6YhO/y8cEP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mS
U//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1
Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAA
AP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAALwAAAO4AAAD/AAAA/4NNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iB
Sf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8HBAP/s3VG//+nZP/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7omD/+ZRV//mSU//5klP/+pNT/+mITv8vHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yU
VP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wcE
A/+zdUb//6dk//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uiYP/5lFX/+ZJT//mSU//6k1P/6YhO/y8c
EP8AAAD/AAAA/wAAAKEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC8AAADuAAAA/wAAAP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mL
T//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEBAP8AAAD/BwQD/7N1Rv//p2T/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//ukYv/7pGL/+6Ri//uk
Yv/7pGL/+6Jg//mUVf/5klP/+ZJT//qTU//piE7/LxwQ/wAAAP8AAAD/AAAAoQAAAAEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4NN
LP/8lFT/+ZJT//mSU//5klP/+ZJT//mSU//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAA
AP8HBQP/tXZH//+oZP/9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2m
Y//9pmP//aZj//2mY//9pmP//aZj//2mY//9pmP//aZj//2mY//9o2H//JZW//uTVP/7k1T//ZRU/+yL
T/8wHBD/AAAA/wAAAP8AAAChAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAvAAAA7gAAAP8AAAD/g00s//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mS
U//5i0//+IFJ//iBSf/4gUn//INK/6NVMP8BAQD/AAAA/wQCAf9WOCL/eE8v/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZNLv92TS7/dk0u/3ZN
Lv92TS7/dk0u/3ZMLf92Rij/dkUn/3VFJ/97SCn/hE0s/x8SCv8AAAD/AAAA/wAAAKEAAAABAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC8AAADuAAAA/wAA
AP+DTSz//JRU//mSU//5klP/+ZJT//mSU//5klP/+ZJT//mLT//4gUn/+IFJ//iBSf/8g0r/o1Uw/wEB
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAO4AAAD/AAAA/4RNLP/8lFT/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+YtP//iBSf/4gUn/+IFJ//yDSv+jVTD/AQEA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADKAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAA6wAA
AP8AAAD/fUkq//yUVP/5klP/+ZJT//mSU//5klP/+ZJT//mSU//5i0//+IFJ//iBSf/4gUn//INK/6FU
L/8BAAD/AAAA/wEBAf8TEA7/GRYT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkV
E/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRP/GRUT/xkVE/8ZFRL/GRQQ/xkT
D/8XEg7/CggG/wAAAP8AAAD/AAAA/wAAAP8AAADDAAAAIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAADcAAAA/wAAAP9fNyD/+ZJT//mSU//5klP/+ZJT//mS
U//5klP/+ZJT//iJTv/4gUn/+IFJ//iBSf/8g0r/h0Yo/wAAAP8AAAD/DAoJ/6qSgP/cvaX/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6
o//ZuqP/2bqj/9m6o//ZuqP/2bqj/9m6o//ZtJf/2KyI/9aqhv+5k3T/alRD/xMPDP8AAAD/AAAA/wAA
AP8AAAClAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAA
AL0AAAD/AAAA/yoZDv/gg0v/+5NU//mSU//5klP/+ZJT//mSU//5kVP/+IZM//iBSf/4gUn/+YFJ//B9
R/9JJhX/AAAA/wAAAP8kHxv/48Kq///dwf//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///b
wP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///bwP//28D//9vA///a
vv//0Kv//sqf///LoP/7x57/s45x/yIbFf8AAAD/AAAA/wAAAPgAAABWAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAP8AAAD/AgEB/4tRLv/7k1T/+ZJT//mS
U//5klP/+ZJT//mOUf/4gkr/+IFJ//iBSf/8g0r/rloz/wwGBP8AAAD/AAAA/1lNQ//51rv//dm+//3Z
vv/92b7//tq///7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7a
v//+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7av//+2r7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r///tq///3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///7av//92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//7avv/+2r///dm///3WuP/8yqH//Mie//zInv//y6D/rYls/w4L
Cf8AAAD/AAAA/wAAALQAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA5gAAAP8AAAD/Gg8J/7ZqPf/8lFT/+pNT//mSU//5klP/+IdN//iBSf/5gUn//INK/81q
PP8vGA7/AAAA/wAAAP8JCAf/sJeE///cwf/92b7//dm+//7av//uzLP/7cuy//7av//92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r//8tC2/+nIr//82L3//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//tq///fUuv/nxq7/+da7//7av//92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//7avv/717z/6Meu//XSuP/+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+/+vJsP/wzrT//tq///3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7a
v//vzbT/7Mqx//7Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r//9NG3/+jH
rv/72L3//tm+//zOqf/8yJ7//Mie//3Inv/3xJv/V0U3/wAAAP8AAAD/AAAA5gAAACcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAACEAAAA/wAAAP8AAAD/HhIK/5pb
M//si0///JRU//2NUP/8hEv//INK//F9R/+vWzT/LxkO/wAAAP8AAAD/AAAA/1VJQP/00bf//tq///3Z
vv//28D/vqOP/zsyLP83Lyn/tZuI///av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9u//9m6
o/9OQzv/LCYh/5WAcP/72L3//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7av//syrH/Z1hN/ygj
Hv90Y1f/8tC2//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7/+NW6/4ZzZf8qJB//WU1D/+PD
qv//2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7avv+mjn3/MSol/0I5Mv/Lrpj//9vA//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//28D/xamU/z82L/80LCf/rpWD//7av//92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//9q//96/p/9USD//KyQg/415av/61rz//dKw//zInv/8yJ7//Mie///L
of+dfWP/AQEB/wAAAP8AAADvAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABYAAAC3AAAA/wAAAP8AAAD/BwQC/0AlFf+DSyv/plcx/6dXMf+MSSn/TCgW/w0H
BP8AAAD/AAAA/wAAAP8sJiH/07Wf///bwP/92b7//dm+//rWvP9VSUD/AAAA/wAAAP9MQTn/99S6//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MH/h3Rl/wAAAP8AAAD/JB8b/+PDq///2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//9zB/7OZhv8EBAP/AAAA/wwKCf/FqZT//9zA//3Zvv/92b7//dm+//3Z
vv/92b7//dm+///bwP/WuKH/FxMR/wAAAP8AAAD/m4V1///dwf/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/+2r//8M61/zoxK/8AAAD/AAAA/2tcUP/+2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//zZ
vv9fUkj/AAAA/wAAAP9CODH/9NG3//7Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MH/k35u/wAA
AP8AAAD/HBgV/9y9pv//1bT//Mie//zInv/8yJ7//8ug/76Wd/8KCAb/AAAA/wAAAO4AAAAvAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEEAAADzAAAA/wAA
AP8AAAD/AAAA/wAAAP8CAQH/AgEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/5WAcP//3cH//dm+//3Z
vv/92b7//dm+/3NjVv8AAAD/AAAA/2dZTv/717z//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+///c
wf+giXj/BQQE/wAAAP8+NS//7cuy//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv//3MD/xqqV/xQR
D/8AAAD/IBsY/9W3oP//28D//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9q//+PDqv8vKCP/AAAA/wsJ
CP+ymYb//9zB//3Zvv/92b7//dm+//3Zvv/92b7//dm+//7Zvv/207n/VUlA/wAAAP8AAAD/h3Rm///b
wP/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq//31rXv8AAAD/AAAA/15QRv/51bv//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+///cwf+qkoD/CAcG/wAAAP81Lij/58eu//7Us//8yJ7//Mie//zI
nv//y6D/tpBy/wcGBf8AAAD/AAAA7gAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAAO8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8BAQD/pI17///dwf/92b7//dm+//3Zvv/+2r//5sWs/4l2Z/+FcmT/4cGp//7a
v//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq///PQtv+ahHT/emlc/8+xm//+2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/61rv/r5aD/3ZlWf+5n4v//Ni9//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//tm+/8WplP93Zlr/pI17//fTuf/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//7av//ZuqP/gG1g/5B8bP/syrH//tq///3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/+2r//6civ/415av+CcGL/3b6m//7av//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq+//XS
uP+fiXj/eGda/8mtl//+2r///dCu//zInv/8yJ7//Mie///LoP+Ha1X/AAAA/wAAAP8AAADuAAAALwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAA
AP8AAAD/KyIb/yohGv8NCgj/BgUE/wYFBP8LCQf/IxwW/zktJP8FBAP/AAAA/wEAAP+ji3r//93B//3Z
vv/92b7//dm+//3Zvv/+2r///9zA///bwP//2r///dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//tq////cwP//28D//9vA//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv//3MD//9vA///bwP/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//9vA///b
wP//3MD//tm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+///bv///28D//9zA//7a
v//92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/+2r///9zA///bwP//2r///dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//tq+///cwP//28D//9vA//3YvP/8zKb//Mie//zI
nv/+yp//57eR/zcrIv8AAAD/AAAA/wAAANkAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+Lblf/6LiR/8Sce/+zjnD/so1v/8CY
eP/hs43/uJJ0/woIBv8AAAD/AQAA/6KLev//3cH//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Zvv/92b7//dm+//3Z
vv/92b7//dm+//3Zvv/92b7//dOz//zJn//8yJ7//8qg//bDmv91XUr/AQEB/wAAAP8AAAD/AAAAkwAA
AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APAAAAD/AAAA/45xWf//zaL//8ug///LoP//y6D//8ug///Mof++lnf/CggG/wAAAP8AAAD/pY18///h
xf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3MH//tq+//3Zvv/92b7//dm+//7av///3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///d
wf//3cH//93B///dwf//3cH//93B///dwf//3cH//93B///dwf//3cH//93C///avP//z6f//8ug//3I
nv/cr4r/bldF/wcFBP8AAAD/AAAA/wAAAOQAAAAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zI
nv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP9dUEb/lH9v/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1u/7Sah//00bf//tq///3Zvv/+2r//6Meu/6aO
fP+RfG3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9bf+SfW3/kn1t/5J9
bf+SfW3/kn1t/5J9bf+SfW3/kXdi/5FzW/+OcFn/aFNB/yYeGP8AAAD/AAAA/wAAAP8AAAD5AAAAbgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/CAcG/456a///2r///tm+//bTuf9fUUf/AQEB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA9wAAAIMAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zI
nv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/LykkzvrWvHb/3MB11LafgBMR
D+cAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANoAAABkAAAABgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAA
AP8AAAD1AAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAN8AAABSoYp5AOrJsAD///8AAAAAfQAAAOoAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAA
APAAAADuAAAA5AAAAMEAAAB6AAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zI
nv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAH4AAAAzAAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAAIgAAAAEAAAAAAAAAAAAA
AAAAAAAHAAAAKwAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAA
ADYAAAA2AAAANgAAADYAAAA2AAAANgAAADYAAAA2AAAANgAAADIAAAAkAAAADAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAA
AP8AAAD/AAAAWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///L
of/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woI
Bv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45x
Wf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72W
d/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAA
AP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///L
oP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAA
AP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zI
nv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAcAAAAvAAAAIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAA
APAAAAD/AAAA/45xWf//y6H//Mie//zInv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAfQAAAO4AAADaAAAAQgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zI
nv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAAAP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC4AAADnAAAA/wAAAP8AAACPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADYAAADwAAAA/wAAAP+OcVn//8uh//zInv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAA
AFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhQAAAP8AAAD/AAAA/AAA
AGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//y6H//Mie//zI
nv/8yJ7//Mie///LoP+9lnf/CggG/wAAAP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAB8AAADXAAAA/wAAAP8AAADRAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAIAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA2AAAA8AAAAP8AAAD/jnFZ///Lof/8yJ7//Mie//zInv/8yJ7//8ug/72Wd/8KCAb/AAAA/wAA
AP8AAABcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAP0AAAD/AAAA/wAA
AIsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAALwAAACTAAAAFgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADYAAADwAAAA/wAAAP+OcVn//8uh//zI
nv/8yJ7//Mie//zInv//y6D/vZZ3/woIBv8AAAD/AAAA/wAAAFwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABDAAAA8wAAAP8AAAD/AAAAvQAAABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACgAAADhAAAA/wAAAP8AAABnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANgAAAPAAAAD/AAAA/45xWf//zKH//Mie//zInv/8yJ7//Mie///LoP++lnf/CggG/wAA
AP8AAAD/AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACnAAAA/wAA
AP8AAAD8AAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAP8AAAD/AAAA/gAAAGIAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAA7QAAAP8AAAD/fWNP///M
of/8yJ7//Mie//zInv/8yJ7//8yh/6aEaP8EAwL/AAAA/wAAAP0AAABXAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAADqAAAA/wAAAP8AAADSAAAAHAAAAAAAAAALAAAAJAAA
AFMAAADZAAAA/wAAAP8AAADXAAAAHgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABkAAADXAAAA/wAAAP8pIRr/xp18//nGnP/7x53/+8ed//rGnf/ZrIj/QjQp/wAA
AP8AAAD/AAAA7gAAADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AI4AAAD/AAAA/wAAAP4AAACmAAAAjgAAAMAAAADjAAAA+QAAAP8AAAD/AAAA/wAAAIQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAI0AAAD/AAAA/wAA
AP8cFhL/UUAz/15LO/9eSzv/VkQ2/ycfGP8AAAD/AAAA/wAAAP8AAACyAAAACgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAANoAAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAADmAAAALQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAKwAAAOIAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA9AAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAlQAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAADxAAAA0gAAAGcAAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABTAAAA8wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD8AAAAbwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAADRAAAA/wAAAP8AAAD9AAAA6AAA
AMYAAACYAAAAZgAAADgAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAALsAAAD/AAAA/wkEAv88Gw//LxYM/ygSCv8oEgr/LBQL/zwc
EP8PBwT/AAAA/wAAAP8AAADTAAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAhQAAAP8AAAD/AAAA/wAAAJ0AAAAoAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAAA7gAA
AP8AAAD/WSkX/+prPf/maTz/42g7/+NoO//laTv/7W09/3M1Hv8AAAD/AAAA/wAAAPkAAABOAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADUAAADnAAAA/wAAAP8AAADaAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAAD8AAAA/wQCAf+mTCv//HNB//hxQP/4ckD/+HJA//hy
QP/7c0H/v1gy/w0GA/8AAAD/AAAA/wAAAHUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAHAAAApQAAAP8AAAD/AAAA/QAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAA
AP4AAAD/BwMC/7dUL//7c0H/93FA//dxQP/3cUD/93FA//pyQf/PXzb/FgoG/wAAAP8AAAD/AAAAgwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAD1AAAA/wAAAP8AAADCAAAAEwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNAAAA+gAAAP8BAAD/k0Mm//tzQf/3cUD/93FA//dx
QP/3cUD/+3NB/65QLf8HAwL/AAAA/wAAAP8AAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAATAAAAwQAAAP8AAAD/AAAA9QAAAFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACYAAADjAAAA/wAAAP83GQ7/3GU5//tzQf/4cUD/+HFA//tzQf/pazz/TSMU/wAAAP8AAAD/AAAA9wAA
AE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAIAAAALAAAAEwAAABPAAAAMAAAAHYAAAD9AAAA/wAAAP8AAACmAAAABwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAJ4AAAD/AAAA/wAAAP9IIRP/wFgy/+pr
Pf/sbD3/yFs0/1opF/8DAQH/AAAA/wAAAP8AAAD+AAAA1wAAAH4AAAAXAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAARQAAALEAAADpAAAA+gAA
APsAAADtAAAA8gAAAP8AAAD/AAAA5gAAADUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAMgAAAOEAAAD/AAAA/wAAAP8SCAX/NxkO/zsbD/8WCgb/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAALoAAAAjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAgAAAGoAAADtAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAACfAAAAAgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAOkAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8FBAP/AAAA/wAAAP8AAAD/AAAA/wAAAKkAAAALAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAA7wAAAP8AAAD/AAAA/wIC
Af8DAwL/AAAA/wAAAP8AAAD/AAAA/wAAAOUAAABRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAARQAAAMEAAAD5AAAA/wAAAP8AAAD/AAAA/wICAf81KiH/jG9Y/6+L
bv97Yk3/GRQQ/wAAAP8AAAD/AAAA+QAAAFoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEAAAAL8AAAD/AAAA/wIBAf9IOS3/oH9k/6iFaf9iTj3/Ew8M/wAAAP8AAAD/AAAA/wAA
ANoAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAA
AHAAAAD3AAAA/wAAAP8UEA3/i25X/+e3kf//y6D//8uh///KoP+riGv/DgsJ/wAAAP8AAAD/AAAAwgAA
ABEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeAAAA+gAAAP8AAAD/Tz4x/+q6
k///zKH//8uh//nGnP/Dm3r/SDkt/wAAAP8AAAD/AAAA/wAAAIYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAAP0AAAD/AQEB/4hsVf/+yqD//smf//zI
nv/8yJ7//cme//jFnP9dSjr/AAAA/wAAAP8AAAD7AAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEwAAAMUAAAD/AAAA/xIOC//BmXn//8ug//zInv/8yJ7//Mie///Lof/dr4r/LCMc/wAA
AP8AAAD/AAAAyAAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAB/AAAA/wAAAP8VEQ3/0qaD///KoP/8yJ7//Mie//zInv/8yJ7//8ug/8Sce/8UEA3/AAAA/wAA
AP8AAADIAAAAFQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlAAAA/AAAAP8AAAD/Y08+//nF
nP/8yJ7//Mie//zInv/8yJ7//Mie//7Kn/9sVkT/AAAA/wAAAP8AAADgAAAAHgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAD/AAAA/xMPDP/MooD//8qg//zI
nv/8yJ7//Mie//zInv/8yJ7/+sac/2dSQf8AAAD/AAAA/wAAAP0AAABpAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAGAAAAMwAAAD/AAAA/xcSDv/Jn37//8qg//zInv/8yJ7//Mie//zInv/8yJ7//Mie/2ZR
QP8AAAD/AAAA/wAAAN8AAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAWQAAAPwAAAD/AAAA/4FnUf/+yZ///Mie//zInv/8yJ7//Mie//zInv//yqD/zKKA/xkU
EP8AAAD/AAAA/wAAAM8AAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABvAAAA/gAAAP8AAAD/bFZE//rH
nf/8yJ7//Mie//zInv/8yJ7//Mie//7Kn//arYn/JR4X/wAAAP8AAAD/AAAAwgAAAA0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAA2gAAAP8AAAD/IxwW/9ir
h//+yp///Mie//zInv/8yJ7//Mie//zInv/7x53/b1hG/wAAAP8AAAD/AAAA/wAAAHQAAAAAAAAAAAAA
AAAAAAAAAAAAHQAAANMAAAD/AAAA/xoVEf/PpIH//8qg//zInv/8yJ7//Mie//zInv/8yJ7//cmf/31j
Tv8AAAD/AAAA/wAAAP8AAAB7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB+AAAA/wAAAP8AAAD/eWBM//3Jnv/8yJ7//Mie//zInv/8yJ7//Mie///K
oP/RpoP/HBcS/wAAAP8AAAD/AAAA1gAAAB8AAAAAAAAAAAAAAAAAAAB3AAAA/wAAAP8AAAD/c1tI//zI
nv/8yJ7//Mie//zInv/8yJ7//Mie//7KoP/WqYb/IRoU/wAAAP8AAAD/AAAA2gAAACMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEAAADYAAAA/wAA
AP8eGBP/06iE///KoP/8yJ7//Mie//zInv/8yJ7//Mie//zInv93Xkv/AAAA/wAAAP8AAAD/AAAAewAA
AAAAAAAAAAAAIQAAANgAAAD/AAAA/yAZFP/UqIX//8qg//zInv/8yJ7//Mie//zInv/8yJ7//Mie/3Ze
Sv8AAAD/AAAA/wAAAP8AAAB5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHUAAAD/AAAA/wAAAP9yW0j//Mie//zInv/8yJ7//Mie//zI
nv/8yJ7//sqf/9erh/8jHBb/AAAA/wAAAP8AAADaAAAAJAAAAAAAAAB/AAAA/wAAAP8AAAD/fWNO//3J
n//8yJ7//Mie//zInv/8yJ7//Mie///KoP/QpYL/HBYS/wAAAP8AAAD/AAAA0wAAAB0AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGwAA
ANAAAAD/AAAA/xoVEP/No4H//8qg//zInv/8yJ7//Mie//zInv/8yJ7//cmf/4FmUf8AAAD/AAAA/wAA
AP8AAACBAAAAJwAAAN4AAAD/AAAA/yYeGP/arYn//sqf//zInv/8yJ7//Mie//zInv/8yJ7/+8ed/21X
RP8AAAD/AAAA/wAAAP4AAABvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAawAAAP0AAAD/AAAA/2lTQv/6xp3//Mie//zI
nv/8yJ7//Mie//zInv/+yp//3a+K/yggGf8AAAD/AAAA/wAAAN8AAACsAAAA/wAAAP8AAAD/hWpT//7K
n//8yJ7//Mie//zInv/8yJ7//Mie///KoP/Jn37/FxIO/wAAAP8AAAD/AAAAzQAAABgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAWAAAAygAAAP8AAAD/FBAN/8WdfP//yqD//Mie//zInv/8yJ7//Mie//zInv/+yp//iWxW/wAA
AP8AAAD/AAAA/wAAAP4AAAD/AAAA/yoiG//fsYz//sqf//zInv/8yJ7//Mie//zInv/8yJ7/+cac/2NP
Pv8AAAD/AAAA/wAAAP0AAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkAAAA/AAAAP8AAAD/YEw8//jF
nP/8yJ7//Mie//zInv/8yJ7//Mie//7Jn//hs43/LSQc/wAAAP8AAAD/AAAA/wAAAP8BAQH/jXBY///K
oP/8yJ7//Mie//zInv/8yJ7//Mie///LoP/Dm3r/Ew8M/wAAAP8AAAD/AAAAxwAAABQAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABMAAADEAAAA/wAAAP8RDgv/wJh4///LoP/8yJ7//Mie//zInv/8yJ7//Mie///K
oP+Rc1v/AgIB/wAAAP8AAAD/AAAA/zIoH//ktY///smf//zInv/8yJ7//Mie//zInv/8yJ7/98Sb/11K
Ov8AAAD/AAAA/wAAAPoAAABfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFsAAAD5AAAA/wAA
AP9ZRzj/9sOa//3Inv/8yJ7//Mie//zInv/8yJ7//smf/+a2kP8yKCD/AAAA/wAAAP8CAgH/lHZd///L
oP/8yJ7//Mie//zInv/8yJ7//Mie///LoP+8lXb/DwwK/wAAAP8AAAD/AAAAvwAAABAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAALsAAAD/AAAA/w4LCf+4knP//8ug//zInv/8yJ7//Mie//zI
nv//yqD//Mie/2JOPf8AAAD/AAAA/xENCv/In37//82i//3Jn//8yJ7//Mie//zInv/9yZ7/9MKZ/1RC
NP8AAAD/AAAA/wAAAPgAAABWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAA
APcAAAD/AAAA/08/Mv/zwZj//cme//zInv/9yZ7//Mie/8adfP9oUkH/GhQQ/wAAAP8AAAD/BAMD/z4x
J/+XeF//67qT//7Kn//8yJ7//Mie///LoP+zjnD/CwkH/wAAAP8AAAD/AAAAuAAAAAwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAtQAAAP8AAAD/CggG/7CMbv//zKH//cmf//fE
m/+Pclr/FxIP/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wICAf9IOS3/06iE//7KoP/9yZ//88GY/0w8
L/8AAAD/AAAA/wAAAPYAAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABMAAAA9AAAAP8AAAD/Oi4k/9irh//9yZ7/j3FZ/wgHBf8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP85LST/266K//nGnP+Pclr/BwYE/wAAAP8AAAD/AAAAsQAAAAoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAACrAAAA/wAAAP8AAAD/LCMc/2RP
P/8VEQ3/AAAA/wAAAP8CAQH/ORoP/3o4IP+GPSP/XysY/xUKBv8AAAD/AAAA/wAAAP9ENiv/VUQ1/wwJ
B/8AAAD/AAAA/wAAAPIAAABGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAADUAAADfAAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AwEB/24yHP/laTv/+nNB//tz
Qf/2cUD/t1Qw/yYRCv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAjwAAAAUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAADWAAAA/wAA
AP8AAAD/AAAA/wAAAP89HBD/5mk8//lyQf/3cUD/93FA//dxQP/7c0H/nUgp/wYDAf8AAAD/AAAA/wAA
AP8AAAD/AAAA9wAAAJYAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAACIAAAA1QAAAP4AAAD/AAAA/4E7If/7c0H/93FA//dx
QP/3cUD/93FA//lyQP/cZTn/Ig8J/wAAAP8AAAD/AAAA8AAAALIAAABVAAAACAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABGAAAA9AAAAP8AAAD/kEIl//tzQf/3cUD/93FA//dxQP/3cUD/+HJA/+RoO/8qEwv/AAAA/wAA
AP8AAACrAAAACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAADpAAAA/wAAAP9qMBv/+HJA//dx
QP/3cUD/93FA//dxQP/6ckH/y101/xYKBv8AAAD/AAAA/wAAAI8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAADwAAAMUAAAD/AAAA/xwNB//CWTL//HNB//lyQP/4cUD/+nJB//JvP/9pMBv/AAAA/wAA
AP8AAAD9AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcwAAAP8AAAD/AAAA/y0V
DP+mTCv/4Gc6/+dqPP/OXjX/azEc/wcDAv8AAAD/AAAA/wAAANIAAAAbAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAYAAAAwQAAAP8AAAD/AAAA/wgEAv8nEgr/MRYN/xgLBv8AAAD/AAAA/wAA
AP8AAAD3AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAAzwAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA+AAAAIIAAAAGAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAowAAAPAAAAD/AAAA/wAAAP8AAAD/AAAA/QAA
ANQAAABkAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAHAAAAPQAAAH4AAACjAAAAqwAAAJQAAABgAAAAHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAEAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA////////////////////////////////////////////////////////
/////////gAAAAAcAAAAAAAAAAAD//gAAAAAAAAAAAAAAAAAAP/wAAAAAAAAAAAAAAAAAAB/8AAAAAAA
AAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AA
AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAA
AH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAA
AAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAA
AAAAAAAAAAAAf/AAAAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAf/AA
AAAAAAAAAAAAAAAAAH/wAAAAAAAAAAAAAAAAAAB/8AAAAAAAAAAAAAAAAAAAP/AAAAAAAAAAAAAAAAAA
AB/wAAAAAAAAAAAAAAAAAAAf8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/wAAAAAAAAAAAA
AAAAAAAP8AAAAAAAAAAAAAAAAAAAD/AAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAP+AAAAAAA
AAAAAAAAAAAAD/wAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAD/4A
AAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAAAAAAP/gAAAAAAAAAAAAAAAAAAH/4AAAAAAAAAAAAAAAAA
AD/+AAAAAAAAAAAAAAAAAAA//gAAAAAAAAAAAAAAAAAA//4AAAAAAAAAAAAAAAAAAf/+AAB/////////
/////////gAAf/////////////////4AAH/////////////////+AAB//////////////////gAAf///
//////////////4AAH/////////////////+AAB///8B/////////////gAAf///AP////////////4A
AH///gD////////////+AAB///4A/////////////gAAf//+AOB///////////4AAH///gDAf///////
///+AAB///4BwD///////////gAAf//+AIA///////////4AAH///gAAP//////////+AAB///4AAD//
/////////gAAf//+AAB///////////4AAH///wAAf//////////+AAB///8AAP///////////gAAf///
AAD///////////4AAH///gAB///////////+AAB///4AB////////////gAAf//8AH////////////4A
AH///AD////////////+AAAf/wAA/////////////gAAD/4AAf////////////4AAAf8AAP/////////
///+AAAH+AAD/////////////gAAA/gAA/////////////8AAAPwAAH/////////////gAAB8AAB////
/////////8AAAeAAAf/////////////gAADgAAH/////////////4AAAwAAB/////////////+AAAAAA
Af/////////////gAAAAAAH/////////////8AAAAAAB//////////////AAAAAAA//////////////4
AAAAAAP/////////////+AAAAAAD//////////////wAAAAAB//////////////8AAAAAA//////////
/////gAAAAAP//////////////4AAAAAH///////////////AAAAAB///////////////wAAAAA/////
//////////+AAAAAP///////////////gAAAAH///////////////8AAAAB////////////////AAAAA
////////////////4AAAAP///////////////+AAAAH////////////////wAAAB////////////////
+AAAA/////////////////wAAA//////////////////AAAf/////////////////wAAH///////////
//////8AAD//////////////////AAA//////////////////4AAf//////////////////AAP//////
////////////4AH///////////////////wH////////////////////////////////////////////
//////////////////////////////////8=
</value> </value>
</data> </data>
</root> </root>
\ No newline at end of file \ No newline at end of file
...@@ -42,11 +42,10 @@ namespace AGVControl ...@@ -42,11 +42,10 @@ namespace AGVControl
} }
//Common.logTextBox = new TextBox(); //Common.logTextBox = new TextBox();
//Common.missionView = new DataGridView(); //Common.missionView = new DataGridView();
Common.missionManager = new MissionManager();
Common.log = log4net.LogManager.GetLogger("AgvServer"); Common.log = log4net.LogManager.GetLogger("AgvServer");
Common.log.Info("=====程序开始====="); Common.log.Info("=====程序开始=====");
ReadConfig(); ReadConfig();
Common.ReadLinePlace(); //Common.ReadUnlockLineInfo();
Common.mir = new MiR_API(); Common.mir = new MiR_API();
Common.control = new BLL.Control(); Common.control = new BLL.Control();
......
...@@ -195,27 +195,10 @@ namespace AGVControl ...@@ -195,27 +195,10 @@ namespace AGVControl
else else
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}", return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}当前步骤:{5}{0}执行信息:{6}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText); "\r\n", Name, RFID, curJobTaskName, curJobTaskState, Msg, MissionText);
//if (RFID.StartsWith("C"))
//{
// return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurJobTaskInfo:[TaskName={4}][TaskID={5}][TaskState={6}]{0}RunInfo:{7}{0}BoxDestInfo:{8}{0}GetRack:{9}{0}MissionText:{10}",
// "\r\n", Name, RFID, CurJob.ToString(), curJobTaskName, curJobTaskID, curJobTaskState, Msg, BoxDestInfo, BLL.AGVManager.GetRackBy(RFID), MissionText);
//}
//else if (RFID.StartsWith("D"))
//{
// return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurJobTaskInfo:[TaskName={4}][TaskID={5}][TaskState={6}]{0}RunInfo:{7}{0}BoxDestInfo:{8}{0}MissionText:{9}",
// "\r\n", Name, RFID, CurJob.ToString(), curJobTaskName, curJobTaskID, curJobTaskState, Msg, BoxDestInfo, MissionText);
//}
//else
// return string.Format("Name:{1}{0}RFID:{2}{0}CurJob:{3}{0}CurJobTaskInfo:[TaskName={4}][TaskID={5}][TaskState={6}]{0}RunInfo:{7}{0}MissionText:{8}",
// "\r\n", Name, RFID, CurJob.ToString(), curJobTaskName, curJobTaskID, curJobTaskState, Msg, MissionText);
} }
else else
return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}执行信息:{5}", return string.Format("设备:{1}{0}RFID:{2}{0}任务信息:[任务名称={3}][任务状态={4}]{0}执行信息:{5}",
"\r\n", Name, RFID, curJobTaskName, curJobTaskState, MissionText); "\r\n", Name, RFID, curJobTaskName, curJobTaskState, MissionText);
//return string.Format("Name:{1}{0}RFID:{2}{0}CurTaskInfo:[TaskName={3}][TaskID={4}][TaskState={5}]{0}MissionText:{6}",
// "\r\n", Name, RFID, curJobTaskName, curJobTaskID, curJobTaskState, MissionText);
} }
/// <summary> /// <summary>
/// 任务重发 /// 任务重发
...@@ -365,39 +348,6 @@ namespace AGVControl ...@@ -365,39 +348,6 @@ namespace AGVControl
} }
Position = position; Position = position;
} }
//public void GetPlace(int value)
//{
// // Common.log.Debug(Name + " PLC20=" + value);
// if (value == 0)
// {
// Place = "";
// PlaceState = ePlaceState.None;
// }
// else if (value > 0 && value < 1000)
// {
// //Place = "";
// //PlaceState = PlaceState.None;
// //TaskSend = "";
// }
// else if (value >= 1000)
// {
// int a = value / 1000;
// int b = (value - a * 1000) / 10;
// int c = value - a * 1000 - b * 10;
// //if (c.Equals(1) || c.Equals(3) || c.Equals(5))//Move,Enter,Leave
// // TaskSend = "";
// Place = (char)(64 + a) + b.ToString();
// if (Common.nodeInfo != null && Common.nodeInfo.Count != 0)
// {
// ClientNode node = Common.nodeInfo.Find(s => s.Name == Place);
// if (node != null)
// PlaceAliceName = node.AliceName;
// else
// PlaceAliceName = Place;
// }
// PlaceState = (ePlaceState)c;
// }
//}
public string[] ToRow() public string[] ToRow()
{ {
......
...@@ -41,7 +41,11 @@ namespace AGVControl ...@@ -41,7 +41,11 @@ namespace AGVControl
{ {
Name = name; Name = name;
} }
/// <summary>
/// 状态比较
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public bool StateEquals(eNodeStatus obj) public bool StateEquals(eNodeStatus obj)
{ {
return nodeStatus.Equals(obj); return nodeStatus.Equals(obj);
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AGVControl
{
public class UnlockedShelf
{
/// <summary>
/// 已解绑料架信息
/// </summary>
/// <param name="nodeName"></param>
public UnlockedShelf()
{
Rfids = new Dictionary<string, string>();
}
/// <summary>
/// 空料架数量
/// </summary>
public int EmptyCnt { get; set; }
public string NodeName;
/// <summary>
/// 解绑的RFID及时间
/// </summary>
public Dictionary<string, string> Rfids { get; set; }
public List<string> GetRfids()
{
if (Rfids == null || Rfids.Count <= 0)
return new List<string>();
return Rfids.Keys.ToList<string>();
}
public Dictionary<string, string> GetRfidWithTime()
{
if (Rfids == null || Rfids.Count <= 0)
return new Dictionary<string, string>();
return Rfids;
}
/// <summary>
///添加解绑的空料架,如果RFID相同,不增加数量
/// </summary>
public bool Add(string rfid)
{
if (!rfid.Equals("") && !Rfids.Keys.Contains(rfid))
{
if (EmptyCnt < 0)
{
EmptyCnt = 0;
if (Rfids.Count > 0)
Rfids.Clear();
}
int tmp = EmptyCnt;
System.Threading.Interlocked.Increment(ref tmp);
EmptyCnt = tmp;
Rfids.Add(rfid, DateTime.Now.ToString("yyyy/MM/dd/HH:mm:ss,fff"));
return true;
}
return false;
}
/// <summary>
/// 删除一个解绑任务
/// </summary>
public bool Delete(string rfid)
{
if (EmptyCnt > 0)
{
if (!rfid.Equals("") && Rfids.Keys.Contains(rfid))
{
int tmp = EmptyCnt;
System.Threading.Interlocked.Decrement(ref tmp);
EmptyCnt = tmp;
if (EmptyCnt.Equals(0) && Rfids.Count > 0)
{
Rfids.Clear();
}
if (rfid.Equals(SettingString.C4FeederOut) || rfid.Equals(SettingString.D4FeederOut))
Rfids.Remove(rfid);
return true;
}
}
else if (Rfids.Count > 0)
{
EmptyCnt = 0;
Rfids.Clear();
return true;
}
return false;
}
}
}
...@@ -49,23 +49,31 @@ namespace AGVControl ...@@ -49,23 +49,31 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
runInfo = "";
agv.Msg = runInfo; agv.Msg = runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //runInfo = "充电任务:";
// CurTaskState = st;
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (ChargeStep.IsStep(CHARGE_STEP.NONE)) if (ChargeStep.IsStep(CHARGE_STEP.NONE))
{ {
if (agv.Battery > Common.chargeStatus.chargeMax) if (agv.Battery > Common.chargeStatus.chargeMax)
{ {
if (agv.Place.Equals(SettingString.Standby))//在待机位不操作 if (agvPlace.Equals(SettingString.Standby) || agvPlace.Equals(""))//在待机位不操作
{ {
ChargeStep.ToNextStep(CHARGE_STEP.END); ChargeStep.ToNextStep(CHARGE_STEP.END);
runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务"; runInfo = "在待机位,电量充足[" + agv.Battery + "%],等待任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; ChargeStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR); ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
...@@ -89,7 +97,17 @@ namespace AGVControl ...@@ -89,7 +97,17 @@ namespace AGVControl
} }
else else
{ {
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) if (agvPlace.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlace))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先过4C风淋门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR); ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门"; runInfo = "电量[" + agv.Battery + "%]小于最大电量[" + Common.chargeStatus.chargeMax + "%],从当前位置" + agvPlace + "回到充电位,先到4D门";
...@@ -123,7 +141,18 @@ namespace AGVControl ...@@ -123,7 +141,18 @@ namespace AGVControl
} }
} }
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "电量充足[" + agv.Battery + "%],从当前位置" + agvPlace + "回到待机位,先到4D门";
msg += runInfo;
ChargeStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (ChargeStep.IsStep(CHARGE_STEP.WAIT_AGV_REACH_4D_DOOR))
{ {
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
...@@ -166,7 +195,7 @@ namespace AGVControl ...@@ -166,7 +195,7 @@ namespace AGVControl
if (Common.CheckTaskFinished(agv, CurTaskName)) if (Common.CheckTaskFinished(agv, CurTaskName))
{ {
ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK); ChargeStep.ToNextStep(CHARGE_STEP.WAIT_REACH_CHARGE_OK);
runInfo = "充电任务分配完成,去充电等待任务"; runInfo = "充电任务分配完成,去充电等待任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; ChargeStep.Msg = msg;
} }
...@@ -213,20 +242,12 @@ namespace AGVControl ...@@ -213,20 +242,12 @@ namespace AGVControl
Job job = Common.control.GetJob(agv); Job job = Common.control.GetJob(agv);
if (job != null && !(job is ChargeJob)) if (job != null && !(job is ChargeJob))
{ {
runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务"; runInfo = "充电过程检测到任务,电量[" + agv.Battery + "%]大于最小电量[" + Common.chargeStatus.chargeMin + "%],中断充电执行任务";
msg += runInfo; msg += runInfo;
ChargeStep.Msg = msg; ChargeStep.Msg = msg;
Common.chargeStatus.ClearRandomChargeInfo(agv); Common.chargeStatus.ClearRandomChargeInfo(agv);
return job; return job;
} }
//else if (job == null && agv.Battery < Common.chargeStatus.chargeMax / 2)
//{
// ChargeStep.ToNextStep(CHARGE_STEP.NONE);
// runInfo = "在待机位暂无任务,且当前电量小于" + Common.chargeStatus.chargeMax / 2 + "%,去充电位";
// msg += runInfo;
// ChargeStep.Msg = msg;
// Common.chargeStatus.ClearRandomChargeInfo(agv);
//}
} }
} }
...@@ -291,7 +312,10 @@ namespace AGVControl ...@@ -291,7 +312,10 @@ namespace AGVControl
/// ///
/// </summary> /// </summary>
NONE, NONE,
/// <summary>
/// 等待到达风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary> /// <summary>
/// 等待到达4D门 /// 等待到达4D门
/// </summary> /// </summary>
......
...@@ -51,9 +51,8 @@ namespace AGVControl ...@@ -51,9 +51,8 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "返回任务:"+runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) // runInfo = "返回任务:";
// CurTaskState = st;
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE)) if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.NONE))
{ {
...@@ -61,20 +60,62 @@ namespace AGVControl ...@@ -61,20 +60,62 @@ namespace AGVControl
if (Common.FindEmptyShelfNode(agv, out string nodeName, true)) if (Common.FindEmptyShelfNode(agv, out string nodeName, true))
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(nodeName));
if(i==-1) if (i == -1)
{ {
runInfo= "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架"; ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(nodeName));
msg += runInfo; if (Common.CheckStationState(clientNode, out string rfid))
EmptyAGVBackStep.Msg = msg; {
return new GoEmptyShelfLineJob(agvPlace, nodeName); runInfo = "小车在产线 " + agvPlace + " 准备返回时检测到 " + nodeName + " 有空料架";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
return new GoEmptyShelfLineJob(agvPlace, nodeName, rfid);
}
else
{
if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
} }
else else
{ {
if (Common.CheckIsInAirDoor(agvPlace))
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo= "从产线" + agvPlace + "回待机位,先到4D门"; runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorCToD);
...@@ -83,22 +124,30 @@ namespace AGVControl ...@@ -83,22 +124,30 @@ namespace AGVControl
else else
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo= "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
} }
//EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.END);
} }
else else
{ {
if (agvPlace.StartsWith(SettingString.C4_Name_Prefix)) if (Common.CheckIsInAirDoor(agvPlace))
{
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线" + agvPlace + "回待机位,先过4C风淋门";
msg += runInfo;
EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo= "从产线" + agvPlace + "回待机位,先到4D门"; runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorCToD);
...@@ -107,7 +156,7 @@ namespace AGVControl ...@@ -107,7 +156,7 @@ namespace AGVControl
else else
{ {
EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY);
runInfo= "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
...@@ -118,19 +167,19 @@ namespace AGVControl ...@@ -118,19 +167,19 @@ namespace AGVControl
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY)) else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.Standby,CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.Standby, CurTaskState))
{ {
Job job = Common.control.GetJob(agv); Job job = Common.control.GetJob(agv);
if (job == null && agv.Battery < Common.chargeStatus.chargeMax) if (job == null && agv.Battery < Common.chargeStatus.chargeMax)
{ {
runInfo= "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电"; runInfo = "到达待机位,电量[" + agv.Battery + "]小于最大电量[" + Common.chargeStatus.chargeMax + "],暂无任务,去充电";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return new ChargeJob(""); return new ChargeJob("");
} }
else else
{ {
runInfo= "到达待机位,检测到新任务,执行任务"; runInfo = "到达待机位,检测到新任务,执行任务";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return job; return job;
...@@ -141,31 +190,27 @@ namespace AGVControl ...@@ -141,31 +190,27 @@ namespace AGVControl
{ {
if (Common.FindFullShelfTask(agv)) if (Common.FindFullShelfTask(agv))
{ {
runInfo= "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6"; runInfo = "从产线" + agvPlace + "回待机位过程中,检测到A6出满料,去A6";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return new GoFullShelfStationJob(SettingString.Standby); return new GoFullShelfStationJob(SettingString.Standby);
} }
//else
//{
// msg = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
// EmptyAGVBackStep.Msg = msg;
// return new ChargeJob(SettingString.D4_DOOR_Name);
//}
} }
} }
//else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
//{ {
// CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
// if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
// { {
// EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_REACH_STANDBY); EmptyAGVBackStep.ToNextStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR);
// runInfo = "从产线" + agvPlace + "回待机位"; runInfo = "从产线" + agvPlace + "回待机位,先到4D门";
// msg += runInfo; msg += runInfo;
// EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
// } Common.DoorMission(agv, SettingString.DoorCToD);
//} UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR)) else if (EmptyAGVBackStep.IsStep(EMPTY_AGV_BACK_STEP.WAIT_AGV_REACH_4D_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -180,7 +225,7 @@ namespace AGVControl ...@@ -180,7 +225,7 @@ namespace AGVControl
} }
else else
{ {
runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位"; runInfo = "从产线" + agvPlace + "到达4D门,暂无任务,去充电位";
msg += runInfo; msg += runInfo;
EmptyAGVBackStep.Msg = msg; EmptyAGVBackStep.Msg = msg;
return new ChargeJob(SettingString.DoorCToD); return new ChargeJob(SettingString.DoorCToD);
...@@ -189,8 +234,6 @@ namespace AGVControl ...@@ -189,8 +234,6 @@ namespace AGVControl
} }
return this; return this;
} }
/// <summary> /// <summary>
/// AGV回收空料架流程 /// AGV回收空料架流程
/// </summary> /// </summary>
...@@ -200,7 +243,10 @@ namespace AGVControl ...@@ -200,7 +243,10 @@ namespace AGVControl
/// 查询任务 /// 查询任务
/// </summary> /// </summary>
NONE, NONE,
/// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary> /// <summary>
/// 等待到达4D门 /// 等待到达4D门
/// </summary> /// </summary>
......
...@@ -62,16 +62,23 @@ namespace AGVControl ...@@ -62,16 +62,23 @@ namespace AGVControl
{ {
string msg = agv.Name+ " "; string msg = agv.Name+ " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "空料架返回:"+runInfo;
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //runInfo = "空料架返回:";
// CurTaskState = st;
if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE)) if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.NONE))
{ {
if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间 if (Common.CheckIsInAirDoor(EmptyShelfPlace))//4C车间
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "从产线[" + EmptyShelfPlace + "]前往4C风淋门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo= "空料架从产线" + EmptyShelfPlace + "前往4D门"; runInfo = "从产线[" + EmptyShelfPlace + "]前往4D门";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorCToD);
...@@ -83,7 +90,7 @@ namespace AGVControl ...@@ -83,7 +90,7 @@ namespace AGVControl
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "空料架从产线 [" + EmptyShelfPlace + "] 送往双层线" + EmptyShelfTargetPlace; runInfo = "从产线 [" + EmptyShelfPlace + "]送往双层线" + EmptyShelfTargetPlace;
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
if (!EmptyShelfTargetPlace.Equals("")) if (!EmptyShelfTargetPlace.Equals(""))
...@@ -91,12 +98,12 @@ namespace AGVControl ...@@ -91,12 +98,12 @@ namespace AGVControl
Common.MoveToNode(agv, EmptyShelfTargetPlace); Common.MoveToNode(agv, EmptyShelfTargetPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
} }
else else
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo= "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位"; runInfo = "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
...@@ -104,6 +111,19 @@ namespace AGVControl ...@@ -104,6 +111,19 @@ namespace AGVControl
} }
} }
} }
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "出风淋门,前往4D门";
msg += runInfo;
EmptyBackStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR)) else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -113,7 +133,7 @@ namespace AGVControl ...@@ -113,7 +133,7 @@ namespace AGVControl
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "空料架从产线 [" + EmptyShelfPlace + "] 送往双层线" + EmptyShelfTargetPlace; runInfo = "进4D门,送往双层线" + EmptyShelfTargetPlace;
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace); Common.MoveToNode(agv, EmptyShelfTargetPlace);
...@@ -122,7 +142,7 @@ namespace AGVControl ...@@ -122,7 +142,7 @@ namespace AGVControl
else else
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
runInfo= "双层线暂不需要空料架,从产线[" + EmptyShelfPlace + "]到待机位"; runInfo = "进4D门,双层线暂不需要空料架,到待机位";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, SettingString.Standby); Common.MoveToNode(agv, SettingString.Standby);
...@@ -137,7 +157,7 @@ namespace AGVControl ...@@ -137,7 +157,7 @@ namespace AGVControl
{ {
EmptyShelfTargetPlace = nodeName; EmptyShelfTargetPlace = nodeName;
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
runInfo= "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace; runInfo = "待机位检测到双层线需要料架,送往双层线 " + EmptyShelfTargetPlace;
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfTargetPlace); Common.MoveToNode(agv, EmptyShelfTargetPlace);
...@@ -149,11 +169,8 @@ namespace AGVControl ...@@ -149,11 +169,8 @@ namespace AGVControl
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith("A")) if (Common.CheckTaskFinished(agv, EmptyShelfTargetPlace, CurTaskState) && EmptyShelfTargetPlace.StartsWith("A"))
{ {
//msg = "AGV到达 " + EmptyShelfTargetPlace;
//EmptyBackStep.Msg = msg;
//return new EnterLeaveShelfJob(EmptyShelfTargetPlace,eEnterLeaveType.Leave,shelfType);
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_DOUBLE_LINE_RESPONSE);
runInfo= "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]"; runInfo = "AGV到达 " + EmptyShelfTargetPlace + ",并发送入料架请求[ReadyEnter]";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
Common.server.ReadyEnter(EmptyShelfTargetPlace); Common.server.ReadyEnter(EmptyShelfTargetPlace);
...@@ -165,7 +182,7 @@ namespace AGVControl ...@@ -165,7 +182,7 @@ namespace AGVControl
ClientNode node = Common.nodeInfo[id]; ClientNode node = Common.nodeInfo[id];
if (node.StateEquals(eNodeStatus.MayEnter)) if (node.StateEquals(eNodeStatus.MayEnter))
{ {
if(!agv.CurTaskName.Equals("Leave")) if (!agv.CurTaskName.Equals("Leave"))
{ {
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE); EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE);
runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行"; runInfo = "收到双层线入料架请求[ReadyEnter]的响应 " + EmptyShelfTargetPlace + "入料架,小车链条运行";
...@@ -179,57 +196,34 @@ namespace AGVControl ...@@ -179,57 +196,34 @@ namespace AGVControl
else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue)) else if (EmptyBackStep.IsTimeOut(15000, out double timeOutValue))
{ {
tryTimes++; tryTimes++;
if (tryTimes < 5) if (tryTimes < 3)
return this; return this;
// if(EmptyShelfTargetPlace.Equals(SettingString.A6)) tryTimes = 0;
// { EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
tryTimes = 0; runInfo = "双层线" + EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY); msg += runInfo;
runInfo = "双层线"+ EmptyShelfTargetPlace + "暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位"; EmptyBackStep.Msg = msg;
msg += runInfo; Common.MoveToNode(agv, SettingString.Standby);
EmptyBackStep.Msg = msg; UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
Common.MoveToNode(agv, SettingString.Standby);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
// }
//else if(EmptyShelfTargetPlace.Equals(SettingString.A5))
//{
// tryTimes = 0;
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_STANDBY);
// runInfo = "双层线A5暂不需要空料架,从[" + EmptyShelfTargetPlace + "]到待机位";
// msg += runInfo;
// EmptyBackStep.Msg = msg;
// Common.MoveToNode(agv, SettingString.Standby);
// UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
//}
//else
//{
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
//}
// EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.WAIT_AGV_REACH_A5A6);
//runInfo= "AGV到达 " + EmptyShelfTargetPlace + ",15秒后重新向双层线发送入料架请求[ReadyEnter]";
//msg += runInfo;
//EmptyBackStep.Msg = msg;
} }
} }
else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE)) else if (EmptyBackStep.IsStep(EMPTY_SHELF_BACK_STEP.WAIT__EMPTY_SHELF_IN_DOUBLE_LINE))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv,"Leave",CurTaskState)) if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{ {
//EmptyBackStep.ToNextStep(EMPTY_SHELF_BACK_STEP.END);
agv.RFID = ""; agv.RFID = "";
Job job = Common.control.GetJob(agv); Job job = Common.control.GetJob(agv);
if (job != null) if (job != null)
{ {
runInfo= "在双层线检测到任务,执行任务"; runInfo = "在双层线检测到任务,执行任务";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
return job; return job;
} }
else else
{ {
runInfo= "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位"; runInfo = "空料架进入" + EmptyShelfTargetPlace + "完成,暂无任务,回充电位";
msg += runInfo; msg += runInfo;
EmptyBackStep.Msg = msg; EmptyBackStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
...@@ -240,10 +234,7 @@ namespace AGVControl ...@@ -240,10 +234,7 @@ namespace AGVControl
} }
else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue)) else if (EmptyBackStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 runInfo = "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
runInfo= "空料架在[" + EmptyShelfTargetPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo;
//EmptyBackStep.Msg = msg;
} }
} }
...@@ -264,6 +255,10 @@ namespace AGVControl ...@@ -264,6 +255,10 @@ namespace AGVControl
/// </summary> /// </summary>
NONE, NONE,
/// <summary> /// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待AGV到达门 /// 等待AGV到达门
/// </summary> /// </summary>
WAIT_AGV_REACH_DOOR, WAIT_AGV_REACH_DOOR,
......
...@@ -176,7 +176,7 @@ namespace AGVControl ...@@ -176,7 +176,7 @@ namespace AGVControl
runInfo = "料架在" + LineName + "出去完成 [" + RFID + "]"; runInfo = "料架在" + LineName + "出去完成 [" + RFID + "]";
msg += runInfo; msg += runInfo;
EnterLeaveShelfStep.Msg = msg; EnterLeaveShelfStep.Msg = msg;
Common.DelEmptyShelfTask(LineName); Common.missionManager.DelMission(LineName,RFID);
return new EmptyShelfBackJob(LineName,eShelfType.BigShelf); return new EmptyShelfBackJob(LineName,eShelfType.BigShelf);
} }
else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue)) else if (EnterLeaveShelfStep.IsTimeOut(60000, out double timeOutValue))
......
...@@ -19,12 +19,13 @@ namespace AGVControl ...@@ -19,12 +19,13 @@ namespace AGVControl
/// </summary> /// </summary>
/// <param name="agvPlae">小车当前位置,空表示在待机位</param> /// <param name="agvPlae">小车当前位置,空表示在待机位</param>
/// <param name="palce">空料架位置点</param> /// <param name="palce">空料架位置点</param>
public GoEmptyShelfLineJob(string agvPlae, string palce) public GoEmptyShelfLineJob(string agvPlae, string palce, string rfid)
{ {
EmptyShelfPlace = palce; EmptyShelfPlace = palce;
this.agvPlae = agvPlae; this.agvPlae = agvPlae;
RFID = rfid;
} }
public string RFID { get; set; }
/// <summary> /// <summary>
/// 空料架位置点 /// 空料架位置点
/// </summary> /// </summary>
...@@ -56,54 +57,184 @@ namespace AGVControl ...@@ -56,54 +57,184 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "回收空料架任务:"+runInfo;
//runInfo = "回收空料架任务:";
int nodeIdx = Common.FindNode(EmptyShelfPlace); int nodeIdx = Common.FindNode(EmptyShelfPlace);
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st;
if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE)) if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.NONE))
{ {
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D if (agvPlae.StartsWith(SettingString.C4_Name_Prefix)&& Common.CheckIsInAirDoor(agvPlae) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门内->风淋门外
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "去空料架产线" + EmptyShelfPlace + ",先前往4D门[" + agvPlae + "->" + EmptyShelfPlace + "]"; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD); Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) || agvPlae.Equals(SettingString.AutoCharge)) else if (!Common.CheckIsInAirDoor(agvPlae) && Common.CheckIsInAirDoor(EmptyShelfPlace))//4C风淋门外->风淋门内
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR); if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
runInfo= "去空料架产线" + EmptyShelfPlace + ",先前往4C门[" + agvPlae + "->" + EmptyShelfPlace + "]"; {
msg += runInfo; if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
TakeEmptyStep.Msg = msg; {
Common.DoorMission(agv, SettingString.DoorDToC); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
} }
else if(agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix)) else//起始与目的地在风淋门同一侧
{ {
if(Common.Check4CTarget(agv, EmptyShelfPlace))//被占用 if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && Common.CheckIsInAirDoor(agvPlae) && Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门内
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位"; {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先过风淋门,再到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if(agvPlae.Equals("")|| (!Common.CheckIsInAirDoor(agvPlae)) && !Common.CheckIsInAirDoor(EmptyShelfPlace))//都在风淋门外
{
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if ((agvPlae.StartsWith(SettingString.D4_Name_Prefix) || agvPlae.StartsWith("A") || agvPlae.Equals(SettingString.Standby) ||
agvPlae.Equals(SettingString.AutoCharge))
&& EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4D->4C
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4C_DOOR);
runInfo = "去产线" + EmptyShelfPlace + ",先过4C门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else//4D->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
}
}
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_OUT_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
//4C风淋门内->风淋门外,到达风淋门外
if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.C4_Name_Prefix))//4C->4C
{
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "到风淋门外,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
}
else if (agvPlae.StartsWith(SettingString.C4_Name_Prefix) && EmptyShelfPlace.StartsWith(SettingString.D4_Name_Prefix))//4C->4D
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_4D_DOOR);
runInfo = "到风淋门外,去产线" + EmptyShelfPlace + ",先过4D门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv); Common.DoorMission(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else //都在风淋门内,到达风淋门外
else
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]"; runInfo = "到风淋门外,目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
} }
else }
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{ {
//4C风淋门外->风淋门内
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo= "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]"; runInfo = "到达风淋门内,开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
} }
...@@ -116,7 +247,7 @@ namespace AGVControl ...@@ -116,7 +247,7 @@ namespace AGVControl
if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用 if (Common.Check4CTarget(agv, EmptyShelfPlace))//被占用
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_TEMP_PLACE);
runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位"; runInfo = "目的地" + EmptyShelfPlace + "有小车占用,先到临时待机位" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.MoveTo4CStandy(agv); Common.MoveTo4CStandy(agv);
...@@ -124,10 +255,22 @@ namespace AGVControl ...@@ -124,10 +255,22 @@ namespace AGVControl
} }
else else
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); if(Common.CheckIsInAirDoor(EmptyShelfPlace))
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]"; {
msg += runInfo; TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_REACH_AIR_IN_DOOR);
TakeEmptyStep.Msg = msg; runInfo = "去产线" + EmptyShelfPlace + ",先过风淋门[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo;
TakeEmptyStep.Msg = msg;
}
} }
} }
} }
...@@ -139,7 +282,7 @@ namespace AGVControl ...@@ -139,7 +282,7 @@ namespace AGVControl
if (!Common.Check4CTarget(agv, EmptyShelfPlace))//未占用 if (!Common.Check4CTarget(agv, EmptyShelfPlace))//未占用
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]"; runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.DeleteStandyInfo(agv); Common.DeleteStandyInfo(agv);
...@@ -152,7 +295,7 @@ namespace AGVControl ...@@ -152,7 +295,7 @@ namespace AGVControl
if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState)) if (Common.CheckTaskFinished(agv, SettingString.DoorCToD, CurTaskState))
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]"; runInfo = "开始执行回收空料架任务[" + agvPlae + "->" + EmptyShelfPlace + "]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
} }
...@@ -163,7 +306,7 @@ namespace AGVControl ...@@ -163,7 +306,7 @@ namespace AGVControl
if (nodeIdx > -1) if (nodeIdx > -1)
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_AGV_START_TASK);
runInfo= "AGV 添加任务:移动到" + EmptyShelfPlace; runInfo = "AGV 添加任务:移动到" + EmptyShelfPlace + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
Common.MoveToNode(agv, EmptyShelfPlace); Common.MoveToNode(agv, EmptyShelfPlace);
...@@ -172,7 +315,7 @@ namespace AGVControl ...@@ -172,7 +315,7 @@ namespace AGVControl
else else
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.ASSIGN_AGV_TASK);
runInfo= EmptyShelfPlace + " 不存在或未开启调用"; runInfo = EmptyShelfPlace + " 不存在或未开启调用";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
} }
...@@ -182,7 +325,7 @@ namespace AGVControl ...@@ -182,7 +325,7 @@ namespace AGVControl
if (agv.CurTaskState.Equals(SettingString.Executing)) if (agv.CurTaskState.Equals(SettingString.Executing))
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
runInfo= "AGV开始向目的地[" + EmptyShelfPlace + "]移动"; runInfo = "AGV开始向目的地[" + EmptyShelfPlace + "]移动" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
} }
...@@ -202,7 +345,7 @@ namespace AGVControl ...@@ -202,7 +345,7 @@ namespace AGVControl
//else //else
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE);
runInfo= "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]"; runInfo = "AGV到达 " + EmptyShelfPlace + " 向产线发送出料架请求[ReadyLeave]" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
if (nodeIdx == -1) if (nodeIdx == -1)
...@@ -221,9 +364,9 @@ namespace AGVControl ...@@ -221,9 +364,9 @@ namespace AGVControl
} }
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE)) else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_LINE_RESPONSE))
{ {
if(nodeIdx==-1) if (nodeIdx == -1)
{ {
runInfo= EmptyShelfPlace + " 未开启调用"; runInfo = EmptyShelfPlace + " 未开启调用";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
return this; return this;
...@@ -235,7 +378,7 @@ namespace AGVControl ...@@ -235,7 +378,7 @@ namespace AGVControl
if (!agv.CurTaskName.Equals("Enter")) if (!agv.CurTaskName.Equals("Enter"))
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF);
runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行"; runInfo = "收到产线出料请求[ReadyLeave]的响应 " + EmptyShelfPlace + "出料架,小车链条运行" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
//agv.RFID = node.RFID; //agv.RFID = node.RFID;
...@@ -247,9 +390,6 @@ namespace AGVControl ...@@ -247,9 +390,6 @@ namespace AGVControl
else if (TakeEmptyStep.IsTimeOut(15000, out double timeOutValue)) else if (TakeEmptyStep.IsTimeOut(15000, out double timeOutValue))
{ {
TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE); TakeEmptyStep.ToNextStep(TAKE_EMPTY_STEP.WAIT_REACH_PLACE);
//runInfo = "AGV到达 " + EmptyShelfPlace + ",15秒后重新向产线发送出料架请求[ReadyLeave]";
//msg += runInfo;
//TakeEmptyStep.Msg = msg;
} }
} }
else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF)) else if (TakeEmptyStep.IsStep(TAKE_EMPTY_STEP.WAIT_TAKE_EMPTY_SHELF))
...@@ -258,19 +398,19 @@ namespace AGVControl ...@@ -258,19 +398,19 @@ namespace AGVControl
if (Common.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState)) if (Common.CheckEnterOrLeaveFinished(agv, "Enter", CurTaskState))
{ {
ClientNode node = Common.nodeInfo[nodeIdx]; ClientNode node = Common.nodeInfo[nodeIdx];
node.AgvName = "";
//回收空料架数量减少1 //回收空料架数量减少1
Common.DelEmptyShelfTask(EmptyShelfPlace); Common.missionManager.DelMission(EmptyShelfPlace, RFID);
runInfo= "空料架在[" + EmptyShelfPlace + "]进入小车完成"; if (!agvPlae.Equals(SettingString.D4FeederOut) && !agvPlae.Equals(SettingString.C4FeederOut))
AGVManager.ClearRFID(EmptyShelfPlace, RFID);
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车完成" + "[RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
TakeEmptyStep.Msg = msg; TakeEmptyStep.Msg = msg;
//4DfeederOut默认大料架 //4DfeederOut默认大料架
if (agv.Place.Equals(SettingString.D4FeederOut)) if (agv.Place.Equals(SettingString.D4FeederOut))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf); return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
if (agv.Place.Equals(SettingString.C4FeederOut))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
else if (agv.RFID.StartsWith("D")) else if (agv.RFID.StartsWith("D"))
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf); return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.SmallShelf);
}
else if (agv.RFID.StartsWith("C")) else if (agv.RFID.StartsWith("C"))
{ {
return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf); return new EmptyShelfBackJob(EmptyShelfPlace, eShelfType.BigShelf);
...@@ -281,8 +421,8 @@ namespace AGVControl ...@@ -281,8 +421,8 @@ namespace AGVControl
else if (TakeEmptyStep.IsTimeOut(60000, out double timeOutValue)) else if (TakeEmptyStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 //链条停止
runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况"; runInfo = "空料架在[" + EmptyShelfPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况" + "[RFID=" + RFID + "]";
// msg += runInfo; // msg += runInfo;
//TakeEmptyStep.Msg = msg; //TakeEmptyStep.Msg = msg;
} }
...@@ -306,6 +446,14 @@ namespace AGVControl ...@@ -306,6 +446,14 @@ namespace AGVControl
/// </summary> /// </summary>
NONE, NONE,
/// <summary> /// <summary>
/// 等待到达4C风淋门内
/// </summary>
WAIT_AGV_REACH_AIR_IN_DOOR,
/// <summary>
/// 等待到达4C风淋门外
/// </summary>
WAIT_AGV_REACH_AIR_OUT_DOOR,
/// <summary>
/// 等待到达4C门 /// 等待到达4C门
/// </summary> /// </summary>
WAIT_AGV_REACH_4C_DOOR, WAIT_AGV_REACH_4C_DOOR,
......
...@@ -56,7 +56,8 @@ namespace AGVControl ...@@ -56,7 +56,8 @@ namespace AGVControl
{ {
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.Msg = runInfo; agv.Msg = "去云仓接满料任务:"+runInfo;
//runInfo = "去云仓接满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st; // CurTaskState = st;
if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE)) if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.NONE))
...@@ -89,7 +90,7 @@ namespace AGVControl ...@@ -89,7 +90,7 @@ namespace AGVControl
} }
else if (input != null && !input[3]) else if (input != null && !input[3])
{ {
if (agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务 if (agvPlace.Equals("") || agvPlace.Equals(SettingString.Standby) || agvPlace.StartsWith(SettingString.AutoCharge))//待机位/充电位接到任务
{ {
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6); GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_A6);
runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace; runInfo = "无负载,准备运动到入料口" + FullShelfStationPlace;
...@@ -98,6 +99,15 @@ namespace AGVControl ...@@ -98,6 +99,15 @@ namespace AGVControl
Common.MoveToNode(agv, FullShelfStationPlace); Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if (Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间 else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{ {
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR); GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
...@@ -132,6 +142,15 @@ namespace AGVControl ...@@ -132,6 +142,15 @@ namespace AGVControl
Common.MoveToNode(agv, FullShelfStationPlace); Common.MoveToNode(agv, FullShelfStationPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
} }
else if(Common.CheckIsInAirDoor(agvPlace))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "在4C风淋门内,先过风淋门";
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirOut);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间 else if (agvPlace.StartsWith(SettingString.C4_Name_Prefix))//4C车间
{ {
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR); GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
...@@ -147,6 +166,20 @@ namespace AGVControl ...@@ -147,6 +166,20 @@ namespace AGVControl
} }
} }
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirOut, CurTaskState))
{
GoFullShelfStationStep.ToNextStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "过风淋门,向4D门运行,再到双层线入料口" + FullShelfStationPlace;
msg += runInfo;
GoFullShelfStationStep.Msg = msg;
Common.MoveToNode(agv, SettingString.DoorCToD);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR)) else if (GoFullShelfStationStep.IsStep(GO_FULL_SHELF_STATION_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -268,17 +301,12 @@ namespace AGVControl ...@@ -268,17 +301,12 @@ namespace AGVControl
runInfo = FullShelfStationPlace + "满料架进入小车完成"; runInfo = FullShelfStationPlace + "满料架进入小车完成";
msg += runInfo; msg += runInfo;
GoFullShelfStationStep.Msg = msg; GoFullShelfStationStep.Msg = msg;
//if (FullShelfDestInfo.location.StartsWith("G"))
//{
// return new SendFullShelfToLineJob(FullShelfDestInfo, true);
//}
//else
return new SendFullShelfToLineJob(FullShelfDestInfo); return new SendFullShelfToLineJob(FullShelfDestInfo);
} }
else if (GoFullShelfStationStep.IsTimeOut(60000, out double timeOutValue)) else if (GoFullShelfStationStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 //链条停止
runInfo= "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况"; runInfo = "满料架在[" + FullShelfStationPlace + "]进入小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架进入小车的情况";
//msg +=runInfo; //msg +=runInfo;
//GoFullShelfStationStep.Msg = msg; //GoFullShelfStationStep.Msg = msg;
} }
...@@ -303,6 +331,10 @@ namespace AGVControl ...@@ -303,6 +331,10 @@ namespace AGVControl
/// </summary> /// </summary>
WAIT_CHECK_RESULT, WAIT_CHECK_RESULT,
/// <summary> /// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待AGV到达门 /// 等待AGV到达门
/// </summary> /// </summary>
WAIT_AGV_REACH_DOOR, WAIT_AGV_REACH_DOOR,
......
...@@ -60,16 +60,17 @@ namespace AGVControl ...@@ -60,16 +60,17 @@ namespace AGVControl
string msg = agv.Name + " "; string msg = agv.Name + " ";
bool rtn = false; bool rtn = false;
agv.RFID = RFID; agv.RFID = RFID;
agv.Msg = runInfo; agv.Msg = "送满料任务:"+runInfo;
//runInfo = "送满料任务:";
//if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st)) //if (!CurTaskID.Equals(-1) && Common.mir.Get_Task_State(CurTaskID, out string st))
// CurTaskState = st; // CurTaskState = st;
if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.NONE)) if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.NONE))
{ {
AGVManager.AgvRemoveRfid(RFID);
if (FullShelfPlace.StartsWith(SettingString.C4_Name_Prefix)) if (FullShelfPlace.StartsWith(SettingString.C4_Name_Prefix))
{ {
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR);
runInfo = "满料架前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "前往4C门,从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorDToC); Common.DoorMission(agv, SettingString.DoorDToC);
...@@ -78,7 +79,7 @@ namespace AGVControl ...@@ -78,7 +79,7 @@ namespace AGVControl
else else
{ {
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace); Common.MoveToNode(agv, FullShelfPlace);
...@@ -86,7 +87,6 @@ namespace AGVControl ...@@ -86,7 +87,6 @@ namespace AGVControl
} }
} }
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR)) else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_DOOR))
{ {
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
...@@ -103,14 +103,39 @@ namespace AGVControl ...@@ -103,14 +103,39 @@ namespace AGVControl
} }
else else
{ {
if(Common.CheckIsInAirDoor(FullShelfPlace))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
runInfo = "到达4C门,过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
}
}
}
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR))
{
CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckTaskFinished(agv, SettingString.DoorAirIn, CurTaskState))
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "满料架从双层线A6送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; runInfo = "送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
Common.MoveToNode(agv, FullShelfPlace); Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
} }
} }
else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE)) else if (SendFullShelfStep.IsStep(SEND_FULL_SHELF_STEP.WAIT_REACH_TEMP_PLACE))
...@@ -120,13 +145,25 @@ namespace AGVControl ...@@ -120,13 +145,25 @@ namespace AGVControl
{ {
if (!Common.Check4CTarget(agv, FullShelfPlace))//未占用 if (!Common.Check4CTarget(agv, FullShelfPlace))//未占用
{ {
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE); if (Common.CheckIsInAirDoor(FullShelfPlace))
runInfo = "满料架从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]"; {
msg += runInfo; SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_AIR_DOOR);
SendFullShelfStep.Msg = msg; runInfo = "到临时待机位,去产线先过风淋门[" + FullShelfPlace + "][RFID=" + RFID + "]";
Common.DeleteStandyInfo(agv); msg += runInfo;
Common.MoveToNode(agv, FullShelfPlace); SendFullShelfStep.Msg = msg;
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID); Common.DoorMission(agv, SettingString.DoorAirIn);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
else
{
SendFullShelfStep.ToNextStep(SEND_FULL_SHELF_STEP.WAIT_AGV_REACH_LINE);
runInfo = "从临时待机位送往[" + FullShelfPlace + "][RFID=" + RFID + "]";
msg += runInfo;
SendFullShelfStep.Msg = msg;
Common.DeleteStandyInfo(agv);
Common.MoveToNode(agv, FullShelfPlace);
UpdateJobTaskInfo(agv.CurTaskName, agv.CurTaskID);
}
} }
} }
} }
...@@ -226,7 +263,7 @@ namespace AGVControl ...@@ -226,7 +263,7 @@ namespace AGVControl
CurTaskState = Common.GetTakJobState(CurTaskID); CurTaskState = Common.GetTakJobState(CurTaskID);
if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState)) if (Common.CheckEnterOrLeaveFinished(agv, "Leave", CurTaskState))
{ {
runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]"; runInfo = "满料进入" + FullShelfPlace + "完成 [RFID=" + RFID + "] [" + agv.BoxDestInfo + "]";
msg += runInfo; msg += runInfo;
SendFullShelfStep.Msg = msg; SendFullShelfStep.Msg = msg;
agv.RFID = ""; agv.RFID = "";
...@@ -237,7 +274,7 @@ namespace AGVControl ...@@ -237,7 +274,7 @@ namespace AGVControl
else if (SendFullShelfStep.IsTimeOut(60000, out double timeOutValue)) else if (SendFullShelfStep.IsTimeOut(60000, out double timeOutValue))
{ {
//链条停止 //链条停止
runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况"; runInfo = "满料在[" + FullShelfPlace + "]离开小车超时[" + timeOutValue.ToString("f1") + "秒],请检查料架离开小车的情况";
//msg += runInfo; //msg += runInfo;
//SendFullShelfStep.Msg = msg; //SendFullShelfStep.Msg = msg;
} }
...@@ -270,6 +307,10 @@ namespace AGVControl ...@@ -270,6 +307,10 @@ namespace AGVControl
/// </summary> /// </summary>
WAIT_REACH_TEMP_PLACE, WAIT_REACH_TEMP_PLACE,
/// <summary> /// <summary>
/// 等待到达4C风淋门
/// </summary>
WAIT_AGV_REACH_AIR_DOOR,
/// <summary>
/// 等待小车到达目的地 /// 等待小车到达目的地
/// </summary> /// </summary>
WAIT_AGV_REACH_LINE, WAIT_AGV_REACH_LINE,
......
...@@ -32,11 +32,6 @@ namespace AGVControl ...@@ -32,11 +32,6 @@ namespace AGVControl
} }
/// <summary> /// <summary>
/// 小车名称
/// </summary>
public string AgvName { set; get; }
/// <summary>
/// 线体名(佳世达) /// 线体名(佳世达)
/// </summary> /// </summary>
public string LineName { set; get; } public string LineName { set; get; }
...@@ -54,24 +49,20 @@ namespace AGVControl ...@@ -54,24 +49,20 @@ namespace AGVControl
/// 节点位置坐标 /// 节点位置坐标
/// </summary> /// </summary>
public PositionStru position; public PositionStru position;
/// <summary> /// <summary>
/// 空料架数量 /// 料架数量信息
/// </summary> /// </summary>
public int EmptyShelfCnt public int EmptyShelfCnt
{ {
get { return _EmptyShelfCnt; } get
set
{ {
EmptyShelfCnt = _EmptyShelfCnt; if(Common.missionManager !=null && Common.missionManager.GetUnlockInfo(Name) !=null)
} {
return Common.missionManager.GetUnlockCnt(Name);
}
return 0;
}
} }
/// <summary>
/// 空架子的RFID
/// </summary>
public List<string> EmptyShelfRFIDs;
private int _EmptyShelfCnt = 0;
public string AliceName { get; set; } public string AliceName { get; set; }
/// <summary> /// <summary>
/// 客户端节点 /// 客户端节点
...@@ -79,21 +70,18 @@ namespace AGVControl ...@@ -79,21 +70,18 @@ namespace AGVControl
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="ip"></param> /// <param name="ip"></param>
/// <param name="isUse"></param> /// <param name="isUse"></param>
public ClientNode(string name, string ip, string aliceName,string lineName, string pos_name, string pos_guid, bool isUse,int emptyCnt) : base(name, ip, isUse) public ClientNode(string name, string ip, string aliceName, string lineName, string pos_name, string pos_guid, bool isUse, int emptyCnt) : base(name, ip, isUse)
{ {
AliceName = aliceName; AliceName = aliceName;
RFID = rfid; RFID = rfid;
AgvName = "";
Online = false; Online = false;
IsUse = isUse; IsUse = isUse;
_EmptyShelfCnt = emptyCnt;
this.Pos_name = pos_name; this.Pos_name = pos_name;
this.Pos_guid = pos_guid; this.Pos_guid = pos_guid;
LineName = lineName; LineName = lineName;
EmptyShelfRFIDs = new List<string>();
} }
public string WarnMsg { get; set; } = "";
/// <summary> /// <summary>
/// 客户端节点 /// 客户端节点
/// </summary> /// </summary>
...@@ -106,41 +94,8 @@ namespace AGVControl ...@@ -106,41 +94,8 @@ namespace AGVControl
RFID = rfid; RFID = rfid;
nodeStatus = status; nodeStatus = status;
AgvName = "";
} }
/// <summary>
///空料架数量增加,如果RFID相同,不增加数量
/// </summary>
public void IncreEmptyShelfCnt(string rfid="")
{
if(!rfid.Equals("") && !EmptyShelfRFIDs.Contains(rfid))
{
System.Threading.Interlocked.Increment(ref _EmptyShelfCnt);
EmptyShelfRFIDs.Add(rfid);
Common.WriteIni(Name, SettingString.EmptyShelfCnt,_EmptyShelfCnt.ToString());
}
else if(rfid.Equals(""))
{
System.Threading.Interlocked.Increment(ref _EmptyShelfCnt);
Common.WriteIni(Name, SettingString.EmptyShelfCnt, _EmptyShelfCnt.ToString());
}
}
/// <summary>
/// 空料架数量减少1
/// </summary>
public void DecreEmptyShelfCnt()
{
if (_EmptyShelfCnt > 0)
{
System.Threading.Interlocked.Decrement(ref _EmptyShelfCnt);
Common.WriteIni(Name, SettingString.EmptyShelfCnt, _EmptyShelfCnt.ToString());
}
if(_EmptyShelfCnt.Equals(0) && EmptyShelfRFIDs.Count>0)
{
EmptyShelfRFIDs.Clear();
}
}
/// <summary> /// <summary>
/// 节点状态的文本形式 /// 节点状态的文本形式
/// </summary> /// </summary>
...@@ -163,11 +118,11 @@ namespace AGVControl ...@@ -163,11 +118,11 @@ namespace AGVControl
s[3] = nodeStatus.ToString(); s[3] = nodeStatus.ToString();
s[4] = ClientLevel.ToString(); s[4] = ClientLevel.ToString();
s[5] = RFID; s[5] = RFID;
// s[5] = AgvName; // s[5] = AgvName;
// } // }
s[6] = Online ? "在线" : "离线"; s[6] = Online ? "在线" : "离线";
s[7] = IsUse ? "是" : "否"; s[7] = IsUse ? "是" : "否";
// s[8] = "清除"; // s[8] = "清除";
return s; return s;
} }
...@@ -178,7 +133,6 @@ namespace AGVControl ...@@ -178,7 +133,6 @@ namespace AGVControl
{ {
RFID = "00"; RFID = "00";
nodeStatus = eNodeStatus.None; nodeStatus = eNodeStatus.None;
AgvName = "";
Online = false; Online = false;
} }
......
...@@ -30,19 +30,17 @@ namespace AGVControl ...@@ -30,19 +30,17 @@ namespace AGVControl
return null; return null;
//执行空料架任务的小车数量 //执行空料架任务的小车数量
int emptyJobCnt = 0; int emptyJobCnt = 0;
string rfid = "";
foreach (Agv_Info agv in Common.agvInfo) foreach (Agv_Info agv in Common.agvInfo)
{ {
if (!SettingString.C4_AGV_IPs.Contains(agv.IP)) if (!SettingString.C4_AGV_IPs.Contains(agv.IP))
continue; continue;
if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob) if (agv.CurJob is GoEmptyShelfLineJob || (agv.CurJob is EmptyShelfBackJob))
{ {
emptyJobCnt++; emptyJobCnt++;
} }
} }
if ((SettingString.AGVCNT - emptyJobCnt).Equals(2))//保留2辆小车出满料架
{
return null;
}
//出工单料的目的地是否有空料架 //出工单料的目的地是否有空料架
if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName)) if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName))
{ {
...@@ -60,7 +58,8 @@ namespace AGVControl ...@@ -60,7 +58,8 @@ namespace AGVControl
} }
if (cnt < clientNode.EmptyShelfCnt) if (cnt < clientNode.EmptyShelfCnt)
{ {
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName); if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName, rfid);
} }
} }
...@@ -73,7 +72,11 @@ namespace AGVControl ...@@ -73,7 +72,11 @@ namespace AGVControl
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName));
if (i == -1) if (i == -1)
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName); {
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(emptyNodeName));
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
}
} }
} }
...@@ -83,13 +86,43 @@ namespace AGVControl ...@@ -83,13 +86,43 @@ namespace AGVControl
if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP)) if (SettingString.C4_AGV_IPs.Contains(currentAgv.IP))
{ {
ClientNode node = Common.nodeInfo.Find(s => s.Name.Equals(SettingString.A6)
&& (s.StateEquals(eNodeStatus.NeedLeave) || s.StateEquals(eNodeStatus.NeedEnterLeave)) && !s.RFID.Equals("00"));
if (node != null && node.Name.Equals(SettingString.A6))
{
if (AGVManager.FindFullShelfTarget(node.RFID, out AGVManager.BoxDestInfo boxDestInfo))
{
if (boxDestInfo != null)
{
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(boxDestInfo.location));
if (!Common.CheckStationState(clientNode))
{
return null;
}
}
}
}
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoFullShelfStationJob && !s.IP.Equals(currentAgv.IP)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoFullShelfStationJob && !s.IP.Equals(currentAgv.IP));
if (i == -1) if (i == -1)
return new GoFullShelfStationJob(currentAgv.Place); return new GoFullShelfStationJob(currentAgv.Place);
} }
} }
return null; return null;
} }
/// <summary>
/// 控制出空架小车数量
/// </summary>
/// <param name="emptytASKAGV"></param>
/// <returns></returns>
private bool CanEmptyTask(int emptytASKAGV)
{
if ((SettingString.AGVCNT / 2 - emptytASKAGV).Equals(2))//保留1辆小车出满料架
{
return false;
}
return true;
}
} }
} }
...@@ -33,19 +33,16 @@ namespace AGVControl ...@@ -33,19 +33,16 @@ namespace AGVControl
return null; return null;
//执行空料架任务的小车数量 //执行空料架任务的小车数量
int emptyJobCnt = 0; int emptyJobCnt = 0;
string rfid = "";
foreach (Agv_Info agv in Common.agvInfo) foreach (Agv_Info agv in Common.agvInfo)
{ {
if (SettingString.C4_AGV_IPs.Contains(agv.IP)) if (SettingString.C4_AGV_IPs.Contains(agv.IP))
continue; continue;
if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob) if (agv.CurJob is GoEmptyShelfLineJob || agv.CurJob is EmptyShelfBackJob)//
{ {
emptyJobCnt++; emptyJobCnt++;
} }
} }
if ((SettingString.AGVCNT / 2 - emptyJobCnt).Equals(1))//保留1辆小车出满料架
{
return null;
}
//出工单料的目的地是否有空料架 //出工单料的目的地是否有空料架
if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName)) if (Common.FindEmptyShelfBeforeSendFullShelf(out string nodeName))
{ {
...@@ -65,7 +62,9 @@ namespace AGVControl ...@@ -65,7 +62,9 @@ namespace AGVControl
} }
if (cnt < clientNode.EmptyShelfCnt) if (cnt < clientNode.EmptyShelfCnt)
{ {
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName);
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, nodeName, rfid);
} }
} }
...@@ -77,7 +76,11 @@ namespace AGVControl ...@@ -77,7 +76,11 @@ namespace AGVControl
{ {
int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName)); int i = Common.agvInfo.FindIndex(s => s.CurJob is GoEmptyShelfLineJob && ((GoEmptyShelfLineJob)s.CurJob).EmptyShelfPlace.Equals(emptyNodeName));
if (i == -1) if (i == -1)
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName); {
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(emptyNodeName));
if (Common.CheckStationState(clientNode, out rfid) && CanEmptyTask(emptyJobCnt))
return new GoEmptyShelfLineJob(currentAgv.Place, emptyNodeName, rfid);
}
} }
} }
...@@ -100,6 +103,11 @@ namespace AGVControl ...@@ -100,6 +103,11 @@ namespace AGVControl
{ {
if (boxDestInfo != null) if (boxDestInfo != null)
{ {
ClientNode clientNode = Common.nodeInfo.Find(s => s.Name.Equals(boxDestInfo.location));
if (!Common.CheckStationState(clientNode))
{
return null;
}
i = Common.agvInfo.FindIndex(s => s.CurJob is SendFullShelfToLineJob && !s.IP.Equals(currentAgv.IP) i = Common.agvInfo.FindIndex(s => s.CurJob is SendFullShelfToLineJob && !s.IP.Equals(currentAgv.IP)
&& ((SendFullShelfToLineJob)s.CurJob).FullShelfPlace.Equals(boxDestInfo.location)); && ((SendFullShelfToLineJob)s.CurJob).FullShelfPlace.Equals(boxDestInfo.location));
if (i > -1) if (i > -1)
...@@ -114,5 +122,18 @@ namespace AGVControl ...@@ -114,5 +122,18 @@ namespace AGVControl
return null; return null;
} }
/// <summary>
/// 控制出空架小车数量
/// </summary>
/// <param name="emptytASKAGV"></param>
/// <returns></returns>
private bool CanEmptyTask(int emptytASKAGV)
{
if ((SettingString.AGVCNT / 2 - emptytASKAGV).Equals(1))//保留1辆小车出满料架
{
return false;
}
return true;
}
} }
} }
...@@ -18,13 +18,17 @@ ...@@ -18,13 +18,17 @@
</layout> </layout>
</appender> </appender>
<appender name="LineWebService" type="log4net.Appender.RollingFileAppender"> <appender name="LineWebService" type="log4net.Appender.RollingFileAppender">
<file value="logs/LineWebService.log"/> <file value="logs/UnlockInfo.log"/>
<param name="Encoding" value="UTF-8"/> <param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/> <appendToFile value="true"/>
<rollingStyle value="Date"/> <param name="MaxSizeRollBackups" value="10" />
<datePattern value="yyyy-MM-dd"/> <!-- 切割最多文件数 -->
<param name="MaximumFileSize" value="100MB" />
<!-- 每个文件的大小 -->
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout"> <layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/> <conversionPattern value="[%date]%-5p %m%n"/>
</layout> </layout>
</appender> </appender>
<logger name ="LineWebService"> <logger name ="LineWebService">
...@@ -43,7 +47,8 @@ ...@@ -43,7 +47,8 @@
<add key="FLEET" value="10.85.199.3" /> <add key="FLEET" value="10.85.199.3" />
<add key="AutoCharge" value="True" /> <add key="AutoCharge" value="True" />
<add key="ChargeWait" value="1" /> <add key="ChargeWait" value="1" />
<add key="ChargeThreshold" value="20,70" /> <add key="ChargeThreshold" value="20,90" />
<add key="IP_4D_Light" value="10.85.196.40:8088" />
<add key="IP_4C_Light" value="10.85.197.40:8088" />
</appSettings> </appSettings>
</configuration> </configuration>
\ No newline at end of file \ No newline at end of file
...@@ -15,8 +15,8 @@ D12,D12,10.85.199.183,4D-12,DL12,d6e0b92a-b432-11ea-a1a5-00012999830e ...@@ -15,8 +15,8 @@ D12,D12,10.85.199.183,4D-12,DL12,d6e0b92a-b432-11ea-a1a5-00012999830e
D14,D14,10.85.199.184,4D-14线,DL14,efb04c55-b432-11ea-a1a5-00012999830e D14,D14,10.85.199.184,4D-14线,DL14,efb04c55-b432-11ea-a1a5-00012999830e
D15,D15,10.85.199.185,4D-15线,DL15,fd6b1f95-b432-11ea-a1a5-00012999830e D15,D15,10.85.199.185,4D-15线,DL15,fd6b1f95-b432-11ea-a1a5-00012999830e
D16,D16,10.85.199.96,4D-16线,line_16,ac6c413e-895e-11ea-9374-000129922ca6 D16,D16,10.85.199.96,4D-16线,line_16,ac6c413e-895e-11ea-9374-000129922ca6
FeederIn,FeederIn,10.85.199.1,4D-FeedeerIn,FI,1e546c3a-8abe-11ea-ab63-000129922ca6 FeederIn,D21,10.85.199.1,4D-FeedeerIn,FI,1e546c3a-8abe-11ea-ab63-000129922ca6
FeederOut,FeederOut,10.85.199.1,4D-FeederOut,FO,431649a4-8abe-11ea-ab63-000129922ca6 FeederOut,D22,10.85.199.1,4D-FeederOut,FO,431649a4-8abe-11ea-ab63-000129922ca6
C1,C1,10.85.199.50,4C-1线,G1,d402fbc2-cdac-11ea-a3e4-94c691a7387d C1,C1,10.85.199.50,4C-1线,G1,d402fbc2-cdac-11ea-a3e4-94c691a7387d
C2,C2,10.85.199.51,4C-2线,G2,ce0d60e9-cdac-11ea-a3e4-94c691a7387d C2,C2,10.85.199.51,4C-2线,G2,ce0d60e9-cdac-11ea-a3e4-94c691a7387d
C3,C3,10.85.199.52,4C-3线,G3,c768170a-cdac-11ea-a3e4-94c691a7387d C3,C3,10.85.199.52,4C-3线,G3,c768170a-cdac-11ea-a3e4-94c691a7387d
...@@ -29,5 +29,5 @@ C9,C9,10.85.199.62,4C-9,G9,a64bdbbb-cdac-11ea-a3e4-94c691a7387d ...@@ -29,5 +29,5 @@ C9,C9,10.85.199.62,4C-9,G9,a64bdbbb-cdac-11ea-a3e4-94c691a7387d
C10,C10,10.85.199.59,4C-10线,G10,604b1c3c-ca4e-11ea-810b-00012999830e C10,C10,10.85.199.59,4C-10线,G10,604b1c3c-ca4e-11ea-810b-00012999830e
C14,C14,10.85.199.60,4C-14线,G14,07841fc6-d0d4-11ea-a3e4-94c691a7387d C14,C14,10.85.199.60,4C-14线,G14,07841fc6-d0d4-11ea-a3e4-94c691a7387d
C15,C15,10.85.199.61,4C-15线,G15,0efca2c6-d0d4-11ea-a3e4-94c691a7387d C15,C15,10.85.199.61,4C-15线,G15,0efca2c6-d0d4-11ea-a3e4-94c691a7387d
4CFeederIn,4CFeederIn,10.85.199.1,4C-FeederIn,G21,cb7f117b-ca88-11ea-9b28-0001299981d4 4CFeederIn,C21,10.85.199.1,4C-FeederIn,G21,cb7f117b-ca88-11ea-9b28-0001299981d4
4CFeederOut,4CFeederOut,10.85.199.1,4C-FeederOut,G22,0fcf606c-d417-11ea-9b6b-0001299981d4 4CFeederOut,C22,10.85.199.1,4C-FeederOut,G22,0fcf606c-d417-11ea-9b6b-0001299981d4
2020-11-03 14:08:42,D1
2020-11-03 14:10:26,D1
2020-11-03 14:12:43,D1
2020-11-03 14:20:20,D1
2020-11-03 14:22:26,D1
2020-11-03 14:22:31,D1
2020-11-03 14:22:37,D1
2020-11-03 14:22:48,D1
2020-11-03 14:22:59,D1
{"NodeUnlockMissions":{"D1":{"NodeName":"D1","EmptyCnt":0,"Rfids":{}},"D2":{"NodeName":"D2","EmptyCnt":1,"Rfids":{"D4":"2020/12/06/11:51:42,731"}},"D3":{"NodeName":"D3","EmptyCnt":1,"Rfids":{"D3":"2020/12/05/22:50:48,047"}},"D4":{"NodeName":"D4","EmptyCnt":0,"Rfids":{}},"D5":{"NodeName":"D5","EmptyCnt":0,"Rfids":{}},"D6":{"NodeName":"D6","EmptyCnt":0,"Rfids":{}},"D8":{"NodeName":"D8","EmptyCnt":0,"Rfids":{}},"D9":{"NodeName":"D9","EmptyCnt":0,"Rfids":{}},"D10":{"NodeName":"D10","EmptyCnt":0,"Rfids":{}},"D11":{"NodeName":"D11","EmptyCnt":0,"Rfids":{}},"D12":{"NodeName":"D12","EmptyCnt":0,"Rfids":{}},"D14":{"NodeName":"D14","EmptyCnt":0,"Rfids":{}},"D15":{"NodeName":"D15","EmptyCnt":0,"Rfids":{}},"D16":{"NodeName":"D16","EmptyCnt":0,"Rfids":{}},"D22":{"NodeName":"D22","EmptyCnt":0,"Rfids":{}},"C1":{"NodeName":"C1","EmptyCnt":0,"Rfids":{}},"C2":{"NodeName":"C2","EmptyCnt":0,"Rfids":{}},"C3":{"NodeName":"C3","EmptyCnt":0,"Rfids":{}},"C4":{"NodeName":"C4","EmptyCnt":0,"Rfids":{}},"C5":{"NodeName":"C5","EmptyCnt":0,"Rfids":{}},"C6":{"NodeName":"C6","EmptyCnt":0,"Rfids":{}},"C7":{"NodeName":"C7","EmptyCnt":0,"Rfids":{}},"C8":{"NodeName":"C8","EmptyCnt":0,"Rfids":{}},"C9":{"NodeName":"C9","EmptyCnt":0,"Rfids":{}},"C10":{"NodeName":"C10","EmptyCnt":0,"Rfids":{}},"C14":{"NodeName":"C14","EmptyCnt":0,"Rfids":{}},"C15":{"NodeName":"C15","EmptyCnt":0,"Rfids":{}},"C22":{"NodeName":"C22","EmptyCnt":0,"Rfids":{}}}}
[D3]
EmptyShelfCnt=1
[MiR_R1763] [MiR_R1763]
RFID= RFID=
[MiR_R1764] [MiR_R1764]
...@@ -10,5 +12,5 @@ RFID= ...@@ -10,5 +12,5 @@ RFID=
RFID= RFID=
[MiR_R1580] [MiR_R1580]
RFID= RFID=
[D1] [D2]
EmptyShelfCnt=9 EmptyShelfCnt=1
ce147cdc7d5f84ac5eea7abfb5866dce563042b6 c1dcc8c90bc02014bb2dcb74bc1a4ab9d348762e
...@@ -70,5 +70,5 @@ E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLi ...@@ -70,5 +70,5 @@ E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLi
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.CopyComplete E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csproj.CopyComplete
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.exe E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.exe
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.pdb E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.pdb
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
C:\myproject\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache C:\myproject\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
E:\Neotel\Projects\Gitee\AGVControl-Qisda-ProductionLine\AGVControl-ProductionLine\obj\Debug\AGVControl-ProductionLine.csprojAssemblyReference.cache
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!