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