Commit 112cb683 顾剑亮

添加json日志

1 个父辈 91b4f973
正在显示 126 个修改的文件 包含 1012 行增加6413 行删除
......@@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30413.136
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AGVControl_Steel(old)", "AGVControl_Steel\AGVControl_Steel(old).csproj", "{BE830571-6737-4FA7-A75B-0242B07E011C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{752A054D-58EC-460A-A936-F5483B1BC8B2}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BLL", "BLL\BLL.csproj", "{C547FEDD-0B62-4AC3-96E7-C86DD38C670B}"
......@@ -21,10 +19,6 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BE830571-6737-4FA7-A75B-0242B07E011C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE830571-6737-4FA7-A75B-0242B07E011C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BE830571-6737-4FA7-A75B-0242B07E011C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE830571-6737-4FA7-A75B-0242B07E011C}.Release|Any CPU.Build.0 = Release|Any CPU
{752A054D-58EC-460A-A936-F5483B1BC8B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{752A054D-58EC-460A-A936-F5483B1BC8B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{752A054D-58EC-460A-A936-F5483B1BC8B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
......
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{BE830571-6737-4FA7-A75B-0242B07E011C}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>AGVControl_Steel</RootNamespace>
<AssemblyName>AGVControl_Steel</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<LangVersion>preview</LangVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<DocumentationFile>
</DocumentationFile>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>图标.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="ClassFormParent">
<HintPath>..\..\ClassFormParent\ClassFormParent\bin\Debug\ClassFormParent.dll</HintPath>
</Reference>
<Reference Include="log4net">
<HintPath>..\..\..\..\DLL\log4net.dll</HintPath>
</Reference>
<Reference Include="Microsoft.VisualBasic" />
<Reference Include="RestSharp, Version=106.11.4.0, Culture=neutral, PublicKeyToken=598062e77f915f75, processorArchitecture=MSIL">
<HintPath>..\packages\RestSharp.106.11.4\lib\net452\RestSharp.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.Runtime.Serialization" />
<Reference Include="System.ServiceModel" />
<Reference Include="System.ServiceModel.Web" />
<Reference Include="System.Web" />
<Reference Include="System.Web.Extensions" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="BLL\Control.cs" />
<Compile Include="BLL\Common.cs" />
<Compile Include="Job\MissionMoveJob.cs" />
<Compile Include="Model\MissionState.cs" />
<Compile Include="Model\MiR_API.cs" />
<Compile Include="Job\TakeOldJob.cs" />
<Compile Include="Job\ChargeJob.cs" />
<Compile Include="Model\AgvInfo.cs" />
<Compile Include="Job\SendNewJob.cs" />
<Compile Include="Job\StorageJob.cs" />
<Compile Include="UI\FrmMain.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="UI\FrmMain.Designer.cs">
<DependentUpon>FrmMain.cs</DependentUpon>
</Compile>
<Compile Include="Model\JobStep.cs" />
<Compile Include="Model\Job.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Job\StandbyJob.cs" />
<Compile Include="BLL\WebService.cs" />
<Compile Include="Model\SteelWork.cs" />
<Compile Include="BLL\SteelManage.cs" />
<Compile Include="Job\WashPointJob.cs" />
<EmbeddedResource Include="UI\FrmMain.resx">
<DependentUpon>FrmMain.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="bin\Debug\AGVControl_Steel.exe.config" />
<None Include="bin\Debug\Config\AgvMission.csv" />
<None Include="bin\Debug\Config\AgvName.csv" />
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="bin\Debug\AGVControl_Steel.exe" />
<Content Include="bin\Debug\AGVControl_Steel.pdb" />
<Content Include="bin\Debug\AGVControl_Steel.xml" />
<Content Include="bin\Debug\log4net.dll" />
<Content Include="bin\Debug\RestSharp.dll" />
<Content Include="bin\Debug\RestSharp.xml" />
<Content Include="图标.ico" />
</ItemGroup>
<ItemGroup>
<Folder Include="bin\Debug\Logs\" />
<Folder Include="bin\Release\" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<appender name="AGVControl_Steel" type="log4net.Appender.RollingFileAppender">
<file value="Logs/AGVControl_Steel.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="MiR_API" type="log4net.Appender.RollingFileAppender">
<file value="Logs/MiR_API.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<logger name="AGVControl_Steel">
<level value="Debug"/>
<appender-ref ref="AGVControl_Steel"/>
</logger>
<logger name="MiR_API">
<level value="Debug"/>
<appender-ref ref="MiR_API"/>
</logger>
</log4net>
<appSettings>
<add key="FLEET_IP" value="10.85.199.3"/>
<add key="FLEET_Send" value="true"/>
<add key="WebService" value="http://10.85.196.40:8089/"/>
<!--<add key="WebService" value="http://10.211.55.23:8089/"/>-->
<add key="AGV_BATTERY_MAX" value="100"/>
<add key="AGV_BATTERY_MIN" value="40"/>
<add key="Use_32" value="false"/>
<add key="Use_25" value="false"/>
<add key="Work_32" value="4C"/>
<add key="Work_25" value="4D"/>
<add key="PlaceName" value="D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15,D16,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,4Cwash,4Dwash,storage"/>
</appSettings>
</configuration>
\ No newline at end of file
using Model;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AGVControl_Steel
{
/// <summary>
/// 公共类
/// </summary>
public static class Common
{
public static System.Windows.Forms.TextBox txtLog;
public static System.Windows.Forms.ListBox lstOldSteel;
public static System.Windows.Forms.ListBox lstNewSteel;
public static System.Windows.Forms.ListBox lstStorage;
public static System.Windows.Forms.Label lblStorageIO;
public static List<AgvInfo> agvInfos;
public static Dictionary<string, string> agvMissions;
public static MiR_API mir;
public static BLL.Control control;
public static BLL.SteelManage steelManage;
public static System.Configuration.Configuration appConfig;
public static log4net.ILog log;
public static string[] PLACE_NAME;
public static bool FLEET_SEND;
public static bool StorageDockFinish = false;
public static bool StorageDockAlway = false;
public const int AGV_CALL_SLEEP = 2000;
public const string STORAGE_ENTER_4C = "4C_enter";
public const string STORAGE_ENTER_4D = "4D_enter";
public const string STORAGE_LEAVE = "leave";
public const string STORAGE_IO_ON = "di_on";
public const string STORAGE_IO_OFF = "di_off";
public const string MISSION_TAKE_OFF_SHELF = "Placeqisdashelf";
public const string MISSION_TAKE_ON_SHELF = "Pickupqisdashelf";
public const string MISSION_PASS_DOOR_INTO = "PassDoorInto";
public const string MISSION_CHARGE = "AutoCharge";
public const string MISSION_STANDBY = "MoveStandby";
public const string MISSION_MOVE_WASH = "MoveWash";
public const string MISSION_MOVE_STORAGE = "MoveSteelstorage";
public const string MISSION_MOVE_D1 = "MoveSteelD1";
public const string MISSION_MOVE_D2 = "MoveSteelD2";
public const string MISSION_MOVE_D3 = "MoveSteelD3";
public const string MISSION_MOVE_D4 = "MoveSteelD4";
public const string MISSION_MOVE_D5 = "MoveSteelD5";
public const string MISSION_MOVE_D6 = "MoveSteelD6";
public const string MISSION_MOVE_D8 = "MoveSteelD8";
public const string MISSION_MOVE_D9 = "MoveSteelD9";
public const string MISSION_MOVE_D10 = "MoveSteelD10";
public const string MISSION_MOVE_D11 = "MoveSteelD11";
public const string MISSION_MOVE_D12 = "MoveSteelD12";
public const string MISSION_MOVE_D14 = "MoveSteelD14";
public const string MISSION_MOVE_D15 = "MoveSteelD15";
public const string MISSION_MOVE_D16 = "MoveSteelD16";
public const string MISSION_MOVE_C1 = "MoveSteelC1";
public const string MISSION_MOVE_C2 = "MoveSteelC2";
public const string MISSION_MOVE_C3 = "MoveSteelC3";
public const string MISSION_MOVE_C4 = "MoveSteelC4";
public const string MISSION_MOVE_C5 = "MoveSteelC5";
public const string MISSION_MOVE_C6 = "MoveSteelC6";
public const string MISSION_MOVE_C7 = "MoveSteelC7";
public const string MISSION_MOVE_C8 = "MoveSteelC8";
public const string MISSION_MOVE_C9 = "MoveSteelC9";
public const string MISSION_MOVE_C10 = "MoveSteelC10";
public static readonly string PATH_AGV_NAME = Environment.CurrentDirectory + "\\Config\\AgvName.csv";
public static readonly string PATH_AGV_MISSION = Environment.CurrentDirectory + "\\Config\\AgvMission.csv";
public static readonly string PATH_NEW_STEEL_WORK = Environment.CurrentDirectory + "\\Config\\NewSteelWork.txt";
public static readonly string PATH_OLD_STEEL_WORK = Environment.CurrentDirectory + "\\Config\\OldSteelWork.txt";
public static readonly string PATH_STORAGE_WORK = Environment.CurrentDirectory + "\\Config\\StorageWork.txt";
}
}
using System;
using System.Collections.Generic;
using System.Threading;
using AGVControl_Steel;
using Model;
namespace BLL
{
/// <summary>
/// 控制类
/// </summary>
public class Control
{
private Timer timerCall;
public delegate void AgvChangedEvent(int agvIndex);
public event AgvChangedEvent AgvChanged;
public event AgvChangedEvent AgvOnline;
/// <summary>
/// 控制类
/// </summary>
public Control()
{
ThreadPool.SetMaxThreads(5, 5); //线程池最大数量
}
/// <summary>
/// 打开服务
/// </summary>
public void Start()
{
timerCall = new Timer(CallProcess, null, 0, Common.AGV_CALL_SLEEP);
}
/// <summary>
/// 关闭服务
/// </summary>
public void Stop()
{
timerCall.Dispose();
}
private void CallProcess(object obj)
{
for (int i = 0; i < Common.agvInfos.Count; i++)
{
AgvInfo info = Common.agvInfos[i];
if (info.IsCall) continue;
try
{
info.IsCall = true;
CheckAgvOnline(ref info);
if (!info.IsOnline) continue; //脱机
GetAgvState(ref info);
if (!info.IsAuto) continue; //手动
if (info.StateID == 4) //Pause
Common.mir.State_Ready(info.IP, info.Authorization);
if (info.CurrentJob == null)
info.CurrentJob = new StandbyJob();
else
info.CurrentJob = info.CurrentJob.Execute(info);
}
catch (Exception ex)
{
Common.log.Error("CallProcess " + info.FullName, ex);
}
finally
{
info.IsCall = false;
}
}
}
/// <summary>
/// 获取小车的状态
/// </summary>
/// <param name="info"></param>
private void GetAgvState(ref AgvInfo info)
{
if (!info.IsOnline) return;
bool rtn = Common.mir.Get_State(info.IP, info.Authorization, out int stateID, out string stateText, out int battery, out string missionText, out System.Drawing.PointF position);
//Common.log.Debug(string.Format("{1} GetAgvState[return={0}] stateID={2}, stateText={3}, battery={4}, missionText={5}, position={6}", rtn, info.FullName, stateID, stateText, battery, missionText, position));
if (rtn)
{
info.StateID = stateID;
info.StateText = stateText;
info.Battery = battery;
info.MissionText = missionText;
info.Position = position;
string ip = info.IP;
int idx = Common.agvInfos.FindIndex(s => s.IP == ip);
if (idx > -1) AgvChanged?.Invoke(idx);
}
}
/// <summary>
/// 检查小车是否在线
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
private bool CheckAgvOnline(ref AgvInfo info)
{
bool rtn = Common.mir.CheckIP(info.IP);
if (rtn)
{
if (!info.IsOnline)
{
info.IsOnline = true;
string ip = info.IP;
int idx = Common.agvInfos.FindIndex(s => s.IP == ip);
if (idx > -1) AgvOnline?.Invoke(idx);
rtn = Common.mir.Get_IO_Modules(info.IP, info.Authorization, out string[] guid);
if (rtn) info.IOGuid = guid[0];
}
//Common.log.Debug(string.Format("{0}[{1}] 在线", info.Name, info.IP));
}
else
{
if (info.IsOnline)
{
info.IsOnline = false;
string ip = info.IP;
int idx = Common.agvInfos.FindIndex(s => s.IP == ip);
if (idx > -1) AgvOnline?.Invoke(idx);
}
Common.log.Debug(string.Format("{0}[{1}] 脱机", info.Name, info.IP));
}
return rtn;
}
}
}
\ No newline at end of file
using System;
using Model;
using AGVControl_Steel;
using System.Collections.Generic;
namespace BLL
{
public class SteelManage
{
private List<SteelWork> oldSteelWork;
private List<SteelWork> newSteelWork;
private List<SteelWork> storageWork;
public SteelManage()
{
oldSteelWork = new List<SteelWork>();
newSteelWork = new List<SteelWork>();
storageWork = new List<SteelWork>();
}
#region OldSteelWork
public void OldSteelWorkAdd(string place)
{
int index = oldSteelWork.FindIndex(sw => sw.Place == place);
if (index == -1)
{
SteelWork sw = new SteelWork() { Place = place };
oldSteelWork.Add(sw);
SaveOldSteelWork();
Common.log.Info("添加(" + place + ")回收钢板任务");
}
else
{
Common.log.Info("重复(" + place + ")回收钢板任务,已忽略");
}
}
public void OldSteelWorkDel(string place)
{
int index = oldSteelWork.FindIndex(sw => sw.Place == place);
if (index > -1)
{
oldSteelWork.RemoveAt(index);
SaveOldSteelWork();
Common.log.Info("删除(" + place + ")回收钢板任务");
}
else
{
Common.log.Info("没有找到(" + place + ")回收钢板任务");
}
}
public void OldSteelWorkDelAll()
{
oldSteelWork.Clear();
SaveOldSteelWork();
Common.log.Info("删除所有回收钢板任务");
}
public void OldSteelWorkLoad()
{
oldSteelWork = new List<SteelWork>();
if (!System.IO.File.Exists(Common.PATH_OLD_STEEL_WORK)) return;
string[] lines = System.IO.File.ReadAllLines(Common.PATH_OLD_STEEL_WORK, System.Text.Encoding.UTF8);
if (Common.lstOldSteel != null)
{
Common.lstOldSteel.Items.Clear();
Common.lstOldSteel.Items.AddRange(lines);
}
for (int i = 0; i < lines.Length; i++)
{
string[] arr = lines[i].Split(',');
SteelWork sw = new SteelWork() { Place = arr[0], DateTime = Convert.ToDateTime(arr[1]) };
oldSteelWork.Add(sw);
}
Common.log.Info("加载回收钢板任务");
}
public bool FindOldSteelWork(AgvInfo info, out string place)
{
place = null;
int index = -1;
string name = "";
bool find = false;
int placeIdx = Array.FindIndex(Common.PLACE_NAME, s => s == info.Place);
if (placeIdx == -1) return false;
string s = info.Workshop.Substring(1, 1);
for (int i = placeIdx; i < Common.PLACE_NAME.Length; i++)
{
name = Common.PLACE_NAME[i];
if (name.StartsWith(s))
{
index = oldSteelWork.FindIndex(s => s.Place == name);
if (index > -1)
{
find = true;
break;
}
}
}
place = name;
return find;
}
#endregion
#region NewSteelWork
public void NewSteelWorkAdd(string from, string place)
{
int index = newSteelWork.FindIndex(sw => sw.From == from && sw.Place == place);
if (index == -1)
{
SteelWork sw = new SteelWork() { From = from, Place = place };
newSteelWork.Add(sw);
SaveNewSteelWork();
Common.log.Info("添加(" + from + "," + place + ")送新钢板任务");
}
else
{
Common.log.Info("重复(" + place + ")送新钢板任务,已忽略");
}
}
public void NewSteelWorkDel(string from, string place)
{
int index = newSteelWork.FindIndex(sw => sw.From == from && sw.Place == place);
if (index > -1)
{
newSteelWork.RemoveAt(index);
SaveNewSteelWork();
Common.log.Info("删除(" + from + "," + place + ")送新钢板任务");
}
else
{
Common.log.Info("没有找到(" + place + ")送新钢板任务");
}
}
public void NewSteelWorkDelAll()
{
newSteelWork.Clear();
SaveNewSteelWork();
Common.log.Info("删除所有送新钢板任务");
}
public void NewSteelWorkLoad()
{
newSteelWork = new List<SteelWork>();
if (!System.IO.File.Exists(Common.PATH_NEW_STEEL_WORK)) return;
string[] lines = System.IO.File.ReadAllLines(Common.PATH_NEW_STEEL_WORK, System.Text.Encoding.UTF8);
if (Common.lstNewSteel != null)
{
Common.lstNewSteel.Items.Clear();
Common.lstNewSteel.Items.AddRange(lines);
}
for (int i = 0; i < lines.Length; i++)
{
string[] arr = lines[i].Split(',');
SteelWork sw = new SteelWork() { From = arr[0], Place = arr[1], DateTime = Convert.ToDateTime(arr[2]) };
newSteelWork.Add(sw);
}
Common.log.Info("加载送新钢板任务");
}
public bool FindNewSteelWork(AgvInfo info, out string place)
{
int index = -1;
string name = "";
bool find = false;
for (int i = 0; i < Common.PLACE_NAME.Length; i++)
{
name = Common.PLACE_NAME[i];
index = newSteelWork.FindIndex(s => s.From == info.SteelFrom && s.Place == name);
if (index > -1)
{
find = true;
break;
}
}
place = name;
return find;
}
public bool FindNewSteelWork(AgvInfo info)
{
int index = newSteelWork.FindIndex(s => s.From == info.SteelFrom);
if (index > -1)
return true;
else
return false;
}
#endregion
#region StorageWork
public void StorageWorkAdd(string place)
{
int index = storageWork.FindIndex(sw => sw.Place == place);
if (index == -1)
{
SteelWork sw = new SteelWork() { Place = place };
storageWork.Add(sw);
SaveStorageWork();
Common.log.Info("添加(" + place + ")仓库钢板任务");
}
else
{
Common.log.Info("重复(" + place + ")仓库钢板任务,已忽略");
}
}
public void StorageWorkDel(string place)
{
int index = storageWork.FindIndex(sw => sw.Place == place);
if (index > -1)
{
storageWork.RemoveAt(index);
SaveStorageWork();
Common.log.Info("删除(" + place + ")仓库钢板任务");
}
else
{
Common.log.Info("没有找到(" + place + ")仓库钢板任务");
}
}
public void StorageWorkDelAll()
{
storageWork.Clear();
SaveStorageWork();
Common.log.Info("删除所有仓库钢板任务");
}
public void StorageWorkLoad()
{
storageWork = new List<SteelWork>();
if (!System.IO.File.Exists(Common.PATH_STORAGE_WORK)) return;
string[] lines = System.IO.File.ReadAllLines(Common.PATH_STORAGE_WORK, System.Text.Encoding.UTF8);
if (Common.lstStorage != null)
{
Common.lstStorage.Items.Clear();
Common.lstStorage.Items.AddRange(lines);
}
for (int i = 0; i < lines.Length; i++)
{
string[] arr = lines[i].Split(',');
SteelWork sw = new SteelWork() { Place = arr[0], DateTime = Convert.ToDateTime(arr[1]) };
storageWork.Add(sw);
}
Common.log.Info("加载仓库钢板任务");
}
public bool FindStorageWork(AgvInfo info, out string place)
{
int index = storageWork.FindIndex(sw => sw.Place.StartsWith(info.Workshop));
if (index == -1)
{
place = "";
return false;
}
else
{
place = storageWork[index].Place;
return true;
}
}
public bool FindStorageWorkLeave()
{
int index = storageWork.FindIndex(s => s.Place == Common.STORAGE_LEAVE);
if (index > -1)
return true;
else
return false;
}
public void StorageWorkDelLeave()
{
int index = storageWork.FindIndex(sw => sw.Place == Common.STORAGE_LEAVE);
if (index > -1)
{
storageWork.RemoveAt(index);
SaveStorageWork();
Common.log.Debug("删除仓库离开架子任务");
}
}
#endregion
public Job GetSteelJob(AgvInfo info)
{
if (info.Battery < info.BatteryMin)
return null;
int newSteelIndex = newSteelWork.FindIndex(s => s.From.StartsWith(info.Workshop) && s.From == s.Place);
int storageIndex = storageWork.FindIndex(s => s.Place.StartsWith(info.Workshop));
#region 清洗点呼叫
if (newSteelIndex > -1)
{
info.SteelFrom = newSteelWork[newSteelIndex].From;
Common.log.Info(info.Workshop + "清洗点呼叫");
return new WashPointJob();
}
else
{
Common.log.Debug("没有找到" + info.Workshop + "清洗点呼叫");
}
#endregion
#region 仓库入架子出钢板
if (storageIndex > -1)
{
info.SteelFrom = "storage";
Common.log.Info("4D仓库呼叫");
return new StorageJob();
}
else
{
Common.log.Debug("没有找到4D仓库呼叫");
}
#endregion
#region 回收钢板
string name = info.Workshop.Substring(1, 1);
int oldSteelIndex = oldSteelWork.FindIndex(s => s.Place.StartsWith(name));
if (oldSteelIndex > -1)
{
Common.log.Info(info.Workshop + "回收钢板回收");
return new TakeOldJob();
}
else
{
Common.log.Debug("没有找到" + info.Workshop + "回收钢板任务");
}
//string name = info.Workshop.Substring(1, 1);
//List<SteelWork> sw = oldSteelWork.FindAll(s => s.Place.StartsWith(name));
//if (sw.Count == 0)
//{
// Common.log.Debug("没有找到" + info.Workshop + "回收钢板任务");
//}
//else
//{
// bool find = false;
// for (int i = 0; i < sw.Count; i++)
// {
// TimeSpan span = DateTime.Now - sw[i].DateTime;
// if (span.TotalMinutes >= 2)
// {
// find = true;
// break;
// }
// }
// if (find)
// {
// Common.log.Info(info.Workshop + "回收钢板任务");
// return new TakeOldJob();
// }
// else
// {
// Common.log.Debug("有" + info.Workshop + "回收钢板任务,但没有到2分钟,暂时不回收。");
// }
//}
#endregion
return null;
}
private void SaveOldSteelWork()
{
string[] content = new string[oldSteelWork.Count];
for (int i = 0; i < content.Length; i++)
content[i] = oldSteelWork[i].Place + "," + oldSteelWork[i].DateTime.ToString();
if (Common.lstOldSteel != null)
{
Common.lstOldSteel.Items.Clear();
Common.lstOldSteel.Items.AddRange(content);
}
System.IO.File.WriteAllLines(Common.PATH_OLD_STEEL_WORK, content, System.Text.Encoding.UTF8);
}
private void SaveNewSteelWork()
{
string[] content = new string[newSteelWork.Count];
for (int i = 0; i < content.Length; i++)
content[i] = newSteelWork[i].From + "," + newSteelWork[i].Place + "," + newSteelWork[i].DateTime.ToString();
if (Common.lstNewSteel != null)
{
Common.lstNewSteel.Items.Clear();
Common.lstNewSteel.Items.AddRange(content);
}
System.IO.File.WriteAllLines(Common.PATH_NEW_STEEL_WORK, content, System.Text.Encoding.UTF8);
}
private void SaveStorageWork()
{
string[] content = new string[storageWork.Count];
for (int i = 0; i < content.Length; i++)
content[i] = storageWork[i].Place + "," + storageWork[i].DateTime.ToString();
if (Common.lstStorage != null)
{
Common.lstStorage.Items.Clear();
Common.lstStorage.Items.AddRange(content);
}
System.IO.File.WriteAllLines(Common.PATH_STORAGE_WORK, content, System.Text.Encoding.UTF8);
}
}
}
\ No newline at end of file
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Runtime.Serialization;
using System.ServiceModel.Activation;
using System.IO;
using AGVControl_Steel;
using System;
using System.Drawing;
namespace Webs
{
[ServiceContract(Name = "Services")]
internal interface IWeb
{
[OperationContract]
[WebGet(UriTemplate = "StealAgv/takeOld?Place={place}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result TakeOldGet(string place);
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "StealAgv/takeOld", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result TakeOldPost(Stream info);
[OperationContract]
[WebGet(UriTemplate = "StealAgv/sendNew?From={from}&Place={place}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result SendNewGet(string from, string place);
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "StealAgv/sendNew", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result SendNewPost(Stream info);
[OperationContract]
[WebGet(UriTemplate = "StealAgv/storage?Place={place}", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result StorageGet(string place);
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "StealAgv/storage", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
Result StoragePost(Stream info);
}
[DataContract]
internal class Result
{
[DataMember]
public int Code { get; set; }
[DataMember]
public string Msg { get; set; }
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single, IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
internal class Web : IWeb
{
public Web()
{
}
public Result TakeOldGet(string place)
{
Common.log.Info("takeOld[GET] place=" + place);
return TakeOld(place);
}
public Result TakeOldPost(Stream info)
{
StreamReader sr = new StreamReader(info);
string s = sr.ReadToEnd();
Common.log.Info("takeOld[POST] " + s);
s = s.ToLower().Replace("place=", "");
return TakeOld(s);
}
public Result SendNewGet(string from, string place)
{
Common.log.Info("sendNew[GET] from=" + from + " place=" + place);
return SendNew(from, place);
}
public Result SendNewPost(Stream info)
{
StreamReader sr = new StreamReader(info);
string s = sr.ReadToEnd();
Common.log.Info("sendNew[POST] " + s);
s = s.ToLower();
string[] arr = s.Split('&');
arr[0] = arr[0].Replace("from=", "");
arr[1] = arr[1].Replace("place=", "");
return SendNew(arr[0], arr[1]);
}
public Result StorageGet(string place)
{
Common.log.Info("storage[GET] place=" + place);
return Storage(place);
}
public Result StoragePost(Stream info)
{
StreamReader sr = new StreamReader(info);
string s = sr.ReadToEnd();
Common.log.Info("storage[POST]");
s = s.ToLower().Replace("place=", "");
return Storage(s);
}
/// <summary>
/// 回收旧钢板任务
/// </summary>
/// <param name="place"></param>
/// <returns></returns>
private Result TakeOld(string place)
{
Result res;
try
{
string tt = place.ToUpper();
int index = Array.FindIndex(Common.PLACE_NAME, s => s == tt);
if (index == -1)
{
res = new Result { Code = -2, Msg = "Not find place=" + place };
Common.log.Info("没有找到" + place);
}
else
{
Common.steelManage.OldSteelWorkAdd(tt);
res = new Result { Code = 0, Msg = "OK" };
Common.log.Info("TakeOld(" + place + ") OK");
}
}
catch (Exception ex)
{
res = new Result { Code = -100, Msg = ex.Message };
Common.log.Error("TakeOld", ex);
}
return res;
}
/// <summary>
/// 清洗点呼叫小车,清洗点送新钢板,仓库送新钢板
/// </summary>
/// <param name="from"></param>
/// <param name="place"></param>
/// <returns></returns>
private Result SendNew(string from, string place)
{
Result res = new Result();
try
{
int index = Array.FindIndex(Common.PLACE_NAME, s => s.ToLower() == from.ToLower());
if (index == -1)
{
res = new Result { Code = -1, Msg = "Not find from=" + from };
Common.log.Info("没有找到" + from);
}
else
{
from = Common.PLACE_NAME[index];
bool find = true;
string[] arr = place.Split(',');
for (int i = 0; i < arr.Length; i++)
{
index = Array.FindIndex(Common.PLACE_NAME, s => s.ToLower() == arr[i].ToLower());
if (index == -1)
{
res = new Result { Code = -2, Msg = "Not find place=" + arr[i] };
Common.log.Info("没有找到" + arr[i]);
find = false;
break;
}
else
{
Common.steelManage.NewSteelWorkAdd(from, Common.PLACE_NAME[index]);
find = true;
}
}
if (find)
{
res = new Result { Code = 0, Msg = "OK" };
Common.log.Info("SendNew(" + from + ",[" + place + "]) OK");
}
}
}
catch (Exception ex)
{
res = new Result { Code = -100, Msg = ex.Message };
Common.log.Error("SendNew", ex);
}
return res;
}
/// <summary>
/// 仓库入库,仓库出库
/// </summary>
/// <param name="place"></param>
/// <returns></returns>
private Result Storage(string place)
{
Result res = new Result { Code = 0, Msg = "OK" };
try
{
string s = place.ToLower();
if (s == Common.STORAGE_ENTER_4C.ToLower())
{
res.Msg = "OK,4C";
Common.steelManage.StorageWorkAdd(Common.STORAGE_ENTER_4C);
}
else if (s == Common.STORAGE_ENTER_4D.ToLower())
{
res.Msg = "OK,4D";
Common.steelManage.StorageWorkAdd(Common.STORAGE_ENTER_4D);
}
else if (s == Common.STORAGE_LEAVE.ToLower())
{
Common.steelManage.StorageWorkAdd(Common.STORAGE_LEAVE);
}
else if (s == Common.STORAGE_IO_ON.ToLower())
{
Common.StorageDockFinish = true;
UpdateStorageIO();
}
else if (s == Common.STORAGE_IO_OFF.ToLower())
{
Common.StorageDockFinish = false;
UpdateStorageIO();
}
else
{
res.Code = -2;
res.Msg = "Not find place=" + place;
Common.log.Info("没有找到" + place);
}
}
catch (Exception ex)
{
res = new Result { Code = -100, Msg = ex.Message };
Common.log.Error("Storage", ex);
}
return res;
}
private void UpdateStorageIO()
{
if (Common.lblStorageIO == null) return;
int.TryParse(Common.lblStorageIO.Tag.ToString(), out int n);
if (Common.StorageDockAlway) Common.StorageDockFinish = true;
string s = Common.StorageDockFinish ? "ON" : "OFF";
Common.lblStorageIO.Text = string.Format("仓库IO信号 {0} ({1})", s, n);
Common.lblStorageIO.BackColor = Common.StorageDockFinish ? Color.Lime : Color.Red;
if (n == 9)
n = 0;
else
n++;
Common.lblStorageIO.Tag = n.ToString();
}
}
/// <summary>
/// Web服务器
/// </summary>
public class WebService
{
private WebServiceHost _serviceHost;
/// <summary>
/// 服务是否打开
/// </summary>
public bool IsOpen { private set; get; }
/// <summary>
/// 打开服务
/// </summary>
/// <param name="url"></param>
public void Open(string url)
{
try
{
Web service = new Web();
_serviceHost = new WebServiceHost(service, new Uri(url));
_serviceHost.Open();
Common.log.Info("Web服务已开启");
IsOpen = true;
}
catch (Exception ex)
{
Common.log.Error("WebService Open", ex);
IsOpen = false;
}
}
/// <summary>
/// 关闭服务
/// </summary>
public void Close()
{
if (_serviceHost != null)
_serviceHost.Close();
Common.log.Info("Web服务已关闭");
}
}
}
using System;
using AGVControl_Steel;
namespace Model
{
/// <summary>
/// 充电工作
/// </summary>
public class ChargeJob : Job
{
private string id;
private JobStep<ChargeStep> chargeStep;
private const int CHARGE_PLACE_PLC = 20;
/// <summary>
/// 充电工作
/// </summary>
public ChargeJob()
{
chargeStep = new JobStep<ChargeStep>(ChargeStep.None);
Common.log.Debug("进入ChargeJob任务");
}
/// <summary>
/// 任务执行
/// </summary>
/// <param name="info"></param>
public override Job Execute(AgvInfo info)
{
if (chargeStep.IsEqual(ChargeStep.None))
{
if (info.IsSelfWorkshop())
MoveCharge(info);
else
MoveDoor(info);
}
else if (chargeStep.IsEqual(ChargeStep.WaitWorkshopDoor))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
MoveCharge(info);
else if (state == MissionState.Aborted.ToString())
chargeStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
else
{
chargeStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (chargeStep.IsEqual(ChargeStep.WaitChargeStation))
{
rtn = Common.mir.Get_Register(info.IP, info.Authorization, CHARGE_PLACE_PLC, out int value);
if (rtn)
{
if (value == 1)
{
chargeStep.Msg = info.FullName + "到达充电位,准备充电";
chargeStep.NextStep(ChargeStep.Charging);
}
}
else
{
chargeStep.Msg = info.FullName + "获取PLC" + CHARGE_PLACE_PLC + "失败";
}
}
else if (chargeStep.IsEqual(ChargeStep.Charging))
{
if (info.Battery == info.BatteryMax)
{
chargeStep.Msg = info.FullName + "电量达到" + info.BatteryMax + ",充电工作结束";
chargeStep.NextStep(ChargeStep.End);
}
else if (info.Battery > info.BatteryMin)
{
Job job = Common.steelManage.GetSteelJob(info);
if (job != null)
{
Common.mir.Del_Mission(info.IP, info.Authorization);
return job;
}
}
}
else if (chargeStep.IsEqual(ChargeStep.End))
{
Common.mir.Del_Mission(info.IP, info.Authorization);
Common.log.Info(info.FullName + "ChargeJob结束,切换StandbyJob");
return new StandbyJob();
}
return this;
}
private void MoveDoor(AgvInfo info)
{
mission = Common.MISSION_PASS_DOOR_INTO + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
chargeStep.Msg = info.FullName + "在" + info.Workshop + "车间,先过车间门";
chargeStep.NextStep(ChargeStep.WaitWorkshopDoor);
}
else
{
chargeStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
private void MoveCharge(AgvInfo info)
{
mission = Common.MISSION_CHARGE + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
info.Place = "充电位";
chargeStep.Msg = info.FullName + "在" + info.Workshop + "车间去充电位," + mission;
chargeStep.NextStep(ChargeStep.WaitChargeStation);
}
else
{
chargeStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
/// <summary>
/// 充电步骤
/// </summary>
private enum ChargeStep
{
/// <summary>
/// 无
/// </summary>
None,
/// <summary>
/// 充电结束
/// </summary>
End,
/// <summary>
/// 移动到车间门口
/// </summary>
WaitWorkshopDoor,
/// <summary>
/// 移动到充电位置
/// </summary>
WaitChargeStation,
/// <summary>
/// 移动到待机位
/// </summary>
WaitStandby,
/// <summary>
/// 充电中
/// </summary>
Charging,
/// <summary>
/// 发送任务
/// </summary>
SendMission
}
}
}
\ No newline at end of file
using AGVControl_Steel;
namespace Model
{
public class MissionMoveJob : Job
{
private string id;
private int getStateTime = 0;
private JobStep<MissionMoveStep> missionMoveStep;
public MissionMoveJob(string missionName)
{
IsEnd = false;
mission = missionName;
missionMoveStep = new JobStep<MissionMoveStep>(MissionMoveStep.None);
Common.log.Debug("进入MissionMoveJob任务");
}
public override Job Execute(AgvInfo info)
{
if (missionMoveStep.IsEqual(MissionMoveStep.None))
{
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
getStateTime = 0;
missionMoveStep.NextStep(MissionMoveStep.Moving);
}
else
{
missionMoveStep.Msg = info.FullName + "发送 " + mission + " 失败";
Common.mir.Del_Mission(info.IP, info.Authorization);
}
}
else if (missionMoveStep.IsEqual(MissionMoveStep.Moving))
{
getStateTime += Common.AGV_CALL_SLEEP;
if (getStateTime >= 2000) //每2s获取一次状态
{
getStateTime = 0;
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
missionMoveStep.NextStep(MissionMoveStep.End);
}
else if (state == MissionState.Aborted.ToString())
{
missionMoveStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString() + ",重新发送";
missionMoveStep.NextStep(MissionMoveStep.None);
}
}
else
{
missionMoveStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
}
else if (missionMoveStep.IsEqual(MissionMoveStep.End))
{
IsEnd = true;
}
return this;
}
private enum MissionMoveStep
{
None,
Moving,
End
}
}
}
\ No newline at end of file
using AGVControl_Steel;
namespace Model
{
public class SendNewJob : Job
{
private string id;
private int dockTime;
private int delayGetSignal;
private JobStep<SendNewStep> sendNewStep;
public SendNewJob()
{
sendNewStep = new JobStep<SendNewStep>(SendNewStep.None);
Common.log.Debug("进入SendNewJob任务");
}
public override Job Execute(AgvInfo info)
{
if (sendNewStep.IsEqual(SendNewStep.None))
{
dockTime = 0;
sendNewStep.Msg = info.FullName + "等待任务";
sendNewStep.NextStep(SendNewStep.FindLine);
}
else if (sendNewStep.IsEqual(SendNewStep.WaitWorkshopDoor))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
sendNewStep.Msg = info.FullName + "已过车间门,开始执行任务";
sendNewStep.NextStep(SendNewStep.FindLine);
}
else if (state == MissionState.Aborted.ToString())
{
sendNewStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
sendNewStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (sendNewStep.IsEqual(SendNewStep.FindLine))
{
rtn = Common.steelManage.FindNewSteelWork(info, out string place);
if (rtn)
{
if (place == "storage")
{
if (info.Is4DWorkshop())
{
info.Place = place;
mission = "MoveSteel" + info.Place;
if (Common.FLEET_SEND)
Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
sendNewStep.Msg = info.FullName + " 发送任务 " + mission;
sendNewStep.NextStep(SendNewStep.MoveLine);
}
else
{
MoveDoor4D(info);
}
}
else
{
if (info.IsSelfWorkshop())
{
info.Place = place;
mission = "MoveSteel" + info.Place;
if (Common.FLEET_SEND)
Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
sendNewStep.Msg = info.FullName + " 发送任务 " + mission;
sendNewStep.NextStep(SendNewStep.MoveLine);
info.SteelCountAdd();
}
else
{
MoveDoor(info);
}
}
}
else
{
sendNewStep.Msg = info.FullName + "没有后续新钢板任务";
sendNewStep.NextStep(SendNewStep.End);
}
}
else if (sendNewStep.IsEqual(SendNewStep.MoveLine))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
sendNewStep.Msg = info.FullName + "完成" + mission;
if (info.Place == "storage")
{
delayGetSignal = 0;
sendNewStep.Msg = info.FullName + "等待到位信号";
sendNewStep.NextStep(SendNewStep.GetSingle);
}
else
{
Common.steelManage.NewSteelWorkDel(info.SteelFrom, info.Place);
sendNewStep.NextStep(SendNewStep.FindLine);
}
}
else if (state == MissionState.Aborted.ToString())
{
sendNewStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
sendNewStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (sendNewStep.IsEqual(SendNewStep.GetSingle))
{
if (Common.StorageDockFinish)
{
//入库的同时又有出库,需要删除出库任务。
if (info.Workshop == "4C")
Common.steelManage.StorageWorkDel(Common.STORAGE_ENTER_4C);
else if (info.Workshop == "4D")
Common.steelManage.StorageWorkDel(Common.STORAGE_ENTER_4D);
Common.steelManage.NewSteelWorkDel(info.SteelFrom, info.Place);
sendNewStep.Msg = info.FullName + "已到位,等待离开信号";
sendNewStep.NextStep(SendNewStep.WaitStorageLeave);
}
else
{
if (delayGetSignal >= 2)
{
if (dockTime >= 3)
{
sendNewStep.Msg = info.FullName + "对接仓库连续3次信号没有到位";
sendNewStep.NextStep(SendNewStep.Error);
dockTime = 0;
//小车报警任务
}
else
{
dockTime++;
mission = "MoveSteel" + info.Place;
if (Common.FLEET_SEND)
Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
sendNewStep.Msg = info.FullName + "信号没有到位,第" + dockTime + "次重发任务" + mission;
sendNewStep.NextStep(SendNewStep.MoveLine);
}
}
delayGetSignal++;
}
}
else if (sendNewStep.IsEqual(SendNewStep.WaitStorageLeave))
{
if (Common.steelManage.FindStorageWorkLeave())
{
Common.steelManage.StorageWorkDelLeave();
sendNewStep.Msg = info.FullName + "收到离开信号";
sendNewStep.NextStep(SendNewStep.FindLine);
}
}
else if (sendNewStep.IsEqual(SendNewStep.End))
{
info.SteelFrom = "";
info.ClearSteelCount();
Job job = Common.steelManage.GetSteelJob(info);
if (job == null)
return new StandbyJob();
else
return job;
}
else if (sendNewStep.IsEqual(SendNewStep.Error))
{
}
return this;
}
private void MoveDoor(AgvInfo info)
{
mission = Common.MISSION_PASS_DOOR_INTO + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
sendNewStep.Msg = info.FullName + "在其他车间,先过车间门";
sendNewStep.NextStep(SendNewStep.WaitWorkshopDoor);
}
else
{
sendNewStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
private void MoveDoor4D(AgvInfo info)
{
mission = Common.MISSION_PASS_DOOR_INTO + "4D";
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
sendNewStep.Msg = info.FullName + "在其他车间,先过车间门";
sendNewStep.NextStep(SendNewStep.WaitWorkshopDoor);
}
else
{
sendNewStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
private enum SendNewStep
{
None,
//FindMission,
WaitWorkshopDoor,
FindLine,
MoveLine,
GetSingle,
WaitStorageLeave,
End,
Error
}
}
}
\ No newline at end of file
using AGVControl_Steel;
namespace Model
{
public class StandbyJob : Job
{
private string id;
private int standingTime; //在待机位停留时间
private JobStep<StandbyStep> standbyStep;
private const int STANDBY_TIMEOUT = 2 * 60; //待机位停留超时时间,秒
public StandbyJob()
{
standbyStep = new JobStep<StandbyStep>(StandbyStep.None);
Common.log.Debug("进入StandbyJob任务");
}
public override Job Execute(AgvInfo info)
{
if (standbyStep.IsEqual(StandbyStep.None))
{
info.ClearSteelCount();
if (info.IsSelfWorkshop())
MoveStandby(info);
else
MoveDoor(info);
}
else if (standbyStep.IsEqual(StandbyStep.WaitWorkshopDoor))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
MoveStandby(info);
else if (state == MissionState.Aborted.ToString())
standbyStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
else
{
standbyStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (standbyStep.IsEqual(StandbyStep.WaitStandby))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
standingTime = 0;
standbyStep.Msg = info.FullName + "已在待机位";
standbyStep.NextStep(StandbyStep.End);
}
else if (state == MissionState.Aborted.ToString())
{
standbyStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
standbyStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (standbyStep.IsEqual(StandbyStep.End))
{
standingTime += Common.AGV_CALL_SLEEP;
if (standingTime > STANDBY_TIMEOUT * 1000)
{
if (info.Battery < info.BatteryMax)
{
standbyStep.Msg = info.FullName + "在待机位停留超过2分钟,执行充电任务";
return new ChargeJob();
}
}
else if (info.Battery <= info.BatteryMin)
{
standbyStep.Msg = info.FullName + "电量小于" + info.BatteryMin + ",执行充电任务";
return new ChargeJob();
}
else
{
Job job = Common.steelManage.GetSteelJob(info);
if (job != null) return job;
}
}
return this;
}
private void MoveDoor(AgvInfo info)
{
mission = Common.MISSION_PASS_DOOR_INTO + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
standbyStep.Msg = info.FullName + "在其他车间,先过车间门";
standbyStep.NextStep(StandbyStep.WaitWorkshopDoor);
}
else
{
standbyStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
private void MoveStandby(AgvInfo info)
{
mission = Common.MISSION_STANDBY + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
info.Place = "待机位";
standbyStep.Msg = info.FullName + "回待机位," + mission;
standbyStep.NextStep(StandbyStep.WaitStandby);
}
else
{
standbyStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
private enum StandbyStep
{
None,
WaitWorkshopDoor,
WaitStandby,
End
}
}
}
\ No newline at end of file
using AGVControl_Steel;
namespace Model
{
public class StorageJob : Job
{
private string id;
private int delayGetSignal; //延迟获取信号
private int dockTime; //停靠次数
private JobStep<StorageStep> storageStep;
public StorageJob()
{
storageStep = new JobStep<StorageStep>(StorageStep.None);
Common.log.Debug("进入StorageJob任务");
}
public override Job Execute(AgvInfo info)
{
if (storageStep.IsEqual(StorageStep.None))
{
dockTime = 0;
if (info.Is4DWorkshop())
storageStep.NextStep(StorageStep.GoStorage);
else
MoveDoor(info);
}
else if (storageStep.IsEqual(StorageStep.WaitWorkshopDoor))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
storageStep.Msg = info.FullName + "已过车间门";
storageStep.NextStep(StorageStep.GoStorage);
}
else if (state == MissionState.Aborted.ToString())
{
storageStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
storageStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (storageStep.IsEqual(StorageStep.GoStorage))
{
Common.steelManage.FindStorageWork(info, out string place);
info.Place = place;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, Common.MISSION_MOVE_STORAGE, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, Common.MISSION_MOVE_STORAGE, out id);
if (rtn)
{
storageStep.Msg = info.FullName + "去4D仓库";
storageStep.NextStep(StorageStep.WaitStorage);
}
else
{
storageStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
else if (storageStep.IsEqual(StorageStep.WaitStorage))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
storageStep.Msg = info.FullName + "已在仓库";
delayGetSignal = 0;
storageStep.NextStep(StorageStep.GetSingle);
}
else if (state == MissionState.Aborted.ToString())
{
storageStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
storageStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (storageStep.IsEqual(StorageStep.GetSingle))
{
if (Common.StorageDockFinish)
{
Common.steelManage.StorageWorkDel(info.Place);
storageStep.Msg = info.FullName + "已到位,等待离开信号";
storageStep.NextStep(StorageStep.WaitStorageLeave);
}
else
{
if (delayGetSignal >= 3)
{
if (dockTime >= 3)
{
storageStep.Msg = info.FullName + "对接仓库连续3次信号没有到位";
storageStep.NextStep(StorageStep.Error);
dockTime = 0;
//小车报警任务
}
else
{
dockTime++;
mission = "MoveSteel" + info.Place;
if (Common.FLEET_SEND)
Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
storageStep.Msg = info.FullName + "信号没有到位,第" + dockTime + "次重发任务" + mission;
storageStep.NextStep(StorageStep.GoStorage);
}
}
delayGetSignal++;
}
}
else if (storageStep.IsEqual(StorageStep.WaitStorageLeave))
{
if (Common.steelManage.FindStorageWorkLeave())
{
Common.steelManage.StorageWorkDelLeave();
storageStep.Msg = info.FullName + "收到离开信号";
return new StandbyJob();
}
else if (Common.steelManage.FindNewSteelWork(info))
{
return new SendNewJob();
}
}
else if (storageStep.IsEqual(StorageStep.End))
{
}
else if (storageStep.IsEqual(StorageStep.Error))
{
}
return this;
}
private void MoveDoor(AgvInfo info)
{
string name = Common.MISSION_PASS_DOOR_INTO;
if (info.Workshop.Substring(1, 1) == "C")
name += info.Workshop.Substring(0, 1) + "D";
else
name += info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, name, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, name, out id);
if (rtn)
{
storageStep.Msg = info.FullName + "在" + info.Workshop + "车间,先过车间门";
storageStep.NextStep(StorageStep.WaitWorkshopDoor);
}
else
{
storageStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
private enum StorageStep
{
None,
WaitWorkshopDoor,
GoStorage,
WaitStorage,
GetSingle,
WaitStorageLeave,
Error,
End
}
}
}
using AGVControl_Steel;
namespace Model
{
public class TakeOldJob : Job
{
private string id;
private string name = null;
private JobStep<TakeOldStep> takeOldStep;
public TakeOldJob()
{
takeOldStep = new JobStep<TakeOldStep>(TakeOldStep.None);
Common.log.Debug("进入TakeOldJob任务");
}
public override Job Execute(AgvInfo info)
{
if (takeOldStep.IsEqual(TakeOldStep.None))
{
info.ClearSteelCount();
takeOldStep.NextStep(TakeOldStep.FindLine);
}
else if (takeOldStep.IsEqual(TakeOldStep.FindLine))
{
if (info.IsSteelFull())
{
takeOldStep.Msg = info.FullName + "钢板已满";
takeOldStep.NextStep(TakeOldStep.GoWashPoint);
}
else
{
FindLine(info);
if (!rtn)
{
takeOldStep.Msg = info.FullName + "没有后续旧钢板任务";
takeOldStep.NextStep(TakeOldStep.GoWashPoint);
}
}
}
else if (takeOldStep.IsEqual(TakeOldStep.MoveLine))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
Common.steelManage.OldSteelWorkDel(name);
takeOldStep.Msg = info.FullName + "完成" + mission;
takeOldStep.NextStep(TakeOldStep.FindLine);
}
else if (state == MissionState.Aborted.ToString())
{
takeOldStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
takeOldStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (takeOldStep.IsEqual(TakeOldStep.GoWashPoint))
{
mission = Common.MISSION_MOVE_WASH + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
info.Place = "4D清洗点";
takeOldStep.Msg = info.FullName + "去" + info.Workshop + "清洗点";
takeOldStep.NextStep(TakeOldStep.WaitWashPoint);
}
else
{
takeOldStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
else if (takeOldStep.IsEqual(TakeOldStep.WaitWashPoint))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
takeOldStep.Msg = info.FullName + "已在清洗点";
takeOldStep.NextStep(TakeOldStep.End);
}
else if (state == MissionState.Aborted.ToString())
{
takeOldStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
takeOldStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (takeOldStep.IsEqual(TakeOldStep.End))
{
info.ClearSteelCount();
Job job = Common.steelManage.GetSteelJob(info);
if (job == null)
return new StandbyJob();
else
return job;
}
return this;
}
private void FindLine(AgvInfo info)
{
rtn = Common.steelManage.FindOldSteelWork(info, out string place);
if (rtn)
{
name = place;
info.Place = name;
mission = "MoveSteel" + name;
if (Common.FLEET_SEND)
Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
takeOldStep.Msg = info.FullName + " 发送任务 " + mission;
takeOldStep.NextStep(TakeOldStep.MoveLine);
info.SteelCountAdd();
}
}
private enum TakeOldStep
{
None,
FindLine,
MoveLine,
GoWashPoint,
WaitWashPoint,
End
}
}
}
using AGVControl_Steel;
namespace Model
{
public class WashPointJob : Job
{
private string id;
private JobStep<WashPointStep> washPointStep;
public WashPointJob()
{
washPointStep = new JobStep<WashPointStep>(WashPointStep.None);
Common.log.Debug("进入WashPointJob任务");
}
public override Job Execute(AgvInfo info)
{
if (washPointStep.IsEqual(WashPointStep.None))
{
washPointStep.NextStep(WashPointStep.GoWashPoint);
}
else if (washPointStep.IsEqual(WashPointStep.GoWashPoint))
{
mission = Common.MISSION_MOVE_WASH + info.Workshop;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
else
rtn = Common.mir.Add_Mission(info.IP, info.Authorization, mission, out id);
if (rtn)
{
washPointStep.Msg = info.FullName + "去" + info.Workshop + "清洗点";
washPointStep.NextStep(WashPointStep.WaitWashPoint);
}
else
{
washPointStep.Msg = info.FullName + "发送" + mission + "任务失败";
}
}
else if (washPointStep.IsEqual(WashPointStep.WaitWashPoint))
{
rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
if (rtn)
{
if (state == MissionState.Done.ToString())
{
Common.steelManage.NewSteelWorkDel(info.SteelFrom, info.SteelFrom);
washPointStep.Msg = info.FullName + "已在清洗点";
washPointStep.NextStep(WashPointStep.End);
}
else if (state == MissionState.Aborted.ToString())
{
washPointStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
}
}
else
{
washPointStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
}
}
else if (washPointStep.IsEqual(WashPointStep.End))
{
return new SendNewJob();
}
return this;
}
private enum WashPointStep
{
None,
GoWashPoint,
WaitWashPoint,
End
}
}
}
using System;
using AGVControl_Steel;
namespace Model
{
/// <summary>
/// 小车信息
/// </summary>
public class AgvInfo
{
private int currSteelCount = 0;
private const int STEEL_MAX = 5;
/// <summary>
/// 小车名称
/// </summary>
public string Name { set; get; } = "";
/// <summary>
/// 在Fleet中的ID
/// </summary>
public string FleetID { set; get; } = "";
/// <summary>
/// 小车IP地址
/// </summary>
public string IP { set; get; } = "";
/// <summary>
/// 带IP的完整名称
/// </summary>
public string FullName
{
get
{
return string.Format("{0}[{1}] ", Name, IP);
}
}
/// <summary>
/// 授权码
/// </summary>
public string Authorization { set; get; } = "";
/// <summary>
/// 当前位置
/// </summary>
public string Place { set; get; } = "";
public string SteelFrom { set; get; } = "";
/// <summary>
/// 车间
/// </summary>
public string Workshop { set; get; } = "";
/// <summary>
/// 是否自动使用
/// </summary>
public bool IsAuto { set; get; } = false;
/// <summary>
/// 是否在线
/// </summary>
public bool IsOnline { set; get; } = false;
/// <summary>
/// 电量百分比
/// </summary>
public int Battery { set; get; } = 0;
/// <summary>
/// AGV最大充电电量
/// </summary>
public int BatteryMax { set; get; } = 0;
/// <summary>
/// AGV最低电量,小于此值必须充电
/// </summary>
public int BatteryMin { set; get; } = 0;
/// <summary>
/// 小车坐标位置
/// </summary>
public System.Drawing.PointF Position { set; get; }
/// <summary>
/// 任务发送
/// </summary>
public string TaskSend { set; get; } = "";
/// <summary>
/// 状态ID号
/// </summary>
public int StateID { set; get; } = -1;
/// <summary>
/// 状态文本
/// </summary>
public string StateText { set; get; } = "";
/// <summary>
/// 任务文本
/// </summary>
public string MissionText { set; get; } = "";
/// <summary>
/// IO模块的guid
/// </summary>
public string IOGuid { set; get; } = "";
/// <summary>
/// 是否正在被调用
/// </summary>
public bool IsCall { set; get; } = false;
/// <summary>
/// 当前的工作
/// </summary>
public Job CurrentJob { set; get; } = null;
/// <summary>
/// 表格行显示
/// </summary>
/// <returns></returns>
public string[] ToRow()
{
string[] arr = new string[] { Name, Place, StateText, Battery.ToString(), IsOnline.ToString(), IsAuto.ToString(), "清除" };
return arr;
}
public string ToMissionState()
{
string s = FullName + "\r\n\r\n" + MissionText;
return s;
}
/// <summary>
/// 是否在自己的车间里面
/// </summary>
/// <returns></returns>
public bool IsSelfWorkshop()
{
if (Position.Y < 55)
{
if (Workshop.IndexOf('D') > 0)
return true;
else if (Workshop.IndexOf('C') > 0)
return false;
}
else if (Position.Y > 62)
{
if (Workshop.IndexOf('D') > 0)
return false;
else if (Workshop.IndexOf('C') > 0)
return true;
}
return false;
}
/// <summary>
/// 是否在4D车间
/// </summary>
/// <returns></returns>
public bool Is4DWorkshop()
{
if (Position.Y < 55)
return true;
else if (Position.Y > 62)
return false;
else
return false;
}
/// <summary>
/// 钢板是否已放满
/// </summary>
/// <returns></returns>
public bool IsSteelFull()
{
if (currSteelCount >= STEEL_MAX)
return true;
else
return false;
}
/// <summary>
/// 钢板是否取空
/// </summary>
/// <returns></returns>
public bool IsSteelEmpty()
{
if (currSteelCount <= 0)
return true;
else
return false;
}
/// <summary>
/// 钢板数量增加
/// </summary>
public void SteelCountAdd()
{
currSteelCount++;
}
/// <summary>
/// 钢板数量清零
/// </summary>
public void ClearSteelCount()
{
currSteelCount = 0;
}
/// <summary>
/// 钢板数量放满
/// </summary>
public void FillSteelCount()
{
currSteelCount = STEEL_MAX;
}
}
}
\ No newline at end of file

namespace Model
{
/// <summary>
/// 小车的工作
/// </summary>
public abstract class Job
{
/// <summary>
/// 任务是否执行
/// </summary>
public bool IsProcess { set; get; }
/// <summary>
/// 任务是否结束
/// </summary>
public bool IsEnd { set; get; }
/// <summary>
/// 任务运行信息
/// </summary>
public string RunInfo { set; get; }
/// <summary>
/// 任务执行
/// </summary>
/// <param name="info"></param>
public abstract Job Execute(AgvInfo info);
internal bool rtn;
internal string mission;
}
}
using System;
using AGVControl_Steel;
namespace Model
{
/// <summary>
/// 小车工作步骤
/// </summary>
/// <typeparam name="T"></typeparam>
public class JobStep<T>
{
private T _step;
private DateTime _time;
private string _msg = "";
/// <summary>
/// 小车工作步骤
/// </summary>
/// <param name="step"></param>
public JobStep(T step)
{
_step = step;
_time = DateTime.Now;
}
/// <summary>
/// 步骤是否相等
/// </summary>
/// <param name="step"></param>
/// <returns></returns>
public bool IsEqual(T step)
{
return _step.Equals(step);
}
/// <summary>
/// 是否超时
/// </summary>
/// <param name="timeOutMilliseconds"></param>
/// <returns></returns>
public bool IsTimeOut(int timeOutMilliseconds)
{
TimeSpan span = DateTime.Now - _time;
if (span.TotalMilliseconds > timeOutMilliseconds)
return true;
else
return false;
}
/// <summary>
/// 下一个步骤
/// </summary>
/// <param name="step"></param>
public void NextStep(T step)
{
_step = step;
_time = DateTime.Now;
}
/// <summary>
/// 当前信息
/// </summary>
public string Msg
{
get
{
return _msg;
}
set
{
if (!string.IsNullOrEmpty(value))
{
//与上一个消息不一样才打印
if (!value.Equals(_msg))
{
Common.log.Info(_step.ToString() + ":" + value);
if (Common.txtLog != null)
{
string time = string.Format("[{0:HH:mm:ss}] ", DateTime.Now);
Common.txtLog.AppendText(time + value + "\r\n");
Common.txtLog.SelectionStart = Common.txtLog.Text.Length;
Common.txtLog.ScrollToCaret();
}
}
}
_msg = value;
}
}
}
}
\ No newline at end of file
using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;
using RestSharp;
namespace Model
{
/// <summary>
/// MiR小车API
/// </summary>
public class MiR_API
{
private readonly log4net.ILog LOG;
private const int httpTimeout = 10000;
/// <summary>
/// Fleet的IP地址
/// </summary>
public string FleetIP { set; get; }
/// <summary>
/// 任务列表
/// </summary>
public Dictionary<string, string> MissionList { set; get; }
/// <summary>
/// MiR小车API
/// </summary>
/// <param name="logName"></param>
public MiR_API(string logName = "MiR_API")
{
LOG = log4net.LogManager.GetLogger(logName);
}
/// <summary>
/// 获取IO模块guid列表
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <param name="guid"></param>
/// <returns></returns>
public bool Get_IO_Modules(string ip, string authorization, out string[] guid)
{
guid = null;
try
{
string url = "http://" + ip + "/api/v2.0.0/io_modules";
string json = HttpGet(url, ip, authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
object[] obj = (object[])serializer.DeserializeObject(json);
if (obj == null) return false;
guid = new string[obj.Length];
for (int i = 0; i < obj.Length; i++)
{
Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
guid[i] = dic["guid"].ToString();
}
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 获取IO模块的状态
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <param name="guid"></param>
/// <param name="input"></param>
/// <param name="output"></param>
/// <returns></returns>
public bool Get_IO_Status(string ip, string authorization, string guid, out bool[] input, out bool[] output)
{
input = null;
output = null;
try
{
string url = "http://" + ip + "/api/v2.0.0/io_modules/" + guid + "/status";
string json = HttpGet(url, ip, authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
object[] objInput = (object[])dic["input_state"];
input = new bool[objInput.Length];
for (int i = 0; i < input.Length; i++)
input[i] = Convert.ToBoolean(objInput[i]);
object[] objOutput = (object[])dic["output_state"];
output = new bool[objOutput.Length];
for (int i = 0; i < output.Length; i++)
output[i] = Convert.ToBoolean(objOutput[i]);
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 获取任务状态
/// </summary>
/// <param name="authorization"></param>
/// <param name="id"></param>
/// <param name="state"></param>
/// <returns></returns>
public bool Get_MissionState_Fleet(string authorization, string id, out string state)
{
state = null;
try
{
string url = "http://" + FleetIP + "/api/v2.0.0/mission_scheduler/" + id;
string json = HttpGet(url, FleetIP, authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
state = dic["state"].ToString();
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 获取PLC寄存器的内容
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <param name="reg"></param>
/// <param name="regValue"></param>
/// <returns></returns>
public bool Get_Register(string ip, string authorization, int reg, out int regValue)
{
regValue = -1;
try
{
string url = "http://" + ip + "/api/v2.0.0/registers/" + reg + "?whitelist=value";
string json = HttpGet(url, ip, authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["value"].ToString();
float f = Convert.ToSingle(s);
regValue = Convert.ToInt32(f);
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 设置PLC寄存器的内容
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <param name="reg"></param>
/// <param name="regValue"></param>
/// <returns></returns>
public bool Set_Register(string ip, string authorization, int reg, int regValue)
{
try
{
string url = "http://" + ip + "/api/v2.0.0/registers/" + reg;
string body = "{\"value\": " + regValue + "}";
string json = HttpPost(url, ip, authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["value"].ToString();
float f = Convert.ToSingle(s);
if (regValue == Convert.ToInt32(f))
return true;
else
return false;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 添加任务到小车自身任务队列
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <param name="missionName"></param>
/// <param name="id"></param>
/// <returns></returns>
public bool Add_Mission(string ip, string authorization, string missionName, out string id)
{
id = null;
try
{
string url = "http://" + ip + "/api/v2.0.0/mission_queue";
string body = "{\"mission_id\":\"" + MissionList[missionName] + "\"}";
LOG.Info(string.Format("URL:{0} Body:{1}", url, body));
string json = HttpPost(url, ip, authorization, body);
LOG.Info("Return:" + json);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
id = dic["id"].ToString();
string missionId = dic["mission_id"].ToString();
if (missionId == MissionList[missionName])
return true;
else
return false;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 添加任务到Fleet任务队列
/// </summary>
/// <param name="fleetID"></param>
/// <param name="authorization"></param>
/// <param name="missionName"></param>
/// <param name="id"></param>
/// <returns></returns>
public bool Add_Mission_Fleet(string fleetID, string authorization, string missionName, out string id)
{
id = null;
try
{
string url = "http://" + FleetIP + "/api/v2.0.0/mission_scheduler";
string body = "{\"mission_id\":\"" + MissionList[missionName] + "\",\"robot_id\":" + fleetID + "}";
LOG.Info(string.Format("URL:{0} Body:{1}", url, body));
string json = HttpPost(url, FleetIP, authorization, body);
LOG.Info("Return:" + json);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
id = dic["id"].ToString();
string missionId = dic["mission_id"].ToString();
if (missionId == MissionList[missionName])
return true;
else
return false;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
// /// <summary>
// /// 获取所有任务列表
// /// </summary>
// /// <param name="info"></param>
// /// <param name="mission">任务(名称,guid)</param>
// /// <returns></returns>
// public bool Get_Mission(AgvInfo info, out Dictionary<string, string> mission)
// {
// try
// {
// mission = null;
// string url = "http://" + info.IP + "/api/v2.0.0/missions/search?whitelist=guid,name";
// string body = "{\"filters\" :[]}";
// string json = HttpPost(url, info.IP, info.Authorization, body);
// Common.log.Info(string.Format("URL: {0}; Body: {1}", url, body)+"\n"+"Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// object[] obj = (object[])serializer.DeserializeObject(json);
// if (obj == null) return false;
// mission = new Dictionary<string, string>();
// for (int i = 0; i < obj.Length; i++)
// {
// Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
// mission.Add(dic["name"].ToString(), dic["guid"].ToString());
// }
// return true;
// }
// catch (Exception ex)
// {
// mission = null;
// Common.log.Error(ex);
// return false;
// }
// }
// /// <summary>
// /// 获取当前任务队列guid
// /// </summary>
// /// <param name="info"></param>
// /// <param name="mission"></param>
// /// <returns></returns>
// public bool Get_Mission_Queue(AgvInfo info, out List<string> mission)
// {
// try
// {
// mission = null;
// string url = "http://" + info.IP + "/api/v2.0.0/mission_queue/search";
// string body = "{\"filters\" : [{\"fieldname\": \"state\", \"operator\": \"IN\", \"value\": [\"Pending\", \"Executing\"]}]}";
// string json = HttpPost(url, info.IP, info.Authorization, body);
// Common.log.Info(string.Format("URL: {0}; Body: {1}", url, body)+"\n"+"Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// object[] obj = (object[])serializer.DeserializeObject(json);
// if (obj == null) return false;
// mission = new List<string>();
// Dictionary<string, object> dic;
// for (int i = 0; i < obj.Length; i++)
// {
// dic = (Dictionary<string, object>)obj[i];
// mission.Add(dic["id"].ToString());
// }
// for (int i = 0; i < mission.Count; i++)
// {
// url = "http://" + info.IP + "/api/v2.0.0/mission_queue/" + mission[i];
// json = HttpGet(url, info.IP, info.Authorization);
// serializer = new JavaScriptSerializer();
// dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
// mission[i] = dic["mission_id"].ToString();
// }
// return true;
// }
// catch (Exception ex)
// {
// mission = null;
// Common.log.Error(ex);
// return false;
// }
// }
/// <summary>
/// 删除小车所有任务
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
public void Del_Mission(string ip, string authorization)
{
try
{
string url = "http://" + ip + "/api/v2.0.0/mission_queue";
HttpDel(url, ip, authorization);
}
catch (Exception ex)
{
LOG.Error(ex);
}
}
/// <summary>
/// 删除Fleet尽快中指定id的任务,已运行的无法删除
/// </summary>
/// <param name="authorization"></param>
/// <param name="id"></param>
public void Del_Mission_Fleet(string authorization, string id)
{
try
{
string url = "http://" + FleetIP + "/api/v2.0.0/mission_scheduler/" + id;
HttpDel(url, FleetIP, authorization);
}
catch (Exception ex)
{
LOG.Error(ex);
}
}
/// <summary>
/// 获取当前小车状态
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <param name="stateID"></param>
/// <param name="stateText"></param>
/// <param name="battery"></param>
/// <param name="missionText"></param>
/// <param name="position"></param>
/// <returns></returns>
public bool Get_State(string ip, string authorization, out int stateID, out string stateText, out int battery, out string missionText, out System.Drawing.PointF position)
{
stateID = -1;
stateText = "";
battery = 0;
missionText = "";
position = new System.Drawing.PointF();
try
{
string url = "http://" + ip + "/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position";
string json = HttpGet(url, ip, authorization);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
stateID = Convert.ToInt32(dic["state_id"].ToString());
stateText = dic["state_text"].ToString();
missionText = dic["mission_text"].ToString();
Dictionary<string, object> tt = (Dictionary<string, object>)dic["position"];
position.X = Convert.ToSingle(tt["x"]);
position.Y = Convert.ToSingle(tt["y"]);
string s = dic["battery_percentage"].ToString();
float f = Convert.ToSingle(s);
battery = Convert.ToInt32(f);
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 小车状态改为Ready
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <returns></returns>
public bool State_Ready(string ip, string authorization)
{
try
{
string url = "http://" + ip + "/api/v2.0.0/status?whitelist=state_id,state_text";
string body = "{\"state_id\": 3}";
string json = HttpPut(url, ip, authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["state_id"].ToString();
if (s == "3")
return true;
else
return false;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 小车状态改为Pause
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <returns></returns>
public bool State_Pause(string ip, string authorization)
{
try
{
string url = "http://" + ip + "/api/v2.0.0/status?whitelist=state_id,state_text";
string body = "{\"state_id\": 4}";
string json = HttpPut(url, ip, authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
if (dic == null) return false;
string s = dic["state_id"].ToString();
if (s == "4")
return true;
else
return false;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 清除错误
/// </summary>
/// <param name="ip"></param>
/// <param name="authorization"></param>
/// <returns></returns>
public bool Clear_Error(string ip, string authorization)
{
try
{
string url = "http://" + ip + "/api/v2.0.0/status";
string body = "{\"clear_error\": true}";
string json = HttpPut(url, ip, authorization, body);
if (string.IsNullOrWhiteSpace(json)) return false;
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
/// <summary>
/// 检查IP地址
/// </summary>
/// <param name="ip"></param>
/// <returns></returns>
public bool CheckIP(string ip)
{
//IP合法
string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
bool rtn = System.Text.RegularExpressions.Regex.IsMatch(ip, pattern);
if (!rtn)
{
LOG.Info("非法的IP地址" + ip);
return false;
}
//Ping服务端
try
{
System.Net.NetworkInformation.Ping ping = new System.Net.NetworkInformation.Ping();
System.Net.NetworkInformation.PingReply result = ping.Send(ip, 2000);
ping.Dispose();
if (result.Status != System.Net.NetworkInformation.IPStatus.Success)
{
LOG.Info("Ping " + ip + " 请求没有响应");
return false;
}
return true;
}
catch (Exception ex)
{
LOG.Error(ex);
return false;
}
}
// public bool GetResourcePosition(AgvInfo info, out Dictionary<string, string> res)
// {
// res = new Dictionary<string, string>();
// string ip = Common.appConfig.AppSettings.Settings["FLEET"].Value;
// string url = "http://" + ip + "/api/v2.0.0/resources/positions";
// string json = HttpGet(url, info.IP, info.Authorization);
// Common.log.Info("URL: " + url + "\n" + "Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// object[] obj = (object[])serializer.DeserializeObject(json);
// if (obj == null) return false;
// for (int i = 0; i < obj.Length; i++)
// {
// string key;
// Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
// if (dic.TryGetValue("name", out object value))
// key = value.ToString();
// else
// continue;
// if (res.ContainsKey(key))
// continue;
// else
// res.Add(key, "");
// if (dic.TryGetValue("queue", out value))
// {
// object[] temp = (object[])value;
// if (temp.Length == 0) continue;
// string[] robotName = new string[temp.Length];
// for (int j = 0; j < temp.Length; j++)
// {
// if (GetRobot(info, temp[j].ToString(), out string name))
// robotName[j] = name;
// }
// res[key] = string.Join(",", robotName);
// }
// }
// return true;
// }
// public bool GetResourceArea(AgvInfo info, out Dictionary<string, string> res)
// {
// res = new Dictionary<string, string>();
// string ip = Common.appConfig.AppSettings.Settings["FLEET"].Value;
// string url = "http://" + ip + "/api/v2.0.0/resources/areas";
// string json = HttpGet(url, info.IP, info.Authorization);
// Common.log.Info("URL: " + url + "\n" + "Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// object[] obj = (object[])serializer.DeserializeObject(json);
// if (obj == null) return false;
// for (int i = 0; i < obj.Length; i++)
// {
// string key;
// Dictionary<string, object> dic = (Dictionary<string, object>)obj[i];
// if (dic.TryGetValue("name", out object value))
// key = value.ToString();
// else
// continue;
// if (res.ContainsKey(key))
// continue;
// else
// res.Add(key, "");
// if (dic.TryGetValue("queue", out value))
// {
// object[] temp = (object[])value;
// if (temp.Length == 0) continue;
// string[] robotName = new string[temp.Length];
// for (int j = 0; j < temp.Length; j++)
// {
// if (GetRobot(info, temp[j].ToString(), out string name))
// robotName[j] = name;
// }
// res[key] = string.Join(",", robotName);
// }
// }
// return true;
// }
// public bool GetRobot(AgvInfo info, string id, out string name)
// {
// name = "";
// string ip = Common.appConfig.AppSettings.Settings["FLEET"].Value;
// string url = "http://" + ip + "/api/v2.0.0/robots/" + id;
// string json = HttpGet(url, info.IP, info.Authorization);
// Common.log.Info("URL: " + url + "\n" + "Return: " + json);
// if (string.IsNullOrWhiteSpace(json)) return false;
// JavaScriptSerializer serializer = new JavaScriptSerializer();
// Dictionary<string, object> dic = (Dictionary<string, object>)serializer.DeserializeObject(json);
// if (dic.TryGetValue("status", out object value))
// {
// Dictionary<string, object> dic2 = (Dictionary<string, object>)value;
// if (dic2.TryGetValue("robot_name", out object robotName))
// {
// name = robotName.ToString();
// return true;
// }
// else
// {
// return false;
// }
// }
// else
// {
// return false;
// }
// }
private string HttpGet(string url, string ip, string authorization)
{
LOG.Info("[GET]URL:" + url);
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.GET);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Accept-Language", "zh_CN");
request.AddHeader("Authorization", authorization);
IRestResponse response = client.Execute(request);
string s = response.Content;
if (string.IsNullOrWhiteSpace(s))
{
s = "";
}
else
{
s = s.Replace("\n", "");
s = s.Replace("\r", "");
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
return s;
}
private string HttpPost(string url, string ip, string authorization, string body)
{
LOG.Info("[POST]URL:" + url + " Body:" + body);
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.POST);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
if (string.IsNullOrWhiteSpace(s))
{
s = "";
}
else
{
s = s.Replace("\n", "");
s = s.Replace("\r", "");
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
return s;
}
private string HttpPut(string url, string ip, string authorization, string body)
{
LOG.Info("[PUT]URL:" + url + " Body:" + body);
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.PUT);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", body, ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
if (string.IsNullOrWhiteSpace(s))
{
s = "";
}
else
{
s = s.Replace("\n", "");
s = s.Replace("\r", "");
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
return s;
}
private void HttpDel(string url, string ip, string authorization)
{
LOG.Info("[DELETE]URL:" + url);
RestClient client = new RestClient(url) { Timeout = httpTimeout };
RestRequest request = new RestRequest(Method.DELETE);
request.AddHeader("Host", ip);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Authorization", authorization);
request.AddParameter("application/json", "", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
string s = response.Content;
if (string.IsNullOrWhiteSpace(s))
{
s = "";
}
else
{
s = s.Replace("\n", "");
s = s.Replace("\r", "");
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
}
}
}

namespace AGVControl_Steel
{
/// <summary>
/// 任务执行的状态
/// </summary>
public enum MissionState
{
/// <summary>
/// 终止
/// </summary>
Aborted,
/// <summary>
/// 执行中
/// </summary>
Executing,
/// <summary>
/// 已完成
/// </summary>
Done
}
public enum StateID
{
None = 0,
Starting,
ShuttingDown,
Ready,
Pause,
Executing,
Aborted,
Completed,
Docked,
Docking,
EmergencyStop,
ManualControl,
Error
}
}
\ No newline at end of file
using System;
namespace AGVControl_Steel
{
public class SteelWork
{
public string From { set; get; }
public string Place { set; get; }
public DateTime DateTime { set; get; }
public SteelWork()
{
DateTime = DateTime.Now;
}
}
}
\ No newline at end of file
using System;
using System.Windows.Forms;
namespace AGVControl_Steel
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
log4net.Config.XmlConfigurator.Configure();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (Asa.WindowsForm.IsRun())
{
MessageBox.Show("IsRun");
return;
}
if (!Asa.WindowsForm.IsAdmin())
{
Asa.WindowsForm.AdminRun();
return;
}
Common.appConfig = System.Configuration.ConfigurationManager.OpenExeConfiguration(System.Configuration.ConfigurationUserLevel.None);
Common.log = log4net.LogManager.GetLogger("AGVControl_Steel");
Common.log.Info("=====程序开始=====");
ReadConfig();
Common.steelManage = new BLL.SteelManage();
Common.control = new BLL.Control();
Common.mir = new Model.MiR_API { FleetIP = Common.appConfig.AppSettings.Settings["FLEET_IP"].Value, MissionList = Common.agvMissions };
Application.Run(new FrmMain());
Common.control.Stop();
Common.log.Info("=====程序结束=====\r\n");
}
private static void ReadConfig()
{
try
{
//AGV小车信息
Common.agvInfos = new System.Collections.Generic.List<Model.AgvInfo>();
string[] lines = System.IO.File.ReadAllLines(Common.PATH_AGV_NAME, System.Text.Encoding.UTF8);
for (int i = 0; i < lines.Length; i++)
{
string[] str = lines[i].Split(',');
if (str.Length != 4) continue;
string isUse = "false";
string key = "Use_" + str[0];
if (Common.appConfig.AppSettings.Settings[key] == null)
{
Common.appConfig.AppSettings.Settings.Add(key, "false");
Common.appConfig.Save();
System.Configuration.ConfigurationManager.RefreshSection("appSettings");
}
else
{
isUse = Common.appConfig.AppSettings.Settings[key].Value;
}
key = "Work_" + str[0];
Model.AgvInfo info = new Model.AgvInfo
{
FleetID = str[0],
Name = str[1],
IP = str[2],
Authorization = str[3],
IsAuto = Convert.ToBoolean(isUse),
BatteryMax = Convert.ToInt32(Common.appConfig.AppSettings.Settings["AGV_BATTERY_MAX"].Value),
BatteryMin = Convert.ToInt32(Common.appConfig.AppSettings.Settings["AGV_BATTERY_MIN"].Value),
Workshop = Common.appConfig.AppSettings.Settings[key].Value
};
Common.agvInfos.Add(info);
}
Common.log.Info("读取配置文件 " + Common.PATH_AGV_NAME);
//AGV任务ID号
Common.agvMissions = new System.Collections.Generic.Dictionary<string, string>();
lines = System.IO.File.ReadAllLines(Common.PATH_AGV_MISSION, System.Text.Encoding.UTF8);
for (int i = 0; i < lines.Length; i++)
{
string[] str = lines[i].Split(',');
if (str.Length != 2) continue;
Common.agvMissions.Add(str[0], str[1]);
}
Common.log.Info("读取配置文件 " + Common.PATH_AGV_MISSION);
Common.PLACE_NAME = Common.appConfig.AppSettings.Settings["PlaceName"].Value.Split(',');
Common.FLEET_SEND = Convert.ToBoolean(Common.appConfig.AppSettings.Settings["FLEET_Send"].Value);
//string id = Common.appConfig.AppSettings.Settings["4D_AGV"].Value;
//int idx = Common.agvInfos.FindIndex(match => match.FleetID == id);
//if (idx > -1) Common.agvInfos[idx].Workshop = Common.WORKSHOP_4D;
//id = Common.appConfig.AppSettings.Settings["4C_AGV"].Value;
//idx = Common.agvInfos.FindIndex(match => match.FleetID == id);
//if (idx > -1) Common.agvInfos[idx].Workshop = Common.WORKSHOP_4C;
}
catch (Exception ex)
{
Common.log.Error("ReadConfig()", ex);
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("AGVControl_Steel")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AGVControl_Steel")]
[assembly: AssemblyCopyright("Copyright © 2020")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("be830571-6737-4fa7-a75b-0242b07e011c")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.1.1.0")]
[assembly: AssemblyFileVersion("1.1.1.0")]
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本: 4.0.30319.42000
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGVControl_Steel.Properties
{
/// <summary>
/// 强类型资源类,用于查找本地化字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或删除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// 返回此类使用的缓存 ResourceManager 实例。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("AGVControl_Steel.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// 覆盖当前线程的 CurrentUICulture 属性
/// 使用此强类型的资源类的资源查找。
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>
\ No newline at end of file
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace AGVControl_Steel.Properties
{
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default
{
get
{
return defaultInstance;
}
}
}
}
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
<Profiles>
<Profile Name="(Default)" />
</Profiles>
<Settings />
</SettingsFile>
namespace AGVControl_Steel
{
partial class FrmMain
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle9 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle10 = 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.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle7 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle8 = new System.Windows.Forms.DataGridViewCellStyle();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain));
this.DgvName = new System.Windows.Forms.DataGridView();
this.Column1 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column2 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column5 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column3 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column7 = new System.Windows.Forms.DataGridViewTextBoxColumn();
this.Column4 = new System.Windows.Forms.DataGridViewButtonColumn();
this.Column8 = new System.Windows.Forms.DataGridViewButtonColumn();
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage2 = new System.Windows.Forms.TabPage();
this.tableLayoutPanel5 = new System.Windows.Forms.TableLayoutPanel();
this.TxtAgvMission0 = new System.Windows.Forms.TextBox();
this.TxtLog = new System.Windows.Forms.TextBox();
this.TxtAgvMission1 = new System.Windows.Forms.TextBox();
this.LblStorageIO = new System.Windows.Forms.Label();
this.LblWeb = new System.Windows.Forms.Label();
this.tabPage3 = new System.Windows.Forms.TabPage();
this.ChkMissionDebug = new System.Windows.Forms.CheckBox();
this.ChkStorageIO = new System.Windows.Forms.CheckBox();
this.LblMissionHint = new System.Windows.Forms.Label();
this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
this.LstStorage = new System.Windows.Forms.ListBox();
this.LstOldSteel = new System.Windows.Forms.ListBox();
this.LstNewSteel = new System.Windows.Forms.ListBox();
this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel();
this.BtnOldSteelWorkDelAll = new System.Windows.Forms.Button();
this.BtnOldSteelWorkDel = new System.Windows.Forms.Button();
this.BtnOldSteelWorkAdd = new System.Windows.Forms.Button();
this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel();
this.BtnNewSteelWorkDelAll = new System.Windows.Forms.Button();
this.BtnNewSteelWorkDel = new System.Windows.Forms.Button();
this.BtnNewSteelWorkAdd = new System.Windows.Forms.Button();
this.tableLayoutPanel4 = new System.Windows.Forms.TableLayoutPanel();
this.BtnStorageWorkDelAll = new System.Windows.Forms.Button();
this.BtnStorageWorkDel = new System.Windows.Forms.Button();
this.BtnStorageWorkAdd = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.BtnMissionPause = new System.Windows.Forms.Button();
this.BtnMissionRun = new System.Windows.Forms.Button();
this.BtnMissionClear = new System.Windows.Forms.Button();
this.BtnMissionAdd = new System.Windows.Forms.Button();
this.LstMission = new System.Windows.Forms.ListBox();
this.BtnClearLog = new System.Windows.Forms.Button();
((System.ComponentModel.ISupportInitialize)(this.DgvName)).BeginInit();
this.tabControl1.SuspendLayout();
this.tabPage2.SuspendLayout();
this.tableLayoutPanel5.SuspendLayout();
this.tabPage3.SuspendLayout();
this.tableLayoutPanel1.SuspendLayout();
this.tableLayoutPanel2.SuspendLayout();
this.tableLayoutPanel3.SuspendLayout();
this.tableLayoutPanel4.SuspendLayout();
this.tabPage1.SuspendLayout();
this.SuspendLayout();
//
// DgvName
//
this.DgvName.AllowUserToAddRows = false;
this.DgvName.AllowUserToDeleteRows = false;
this.DgvName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle1.Font = new System.Drawing.Font("宋体", 12F);
dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.DgvName.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1;
this.DgvName.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.DgvName.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
this.Column1,
this.Column2,
this.Column5,
this.Column3,
this.Column7,
this.Column4,
this.Column8});
dataGridViewCellStyle9.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle9.BackColor = System.Drawing.SystemColors.Window;
dataGridViewCellStyle9.Font = new System.Drawing.Font("宋体", 12F);
dataGridViewCellStyle9.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle9.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle9.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle9.WrapMode = System.Windows.Forms.DataGridViewTriState.False;
this.DgvName.DefaultCellStyle = dataGridViewCellStyle9;
this.DgvName.Location = new System.Drawing.Point(12, 12);
this.DgvName.Name = "DgvName";
this.DgvName.ReadOnly = true;
dataGridViewCellStyle10.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft;
dataGridViewCellStyle10.BackColor = System.Drawing.SystemColors.Control;
dataGridViewCellStyle10.Font = new System.Drawing.Font("宋体", 12F);
dataGridViewCellStyle10.ForeColor = System.Drawing.SystemColors.WindowText;
dataGridViewCellStyle10.SelectionBackColor = System.Drawing.SystemColors.Highlight;
dataGridViewCellStyle10.SelectionForeColor = System.Drawing.SystemColors.HighlightText;
dataGridViewCellStyle10.WrapMode = System.Windows.Forms.DataGridViewTriState.True;
this.DgvName.RowHeadersDefaultCellStyle = dataGridViewCellStyle10;
this.DgvName.RowHeadersWidth = 50;
this.DgvName.RowTemplate.Height = 23;
this.DgvName.Size = new System.Drawing.Size(833, 88);
this.DgvName.TabIndex = 0;
this.DgvName.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DgvName_CellContentClick);
//
// Column1
//
this.Column1.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
dataGridViewCellStyle2.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column1.DefaultCellStyle = dataGridViewCellStyle2;
this.Column1.HeaderText = "名称";
this.Column1.Name = "Column1";
this.Column1.ReadOnly = true;
this.Column1.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column2
//
this.Column2.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
dataGridViewCellStyle3.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column2.DefaultCellStyle = dataGridViewCellStyle3;
this.Column2.HeaderText = "地点";
this.Column2.Name = "Column2";
this.Column2.ReadOnly = true;
this.Column2.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column5
//
this.Column5.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
dataGridViewCellStyle4.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column5.DefaultCellStyle = dataGridViewCellStyle4;
this.Column5.HeaderText = "小车状态";
this.Column5.Name = "Column5";
this.Column5.ReadOnly = true;
this.Column5.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
//
// Column3
//
this.Column3.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
dataGridViewCellStyle5.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column3.DefaultCellStyle = dataGridViewCellStyle5;
this.Column3.HeaderText = "电量";
this.Column3.Name = "Column3";
this.Column3.ReadOnly = true;
this.Column3.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column3.Width = 80;
//
// Column7
//
this.Column7.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
dataGridViewCellStyle6.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column7.DefaultCellStyle = dataGridViewCellStyle6;
this.Column7.HeaderText = "在线";
this.Column7.Name = "Column7";
this.Column7.ReadOnly = true;
this.Column7.SortMode = System.Windows.Forms.DataGridViewColumnSortMode.NotSortable;
this.Column7.Width = 80;
//
// Column4
//
this.Column4.AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.None;
dataGridViewCellStyle7.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
dataGridViewCellStyle7.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column4.DefaultCellStyle = dataGridViewCellStyle7;
this.Column4.HeaderText = "自动";
this.Column4.Name = "Column4";
this.Column4.ReadOnly = true;
this.Column4.Width = 80;
//
// Column8
//
dataGridViewCellStyle8.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleCenter;
dataGridViewCellStyle8.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Column8.DefaultCellStyle = dataGridViewCellStyle8;
this.Column8.HeaderText = "任务";
this.Column8.Name = "Column8";
this.Column8.ReadOnly = true;
//
// tabControl1
//
this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tabControl1.Controls.Add(this.tabPage2);
this.tabControl1.Controls.Add(this.tabPage3);
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Font = new System.Drawing.Font("宋体", 12F);
this.tabControl1.Location = new System.Drawing.Point(12, 106);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(833, 552);
this.tabControl1.TabIndex = 1;
//
// tabPage2
//
this.tabPage2.Controls.Add(this.BtnClearLog);
this.tabPage2.Controls.Add(this.tableLayoutPanel5);
this.tabPage2.Controls.Add(this.LblStorageIO);
this.tabPage2.Controls.Add(this.LblWeb);
this.tabPage2.Location = new System.Drawing.Point(4, 26);
this.tabPage2.Name = "tabPage2";
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(825, 522);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "状态";
this.tabPage2.UseVisualStyleBackColor = true;
//
// tableLayoutPanel5
//
this.tableLayoutPanel5.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.tableLayoutPanel5.ColumnCount = 2;
this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 70F));
this.tableLayoutPanel5.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 30F));
this.tableLayoutPanel5.Controls.Add(this.TxtAgvMission0, 1, 0);
this.tableLayoutPanel5.Controls.Add(this.TxtLog, 0, 0);
this.tableLayoutPanel5.Controls.Add(this.TxtAgvMission1, 1, 1);
this.tableLayoutPanel5.Location = new System.Drawing.Point(6, 48);
this.tableLayoutPanel5.Name = "tableLayoutPanel5";
this.tableLayoutPanel5.RowCount = 2;
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
this.tableLayoutPanel5.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel5.Size = new System.Drawing.Size(813, 468);
this.tableLayoutPanel5.TabIndex = 10;
//
// TxtAgvMission0
//
this.TxtAgvMission0.Dock = System.Windows.Forms.DockStyle.Fill;
this.TxtAgvMission0.Font = new System.Drawing.Font("宋体", 12F);
this.TxtAgvMission0.Location = new System.Drawing.Point(572, 3);
this.TxtAgvMission0.Multiline = true;
this.TxtAgvMission0.Name = "TxtAgvMission0";
this.TxtAgvMission0.ReadOnly = true;
this.TxtAgvMission0.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.TxtAgvMission0.Size = new System.Drawing.Size(238, 228);
this.TxtAgvMission0.TabIndex = 11;
//
// TxtLog
//
this.TxtLog.Dock = System.Windows.Forms.DockStyle.Fill;
this.TxtLog.Font = new System.Drawing.Font("宋体", 12F);
this.TxtLog.Location = new System.Drawing.Point(3, 3);
this.TxtLog.Multiline = true;
this.TxtLog.Name = "TxtLog";
this.TxtLog.ReadOnly = true;
this.tableLayoutPanel5.SetRowSpan(this.TxtLog, 2);
this.TxtLog.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.TxtLog.Size = new System.Drawing.Size(563, 462);
this.TxtLog.TabIndex = 2;
//
// TxtAgvMission1
//
this.TxtAgvMission1.Dock = System.Windows.Forms.DockStyle.Fill;
this.TxtAgvMission1.Font = new System.Drawing.Font("宋体", 12F);
this.TxtAgvMission1.Location = new System.Drawing.Point(572, 237);
this.TxtAgvMission1.Multiline = true;
this.TxtAgvMission1.Name = "TxtAgvMission1";
this.TxtAgvMission1.ReadOnly = true;
this.TxtAgvMission1.ScrollBars = System.Windows.Forms.ScrollBars.Both;
this.TxtAgvMission1.Size = new System.Drawing.Size(238, 228);
this.TxtAgvMission1.TabIndex = 12;
//
// LblStorageIO
//
this.LblStorageIO.BackColor = System.Drawing.Color.Red;
this.LblStorageIO.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.LblStorageIO.Location = new System.Drawing.Point(165, 9);
this.LblStorageIO.Margin = new System.Windows.Forms.Padding(3, 6, 6, 6);
this.LblStorageIO.Name = "LblStorageIO";
this.LblStorageIO.Size = new System.Drawing.Size(160, 30);
this.LblStorageIO.TabIndex = 9;
this.LblStorageIO.Tag = "0";
this.LblStorageIO.Text = "仓库IO信号 OFF (0)";
this.LblStorageIO.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// LblWeb
//
this.LblWeb.BackColor = System.Drawing.Color.Red;
this.LblWeb.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.LblWeb.Location = new System.Drawing.Point(9, 9);
this.LblWeb.Margin = new System.Windows.Forms.Padding(6, 6, 3, 6);
this.LblWeb.Name = "LblWeb";
this.LblWeb.Size = new System.Drawing.Size(150, 30);
this.LblWeb.TabIndex = 0;
this.LblWeb.Text = "WebService Close";
this.LblWeb.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// tabPage3
//
this.tabPage3.Controls.Add(this.ChkMissionDebug);
this.tabPage3.Controls.Add(this.ChkStorageIO);
this.tabPage3.Controls.Add(this.LblMissionHint);
this.tabPage3.Controls.Add(this.tableLayoutPanel1);
this.tabPage3.Location = new System.Drawing.Point(4, 26);
this.tabPage3.Name = "tabPage3";
this.tabPage3.Padding = new System.Windows.Forms.Padding(3);
this.tabPage3.Size = new System.Drawing.Size(819, 522);
this.tabPage3.TabIndex = 3;
this.tabPage3.Text = "钢网任务";
this.tabPage3.UseVisualStyleBackColor = true;
//
// ChkMissionDebug
//
this.ChkMissionDebug.Appearance = System.Windows.Forms.Appearance.Button;
this.ChkMissionDebug.BackColor = System.Drawing.Color.Red;
this.ChkMissionDebug.FlatAppearance.BorderColor = System.Drawing.Color.White;
this.ChkMissionDebug.FlatAppearance.BorderSize = 0;
this.ChkMissionDebug.FlatAppearance.CheckedBackColor = System.Drawing.Color.Lime;
this.ChkMissionDebug.FlatAppearance.MouseDownBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
this.ChkMissionDebug.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(192)))), ((int)(((byte)(255)))));
this.ChkMissionDebug.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.ChkMissionDebug.Location = new System.Drawing.Point(540, 6);
this.ChkMissionDebug.Name = "ChkMissionDebug";
this.ChkMissionDebug.Size = new System.Drawing.Size(130, 40);
this.ChkMissionDebug.TabIndex = 5;
this.ChkMissionDebug.Text = "调试功能";
this.ChkMissionDebug.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.ChkMissionDebug.UseVisualStyleBackColor = false;
this.ChkMissionDebug.CheckedChanged += new System.EventHandler(this.ChkMissionDebug_CheckedChanged);
//
// ChkStorageIO
//
this.ChkStorageIO.AutoSize = true;
this.ChkStorageIO.Enabled = false;
this.ChkStorageIO.Location = new System.Drawing.Point(542, 52);
this.ChkStorageIO.Name = "ChkStorageIO";
this.ChkStorageIO.Size = new System.Drawing.Size(171, 20);
this.ChkStorageIO.TabIndex = 4;
this.ChkStorageIO.Text = "仓库IO信号始终为ON";
this.ChkStorageIO.UseVisualStyleBackColor = true;
this.ChkStorageIO.CheckedChanged += new System.EventHandler(this.ChkStorageIO_CheckedChanged);
//
// LblMissionHint
//
this.LblMissionHint.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.LblMissionHint.Font = new System.Drawing.Font("宋体", 9F);
this.LblMissionHint.Location = new System.Drawing.Point(540, 451);
this.LblMissionHint.Margin = new System.Windows.Forms.Padding(3);
this.LblMissionHint.Name = "LblMissionHint";
this.LblMissionHint.Size = new System.Drawing.Size(273, 65);
this.LblMissionHint.TabIndex = 3;
this.LblMissionHint.Text = "label4";
this.LblMissionHint.TextAlign = System.Drawing.ContentAlignment.BottomLeft;
//
// tableLayoutPanel1
//
this.tableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.tableLayoutPanel1.ColumnCount = 2;
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 400F));
this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 128F));
this.tableLayoutPanel1.Controls.Add(this.LstStorage, 0, 5);
this.tableLayoutPanel1.Controls.Add(this.LstOldSteel, 0, 1);
this.tableLayoutPanel1.Controls.Add(this.LstNewSteel, 0, 3);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel2, 1, 1);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel3, 1, 3);
this.tableLayoutPanel1.Controls.Add(this.tableLayoutPanel4, 1, 5);
this.tableLayoutPanel1.Controls.Add(this.label1, 0, 0);
this.tableLayoutPanel1.Controls.Add(this.label2, 0, 2);
this.tableLayoutPanel1.Controls.Add(this.label3, 0, 4);
this.tableLayoutPanel1.Font = new System.Drawing.Font("宋体", 12F);
this.tableLayoutPanel1.Location = new System.Drawing.Point(6, 6);
this.tableLayoutPanel1.Name = "tableLayoutPanel1";
this.tableLayoutPanel1.RowCount = 6;
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 30F));
this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel1.Size = new System.Drawing.Size(528, 510);
this.tableLayoutPanel1.TabIndex = 2;
//
// LstStorage
//
this.LstStorage.Dock = System.Windows.Forms.DockStyle.Fill;
this.LstStorage.FormattingEnabled = true;
this.LstStorage.IntegralHeight = false;
this.LstStorage.ItemHeight = 16;
this.LstStorage.Location = new System.Drawing.Point(3, 373);
this.LstStorage.Name = "LstStorage";
this.LstStorage.Size = new System.Drawing.Size(394, 134);
this.LstStorage.TabIndex = 5;
//
// LstOldSteel
//
this.LstOldSteel.Dock = System.Windows.Forms.DockStyle.Fill;
this.LstOldSteel.FormattingEnabled = true;
this.LstOldSteel.IntegralHeight = false;
this.LstOldSteel.ItemHeight = 16;
this.LstOldSteel.Location = new System.Drawing.Point(3, 33);
this.LstOldSteel.Name = "LstOldSteel";
this.LstOldSteel.Size = new System.Drawing.Size(394, 134);
this.LstOldSteel.TabIndex = 3;
//
// LstNewSteel
//
this.LstNewSteel.Dock = System.Windows.Forms.DockStyle.Fill;
this.LstNewSteel.FormattingEnabled = true;
this.LstNewSteel.IntegralHeight = false;
this.LstNewSteel.ItemHeight = 16;
this.LstNewSteel.Location = new System.Drawing.Point(3, 203);
this.LstNewSteel.Name = "LstNewSteel";
this.LstNewSteel.Size = new System.Drawing.Size(394, 134);
this.LstNewSteel.TabIndex = 4;
//
// tableLayoutPanel2
//
this.tableLayoutPanel2.ColumnCount = 1;
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.Controls.Add(this.BtnOldSteelWorkDelAll, 0, 2);
this.tableLayoutPanel2.Controls.Add(this.BtnOldSteelWorkDel, 0, 1);
this.tableLayoutPanel2.Controls.Add(this.BtnOldSteelWorkAdd, 0, 0);
this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel2.Location = new System.Drawing.Point(403, 33);
this.tableLayoutPanel2.Name = "tableLayoutPanel2";
this.tableLayoutPanel2.RowCount = 3;
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel2.Size = new System.Drawing.Size(122, 134);
this.tableLayoutPanel2.TabIndex = 3;
//
// BtnOldSteelWorkDelAll
//
this.BtnOldSteelWorkDelAll.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnOldSteelWorkDelAll.Enabled = false;
this.BtnOldSteelWorkDelAll.Font = new System.Drawing.Font("宋体", 12F);
this.BtnOldSteelWorkDelAll.Location = new System.Drawing.Point(3, 91);
this.BtnOldSteelWorkDelAll.Name = "BtnOldSteelWorkDelAll";
this.BtnOldSteelWorkDelAll.Size = new System.Drawing.Size(116, 40);
this.BtnOldSteelWorkDelAll.TabIndex = 17;
this.BtnOldSteelWorkDelAll.Text = "全部删除";
this.BtnOldSteelWorkDelAll.UseVisualStyleBackColor = true;
this.BtnOldSteelWorkDelAll.Click += new System.EventHandler(this.BtnOldSteelWorkDelAll_Click);
//
// BtnOldSteelWorkDel
//
this.BtnOldSteelWorkDel.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnOldSteelWorkDel.Enabled = false;
this.BtnOldSteelWorkDel.Font = new System.Drawing.Font("宋体", 12F);
this.BtnOldSteelWorkDel.Location = new System.Drawing.Point(3, 47);
this.BtnOldSteelWorkDel.Name = "BtnOldSteelWorkDel";
this.BtnOldSteelWorkDel.Size = new System.Drawing.Size(116, 38);
this.BtnOldSteelWorkDel.TabIndex = 16;
this.BtnOldSteelWorkDel.Text = "删除任务";
this.BtnOldSteelWorkDel.UseVisualStyleBackColor = true;
this.BtnOldSteelWorkDel.Click += new System.EventHandler(this.BtnOldSteelWorkDel_Click);
//
// BtnOldSteelWorkAdd
//
this.BtnOldSteelWorkAdd.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnOldSteelWorkAdd.Enabled = false;
this.BtnOldSteelWorkAdd.Font = new System.Drawing.Font("宋体", 12F);
this.BtnOldSteelWorkAdd.Location = new System.Drawing.Point(3, 3);
this.BtnOldSteelWorkAdd.Name = "BtnOldSteelWorkAdd";
this.BtnOldSteelWorkAdd.Size = new System.Drawing.Size(116, 38);
this.BtnOldSteelWorkAdd.TabIndex = 15;
this.BtnOldSteelWorkAdd.Text = "添加任务";
this.BtnOldSteelWorkAdd.UseVisualStyleBackColor = true;
this.BtnOldSteelWorkAdd.Click += new System.EventHandler(this.BtnOldSteelWorkAdd_Click);
//
// tableLayoutPanel3
//
this.tableLayoutPanel3.ColumnCount = 1;
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.Controls.Add(this.BtnNewSteelWorkDelAll, 0, 2);
this.tableLayoutPanel3.Controls.Add(this.BtnNewSteelWorkDel, 0, 1);
this.tableLayoutPanel3.Controls.Add(this.BtnNewSteelWorkAdd, 0, 0);
this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel3.Location = new System.Drawing.Point(403, 203);
this.tableLayoutPanel3.Name = "tableLayoutPanel3";
this.tableLayoutPanel3.RowCount = 3;
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel3.Size = new System.Drawing.Size(122, 134);
this.tableLayoutPanel3.TabIndex = 4;
//
// BtnNewSteelWorkDelAll
//
this.BtnNewSteelWorkDelAll.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnNewSteelWorkDelAll.Enabled = false;
this.BtnNewSteelWorkDelAll.Font = new System.Drawing.Font("宋体", 12F);
this.BtnNewSteelWorkDelAll.Location = new System.Drawing.Point(3, 91);
this.BtnNewSteelWorkDelAll.Name = "BtnNewSteelWorkDelAll";
this.BtnNewSteelWorkDelAll.Size = new System.Drawing.Size(116, 40);
this.BtnNewSteelWorkDelAll.TabIndex = 17;
this.BtnNewSteelWorkDelAll.Text = "全部删除";
this.BtnNewSteelWorkDelAll.UseVisualStyleBackColor = true;
this.BtnNewSteelWorkDelAll.Click += new System.EventHandler(this.BtnNewSteelWorkDelAll_Click);
//
// BtnNewSteelWorkDel
//
this.BtnNewSteelWorkDel.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnNewSteelWorkDel.Enabled = false;
this.BtnNewSteelWorkDel.Font = new System.Drawing.Font("宋体", 12F);
this.BtnNewSteelWorkDel.Location = new System.Drawing.Point(3, 47);
this.BtnNewSteelWorkDel.Name = "BtnNewSteelWorkDel";
this.BtnNewSteelWorkDel.Size = new System.Drawing.Size(116, 38);
this.BtnNewSteelWorkDel.TabIndex = 16;
this.BtnNewSteelWorkDel.Text = "删除任务";
this.BtnNewSteelWorkDel.UseVisualStyleBackColor = true;
this.BtnNewSteelWorkDel.Click += new System.EventHandler(this.BtnNewSteelWorkDel_Click);
//
// BtnNewSteelWorkAdd
//
this.BtnNewSteelWorkAdd.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnNewSteelWorkAdd.Enabled = false;
this.BtnNewSteelWorkAdd.Font = new System.Drawing.Font("宋体", 12F);
this.BtnNewSteelWorkAdd.Location = new System.Drawing.Point(3, 3);
this.BtnNewSteelWorkAdd.Name = "BtnNewSteelWorkAdd";
this.BtnNewSteelWorkAdd.Size = new System.Drawing.Size(116, 38);
this.BtnNewSteelWorkAdd.TabIndex = 15;
this.BtnNewSteelWorkAdd.Text = "添加任务";
this.BtnNewSteelWorkAdd.UseVisualStyleBackColor = true;
this.BtnNewSteelWorkAdd.Click += new System.EventHandler(this.BtnNewSteelWorkAdd_Click);
//
// tableLayoutPanel4
//
this.tableLayoutPanel4.ColumnCount = 1;
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.Absolute, 20F));
this.tableLayoutPanel4.Controls.Add(this.BtnStorageWorkDelAll, 0, 2);
this.tableLayoutPanel4.Controls.Add(this.BtnStorageWorkDel, 0, 1);
this.tableLayoutPanel4.Controls.Add(this.BtnStorageWorkAdd, 0, 0);
this.tableLayoutPanel4.Dock = System.Windows.Forms.DockStyle.Fill;
this.tableLayoutPanel4.Location = new System.Drawing.Point(403, 373);
this.tableLayoutPanel4.Name = "tableLayoutPanel4";
this.tableLayoutPanel4.RowCount = 3;
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 33.33333F));
this.tableLayoutPanel4.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F));
this.tableLayoutPanel4.Size = new System.Drawing.Size(122, 134);
this.tableLayoutPanel4.TabIndex = 5;
//
// BtnStorageWorkDelAll
//
this.BtnStorageWorkDelAll.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnStorageWorkDelAll.Enabled = false;
this.BtnStorageWorkDelAll.Font = new System.Drawing.Font("宋体", 12F);
this.BtnStorageWorkDelAll.Location = new System.Drawing.Point(3, 91);
this.BtnStorageWorkDelAll.Name = "BtnStorageWorkDelAll";
this.BtnStorageWorkDelAll.Size = new System.Drawing.Size(116, 40);
this.BtnStorageWorkDelAll.TabIndex = 17;
this.BtnStorageWorkDelAll.Text = "全部删除";
this.BtnStorageWorkDelAll.UseVisualStyleBackColor = true;
this.BtnStorageWorkDelAll.Click += new System.EventHandler(this.BtnStorageWorkDelAll_Click);
//
// BtnStorageWorkDel
//
this.BtnStorageWorkDel.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnStorageWorkDel.Enabled = false;
this.BtnStorageWorkDel.Font = new System.Drawing.Font("宋体", 12F);
this.BtnStorageWorkDel.Location = new System.Drawing.Point(3, 47);
this.BtnStorageWorkDel.Name = "BtnStorageWorkDel";
this.BtnStorageWorkDel.Size = new System.Drawing.Size(116, 38);
this.BtnStorageWorkDel.TabIndex = 16;
this.BtnStorageWorkDel.Text = "删除任务";
this.BtnStorageWorkDel.UseVisualStyleBackColor = true;
this.BtnStorageWorkDel.Click += new System.EventHandler(this.BtnStorageWorkDel_Click);
//
// BtnStorageWorkAdd
//
this.BtnStorageWorkAdd.Dock = System.Windows.Forms.DockStyle.Fill;
this.BtnStorageWorkAdd.Enabled = false;
this.BtnStorageWorkAdd.Font = new System.Drawing.Font("宋体", 12F);
this.BtnStorageWorkAdd.Location = new System.Drawing.Point(3, 3);
this.BtnStorageWorkAdd.Name = "BtnStorageWorkAdd";
this.BtnStorageWorkAdd.Size = new System.Drawing.Size(116, 38);
this.BtnStorageWorkAdd.TabIndex = 15;
this.BtnStorageWorkAdd.Text = "添加任务";
this.BtnStorageWorkAdd.UseVisualStyleBackColor = true;
this.BtnStorageWorkAdd.Click += new System.EventHandler(this.BtnStorageWorkAdd_Click);
//
// label1
//
this.label1.Dock = System.Windows.Forms.DockStyle.Fill;
this.label1.Location = new System.Drawing.Point(3, 3);
this.label1.Margin = new System.Windows.Forms.Padding(3);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(394, 24);
this.label1.TabIndex = 10;
this.label1.Text = "回收钢板任务";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label2
//
this.label2.Dock = System.Windows.Forms.DockStyle.Fill;
this.label2.Location = new System.Drawing.Point(3, 173);
this.label2.Margin = new System.Windows.Forms.Padding(3);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(394, 24);
this.label2.TabIndex = 12;
this.label2.Text = "送新钢板任务";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// label3
//
this.label3.Dock = System.Windows.Forms.DockStyle.Fill;
this.label3.Location = new System.Drawing.Point(3, 343);
this.label3.Margin = new System.Windows.Forms.Padding(3);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(394, 24);
this.label3.TabIndex = 14;
this.label3.Text = "仓库出入库任务";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
//
// tabPage1
//
this.tabPage1.Controls.Add(this.BtnMissionPause);
this.tabPage1.Controls.Add(this.BtnMissionRun);
this.tabPage1.Controls.Add(this.BtnMissionClear);
this.tabPage1.Controls.Add(this.BtnMissionAdd);
this.tabPage1.Controls.Add(this.LstMission);
this.tabPage1.Location = new System.Drawing.Point(4, 26);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
this.tabPage1.Size = new System.Drawing.Size(819, 522);
this.tabPage1.TabIndex = 2;
this.tabPage1.Text = "小车任务";
this.tabPage1.UseVisualStyleBackColor = true;
//
// BtnMissionPause
//
this.BtnMissionPause.Font = new System.Drawing.Font("宋体", 12F);
this.BtnMissionPause.Location = new System.Drawing.Point(232, 204);
this.BtnMissionPause.Name = "BtnMissionPause";
this.BtnMissionPause.Size = new System.Drawing.Size(120, 60);
this.BtnMissionPause.TabIndex = 16;
this.BtnMissionPause.Text = "暂停";
this.BtnMissionPause.UseVisualStyleBackColor = true;
this.BtnMissionPause.Click += new System.EventHandler(this.BtnMissionPause_Click);
//
// BtnMissionRun
//
this.BtnMissionRun.Font = new System.Drawing.Font("宋体", 12F);
this.BtnMissionRun.Location = new System.Drawing.Point(232, 138);
this.BtnMissionRun.Name = "BtnMissionRun";
this.BtnMissionRun.Size = new System.Drawing.Size(120, 60);
this.BtnMissionRun.TabIndex = 15;
this.BtnMissionRun.Text = "运行";
this.BtnMissionRun.UseVisualStyleBackColor = true;
this.BtnMissionRun.Click += new System.EventHandler(this.BtnMissionRun_Click);
//
// BtnMissionClear
//
this.BtnMissionClear.Font = new System.Drawing.Font("宋体", 12F);
this.BtnMissionClear.Location = new System.Drawing.Point(232, 72);
this.BtnMissionClear.Name = "BtnMissionClear";
this.BtnMissionClear.Size = new System.Drawing.Size(120, 60);
this.BtnMissionClear.TabIndex = 14;
this.BtnMissionClear.Text = "删除任务";
this.BtnMissionClear.UseVisualStyleBackColor = true;
this.BtnMissionClear.Click += new System.EventHandler(this.BtnMissionClear_Click);
//
// BtnMissionAdd
//
this.BtnMissionAdd.Font = new System.Drawing.Font("宋体", 12F);
this.BtnMissionAdd.Location = new System.Drawing.Point(232, 6);
this.BtnMissionAdd.Name = "BtnMissionAdd";
this.BtnMissionAdd.Size = new System.Drawing.Size(120, 60);
this.BtnMissionAdd.TabIndex = 13;
this.BtnMissionAdd.Text = "添加任务";
this.BtnMissionAdd.UseVisualStyleBackColor = true;
this.BtnMissionAdd.Click += new System.EventHandler(this.BtnMissionAdd_Click);
//
// LstMission
//
this.LstMission.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.LstMission.Font = new System.Drawing.Font("宋体", 12F);
this.LstMission.FormattingEnabled = true;
this.LstMission.IntegralHeight = false;
this.LstMission.ItemHeight = 16;
this.LstMission.Location = new System.Drawing.Point(6, 6);
this.LstMission.Name = "LstMission";
this.LstMission.Size = new System.Drawing.Size(220, 510);
this.LstMission.TabIndex = 12;
//
// BtnClearLog
//
this.BtnClearLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.BtnClearLog.Location = new System.Drawing.Point(457, 6);
this.BtnClearLog.Name = "BtnClearLog";
this.BtnClearLog.Size = new System.Drawing.Size(116, 36);
this.BtnClearLog.TabIndex = 11;
this.BtnClearLog.Text = "清空日志";
this.BtnClearLog.UseVisualStyleBackColor = true;
this.BtnClearLog.Click += new System.EventHandler(this.BtnClearLog_Click);
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(857, 670);
this.Controls.Add(this.tabControl1);
this.Controls.Add(this.DgvName);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmMain";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "钢网AGV调度";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing);
this.Load += new System.EventHandler(this.FrmMain_Load);
((System.ComponentModel.ISupportInitialize)(this.DgvName)).EndInit();
this.tabControl1.ResumeLayout(false);
this.tabPage2.ResumeLayout(false);
this.tableLayoutPanel5.ResumeLayout(false);
this.tableLayoutPanel5.PerformLayout();
this.tabPage3.ResumeLayout(false);
this.tabPage3.PerformLayout();
this.tableLayoutPanel1.ResumeLayout(false);
this.tableLayoutPanel2.ResumeLayout(false);
this.tableLayoutPanel3.ResumeLayout(false);
this.tableLayoutPanel4.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.ResumeLayout(false);
}
#endregion
private System.Windows.Forms.DataGridView DgvName;
private System.Windows.Forms.TabControl tabControl1;
private System.Windows.Forms.TabPage tabPage2;
private System.Windows.Forms.Label LblWeb;
private System.Windows.Forms.TextBox TxtLog;
private System.Windows.Forms.Label LblStorageIO;
private System.Windows.Forms.TabPage tabPage1;
private System.Windows.Forms.TabPage tabPage3;
private System.Windows.Forms.Button BtnMissionPause;
private System.Windows.Forms.Button BtnMissionRun;
private System.Windows.Forms.Button BtnMissionClear;
private System.Windows.Forms.Button BtnMissionAdd;
private System.Windows.Forms.ListBox LstMission;
private System.Windows.Forms.Button BtnOldSteelWorkDel;
private System.Windows.Forms.Button BtnOldSteelWorkAdd;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel5;
private System.Windows.Forms.TextBox TxtAgvMission0;
private System.Windows.Forms.TextBox TxtAgvMission1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2;
private System.Windows.Forms.Button BtnOldSteelWorkDelAll;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3;
private System.Windows.Forms.Button BtnNewSteelWorkDelAll;
private System.Windows.Forms.Button BtnNewSteelWorkDel;
private System.Windows.Forms.Button BtnNewSteelWorkAdd;
private System.Windows.Forms.TableLayoutPanel tableLayoutPanel4;
private System.Windows.Forms.Button BtnStorageWorkDelAll;
private System.Windows.Forms.Button BtnStorageWorkDel;
private System.Windows.Forms.Button BtnStorageWorkAdd;
private System.Windows.Forms.DataGridViewTextBoxColumn Column1;
private System.Windows.Forms.DataGridViewTextBoxColumn Column2;
private System.Windows.Forms.DataGridViewTextBoxColumn Column5;
private System.Windows.Forms.DataGridViewTextBoxColumn Column3;
private System.Windows.Forms.DataGridViewTextBoxColumn Column7;
private System.Windows.Forms.DataGridViewButtonColumn Column4;
private System.Windows.Forms.DataGridViewButtonColumn Column8;
private System.Windows.Forms.ListBox LstOldSteel;
private System.Windows.Forms.ListBox LstStorage;
private System.Windows.Forms.ListBox LstNewSteel;
private System.Windows.Forms.Label LblMissionHint;
private System.Windows.Forms.CheckBox ChkMissionDebug;
private System.Windows.Forms.CheckBox ChkStorageIO;
private System.Windows.Forms.Button BtnClearLog;
}
}
using Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AGVControl_Steel
{
public partial class FrmMain : Form
{
private Webs.WebService webService;
public FrmMain()
{
InitializeComponent();
}
private void Control_AgvChanged(int agvIndex)
{
DgvName.Rows[agvIndex].SetValues(Common.agvInfos[agvIndex].ToRow());
tableLayoutPanel5.Controls["TxtAgvMission" + agvIndex].Text = Common.agvInfos[agvIndex].ToMissionState();
}
private void Control_AgvOnline(int agvIndex)
{
DgvName.Rows[agvIndex].DefaultCellStyle.ForeColor = Common.agvInfos[agvIndex].IsOnline ? Color.Black : Color.Red;
DgvName.Rows[agvIndex].SetValues(Common.agvInfos[agvIndex].ToRow());
tableLayoutPanel5.Controls["TxtAgvMission" + agvIndex].Text = Common.agvInfos[agvIndex].ToMissionState();
}
private void FrmMain_Load(object sender, EventArgs e)
{
Common.txtLog = TxtLog;
Common.lstOldSteel = LstOldSteel;
Common.lstNewSteel = LstNewSteel;
Common.lstStorage = LstStorage;
Common.lblStorageIO = LblStorageIO;
Common.steelManage.OldSteelWorkLoad();
Common.steelManage.NewSteelWorkLoad();
Common.steelManage.StorageWorkLoad();
Asa.WindowsForm.Load(this);
webService = new Webs.WebService();
webService.Open(Common.appConfig.AppSettings.Settings["WebService"].Value);
LblWeb.BackColor = webService.IsOpen ? Color.Lime : Color.Red;
LblWeb.Text = webService.IsOpen ? "WebService Open" : "WebService Close";
LstMission.Items.AddRange(Common.agvMissions.Keys.ToArray());
List<string> missionHint = new List<string>();
missionHint.AddRange(Common.PLACE_NAME);
missionHint.Add(Common.STORAGE_ENTER_4C);
missionHint.Add(Common.STORAGE_ENTER_4D);
missionHint.Add(Common.STORAGE_LEAVE);
LblMissionHint.Text = "提示:" + string.Join(",", missionHint);
for (int i = 0; i < Common.agvInfos.Count; i++)
{
DgvName.Rows.Add(Common.agvInfos[i].ToRow());
DgvName.Rows[i].DefaultCellStyle.ForeColor = Color.Red;
DgvName.Rows[i].HeaderCell.Value = (i + 1).ToString();
DgvName.Rows[i].Height = 30;
}
Common.control.AgvChanged += Control_AgvChanged;
Common.control.AgvOnline += Control_AgvOnline;
Common.control.Start();
}
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
if (Asa.WindowsForm.Close(e))
webService.Close();
}
private void DgvName_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1) return;
AgvInfo info = Common.agvInfos[e.RowIndex];
string key = "Use_" + info.FleetID;
if (e.ColumnIndex == DgvName.Columns.Count - 2) //最后二列,自动/手动
{
info.IsAuto = !info.IsAuto;
DgvName.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = info.IsAuto.ToString();
Common.appConfig.AppSettings.Settings[key].Value = info.IsAuto.ToString();
Common.appConfig.Save();
System.Configuration.ConfigurationManager.RefreshSection("appSettings");
Common.log.Info("手动修改 " + info.Name + " IsUse=" + info.IsAuto);
}
else if (e.ColumnIndex == DgvName.Columns.Count - 1) //最后一列,清除任务
{
string text = "确定要清除 " + info.Name + " 的任务吗?";
DialogResult dr = MessageBox.Show(text, "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
info.CurrentJob = null;
Common.mir.Del_Mission(info.IP, info.Authorization);
info.IsAuto = false;
info.Place = "";
DgvName.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = info.IsAuto.ToString();
Common.appConfig.AppSettings.Settings[key].Value = info.IsAuto.ToString();
Common.appConfig.Save();
System.Configuration.ConfigurationManager.RefreshSection("appSettings");
}
}
}
#region 手动添加小车任务
private void BtnMissionAdd_Click(object sender, EventArgs e)
{
if (DgvName.SelectedCells.Count == 0) return;
int idx = DgvName.SelectedCells[0].RowIndex;
if (idx < 0) return;
if (LstMission.SelectedIndex == -1) return;
AgvInfo info = Common.agvInfos[idx];
if (Common.FLEET_SEND)
Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, LstMission.Text, out string id);
else
Common.mir.Add_Mission(info.IP, info.Authorization, LstMission.Text, out string id);
}
private void BtnMissionClear_Click(object sender, EventArgs e)
{
if (DgvName.SelectedCells.Count == 0) return;
int idx = DgvName.SelectedCells[0].RowIndex;
if (idx < 0) return;
AgvInfo info = Common.agvInfos[DgvName.SelectedRows[0].Index];
Common.mir.Del_Mission(info.IP, info.Authorization);
}
private void BtnMissionRun_Click(object sender, EventArgs e)
{
if (DgvName.SelectedCells.Count == 0) return;
int idx = DgvName.SelectedCells[0].RowIndex;
if (idx < 0) return;
AgvInfo info = Common.agvInfos[idx];
Common.mir.State_Ready(info.IP, info.Authorization);
}
private void BtnMissionPause_Click(object sender, EventArgs e)
{
if (DgvName.SelectedCells.Count == 0) return;
int idx = DgvName.SelectedCells[0].RowIndex;
if (idx < 0) return;
AgvInfo info = Common.agvInfos[idx];
Common.mir.State_Pause(info.IP, info.Authorization);
}
#endregion
#region 手动修改钢网任务
private void BtnOldSteelWorkAdd_Click(object sender, EventArgs e)
{
string text = "手动添加回收钢板任务";
string msg = Microsoft.VisualBasic.Interaction.InputBox(text, "添加", "");
if (string.IsNullOrWhiteSpace(msg)) return;
Common.log.Info(text + " " + msg);
Common.steelManage.OldSteelWorkAdd(msg);
}
private void BtnOldSteelWorkDel_Click(object sender, EventArgs e)
{
if (LstOldSteel.SelectedIndex == -1) return;
string[] arr = LstOldSteel.Text.Split(',');
string text = "手动删除【" + arr[0] + "】回收钢板任务";
DialogResult dr = MessageBox.Show(text, "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
Common.log.Info(text);
Common.steelManage.OldSteelWorkDel(arr[0]);
}
}
private void BtnOldSteelWorkDelAll_Click(object sender, EventArgs e)
{
string text = "手动删除全部回收钢板任务";
DialogResult dr = MessageBox.Show(text, "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
Common.log.Info(text);
Common.steelManage.OldSteelWorkDelAll();
}
}
private void BtnNewSteelWorkAdd_Click(object sender, EventArgs e)
{
string text = "手动添加送新钢板任务,from&place逗号分割";
string msg = Microsoft.VisualBasic.Interaction.InputBox(text, "添加", "");
if (string.IsNullOrWhiteSpace(msg)) return;
string[] arr = msg.Split(',');
Common.log.Info(text + " " + msg);
Common.steelManage.NewSteelWorkAdd(arr[0], arr[1]);
}
private void BtnNewSteelWorkDel_Click(object sender, EventArgs e)
{
if (LstNewSteel.SelectedIndex == -1) return;
string[] arr = LstNewSteel.Text.Split(',');
string text = "手动删除【" + arr[0] + "," + arr[1] + "】送新钢板任务";
DialogResult dr = MessageBox.Show(text, "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
Common.log.Info(text);
Common.steelManage.NewSteelWorkDel(arr[0], arr[1]);
}
}
private void BtnNewSteelWorkDelAll_Click(object sender, EventArgs e)
{
string text = "手动删除全部送新钢板任务";
DialogResult dr = MessageBox.Show(text, "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
Common.log.Info(text);
Common.steelManage.NewSteelWorkDelAll();
}
}
private void BtnStorageWorkAdd_Click(object sender, EventArgs e)
{
string text = "手动添加仓库钢板任务";
string msg = Microsoft.VisualBasic.Interaction.InputBox(text, "添加", "");
if (string.IsNullOrWhiteSpace(msg)) return;
Common.log.Info(text + " " + msg);
Common.steelManage.StorageWorkAdd(msg);
}
private void BtnStorageWorkDel_Click(object sender, EventArgs e)
{
if (LstStorage.SelectedIndex == -1) return;
string[] arr = LstStorage.Text.Split(',');
string text = "手动删除【" + arr[0] + "】仓库钢板任务";
DialogResult dr = MessageBox.Show(text, "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
Common.log.Info(text);
Common.steelManage.StorageWorkDel(arr[0]);
}
}
private void BtnStorageWorkDelAll_Click(object sender, EventArgs e)
{
string text = "手动删除全部仓库钢板任务";
DialogResult dr = MessageBox.Show(text, "删除", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
if (dr == DialogResult.Yes)
{
Common.log.Info(text);
Common.steelManage.StorageWorkDelAll();
}
}
private void ChkMissionDebug_CheckedChanged(object sender, EventArgs e)
{
BtnOldSteelWorkAdd.Enabled = ChkMissionDebug.Checked;
BtnOldSteelWorkDel.Enabled = ChkMissionDebug.Checked;
BtnOldSteelWorkDelAll.Enabled = ChkMissionDebug.Checked;
BtnNewSteelWorkAdd.Enabled = ChkMissionDebug.Checked;
BtnNewSteelWorkDel.Enabled = ChkMissionDebug.Checked;
BtnNewSteelWorkDelAll.Enabled = ChkMissionDebug.Checked;
BtnStorageWorkAdd.Enabled = ChkMissionDebug.Checked;
BtnStorageWorkDel.Enabled = ChkMissionDebug.Checked;
BtnStorageWorkDelAll.Enabled = ChkMissionDebug.Checked;
ChkStorageIO.Enabled = ChkMissionDebug.Checked;
}
private void ChkStorageIO_CheckedChanged(object sender, EventArgs e)
{
Common.StorageDockAlway = ChkStorageIO.Checked;
}
#endregion
private void BtnClearLog_Click(object sender, EventArgs e)
{
TxtLog.Text = "";
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="Column1.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column2.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column5.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column3.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column7.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column4.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<metadata name="Column8.UserAddedColumn" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value>
</metadata>
<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">
<value>
AAABAAEAgGkAAAEAIAC42AAAFgAAACgAAACAAAAA0gAAAAEAIAAAAAAAANIAAGEPAABhDwAAAAAAAAAA
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
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAZAAAAKAAAADYAAAA5AAAAOQAAADkAAAA5AAAAOgAA
ADgAAAAeAAAAAAAAAQAAAAAAAAABAAAAAAEAAAAiAAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAA
ADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAA
ADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAA
ADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOQAAADkAAAA5AAAAOAAA
AC8AAAAgAAAADwAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAADsAAAB+AAAAtQAA
ANgAAADnAAAA8AAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAANcAAABEIiqZADZD8wAkLaMAAAAAUwAA
AN0AAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAA
APIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAA
APIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADyAAAA8gAA
APIAAADyAAAA8gAAAPIAAADyAAAA8gAAAPIAAADxAAAA6wAAAOEAAADIAAAAmwAAAFsAAAAdAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAACAAAAFAAAAC0AAAA8AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wwPN8Y2RPZ3NkP0eDVC73gKDCzPAAAA/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/AAAANgAAACFAAAAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoAAAClAAAA9gAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CAwv/ISmW/zdE9v82Q/T/NkP1/x4l
hv8BAgf/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/wAAAf8AAAL/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAADZAAAAZgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABLAAAA1wAAAP8AAAD/AAAA/wAAAP8CAgj/Cgwr/xMYWP8bIXn/HyaK/yAokf8gKJD/ICiQ/yAo
kP8gKJD/ICiR/ycxsv80Qe3/NkP1/zZD9P82Q/X/NEDq/yYvrP8gKJH/ICiQ/yAokP8gKJD/ICiQ/yAo
kP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAo
kP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAokP8gKJD/ICiQ/yAo
kP8gKJD/ICiQ/yAokP8hKJP/GiB1/wUGFv8AAAD/AAAA/wAAAP8AAAD/AAAA/xgPA/9DKQn/bEMP/4JQ
Ev+LVhP/fEoQ/2Q7Df88JAj/FQwD/wAAAP8AAAD/AAAA/wAAAP8AAAD5AAAAmgAAABcAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVwAAAOgAAAD/AAAA/wAAAP8DAwz/EhdU/yYv
q/8xPd//NkPy/zdE9/83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T3/zZD9f82Q/T/NkP0/zZD
9P82Q/X/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE
+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE
+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0X6/zA82v8QFEj/AAAB/wAA
AP8AAAD/AAAA/y0cBv+GUhL/zH4c/+uRIP/1lyH/95gi//eYIv/0liH/640f/92DHf+9cBn/eUgQ/yYX
Bf8AAAD/AAAA/wAAAP8AAAD/AAAArgAAABoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AEkAAADnAAAA/wAAAP8AAAD/Cw0x/yUvqf81Qe7/N0T4/zZD9f82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9v8yPuH/EBRK/wAAAP8AAAD/AAAA/w8JAv91SBD/2YYe//aYIf/2mCH/9JYh//OW
If/zliH/85Yh//OWIf/ylSH/644f/+iKHv/niR7/yXga/2c9Df8LBwH/AAAA/wAAAP8AAAD/AAAAqQAA
ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAA1QAAAP8AAAD/AAAA/xEWT/8vOtT/N0T4/zZD
9f82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/X/NkLy/xkfb/8AAAD/AAAA/wAA
AP8bEQT/omQW//KWIf/1lyH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/ylSH/6o0f/+WI
Hv/niR7/44ce/5FWE/8WDQP/AAAA/wAAAP8AAAD+AAAAgwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
AKEAAAD/AAAA/wAAAP8RFU3/MT3f/zdE9/82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9f82RPb/NkP2/zZD
9f82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkT2/zRB7P8eJYj/AwMM/wAAAP8AAAD/Fg4D/6ppF//2mCH/85Yh//OWIf/zliH/85Yh//OW
If/1lyH/95gi//eZIv/3mCH/9Zch//OWIf/ylSH/6Isf/+WIHv/miB7/54ke/5pcFP8RCgL/AAAA/wAA
AP8AAADuAAAAQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKAAAA8wAAAP8AAAD/Cg0u/y860v83RPf/NkP0/zZD
9P82Q/T/NkP0/zdE9/82QvL/Mj7i/y860/8wPNr/NEHs/zdE9/82Q/b/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zdE9/8wO9j/FRpf/wECBf8AAAD/AAAA/wYE
Af+QWRT/9Zch//OWIf/zliH/85Yh//OWIf/2mCH/7pMg/81/HP+rahf/o2UW/7FtGP/WhB3/8pYh//WX
If/vkiD/5oke/+WIHv/liB7/5oge/4BMEf8EAgH/AAAA/wAAAP8AAAC1AAAADAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
AKwAAAD/AAAA/wIDCv8kLaX/N0T3/zZD9P82Q/T/NkP0/zZD9f81Qu//JzGx/xQZXP8KDS7/Bgcb/wgK
I/8PEkL/HiaJ/zE83P83RPb/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9f82Q/X/KTO5/wwPNv8AAAD/AAAA/wAAAP8AAAD/UTIL/+qRIP/0lyH/85Yh//OWIf/zliH/85Yh/7x0
Gf9VNQz/GQ8D/wUDAf8CAQD/CAUB/yIVBf9sQw//0oEc//WXIf/rjh//5Yge/+WIHv/miR7/2oId/0Up
Cf8AAAD/AAAA/wAAAPYAAABKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzAAAA7AAAAP8AAAD/ERVM/zRB7P82Q/X/NkP0/zZD
9P82Q/b/Mj/k/xgebf8DAwz/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/DA81/ykzuf82Q/b/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82RPb/NEHt/yAnj/8FBxj/AAAA/wAAAP8AAAD/AAAA/xAK
Av+4chn/9pgh//OWIf/zliH/85Yh//OWIf+ZXhX/GA8D/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8tHAb/uXMZ//KUIf/miR7/5Yge/+WIHv/oih7/pmMW/wsHAf8AAAD/AAAA/wAAAJ0AAAACAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHMAAAD/AAAA/wEBBf8kLaP/N0T4/zZD9P82Q/T/NkP1/zRB7P8WHGX/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/CAki/ys1wf83RPf/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/N0T3/zA8
2v8WG2L/AQIG/wAAAP8AAAD/AAAA/wAAAP8AAAD/Si4K/+ySIP/0liH/85Yh//OWIf/2mCH/rmsY/xML
A/8AAAD/AAAA/wAAAP8BAQH/BgYG/wAAAP8AAAD/AAAA/wAAAP8rGwb/z4Ac/+uNH//liB7/5Yge/+aI
Hv/cgx3/PiUI/wAAAP8AAAD/AAAA2wAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAqgAAAP8AAAD/CAok/zA82f82Q/b/NkP0/zZD
9P83RPf/Iyud/wECBv8AAAD/AAAA/wgICP9ERET/cnJy/19fX/8eHh7/AAAA/wAAAP8AAAD/EBRI/zNA
6P82Q/X/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP1/zZD9v8pM7v/DRA5/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP+OWBP/95gi//OWIf/zliH/9Jch/+OMH/87JAj/AAAA/wAAAP8BAQH/QkJC/52dnf+4uLj/jIyM/yoq
Kv8AAAD/AAAA/wAAAP9oQQ7/648f/+WIHv/liB7/5Yge/+iKHv+ATBH/AAAA/wAAAP8AAAD7AAAAVgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ABEAAADOAAAA/wAAAP8RFUz/NULv/zZD9P82Q/T/NkP1/zNA6f8OET//AAAA/wAAAP8MDAz/kpKS//X1
9f///////v7+/87Ozv83Nzf/AAAA/wAAAP8CAgj/JzCu/zdE9/82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZE9v81Qe7/ICiS/wYH
Gv8AAAD/AAAA/wAAAP8ABAX/AAID/wAAAP8AAAD/DQgC/711Gv/2mCH/85Yh//OWIf/3mCH/rGoX/wcE
Af8AAAD/AAAA/1FRUf/q6ur/////////////////0NDQ/ysrK/8AAAD/AAAA/x8TBP/QgBz/6Ioe/+WI
Hv/liB7/6Ioe/7puGP8SCwL/AAAA/wAAAP8AAACdAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAN8AAAD/AAAA/xcdav82RPb/NkP0/zZD
9P83RPf/LDfI/wQFE/8AAAD/AAAA/2BgYP/8/Pz//////////////////////7q6uv8NDQ3/AAAA/wAA
AP8ZIHP/N0T2/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P83RPf/MTzc/xYcZf8CAgf/AAAA/wAAAP8AAAD/ARwm/wNOZ/8ABwr/AAAA/wAA
AP8gFAT/14Qd//WXIf/zliH/85Yh//aYIf96SxH/AAAA/wAAAP8NDQ3/wcHB////////////////////
////////kZGR/wAAAP8AAAD/BgMB/6ppF//sjh//5Yge/+WIHv/miB7/3IMd/z8lCP8AAAD/AAAA/wAA
ANkAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAsAAAA7AAAAP8AAAD/HCN+/zdE9/82Q/T/NkP0/zdE+P8oMbP/AgII/wAAAP8AAAD/oaGh////
////////////////////////6+vr/ysrK/8AAAD/AAAA/xMYV/82QvL/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/X/NkP2/yo0vf8NEDv/AAAA/wAA
AP8AAAD/AAAA/wI1Rv8GntD/BGWF/wAAAP8AAAD/AAAA/ycYBf/fih7/9Jch//OWIf/zliH/9Jch/2A7
Df8AAAD/AAAA/yQkJP/k5OT///////////////////////////+/v7//CQkJ/wAAAP8AAAD/ml8V//GS
IP/liB7/5Yge/+WIHv/oih7/fUoQ/wAAAP8AAAD/AAAA+gAAAFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAADrAAAA/wAAAP8cIn3/N0T3/zZD
9P82Q/T/N0T4/ygytP8CAgj/AAAA/wAAAP+enp7////////////////////////////p6en/KSkp/wAA
AP8AAAD/FBhZ/zZD8v82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkT2/zVB7v8hKZT/Bgcb/wAAAP8AAAD/AAAA/wAICv8DV3P/BrLr/we8+f8CNET/AAAA/wAA
AP8AAAD/JxgF/9+JHv/0lyH/85Yh//OWIf/1lyH/b0UP/wAAAP8AAAD/FhYW/9PT0///////////////
/////////////6enp/8DAwP/AAAA/wMCAP+iZBb/9JYh/+aJHv/liB7/5Yge/+iKHv+3bRj/EQoC/wAA
AP8AAAD/AAAAmQAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAHwAAAN4AAAD/AAAA/xcdaP82Q/b/NkP0/zZD9P83RPf/LTjL/wUGFv8AAAD/AAAA/1ZW
Vv/4+Pj//////////////////////7Gxsf8LCwv/AAAA/wAAAP8aIXf/N0T3/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zdE9/8xPd3/Fxxn/wICCP8AAAD/AAAA/wAA
AP8BGCD/BHqh/we++/8HxP//BqDT/wESF/8AAAD/AAAA/wAAAP8eEwT/1YMd//WXIf/zliH/85Yh//eY
Iv+bYBX/AgEA/wAAAP8AAAD/eXl5//7+/v/////////////////w8PD/TExM/wAAAP8AAAD/EwwD/8Z6
G//1lyH/6Isf/+WIHv/liB7/5oge/9uCHf88JAj/AAAA/wAAAP8AAADWAAAAGgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAzAAAAP8AAAD/EBRJ/zVB
7v82Q/T/NkP0/zZD9f80Qev/DxNG/wAAAP8AAAD/CAgI/4GBgf/s7Oz///////r6+v/AwMD/Ly8v/wAA
AP8AAAD/AgML/ygxtP83RPf/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9f82RPb/KjW//w4RPf8AAAD/AAAA/wAAAP8AAAD/AjND/waZy/8Hw///B8H//wfE//8Edpz/AAEB/wAA
AP8AAAD/AAAA/wsHAv+6cxn/9pgh//OWIf/zliH/9Zch/9WDHf8kFgX/AAAA/wAAAP8NDQ3/e3t7/9bW
1v/n5+f/yMjI/1tbW/8DAwP/AAAA/wAAAP9LLgr/65Eg//SXIf/sjyD/5Yge/+WIHv/liB7/6Ioe/3lI
EP8AAAD/AAAA/wAAAPkAAABPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAMAAACmAAAA/wAAAP8HCSD/LzvW/zZE9v82Q/T/NkP0/zdE9/8lLab/AgMJ/wAA
AP8AAAD/BAQE/zU1Nf9hYWH/Tk5O/xQUFP8AAAD/AAAA/wAAAP8SFlL/NEHr/zZD9f82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/b/NULv/yIql/8GCB3/AAAA/wAAAP8AAAD/AAcJ/wNU
b/8GsOn/B8P//wfB//8Hwf//B7/9/wNGXP8AAAD/AAAA/wAAAP8AAAD/AAAA/4lUE//2mCH/85Yh//OW
If/zliH/9Jch/4hUEv8DAgD/AAAA/wAAAP8AAAD/GRkZ/ygoKP8RERH/AAAA/wAAAP8AAAD/EgsC/7Nv
GP/2mCH/85Yh//CTIP/miR7/5Yge/+WIHv/oih7/tGsY/w8JAv8AAAD/AAAA/wAAAJUAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG0AAAD/AAAA/wEB
A/8iK5v/N0T4/zZD9P82Q/T/NkP1/zVC7/8ZH3L/AQEC/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/Cg0v/y04y/83RPb/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/N0T3/zE9
3/8YHWr/AgIJ/wAAAP8AAAD/AAAA/wEXHv8EeJ//B736/wfC//8Hwf//B8H//wfC//8GreT/AR0n/wAA
AP8AAAD/AAAA/wAAAP8AAAD/SC0K/+ySIP/zliH/85Yh//OWIf/0lyH/6ZAg/2hADv8DAgD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/w4JAv+PWRP/8pUh//OWIf/zliH/8pUh/+iLH//liB7/5Yge/+aI
Hv/agR3/OSIH/wAAAP8AAAD/AAAA0wAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALgAAAOgAAAD/AAAA/w8TQ/8zQOj/NkP1/zZD9P82Q/T/NkP1/zRA
6v8cIn3/BAYU/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQED/w8TRP8sN8f/N0T2/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP1/zZE9v8rNcL/DhJA/wAAAP8AAAD/AAAA/wAAAP8CMUH/BpjJ/wfD
//8Hwv//B8H//wfB//8Hwf//B8T//wWItP8ABgf/AAAA/wEBAf8FCgT/AAAA/wAAAP8XDgP/yXwb//aY
If/zliH/85Yh//OWIf/0lyH/6ZAg/4dUEv8jFgX/AQEA/wAAAP8AAAD/AAAA/wUDAf8zHwf/pGUW//GV
If/0liH/85Yh//OWIf/zliH/7I8f/+WIHv/liB7/5Yge/+iKHv91Rg//AAAA/wAAAP8AAAD4AAAASwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAApgAA
AP8AAAD/AQIG/yIqmv83RPf/NkP0/zZD9P82Q/T/NkP1/zZD8/8qNb//GR5v/w0QO/8JDCv/Cw0w/xIX
U/8iK5v/Mj/k/zdE9v82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9v81QvD/Iiqa/wcI
H/8AAAD/AAAA/wAAAP8ABgj/A1Jt/wav5/8Hw///B8H//wfB//8Hwf//B8H//wfB//8Hwv//A1l2/wAA
AP8AAAD/Bg0G/yFIH/8CBAL/AAAA/wAAAP+OWBP/95gh//OWIf/zliH/85Yh//OWIf/0lyH/9Jch/9OD
Hf+YXhX/bEMP/1w5Df91SBD/pWYW/9+JHv/1mCH/85Yh//OWIf/zliH/85Yh//OWIf/wkyD/5oke/+WI
Hv/liB7/6Ioe/7FpF/8NCAL/AAAA/wAAAP8AAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCAAAA8AAAAP8AAAD/CAom/y03yv83RPf/NkP0/zZD
9P82Q/T/NkP0/zdE9/82Q/X/NEDp/zI+4v8zP+T/NULx/zdE9/82Q/X/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P83RPf/Mj3g/xgebf8CAwr/AAAA/wAAAP8AAAD/ARYd/wR2nP8Hvfn/B8P//wfB
//8Hwf//B8H//wfB//8Hwf//B8L//we28f8CLDr/AAAA/wAAAP8SJhH/QIw9/woXCv8AAAD/AAAA/0su
Cv/tkiD/85Yh//OWIf/zliH/85Yh//OWIf/zliH/9Zch//eYIv/1lyH/85Yh//WYIf/3mCL/9Jch//OW
If/zliH/85Yh//OWIf/zliH/85Yh//KVIf/oix//5Yge/+WIHv/miB7/2YEc/zYgB/8AAAD/AAAA/wAA
ANEAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAQAAACVAAAA/wAAAP8AAAD/DhE+/y861f83RPf/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/X/NkP1/zZD
9f82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/X/N0T2/ys2xP8PEkL/AAAA/wAA
AP8AAAD/AAAA/wIvPv8Flsb/B8L//wfC//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hw///BpnK/wAN
Ef8AAAD/AAAA/yNNIv9PrUv/HD0a/wAAAP8AAAD/GQ8D/8x+HP/1lyH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+yP
H//liB7/5Yge/+WIHv/niR7/ckQP/wAAAP8AAAD/AAAA9wAAAEkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAADLAAAA/wAAAP8AAAD/DhE+/y03
yv83RPf/NkP1/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP2/zVC8P8jK53/Bwkg/wAAAP8AAAD/AAAA/wAGB/8DUGr/Bq7m/wfD//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfE//8EbI//AAAA/wAAAP8CBAL/N3g0/1K0Tv8ybS//AQEB/wAA
AP8BAAD/kloU//eYIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/8JMg/+aJHv/liB7/5Yge/+iKHv+vaBf/DAcC/wAA
AP8AAAD/AAAAjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAD4AAADiAAAA/wAAAP8AAAD/CAol/yIqmf8zQOj/N0T4/zZE9v82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD
9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zdE9/8yPuH/GR9w/wIDCv8AAAD/AAAA/wAA
AP8BFBv/BHSZ/we8+f8Hw///B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B736/wI9
UP8AAAD/AAAA/wsYC/9HmkP/UbJN/0WWQf8JFAn/AAAA/wAAAP9PMQv/7pMg//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/ylSH/6Isf/+WIHv/liB7/5oke/9eAHP80Hwf/AAAA/wAAAP8AAADPAAAAFAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEwAAADhAAAA/wAA
AP8AAAD/AQIG/w8SQ/8iKpr/LzrU/zVB7f82Q/X/N0T3/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE
+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE+P83RPj/N0T4/zdE
+P83RPf/LDbG/w8TRf8AAAD/AAAA/wAAAP8AAAD/Ai07/wWUxP8Hwv//B8L//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfD//8Gp9z/ARcf/wAAAP8AAAD/Gzwa/0+sS/9Qr0z/T6xL/xs6
Gf8AAAD/AAAA/xsRBP/PgBz/9Zch//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/sjx//5Yge/+WIHv/liB7/54ke/3BC
D/8AAAD/AAAA/wAAAPUAAABFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD0AAADKAAAA/wAAAP8AAAD/AAAA/wEBA/8HCB//DxNG/xcc
Z/8bInz/HCN//xwjf/8cI3//HCN//xwjf/8cI3//HCN//xwjf/8cI3//HCN//xwjf/8cI3//HCN//xwj
f/8cI3//HCN//xwjf/8cI3//HCN//xwjf/8cI3//HCOA/xogdf8ICiP/AAAA/wAAAP8AAAD/AAUH/wNO
Z/8GreT/B8P//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8T//wWA
qf8AAwT/AAAA/wAAAP8vaC3/UbJN/1CvTP9Rsk3/MWsu/wABAP8AAAD/AQEA/5ZcFP/3mCL/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh/++SIP/miR7/5Yge/+WIHv/oih7/rWYX/wsHAf8AAAD/AAAA/wAAAIoAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AB8AAACUAAAA7wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wETGv8EcZb/B7v4/wfD//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//A09p/wAAAP8AAAD/Bg4G/0GOPv9RsU3/UK9M/1Gx
Tf9ElED/CBMI/wAAAP8AAAD/UjML/++UIP/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/8pUh/+iLH//liB7/5Yge/+aJ
Hv/Wfxz/MR0G/wAAAP8AAAD/AAAAywAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAABAAAAAowAAAOcAAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8CKzn/BZLB/wfC
//8Hwv//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8L//way
6/8BJDD/AAAA/wAAAP8ULBP/TKdJ/1CwTP9Qr0z/UK9M/06rSv8ZNxj/AAAA/wAAAP8dEgT/0YEc//WX
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/644f/+WIHv/liB7/5Yge/+eJHv9sQA7/AAAA/wAAAP8AAAD0AAAAQgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAEAAAALAAAAGoAAACjAAAAyAAAAN8AAADnAAAA5wAAAOcAAADnAAAA5wAA
AOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOcAAADnAAAA5wAAAOUAAADpAAAA/QAA
AP8AAAD/AAAA/wAAAP8ABAb/A0xk/was4/8Hw///B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8HxP//BZHA/wAJDP8AAAD/AAAA/ydWJf9RsU3/UK9M/1Cv
TP9Qr0z/UbJN/y9oLf8AAAD/AAAA/wIBAP+ZXhX/95gi//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/vkiD/5oke/+WI
Hv/liB7/6Ioe/6plFv8KBgH/AAAA/wAAAP8AAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAIAAAAOAAAAHgAAACUAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAAACYAAAAmAAAAJgAA
ACYAAAAmAAAAJgAAACYAAAAjAAAANwAAAKkAAAD9AAAA/wAAAP8AAAD/ARIY/wRvk/8Hu/f/B8P//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfD
//8EY4P/AAAA/wAAAP8DBwP/O4A4/1GyTf9Qr0z/UK9M/1CvTP9RsU3/Q5I//wgRB/8AAAD/AAAA/1U1
DP/wlCH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//KVIf/oix//5Yge/+WIHv/miR7/1H4c/y4bBv8AAAD/AAAA/wAA
AMgAAAARAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACkAAACvAAAA/AAA
AP8AAAD/AAAA/wIqN/8Fkb//B8L//wfC//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B7r2/wI0Rf8AAAD/AAAA/w4eDf9Jn0X/ULBM/1Cv
TP9Qr0z/UK9M/1CvTP9Oqkr/GDUX/wAAAP8AAAD/HxME/9OCHf/1lyH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+uO
H//liB7/5Yge/+WIHv/miR7/aD4O/wAAAP8AAAD/AAAA8gAAAD8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAIAAABTAAAA2AAAAP8AAAD/AAAA/wAEBf8DSWH/Bqrh/wfD//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfD
//8GoNT/ARIX/wAAAP8AAAD/H0Qe/1CuTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1GyTf8uZiz/AAAA/wAA
AP8DAgD/nGAV//eYIv/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/75Ig/+WIHv/liB7/5Yge/+iKHv+mYxb/CAUB/wAA
AP8AAAD/AAAAgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAgQAAAPEAAAD/AAAA/wAA
AP8BERb/BG2Q/we69v8Hw///B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8T//wR3nf8AAQH/AAAA/wECAf8zcDH/UbJN/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UbFN/0KRP/8HEAf/AAAA/wAAAP9YNgz/8ZQh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/ylSH/6Isf/+WIHv/liB7/5oke/9N9HP8rGgb/AAAA/wAAAP8AAADGAAAADwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAKgAAAK8AAAD+AAAA/wAAAP8AAAD/ASg0/wWOvP8Hwv//B8L//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hv/3/A0Zd/wAAAP8AAAD/CBMI/0SVQf9RsU3/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/TqpK/xgz
Fv8AAAD/AAAA/yEUBP/VhB3/9Zch//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/rjh//5Yge/+WIHv/liB7/5oge/2U8
Df8AAAD/AAAA/wAAAPEAAAA8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAFAAAADVAAAA/wAAAP8AAAD/AAME/wNH
Xv8Gqd//B8P//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8L//wat5P8BHif/AAAA/wAAAP8YMxb/TqpK/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9RsU3/LWMr/wAAAP8AAAD/BAIA/59iFv/3mCL/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh/++SIP/liB7/5Yge/+WIHv/oih7/pGEV/wgEAf8AAAD/AAAA/wAAAIAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AA4AAAB+AAAA7wAAAP8AAAD/AAAA/wEQFf8Ea43/B7n1/wfD//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8HxP//BYm1/wAGB/8AAAD/AAAA/yteKf9RsU3/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Gx
Tf9Bjz7/Bw8G/wAAAP8AAAD/XDkN//GVIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/8pUh/+eKH//liB7/5Yge/+aJ
Hv/RfBv/KRkF/wAAAP8AAAD/AAAAwwAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnAAAArAAAAP0AAAD/AAAA/wAAAP8BJjL/BY26/wfB
//8Hwv//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfC//8DWnb/AAAA/wAAAP8FCgT/Poc7/1Gx
Tf9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/02pSf8WMRX/AAAA/wAAAP8kFgX/2IUd//WX
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/644f/+WIHv/liB7/5Yge/+WIHv9iOg3/AAAA/wAAAP8AAADwAAAAOQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAATQAA
ANMAAAD/AAAA/wAAAP8AAwT/A0Vb/wao3f8Hw///B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwv//B7bx/wIsOv8AAAD/AAAA/xEkEP9Lo0f/ULBM/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UbFN/yxhKv8AAAD/AAAA/wUDAf+jZRb/95gi//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/vkiD/5Yge/+WI
Hv/liB7/6Ioe/6FgFf8HBAH/AAAA/wAAAP8AAAB7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAADQAAAHsAAADuAAAA/wAAAP8AAAD/AQ8U/wRpiv8HufT/B8P//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfD//8Gmcr/AA0R/wAAAP8AAAD/I00h/1Cw
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9RsU3/QI09/wYNBv8AAAD/AAAA/2A7
Df/ylSH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//KVIf/nih7/5Yge/+WIHv/miR7/0Hsb/ycXBf8AAAD/AAAA/wAA
AL8AAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAACqAAAA/QAA
AP8AAAD/AAAA/wEkMP8Fi7f/B8H//wfC//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8T//wRtkP8AAAD/AAAA/wIEAv83eDT/UbJN/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9NqEn/FS4U/wAAAP8AAAD/JhcF/9mGHv/1lyH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+uO
H//liB7/5Yge/+WIHv/liB7/XzgM/wAAAP8AAAD/AAAA7gAAADYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAA5AAAAzgAAAP8AAAD/AAAA/wACA/8CQ1j/Bqbb/wfD//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hvfn/Aj1R/wAAAP8AAAD/CxgK/0aa
Q/9RsE3/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1GxTf8rXin/AAAA/wAA
AP8GAwH/pmcX//eYIv/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/7pEg/+WIHv/liB7/5Yge/+mKHv+eXhX/BgMB/wAA
AP8AAAD/AAAAdwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOgAAANgAAAD/AAAA/wAA
AP8ADhL/BGaH/we48/8Hw///B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8L//war4v8BGiL/AAAA/wAAAP8bOxr/T6xL/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UbFN/z+LPP8GDAX/AAAA/wAAAP9jPQ3/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/xlCH/54oe/+WIHv/liB7/54ke/856G/8kFgX/AAAA/wAAAP8AAAC8AAAACwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACcAAADPAAAA/wAAAP8AAAD/ASEs/wWJtP8Hwf//B8L//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwv//Bq/n/wEjLv8AAAD/AQEB/zJt
L/9RsU3/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9QsEz/TKdJ/xQs
E/8AAAD/AAAA/ygZBf/bhx7/9Zch//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/qjR//5Yge/+WIHv/liB7/5Ige/1s2
DP8AAAD/AAAA/wAAANkAAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAqQAAAP8AAAD/AAAA/wIt
PP8GoNP/B8P//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//CIuz/xhCKf8rXCf/TKVI/1CwTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9RsU3/Klwo/wAAAP8AAAD/BgQB/6loF//3mCL/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh/+6RIP/liB7/5Yge/+WIHv/niR7/smkX/ykYBf8NCAL4AgEAggAAAAMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAGAAAAD6AAAA/wAAAP8BIy7/BqHU/wfE//8Hwf//B8H//wfB//8Hwf//B8H//wfC
//8Hw///B8T//wfD//8Hwv//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wbB//8Vv97/SrBa/1Gw
TP9QsEz/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Gx
Tf8/iTv/BQsF/wAAAP8AAAD/Zj8O//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/8ZQh/+eKHv/liB7/5Yge/+WI
Hv/liB7/zHkb/7xwGeXAcxkoq2YXAAQCAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAygAAAP8AAAD/AAwQ/wWI
tP8HxP//B8H//wfB//8Hwf//B8H//wfD//8Hwf//BrHp/waczv8FlMT/BqTY/we49P8Hw///B8L//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//BsL//ya5s/9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/ULBM/0ymSP8UKxP/AAAA/wAAAP8qGgb/3Yge//SX
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/6o0f/+WIHv/liB7/5Yge/+WIHv/niR7/54ke/OeKHl7miR4A9JEgAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAFwAAAD7AAAA/wAAAP8DUWv/B7/9/wfB//8Hwf//B8H//wfB//8Hwv//BqLW/wNW
cv8BIi3/AA4S/wAIC/8BExr/AjJC/wRzmP8HtfD/B8P//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8FsvD/Nq+E/1Kw
Sv9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UbFN/ylZJ/8AAAD/AAAA/wcFAf+sahf/95gh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/ukSD/5Yge/+WI
Hv/liB7/5Yge/+WIHv/liB7/6osfpf///wAaEAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAArAAAAP8AAAD/AREX/wac
zv8Hw///B8H//wfB//8Hwf//B8L//wWGsf8BHCX/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAIC/wI9
Uf8GqeD/B8P//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Gvv3/AnKc/wEpOP8fSif/SqFF/1CwTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9RsU3/Poc7/wUKBP8AAAD/AAAA/2pB
Dv/0liH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//GUIf/nih7/5Yge/+WIHv/liB7/5Yge/+SHHv+oZBbnFAwDgQAA
ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACEAAADfAAAA/wAAAP8CP1T/B736/wfB//8Hwf//B8H//wfD//8Fj77/ARQa/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wI7Tf8Gs+z/B8L//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//Bb///wGZ1/8AExv/AAAA/wAA
AP8zcDH/UbJN/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CwTP9MpUj/EykS/wAAAP8AAAD/LhwG/9+KHv/0lyH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+qN
H//liB7/5Yge/+WIHv/niR7/u28Z/x0RBP8AAAD/AAAA2QAAACcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARwAAAPcAAAD/AAAA/wRw
lP8HxP//B8H//wfB//8Hwv//B7Tu/wIxQf8AAAD/AAAA/wAAAP8vLy//fn5+/5WVlf9kZGT/FBQU/wAA
AP8AAAD/AAAA/wRpi/8Hwv//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Hwf//B8D//wS7//8Bt///AG6d/wABAf8AAAD/AQIB/zRyMf9Rsk3/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1GxTf8oVib/AAAA/wAA
AP8JBQH/sGwY//eYIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/7pEg/+WIHv/liB7/5Yge/+mKHv+iYBX/BQMB/wAA
AP8AAAD/AAAAbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABoAAAA/wAAAP8ACAv/BZLB/wfE//8Hwf//B8H//wfE//8FhrH/AAUH/wAA
AP8AAAD/SUlJ/+Dg4P////////////7+/v+ysrL/GBgY/wAAAP8AAAD/ASYy/way6/8Hwv//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wa///8DuP//ALT//wCz//8AQl7/AAAA/wAA
AP8IEgj/RJRA/1GxTf9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UbFN/z2FOv8ECQT/AAAA/wAAAP9uRA//9Jch//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/xlCH/54oe/+WIHv/liB7/54ke/8d2Gv8eEgT/AAAA/wAAAP8AAACyAAAABwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8AAAD/AAAA/wER
Fv8GodX/B8P//wfB//8Hwf//B8P//wNad/8AAAD/AAAA/w8PD//CwsL/////////////////////////
//90dHT/AAAA/wAAAP8ACg7/BZbG/wfE//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB
//8Fvf//Abb//wC0//8As///AH+1/wATG/8AAAD/AAAA/xczFv9Oqkr/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9QsEz/S6RH/xEm
Ef8AAAD/AAAA/zAeB//hix//9Jch//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/qjR//5Yge/+WIHv/liB7/4oYe/1Ix
C/8AAAD/AAAA/wAAAOYAAAArAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAjQAAAP8AAAD/ARgf/wao3/8Hw///B8H//wfB//8Hwf//A0Zc/wAA
AP8AAAD/LS0t/+vr6////////////////////////////66urv8EBAT/AAAA/wACA/8Fgqz/B8T//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8HwP//BLv//wG0//8Atf//AKz0/wBijP8ADhT/AAAA/wAA
AP8AAAD/K14p/1GxTf9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9RsE3/JlMk/wAAAP8AAAD/CgYB/7NuGP/2mCH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh/+6RIP/liB7/5Yge/+WIHv/pih7/kVYT/wIBAP8AAAD/AAAA/wAAAGkAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACFAAAA/wAA
AP8BExn/BqTZ/wfD//8Hwf//B8H//wfB//8DSmH/AAAA/wAAAP8kJCT/4+Pj////////////////////
////////oKCg/wICAv8AAAD/AAQF/wWItP8HxP//B8H//wfB//8Hwf//B8H//wfB//8Hwf//Br///wO4
//8As///ALX//wCc3v8AQV3/AAME/wAAAP8AAAD/AAAA/wQKBP8+hzv/UbFN/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Gx
Tf84fDX/AwcD/wAAAP8AAAD/cUYP//WXIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/8ZQh/+eKHv/liB7/5Yge/+eJ
Hv/GdRr/HBEE/wAAAP8AAAD/AAAArwAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4AAAD/AAAA/wAKDv8Fl8j/B8T//wfB//8Hwf//B8T//wRp
i/8AAAD/AAAA/wUFBf+bm5v///////////////////////T09P9QUFD/AAAA/wAAAP8BERf/BqHU/wfD
//8Hwf//B8H//wfB//8Hwf//B8H//wW9//8Btv//ALT//wCz//8Ag7v/ACQz/wAAAP8AAAD/AAAA/wAA
AP8AAAD/ESQQ/0ujR/9QsEz/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/T65L/0OXQP8PIQ7/AAAA/wAAAP8zHwf/4owf//SX
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/6o0f/+WIHv/liB7/5Yge/+KGHv9OLgr/AAAA/wAAAP8AAADkAAAAKAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUQAA
APsAAAD/AAEC/wR6of8HxP//B8H//wfB//8Hw///BprM/wEQFf8AAAD/AAAA/xwcHP+jo6P/7e3t//f3
9//d3d3/bm5u/wUFBf8AAAD/AAAA/wI7Tf8Hu/f/B8H//wfB//8Hwf//B8H//wfB//8Eu///AbT//wC0
//8ArPX/AGSO/wAPFv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8jTCH/ULBM/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Nqkn/SKFE/yFKH/8AAAD/AAAA/wsHAf+1cBn/9pgh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/tkCD/5Yge/+WI
Hv/liB7/6Yoe/41UE/8BAQD/AAAA/wAAAP4AAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqAAAA6AAAAP8AAAD/A0xk/wfA/v8Hwf//B8H//wfB
//8Hvvz/A1Nt/wAAAP8AAAD/AAAA/wgICP8yMjL/RERE/yEhIf8AAAD/AAAA/wAAAP8ACw//BYq2/wfD
//8Hwf//B8H//wfB//8Gv///A7j//wCz//8Atf//AJ3g/wBDX/8AAwX/AAAA/wAAAP8AAAD/AAAA/AAA
AP8AAAD/AgQC/zd4NP9Rsk3/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/0unR/9IokT/NHYx/wMHA/8AAAD/AAAA/3RI
EP/1lyH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//GUIf/miR7/5Yge/+WIHv/niR7/w3Qa/xoPA/8AAAD/AAAA/wAA
AKwAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAoAAAC7AAAA/wAAAP8BGiL/Bqfd/wfD//8Hwf//B8H//wfC//8GreX/AjVG/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAYI/wRniP8Hv/3/B8H//wfB//8Hwf//Bb7//wK2//8AtP//ALT//wCF
vf8AJTX/AAAA/wAAAP8AAAD/AAAA/gAAALYAAADRAAAA/wAAAP8LFwr/RppD/1GwTf9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Prkv/SaNF/0ehQ/9ClD7/DiAN/wAAAP8AAAD/NSEH/+SNH//0lyH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+mM
H//liB7/5Yge/+WIHv/hhR3/Sy0K/wAAAP8AAAD/AAAA4wAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAD/AAAA/wAAAP8EZIT/B8L//wfB
//8Hwf//B8H//wfD//8Gq+L/A01l/wALD/8AAAD/AAAA/wAAAP8AAAD/AAAA/wEcJf8EdJr/B736/wfC
//8Hwf//B8H//wS7//8BtP//ALT//wCt9v8AZpH/ABAX/wAAAP8AAAD/AAAA/wAAAPEAAACBAAAAMgAA
AN0AAAD/AAAA/xs7Gv9PrEv/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/06sSv9IoUT/R6BD/0ehQ/8gSB7/AAAA/wAA
AP8MCAL/uHIZ//aYIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/7ZAg/+WIHv/liB7/5Yge/+iKHv+LUhL/AQEA/wAA
AP8AAAD+AAAAYgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAIwAAANwAAAD/AAAA/wEXHv8GnM7/B8T//wfB//8Hwf//B8H//wfD//8Hvfn/BZLB/wNc
ef8CO03/AjVG/wJDWf8EbpL/Bqbc/wfC//8Hwv//B8H//wa///8Duf//ALP//wC1//8AnuL/AEVi/wAE
Bf8AAAD/AAAA/wAAAP8AAADZAAAAVAAAAAAAAABUAAAA+wAAAP8AAAD/L2ct/1GyTf9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/TKhI/0egQ/9HoEP/SKJE/zN0MP8DBgP/AAAA/wAAAP94ShD/9Zch//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/xlCH/5oke/+WIHv/liB7/54ke/8FzGf8YDgP/AAAA/wAAAP8AAACpAAAABAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAP8AAAD/AAAA/wI3
Sf8GsOn/B8P//wfB//8Hwf//B8H//wfB//8Hw///B8P//we++v8HvPj/B7/9/wfE//8Hw///B8H//wfB
//8Fvv//Arb//wC0//8AtP//AIfA/wAnOP8AAAD/AAAA/wAAAP8AAAD+AAAAswAAAC0AAAAAAAAAAAAA
AJUAAAD/AAAA/wYOBv9Bjj7/UbFN/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9KpUb/R6BD/0egQ/9HoUP/QZI9/wwb
C/8AAAD/AAAA/zgjCP/ljh//9Jch//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/pjB//5Yge/+WIHv/liB7/4IUd/0kr
Cv8AAAD/AAAA/wAAAOEAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAYAAAAxAAAAP8AAAD/AAAA/wNFW/8Gsuv/B8P//wfB//8Hwf//B8H//wfB
//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//BLv//wG0//8AtP//AK73/wBolf8AERn/AAAA/wAA
AP8AAAD/AAAA8gAAAIYAAAASAAAAAAAAAAAAAAATAAAAzgAAAP8AAAD/FCsT/0ynSP9QsEz/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/T61L/0iiRP9HoEP/R6BD/0ihRP8+jDv/ChUJ/wAAAP8AAAD/DgkC/7x0Gf/2mCH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh/+2QIP/liB7/5Yge/+WIHv/oih7/iFES/wAAAP8AAAD/AAAA/QAAAF4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/AAAA5gAA
AP8AAAD/AAAA/wI8T/8Gotb/B8P//wfC//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//BsD//wO5
//8AtP//ALX//wCe4f8AR2X/AAQG/wAAAP8AAAD/AAAA/wAAANoAAABXAAAAAwAAAAAAAAAAAAAAAAAA
AD4AAADzAAAA/wAAAP8nVSX/UbFN/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Nqkn/R6BD/0egQ/9HoEP/SKNE/zBt
Lf8BAwH/AAAA/wAAAP8AAAD/fE0R//aYIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/8ZQg/+aJHv/liB7/5Yge/+eJ
Hv+/chn/Fg0D/wAAAP8AAAD/AAAApQAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABeAAAA7wAAAP8AAAD/AAAA/wEdJv8EcZb/BrDp/wfD
//8HxP//B8P//wfC//8Hwv//B8L//wW///8Cuf//ALX//wCo7/8Ac6T/ACMy/wAAAP8AAAD/AAAA/wAA
AP8AAAC2AAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAewAAAP8AAAD/AwYD/zp/N/9Rsk3/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/0umR/9HoEP/R6BD/0egQ/9HoEP/H0Ud/wAAAP8AAAD/AAAA/wAAAP87JQj/548f//SW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/6Ywf/+WIHv/liB7/5Yge/9+EHf9GKQn/AAAA/wAAAP8AAADeAAAAIQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAEAAABhAAAA6QAAAP8AAAD/AAAA/wACA/8BJjL/A199/wWOvP8GqN7/B7Xv/wa49P8EsfH/AaDi/wCJ
w/8AX4j/ACo7/wAEBv8AAAD/AAAA/wAAAP8AAADzAAAAiQAAABMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAkAAAC5AAAA/wAAAP8NHQ3/SZ9F/1CwTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Prkv/SaNF/0egQ/9HoEP/R6FD/0KV
Pv8OIA3/AAAA/wAAAP8AAAD/AAAA/xAKAv++dhr/9pgh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/tkCD/5Yge/+WI
Hv/liB7/6Ioe/4RPEf8AAAD/AAAA/wAAAPwAAABaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHAAAAzQAAAP8AAAD/AAAA/wAA
AP8AAAD/AAcK/wEXHv8BJzT/ASw7/wAmNv8AGCL/AAkN/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA2QAA
AFkAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKgAAAOcAAAD/AAAA/x9DHf9Qrkz/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/06rSv9HoUP/R6BD/0egQ/9IokT/Nnsz/wQJBP8AAAD/AAAA/wAAAP8AAAD/AAAA/39P
Ef/2mCH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/0liH/9pgh//eY
Iv/3mCL/95gi//WXIf/zliH/85Yh//CTIP/miR7/5Yge/+WIHv/niR7/vXAZ/xQMA/8AAAD/AAAA/wAA
AKEAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAfAAAAiwAAAOYAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA7QAAAJoAAAApAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABhAAAA/gAAAP8BAQH/M28w/1GyTf9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/S6dH/0egQ/9HoEP/R6BD/0ii
RP8mVST/AAAA/wAAAP8AAAD7AAAA+AAAAP8AAAD/PiYI/+iPIP/0liH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/9pgh/+iPH/++dhr/nGAV/5JaFP+kZRb/zX4c//CUIf/1lyH/85Yh/+mM
H//liB7/5Yge/+WIHv/ehB3/QicJ/wAAAP8AAAD/AAAA3AAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAMAAA
AIcAAADPAAAA9AAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD3AAAA1wAAAJMAAAA6AAAABAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAKEAAAD/AAAA/wgSCP9ElED/UbFN/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CuTP9JpEX/R6BD/0egQ/9HoEP/RZtB/xQuE/8AAAD/AAAA/wAAANcAAACxAAAA/wAA
AP8RCgL/wXca//aYIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/9JYh//GUIf+qaRf/QikJ/w8J
Av8BAQD/AAAA/wMCAP8ZDwP/XzoN/8p9G//1lyH/7ZAg/+WIHv/liB7/5Yge/+iKHv+ATBH/AAAA/wAA
AP8AAAD7AAAAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUAAABAAAAAbgAAAJIAAACpAAAArAAA
AKsAAACYAAAAdQAAAEgAAAAaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAaAAAA1wAAAP8AAAD/FzMW/06qSv9Qr0z/UK9M/1CvTP9Qr0z/UK9M/1CvTP9RsE3/UbJN/1Cv
TP9Prkz/UK9M/1GyTf9RsU3/UK9M/1CvTP9Qr0z/UK9M/1CvTP9Qr0z/TqxK/0ihRP9HoEP/R6BD/0ii
RP88hzn/BxAH/wAAAP8AAAD/AAAAnAAAAFMAAAD5AAAA/wAAAP+CUBL/9pgh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/vlCH/hlMS/w0IAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/JhcF/7Nv
GP/ylSH/5oke/+WIHv/liB7/6Ioe/7puGP8TCwL/AAAA/wAAAP8AAACcAAAAAQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAADAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEkAAAD3AAAA/wAAAP8rXin/UbFN/1Cv
TP9Qr0z/UK9M/1CvTP9QsEz/UbBN/0aaQ/8xbC//IEcf/xs7Gv8fRB3/LmUs/0SUQP9Qr0z/ULBM/1Cv
TP9Qr0z/UK9M/1CvTP9MqUj/R6BD/0egQ/9HoEP/SKNE/y1lKv8BAQH/AAAA/wAAAP4AAABfAAAAFwAA
ANcAAAD/AAAA/0EoCf/pkCD/9JYh//OWIf/zliH/85Yh//OWIf/zliH/9Zch/51hFf8KBgH/AAAA/wAA
AP8AAAD/BQUF/woKCv8BAQH/AAAA/wAAAP8AAAD/KBkF/81+HP/rjR//5Yge/+WIHv/miB7/3IMd/z4l
CP8AAAD/AAAA/wAAANEAAAAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAiAAAAP8AAAD/BAoE/z6HOv9RsU3/UK9M/1CvTP9Qr0z/ULBM/06qSv8wai7/DRwM/wAB
AP8AAAD/AAAA/wAAAP8AAAD/ChUJ/ytdKP9Mp0j/ULBM/1CvTP9Qr0z/UK9M/0qlRv9HoEP/R6BD/0eg
Q/9Hn0P/Gz0a/wAAAP8AAAD/AAAA5gAAACkAAAAAAAAAmwAAAP8AAAD/EwwD/8R5G//2mCH/85Yh//OW
If/zliH/85Yh//SXIf/ciB7/Lx0G/wAAAP8AAAD/BQUF/1ZWVv+wsLD/wsLC/5qamv8xMTH/AAAA/wAA
AP8AAAD/Z0AO/+qNH//liB7/5Yge/+WIHv/oih7/cUMP/wAAAP8AAAD/AAAA7AAAACwAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADDAAAA/wAAAP8QJBD/S6NH/1Cw
TP9Qr0z/UK9M/1CvTP9PrEv/KFcm/wIEAv8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AQEB/yJK
IP9NqEn/ULBM/1CvTP9PrUv/SKJE/0egQ/9HoEP/R6FD/0CRPf8MGgv/AAAA/wAAAP8AAAC4AAAACQAA
AAAAAABUAAAA+gAAAP8AAAD/hlMS//aYIf/zliH/85Yh//OWIf/zliH/95gi/6BjFv8DAgD/AAAA/wAA
AP9kZGT/9PT0/////////////////9bW1v8uLi7/AAAA/wAAAP8gFAT/z30c/+eJHv/liB7/5Yge/+mK
H/+VWRT/AgEA/wAAAP8AAADvAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAALAAAAOkAAAD/AAAA/yJLIf9QsEz/UK9M/1CvTP9Qr0z/UbFN/zZ1M/8DBwP/AAAA/wAA
AP8AAAD/Gxsb/zQ0NP8gICD/AQEB/wAAAP8AAAD/AQIB/y5kK/9QsEz/UK9M/02qSf9HoEP/R6BD/0eg
Q/9IokT/M3Qx/wMGAv8AAAD/AAAA/wAAAHoAAAAAAAAAAAAAAB0AAADaAAAA/wAAAP9EKgn/65Eg//SW
If/zliH/85Yh//OWIf/1lyH/b0QP/wAAAP8AAAD/FBQU/87Ozv///////////////////////////46O
jv8AAAD/AAAA/wgFAf+taRf/6Yof/+WIHv/liB7/6Ioe/6tmFv8JBQH/AAAA/wAAAO4AAAAvAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPAAAA+gAAAP8BAQH/M3Ax/1Gy
Tf9Qr0z/UK9M/1CwTP9LpUj/FCsT/wAAAP8AAAD/BgYG/25ubv/X19f/8PDw/97e3v+CgoL/DQ0N/wAA
AP8AAAD/DRwM/0ecRP9RsE3/S6dH/0egQ/9HoEP/R6BD/0ihRP8iTSD/AAAA/wAAAP8AAADyAAAAPgAA
AAAAAAAAAAAAAgAAAJ4AAAD/AAAA/xUNA//Hexv/9pgh//OWIf/zliH/85Yh//OWIf9hPA3/AAAA/wAA
AP8oKCj/6enp////////////////////////////s7Oz/wUFBf8AAAD/AwIA/5xeFf/pix//5Yge/+WI
Hv/oih7/r2gX/woGAf8AAAD/AAAA7gAAAC8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAGUAAAD/AAAA/wMHA/89hTr/UbFN/1CvTP9Qr0z/UbFN/z2GOv8ECQT/AAAA/wAA
AP9dXV3/9/f3//////////////////7+/v92dnb/AAAA/wAAAP8BAwH/NnYz/1GxTf9Jo0X/R6BD/0eg
Q/9HoEP/RJhA/xEnEP8AAAD/AAAA/wAAAM0AAAATAAAAAAAAAAAAAAAAAAAAWAAAAPsAAAD/AAAA/4pV
E//2mCH/85Yh//OWIf/zliH/9Zch/2tCD/8AAAD/AAAA/xkZGf/V1dX/////////////////////////
//+Xl5f/AAAA/wAAAP8HBAH/qGYW/+mKH//liB7/5Yge/+mKHv+kYRX/BgQB/wAAAP8AAADuAAAALwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQAAAP8AAAD/BgwF/0GO
Pv9RsU3/UK9M/1CvTP9Rsk3/MWwv/wAAAP8AAAD/CAgI/7a2tv///////////////////////////8zM
zP8SEhL/AAAA/wAAAP8oWCb/T65L/0ihRP9HoEP/R6BD/0iiRP85gTb/BQwF/wAAAP8AAAD/AAAAlAAA
AAAAAAAAAAAAAAAAAAAAAAAgAAAA3QAAAP8AAAD/SCwK/+ySIP/0liH/85Yh//OWIf/3mCL/mF4V/wEB
AP8AAAD/AAAA/3Z2dv/8/Pz/////////////////5eXl/zs7O/8AAAD/AAAA/xsQBP/IeRv/54ke/+WI
Hv/liB7/6Yoe/4dQEv8AAAD/AAAA/wAAAO8AAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB1AAAA/wAAAP8GDAX/QY09/1GxTf9Qr0z/UK9M/1GyTf8vZy3/AAAA/wAA
AP8ODg7/yMjI////////////////////////////29vb/xsbG/8AAAD/AAAA/yRPIv9Nqkn/R6BD/0eg
Q/9HoEP/SKJE/yldJ/8AAAD/AAAA/wAAAPsAAABUAAAAAAAAAAAAAAAAAAAAAAAAAAMAAACjAAAA/wAA
AP8WDgP/yXwb//aYIf/zliH/85Yh//WXIf/Ugx3/JBYF/wAAAP8AAAD/CwsL/3BwcP/Kysr/29vb/7e3
t/9HR0f/AAAA/wAAAP8AAAD/WTcM/+aKH//liB7/5Yge/+WIHv/liB7/WzYM/wAAAP8AAAD/AAAA4wAA
ACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAAD/AAAA/wMH
A/89hTr/UbJN/1CvTP9Qr0z/UbJN/zV1M/8BAgH/AAAA/wEBAf+Xl5f/////////////////////////
//+xsbH/CAgI/wAAAP8AAAD/LWMr/0unR/9HoEP/R6BD/0egQ/9GnUL/GDUW/wAAAP8AAAD/AAAA3wAA
ACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFwAAAD8AAAA/wAAAP+LVhP/95gh//OWIf/zliH/85Yh//SX
If+LVhP/BAIB/wAAAP8AAAD/AAAA/xAQEP8YGBj/CgoK/wAAAP8AAAD/AAAA/x0SBP/Adhr/6owf/+WI
Hv/liB7/54ke/857G/8mFwX/AAAA/wAAAP8AAAC9AAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAATAAAAPkAAAD/AAEA/zJuMP9Rsk3/UK9M/1CvTP9RsU3/RJVA/wkT
CP8AAAD/AAAA/y0tLf/Q0ND/////////////////3t7e/0BAQP8AAAD/AAAA/wQKBP88hDn/SaRF/0eg
Q/9HoEP/SKFE/z6MO/8JFQn/AAAA/wAAAP8AAACtAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQAA
AN4AAAD/AAAA/zwlCP/ljR//9Jch//OWIf/zliH/9Jch/+qRIP9vRQ//BQMB/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8XDgP/oWMW//CSIP/liB7/5Yge/+WIHv/oih7/kFYT/wQCAP8AAAD/AAAA/wAA
AHsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApAAAA5wAA
AP8AAAD/IUgf/1CvTP9Qr0z/UK9M/1CvTP9PrUv/IUgf/wAAAP8AAAD/AAAA/ycnJ/+BgYH/qamp/4mJ
if8xMTH/AAAA/wAAAP8AAAD/GTYY/0qjRv9HoUP/R6BD/0egQ/9Io0T/MG0t/wEDAf8AAAD/AAAA/wAA
AG0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAmAAAAP8AAAD/BgMB/5lfFf/2mCH/85Yh//OW
If/zliH/9Jch/+uRIP+SWhT/LBsG/wUDAf8AAAD/AAAA/wAAAP8MBwL/RSsJ/7dxGf/zliH/6owf/+WI
Hv/liB7/54ke/9J9HP80Hwf/AAAA/wAAAP8AAADpAAAAMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAC/AAAA/wAAAP8NHAz/SJ1E/1GwTf9Qr0z/UK9M/1Gx
Tf9ElUH/DyAO/wAAAP8AAAD/AAAA/wAAAP8DAwP/AAAA/wAAAP8AAAD/AAAA/woVCf8+iDv/S6hH/0eg
Q/9HoEP/R6BD/0efQ/8cPhr/AAAA/wAAAP8AAADtAAAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA7AAAA7QAAAP8AAAD/KRoG/9CAHP/2mCH/85Yh//OWIf/zliH/9JYh//WXIf/bhx7/pWYW/35O
Ef92SRD/iFQS/7dxGf/ojx//9pgh/++RIP/miR7/5Yge/+WIHv/kiB7/c0QP/wEAAP8AAAD/AAAA/wAA
AJsAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHoAAAD/AAAA/wEBAf8vZy3/UbFN/1CvTP9Qr0z/UK9M/1GxTf8+iDv/ECMP/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8MGgv/OX02/0+uS/9IokT/R6BD/0egQ/9IokT/OoM3/wcQB/8AAAD/AAAA/wAA
ALsAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAACWAAAA/wAAAP8AAAD/TjAL/+CK
Hv/1mCH/85Yh//OWIf/zliH/85Yh//WXIf/3mCL/9pgh//aYIf/3mCL/9pgh//SXIf/xlCH/6Isf/+WI
Hv/liB7/54ke/5VYFP8OCAL/AAAA/wAAAP8AAADkAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALAAAAOUAAAD/AAAA/w8gDv9HmkP/UbFN/1Cv
TP9Qr0z/UK9M/1GxTf9GmUL/JlMk/w4eDf8ECQT/AQMB/wQIA/8MGgv/Iksh/0OSQP9RsE3/TKhI/0eg
Q/9HoEP/R6BD/0adQv8dQRv/AAAA/wAAAP8AAAD+AAAAZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACQAAADSAAAA/wAAAP8AAAD/VTUM/9uHHv/2mCH/85Yh//OWIf/zliH/85Yh//OW
If/zliH/85Yh//OWIf/zliH/8pUh/+qNH//liB7/5oke/+SIHv+WWRT/Fg0D/wAAAP8AAAD/AAAA/AAA
AHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAABAAAAkAAAAP8AAAD/AAAA/yFIH/9Oqkr/ULBM/1CvTP9Qr0z/UK9M/1GwTf9Qr0z/SZ9F/z6I
O/84ejX/PYU6/0ecRP9Qrkz/UbFN/06sSv9IokT/R6BD/0egQ/9IokT/Lmgr/wMHA/8AAAD/AAAA/wAA
AM0AAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEoAAADpAAAA/wAA
AP8AAAD/PSYI/7lyGf/yliH/9pgh//SWIf/zliH/85Yh//OWIf/zliH/85Yh//KVIf/rjh//54ke/+iK
Hv/TfRz/dEUP/w4IAv8AAAD/AAAA/wAAAP8AAACiAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAA2QAAAP8AAAD/AgQC/ypc
KP9PrUv/ULBM/1CvTP9Qr0z/UK9M/1CvTP9QsEz/UbFN/1GyTf9RsU3/UbBN/1CvTP9Qrkz/SqVG/0eg
Q/9HoEP/SKJE/zV3Mv8JFAj/AAAA/wAAAP8AAAD3AAAAXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAAAADuAAAA/wAAAP8AAAD/FA0D/2pBDv/CeBr/7JEg//aY
If/3mSL/9pgh//aYIf/0liH/7Y8f/+WIHv/Pexv/kVYT/zUgB/8BAQD/AAAA/wAAAP8AAAD/AAAArwAA
ABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABdAAAA9QAAAP8AAAD/AwYD/yhYJv9Mp0n/UbFN/1CvTP9Qr0z/UK9M/1Cv
TP9Qr0z/UK9M/1CvTP9Qr0z/UK9M/0unR/9HoEP/SKFE/0egQ/8xbi7/ChUJ/wAAAP8AAAD/AAAA/wAA
AJsAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA
AFYAAADgAAAA/wAAAP8AAAD/AAAA/xQMA/9HLAr/fU0R/6JkFv+4chn/unIZ/6ZjFv+IURL/XDYM/ycX
Bf8EAgD/AAAA/wAAAP8AAAD/AAAA/AAAAKIAAAAZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAACFAAAA/QAA
AP8AAAD/AQMB/xs7Gf9AjT3/UK9M/1GxTf9QsEz/UK9M/1CvTP9Qr0z/UK9M/1CuTP9LqEf/SKJE/0ii
RP8/jzz/Ik4h/wULBP8AAAD/AAAA/wAAAP8AAAC5AAAAGgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADcAAAC3AAAA/AAAAP8AAAD/AAAA/wAA
AP8AAAD/AwIA/wsHAf8MBwL/BgQB/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAOUAAAB1AAAADAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAACPAAAA/AAAAP8AAAD/AAAA/wgSCP8iSyH/PIQ5/0qi
R/9Prkv/UbFN/1GyTf9Qr0v/SqVG/0SZQP86gzf/JlUk/w0dDP8AAAD/AAAA/wAAAP8AAAD/AAAAvQAA
ACQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAABAAAABnAAAAywAAAPoAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAOkAAACcAAAAMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAoAAAB5AAAA7wAAAP8AAAD/AAAA/wAAAP8ECQT/ECIP/x0/G/8mVCT/KFcm/yRRIv8cQBv/EScQ/wYO
Bv8AAAD/AAAA/wAAAP8AAAD/AAAA/AAAAKYAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAVwAA
AKEAAADVAAAA7wAAAPoAAAD/AAAA/wAAAP0AAAD1AAAA4wAAAL0AAAB8AAAAMQAAAAMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAABKAAAAxAAAAP0AAAD/AAAA/wAA
AP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAN4AAABvAAAADAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAABcAAAA1AAAAUAAAAGMAAABlAAAAWwAA
AEEAAAAlAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAVAAAAaQAAAMUAAAD1AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAA
AP8AAAD/AAAA/AAAANkAAACIAAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEQAA
AEYAAACFAAAAtwAAANYAAADjAAAA5gAAAOQAAADcAAAAwQAAAJYAAABZAAAAHQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAFwAAACIAAAAnAAAAJAAA
ABsAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
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
AAD//////////////////////////////////////////////////////////////////wABAAAAAAAA
AAf///////gAAAAAAAAAAAAA///////gAAAAAAAAAAAAAH//////wAAAAAAAAAAAAAAf/////4AAAAAA
AAAAAAAAD/////8AAAAAAAAAAAAAAAf////+AAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAA/////wA
AAAAAAAAAAAAAAH////4AAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD/
///wAAAAAAAAAAAAAAAA////8AAAAAAAAAAAAAAAAH////AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAA
AAAAf///8AAAAAAAAAAAAAAAAD////AAAAAAAAAAAAAAAAA////wAAAAAAAAAAAAAAAAP///8AAAAAAA
AAAAAAAAAB////AAAAAAAAAAAAAAAAAf///wAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAA////AA
AAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAAD///+AAAAAAAAAAAAAAAAAf///gAAAAAAAAAAAAAAAAH
///8AAAAAAAAAAAAAAAAB////AAAAAAAAAAAAAAAAAP///4AAAAAAAAAAAAAAAAD////AAAAAAAAAAAA
AAAAA////4AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAB////4AAAAAAAAAAAAAAAAf////gAAAAA
AAAAAAAAAAD/////AAAAAAAAAAAAAAAA////////AAAAAAAAAAAAAP///////gAAAAAAAAAAAAD/////
//wAAAAAAAAAAAAAf//////wAAAAAAAAAAAAAH//////4AAAAAAAAAAAAAA//////8AAAAAAAAAAAAAA
P/////8AAAAAAAAAAAAAAD/////+AAAAAAAAAAAAAAA//////AAAAAAAAAAAAAAAH/////gAAAAAAAAA
AAAAAB/////wAAAAAAAAAAAAAAAf////8AAAAAAAAAAAAAAAH////+AAAAAAAAAAAAAAAB/////gAAAA
AAAAAAAAAAAf////wAAAAAAAAAAAAAAAD////8AAAAAAAAAAAAAAAAf////AAAAAAAAAAAAAAAAH////
wAAAAAAAAAAAAAAAA////8AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAA
Af///8AAAAAAAAAAAAAAAAH////AAAAAAAAAAAAAAAAB////wAAAAAAAAAAAAAAAAP///8AAAAAAAAAA
AAAAAAD////AAAAAAAAAAAAAAAAA////wAAAAAAAAAAAAAAAAH///8AAAAAAAAAAAAAAAAB////AAAAA
AAAAAAAAAAAAf///4AAAAAAAAAAAAAAAAD///+AAAAAAAAAAAAAAAAA////gAAAAAAAAAAAAAAAAP///
8AAAAAAAAAAAAAAAAB////gAAAAQAAAAAAAAAAAf///8AAAAIAAAAAAAAAAAH////gAAAGAAAAAAAAAA
AA////8AAAHgAAAAAAAAAAAP////gAADwAAAAAAAAAAAD/////AAD8AAAAAAAAAAAA/////+AP/AAAAA
AAAAAAAP////////wAAAAAAAAAAAD////////8AAAAAAAAAAAA/////////AAAAAAAAAAAAP////////
wAAAAAAAAAAAD////////8AAAAAAAAAAAA/////////AAAAAAQAAAAAP////////wAAAAAEAAAAAD///
/////8AAAAADAAAAAA/////////AAAAAA4AAAAAP////////wAAAAAOAAAAAD////////8AAAAAHgAAA
AB/////////AAAAAB8AAAAAf////////wAAAAAfAAAAAP////////+AAAAAH4AAAAD/////////gAAAA
D/AAAAB/////////8AAAAB/4AAAA//////////gAAAAf/AAAAf/////////4AAAAP/4AAAf/////////
/AAAAH//AAAP//////////4AAAD//+AAP///////////gAAD/////////////////+AAB///////////
///////8AD//////////////////////////////////////////////////////////////////////
//8=
</value>
</data>
</root>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
<log4net>
<appender name="AGVControl_Steel" type="log4net.Appender.RollingFileAppender">
<file value="Logs/AGVControl_Steel.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<appender name="MiR_API" type="log4net.Appender.RollingFileAppender">
<file value="Logs/MiR_API.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t][%c:%L]%-5p %m%n"/>
</layout>
</appender>
<logger name="AGVControl_Steel">
<level value="Debug"/>
<appender-ref ref="AGVControl_Steel"/>
</logger>
<logger name="MiR_API">
<level value="Debug"/>
<appender-ref ref="MiR_API"/>
</logger>
</log4net>
<appSettings>
<add key="FLEET_IP" value="10.85.199.3"/>
<add key="FLEET_Send" value="true"/>
<add key="WebService" value="http://10.85.196.40:8089/"/>
<!--<add key="WebService" value="http://10.211.55.23:8089/"/>-->
<add key="AGV_BATTERY_MAX" value="100"/>
<add key="AGV_BATTERY_MIN" value="40"/>
<add key="Use_32" value="false"/>
<add key="Use_25" value="false"/>
<add key="Work_32" value="4C"/>
<add key="Work_25" value="4D"/>
<add key="PlaceName" value="D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15,D16,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,C11,C12,C13,C14,C15,C16,4Cwash,4Dwash,storage"/>
</appSettings>
</configuration>
\ No newline at end of file
MoveSteelC1,77a02463-f387-11ea-8452-94c691a7387d
MoveSteelC2,b2dc4ed9-f387-11ea-8452-94c691a7387d
MoveSteelC3,c7f598c1-f387-11ea-8452-94c691a7387d
MoveSteelC4,ddfd5992-f387-11ea-8452-94c691a7387d
MoveSteelC5,f0a4498e-f387-11ea-8452-94c691a7387d
MoveSteelC6,037a7f67-f388-11ea-8452-94c691a7387d
MoveSteelC7,1b361828-f388-11ea-8452-94c691a7387d
MoveSteelC8,2aec8e6c-f388-11ea-8452-94c691a7387d
MoveSteelC9,3cad8c7d-f388-11ea-8452-94c691a7387d
MoveSteelC10,4cc3d656-f388-11ea-8452-94c691a7387d
MoveSteelD1,e9ed94bf-f2ac-11ea-8452-94c691a7387d
MoveSteelD2,04e5690f-f2ad-11ea-8452-94c691a7387d
MoveSteelD3,1d3f9b5a-f2ad-11ea-8452-94c691a7387d
MoveSteelD4,55bf620d-f2ad-11ea-8452-94c691a7387d
MoveSteelD5,6c1fe859-f2ad-11ea-8452-94c691a7387d
MoveSteelD6,8498ea0b-f2ad-11ea-8452-94c691a7387d
MoveSteelD8,ba683168-f2ad-11ea-8452-94c691a7387d
MoveSteelD9,de7f8051-f2ad-11ea-8452-94c691a7387d
MoveSteelD10,f81944b7-f2ad-11ea-8452-94c691a7387d
MoveSteelD11,0a0b0df1-f2ae-11ea-8452-94c691a7387d
MoveSteelD12,201e368d-f2ae-11ea-8452-94c691a7387d
MoveSteelD14,445106a1-f2ae-11ea-8452-94c691a7387d
MoveSteelD15,002b3e45-f105-11ea-a03e-94c691a7387d
MoveSteelD16,15a766ac-f2a2-11ea-8452-94c691a7387d
MoveWash4C,691e75ab-f2b0-11ea-8452-94c691a7387d
MoveWash4D,e52ae766-f2ab-11ea-8452-94c691a7387d
MoveStandby4C,2dd387ce-f2b0-11ea-8452-94c691a7387d
MoveStandby4D,21ca7ffe-f29e-11ea-8452-94c691a7387d
AutoCharge4C,8ed7b459-f2b0-11ea-8452-94c691a7387d
AutoCharge4D,2f0a31b1-f2ab-11ea-8452-94c691a7387d
PassDoorInto4D,d67f31c8-ca7e-11ea-9a66-94c691a7387d
PassDoorInto4C,fd6e26ac-c1bf-11ea-9a66-94c691a7387d
MoveSteelstorage,418c9064-f2ac-11ea-8452-94c691a7387d
Pickupqisdashelf,f2acdcae-e524-11ea-b003-0001299a3f0e
Placeqisdashelf,4001120d-e525-11ea-b003-0001299a3f0e
\ No newline at end of file
32,11号_4C,10.85.199.82,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
25,13号_4D,10.85.199.84,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
\ No newline at end of file
[2020-09-24 09:41:50,372][1][AGVControl_Steel:32]INFO =====程序开始=====
[2020-09-24 09:41:50,401][1][AGVControl_Steel:83]INFO 读取配置文件 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\Config\AgvName.csv
[2020-09-24 09:41:50,402][1][AGVControl_Steel:94]INFO 读取配置文件 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\Config\AgvMission.csv
[2020-09-24 09:41:50,672][1][AGVControl_Steel:299]INFO Web服务已开启
[2020-09-24 09:42:45,691][1][AGVControl_Steel:32]INFO =====程序开始=====
[2020-09-24 09:42:45,713][1][AGVControl_Steel:83]INFO 读取配置文件 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\Config\AgvName.csv
[2020-09-24 09:42:45,713][1][AGVControl_Steel:94]INFO 读取配置文件 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\Config\AgvMission.csv
[2020-09-24 09:42:45,882][1][AGVControl_Steel:299]INFO Web服务已开启
[2020-09-24 09:43:36,766][1][AGVControl_Steel:32]INFO =====程序开始=====
[2020-09-24 09:43:36,786][1][AGVControl_Steel:83]INFO 读取配置文件 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\Config\AgvName.csv
[2020-09-24 09:43:36,787][1][AGVControl_Steel:94]INFO 读取配置文件 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\Config\AgvMission.csv
[2020-09-24 09:43:38,228][1][AGVControl_Steel:299]INFO Web服务已开启
[2020-09-24 09:43:38,346][9][AGVControl_Steel:58]ERROR CallProcess 11号_4C[10.85.199.82]
System.InvalidOperationException: 线程间操作无效: 从不是创建控件“TxtAgvMission0”的线程访问它。
在 System.Windows.Forms.Control.get_Handle()
在 System.Windows.Forms.Control.set_WindowText(String value)
在 System.Windows.Forms.TextBoxBase.set_WindowText(String value)
在 System.Windows.Forms.Control.set_Text(String value)
在 System.Windows.Forms.TextBoxBase.set_Text(String value)
在 System.Windows.Forms.TextBox.set_Text(String value)
在 AGVControl_Steel.FrmMain.Control_AgvOnline(Int32 agvIndex) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\UI\FrmMain.cs:行号 33
在 BLL.Control.CheckAgvOnline(AgvInfo& info) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 122
在 BLL.Control.CallProcess(Object obj) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 58
[2020-09-24 09:43:38,440][9][AGVControl_Steel:58]ERROR CallProcess 13号_4D[10.85.199.84]
System.InvalidOperationException: 线程间操作无效: 从不是创建控件“TxtAgvMission1”的线程访问它。
在 System.Windows.Forms.Control.get_Handle()
在 System.Windows.Forms.Control.set_WindowText(String value)
在 System.Windows.Forms.TextBoxBase.set_WindowText(String value)
在 System.Windows.Forms.Control.set_Text(String value)
在 System.Windows.Forms.TextBoxBase.set_Text(String value)
在 System.Windows.Forms.TextBox.set_Text(String value)
在 AGVControl_Steel.FrmMain.Control_AgvOnline(Int32 agvIndex) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\UI\FrmMain.cs:行号 33
在 BLL.Control.CheckAgvOnline(AgvInfo& info) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 122
在 BLL.Control.CallProcess(Object obj) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 58
[2020-09-24 09:43:40,466][9][AGVControl_Steel:60]ERROR CallProcess 11号_4C[10.85.199.82]
System.InvalidOperationException: 线程间操作无效: 从不是创建控件“TxtAgvMission0”的线程访问它。
在 System.Windows.Forms.Control.get_Handle()
在 System.Windows.Forms.Control.set_WindowText(String value)
在 System.Windows.Forms.TextBoxBase.set_WindowText(String value)
在 System.Windows.Forms.Control.set_Text(String value)
在 System.Windows.Forms.TextBoxBase.set_Text(String value)
在 System.Windows.Forms.TextBox.set_Text(String value)
在 AGVControl_Steel.FrmMain.Control_AgvChanged(Int32 agvIndex) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\UI\FrmMain.cs:行号 26
在 BLL.Control.GetAgvState(AgvInfo& info) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 102
在 BLL.Control.CallProcess(Object obj) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 60
[2020-09-24 09:43:40,539][9][AGVControl_Steel:60]ERROR CallProcess 13号_4D[10.85.199.84]
System.InvalidOperationException: 线程间操作无效: 从不是创建控件“TxtAgvMission1”的线程访问它。
在 System.Windows.Forms.Control.get_Handle()
在 System.Windows.Forms.Control.set_WindowText(String value)
在 System.Windows.Forms.TextBoxBase.set_WindowText(String value)
在 System.Windows.Forms.Control.set_Text(String value)
在 System.Windows.Forms.TextBoxBase.set_Text(String value)
在 System.Windows.Forms.TextBox.set_Text(String value)
在 AGVControl_Steel.FrmMain.Control_AgvChanged(Int32 agvIndex) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\UI\FrmMain.cs:行号 26
在 BLL.Control.GetAgvState(AgvInfo& info) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 102
在 BLL.Control.CallProcess(Object obj) 位置 D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\BLL\Control.cs:行号 60
[2020-09-24 09:41:50,755][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/io_modules
[2020-09-24 09:41:50,942][8][MiR_API:748]INFO Return:[ { "guid": "007615a5-2220-11ea-99f2-94c691a73b53", "name": "WISE-4060/LAN", "type": "wise", "url": "/v2.0.0/io_modules/007615a5-2220-11ea-99f2-94c691a73b53" }, { "guid": "fba284c3-c7f4-11ea-8343-000129998252", "name": "WISE-4060/LAN-4C", "type": "wise", "url": "/v2.0.0/io_modules/fba284c3-c7f4-11ea-8343-000129998252" }, { "guid": "62a80d61-c832-11ea-adc7-0001299981d4", "name": "WISE-4060/LAN-4D", "type": "wise", "url": "/v2.0.0/io_modules/62a80d61-c832-11ea-adc7-0001299981d4" }, { "guid": "26ffcc2a-d177-11ea-88e9-0001299981d4", "name": "WISE-4060/LAN-4C-Air", "type": "wise", "url": "/v2.0.0/io_modules/26ffcc2a-d177-11ea-88e9-0001299981d4" }]
[2020-09-24 09:41:51,022][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:51,043][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 75.700000000000003 \u7c73\uff09", "position": { "orientation": -89.93533325195312, "x": 79.37785339355469, "y": 101.8035659790039 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:41:51,087][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/io_modules
[2020-09-24 09:41:51,107][8][MiR_API:748]INFO Return:[ { "guid": "007615a5-2220-11ea-99f2-94c691a73b53", "name": "WISE-4060/LAN", "type": "wise", "url": "/v2.0.0/io_modules/007615a5-2220-11ea-99f2-94c691a73b53" }, { "guid": "fba284c3-c7f4-11ea-8343-000129998252", "name": "WISE-4060/LAN-4C", "type": "wise", "url": "/v2.0.0/io_modules/fba284c3-c7f4-11ea-8343-000129998252" }, { "guid": "62a80d61-c832-11ea-adc7-0001299981d4", "name": "WISE-4060/LAN-4D", "type": "wise", "url": "/v2.0.0/io_modules/62a80d61-c832-11ea-adc7-0001299981d4" }, { "guid": "26ffcc2a-d177-11ea-88e9-0001299981d4", "name": "WISE-4060/LAN-4C-Air", "type": "wise", "url": "/v2.0.0/io_modules/26ffcc2a-d177-11ea-88e9-0001299981d4" }]
[2020-09-24 09:41:51,107][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:51,139][8][MiR_API:748]INFO Return:{ "battery_percentage": 38.79999923706055, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:41:52,687][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:52,753][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 75.099999999999994 \u7c73\uff09", "position": { "orientation": -87.09103393554688, "x": 79.34891510009766, "y": 101.16978454589844 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:41:52,758][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:52,799][8][MiR_API:748]INFO Return:{ "battery_percentage": 38.79999923706055, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:41:54,691][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:54,738][8][MiR_API:748]INFO Return:{ "battery_percentage": 32.0, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 74.299999999999997 \u7c73\uff09", "position": { "orientation": -92.52440643310547, "x": 79.37625885009766, "y": 100.42344665527344 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:41:54,760][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:54,781][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.0, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:41:56,705][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:57,067][8][MiR_API:748]INFO Return:{ "battery_percentage": 32.0, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 73.5 \u7c73\uff09", "position": { "orientation": -88.66055297851562, "x": 79.37094116210938, "y": 99.58942413330078 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:41:57,081][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:57,117][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.0, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:41:58,716][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:58,737][8][MiR_API:748]INFO Return:{ "battery_percentage": 32.0, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 72.799999999999997 \u7c73\uff09", "position": { "orientation": -86.97412872314453, "x": 79.37427520751953, "y": 98.87818908691406 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:41:58,745][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:41:58,777][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.0, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:00,717][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:00,796][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 72 \u7c73\uff09", "position": { "orientation": -90.70954895019531, "x": 79.37185668945312, "y": 98.10393524169922 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:00,803][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:00,826][8][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:02,744][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:02,788][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 71.299999999999997 \u7c73\uff09", "position": { "orientation": -88.97383117675781, "x": 79.36426544189453, "y": 97.3402099609375 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:02,794][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:02,818][8][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:04,734][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:04,798][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 70.5 \u7c73\uff09", "position": { "orientation": -88.82857513427734, "x": 79.37214660644531, "y": 96.60324096679688 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:04,804][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:04,827][8][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:06,758][10][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:06,779][10][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 69.700000000000003 \u7c73\uff09", "position": { "orientation": -89.14307403564453, "x": 79.388427734375, "y": 95.83130645751953 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:06,785][10][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:06,824][10][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:08,750][10][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:08,823][10][MiR_API:748]INFO Return:{ "battery_percentage": 31.899999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 68.900000000000006 \u7c73\uff09", "position": { "orientation": -89.332763671875, "x": 79.3731918334961, "y": 95.03631591796875 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:08,830][10][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:08,870][10][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:10,760][10][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:10,816][10][MiR_API:748]INFO Return:{ "battery_percentage": 31.799999237060547, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 68.200000000000003 \u7c73\uff09", "position": { "orientation": -88.8277359008789, "x": 79.37012481689453, "y": 94.27587127685547 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:10,821][10][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:10,844][10][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:12,770][10][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:12,797][10][MiR_API:748]INFO Return:{ "battery_percentage": 31.799999237060547, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 67.400000000000006 \u7c73\uff09", "position": { "orientation": -92.50466918945312, "x": 79.3765640258789, "y": 93.51998901367188 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:12,805][10][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:12,821][10][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:14,775][10][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:14,881][10][MiR_API:748]INFO Return:{ "battery_percentage": 31.799999237060547, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 66.700000000000003 \u7c73\uff09", "position": { "orientation": -86.22252655029297, "x": 79.37586975097656, "y": 92.78275299072266 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:14,894][10][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:14,975][10][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:16,786][10][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:16,817][10][MiR_API:748]INFO Return:{ "battery_percentage": 31.700000762939453, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 65.900000000000006 \u7c73\uff09", "position": { "orientation": -89.50321197509766, "x": 79.37481689453125, "y": 92.01412963867188 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:16,824][10][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:16,843][10][MiR_API:748]INFO Return:{ "battery_percentage": 38.900001525878906, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:45,942][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/io_modules
[2020-09-24 09:42:46,045][8][MiR_API:748]INFO Return:[ { "guid": "007615a5-2220-11ea-99f2-94c691a73b53", "name": "WISE-4060/LAN", "type": "wise", "url": "/v2.0.0/io_modules/007615a5-2220-11ea-99f2-94c691a73b53" }, { "guid": "fba284c3-c7f4-11ea-8343-000129998252", "name": "WISE-4060/LAN-4C", "type": "wise", "url": "/v2.0.0/io_modules/fba284c3-c7f4-11ea-8343-000129998252" }, { "guid": "62a80d61-c832-11ea-adc7-0001299981d4", "name": "WISE-4060/LAN-4D", "type": "wise", "url": "/v2.0.0/io_modules/62a80d61-c832-11ea-adc7-0001299981d4" }, { "guid": "26ffcc2a-d177-11ea-88e9-0001299981d4", "name": "WISE-4060/LAN-4C-Air", "type": "wise", "url": "/v2.0.0/io_modules/26ffcc2a-d177-11ea-88e9-0001299981d4" }]
[2020-09-24 09:42:46,091][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:46,112][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.299999237060547, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 56.299999999999997 \u7c73\uff09", "position": { "orientation": -87.176513671875, "x": 79.47293853759766, "y": 82.38200378417969 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:46,135][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/io_modules
[2020-09-24 09:42:46,155][8][MiR_API:748]INFO Return:[ { "guid": "007615a5-2220-11ea-99f2-94c691a73b53", "name": "WISE-4060/LAN", "type": "wise", "url": "/v2.0.0/io_modules/007615a5-2220-11ea-99f2-94c691a73b53" }, { "guid": "fba284c3-c7f4-11ea-8343-000129998252", "name": "WISE-4060/LAN-4C", "type": "wise", "url": "/v2.0.0/io_modules/fba284c3-c7f4-11ea-8343-000129998252" }, { "guid": "62a80d61-c832-11ea-adc7-0001299981d4", "name": "WISE-4060/LAN-4D", "type": "wise", "url": "/v2.0.0/io_modules/62a80d61-c832-11ea-adc7-0001299981d4" }, { "guid": "26ffcc2a-d177-11ea-88e9-0001299981d4", "name": "WISE-4060/LAN-4C-Air", "type": "wise", "url": "/v2.0.0/io_modules/26ffcc2a-d177-11ea-88e9-0001299981d4" }]
[2020-09-24 09:42:46,156][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:46,175][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.0, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:47,900][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:47,936][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.299999237060547, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 55.600000000000001 \u7c73\uff09", "position": { "orientation": -89.59019470214844, "x": 79.47929382324219, "y": 81.65172576904297 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:47,942][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:47,961][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.0, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:49,908][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:49,926][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.399999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 54.799999999999997 \u7c73\uff09", "position": { "orientation": -92.31658935546875, "x": 79.48524475097656, "y": 80.8298110961914 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:49,932][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:50,094][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.099998474121094, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:51,918][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:51,936][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.399999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 54 \u7c73\uff09", "position": { "orientation": -88.35818481445312, "x": 79.48416137695312, "y": 80.01963806152344 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:51,944][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:52,027][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.099998474121094, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:53,928][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:53,944][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.399999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 53.200000000000003 \u7c73\uff09", "position": { "orientation": -92.55992126464844, "x": 79.46661376953125, "y": 79.238037109375 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:53,949][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:53,991][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.099998474121094, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:55,937][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:55,954][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.399999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 52.5 \u7c73\uff09", "position": { "orientation": -103.36315155029297, "x": 79.36163330078125, "y": 78.59185028076172 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:55,962][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:55,980][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.29999923706055, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:57,945][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:57,964][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.399999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 51.700000000000003 \u7c73\uff09", "position": { "orientation": -91.9524154663086, "x": 79.3265609741211, "y": 77.85210418701172 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:57,981][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:58,037][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.29999923706055, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:42:59,954][8][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:42:59,978][8][MiR_API:748]INFO Return:{ "battery_percentage": 31.399999618530273, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 51 \u7c73\uff09", "position": { "orientation": -89.39421081542969, "x": 79.34768676757812, "y": 77.09439086914062 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:42:59,984][8][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:43:00,025][8][MiR_API:748]INFO Return:{ "battery_percentage": 39.29999923706055, "mission_text": "\u6b63\u5728\u7b49\u5f85\u65b0\u4efb\u52a1...", "position": { "orientation": 178.09474182128906, "x": 4.808620929718018, "y": 18.436594009399414 }, "state_id": 3, "state_text": "Ready", "user_prompt": null}
[2020-09-24 09:43:40,282][9][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:43:40,403][9][MiR_API:748]INFO Return:{ "battery_percentage": 30.799999237060547, "mission_text": "\u6b63\u5728\u79fb\u52a8\u81f3 '4cshelf1'\uff08\u8ddd\u79bb\u76ee\u6807 37.299999999999997 \u7c73\uff09", "position": { "orientation": 116.2479476928711, "x": 75.81297302246094, "y": 66.11811828613281 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:43:40,489][9][MiR_API:726]INFO [GET]URL:http://10.85.199.84/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
[2020-09-24 09:43:40,520][9][MiR_API:748]INFO Return:{ "battery_percentage": 39.29999923706055, "mission_text": "{\"message\": \"Relative Move: Robot is moving %(distance).2f meters backward\", \"args\": {\"distance\":0.551329256792}}", "position": { "orientation": 178.33782958984375, "x": 5.240734577178955, "y": 18.4196834564209 }, "state_id": 5, "state_text": "Executing", "user_prompt": null}
[2020-09-24 09:43:46,050][9][MiR_API:726]INFO [GET]URL:http://10.85.199.82/api/v2.0.0/status?whitelist=state_id,state_text,battery_percentage,mission_text,position
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")]
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.exe.config
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.xml
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.FrmMain.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.Properties.Resources.resources
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.GenerateResource.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.CoreCompileInputs.cache
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\ClassFormParent.dll
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\ClassFormParent.pdb
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csprojAssemblyReference.cache
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.exe.config
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.exe
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.pdb
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\ClassFormParent.dll
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\bin\Debug\ClassFormParent.pdb
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.FrmMain.resources
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.Properties.Resources.resources
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.GenerateResource.cache
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.CoreCompileInputs.cache
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.CopyComplete
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.exe
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.pdb
D:\OneDrive\SMD\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csprojAssemblyReference.cache
D:\Neotel\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.exe.config
D:\Neotel\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.exe
D:\Neotel\AGVControl_Steel\AGVControl_Steel\bin\Debug\AGVControl_Steel.pdb
D:\Neotel\AGVControl_Steel\AGVControl_Steel\bin\Debug\ClassFormParent.dll
D:\Neotel\AGVControl_Steel\AGVControl_Steel\bin\Debug\ClassFormParent.pdb
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csprojAssemblyReference.cache
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.FrmMain.resources
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.Properties.Resources.resources
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.GenerateResource.cache
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.CoreCompileInputs.cache
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.csproj.CopyComplete
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.exe
D:\Neotel\AGVControl_Steel\AGVControl_Steel\obj\Debug\AGVControl_Steel.pdb
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="RestSharp" version="106.11.4" targetFramework="net461" />
</packages>
\ No newline at end of file
此文件类型无法预览
......@@ -10,8 +10,9 @@ namespace BLL
public class Control
{
private Timer timerCall;
private PointF[] position;
private DateTime[] timeout;
private PointF[] position;
private DateTime errorTime;
public delegate void AgvChangedEvent(int agvIndex);
public event AgvChangedEvent AgvChanged;
......@@ -20,13 +21,14 @@ namespace BLL
public Control()
{
ThreadPool.SetMaxThreads(5, 5); //线程池最大数量
position = new PointF[Common.agvInfos.Count];
for (int i = 0; i < position.Length; i++)
position[i] = new PointF();
}
public void Start()
{
position = new PointF[Common.agvInfos.Count];
for (int i = 0; i < position.Length; i++)
position[i] = new PointF();
timeout = new DateTime[Common.agvInfos.Count];
for (int i = 0; i < timeout.Length; i++)
timeout[i] = DateTime.Now;
......@@ -85,7 +87,7 @@ namespace BLL
private void GetAgvState(ref AgvInfo info)
{
if (!info.IsOnline) return;
bool rtn = Common.mir.Get_State(info.IP, info.Authorization, out int stateID, out string stateText, out int battery, out string missionText, out System.Drawing.PointF position);
bool rtn = Common.mir.Get_State(info.IP, info.Authorization, out int stateID, out string stateText, out int battery, out string missionText, out PointF pos);
//Common.log.Debug(string.Format("{1} GetAgvState[return={0}] stateID={2}, stateText={3}, battery={4}, missionText={5}, position={6}", rtn, info.FullName, stateID, stateText, battery, missionText, position));
if (rtn)
......@@ -94,7 +96,7 @@ namespace BLL
info.StateText = stateText;
info.Battery = battery;
info.MissionText = missionText;
info.Position = position;
info.Position = pos;
string ip = info.IP;
int idx = Common.agvInfos.FindIndex(s => s.IP == ip);
......@@ -136,48 +138,91 @@ namespace BLL
{
for (int i = 0; i < Common.agvInfos.Count; i++)
{
if (Common.agvInfos[i].CurrentJob == null)
AgvInfo agv = Common.agvInfos[i];
if (agv.CurrentJob == null)
{
timeout[i] = DateTime.Now;
continue;
}
agv.LogJson.OutputLog();
string name = "";
if (Common.agvInfos[i].Name.IndexOf("11") >= 0)
name = "11号车";
else if (Common.agvInfos[i].Name.IndexOf("13") >= 0)
name = "13号车";
if (int.TryParse(agv.Name.Substring(0, 2), out int result))
name = result + "号车";
//if (agv.Name.IndexOf("11") >= 0)
// name = "11号车";
//else if (agv.Name.IndexOf("13") >= 0)
// name = "13号车";
//else if (agv.Name.IndexOf("21") >= 0)
// name = "21号车";
if (Math.Abs(Common.agvInfos[i].Position.X - position[i].X) < 2 && Math.Abs(Common.agvInfos[i].Position.Y - position[i].Y) < 2)
if (!agv.IsOnline && agv.IsAuto) //自动+离线
{
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", "离线", 0);
//agv.LogJson.SetErrorInfo(agv.TaskName, "离线");
continue;
}
if (!agv.IsOnline && !agv.IsAuto) //手动+离线
{
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", "停用", 0);
//agv.LogJson.SetErrorInfo(agv.TaskName, "停用");
continue;
}
if (agv.IsOnline && !agv.IsAuto) //手动+在线
{
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", "正常", 1);
continue;
}
//自动在线,显示当前状态
if (Math.Abs(agv.Position.X - position[i].X) < 1 && Math.Abs(agv.Position.Y - position[i].Y) < 1)
{
TimeSpan span = DateTime.Now - timeout[i];
if (span.TotalMinutes >= Common.BoardTimeout)
int tt = Convert.ToInt32(span.TotalMinutes - Common.BoardTimeout);
if (tt > 0)
{
if (Common.agvInfos[i].CurrentJob is ChargeJob)
if (agv.CurrentJob is ChargeJob)
{
DisplayBoard.Add(name, "lineAgv." + name + ".Place", "AutoCharge", 1);
}
else if (Common.agvInfos[i].CurrentJob is StandbyJob)
else if (agv.CurrentJob is StandbyJob)
{
DisplayBoard.Add(name, "lineAgv." + name + ".Place", "Standby", 1);
}
else if (agv.CurrentJob is StorageJob && agv.CurrentJob.Msg.IndexOf("等待离开信号") > 0)
{
string value = string.Format("在仓储等待离开信号超时{0:F}分钟", tt);
DisplayBoard.Add(name, "lineAgv." + name + ".StandTimeOut", value, 0);
Common.log.Info(agv.Name + " 上传报告 " + value);
agv.LogJson.SetErrorStart(agv.TaskName, value);
}
else
{
string value = string.Format("在{0}停留超时{1:F}分钟", Common.agvInfos[i].Place, span.TotalMinutes);
string value = string.Format("在去{0}途中停留超时{1:F}分钟,{2}", agv.Place, tt, agv.MissionText);
DisplayBoard.Add(name, "lineAgv." + name + ".StandTimeOut", value, 0);
Common.log.Info(agv.Name + " 上传报告 " + value);
agv.LogJson.SetErrorStart(agv.TaskName, value);
}
}
else
{
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", Common.agvInfos[i].CurrentJob.Msg, 1);
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", agv.CurrentJob.Msg, 1);
}
}
else
{
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", Common.agvInfos[i].CurrentJob.Msg, 1);
DisplayBoard.Add(name, "lineAgv." + name + ".Msg", agv.CurrentJob.Msg, 1);
timeout[i] = DateTime.Now;
position[i] = new PointF(Common.agvInfos[i].Position.X, Common.agvInfos[i].Position.Y);
position[i] = new PointF(agv.Position.X, agv.Position.Y);
agv.LogJson.SetErrorOver();
}
}
DisplayBoard.UpdateAlarmMsg();
......
......@@ -34,6 +34,9 @@ namespace BLL
{
_info.From = "";
_info.Place = "";
_info.LogJson.SetMissionStart("充电任务", "充电桩");
_info.LogJson.SetMissionStep("开始执行任务", ChargeStep.None.ToString());
if (_info.IsWorkspace())
MoveWash();
else
......@@ -43,35 +46,47 @@ namespace BLL
{
move.Execute(_info);
if (move.IsEnd)
{
MoveWash();
_info.LogJson.SetMissionStep("已过门", ChargeStep.PassDoor.ToString());
}
}
else if (chargeStep.Equals(ChargeStep.WaitWashPoint))
{
move.Execute(_info);
if (move.IsEnd)
{
_info.LogJson.SetMissionStep("到达" + _info.Workshop + "清洗房", ChargeStep.WaitWashPoint.ToString());
MoveCharge();
}
}
else if (chargeStep.Equals(ChargeStep.MoveStation))
{
move.Execute(_info);
MoveStation();
}
else if (chargeStep.Equals(ChargeStep.Charging))
{
Common.log.Debug(_info.Name + " 当前电量" + _info.Battery);
//_info.LogJson.SetMissionStep("正在充电中", ChargeStep.Charging.ToString());
Common.log.Info(string.Format("充电中 当前{0} 最小{1} 最大{2}", _info.Battery, _info.BatteryMin, _info.BatteryMax));
move.Execute(_info);
if (_info.Battery == _info.BatteryMax)
{
chargeStep.Msg = _info.Name + " 电量达到" + _info.BatteryMax;
chargeStep.NextStep(ChargeStep.End);
_info.LogJson.SetMissionStep("结束充电", ChargeStep.Charging.ToString());
}
else if (_info.Battery > _info.BatteryMin)
{
IJob job = SteelManage.GetSteelJob(_info);
if (job != null)
{
_info.LogJson.SetMissionStep("结束充电", ChargeStep.Charging.ToString());
Common.mir.Del_Mission(_info.IP, _info.Authorization);
Common.log.Info("结束充电,接收到任务" + job.ToString());
return job;
}
}
......@@ -79,6 +94,8 @@ namespace BLL
else if (chargeStep.Equals(ChargeStep.End))
{
_info.Place = "充电结束";
//_info.LogJson.SetMissionStep("充电任务结束", ChargeStep.End.ToString());
Common.mir.Del_Mission(_info.IP, _info.Authorization);
chargeStep.Msg = _info.Name + " 充电工作结束,回待机位";
return new StandbyJob();
......@@ -123,12 +140,6 @@ namespace BLL
private void MoveStation()
{
//if (_info.Battery > currBattery)
//{
// chargeStep.Msg = _info.Name + " 到达充电位,准备充电";
// chargeStep.NextStep(ChargeStep.Charging);
//}
bool rtn = Common.mir.Get_Register(_info.IP, _info.Authorization, CHARGE_PLC, out int value);
if (rtn)
{
......@@ -137,6 +148,8 @@ namespace BLL
_info.Place = "充电中";
chargeStep.Msg = _info.Name + " 到达充电位,准备充电";
chargeStep.NextStep(ChargeStep.Charging);
_info.LogJson.SetMissionStep("到达充电位", ChargeStep.MoveStation.ToString());
}
}
}
......
......@@ -38,7 +38,10 @@ namespace BLL
else if (moveStep.Equals(MoveStep.Error))
Error();
else if (moveStep.Equals(MoveStep.End))
{
IsEnd = true;
//_info.LogJson.SetTaskOver();
}
return this;
}
......@@ -49,6 +52,8 @@ namespace BLL
private void Send()
{
//_info.LogJson.SetTaskStart(_mission);
bool rtn;
if (Common.FLEET_SEND)
rtn = Common.mir.Add_Mission_Fleet(_info.FleetID, _info.Authorization, _mission, out _id);
......@@ -56,6 +61,7 @@ namespace BLL
rtn = Common.mir.Add_Mission(_info.IP, _info.Authorization, _mission, out _id);
if (rtn)
{
_info.TaskName = _mission;
Common.log.Debug("MoveJob To:" + _info.Name + ", " + _mission + " 发送成功");
moveStep.NextStep(MoveStep.Working);
_getTime = DateTime.Now;
......@@ -68,9 +74,8 @@ namespace BLL
private void Working()
{
//TimeSpan span = DateTime.Now - _getTime;
//if (span.TotalMilliseconds > 5000)
//{
//_info.LogJson.SetTaskInfo(_info.MissionText);
bool rtn;
string state;
if (Common.FLEET_SEND)
......@@ -91,11 +96,12 @@ namespace BLL
{
Common.log.Warn("MoveJob To:" + _info.Name + ", " + _mission + " 获取状态失败");
}
//}
}
private void Error()
{
//_info.LogJson.SetTaskOver();
Common.log.Debug("MoveJob To:" + _info.Name + ", " + _mission + " 重新发送");
Common.mir.Clear_Error(_info.IP, _info.Authorization);
System.Threading.Thread.Sleep(100);
......
......@@ -33,6 +33,9 @@ namespace BLL
if (sendNewStep.Equals(SendNewStep.None))
{
_info.Place = "";
_info.LogJson.SetMissionStart("查找送新钢板任务", "产线");
_info.LogJson.SetMissionStep("开始执行任务", SendNewStep.None.ToString());
if (_info.IsWorkspace())
sendNewStep.NextStep(SendNewStep.FindLine);
else
......@@ -43,11 +46,13 @@ namespace BLL
move.Execute(_info);
if (move.IsEnd)
{
_info.LogJson.SetMissionStep("已过门", SendNewStep.PassDoor.ToString());
sendNewStep.NextStep(SendNewStep.FindLine);
}
}
else if (sendNewStep.Equals(SendNewStep.FindLine))
{
//_info.LogJson.SetMissionStep("查找任务", SendNewStep.FindLine.ToString());
bool rtn = SteelManage.FindNewSteelWork(_info, out string place);
if (rtn)
{
......@@ -112,13 +117,16 @@ namespace BLL
{
sendNewStep.Msg = _info.Name + " 已进入4C无尘室";
MoveLine(airPlace);
_info.LogJson.SetMissionStep("已进入无尘室", SendNewStep.EnterAirRoom.ToString());
}
}
else if (sendNewStep.Equals(SendNewStep.LeaveAirRoom))
{
move.Execute(_info);
if (move.IsEnd)
{
_info.LogJson.SetMissionStep("已离开无尘室", SendNewStep.LeaveAirRoom.ToString());
sendNewStep.Msg = _info.Name + " 已离开4C无尘室";
if (airPlace == "$WASH")
{
......@@ -137,30 +145,36 @@ namespace BLL
}
else if (sendNewStep.Equals(SendNewStep.MoveLine))
{
move.Execute(_info);
if (move.IsEnd)
{
SteelManage.NewSteelWorkDel(_info.From, _info.Place);
sendNewStep.Msg = _info.Name + " 到达 " + _info.Place;
sendNewStep.Msg = _info.Name + " 到达" + _info.Place;
sendNewStep.NextStep(SendNewStep.FindLine);
_info.LogJson.SetMissionStep("到达" + _info.Place, SendNewStep.MoveLine.ToString());
}
}
else if (sendNewStep.Equals(SendNewStep.GoWashPoint))
{
//_info.LogJson.SetMissionStep("去清洗房", SendNewStep.GoWashPoint.ToString());
MoveWash();
}
else if (sendNewStep.Equals(SendNewStep.WaitWashPoint))
{
move.Execute(_info);
if (move.IsEnd)
{
_info.Place = "";
sendNewStep.NextStep(SendNewStep.End);
sendNewStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗点";
sendNewStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗房";
_info.LogJson.SetMissionStep("到达清洗房", SendNewStep.WaitWashPoint.ToString());
}
}
else if (sendNewStep.Equals(SendNewStep.End))
{
//_info.LogJson.SetMissionStep("送新钢板任务结束", SendNewStep.End.ToString());
IJob job = SteelManage.GetSteelJob(info);
if (job == null)
return new StandbyJob();
......
......@@ -8,7 +8,6 @@ namespace BLL
private AgvInfo _info;
private MoveJob move;
private string mission;
//private DateTime _getTime;
private JobStep<StandbyStep> standbyStep;
public StandbyJob()
......@@ -34,16 +33,23 @@ namespace BLL
{
_info.From = "";
_info.Place = "";
_info.LogJson.SetMissionStart("回待机点任务", "待机位");
if (_info.IsWorkspace())
MoveStandby();
else
PassDoor();
_info.LogJson.SetMissionStep("开始执行任务", StandbyStep.None.ToString());
}
else if (standbyStep.Equals(StandbyStep.PassDoor))
{
move.Execute(_info);
if (move.IsEnd)
{
MoveStandby();
_info.LogJson.SetMissionStep("已过门", StandbyStep.PassDoor.ToString());
}
}
else if (standbyStep.Equals(StandbyStep.MoveStandby))
{
......@@ -53,10 +59,13 @@ namespace BLL
_info.Place = "待机位";
standbyStep.NextStep(StandbyStep.End);
standbyStep.Msg = _info.Name + " 到达待机位";
_info.LogJson.SetMissionStep("已到达待机位", StandbyStep.MoveStandby.ToString());
}
}
else if (standbyStep.Equals(StandbyStep.End))
{
//_info.LogJson.SetMissionStep("回待机点任务结束", StandbyStep.End.ToString());
if (_info.Battery <= _info.BatteryMin)
{
standbyStep.Msg = _info.Name + " 电量小于" + _info.BatteryMin + ",执行充电任务";
......@@ -64,17 +73,6 @@ namespace BLL
}
else
{
//if (_info.Battery <= 80)
//{
// standbyStep.Msg = _info.Name + " 电量小于80%,执行充电任务";
// return new ChargeJob();
//}
//else
//{
// IJob job = SteelManage.GetSteelJob(info);
// if (job != null) return job;
//}
IJob job = SteelManage.GetSteelJob(info);
if (job == null)
{
......
......@@ -35,6 +35,9 @@ namespace BLL
{
_info.From = "STORAGE";
_info.Place = "";
_info.LogJson.SetMissionStart("去仓库任务", "仓库");
_info.LogJson.SetMissionStep("开始执行任务", StorageStep.None.ToString());
dockTime = 0;
if (_info.Is4DWorkshop())
MoveStorage();
......@@ -45,7 +48,10 @@ namespace BLL
{
move.Execute(_info);
if (move.IsEnd)
{
MoveStorage();
_info.LogJson.SetMissionStep("已过门", StorageStep.PassDoor.ToString());
}
}
else if (storageStep.Equals(StorageStep.MoveStorage))
{
......@@ -56,10 +62,13 @@ namespace BLL
_info.Place = "到达仓库";
storageStep.Msg = info.Name + " 已到位,等待对接信号";
storageStep.NextStep(StorageStep.GetSingle);
_info.LogJson.SetMissionStep("到达仓库", StorageStep.MoveStorage.ToString());
}
}
else if (storageStep.Equals(StorageStep.GetSingle))
{
//_info.LogJson.SetMissionStep("等待离开信号", StorageStep.GetSingle.ToString());
if (Common.StorageDockAlway || Common.StorageDockFinish)
{
SteelManage.StorageWorkDel(_info.Workshop + "_ENTER");
......@@ -76,7 +85,7 @@ namespace BLL
storageStep.Msg = info.Name + " 对接仓库连续3次信号没有到位";
storageStep.NextStep(StorageStep.Error);
dockTime = 0;
//小车报警任务
_info.LogJson.SetMissionStep("对接仓库连续3次信号没有到位", StorageStep.GetSingle.ToString());
}
else
{
......@@ -90,25 +99,36 @@ namespace BLL
}
else if (storageStep.Equals(StorageStep.WaitStorageLeave))
{
if (SteelManage.FindStorageWorkLeave())
{
SteelManage.StorageWorkDelLeave();
storageStep.Msg = info.Name + " 收到离开信号";
_info.LogJson.SetMissionStep("收到离开信号", StorageStep.WaitStorageLeave.ToString());
if (_info.IsWorkspace())
storageStep.NextStep(StorageStep.FindJob);
else
PassDoor4C();
}
else
{
}
}
else if (storageStep.Equals(StorageStep.BackDoor))
{
move.Execute(_info);
if (move.IsEnd)
{
storageStep.NextStep(StorageStep.FindJob);
_info.LogJson.SetMissionStep("已过门", StorageStep.BackDoor.ToString());
}
}
else if (storageStep.Equals(StorageStep.Error))
{
//_info.LogJson.SetMissionStep("信号没有到位", StorageStep.Error.ToString());
if (SteelManage.FindStorageWorkLeave())
{
SteelManage.StorageWorkDelLeave();
......@@ -122,6 +142,7 @@ namespace BLL
}
else if (storageStep.Equals(StorageStep.FindJob))
{
//_info.LogJson.SetMissionStep("查找任务", StorageStep.FindJob.ToString());
IJob job = SteelManage.GetNewSteelJob(info);
if (job == null)
{
......@@ -137,6 +158,8 @@ namespace BLL
}
else if(storageStep.Equals(StorageStep.GoWashPoint))
{
//_info.LogJson.SetMissionStep("去清洗房", StorageStep.GoWashPoint.ToString());
mission = Common.MISSION_MOVE_WASH + _info.Workshop;
_info.Place = string.Format("去{0}清洗点", _info.Workshop);
move = new MoveJob(mission);
......@@ -151,13 +174,14 @@ namespace BLL
{
_info.Place = "";
storageStep.NextStep(StorageStep.End);
storageStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗点";
storageStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗房";
_info.LogJson.SetMissionStep("到达清洗房", StorageStep.WaitWashPoint.ToString());
}
}
else if (storageStep.Equals(StorageStep.End))
{
//_info.LogJson.SetMissionStep("去仓库任务结束", StorageStep.End.ToString());
return new StandbyJob();
}
return this;
......
......@@ -36,11 +36,16 @@ namespace BLL
_info.From = "";
_info.Place = "";
_info.OldSteel = 0;
_info.LogJson.SetMissionStart("查找回收钢板任务", "产线");
_info.LogJson.SetMissionStep("开始执行任务", TakeOldStep.None.ToString());
takeOldStep.Msg = _info.Name + " 查找回收钢板任务";
takeOldStep.NextStep(TakeOldStep.FindLine);
}
else if (takeOldStep.Equals(TakeOldStep.FindLine))
{
//_info.LogJson.SetMissionStep("判断钢板数量", TakeOldStep.FindLine.ToString());
if (_info.OldSteel == 5)
{
takeOldStep.Msg = _info.Name + " 回收钢板已满";
......@@ -61,18 +66,22 @@ namespace BLL
}
else if (takeOldStep.Equals(TakeOldStep.EnterAirRoom))
{
move.Execute(_info);
if (move.IsEnd)
{
_info.LogJson.SetMissionStep("已进入无尘室", TakeOldStep.EnterAirRoom.ToString());
takeOldStep.Msg = _info.Name + " 已进入4C无尘室";
MoveLine(airPlace);
}
}
else if (takeOldStep.Equals(TakeOldStep.LeaveAirRoom))
{
move.Execute(_info);
if (move.IsEnd)
{
_info.LogJson.SetMissionStep("已离开无尘室", TakeOldStep.LeaveAirRoom.ToString());
takeOldStep.Msg = _info.Name + " 已离开4C无尘室";
if (airPlace == "$WASH")
MoveWash();
......@@ -89,10 +98,12 @@ namespace BLL
SteelManage.OldSteelWorkDel(_info.Place);
takeOldStep.NextStep(TakeOldStep.FindLine);
takeOldStep.Msg = _info.Name + " 到达" + _info.Place;
_info.LogJson.SetMissionStep("到达" + _info.Place, TakeOldStep.MoveLine.ToString());
}
}
else if (takeOldStep.Equals(TakeOldStep.GoWashPoint))
{
//_info.LogJson.SetMissionStep("判断回收钢板数量", TakeOldStep.GoWashPoint.ToString());
if (_info.OldSteel == 0)
{
takeOldStep.NextStep(TakeOldStep.End);
......@@ -100,14 +111,6 @@ namespace BLL
}
else
{
//if (_info.In4CAirRoom())
//{
// takeOldStep.Msg = _info.Name + " 先暂停" + place;
// LeaveAirAccess();
//}
//else
// MoveLine(place);
MoveWash();
}
}
......@@ -117,12 +120,15 @@ namespace BLL
if (move.IsEnd)
{
takeOldStep.NextStep(TakeOldStep.End);
takeOldStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗点";
takeOldStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗房";
_info.LogJson.SetMissionStep("到达" + _info.Workshop + "清洗房", TakeOldStep.WaitWashPoint.ToString());
}
}
else if (takeOldStep.Equals(TakeOldStep.End))
{
//_info.LogJson.SetMissionStep("回收钢板任务结束", TakeOldStep.End.ToString());
_info.OldSteel = 0;
IJob job = SteelManage.GetSteelJob(_info);
if (job == null)
return new StandbyJob();
......@@ -139,6 +145,7 @@ namespace BLL
if (rtn)
{
airPlace = place;
if (SteelManage.IsAirLines(place))
{
if (_info.In4CAirRoom())
......
......@@ -33,6 +33,9 @@ namespace BLL
{
_info.From = "";
_info.Place = "";
_info.LogJson.SetMissionStart("去清洗房任务", "清洗房");
_info.LogJson.SetMissionStep("开始执行任务", WashPointStep.None.ToString());
SteelManage.NewSteelWorkDelAll(_info.Workshop);
if (_info.IsWorkspace())
MoveWash();
......@@ -43,21 +46,29 @@ namespace BLL
{
move.Execute(_info);
if (move.IsEnd)
{
MoveWash();
_info.LogJson.SetMissionStep("已过门", WashPointStep.PassDoor.ToString());
}
}
else if (washPointStep.Equals(WashPointStep.MoveWash))
{
move.Execute(_info);
if (move.IsEnd)
{
SteelManage.NewSteelWorkDel(_info.From, _info.From);
washPointStep.NextStep(WashPointStep.End);
washPointStep.Msg = _info.Name + " 到达清洗点";
washPointStep.Msg = _info.Name + " 到达清洗房";
_info.LogJson.SetMissionStep("已到达清洗房", WashPointStep.MoveWash.ToString());
}
}
else if (washPointStep.Equals(WashPointStep.End))
{
_info.Place = "";
//_info.LogJson.SetMissionStep("到达清洗房", WashPointStep.End.ToString());
IJob job = SteelManage.GetNewSteelJob(info);
if (job == null)
{
......
......@@ -27,11 +27,11 @@ namespace BLL
notifyMenu = new ContextMenuStrip();
items = new ToolStripItem[4];
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetEntryAssembly();
string text = assembly.GetName().Version.ToString();
text = frm.Text + (frm.Text.Contains(text) ? "" : " " + text);
//System.Reflection.Assembly assembly = System.Reflection.Assembly.GetEntryAssembly();
//string text = assembly.GetName().Version.ToString();
//text = frm.Text + text;
items[0] = new ToolStripMenuItem(text) { Font = new Font("微软雅黑", 11f, FontStyle.Bold), Image = frm.Icon.ToBitmap() };
items[0] = new ToolStripMenuItem(frm.Text) { Font = new Font("微软雅黑", 11f, FontStyle.Bold), Image = frm.Icon.ToBitmap() };
items[1] = new ToolStripSeparator();
items[2] = new ToolStripMenuItem("显示") { Font = new Font("微软雅黑", 11f) };
items[3] = new ToolStripMenuItem("退出") { Font = new Font("微软雅黑", 11f) };
......
......@@ -16,7 +16,7 @@ namespace BLL
WebWork service = new WebWork();
_serviceHost = new WebServiceHost(service, new Uri(url));
_serviceHost.Open();
Model.Common.log.Info("Web服务已开启");
Model.Common.log.Info("Web服务已开启,URL=" + url);
IsOpen = true;
}
catch (Exception ex)
......
......@@ -2,13 +2,18 @@
<configuration>
<log4net>
<logger name="AGVControl_Steel">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="AGVControl_Steel"/>
</logger>
<logger name="MiR_API">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="api"/>
</logger>
<logger name="RunLog">
<level value="Info"/>
<appender-ref ref="RunLog"/>
</logger>
<appender name="AGVControl_Steel" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\AGVControl_Steel.log" />
<param name="Encoding" value="UTF-8"/>
......@@ -33,5 +38,18 @@
<param name="ConversionPattern" value="[%d][%t][%c:%L]%-5p %m%n" />
</layout>
</appender>
<appender name="RunLog" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\RunLog.json" />
<param name="Encoding" value="UTF-8"/>
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM-dd" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
</log4net>
</configuration>
\ No newline at end of file
......@@ -3,3 +3,8 @@ D:\Neotel_Beta\AGVControl_Steel\DAL\bin\Debug\DAL.pdb
D:\Neotel_Beta\AGVControl_Steel\DAL\obj\Debug\DAL.csproj.CoreCompileInputs.cache
D:\Neotel_Beta\AGVControl_Steel\DAL\obj\Debug\DAL.dll
D:\Neotel_Beta\AGVControl_Steel\DAL\obj\Debug\DAL.pdb
C:\Neotel\Program\AGVControl_Steel\DAL\bin\Debug\DAL.dll
C:\Neotel\Program\AGVControl_Steel\DAL\bin\Debug\DAL.pdb
C:\Neotel\Program\AGVControl_Steel\DAL\obj\Debug\DAL.csproj.CoreCompileInputs.cache
C:\Neotel\Program\AGVControl_Steel\DAL\obj\Debug\DAL.dll
C:\Neotel\Program\AGVControl_Steel\DAL\obj\Debug\DAL.pdb
......@@ -81,7 +81,9 @@ namespace Model
public int NewSteel { set; get; } = 0;
public string TaskName { set; get; } = "";
public LogJson LogJson { set; get; }
......@@ -95,6 +97,17 @@ namespace Model
IP = ip;
Workshop = workshop;
Authorization = authorization;
if (int.TryParse(name.Substring(0, 2), out int result))
LogJson = new LogJson(result + "号车", "RunLog");
//if (name.IndexOf("11") >= 0)
// LogJson = new LogJson("11号车", "RunLog");
//else if (name.IndexOf("13") >= 0)
// LogJson = new LogJson("13号车", "RunLog");
//else if (name.IndexOf("21") >= 0)
// LogJson = new LogJson("21号车", "RunLog");
}
public string[] ToGridRow()
......@@ -115,18 +128,23 @@ namespace Model
/// <returns></returns>
public bool IsWorkspace()
{
//3楼
if (Workshop.ToUpper().IndexOf("3S") > -1)
return true;
//4楼
if (Position.Y < 55)
{
if (Workshop.IndexOf('D') > 0)
if (Workshop.ToUpper().IndexOf("4D") > -1)
return true;
else if (Workshop.IndexOf('C') > 0)
else if (Workshop.ToUpper().IndexOf("4C") > -1)
return false;
}
else if (Position.Y > 62)
{
if (Workshop.IndexOf('D') > 0)
if (Workshop.ToUpper().IndexOf("4D") > -1)
return false;
else if (Workshop.IndexOf('C') > 0)
else if (Workshop.ToUpper().IndexOf("4C") > -1)
return true;
}
......
......@@ -8,11 +8,13 @@ namespace Model
{
public static class DisplayBoard
{
private static List<AlarmMsg> msgList = new List<AlarmMsg>();
private static List<AlarmMsg> msgList = new();
public static void Add(string name, string key, string value, int type = 0)
{
msgList.Add(new AlarmMsg(name, key, value, type));
Common.log.Debug(string.Format("{0}添加监控面板,{1}", name, value));
}
public static string UpdateAlarmMsg()
......@@ -25,6 +27,8 @@ namespace Model
private static string UpdateDeviceAlarmMsg()
{
string msg = "OK";
......
......@@ -8,6 +8,8 @@ namespace Model
public string Msg { get; }
//public DateTime StartTime { get; }
public IJob Execute(AgvInfo info);
}
......
......@@ -48,4 +48,21 @@ namespace Model
}
}
//public class LogRun
//{
// private readonly log4net.ILog LOG;
// public LogRun(string name)
// {
// LOG = log4net.LogManager.GetLogger(name);
// }
// public void Info(string s)
// {
// LOG.Info(s);
// }
//}
}
using System;
using System.Collections.Generic;
namespace Model
{
/*
public class LogJson
{
private bool update;
private readonly log4net.ILog LOG;
/// <summary>
/// 小车名称
/// </summary>
public string AGVNum { private set; get; }
/// <summary>
/// 当前时间
/// </summary>
public DateTime? DateTime { private set; get; }
/// <summary>
/// 小车任务名称
/// </summary>
public string TaskName { private set; get; }
/// <summary>
/// 小车任务开始时间
/// </summary>
public DateTime? TaskStartTime { private set; get; }
/// <summary>
/// 小车任务结束时间
/// </summary>
public DateTime? TaskEndTime { private set; get; }
/// <summary>
/// 小车任务持续时间
/// </summary>
public int TaskTotalTime { private set; get; }
/// <summary>
/// 小车任务信息
/// </summary>
public string TaskInfo { private set; get; }
/// <summary>
/// 软件任务名称
/// </summary>
public string MissionName { private set; get; }
/// <summary>
/// 软件任务开始时间
/// </summary>
public DateTime? MissionStartTime { private set; get; }
/// <summary>
/// 软件任务结束时间
/// </summary>
public DateTime? MissionEndTime { private set; get; }
/// <summary>
/// 任务持续时间
/// </summary>
public int MissionTotalTime { private set; get; }
/// <summary>
/// 软件任务目的地
/// </summary>
public string MissionTarget { private set; get; }
/// <summary>
/// 软件任务信息
/// </summary>
public string MissionInfo { private set; get; }
/// <summary>
/// 软件任务步骤
/// </summary>
public string MissionStep { private set; get; }
/// <summary>
/// 错误信息
/// </summary>
public string ErrorMessage { private set; get; }
/// <summary>
/// 错误开始时间
/// </summary>
public DateTime? ErrorStartTime { private set; get; }
/// <summary>
/// 错误结束时间
/// </summary>
public DateTime? ErrorEndTime { private set; get; }
/// <summary>
/// 错误持续时间
/// </summary>
public int ErrorTotalTime { private set; get; }
public LogJson(string agvName, string logName)
{
LOG = log4net.LogManager.GetLogger(logName);
System.Reflection.PropertyInfo[] info = GetType().GetProperties();
for (int i = 0; i < info.Length; i++)
{
if (info[i].PropertyType == typeof(string))
info[i].SetValue(this, "");
else if (info[i].PropertyType == typeof(DateTime?))
info[i].SetValue(this, null);
else if (info[i].PropertyType == typeof(int))
info[i].SetValue(this, 0);
}
AGVNum = agvName;
update = true;
}
public void OutputLog()
{
if (!update) return;
DateTime = System.DateTime.Now;
System.Reflection.PropertyInfo[] info = GetType().GetProperties();
string[] lines = new string[info.Length];
for (int i = 0; i < info.Length; i++)
{
string value;
if (info[i].PropertyType == typeof(DateTime?))
value = info[i].GetValue(this) == null ? "" : string.Format("{0:yyyy-MM-dd HH:mm:ss}", info[i].GetValue(this));
else
value = info[i].GetValue(this).ToString();
lines[i] = string.Format("\"{0}\":\"{1}\"", info[i].Name, value);
}
update = false;
LOG.Info("{" + string.Join(",", lines) + "}");
}
public void SetTaskStart(string name)
{
TaskName = name;
TaskStartTime = System.DateTime.Now;
TaskEndTime = null;
TaskTotalTime = 0;
TaskInfo = "";
ErrorMessage = "";
ErrorStartTime = null;
ErrorEndTime = null;
ErrorTotalTime = 0;
update = true;
}
public void SetTaskInfo(string s)
{
if (TaskInfo == s) return;
TaskInfo = s;
TaskEndTime = System.DateTime.Now;
TaskTotalTime = (TaskEndTime - TaskStartTime).Value.Minutes;
update = true;
}
public void SetTaskOver()
{
TaskInfo = "END";
TaskEndTime = System.DateTime.Now;
TaskTotalTime = (TaskEndTime - TaskStartTime).Value.Minutes;
update = true;
}
public void SetMissionStart(string name, string target)
{
MissionName = name;
MissionStartTime = System.DateTime.Now;
MissionEndTime = null;
MissionTotalTime = 0;
MissionTarget = target;
MissionInfo = "";
MissionStep = "";
ErrorMessage = "";
ErrorStartTime = null;
ErrorEndTime = null;
ErrorTotalTime = 0;
update = true;
}
public void SetMissionInfo(string s)
{
if (MissionInfo == s) return;
MissionInfo = s;
MissionEndTime = System.DateTime.Now;
MissionTotalTime = (MissionEndTime - MissionStartTime).Value.Minutes;
update = true;
}
public void SetMissionStep(string s)
{
if (MissionStep == s) return;
MissionStep = s;
MissionEndTime = System.DateTime.Now;
MissionTotalTime = (MissionEndTime - MissionStartTime).Value.Minutes;
update = true;
}
public void SetMissionOver()
{
MissionInfo = "END";
MissionStep = "";
MissionEndTime = System.DateTime.Now;
MissionTotalTime = (MissionEndTime - MissionStartTime).Value.Minutes;
update = true;
}
public void SetErrorStart(string s)
{
ErrorMessage = s;
ErrorStartTime = System.DateTime.Now;
ErrorEndTime = null;
ErrorTotalTime = 0;
update = true;
}
public void SetErrorOver()
{
ErrorMessage = "END";
ErrorEndTime = System.DateTime.Now;
ErrorTotalTime = (ErrorEndTime - ErrorStartTime).Value.Minutes;
update = true;
}
}
*/
public class LogJson
{
private bool updateOutputLog;
private bool updateError;
private DateTime stepTime;
private DateTime errorTime;
private readonly log4net.ILog LOG;
/// <summary>
/// 小车名称
/// </summary>
public string AGVNum { private set; get; }
/// <summary>
/// 任务开始时间
/// </summary>
public DateTime DateTime { private set; get; }
/// <summary>
/// step结束时间
/// </summary>
public DateTime EndDateTime { private set; get; }
/// <summary>
/// 软件任务名称
/// </summary>
public string TaskName { private set; get; }
/// <summary>
/// 任务信息
/// </summary>
public string MissionInfo { private set; get; }
/// <summary>
/// 软件任务目的地
/// </summary>
public string TargetPlace { private set; get; }
/// <summary>
/// 类型
/// </summary>
public string Type { private set; get; }
/// <summary>
/// step步骤(Type = Task)
/// </summary>
public string TaskStep { private set; get; }
/// <summary>
/// step运行时间(Type = Task)
/// </summary>
public int TaskRunTime { private set; get; }
/// <summary>
/// 错误信息(Type = Error)
/// </summary>
public string ErrorMsg { private set; get; }
/// <summary>
/// 错误持续时间(Type = Error)
/// </summary>
public int ErrorLastTime { private set; get; }
/// <summary>
/// 任务名称(Type = Error)
/// </summary>
public string AGVMissionName { private set; get; }
public LogJson(string agvName, string logName)
{
LOG = log4net.LogManager.GetLogger(logName);
System.Reflection.PropertyInfo[] info = GetType().GetProperties();
for (int i = 0; i < info.Length; i++)
{
if (info[i].PropertyType == typeof(string))
info[i].SetValue(this, "");
else if (info[i].PropertyType == typeof(DateTime?))
info[i].SetValue(this, null);
else if (info[i].PropertyType == typeof(int))
info[i].SetValue(this, 0);
}
AGVNum = agvName;
updateOutputLog = true;
}
public void OutputLog()
{
if (!updateOutputLog) return;
List<string> lines = new();
lines.Add(string.Format("\"AGVNum\":\"{0}\"", AGVNum));
lines.Add(DateTime == null ? "\"DateTime\":\"\"" : string.Format("\"DateTime\":\"{0:yyyy-MM-dd HH:mm:ss}\"", DateTime));
lines.Add(EndDateTime == null ? "\"EndDateTime\":\"\"" : string.Format("\"EndDateTime\":\"{0:yyyy-MM-dd HH:mm:ss}\"", EndDateTime));
lines.Add(string.Format("\"TaskName\":\"{0}\"", TaskName));
lines.Add(string.Format("\"MissionInfo\":\"{0}\"", MissionInfo));
lines.Add(string.Format("\"TargetPlace\":\"{0}\"", TargetPlace));
lines.Add(string.Format("\"Type\":\"{0}\"", Type));
if (Type == "Task")
{
lines.Add(string.Format("\"TaskStep\":\"{0}\"", TaskStep));
lines.Add(string.Format("\"TaskRunTime\":\"{0}\"", TaskRunTime));
}
if (Type == "Error")
{
lines.Add(string.Format("\"ErrorMsg\":\"{0}\"", ErrorMsg));
lines.Add(string.Format("\"ErrorLastTime\":\"{0}\"", ErrorLastTime));
lines.Add(string.Format("\"AGVMissionName\":\"{0}\"", AGVMissionName));
}
updateOutputLog = false;
LOG.Info("{" + string.Join(",", lines) + "}");
}
public void SetMissionStart(string name, string target)
{
DateTime = DateTime.Now;
TaskName = name;
MissionInfo = "";
TargetPlace = target;
Type = "Task";
TaskStep = "";
TaskRunTime = 0;
ErrorMsg = "";
ErrorLastTime = 0;
AGVMissionName = "";
stepTime = DateTime.Now;
//updateOutputLog = true;
}
public void SetMissionStep(string info, string step)
{
if (TaskStep == step) return;
MissionInfo = info;
TaskStep = step;
EndDateTime = DateTime.Now;
TaskRunTime = (EndDateTime - stepTime).Minutes;
stepTime = DateTime.Now;
updateOutputLog = true;
}
public void SetErrorStart(string name, string err)
{
ErrorMsg = err;
if (AGVMissionName == name) return;
AGVMissionName = name;
errorTime = DateTime.Now;
ErrorLastTime = 0;
updateError = true;
}
public void SetErrorOver()
{
if (!updateError) return;
Type = "Error";
EndDateTime = DateTime.Now;
ErrorLastTime = (EndDateTime - errorTime).Minutes;
updateError = false;
updateOutputLog = true;
OutputLog();
Type = "Task";
ErrorMsg = "";
ErrorLastTime = 0;
AGVMissionName = "";
}
}
}
......@@ -781,7 +781,7 @@ namespace Model
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
LOG.Info("Return:" + UnicodeToString(s));
return s;
}
......@@ -809,7 +809,7 @@ namespace Model
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
LOG.Info("Return:" + UnicodeToString(s));
return s;
}
......@@ -837,7 +837,7 @@ namespace Model
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
LOG.Info("Return:" + UnicodeToString(s));
return s;
}
......@@ -865,8 +865,32 @@ namespace Model
while (s.IndexOf(" ") >= 0)
s = s.Replace(" ", " ");
}
LOG.Info("Return:" + s);
LOG.Info("Return:" + UnicodeToString(s));
}
private static string UnicodeToString(string s)
{
string b = "";
int startIndex = 0;
int idx;
do
{
if (startIndex >= s.Length) break;
idx = s.IndexOf("\\u", startIndex);
if (idx > -1)
{
string tt = s.Substring(idx + 2, 4);
b += s.Substring(startIndex, idx - startIndex);
if (short.TryParse(tt, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out short c))
b += (char)c;
startIndex = 6 + idx;
}
}
while (idx > -1);
b += s.Substring(startIndex);
return b;
}
}
}
......@@ -56,6 +56,7 @@
</ItemGroup>
<ItemGroup>
<Compile Include="AgvInfo.cs" />
<Compile Include="LogJson.cs" />
<Compile Include="Common.cs" />
<Compile Include="DisplayBoard.cs" />
<Compile Include="IJob.cs" />
......@@ -63,6 +64,7 @@
<Compile Include="MiR_API.cs" />
<Compile Include="MiR_API_Test.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RunInfo.cs" />
<Compile Include="SteelWork.cs" />
<Compile Include="WorkshopLine.cs" />
</ItemGroup>
......
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//namespace Model
//{
// public class LogJson
// {
// private readonly string timeFormat = "yyyy-MM-dd HH:mm:ss";
// /// <summary>
// /// 小车名称
// /// </summary>
// public string AGVNum { set; get; } = "";
// /// <summary>
// /// 当前时间
// /// </summary>
// public string DateTime { set; get; } = "";
// /// <summary>
// /// 小车任务名称
// /// </summary>
// public string TaskName { set; get; } = "MoveSteelC1";
// /// <summary>
// /// 小车任务开始时间
// /// </summary>
// public string TaskStartTime { set; get; } = "2020-05-06 12:00:00";
// /// <summary>
// /// 小车任务结束时间
// /// </summary>
// public string TaskEndTime { set; get; } = "2020-05-06 12:20:00";
// /// <summary>
// /// 小车任务信息
// /// </summary>
// public string TaskInfo { set; get; } = "agv任务的当前信息";
// /// <summary>
// /// 软件任务名称
// /// </summary>
// public string MissionName { set; get; } = "到D1送钢板任务";
// /// <summary>
// /// 软件任务开始时间
// /// </summary>
// public string MissionStartTime { set; get; } = "";
// /// <summary>
// /// 软件任务结束时间
// /// </summary>
// public string MissionEndTime { set; get; } = "2020-05-06 12:30:00";
// /// <summary>
// /// 任务持续时间
// /// </summary>
// public string MissionTotalTime { set; get; } = "20";
// /// <summary>
// /// 软件任务信息
// /// </summary>
// public string MissionInfo { set; get; } = "在去D1的途中";
// /// <summary>
// /// 软件任务目的地
// /// </summary>
// public string MissionTarget { set; get; } = "D1";
// /// <summary>
// /// 软件任务步骤
// /// </summary>
// public string MissionStep { set; get; } = "步骤";
// /// <summary>
// /// 错误信息
// /// </summary>
// public string ErrorMessage { set; get; } = "";
// /// <summary>
// /// 错误开始时间
// /// </summary>
// public string ErrorStartTime { set; get; } = "2020-05-06 12:00:00";
// /// <summary>
// /// 错误结束时间
// /// </summary>
// public string ErrorEndTime { set; get; } = "2020-05-06 12:20:00";
// /// <summary>
// /// 错误持续时间
// /// </summary>
// public string ErrorTotalTime { set; get; } = "20";
// public LogJson()
// {
// }
// public void SetDateTime()
// {
// DateTime = string.Format("{0:"+ timeFormat + "}", System.DateTime.Now);
// MissionStartTime = DateTime;
// }
// public void SetTaskEndTime()
// {
// }
// }
// public class RunInfo
// {
// /// <summary>
// /// AGV小车名称
// /// </summary>
// public string AGVNum { get; set; } = "";
// /// <summary>
// /// 小车任务名称
// /// </summary>
// public string AGVMissionName { get; set; } = "";
// /// <summary>
// /// 当前时间
// /// </summary>
// public string DateTime { get; set; } = "";
// /// <summary>
// /// 错误信息
// /// </summary>
// public string ErrorMsg { set; get; } = "";
// /// <summary>
// /// 错误持续时间
// /// </summary>
// public string ErrorLastTime { set; get; } = "";
// /// <summary>
// /// 任务结束时间
// /// </summary>
// public string EndDateTime { set; get; } = "";
// /// <summary>
// /// 任务信息
// /// </summary>
// public string MissionInfo { get; set; } = "";
// /// <summary>
// /// 任务名称
// /// </summary>
// public string TaskName { set; get; } = "";
// /// <summary>
// /// 任务运行时间
// /// </summary>
// public string TaskRunTime { set; get; } = "";
// /// <summary>
// /// 任务步骤
// /// </summary>
// public string TaskStep { set; get; } = "";
// /// <summary>
// /// 目标地点
// /// </summary>
// public string TargetPlace { set; get; } = "";
// /// <summary>
// /// 类型
// /// </summary>
// public string Type { set; get; } = "";
// public RunInfo()
// {
// DateTime = string.Format("{0:yyyy-MM-dd HH:mm:ss}", System.DateTime.Now);
// }
// public override string ToString()
// {
// System.Reflection.PropertyInfo[] infos = GetType().GetProperties();
// string[] lines = new string[infos.Length];
// for (int i = 0; i < infos.Length; i++)
// lines[i] = string.Format("\"{0}\":\"{1}\"", infos[i].Name, infos[i].GetValue(this).ToString());
// return "{" + string.Join(",", lines) + "}";
// }
// }
//}
......@@ -2,13 +2,18 @@
<configuration>
<log4net>
<logger name="AGVControl_Steel">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="AGVControl_Steel"/>
</logger>
<logger name="MiR_API">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="api"/>
</logger>
<logger name="RunLog">
<level value="Info"/>
<appender-ref ref="RunLog"/>
</logger>
<appender name="AGVControl_Steel" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\AGVControl_Steel.log" />
<param name="Encoding" value="UTF-8"/>
......@@ -33,5 +38,18 @@
<param name="ConversionPattern" value="[%d][%t][%c:%L]%-5p %m%n" />
</layout>
</appender>
<appender name="RunLog" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\RunLog.json" />
<param name="Encoding" value="UTF-8"/>
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM-dd" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
</log4net>
</configuration>
\ No newline at end of file
......@@ -2,13 +2,18 @@
<configuration>
<log4net>
<logger name="AGVControl_Steel">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="AGVControl_Steel"/>
</logger>
<logger name="MiR_API">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="api"/>
</logger>
<logger name="RunLog">
<level value="Info"/>
<appender-ref ref="RunLog"/>
</logger>
<appender name="AGVControl_Steel" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\AGVControl_Steel.log" />
<param name="Encoding" value="UTF-8"/>
......@@ -33,5 +38,18 @@
<param name="ConversionPattern" value="[%d][%t][%c:%L]%-5p %m%n" />
</layout>
</appender>
<appender name="RunLog" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\RunLog.json" />
<param name="Encoding" value="UTF-8"/>
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM-dd" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
</log4net>
</configuration>
\ No newline at end of file
39cd401be94be237b207dee168b5365597548902
e8123f5ce9a38ac9c31fd1f40d7ef073e255e9b1
......@@ -33,4 +33,3 @@ C:\Neotel\Program\AGVControl_Steel\Model\obj\Debug\Model.csproj.CoreCompileInput
C:\Neotel\Program\AGVControl_Steel\Model\obj\Debug\Model.csproj.CopyComplete
C:\Neotel\Program\AGVControl_Steel\Model\obj\Debug\Model.dll
C:\Neotel\Program\AGVControl_Steel\Model\obj\Debug\Model.pdb
C:\Neotel\Program\AGVControl_Steel\Model\obj\Debug\Model.csprojAssemblyReference.cache
620dd80cfa29cf5741e7f5df5db501128828f411
44b04f3188fce75f2babf71fd3ba8b3c9b753caf
......@@ -10,3 +10,16 @@ D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\Test\obj\Debug
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\Test\obj\Debug\Test.csproj.CopyComplete
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\Test\obj\Debug\Test.exe
D:\OneDrive - 上海挚锦科技有限公司\SMD\AGVControl_Steel\Test\obj\Debug\Test.pdb
C:\Neotel\Program\AGVControl_Steel\Test\bin\Debug\Test.exe.config
C:\Neotel\Program\AGVControl_Steel\Test\bin\Debug\Test.exe
C:\Neotel\Program\AGVControl_Steel\Test\bin\Debug\Test.pdb
C:\Neotel\Program\AGVControl_Steel\Test\bin\Debug\RestSharp.dll
C:\Neotel\Program\AGVControl_Steel\Test\bin\Debug\RestSharp.xml
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.csprojAssemblyReference.cache
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.Form1.resources
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.Properties.Resources.resources
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.csproj.GenerateResource.cache
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.csproj.CoreCompileInputs.cache
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.csproj.CopyComplete
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.exe
C:\Neotel\Program\AGVControl_Steel\Test\obj\Debug\Test.pdb
......@@ -3,11 +3,13 @@
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<!--4楼-->
<!--
<appSettings>
<add key="FLEET_IP" value="10.85.199.3"/>
<add key="FLEET_Send" value="true"/>
<add key="WebService" value="http://10.85.196.40:8089/"/>
<!--<add key="WebService" value="http://127.0.0.1:8089/"/>-->
<add key="Board" value="http://10.85.199.25/myproject/rest/api/qisda/device/updateDeviceAlarmMsg"/>
<add key="BoardTimeout" value="3"/>
<add key="AGV_BATTERY_MAX" value="100"/>
......@@ -18,4 +20,21 @@
<add key="11号_4C" value="false"/>
<add key="13号_4D" value="false"/>
</appSettings>
-->
<!--3楼-->
<appSettings>
<add key="FLEET_IP" value="10.85.199.140"/>
<add key="FLEET_Send" value="true"/>
<add key="WebService" value="http://127.0.0.1:8090/"/>
<!--<add key="WebService" value="http://10.85.196.40:8090/"/>-->
<add key="Board" value="http://10.85.162.124/myproject/rest/api/qisda/device/updateDeviceAlarmMsg"/>
<add key="BoardTimeout" value="3"/>
<add key="AGV_BATTERY_MAX" value="100"/>
<add key="AGV_BATTERY_MIN" value="40"/>
<add key="WorkTimeout" value="10"/>
<add key="WorkTimeoutDel" value="false"/>
<add key="WorkAutoDel" value="false"/>
<add key="21号_3S" value="false"/>
</appSettings>
</configuration>
\ No newline at end of file
......@@ -87,6 +87,7 @@
this.BtnMissionClear = new System.Windows.Forms.Button();
this.BtnMissionAdd = new System.Windows.Forms.Button();
this.LstMission = new System.Windows.Forms.ListBox();
this.LblVersion = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.DgvName)).BeginInit();
this.tabControl1.SuspendLayout();
this.tabPage2.SuspendLayout();
......@@ -237,6 +238,7 @@
//
// tabPage2
//
this.tabPage2.Controls.Add(this.LblVersion);
this.tabPage2.Controls.Add(this.BtnClearLog);
this.tabPage2.Controls.Add(this.tableLayoutPanel5);
this.tabPage2.Controls.Add(this.LblStorageIO);
......@@ -765,6 +767,15 @@
this.LstMission.Size = new System.Drawing.Size(220, 510);
this.LstMission.TabIndex = 12;
//
// LblVersion
//
this.LblVersion.Location = new System.Drawing.Point(579, 9);
this.LblVersion.Name = "LblVersion";
this.LblVersion.Size = new System.Drawing.Size(237, 33);
this.LblVersion.TabIndex = 12;
this.LblVersion.Text = "label4";
this.LblVersion.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
//
// FrmMain
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
......@@ -775,7 +786,7 @@
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "FrmMain";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "钢网AGV(4楼)";
this.Text = "钢网AGV";
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing);
this.Load += new System.EventHandler(this.FrmMain_Load);
((System.ComponentModel.ISupportInitialize)(this.DgvName)).EndInit();
......@@ -845,6 +856,7 @@
private System.Windows.Forms.DataGridViewButtonColumn Column8;
private System.Windows.Forms.CheckBox ChkWorkTimeoutDel;
private System.Windows.Forms.CheckBox ChkWorkAutoDel;
private System.Windows.Forms.Label LblVersion;
}
}
......@@ -43,6 +43,14 @@ namespace AGVControl_Steel
private void FrmMain_Load(object sender, EventArgs e)
{
string[] workshop = new string[Common.agvInfos.Count];
for (int i = 0; i < Common.agvInfos.Count; i++)
workshop[i] = Common.agvInfos[i].Workshop;
Text += " (" + string.Join(" ", workshop) + ")";
System.Reflection.Assembly assembly = System.Reflection.Assembly.GetEntryAssembly();
LblVersion.Text = assembly.GetName().Version.ToString();
checkedChange = true;
ChkWorkTimeoutDel.Text = "回收钢板时删除" + Common.WorkTimeout + "min前的任务";
ChkWorkTimeoutDel.Checked = Common.WorkTimeoutDel;
......
......@@ -19,7 +19,6 @@ namespace AGVControl_Steel
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Common.log = new Log("AGVControl_Steel");
Common.log.Info("=====程序开始=====");
if (BLL.RunMode.IsRun())
......@@ -28,6 +27,7 @@ namespace AGVControl_Steel
return;
}
ReadConfig();
Application.Run(new FrmMain());
Common.log.Info("=====程序结束=====\r\n");
}
......@@ -54,7 +54,7 @@ namespace AGVControl_Steel
Common.WorkTimeout = Convert.ToInt32(Common.appConfig.AppSettings.Settings["WorkTimeout"].Value);
Common.WorkTimeoutDel = Convert.ToBoolean(Common.appConfig.AppSettings.Settings["WorkTimeoutDel"].Value);
Common.WorkAutoDel = Convert.ToBoolean(Common.appConfig.AppSettings.Settings["WorkAutoDel"].Value);
Common.mir = new MiR_API { FleetIP = Common.appConfig.AppSettings.Settings["FLEET_IP"].Value }; //asa
Common.mir = new MiR_API { FleetIP = Common.appConfig.AppSettings.Settings["FLEET_IP"].Value };
ReadAgvInfo();
ReadAgvMission();
ReadAgvLine();
......
......@@ -31,6 +31,6 @@ using System.Runtime.InteropServices;
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.2.0.0")]
[assembly: AssemblyFileVersion("1.2.0.0")]
[assembly: AssemblyVersion("1.4.*")]
//[assembly: AssemblyVersion("1.2.0.0")]
//[assembly: AssemblyFileVersion("1.2.0.0")]
......@@ -11,7 +11,7 @@
<TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<Deterministic>false</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
......
......@@ -3,11 +3,13 @@
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
<!--4楼-->
<!--
<appSettings>
<add key="FLEET_IP" value="10.85.199.3"/>
<add key="FLEET_Send" value="true"/>
<add key="WebService" value="http://10.85.196.40:8089/"/>
<!--<add key="WebService" value="http://127.0.0.1:8089/"/>-->
<add key="Board" value="http://10.85.199.25/myproject/rest/api/qisda/device/updateDeviceAlarmMsg"/>
<add key="BoardTimeout" value="3"/>
<add key="AGV_BATTERY_MAX" value="100"/>
......@@ -18,4 +20,21 @@
<add key="11号_4C" value="false"/>
<add key="13号_4D" value="false"/>
</appSettings>
-->
<!--3楼-->
<appSettings>
<add key="FLEET_IP" value="10.85.199.140"/>
<add key="FLEET_Send" value="true"/>
<add key="WebService" value="http://127.0.0.1:8090/"/>
<!--<add key="WebService" value="http://10.85.196.40:8090/"/>-->
<add key="Board" value="http://10.85.162.124/myproject/rest/api/qisda/device/updateDeviceAlarmMsg"/>
<add key="BoardTimeout" value="3"/>
<add key="AGV_BATTERY_MAX" value="100"/>
<add key="AGV_BATTERY_MIN" value="40"/>
<add key="WorkTimeout" value="10"/>
<add key="WorkTimeoutDel" value="false"/>
<add key="WorkAutoDel" value="false"/>
<add key="21号_3S" value="false"/>
</appSettings>
</configuration>
\ No newline at end of file
此文件类型无法预览
此文件类型无法预览
4D,D1,D2,D3,D4,D5,D6,D8,D9,D10,D11,D12,D14,D15,D16,4DWASH,STORAGE
4C,C1,C2,C3,C4,C5,C6,C7,C8,C9,C10,4CWASH,STORAGE
\ No newline at end of file
3S,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,3Swash
\ No newline at end of file
MoveSteelC1,77a02463-f387-11ea-8452-94c691a7387d
MoveSteelC2,b2dc4ed9-f387-11ea-8452-94c691a7387d
MoveSteelC3,c7f598c1-f387-11ea-8452-94c691a7387d
MoveSteelC4,ddfd5992-f387-11ea-8452-94c691a7387d
MoveSteelC5,f0a4498e-f387-11ea-8452-94c691a7387d
MoveSteelC6,037a7f67-f388-11ea-8452-94c691a7387d
MoveSteelC7,1b361828-f388-11ea-8452-94c691a7387d
MoveSteelC8,2aec8e6c-f388-11ea-8452-94c691a7387d
MoveSteelC9,3cad8c7d-f388-11ea-8452-94c691a7387d
MoveSteelC10,4cc3d656-f388-11ea-8452-94c691a7387d
MoveSteelD1,e9ed94bf-f2ac-11ea-8452-94c691a7387d
MoveSteelD2,04e5690f-f2ad-11ea-8452-94c691a7387d
MoveSteelD3,1d3f9b5a-f2ad-11ea-8452-94c691a7387d
MoveSteelD4,55bf620d-f2ad-11ea-8452-94c691a7387d
MoveSteelD5,6c1fe859-f2ad-11ea-8452-94c691a7387d
MoveSteelD6,8498ea0b-f2ad-11ea-8452-94c691a7387d
MoveSteelD8,ba683168-f2ad-11ea-8452-94c691a7387d
MoveSteelD9,de7f8051-f2ad-11ea-8452-94c691a7387d
MoveSteelD10,f81944b7-f2ad-11ea-8452-94c691a7387d
MoveSteelD11,0a0b0df1-f2ae-11ea-8452-94c691a7387d
MoveSteelD12,201e368d-f2ae-11ea-8452-94c691a7387d
MoveSteelD14,445106a1-f2ae-11ea-8452-94c691a7387d
MoveSteelD15,002b3e45-f105-11ea-a03e-94c691a7387d
MoveSteelD16,15a766ac-f2a2-11ea-8452-94c691a7387d
MoveWash4C,691e75ab-f2b0-11ea-8452-94c691a7387d
MoveWash4D,e52ae766-f2ab-11ea-8452-94c691a7387d
MoveStandby4C,2dd387ce-f2b0-11ea-8452-94c691a7387d
MoveStandby4D,21ca7ffe-f29e-11ea-8452-94c691a7387d
AutoCharge4C,8ed7b459-f2b0-11ea-8452-94c691a7387d
AutoCharge4D,2f0a31b1-f2ab-11ea-8452-94c691a7387d
PassDoorInto4D,d67f31c8-ca7e-11ea-9a66-94c691a7387d
PassDoorInto4C,fd6e26ac-c1bf-11ea-9a66-94c691a7387d
MoveSteelstorage,418c9064-f2ac-11ea-8452-94c691a7387d
Pickupqisdashelf,f2acdcae-e524-11ea-b003-0001299a3f0e
Placeqisdashelf,4001120d-e525-11ea-b003-0001299a3f0e
4CflowIOin,2f0086e6-362c-11eb-b091-94c691a7387d
4CflowIOout,46b3f3bf-3636-11eb-b048-0001299981d4
\ No newline at end of file
MoveSteelS3,2e8fc5de-765d-11eb-a016-0001297a1dca
MoveSteelS4,9405ee92-7663-11eb-a016-0001297a1dca
MoveSteelS5,a7c90a1f-7663-11eb-a016-0001297a1dca
MoveSteelS6,d7354a58-7663-11eb-a016-0001297a1dca
MoveSteelS7,e956e342-7663-11eb-a016-0001297a1dca
MoveSteelS8,f9c84de8-7663-11eb-a016-0001297a1dca
MoveSteelS9,16585e9d-7664-11eb-a016-0001297a1dca
MoveSteelS10,27524274-7664-11eb-a016-0001297a1dca
MoveSteelS11,4441d226-7664-11eb-a016-0001297a1dca
MoveSteelS12,53e75a0f-7664-11eb-a016-0001297a1dca
MoveWash3S,6075ab3f-7665-11eb-a016-0001297a1dca
AutoCharge3S,162d0476-7666-11eb-a016-0001297a1dca
MoveStandby3S,615cef05-61f4-11eb-96a9-0001297a1dca
Pickupqisdashelf,4aae07c8-7667-11eb-a016-0001297a1dca
Placeqisdashelf,64e29eaf-7670-11eb-a016-0001297a1dca
\ No newline at end of file
11,11号_4C,10.85.199.82,4C,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
12,13号_4D,10.85.199.84,4D,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
\ No newline at end of file
8,21号_3S,10.85.199.83,3S,Basic ZGlzdHJpYnV0b3I6NjJmMmYwZjFlZmYxMGQzMTUyYzk1ZjZmMDU5NjU3NmU0ODJiYjhlNDQ4MDY0MzNmNGNmOTI5NzkyODM0YjAxNA==
\ No newline at end of file
......@@ -2,13 +2,18 @@
<configuration>
<log4net>
<logger name="AGVControl_Steel">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="AGVControl_Steel"/>
</logger>
<logger name="MiR_API">
<level value="Debug"/>
<level value="Info"/>
<appender-ref ref="api"/>
</logger>
<logger name="RunLog">
<level value="Info"/>
<appender-ref ref="RunLog"/>
</logger>
<appender name="AGVControl_Steel" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\AGVControl_Steel.log" />
<param name="Encoding" value="UTF-8"/>
......@@ -33,5 +38,18 @@
<param name="ConversionPattern" value="[%d][%t][%c:%L]%-5p %m%n" />
</layout>
</appender>
<appender name="RunLog" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\RunLog.json" />
<param name="Encoding" value="UTF-8"/>
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM-dd" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%m%n" />
</layout>
</appender>
</log4net>
</configuration>
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!