Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
P
PastureGateway
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
steven.sha
PastureGateway
Commits
b8dca831
Commit
b8dca831
authored
Jun 17, 2019
by
shaxuezheng
Browse files
Options
Browse Files
Download
Plain Diff
merge
parents
38a1531c
dd0634bd
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
775 additions
and
4448 deletions
+775
-4448
ModualAlarm.cs
ModbusDemo/Common/ModualAlarm.cs
+9
-7
ModbusComm.cs
ModbusDemo/MessageFormat/ModbusComm.cs
+2
-2
ModualControl.cs
ModbusDemo/MessageFormat/ModualControl.cs
+589
-7
ModbusDemo.csproj
ModbusDemo/ModbusDemo.csproj
+0
-2
ModSearch.cs
ModbusDemo/ModbusDemo/Common/ModSearch.cs
+0
-173
WTModbus.cs
ModbusDemo/ModbusDemo/Common/WTModbus.cs
+0
-165
Demo_818X.Designer.cs
ModbusDemo/ModbusDemo/Demo_818X.Designer.cs
+0
-526
Demo_818X.cs
ModbusDemo/ModbusDemo/Demo_818X.cs
+0
-310
Demo_818X.resx
ModbusDemo/ModbusDemo/Demo_818X.resx
+0
-827
LibModbus.dll
ModbusDemo/ModbusDemo/Lib/LibModbus.dll
+0
-0
LibSocket.dll
ModbusDemo/ModbusDemo/Lib/LibSocket.dll
+0
-0
MDemo.Designer.cs
ModbusDemo/ModbusDemo/MDemo.Designer.cs
+0
-544
MDemo.cs
ModbusDemo/ModbusDemo/MDemo.cs
+0
-106
MDemo.resx
ModbusDemo/ModbusDemo/MDemo.resx
+0
-120
ModbusDemo.csproj
ModbusDemo/ModbusDemo/ModbusDemo.csproj
+0
-112
ProTest.Designer.cs
ModbusDemo/ModbusDemo/ProTest.Designer.cs
+0
-492
ProTest.cs
ModbusDemo/ModbusDemo/ProTest.cs
+0
-287
ProTest.resx
ModbusDemo/ModbusDemo/ProTest.resx
+0
-120
Program.cs
ModbusDemo/ModbusDemo/Program.cs
+0
-23
AssemblyInfo.cs
ModbusDemo/ModbusDemo/Properties/AssemblyInfo.cs
+0
-36
Resources.Designer.cs
ModbusDemo/ModbusDemo/Properties/Resources.Designer.cs
+0
-73
Resources.resx
ModbusDemo/ModbusDemo/Properties/Resources.resx
+0
-124
Settings.Designer.cs
ModbusDemo/ModbusDemo/Properties/Settings.Designer.cs
+0
-30
Settings.settings
ModbusDemo/ModbusDemo/Properties/Settings.settings
+0
-7
057.png
ModbusDemo/ModbusDemo/Resources/057.png
+0
-0
ModualPoll.cs
ModbusDemo/Modular/ModualPoll.cs
+30
-5
modual.cs
ModbusDemo/Modular/modual.cs
+15
-2
Form1.cs
ModbusDemo/windows/Form1.cs
+130
-348
No files found.
ModbusDemo/Common/ModualAlarm.cs
View file @
b8dca831
...
@@ -12,17 +12,19 @@ namespace ModbusDemo.Common
...
@@ -12,17 +12,19 @@ namespace ModbusDemo.Common
public
static
class
ModualAlarm
public
static
class
ModualAlarm
{
{
public
const
ushort
usChannelNumber
=
8
;
public
const
ushort
usChannelNumber
=
8
;
private
const
string
sAlarmTopic
=
"Witium/WTDS78X/66666666/Alarm"
;
public
static
string
sAlarmJson
;
public
static
string
sAlarmJson
;
public
static
string
sAlarmJsonPackage
;
public
static
string
sAlarmJsonPackage
;
//private IMqttClient mqttClient = null;
//private IMqttClient mqttClient = null;
public
enum
eAlarmCode
:
ushort
public
enum
eAlarmCode
:
ushort
{
{
ChannelNoError
=
0
,
ChannelNoError
=
0
,
ChannelCommunError
=
1
,
ChannelCommunError
=
1
,
ChannelCollectDataError
=
2
,
ChannelCollectDataError
=
2
,
ChannelDataRespError
=
4
,
ChannelDataRespError
=
4
,
ChannelDataChangeError
=
8
ChannelDataChangeError
=
8
,
ChannelLevelError
=
16
,
ChannelControlError
=
32
,
}
}
public
static
void
vSetAlarmList
(
ushort
usAddress
,
ushort
[]
usChannel
,
ushort
[]
usChannelAlarmcode
)
public
static
void
vSetAlarmList
(
ushort
usAddress
,
ushort
[]
usChannel
,
ushort
[]
usChannelAlarmcode
)
{
{
...
@@ -46,7 +48,7 @@ namespace ModbusDemo.Common
...
@@ -46,7 +48,7 @@ namespace ModbusDemo.Common
public
static
async
Task
vPublishAlarmPackageJson
(
IMqttClient
mqttClient
)
public
static
async
Task
vPublishAlarmPackageJson
(
IMqttClient
mqttClient
)
{
{
var
message
=
new
MqttApplicationMessageBuilder
()
var
message
=
new
MqttApplicationMessageBuilder
()
.
WithTopic
(
sAlarmTopic
)
.
WithTopic
(
Form1
.
sAlarmTopic
)
.
WithPayload
(
sAlarmJson
)
.
WithPayload
(
sAlarmJson
)
.
WithAtMostOnceQoS
()
.
WithAtMostOnceQoS
()
.
WithRetainFlag
(
false
)
.
WithRetainFlag
(
false
)
...
...
ModbusDemo/MessageFormat/ModbusComm.cs
View file @
b8dca831
...
@@ -200,7 +200,7 @@ namespace ModbusDemo.MessageFormat
...
@@ -200,7 +200,7 @@ namespace ModbusDemo.MessageFormat
return
ModbusErrorCode
;
return
ModbusErrorCode
;
}
}
}
}
public
static
eModbusErrorCode
Modbus_WriteSingleCoil
(
byte
slaveAddress
,
ushort
startAddress
,
bool
[]
value
)
public
static
eModbusErrorCode
Modbus_WriteSingleCoil
(
byte
slaveAddress
,
ushort
startAddress
,
bool
value
)
{
{
object
oLock
=
new
object
();
object
oLock
=
new
object
();
lock
(
oLock
)
lock
(
oLock
)
...
@@ -208,7 +208,7 @@ namespace ModbusDemo.MessageFormat
...
@@ -208,7 +208,7 @@ namespace ModbusDemo.MessageFormat
eModbusErrorCode
ModbusErrorCode
;
eModbusErrorCode
ModbusErrorCode
;
try
try
{
{
Modbus
.
Write
MultipleCoils
(
slaveAddress
,
startAddress
,
value
);
Modbus
.
Write
SingleCoil
(
slaveAddress
,
startAddress
,
value
);
ModbusErrorCode
=
eModbusErrorCode
.
MB_ENOERR
;
ModbusErrorCode
=
eModbusErrorCode
.
MB_ENOERR
;
}
}
catch
(
Exception
exception
)
catch
(
Exception
exception
)
...
...
ModbusDemo/MessageFormat/ModualControl.cs
View file @
b8dca831
...
@@ -6,14 +6,21 @@ using System.Threading.Tasks;
...
@@ -6,14 +6,21 @@ using System.Threading.Tasks;
using
MQTTnet
;
using
MQTTnet
;
using
MQTTnet.Client
;
using
MQTTnet.Client
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json.Linq
;
using
ModbusDemo.windows
;
using
ModbusDemo
;
using
ModbusDemo.Modular
;
using
ModbusDemo.Common
;
using
System.Threading
;
using
System.Threading.Tasks
;
namespace
ModbusDemo.MessageFormat
namespace
ModbusDemo.MessageFormat
{
{
public
class
ModualControl
public
class
ModualControl
{
{
public
class
Op
public
class
Op
{
{
public
UInt64
duration
{
get
;
set
;
}
public
ushort
duration
{
get
;
set
;
}
public
UInt64
startTime
{
get
;
set
;}
public
UInt64
startTime
{
get
;
set
;
}
public
int
d0
{
get
;
set
;
}
public
int
d0
{
get
;
set
;
}
public
int
d1
{
get
;
set
;
}
public
int
d1
{
get
;
set
;
}
public
int
d2
{
get
;
set
;
}
public
int
d2
{
get
;
set
;
}
...
@@ -23,6 +30,7 @@ namespace ModbusDemo.MessageFormat
...
@@ -23,6 +30,7 @@ namespace ModbusDemo.MessageFormat
public
int
d6
{
get
;
set
;
}
public
int
d6
{
get
;
set
;
}
public
int
d7
{
get
;
set
;
}
public
int
d7
{
get
;
set
;
}
public
UInt64
ts
{
get
;
set
;
}
public
UInt64
ts
{
get
;
set
;
}
}
}
public
class
SsItem
public
class
SsItem
...
@@ -36,10 +44,584 @@ namespace ModbusDemo.MessageFormat
...
@@ -36,10 +44,584 @@ namespace ModbusDemo.MessageFormat
public
string
taskId
{
get
;
set
;
}
public
string
taskId
{
get
;
set
;
}
public
List
<
SsItem
>
ss
{
get
;
set
;
}
public
List
<
SsItem
>
ss
{
get
;
set
;
}
}
}
public
static
List
<
MqttRoot
>
liModuualControl
=
new
List
<
MqttRoot
>();
public
class
Cfg
public
static
void
vGetaWay_Receive_Control
(
string
sDataString
)
{
{
public
byte
d0
{
get
;
set
;
}
MqttRoot
cControl
=
JsonConvert
.
DeserializeObject
<
MqttRoot
>(
sDataString
);
public
byte
d1
{
get
;
set
;
}
public
byte
d2
{
get
;
set
;
}
public
byte
d3
{
get
;
set
;
}
public
byte
d4
{
get
;
set
;
}
public
byte
d5
{
get
;
set
;
}
public
byte
d6
{
get
;
set
;
}
public
byte
d7
{
get
;
set
;
}
public
string
down
{
get
;
set
;
}
public
string
upper
{
get
;
set
;
}
public
UInt64
ts
{
get
;
set
;
}
}
public
class
pcCfgSsItem
{
public
string
addr
{
get
;
set
;
}
public
Cfg
cfg
{
get
;
set
;
}
}
public
class
pcCfgRoot
{
public
string
taskId
{
get
;
set
;
}
public
List
<
pcCfgSsItem
>
ss
{
get
;
set
;
}
}
public
class
pcModualControlIndex
{
public
string
srcId
{
get
;
set
;
}
public
string
srcType
{
get
;
set
;
}
public
string
srcCh
{
get
;
set
;
}
public
string
resId
{
get
;
set
;
}
public
string
resType
{
get
;
set
;
}
public
string
resCh
{
get
;
set
;
}
public
List
<
string
>
dstCh
{
get
;
set
;
}
}
public
class
pcControlMap
{
public
List
<
pcModualControlIndex
>
chMap
{
get
;
set
;
}
}
public
struct
ModualRespControl
{
public
byte
byResModualID
;
public
string
stResChannel
;
public
modual
.
eModualType
eModualType
;
}
public
class
ModualCntrol
{
public
bool
bStartControl
;
public
bool
bControlStatus
;
public
byte
sbModbusID
;
public
byte
sbModualIndex
;
public
bool
[]
bControlData
;
public
ushort
usDurationTime
;
public
UInt64
ulStartTime
;
public
bool
[]
bControlBit
=
new
bool
[
8
];
public
modual
.
eModualType
eModualType
;
public
ModualRespControl
[]
xModualRespControl
=
new
ModualRespControl
[
8
];
}
public
class
pcLiquidLevelConfig
{
public
byte
byModbusID
;
public
string
stChannelNumber
;
public
double
dUpLevel
;
public
double
dDownLevel
;
}
public
static
List
<
pcLiquidLevelConfig
>
cPoolLevelConfig
=
new
List
<
pcLiquidLevelConfig
>();
public
static
List
<
ModualCntrol
>
liModuualControl
=
new
List
<
ModualCntrol
>();
public
const
ushort
usDefineControlTimes
=
1
;
private
static
pcControlMap
cControlMap
=
new
pcControlMap
();
#if DEBUG_TEST
public
const
string
strMapCfg
=
"{chMap:[{ \"srcId\": \"31\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d0\", \"dstCh\":[\"d0\",\"d1\",\"d2\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"31\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d2\", \"dstCh\":[\"d2\",\"d3\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"31\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d4\", \"dstCh\":[\"d4\",\"d5\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"16\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d0\", \"dstCh\":[\"d0\",\"d1\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"16\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d2\", \"dstCh\":[\"d2\",\"d3\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"16\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d4\", \"dstCh\":[\"d4\",\"d5\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"35\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d0\", \"dstCh\":[\"d0\",\"d1\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"35\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d2\", \"dstCh\":[\"d2\",\"d3\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"35\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d4\", \"dstCh\":[\"d4\",\"d5\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"90\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d2\", \"dstCh\":[\"d2\",\"d3\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"39\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d0\", \"dstCh\":[\"d0\",\"d1\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"39\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d2\", \"dstCh\":[\"d2\",\"d3\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"39\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d4\", \"dstCh\":[\"d4\",\"d5\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"13\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d0\", \"dstCh\":[\"d0\",\"d1\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"13\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d2\", \"dstCh\":[\"d2\",\"d3\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"13\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d4\", \"dstCh\":[\"d4\",\"d5\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"{ \"srcId\": \"13\", \"srcType\": \"WTDR66C\", \"srcCh\":\"d6\", \"dstCh\":[\"d6\",\"d7\"],\"resId\":\"23\",\"resType\":\"WTDR78C\",\"resCh\":\"d0\"},"
+
"]}"
;
#endif
public
static
void
vGetaWay_Receive_Control
(
string
sDataString
,
out
string
stResponseData
)
{
byte
byModualIndex
=
0
;
MqttRoot
cControl
=
new
MqttRoot
();
var
jsonObj
=
new
JObject
();
try
{
cControl
=
JsonConvert
.
DeserializeObject
<
MqttRoot
>(
sDataString
);
jsonObj
=
JObject
.
Parse
(
sDataString
);
}
catch
(
Exception
exception
)
{
Form1
.
totxt
.
Log
(
exception
+
"Control Mqtt Parse Fail"
);
}
for
(
int
i
=
0
;
i
<
cControl
.
ss
.
Count
;
i
++)
{
bool
[]
btReadTempData
=
new
bool
[
6
];
ModbusComm
.
eModbusErrorCode
ModbusErrorCode
=
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
;
ModualCntrol
cModualCntrol
=
new
ModualCntrol
{
sbModbusID
=
byte
.
Parse
(
cControl
.
ss
[
i
].
addr
),
usDurationTime
=
cControl
.
ss
[
i
].
op
.
duration
,
ulStartTime
=
cControl
.
ss
[
i
].
op
.
startTime
};
cModualCntrol
.
eModualType
=
eModdusId_Find_ModualType
(
cControl
.
ss
[
i
].
addr
);
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
cModualCntrol
.
bControlData
,
cModualCntrol
.
sbModbusID
,
16
,
6
);
for
(
byte
j
=
0
;
j
<
ModualPoll
.
byX66cNumber
;
j
++)
{
if
(
cModualCntrol
.
sbModbusID
==
ModualPoll
.
byX66cIdlist
[
j
])
{
byModualIndex
=
j
;
cModualCntrol
.
sbModualIndex
=
j
;
break
;
}
else
{
byModualIndex
=
0xFF
;
cModualCntrol
.
sbModualIndex
=
0xFF
;
}
}
}
else
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
cModualCntrol
.
bControlData
,
cModualCntrol
.
sbModbusID
,
16
,
8
);
for
(
byte
j
=
0
;
j
<
ModualPoll
.
byX66cNumber
;
j
++)
{
if
(
cModualCntrol
.
sbModbusID
==
ModualPoll
.
byX78cIdlist
[
j
])
{
byModualIndex
=
j
;
cModualCntrol
.
sbModualIndex
=
j
;
break
;
}
else
{
byModualIndex
=
0xFF
;
cModualCntrol
.
sbModualIndex
=
0xFF
;
}
}
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
]
!=
null
)
{
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d0"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d0"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d0
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d1"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d1"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d1
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d2"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d2"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d2
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d3"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d3"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d3
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d4"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d4"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d4
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d5"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d5"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d5
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d6"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d6"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d6
),
ref
cModualCntrol
);
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"d7"
]
!=
null
)
{
vFindChannelMap
(
cControl
.
ss
[
i
].
addr
,
"d7"
,
Convert
.
ToBoolean
(
cControl
.
ss
[
i
].
op
.
d7
),
ref
cModualCntrol
);
}
if
(
ModbusErrorCode
==
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
&&
cModualCntrol
.
ulStartTime
<=
Form1
.
GetTimeStamp
())
{
cModualCntrol
.
bStartControl
=
true
;
ModbusErrorCode
|=
ModbusComm
.
Modbus_WriteMultipleCoils
(
cModualCntrol
.
sbModbusID
,
16
,
cModualCntrol
.
bControlData
);
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR66C
)
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
btReadTempData
,
cModualCntrol
.
sbModbusID
,
16
,
6
);
else
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR78C
)
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
btReadTempData
,
cModualCntrol
.
sbModbusID
,
16
,
8
);
if
(
Enumerable
.
SequenceEqual
(
cModualCntrol
.
bControlData
,
btReadTempData
))
{
cModualCntrol
.
bControlStatus
=
true
;
}
}
if
(
jsonObj
[
"ss"
][
i
][
"op"
][
"ts"
]
!=
null
)
{
jsonObj
[
"ss"
][
i
][
"op"
][
"ts"
]
=
Form1
.
GetTimeStamp
();
}
if
(
ModbusErrorCode
==
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
)
{
if
(
cModualCntrol
.
bStartControl
==
true
&&
cModualCntrol
.
ulStartTime
!=
0
&&
cModualCntrol
.
bControlStatus
==
true
)
{
liModuualControl
.
Add
(
cModualCntrol
);
}
else
if
(
cModualCntrol
.
bStartControl
==
false
&&
cModualCntrol
.
ulStartTime
!=
0
)
{
liModuualControl
.
Add
(
cModualCntrol
);
}
}
for
(
int
k
=
0
;
k
<
8
;
k
++)
{
if
(
cModualCntrol
.
bControlBit
[
k
]
==
true
&&
ModbusErrorCode
==
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
)
{
string
str
=
"d"
+
k
.
ToString
();
jsonObj
[
"ss"
][
i
][
"op"
][
str
]
=
1
;
if
(
byModualIndex
!=
0xFF
&&
k
<
6
)
{
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usCommFailTimes
[
k
]
=
0
;
if
(
cModualCntrol
.
bStartControl
==
true
&&
Enumerable
.
SequenceEqual
(
cModualCntrol
.
bControlData
,
btReadTempData
))
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
else
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
+
8
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usCommFailTimes
[
k
+
8
]
=
0
;
if
(
cModualCntrol
.
bStartControl
==
true
&&
cModualCntrol
.
bStartControl
==
true
)
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
+
8
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
}
else
if
(
cModualCntrol
.
bControlBit
[
k
]
==
true
)
{
string
str
=
"d"
+
k
.
ToString
();
jsonObj
[
"ss"
][
i
][
"op"
][
str
]
=
0
;
if
(
ModbusErrorCode
!=
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
&&
byModualIndex
!=
0xFF
)
{
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usCommFailTimes
[
k
]
+=
usDefineControlTimes
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
else
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usCommFailTimes
[
k
+
8
]
+=
usDefineControlTimes
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
if
(!
Enumerable
.
SequenceEqual
(
cModualCntrol
.
bControlData
,
btReadTempData
)
&&
byModualIndex
!=
0xFF
&&
cModualCntrol
.
bStartControl
==
true
)
{
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR66C
)
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
else
if
(
cModualCntrol
.
eModualType
==
modual
.
eModualType
.
WTDR78C
)
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
byModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
}
}
}
stResponseData
=
jsonObj
.
ToString
();
}
public
static
void
vControl_Poll
()
{
cControlMap
=
JsonConvert
.
DeserializeObject
<
pcControlMap
>(
strMapCfg
);
while
(
true
)
{
for
(
sbyte
i
=
0
;
i
<
liModuualControl
.
Count
;
i
++)
{
if
(
liModuualControl
[
i
].
bStartControl
==
false
)
{
if
(
liModuualControl
[
i
].
ulStartTime
<=
Form1
.
GetTimeStamp
())
{
ModbusComm
.
eModbusErrorCode
ModbusErrorCode
=
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
;
liModuualControl
[
i
].
bStartControl
=
true
;
bool
[]
bControlData
=
new
bool
[
6
];
bool
[]
btReadTempData
;
byte
ChannelNumber
=
0
;
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
bControlData
,
liModuualControl
[
i
].
sbModbusID
,
16
,
6
);
ChannelNumber
=
6
;
}
else
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
bControlData
,
liModuualControl
[
i
].
sbModbusID
,
16
,
8
);
ChannelNumber
=
8
;
}
for
(
sbyte
j
=
0
;
j
<
ChannelNumber
;
j
++)
{
if
(
liModuualControl
[
i
].
bControlBit
[
j
]
==
true
)
{
bControlData
[
j
]
=
liModuualControl
[
i
].
bControlData
[
j
];
}
else
{
liModuualControl
[
i
].
bControlData
[
j
]
=
bControlData
[
j
];
}
ModbusErrorCode
|=
ModbusComm
.
Modbus_WriteMultipleCoils
(
liModuualControl
[
i
].
sbModbusID
,
16
,
bControlData
);
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
btReadTempData
,
liModuualControl
[
i
].
sbModbusID
,
16
,
ChannelNumber
);
if
(
ModbusErrorCode
!=
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
)
{
for
(
sbyte
k
=
0
;
k
<
ChannelNumber
;
k
++)
{
if
(
liModuualControl
[
i
].
bControlBit
[
k
]
==
true
&&
liModuualControl
[
i
].
sbModualIndex
!=
0xFF
)
{
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
+=
usDefineControlTimes
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
else
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
+=
usDefineControlTimes
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
}
}
else
if
(
ModbusErrorCode
==
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
)
{
for
(
sbyte
k
=
0
;
k
<
ChannelNumber
;
k
++)
{
if
(
liModuualControl
[
i
].
bControlBit
[
k
]
==
true
&&
liModuualControl
[
i
].
sbModualIndex
!=
0xFF
)
{
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
=
0
;
if
(
Enumerable
.
SequenceEqual
(
bControlData
,
btReadTempData
))
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
else
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
=
0
;
if
(
Enumerable
.
SequenceEqual
(
bControlData
,
btReadTempData
))
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
}
}
}
}
}
else
{
if
((
liModuualControl
[
i
].
usDurationTime
+
liModuualControl
[
i
].
ulStartTime
)
<=
Form1
.
GetTimeStamp
())
{
ModbusComm
.
eModbusErrorCode
ModbusErrorCode
=
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
;
bool
[]
bControlData
=
new
bool
[
6
];
bool
[]
btReadTempData
;
byte
ChannelNumber
=
0
;
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
bControlData
,
liModuualControl
[
i
].
sbModbusID
,
16
,
6
);
ChannelNumber
=
6
;
}
else
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ChannelNumber
=
8
;
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
bControlData
,
liModuualControl
[
i
].
sbModbusID
,
16
,
8
);
}
for
(
sbyte
j
=
0
;
j
<
ChannelNumber
;
j
++)
{
if
(
liModuualControl
[
i
].
bControlBit
[
j
]
==
true
)
{
bControlData
[
j
]
=
!
liModuualControl
[
i
].
bControlData
[
j
];
}
}
ModbusErrorCode
|=
ModbusComm
.
Modbus_WriteMultipleCoils
(
liModuualControl
[
i
].
sbModbusID
,
16
,
bControlData
);
ModbusErrorCode
|=
ModbusComm
.
Modbus_ReadCoilsTask
(
out
btReadTempData
,
liModuualControl
[
i
].
sbModbusID
,
16
,
ChannelNumber
);
if
(
ModbusErrorCode
!=
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
)
{
for
(
sbyte
k
=
0
;
k
<
ChannelNumber
;
k
++)
{
if
(
liModuualControl
[
i
].
bControlBit
[
k
]
==
true
&&
liModuualControl
[
i
].
sbModualIndex
!=
0xFF
)
{
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
+=
usDefineControlTimes
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
else
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
+=
usDefineControlTimes
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
}
}
else
if
(
ModbusErrorCode
==
ModbusComm
.
eModbusErrorCode
.
MB_EMASTERNOERR
)
{
for
(
sbyte
k
=
0
;
k
<
ChannelNumber
;
k
++)
{
if
(
liModuualControl
[
i
].
bControlBit
[
k
]
==
true
&&
liModuualControl
[
i
].
sbModualIndex
!=
0xFF
)
{
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR66C
)
{
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
=
0
;
if
(
Enumerable
.
SequenceEqual
(
bControlData
,
btReadTempData
))
ModualPoll
.
cx66c
.
sX66cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
else
if
(
liModuualControl
[
i
].
eModualType
==
modual
.
eModualType
.
WTDR78C
)
{
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
=
0
;
if
(
Enumerable
.
SequenceEqual
(
bControlData
,
btReadTempData
))
ModualPoll
.
cx78c
.
sX78cAlarmStruct
[
liModuualControl
[
i
].
sbModualIndex
].
usNowAlarmCode
[
k
+
8
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelControlError
;
}
}
}
}
liModuualControl
.
Remove
(
liModuualControl
[
i
]);
break
;
}
}
}
Thread
.
Sleep
(
100
);
}
}
public
static
modual
.
eModualType
eModdusId_Find_ModualType
(
string
sModbusID
)
{
for
(
int
i
=
0
;
i
<
cControlMap
.
chMap
.
Count
;
i
++)
{
if
(
sModbusID
==
cControlMap
.
chMap
[
i
].
srcId
)
{
if
(
cControlMap
.
chMap
[
i
].
srcType
==
"WTDR14P"
)
return
modual
.
eModualType
.
WTDR14P
;
else
if
(
cControlMap
.
chMap
[
i
].
srcType
==
"WTDR18X"
)
return
modual
.
eModualType
.
WTDR18X
;
else
if
(
cControlMap
.
chMap
[
i
].
srcType
==
"WTDR78C"
)
return
modual
.
eModualType
.
WTDR78C
;
else
if
(
cControlMap
.
chMap
[
i
].
srcType
==
"WTDR66C"
)
return
modual
.
eModualType
.
WTDR66C
;
}
}
return
modual
.
eModualType
.
IDLE
;
}
private
static
void
vFindChannelMap
(
string
stContrID
,
string
stChannelName
,
bool
bControlValue
,
ref
ModualCntrol
cModualCntrol
)
{
for
(
int
i
=
0
;
i
<
cControlMap
.
chMap
.
Count
;
i
++)
{
if
(
cControlMap
.
chMap
[
i
].
srcId
==
stContrID
)
{
if
(
cControlMap
.
chMap
[
i
].
srcCh
==
stChannelName
&&
cControlMap
.
chMap
[
i
].
dstCh
.
Count
!=
0
)
{
for
(
int
j
=
0
;
j
<
cControlMap
.
chMap
[
i
].
dstCh
.
Count
;
j
++)
{
for
(
int
k
=
0
;
k
<
8
;
k
++)
{
string
str
=
"d"
+
k
.
ToString
();
if
(
cControlMap
.
chMap
[
i
].
dstCh
[
j
]
==
str
)
{
cModualCntrol
.
bControlData
[
k
]
=
bControlValue
;
cModualCntrol
.
bControlBit
[
k
]
=
true
;
cModualCntrol
.
xModualRespControl
[
k
].
byResModualID
=
byte
.
Parse
(
cControlMap
.
chMap
[
i
].
resId
);
cModualCntrol
.
xModualRespControl
[
k
].
eModualType
=
eModdusId_Find_ModualType
(
cControlMap
.
chMap
[
i
].
resId
);
cModualCntrol
.
xModualRespControl
[
k
].
stResChannel
=
cControlMap
.
chMap
[
i
].
resCh
;
}
}
}
}
else
{
for
(
int
k
=
0
;
k
<
8
;
k
++)
{
string
str
=
"d"
+
k
.
ToString
();
if
(
stChannelName
==
str
)
{
cModualCntrol
.
bControlData
[
k
]
=
bControlValue
;
cModualCntrol
.
bControlBit
[
k
]
=
true
;
}
}
}
}
}
}
//public static ModbusComm.eModbusErrorCode eOperation_Machine(modual.eModualType eModualType, byte bMoualID, bool[] bControldata,bool[] bControlBit, out bool bControlStatus,ModualRespControl sModualRespControl)
//{
// ushort[] usRegData,usRegType;
// ModbusComm.eModbusErrorCode ModbusErrorCode = ModbusComm.eModbusErrorCode.MB_EMASTERNOERR;
// if (sModualRespControl.eModualType == modual.eModualType.WTDR78C)
// {
// double[] dConvertData = new double[8];
// string[] strDoubleString;
// _418X c18xformulasormual = new _418X();
// if ((ModbusErrorCode |= ModbusComm.Modbus_WriteMultipleCoils(bMoualID, 16, bControldata)) == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
// {
// for (int i = 0; i < 8; i++)
// {
// ModualPoll.cx18x.sX18xAlarmstruct
// }
// }
// ModbusErrorCode |= ModbusComm.Modbus_ReadHoldingRegistersTask(out usRegData, bMoualID, 0, 8);
// ModbusErrorCode |= ModbusComm.Modbus_ReadHoldingRegistersTask(out usRegType, bMoualID, 10,8);
// strDoubleString = c18xformulasormual.Value(usRegData, usRegType);
// for (int i = 0; i < 8; i++)
// {
// dConvertData[i] = double.Parse(strDoubleString[i]);
// }
// }
//}
public
static
void
vPoolLevelParse
(
string
stConfigString
,
out
string
stResponseStrign
)
{
pcCfgRoot
cCfgRoot
=
new
pcCfgRoot
();
var
jsonObj
=
new
JObject
();
try
{
cCfgRoot
=
JsonConvert
.
DeserializeObject
<
pcCfgRoot
>(
stConfigString
);
jsonObj
=
JObject
.
Parse
(
stConfigString
);
for
(
int
i
=
0
;
i
<
cCfgRoot
.
ss
.
Count
;
i
++)
{
string
strChannelString
=
"d"
+
i
.
ToString
();
pcLiquidLevelConfig
cLiquidLevelConfig
=
new
pcLiquidLevelConfig
{
byModbusID
=
byte
.
Parse
(
cCfgRoot
.
ss
[
i
].
addr
),
dUpLevel
=
double
.
Parse
(
cCfgRoot
.
ss
[
i
].
cfg
.
upper
),
dDownLevel
=
double
.
Parse
(
cCfgRoot
.
ss
[
i
].
cfg
.
down
)
};
if
(
jsonObj
[
"ss"
][
i
][
"cfg"
][
strChannelString
]
!=
null
)
{
cLiquidLevelConfig
.
stChannelNumber
=
strChannelString
;
jsonObj
[
"ss"
][
i
][
"cfg"
][
strChannelString
]
=
1
;
}
else
{
jsonObj
[
"ss"
][
i
][
"cfg"
][
strChannelString
]
=
0
;
continue
;
}
if
(
jsonObj
[
"ss"
][
i
][
"cfg"
][
"ts"
]
!=
null
)
{
jsonObj
[
"ss"
][
i
][
"cfg"
][
"ts"
]
=
Form1
.
GetTimeStamp
();
}
cPoolLevelConfig
.
Add
(
cLiquidLevelConfig
);
}
}
catch
(
Exception
exception
)
{
Form1
.
totxt
.
Log
(
exception
+
"Cfg Mqtt Parse Fail"
);
stResponseStrign
=
""
;
}
finally
{
stResponseStrign
=
jsonObj
.
ToString
();
}
}
}
}
}
}
}
\ No newline at end of file
ModbusDemo/ModbusDemo.csproj
View file @
b8dca831
...
@@ -177,8 +177,6 @@
...
@@ -177,8 +177,6 @@
<PropertyGroup>
<PropertyGroup>
<SsdtUnitTestVersion>
3.1
</SsdtUnitTestVersion>
<SsdtUnitTestVersion>
3.1
</SsdtUnitTestVersion>
</PropertyGroup>
</PropertyGroup>
<Import
Project=
"$(SQLDBExtensionsRefPath)\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets"
Condition=
"$(VisualStudioVersion) != '15.0' And '$(SQLDBExtensionsRefPath)' != ''"
/>
<Import
Project=
"$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\SSDT\Microsoft.Data.Tools.Schema.Sql.UnitTesting.targets"
Condition=
"$(VisualStudioVersion) != '15.0' And '$(SQLDBExtensionsRefPath)' == ''"
/>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
<Target Name="BeforeBuild">
...
...
ModbusDemo/ModbusDemo/Common/ModSearch.cs
deleted
100644 → 0
View file @
38a1531c
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Net
;
using
System.Net.Sockets
;
using
System.Threading
;
using
System.Text.RegularExpressions
;
using
System.Collections
;
using
System.Management
;
using
System.Net.NetworkInformation
;
namespace
ModbusDemo.Common
{
class
ModSearch
{
public
struct
DeviceInfo
{
public
string
ModuleName
;
public
string
MacAddr
;
public
string
IpAddr
;
public
string
Netmask
;
public
string
Gateway
;
public
bool
bActive
;
};
public
UdpClient
client
;
public
IPEndPoint
endpoint
;
Thread
searchth
;
ManualResetEvent
mre
=
new
ManualResetEvent
(
false
);
public
DeviceInfo
m_DeviceInfo
;
public
ArrayList
myHMIList
=
new
ArrayList
();
string
FMAC
=
null
;
string
localip
=
null
;
/// <summary>
/// 构造函数
/// </summary>
public
ModSearch
()
{
myHMIList
.
Clear
();
NetworkInterface
[]
nics
=
NetworkInterface
.
GetAllNetworkInterfaces
();
foreach
(
NetworkInterface
adapter
in
nics
)
{
if
(
adapter
.
Name
==
"本地连接"
)
//这里是为了匹配我自己电脑网卡
{
bool
Pd1
=
(
adapter
.
NetworkInterfaceType
==
NetworkInterfaceType
.
Ethernet
);
//判断是否是以太网连接
if
(
Pd1
)
{
{
IPInterfaceProperties
ip
=
adapter
.
GetIPProperties
();
//IP配置信息
UnicastIPAddressInformationCollection
ipCollection
=
ip
.
UnicastAddresses
;
foreach
(
UnicastIPAddressInformation
ipadd
in
ipCollection
)
{
if
(
ipadd
.
Address
.
AddressFamily
==
AddressFamily
.
InterNetwork
)
this
.
localip
=
ipadd
.
Address
.
ToString
();
//获取ip
}
}
}
}
}
}
public
void
ThStart
()
{
if
(
mre
!=
null
)
mre
.
Reset
();
Console
.
WriteLine
(
"搜索线程开始...."
);
searchth
=
new
Thread
(
ThreadMethod
);
searchth
.
IsBackground
=
true
;
searchth
.
Start
();
}
public
void
ThStop
()
{
Console
.
WriteLine
(
"搜索线程结束...."
);
mre
.
Set
();
}
public
int
HMICount
()
{
return
myHMIList
.
Count
;
}
private
void
ThreadMethod
()
{
byte
[]
sendBytes
=
new
byte
[]
{
0x57
,
0x54
,
0x04
,
0x00
,
0x00
,
0x00
,
0x03
,
0x00
,
0x00
,
0x00
,
0x55
,
0xAA
};
int
iReadBytes
=
0
;
try
{
client
=
new
UdpClient
(
new
IPEndPoint
(
IPAddress
.
Any
,
0
));
// client = new UdpClient(new IPEndPoint(IPAddress.Parse(this.localip), 0));
endpoint
=
new
IPEndPoint
(
IPAddress
.
Parse
(
"255.255.255.255"
),
5048
);
client
.
Send
(
sendBytes
,
sendBytes
.
Length
,
endpoint
);
Thread
.
Sleep
(
500
);
byte
[]
recvBytes
;
client
.
Client
.
Blocking
=
false
;
while
(!
mre
.
WaitOne
(
500
))
{
iReadBytes
=
30
;
int
buffSizeCurrent
;
buffSizeCurrent
=
client
.
Client
.
Available
;
if
(
buffSizeCurrent
>
0
)
{
recvBytes
=
client
.
Receive
(
ref
endpoint
);
iReadBytes
=
recvBytes
.
Length
;
DoRecvDataCallBack
(
recvBytes
,
iReadBytes
);
}
}
}
catch
{
}
}
public
Boolean
DoRecvDataCallBack
(
byte
[]
pcData
,
int
iRecvLength
)
{
int
i
;
int
count
=
0
;
byte
[]
pBuf
=
pcData
;
int
iDataLength
=
0
;
if
(
iRecvLength
<
8
)
return
false
;
if
((
pBuf
[
0
]
==
(
byte
)
0x57
)
&&
(
pBuf
[
1
]
==
(
byte
)
0x54
)
&&
(
pBuf
[
iRecvLength
-
2
]
==
(
byte
)
0x55
)
&&
(
pBuf
[
iRecvLength
-
1
]
==
(
byte
)
0xAA
))
{
iDataLength
=
(
int
)(
pBuf
[
2
]
&
0xFF
)
|
(
int
)((
pBuf
[
3
]
&
0xFF
)
<<
8
)
|
(
int
)((
pBuf
[
4
]
&
0xFF
)
<<
16
)
|
(
int
)((
pBuf
[
5
]
&
0xFF
)
<<
24
);
if
((
iDataLength
>=
4
)
&&
(
iRecvLength
==
8
+
iDataLength
))
{
System
.
Text
.
ASCIIEncoding
asciiEncoding
=
new
System
.
Text
.
ASCIIEncoding
();
m_DeviceInfo
.
bActive
=
false
;
for
(
i
=
0
;
i
<
100
;
i
++
)
{
if
(
asciiEncoding
.
GetString
(
pBuf
,
6
+
i
,
1
)
==
"\0"
)
break
;
count
++;
}
// m_DeviceInfo.ModuleName = String.Format("{0}", asciiEncoding.GetString(pBuf, 6, count));
//脱机
m_DeviceInfo
.
ModuleName
=
String
.
Format
(
"{0}{1}{2}{3}"
,
asciiEncoding
.
GetString
(
pBuf
,
6
,
1
),
asciiEncoding
.
GetString
(
pBuf
,
7
,
1
),
asciiEncoding
.
GetString
(
pBuf
,
8
,
1
),
asciiEncoding
.
GetString
(
pBuf
,
9
,
1
));
m_DeviceInfo
.
MacAddr
=
String
.
Format
(
"{0}:{1}:{2}:{3}:{4}:{5}"
,
pBuf
[
10
],
pBuf
[
11
],
pBuf
[
12
],
pBuf
[
13
],
pBuf
[
14
],
pBuf
[
15
]);
m_DeviceInfo
.
IpAddr
=
String
.
Format
(
"{0}.{1}.{2}.{3}"
,
pBuf
[
16
],
pBuf
[
17
],
pBuf
[
18
],
pBuf
[
19
]);
m_DeviceInfo
.
Netmask
=
String
.
Format
(
"{0}.{1}.{2}.{3}"
,
pBuf
[
20
],
pBuf
[
21
],
pBuf
[
22
],
pBuf
[
23
]);
m_DeviceInfo
.
Gateway
=
String
.
Format
(
"{0}.{1}.{2}.{3}"
,
pBuf
[
24
],
pBuf
[
25
],
pBuf
[
26
],
pBuf
[
27
]);
if
(
m_DeviceInfo
.
IpAddr
!=
"0.0.0.0"
)
{
myHMIList
.
Add
(
m_DeviceInfo
);
}
return
true
;
}
}
return
false
;
}
}
}
ModbusDemo/ModbusDemo/Common/WTModbus.cs
deleted
100644 → 0
View file @
38a1531c
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Text
;
using
System.Runtime.InteropServices
;
namespace
ModbusDemo.Common
{
class
WTModbus
{
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnLibModbus"
,
CharSet
=
CharSet
.
Unicode
)]
public
static
extern
uint
fnLibModbus
();
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnReadCoilStatus"
)]
public
static
extern
int
fnReadCoilStatus
(
uint
handle
,
ushort
address
,
ushort
num
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
Byte
[]
dest
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnReadInputStatus"
)]
public
static
extern
int
fnReadInputStatus
(
uint
handle
,
ushort
address
,
ushort
num
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
Char
[]
dest
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnReadHoldingReg"
)]
public
static
extern
int
fnReadHoldingReg
(
uint
handle
,
ushort
address
,
ushort
num
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
UInt16
[]
dest
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnReadInputReg"
)]
public
static
extern
int
fnReadInputReg
(
uint
handle
,
ushort
address
,
ushort
num
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
UInt16
[]
dest
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnWriteSingleCoil"
)]
public
static
extern
int
fnWriteSingleCoil
(
uint
handle
,
ushort
address
,
ushort
state
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnWriteHoldingReg"
)]
public
static
extern
int
fnWriteHoldingReg
(
uint
handle
,
ushort
address
,
ushort
state
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnWriteMultipleCoils"
)]
public
static
extern
int
fnWriteMultipleCoils
(
uint
handle
,
ushort
address
,
ushort
num
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
Char
[]
src
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnWriteMultipleRegs"
)]
public
static
extern
int
fnWriteMultipleRegs
(
uint
handle
,
ushort
address
,
ushort
num
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
UInt16
[]
src
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnReportSlaveID"
)]
public
static
extern
int
fnReportSlaveID
(
uint
handle
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
Char
[]
src
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnMaskWriteReg"
)]
public
static
extern
int
fnMaskWriteReg
(
uint
handle
,
ushort
address
,
ushort
amask
,
ushort
omask
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnReadWriteMultipleRegs"
)]
public
static
extern
int
fnReadWriteMultipleRegs
(
uint
handle
,
ushort
waddress
,
ushort
wnum
,
ushort
raddress
,
ushort
rnum
,
[
MarshalAs
(
UnmanagedType
.
LPArray
,
SizeParamIndex
=
1
)]
System
.
UInt16
[]
dest
,
byte
[]
Ip
,
ushort
wTcpPort
);
[
DllImport
(
@"LibModbus.dll"
,
EntryPoint
=
"fnLibModbusClose"
)]
public
static
extern
void
fnLibModbusClose
(
uint
handle
);
private
uint
hModbusHandle
;
private
System
.
UInt16
[]
dest
=
new
System
.
UInt16
[
10
]
{
0
,
0
,
3
,
4
,
5
,
6
,
7
,
8
,
9
,
0
};
public
WTModbus
()
{
this
.
hModbusHandle
=
fnLibModbus
();
}
~
WTModbus
()
{
fnLibModbusClose
(
hModbusHandle
);
}
/// <summary>
/// 读线圈状态
/// </summary>
/// <param name="addr">地址</param>
/// <param name="num">线圈数目</param>
/// <param name="ip">设备IP</param>
/// <param name="wport">端口号 默认502</param>
/// <param name="buf">读取结果</param>
/// <returns>
/// 0 -- no error
/// 1 -- illegal register address.
/// 2 -- illegal argument
/// 3 -- porting layer error
/// 4 -- insufficient resources
/// 5 -- I/O error
/// 6 -- protocol stack in illegal state
/// 7 -- timeout error occurred
/// 8 -- slave address error
/// 9 -- exception error occurred
/// 10-- CRC check error
/// 11-- send data error
/// 12-- receive data error
/// 13-- TCP connect error
/// 14-- close error
/// </returns>
public
int
ReadCoilStatus
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
byte
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnReadCoilStatus
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
num
,
buf
,
bIp
,
wport
);
return
ret
;
}
public
int
ReadInputStatus
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
char
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnReadInputStatus
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
1
,
buf
,
bIp
,
502
);
return
ret
;
}
public
int
ReadHoldingReg
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
UInt16
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnReadHoldingReg
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
num
,
buf
,
bIp
,
wport
);
return
ret
;
}
public
int
ReadInputReg
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
UInt16
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnReadInputReg
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
1
,
dest
,
bIp
,
wport
);
buf
[
0
]
=
dest
[
0
];
return
ret
;
}
public
int
WriteSingleCoil
(
ushort
addr
,
ushort
state
,
String
ip
,
ushort
wport
)
{
int
ret
=
0
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnWriteSingleCoil
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
state
,
bIp
,
wport
);
return
ret
;
}
public
int
WriteHoldingReg
(
ushort
addr
,
ushort
state
,
String
ip
,
ushort
wport
)
{
int
ret
=
0
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnWriteHoldingReg
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
state
,
bIp
,
wport
);
return
ret
;
}
public
int
ReadHoldingReg
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
char
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnWriteMultipleCoils
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
1
,
buf
,
bIp
,
wport
);
return
ret
;
}
public
int
WriteMultipleRegs
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
ushort
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnWriteMultipleRegs
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
num
,
buf
,
bIp
,
wport
);
return
ret
;
}
public
int
ReportSlaveID
(
ushort
addr
,
ushort
num
,
String
ip
,
ushort
wport
,
ref
char
[]
buf
)
{
int
ret
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnReportSlaveID
(
hModbusHandle
,
buf
,
bIp
,
502
);
return
ret
;
}
public
int
MaskWriteReg
(
ushort
addr
,
ushort
amask
,
ushort
omask
,
String
ip
,
ushort
wport
)
{
int
ret
=
0
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnMaskWriteReg
(
hModbusHandle
,
(
ushort
)(
addr
-
1
),
amask
,
omask
,
bIp
,
wport
);
return
ret
;
}
public
int
ReadWriteMultipleRegs
(
ushort
waddr
,
ushort
wnum
,
ushort
raddr
,
ushort
rnum
,
String
ip
,
ushort
wport
,
ref
UInt16
[]
buf
)
{
int
ret
=
0
;
byte
[]
bIp
=
Encoding
.
Unicode
.
GetBytes
(
ip
);
ret
=
fnReadWriteMultipleRegs
(
hModbusHandle
,
(
ushort
)(
waddr
-
1
),
wnum
,
raddr
,
rnum
,
buf
,
bIp
,
wnum
);
return
ret
;
}
}
}
ModbusDemo/ModbusDemo/Demo_818X.Designer.cs
deleted
100644 → 0
View file @
38a1531c
namespace
ModbusDemo
{
partial
class
Demo_818X
{
/// <summary>
/// Required designer variable.
/// </summary>
private
System
.
ComponentModel
.
IContainer
components
=
null
;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected
override
void
Dispose
(
bool
disposing
)
{
if
(
disposing
&&
(
components
!=
null
))
{
components
.
Dispose
();
}
base
.
Dispose
(
disposing
);
}
#
region
Windows
Form
Designer
generated
code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private
void
InitializeComponent
()
{
System
.
ComponentModel
.
ComponentResourceManager
resources
=
new
System
.
ComponentModel
.
ComponentResourceManager
(
typeof
(
Demo_818X
));
this
.
groupBox4
=
new
System
.
Windows
.
Forms
.
GroupBox
();
this
.
label32
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label33
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label7
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label6
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label5
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label1
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label2
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
comboBox1
=
new
System
.
Windows
.
Forms
.
ComboBox
();
this
.
button3
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
label4
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label3
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
groupBox1
=
new
System
.
Windows
.
Forms
.
GroupBox
();
this
.
label24
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label25
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label26
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label27
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label28
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label29
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label30
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label31
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label16
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label17
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label18
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label19
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label20
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label21
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label22
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label23
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label15
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label14
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label13
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label12
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label11
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label10
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label9
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label8
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
button1
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
pictureBox1
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
groupBox4
.
SuspendLayout
();
this
.
groupBox1
.
SuspendLayout
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox1
)).
BeginInit
();
this
.
SuspendLayout
();
//
// groupBox4
//
this
.
groupBox4
.
Controls
.
Add
(
this
.
label32
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label33
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label7
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label6
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label5
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label1
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label2
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
comboBox1
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
button3
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label4
);
this
.
groupBox4
.
Controls
.
Add
(
this
.
label3
);
this
.
groupBox4
.
Location
=
new
System
.
Drawing
.
Point
(
12
,
12
);
this
.
groupBox4
.
Name
=
"groupBox4"
;
this
.
groupBox4
.
Size
=
new
System
.
Drawing
.
Size
(
533
,
103
);
this
.
groupBox4
.
TabIndex
=
5
;
this
.
groupBox4
.
TabStop
=
false
;
this
.
groupBox4
.
Text
=
"模块搜索功能:"
;
//
// label32
//
this
.
label32
.
AutoSize
=
true
;
this
.
label32
.
Location
=
new
System
.
Drawing
.
Point
(
338
,
64
);
this
.
label32
.
Name
=
"label32"
;
this
.
label32
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label32
.
TabIndex
=
11
;
this
.
label32
.
Text
=
"0:0:0:0"
;
//
// label33
//
this
.
label33
.
AutoSize
=
true
;
this
.
label33
.
Location
=
new
System
.
Drawing
.
Point
(
303
,
64
);
this
.
label33
.
Name
=
"label33"
;
this
.
label33
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label33
.
TabIndex
=
10
;
this
.
label33
.
Text
=
"Mac:"
;
//
// label7
//
this
.
label7
.
AutoSize
=
true
;
this
.
label7
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
64
);
this
.
label7
.
Name
=
"label7"
;
this
.
label7
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label7
.
TabIndex
=
9
;
this
.
label7
.
Text
=
"0.0.0.0"
;
//
// label6
//
this
.
label6
.
AutoSize
=
true
;
this
.
label6
.
Location
=
new
System
.
Drawing
.
Point
(
76
,
64
);
this
.
label6
.
Name
=
"label6"
;
this
.
label6
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label6
.
TabIndex
=
8
;
this
.
label6
.
Text
=
"0.0.0.0"
;
//
// label5
//
this
.
label5
.
AutoSize
=
true
;
this
.
label5
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
31
);
this
.
label5
.
Name
=
"label5"
;
this
.
label5
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label5
.
TabIndex
=
7
;
this
.
label5
.
Text
=
"0.0.0.0"
;
//
// label1
//
this
.
label1
.
AutoSize
=
true
;
this
.
label1
.
Location
=
new
System
.
Drawing
.
Point
(
166
,
64
);
this
.
label1
.
Name
=
"label1"
;
this
.
label1
.
Size
=
new
System
.
Drawing
.
Size
(
53
,
12
);
this
.
label1
.
TabIndex
=
6
;
this
.
label1
.
Text
=
"Gateway:"
;
//
// label2
//
this
.
label2
.
AutoSize
=
true
;
this
.
label2
.
Location
=
new
System
.
Drawing
.
Point
(
17
,
65
);
this
.
label2
.
Name
=
"label2"
;
this
.
label2
.
Size
=
new
System
.
Drawing
.
Size
(
59
,
12
);
this
.
label2
.
TabIndex
=
5
;
this
.
label2
.
Text
=
"Netmask:"
;
//
// comboBox1
//
this
.
comboBox1
.
FormattingEnabled
=
true
;
this
.
comboBox1
.
Location
=
new
System
.
Drawing
.
Point
(
78
,
27
);
this
.
comboBox1
.
Name
=
"comboBox1"
;
this
.
comboBox1
.
Size
=
new
System
.
Drawing
.
Size
(
82
,
20
);
this
.
comboBox1
.
TabIndex
=
3
;
//
// button3
//
this
.
button3
.
Location
=
new
System
.
Drawing
.
Point
(
305
,
24
);
this
.
button3
.
Name
=
"button3"
;
this
.
button3
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
button3
.
TabIndex
=
2
;
this
.
button3
.
Text
=
"search"
;
this
.
button3
.
UseVisualStyleBackColor
=
true
;
this
.
button3
.
Click
+=
new
System
.
EventHandler
(
this
.
button3_Click
);
//
// label4
//
this
.
label4
.
AutoSize
=
true
;
this
.
label4
.
Location
=
new
System
.
Drawing
.
Point
(
166
,
30
);
this
.
label4
.
Name
=
"label4"
;
this
.
label4
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label4
.
TabIndex
=
1
;
this
.
label4
.
Text
=
"模块IP:"
;
//
// label3
//
this
.
label3
.
AutoSize
=
true
;
this
.
label3
.
Location
=
new
System
.
Drawing
.
Point
(
17
,
31
);
this
.
label3
.
Name
=
"label3"
;
this
.
label3
.
Size
=
new
System
.
Drawing
.
Size
(
65
,
12
);
this
.
label3
.
TabIndex
=
0
;
this
.
label3
.
Text
=
"模块名称:"
;
//
// groupBox1
//
this
.
groupBox1
.
Controls
.
Add
(
this
.
pictureBox1
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label24
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label25
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label26
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label27
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label28
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label29
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label30
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label31
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label16
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label17
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label18
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label19
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label20
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label21
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label22
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label23
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label15
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label14
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label13
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label12
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label11
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label10
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label9
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label8
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
button1
);
this
.
groupBox1
.
Location
=
new
System
.
Drawing
.
Point
(
12
,
135
);
this
.
groupBox1
.
Name
=
"groupBox1"
;
this
.
groupBox1
.
Size
=
new
System
.
Drawing
.
Size
(
533
,
281
);
this
.
groupBox1
.
TabIndex
=
6
;
this
.
groupBox1
.
TabStop
=
false
;
this
.
groupBox1
.
Text
=
"数据展示"
;
//
// label24
//
this
.
label24
.
AutoSize
=
true
;
this
.
label24
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
236
);
this
.
label24
.
Name
=
"label24"
;
this
.
label24
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label24
.
TabIndex
=
25
;
this
.
label24
.
Text
=
"label24"
;
//
// label25
//
this
.
label25
.
AutoSize
=
true
;
this
.
label25
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
211
);
this
.
label25
.
Name
=
"label25"
;
this
.
label25
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label25
.
TabIndex
=
24
;
this
.
label25
.
Text
=
"label25"
;
//
// label26
//
this
.
label26
.
AutoSize
=
true
;
this
.
label26
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
186
);
this
.
label26
.
Name
=
"label26"
;
this
.
label26
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label26
.
TabIndex
=
23
;
this
.
label26
.
Text
=
"label26"
;
//
// label27
//
this
.
label27
.
AutoSize
=
true
;
this
.
label27
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
161
);
this
.
label27
.
Name
=
"label27"
;
this
.
label27
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label27
.
TabIndex
=
22
;
this
.
label27
.
Text
=
"label27"
;
//
// label28
//
this
.
label28
.
AutoSize
=
true
;
this
.
label28
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
136
);
this
.
label28
.
Name
=
"label28"
;
this
.
label28
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label28
.
TabIndex
=
21
;
this
.
label28
.
Text
=
"label28"
;
//
// label29
//
this
.
label29
.
AutoSize
=
true
;
this
.
label29
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
111
);
this
.
label29
.
Name
=
"label29"
;
this
.
label29
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label29
.
TabIndex
=
20
;
this
.
label29
.
Text
=
"label29"
;
//
// label30
//
this
.
label30
.
AutoSize
=
true
;
this
.
label30
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
86
);
this
.
label30
.
Name
=
"label30"
;
this
.
label30
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label30
.
TabIndex
=
19
;
this
.
label30
.
Text
=
"label30"
;
//
// label31
//
this
.
label31
.
AutoSize
=
true
;
this
.
label31
.
Location
=
new
System
.
Drawing
.
Point
(
219
,
61
);
this
.
label31
.
Name
=
"label31"
;
this
.
label31
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label31
.
TabIndex
=
18
;
this
.
label31
.
Text
=
"label31"
;
//
// label16
//
this
.
label16
.
AutoSize
=
true
;
this
.
label16
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
236
);
this
.
label16
.
Name
=
"label16"
;
this
.
label16
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label16
.
TabIndex
=
17
;
this
.
label16
.
Text
=
"label16"
;
//
// label17
//
this
.
label17
.
AutoSize
=
true
;
this
.
label17
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
211
);
this
.
label17
.
Name
=
"label17"
;
this
.
label17
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label17
.
TabIndex
=
16
;
this
.
label17
.
Text
=
"label17"
;
//
// label18
//
this
.
label18
.
AutoSize
=
true
;
this
.
label18
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
186
);
this
.
label18
.
Name
=
"label18"
;
this
.
label18
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label18
.
TabIndex
=
15
;
this
.
label18
.
Text
=
"label18"
;
//
// label19
//
this
.
label19
.
AutoSize
=
true
;
this
.
label19
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
161
);
this
.
label19
.
Name
=
"label19"
;
this
.
label19
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label19
.
TabIndex
=
14
;
this
.
label19
.
Text
=
"label19"
;
//
// label20
//
this
.
label20
.
AutoSize
=
true
;
this
.
label20
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
136
);
this
.
label20
.
Name
=
"label20"
;
this
.
label20
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label20
.
TabIndex
=
13
;
this
.
label20
.
Text
=
"label20"
;
//
// label21
//
this
.
label21
.
AutoSize
=
true
;
this
.
label21
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
111
);
this
.
label21
.
Name
=
"label21"
;
this
.
label21
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label21
.
TabIndex
=
12
;
this
.
label21
.
Text
=
"label21"
;
//
// label22
//
this
.
label22
.
AutoSize
=
true
;
this
.
label22
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
86
);
this
.
label22
.
Name
=
"label22"
;
this
.
label22
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label22
.
TabIndex
=
11
;
this
.
label22
.
Text
=
"label22"
;
//
// label23
//
this
.
label23
.
AutoSize
=
true
;
this
.
label23
.
Location
=
new
System
.
Drawing
.
Point
(
113
,
61
);
this
.
label23
.
Name
=
"label23"
;
this
.
label23
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label23
.
TabIndex
=
10
;
this
.
label23
.
Text
=
"label23"
;
//
// label15
//
this
.
label15
.
AutoSize
=
true
;
this
.
label15
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
236
);
this
.
label15
.
Name
=
"label15"
;
this
.
label15
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label15
.
TabIndex
=
9
;
this
.
label15
.
Text
=
"label15"
;
//
// label14
//
this
.
label14
.
AutoSize
=
true
;
this
.
label14
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
211
);
this
.
label14
.
Name
=
"label14"
;
this
.
label14
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label14
.
TabIndex
=
8
;
this
.
label14
.
Text
=
"label14"
;
//
// label13
//
this
.
label13
.
AutoSize
=
true
;
this
.
label13
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
186
);
this
.
label13
.
Name
=
"label13"
;
this
.
label13
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label13
.
TabIndex
=
7
;
this
.
label13
.
Text
=
"label13"
;
//
// label12
//
this
.
label12
.
AutoSize
=
true
;
this
.
label12
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
161
);
this
.
label12
.
Name
=
"label12"
;
this
.
label12
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label12
.
TabIndex
=
6
;
this
.
label12
.
Text
=
"label12"
;
//
// label11
//
this
.
label11
.
AutoSize
=
true
;
this
.
label11
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
136
);
this
.
label11
.
Name
=
"label11"
;
this
.
label11
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label11
.
TabIndex
=
5
;
this
.
label11
.
Text
=
"label11"
;
//
// label10
//
this
.
label10
.
AutoSize
=
true
;
this
.
label10
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
111
);
this
.
label10
.
Name
=
"label10"
;
this
.
label10
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label10
.
TabIndex
=
4
;
this
.
label10
.
Text
=
"label10"
;
//
// label9
//
this
.
label9
.
AutoSize
=
true
;
this
.
label9
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
86
);
this
.
label9
.
Name
=
"label9"
;
this
.
label9
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label9
.
TabIndex
=
3
;
this
.
label9
.
Text
=
"label9"
;
//
// label8
//
this
.
label8
.
AutoSize
=
true
;
this
.
label8
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
61
);
this
.
label8
.
Name
=
"label8"
;
this
.
label8
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label8
.
TabIndex
=
2
;
this
.
label8
.
Text
=
"label8"
;
//
// button1
//
this
.
button1
.
Location
=
new
System
.
Drawing
.
Point
(
305
,
20
);
this
.
button1
.
Name
=
"button1"
;
this
.
button1
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
button1
.
TabIndex
=
1
;
this
.
button1
.
Text
=
"UpData"
;
this
.
button1
.
UseVisualStyleBackColor
=
true
;
this
.
button1
.
Click
+=
new
System
.
EventHandler
(
this
.
button1_Click
);
//
// pictureBox1
//
this
.
pictureBox1
.
Image
=
global
::
ModbusDemo
.
Properties
.
Resources
.
_057
;
this
.
pictureBox1
.
Location
=
new
System
.
Drawing
.
Point
(
305
,
61
);
this
.
pictureBox1
.
Name
=
"pictureBox1"
;
this
.
pictureBox1
.
Size
=
new
System
.
Drawing
.
Size
(
96
,
87
);
this
.
pictureBox1
.
SizeMode
=
System
.
Windows
.
Forms
.
PictureBoxSizeMode
.
Zoom
;
this
.
pictureBox1
.
TabIndex
=
26
;
this
.
pictureBox1
.
TabStop
=
false
;
//
// Demo_818X
//
this
.
AutoScaleDimensions
=
new
System
.
Drawing
.
SizeF
(
6F
,
12F
);
this
.
AutoScaleMode
=
System
.
Windows
.
Forms
.
AutoScaleMode
.
Font
;
this
.
ClientSize
=
new
System
.
Drawing
.
Size
(
558
,
429
);
this
.
Controls
.
Add
(
this
.
groupBox1
);
this
.
Controls
.
Add
(
this
.
groupBox4
);
this
.
Icon
=
((
System
.
Drawing
.
Icon
)(
resources
.
GetObject
(
"$this.Icon"
)));
this
.
Name
=
"Demo_818X"
;
this
.
Text
=
"模块测试Demo"
;
this
.
groupBox4
.
ResumeLayout
(
false
);
this
.
groupBox4
.
PerformLayout
();
this
.
groupBox1
.
ResumeLayout
(
false
);
this
.
groupBox1
.
PerformLayout
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox1
)).
EndInit
();
this
.
ResumeLayout
(
false
);
}
#
endregion
private
System
.
Windows
.
Forms
.
GroupBox
groupBox4
;
private
System
.
Windows
.
Forms
.
Label
label4
;
private
System
.
Windows
.
Forms
.
Label
label3
;
private
System
.
Windows
.
Forms
.
Button
button3
;
private
System
.
Windows
.
Forms
.
ComboBox
comboBox1
;
private
System
.
Windows
.
Forms
.
GroupBox
groupBox1
;
private
System
.
Windows
.
Forms
.
Label
label1
;
private
System
.
Windows
.
Forms
.
Label
label2
;
private
System
.
Windows
.
Forms
.
Label
label5
;
private
System
.
Windows
.
Forms
.
Label
label7
;
private
System
.
Windows
.
Forms
.
Label
label6
;
private
System
.
Windows
.
Forms
.
Button
button1
;
private
System
.
Windows
.
Forms
.
Label
label15
;
private
System
.
Windows
.
Forms
.
Label
label14
;
private
System
.
Windows
.
Forms
.
Label
label13
;
private
System
.
Windows
.
Forms
.
Label
label12
;
private
System
.
Windows
.
Forms
.
Label
label11
;
private
System
.
Windows
.
Forms
.
Label
label10
;
private
System
.
Windows
.
Forms
.
Label
label9
;
private
System
.
Windows
.
Forms
.
Label
label8
;
private
System
.
Windows
.
Forms
.
Label
label24
;
private
System
.
Windows
.
Forms
.
Label
label25
;
private
System
.
Windows
.
Forms
.
Label
label26
;
private
System
.
Windows
.
Forms
.
Label
label27
;
private
System
.
Windows
.
Forms
.
Label
label28
;
private
System
.
Windows
.
Forms
.
Label
label29
;
private
System
.
Windows
.
Forms
.
Label
label30
;
private
System
.
Windows
.
Forms
.
Label
label31
;
private
System
.
Windows
.
Forms
.
Label
label16
;
private
System
.
Windows
.
Forms
.
Label
label17
;
private
System
.
Windows
.
Forms
.
Label
label18
;
private
System
.
Windows
.
Forms
.
Label
label19
;
private
System
.
Windows
.
Forms
.
Label
label20
;
private
System
.
Windows
.
Forms
.
Label
label21
;
private
System
.
Windows
.
Forms
.
Label
label22
;
private
System
.
Windows
.
Forms
.
Label
label23
;
private
System
.
Windows
.
Forms
.
Label
label32
;
private
System
.
Windows
.
Forms
.
Label
label33
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox1
;
}
}
\ No newline at end of file
ModbusDemo/ModbusDemo/Demo_818X.cs
deleted
100644 → 0
View file @
38a1531c
using
System
;
using
System.Collections.Generic
;
using
System.ComponentModel
;
using
System.Data
;
using
System.Drawing
;
using
System.Linq
;
using
System.Text
;
using
ModbusDemo.Common
;
using
System.Threading
;
using
System.Windows.Forms
;
using
System.Net.Sockets
;
using
System.Net
;
namespace
ModbusDemo
{
public
partial
class
Demo_818X
:
Form
{
WTModbus
ReadTest
=
new
WTModbus
();
ModSearch
n_ModSearch
=
new
ModSearch
();
ModSearch
.
DeviceInfo
n_DeviceInfo
;
const
int
MAX_AN_CH_NUM
=
8
;
ushort
[]
typeData
=
new
ushort
[
8
];
//当前量程读数
byte
[]
AbnoSignal
=
new
byte
[
8
];
//通道异常信号
ushort
[]
Inputtype
=
new
ushort
[
8
];
//输入类型
ushort
[]
m_u16ADData
=
new
ushort
[
MAX_AN_CH_NUM
];
//保存AD的值
string
[]
Strcom
=
new
string
[]
{
"A_10V"
,
"A_5V"
,
"A_2_5V"
,
"A_1V"
,
"A_500mV"
,
"A_100mV"
,
"A_20mV"
,
"T-K"
,
"T-J"
,
"T-R"
,
"T-S"
,
"T-B"
,
"T_E"
,
"T_T"
,
"T_N"
,
"I_0_20mA"
,
"I_4_20mA"
,
"null"
};
string
[]
unit
=
new
string
[]
{
"null"
,
"℃"
,
"V"
,
"MV"
,
"MA"
};
public
class
UserInfo
{
public
int
UserId
{
get
;
set
;
}
public
string
UserCompany
{
get
;
set
;
}
public
float
Data
{
get
;
set
;
}
public
ushort
UserModel
{
get
;
set
;
}
public
double
[]
NegMin
=
{-
10.000
,
-
5.000
,
-
2.500
,
-
1.000
,
-
500.00
,
-
100.00
,
-
20.00
,
0
,
0
,
0
,
0
,
0
,
0
,
-
100
,
0
,
-
20
,
-
20
};
//负数最小值
public
double
[]
NegMax
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
//负数最大值
public
double
[]
PosMin
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
500
,
500
,
500
,
0
,
0
,
0
,
0
,
0
};
//正数最小值
public
double
[]
PosMax
=
{
10.000
,
5.000
,
2.500
,
1.000
,
500.00
,
100.00
,
20.000
,
1370
,
760
,
1750
,
1750
,
1800
,
1000
,
400
,
200
,
20
,
20
};
//正数最大值
public
ushort
[]
usMin
=
{
0x8000
,
0x8000
,
0x8000
,
0x8000
,
0x8000
,
0x8000
,
0x8000
,
0x0000
,
0x0000
,
0x2492
,
0x2492
,
0x2381
,
0x0000
,
0xE000
,
0x0000
,
0x8000
,
0x8000
};
public
ushort
[]
usMax
=
{
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x0000
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
,
0x7FFF
};
}
UserInfo
users
=
new
UserInfo
();
UserInfo
users1
=
new
UserInfo
();
UserInfo
users2
=
new
UserInfo
();
UserInfo
users3
=
new
UserInfo
();
UserInfo
users4
=
new
UserInfo
();
UserInfo
users5
=
new
UserInfo
();
UserInfo
users6
=
new
UserInfo
();
UserInfo
users7
=
new
UserInfo
();
public
Demo_818X
()
{
InitializeComponent
();
}
private
void
button3_Click
(
object
sender
,
EventArgs
e
)
{
n_ModSearch
.
ThStart
();
label5
.
Text
=
n_ModSearch
.
m_DeviceInfo
.
IpAddr
;
comboBox1
.
Text
=
n_ModSearch
.
m_DeviceInfo
.
ModuleName
;
label6
.
Text
=
n_ModSearch
.
m_DeviceInfo
.
Netmask
;
label7
.
Text
=
n_ModSearch
.
m_DeviceInfo
.
Gateway
;
label32
.
Text
=
n_ModSearch
.
m_DeviceInfo
.
MacAddr
;
}
private
void
button1_Click
(
object
sender
,
EventArgs
e
)
{
int
ret
=
0
;
n_ModSearch
.
ThStop
();
ret
=
ReadTest
.
ReadHoldingReg
(
1
,
8
,
n_ModSearch
.
m_DeviceInfo
.
IpAddr
,
502
,
ref
typeData
);
//当前量程读数
ret
=
ReadTest
.
ReadHoldingReg
(
11
,
8
,
n_ModSearch
.
m_DeviceInfo
.
IpAddr
,
502
,
ref
Inputtype
);
//输入类型
ret
=
ReadTest
.
ReadCoilStatus
(
200
,
8
,
n_ModSearch
.
m_DeviceInfo
.
IpAddr
,
502
,
ref
AbnoSignal
);
//异常信号备用
ShowValue
();
}
public
void
ShowValue
()
{
/********************/
users
.
UserId
=
0
;
//通道
users
.
Data
=
typeData
[
0
];
//数据
users
.
UserCompany
=
Strcom
[
Inputtype
[
0
]];
//通道类型
users
.
UserModel
=
Inputtype
[
0
];
//确定计算公式
/********************/
users1
.
UserId
=
1
;
//通道
users1
.
Data
=
typeData
[
1
];
//数据
users1
.
UserCompany
=
Strcom
[
Inputtype
[
1
]];
//通道类型
users1
.
UserModel
=
Inputtype
[
1
];
//确定计算公式
/********************/
users2
.
UserId
=
2
;
//通道
users2
.
Data
=
typeData
[
2
];
//数据
users2
.
UserCompany
=
Strcom
[
Inputtype
[
2
]];
//通道类型
users2
.
UserModel
=
Inputtype
[
2
];
//确定计算公式
/********************/
users3
.
UserId
=
3
;
//通道
users3
.
Data
=
typeData
[
3
];
//数据
users3
.
UserCompany
=
Strcom
[
Inputtype
[
3
]];
//通道类型
users3
.
UserModel
=
Inputtype
[
3
];
//确定计算公式
/********************/
users4
.
UserId
=
4
;
//通道
users4
.
Data
=
typeData
[
4
];
//数据
users4
.
UserCompany
=
Strcom
[
Inputtype
[
4
]];
//通道类型
users4
.
UserModel
=
Inputtype
[
4
];
//确定计算公式
/********************/
users5
.
UserId
=
5
;
//通道
users5
.
Data
=
typeData
[
5
];
//数据
users5
.
UserCompany
=
Strcom
[
Inputtype
[
5
]];
//通道类型
users5
.
UserModel
=
Inputtype
[
5
];
//确定计算公式
/********************/
users6
.
UserId
=
6
;
//通道
users6
.
Data
=
typeData
[
6
];
//数据
users6
.
UserCompany
=
Strcom
[
Inputtype
[
6
]];
//通道类型
users6
.
UserModel
=
Inputtype
[
6
];
//确定计算公式
/********************/
users7
.
UserId
=
7
;
//通道
users7
.
Data
=
typeData
[
7
];
//数据
users7
.
UserCompany
=
Strcom
[
Inputtype
[
7
]];
//通道类型
users7
.
UserModel
=
Inputtype
[
7
];
//确定计算公式
//显示通道类型
this
.
label8
.
Text
=
Strcom
[
Inputtype
[
0
]];
this
.
label9
.
Text
=
Strcom
[
Inputtype
[
1
]];
this
.
label10
.
Text
=
Strcom
[
Inputtype
[
2
]];
this
.
label11
.
Text
=
Strcom
[
Inputtype
[
3
]];
this
.
label12
.
Text
=
Strcom
[
Inputtype
[
4
]];
this
.
label13
.
Text
=
Strcom
[
Inputtype
[
5
]];
this
.
label14
.
Text
=
Strcom
[
Inputtype
[
6
]];
this
.
label15
.
Text
=
Strcom
[
Inputtype
[
7
]];
//通道单位获取
this
.
label31
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users
.
UserModel
),
users
.
Data
)[
1
];
this
.
label30
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users1
.
UserModel
),
users1
.
Data
)[
1
];
this
.
label29
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users2
.
UserModel
),
users2
.
Data
)[
1
];
this
.
label28
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users3
.
UserModel
),
users3
.
Data
)[
1
];
this
.
label27
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users4
.
UserModel
),
users4
.
Data
)[
1
];
this
.
label26
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users5
.
UserModel
),
users5
.
Data
)[
1
];
this
.
label25
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users6
.
UserModel
),
users6
.
Data
)[
1
];
this
.
label24
.
Text
=
Conversion
(
Convert
.
ToUInt16
(
users7
.
UserModel
),
users7
.
Data
)[
1
];
////根据通道类型换算数据
//////输入格式为:NegMin NegMax PosMin PosMax usMin usMax
this
.
label23
.
Text
=
current
(
users
.
NegMin
[
users
.
UserModel
],
users
.
NegMax
[
users
.
UserModel
],
users
.
PosMin
[
users
.
UserModel
],
users
.
PosMax
[
users
.
UserModel
],
users
.
usMin
[
users
.
UserModel
],
users
.
usMax
[
users
.
UserModel
],
users
.
Data
);
//处理函数
this
.
label22
.
Text
=
current
(
users1
.
NegMin
[
users1
.
UserModel
],
users1
.
NegMax
[
users1
.
UserModel
],
users1
.
PosMin
[
users1
.
UserModel
],
users1
.
PosMax
[
users1
.
UserModel
],
users1
.
usMin
[
users1
.
UserModel
],
users1
.
usMax
[
users1
.
UserModel
],
users1
.
Data
);
//处理函数
this
.
label21
.
Text
=
current
(
users2
.
NegMin
[
users2
.
UserModel
],
users2
.
NegMax
[
users2
.
UserModel
],
users2
.
PosMin
[
users2
.
UserModel
],
users2
.
PosMax
[
users2
.
UserModel
],
users2
.
usMin
[
users2
.
UserModel
],
users2
.
usMax
[
users2
.
UserModel
],
users2
.
Data
);
//处理函数
this
.
label20
.
Text
=
current
(
users3
.
NegMin
[
users3
.
UserModel
],
users3
.
NegMax
[
users3
.
UserModel
],
users3
.
PosMin
[
users3
.
UserModel
],
users3
.
PosMax
[
users3
.
UserModel
],
users3
.
usMin
[
users3
.
UserModel
],
users3
.
usMax
[
users3
.
UserModel
],
users3
.
Data
);
//处理函数
this
.
label19
.
Text
=
current
(
users4
.
NegMin
[
users4
.
UserModel
],
users4
.
NegMax
[
users4
.
UserModel
],
users4
.
PosMin
[
users4
.
UserModel
],
users4
.
PosMax
[
users4
.
UserModel
],
users4
.
usMin
[
users4
.
UserModel
],
users4
.
usMax
[
users4
.
UserModel
],
users4
.
Data
);
//处理函数
this
.
label18
.
Text
=
current
(
users5
.
NegMin
[
users5
.
UserModel
],
users5
.
NegMax
[
users5
.
UserModel
],
users5
.
PosMin
[
users5
.
UserModel
],
users5
.
PosMax
[
users5
.
UserModel
],
users5
.
usMin
[
users5
.
UserModel
],
users5
.
usMax
[
users5
.
UserModel
],
users5
.
Data
);
//处理函数
this
.
label17
.
Text
=
current
(
users6
.
NegMin
[
users6
.
UserModel
],
users6
.
NegMax
[
users6
.
UserModel
],
users6
.
PosMin
[
users6
.
UserModel
],
users6
.
PosMax
[
users6
.
UserModel
],
users6
.
usMin
[
users6
.
UserModel
],
users6
.
usMax
[
users6
.
UserModel
],
users6
.
Data
);
//处理函数
this
.
label16
.
Text
=
current
(
users7
.
NegMin
[
users7
.
UserModel
],
users7
.
NegMax
[
users7
.
UserModel
],
users7
.
PosMin
[
users7
.
UserModel
],
users7
.
PosMax
[
users7
.
UserModel
],
users7
.
usMin
[
users7
.
UserModel
],
users7
.
usMax
[
users7
.
UserModel
],
users7
.
Data
);
//处理函数
}
double
parameter
;
string
parameter2
;
//输入格式为:NegMin NegMax PosMin PosMax usMin usMax
public
string
current
(
double
NegMin
,
double
NegMax
,
double
PosMin
,
double
PosMax
,
double
usMin
,
double
usMax
,
float
Input
)
//处理函数
{
if
(
Input
>=
0x0000
&&
Input
<=
0x7FFF
)
{
parameter
=
Convert
.
ToSingle
(
PosMin
+
((
PosMax
-
PosMin
)
*
Input
)
/
usMax
);
parameter2
=
parameter
.
ToString
(
"F3"
);
}
else
{
parameter
=
-
Convert
.
ToSingle
(
PosMin
+
((
PosMax
-
PosMin
)
*
(
0x10000
-
Input
))
/
(
0x10000
-
usMax
));
parameter2
=
parameter
.
ToString
(
"F3"
);
}
if
(
parameter2
==
"0.000"
)
{
parameter2
=
"Burn_out"
;
return
parameter2
;
}
else
return
parameter2
;
}
/**********************************************************************/
public
string
Calculation
(
double
maxNum
,
double
minNum
,
float
Input
)
{
double
parameter
;
string
parameter2
;
parameter
=
Convert
.
ToSingle
(
double
.
Parse
(
Input
.
ToString
())
*
minNum
/
maxNum
);
parameter2
=
parameter
.
ToString
(
"F3"
);
return
parameter2
;
}
string
[]
text
=
new
string
[
3
];
/**********************************************************************/
public
string
[]
Conversion
(
UInt16
type
,
float
typedata
)
//, ushort[] typedata
{
switch
(
type
)
{
case
0
:
//"V","A_10V"
text
[
0
]
=
Calculation
(
10.000
,
-
10.000
,
typedata
);
text
[
1
]
=
"V"
;
break
;
case
1
:
//"V","A_5V"
text
[
0
]
=
Calculation
(
5.000
,
-
5.000
,
typedata
);
text
[
1
]
=
"V"
;
break
;
case
2
:
//"V","A_2_5V"
text
[
0
]
=
Calculation
(-
2.500
,
2.500
,
typedata
);
text
[
1
]
=
"V"
;
break
;
case
3
:
//"V","A_1V"
text
[
0
]
=
Calculation
(
1
,
-
1
,
typedata
);
text
[
1
]
=
"V"
;
break
;
case
4
:
//"MV","A_500mV"
text
[
0
]
=
Calculation
(
500.00
,
-
500.00
,
typedata
);
text
[
1
]
=
"MV"
;
break
;
case
5
:
//"MV","A_100mV"
text
[
0
]
=
Calculation
(
100.00
,
-
100.00
,
typedata
);
text
[
1
]
=
"MV"
;
break
;
case
6
:
//"MV","A_20mV"
//text[0] = "MV";
text
[
1
]
=
"MV"
;
break
;
case
7
:
//"℃","T-K"
text
[
0
]
=
Calculation
(
0x7FFF
,
1370.0f
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
8
:
//"℃" ,"T-J"
text
[
0
]
=
Calculation
(
0x7FFF
,
7600.0f
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
9
:
//"℃" ,"T-R"
text
[
0
]
=
Calculation
(
0x7FFF
,
1750.0f
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
10
:
//"℃" ,"T-S"
text
[
0
]
=
Calculation
(
0x7FFF
,
1750.0f
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
11
:
//"℃","T-B"
text
[
0
]
=
Calculation
(
0x7FFF
,
1800.0f
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
12
:
//"℃" ,"T_E"
text
[
0
]
=
Calculation
(
0x7FFF
,
1000.0d
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
13
:
//"℃" ,"T_T"
text
[
0
]
=
Calculation
(
0x7FFF
,
400.0f
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
14
:
//"℃" ,"T_N"
text
[
0
]
=
Calculation
(
0x7FFF
,
1800
,
typedata
);
text
[
1
]
=
"℃"
;
break
;
case
15
:
// "MA","I_0_20mA"
text
[
0
]
=
Calculation
(
0x7FFF
,
1800
,
typedata
);
text
[
1
]
=
"MA"
;
break
;
case
16
:
// "MA", "I_4_20mA"
text
[
0
]
=
Calculation
(
0x7FFF
,
1800
,
typedata
);
text
[
1
]
=
"MA"
;
break
;
default
:
MessageBox
.
Show
(
"我没有这个范围"
);
break
;
}
/*****************有效判断*****************************/
if
(
text
[
0
]
==
"0.000"
)
{
text
[
0
]
=
"Burn_out"
;
return
text
;
}
else
return
text
;
//通过Case做判断并输出一个数组
}
}
}
ModbusDemo/ModbusDemo/Demo_818X.resx
deleted
100644 → 0
View file @
38a1531c
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<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>
AAABAAEAY2YAAAEAIABQpAAAFgAAACgAAABjAAAAzAAAAAEAIAAAAAAAyJ0AAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAI0AAADVAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANUAAACOAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAUQAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAAUQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAAxQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAA2QAA
ANkAAADZAgIC1uLi4vv//////////+Xl5f/l5eX////////////l5eX/5eXl////////////5eXl/+Xl
5f///////////+Xl5f/i4uL7AgIC0QAAANkAAADZAAAA2QAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAA2QAAANkAAADZISEhv+Xl5f///////////+Xl
5f/l5eX////////////l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl5f/l5eX/JycnuAAA
ANkAAADZAAAA2QAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAACOAAAA2QAAANkAAADZcXFxt//////l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl
5f/l5eX////////////l5eX/5eXl////////////YmJivgAAAN0AAADZAAAA2QAAAI4AAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADCAAAA2QAAANkAAADZxcXF0v//
///l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl5f/l5eX////////////l5eX/5eXl////
////////rq6u1gAAAN0AAADZAAAA2QAAAMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAB8AAADZAAAA2QAAANkCAgLR4uLi++Xl5f///////////+Xl5f/l5eX/////////
///l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl5f/l5eX//Pz8+wICAtEAAADZAAAA2QAA
ANkAAAAiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAADZAAAA2QAA
ANknJye45eXl/+Xl5f///////////+Xl5f/l5eX////////////l5eX/5eXl////////////5eXl/+Xl
5f///////////+Xl5f/l5eX//////ycnJ7gAAADZAAAA2QAAANkAAABWAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIsAAADZAAAA2QAAANlxcXG3////////////////////////
/////////////////////////////////////////////////////////////////////////////3Fx
cbcAAADZAAAA2QAAANkAAACLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AMEAAADZAAAA2QAAANnFxcXS////////////////////////////////////////////////////////
/////////////////////////////////////////////8XFxdIAAADZAAAA2QAAANkAAADBAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAANkAAADZAAAA2QICAtH8/Pz7////////
////////////////////////////////////////////////////////////////////////////////
//////////////z8/PsCAgLRAAAA2QAAANkAAADZAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAVgAAANkAAADZAAAA2ScnJ7j/////////////////////////////////////////////
//////////////////////////////////////////////////////////////////8nJye4AAAA2QAA
ANkAAADZAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUAAACFAAAA0wAAANkAAADZAAAA2XFx
cbf/////////////////////////////////////////////////////////////////////////////
//////////////////////////////////9xcXG3AAAA2QAAANkAAADZAAAA0wAAAIUAAAAlAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAiAAAAkwAAANgAAADZAAAA2QAAANkAAADZAAAA2Nra2t7/////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///a2treAAAA2AAAANkAAADZAAAA2QAAANkAAADYAAAAkwAAACMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYAAAALAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAANEAAADZAAAAvgAAAH0AAABAAAAACAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAIIAAADWAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZYGBgtf//////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////YWFhtQAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANYAAACDAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAACAAAAEAAAAB9AAAAvQAAANkAAADRAAAAPwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAwgAA
ANkAAADZAAAA2QAAANkAAADZAAAA0gAAAJ0AAABfAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABLAAAAxgAAANkAAADZAAAA2QAAANkAAADZAAAA2QwMDMWUlJS+////////////////////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////5SUlL8MDAzFAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAAxgAA
AEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAF4AAACdAAAA0gAAANkAAADZAAAA2QAA
ANkAAADZAAAAwgAAAAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABxAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAALoAAAB8AAAAPgAAAAgAAAAAAAAADQAAAI4AAADZAAAA2QAAANkAAADZAAAA2QAA
ANkaGhq8pKSkxP39/f3/////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///9/f39pKSkxBoaGrwAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAACOAAAADQAAAAAAAAAIAAAAPgAA
AHwAAAC6AAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAAHEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ABsAAADRAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANEAAACZAAAAvAAAANkAAADZAAAA2QAAANkAAADZDg4Owqenp8X+/v7+////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////7+/v6lpaXEDg4OwgAA
ANkAAADZAAAA2QAAANkAAADZAAAAvAAAAJkAAADRAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADbAAAA3QAAANoAAADZAAAA2QAAANEAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJEAAADZAAAA2QAAANkICAjJoqKixk5O
TrQMDAzHAAAA3AAAANoAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QIC
AtNubm63+/v7+v//////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////+vr6+WxsbLYBAQHUAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QwMDMVGRka5kpKSyggICMsAAADZAAAA2QAA
ANkAAACRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANQAAANkAAADZAAAA2QAAANmPj4/A5eXl/+3t7f/t7e3/wMDA4XZ2drwlJSW4AQEB1AAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZFRUVvtra2t7/////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////Z2dndFBQUvwAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAQEB1CQk
JLpvb2++ycnJ3//////4+Pj/9/f3/5SUlL8AAADZAAAA2QAAANkAAADZAAAANQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAsAAAANkAAADZAAAA2RgY
GL319fX+5+fn//Ly8v//////8vLy//39/f//////9vb29KqqqsVKSkq0CgoKxgAAANkAAADZAAAA2QAA
ANhZWVm1+vr6+f//////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////+fn5+FRU
VLQAAADYAAAA2QAAANkAAADZCgoKxkpKSrSqqqrF9vb29Pv7+//m5ub/5+fn//Ly8v/l5eX/8vLy//z8
/P4YGBi/AAAA2QAAANkAAADZAAAAsAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABWAAAA2QAAANkAAADZAAAA2MXFxdL/////+vr6//Pz8//+/v7/6+vr/+fn
5//5+fn//////////////////////9bW1tyMjIy8jo6Ovd7e3uH/////////////////////////////
///////////////////////////////////////////////////+/fz/9+zj//DayP/pzLL/5cCh/+G3
lP/fsoz/3a6G/96wiP/ftI//4biV/+XAof/pzLL/8NrI//fs4//+/fz/////////////////////////
///////////////////////////////////////////////////e3t7hmZmZwIyMjLzW1tbc////////
///////////////////39/f//f39//n5+f/m5ub/8fHx/+rq6v+urq7WAAAA2gAAANkAAADZAAAA2QAA
AFYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADGAAAA2QAA
ANkAAADZOzs7tezs7P/4+Pj/7u7u/+Xl5f/v7+//7Ozs/+fn5//+/v7/////////////////////////
////////////////////////////////////////////////////////////////////////////////
///+/fz/9ObZ/+jIrf/esYv/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/esYv/6Mit//Pj1v/+/Pv/////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////j4
+P/09PT///////b29v/s7Oz/Ozs7tgAAANkAAADZAAAA2QAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHYAAADZAAAA2QAAANkCAgLS2dnZ6OXl5f/r6+v/9/f3/+rq
6v/8/Pz///////z8/P//////////////////////////////////////////////////////////////
/////////////////////////////////////////Pfz/+3Uv//gtI//3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/ftI//7dS+//z38///////////////////////////////////////////////////////////////
////////////////////////////////////////+Pj4/+Xl5f/o6Oj/+vr6/+3t7f/5+fn/5ubm5wIC
AtEAAADZAAAA2QAAANkAAAB3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAA
ANQAAADZAAAA2QAAANltbW23/v7+//Pz8//5+fn///////Ly8v/x8fH//f39////////////////////
//////////////////////////////////////////////////////////////////////////////37
+P/t1L7/3rGK/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/96xiv/t1L7//fv4////
////////////////////////////////////////////////////////////////////////////////
/////////////+zs7P/z8/P/8vLy/+Xl5f/r6+v/8fHx/19fX74AAADaAAAA2QAAANkAAADUAAAAIAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAANkAAADZAAAA2QwMDMbw8PD3//////X1
9f/o6Oj/9fX1/+bm5v/l5eX/+fn5////////////////////////////////////////////////////
////////////////////////////////////////9OXZ/+C2kv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/4LaS//Tl2f//////////////////////////////
/////////////////////////////////////////////////////////////////////////v7+/+/v
7//8/Pz/7+/v/97e3vgKCgrIAAAA2QAAANkAAADZAAAAmQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA8AAAA2QAAANkAAADZAAAA2ZqamsTl5eX/7Ozs/+3t7f/l5eX/9vb2//r6+v/y8vL/////////
//////////////////////////////////////////////////////////////////////////////78
+//rz7f/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/rz7f//vz7////////////////////////////////////////////////////
///////////////////////////////////7+/v/6urq/+7u7v//////9/f3//j4+P+hoaHDAAAA2QAA
ANkAAADZAAAA2QAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAC1AAAA2QAAANkAAADZICAguvf3
9//o6Oj/8/Pz///////z8/P//Pz8////////////////////////////////////////////////////
////////////////////////////////////////+/bx/+S+nf/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/5L6e//v2
8v//////////////////////////////////////////////////////////////////////////////
///8/Pz/5ubm/+jo6P/x8fH/5eXl//Hx8f/8/Pz/Hh4evgAAANkAAADZAAAA2QAAALUAAAADAAAAAAAA
AAAAAAAAAAAAAAAAAF0AAADZAAAA2QAAANkAAADXzs7O1//////6+vr/8fHx//7+/v/q6ur/5ubm//n5
+f//////////////////////////////////////////////////////////////////////////////
///58er/4beT/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+G4lf/68uz/////////////////////////
////////////////////////////////////////////////////////+fn5//7+/v/6+vr/5ubm//Pz
8//q6ur/t7e33AAAANkAAADZAAAA2QAAANkAAABdAAAAAAAAAAAAAAAAAAAADwAAAMoAAADZAAAA2QAA
ANlGRka16urq//b29v/t7e3/5eXl//Dw8P/u7u7/6Ojo//7+/v//////////////////////////////
//////////////////////////////////////////////rz7f/gtZD/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3K2G/7iZfvV9a1zdQzs0zh0ZF8sJBwbRAgIC1gIC
AtYJBwbRHRkXy0M7NM59a1zduJl+9dythv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/gtZD/+vPt////////////////////////////////////////////////////
///////////////////////////////////29vb/9PT0///////39/f/7u7u/0ZGRrUAAADZAAAA2QAA
ANkAAADKAAAAEAAAAAAAAAAAAAAAfgAAANkAAADZAAAA2QQEBM/e3t7s5eXl/+zs7P/5+fn/7Ozs//39
/f///////v7+////////////////////////////////////////////////////////////////////
////////+/by/+G4lf/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/8ym
hfxvYFTYDw4MzgAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2Q8O
DM5vYFTYzKaF/N2uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/4biV//v2
8v////////////////////////////////////////////////////////////////////////////j4
+P/l5eX/5+fn//n5+f/r6+v/+Pj4/+zs7OwEBATPAAAA2QAAANkAAADZAAAAfgAAAAAAAAAkAAAA1gAA
ANkAAADZAAAA2Xp6erj/////9fX1//j4+P//////8fHx/+/v7//9/f3/////////////////////////
///////////////////////////////////////////////////+/Pv/5L6d/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/SqYb+XlJJ0wICAtYAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAgIC1l5SSdPSqYb+3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+S+nv/+/Pv/////////////////////////
///////////////////////////////////////////////////t7e3/9fX1//Pz8//l5eX/7Ozs/+/v
7/9qamrAAAAA2gAAANkAAADZAAAA1gAAACUAAACNAAAA2QAAANkAAADZCgoKx/Ly8vr+/v7/9PT0/+bm
5v/z8/P/5ubm/+Xl5f/6+vr/////////////////////////////////////////////////////////
///////////////////rz7f/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/52F
ceoKCQfQAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkKCQfQnYVx6t2uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/rz7f/////////////////////////////////////////////////////////
//////////////////////////////7+/v/w8PD//v7+//Dw8P/h4eH7CQkJyQAAANkAAADZAAAA2QAA
AI4AAACfAAAA2QAAANkAAADZAAAA2nR0dMLr6+v/7u7u/+Xl5f/4+Pj/+/v7//T09P//////////////
//////////////////////////////////////////////////////////////Tm2f/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/brYb/XVFH0wAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
AMwAAACOAAAAVgAAAC4AAAARAAAABAAAAAQAAAARAAAALgAAAFYAAACOAAAAzAAAANkAAADZAAAA2QAA
ANkAAADZAAAA2V1RR9PbrYb/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/9OXZ////
////////////////////////////////////////////////////////////////////////+vr6/+np
6f/s7Oz///////b29v+CgoK8AAAA2AAAANkAAADZAAAA2QAAAKIAAAA6AAAA1AAAANkAAADZAAAA2gAA
ANx3d3e8//////T09P/7+/v/////////////////////////////////////////////////////////
/////////////////////////fv5/+C2kv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/9er
hv88NS7MAAAA2QAAANkAAADZAAAA2QAAANkAAAC6AAAAUwAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAFMAAAC6AAAA2QAAANkAAADZAAAA2QAAANk7My7M16uG/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/4LaS//37+P//////////////////////////////
/////////////////////////////////////////f39/+bm5v/p6en/8PDw/2xsbMAAAADbAAAA2QAA
ANkAAADZAAAA1AAAADYAAAAAAAAAPwAAANEAAADZAAAA2QAAANkAAADZcXFxt+np6f/m5ub/+Pj4////
////////////////////////////////////////////////////////////////////////7dS//92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/262G/zw1LswAAADZAAAA2QAAANkAAADZAAAA0QAA
AGMAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAEAAAAYwAAANEAAADZAAAA2QAAANkAAADZPDUuzNuthv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/+3Uvv//////////////////////////////////////////////////////////////
//////////////r6+v/+/v7/b29vuAAAAN0AAADbAAAA2QAAANkAAADRAAAAQAAAAAAAAAAAAAAAAAAA
ADgAAADRAAAA2QAAANkAAADZAAAA2WFhYbrp6en//v7+////////////////////////////////////
///////////////////////////////////89/P/3rGK/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/XVFH0wAAANkAAADZAAAA2QAAANkAAAC7AAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAAC7AAAA2QAA
ANkAAADZAAAA2V1RR9Pdrob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/96xiv/89/P/////////
//////////////////////////////////////////////////////////////////9hYWG1AAAA2QAA
ANkAAADZAAAA2QAAANEAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1AAAAzAAAANkAAADZAAAA2QAA
ANlcXFy1////////////////////////////////////////////////////////////////////////
///t1L//3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv+dhXHqAAAA2QAAANkAAADZAAAA2QAA
ALAAAAASAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAArwAAANkAAADZAAAA2QAAANmdhXHq3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/t1L//////////////////////////////////////////
/////////////////////////////1xcXLUAAADZAAAA2QAAANkAAADZAAAAzAAAADYAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAALwAAAMwAAADZAAAA2QAAANkAAADZVVVVtP7+/v7/////////////
//////////////////////////////////////////////79/P/ftI//3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/9Kphv4KCQfQAAAA2QAAANkAAADZAAAAuwAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAEgAAALoAAADZAAAA2QAAANkKCQfQ0qmG/t2uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/ftI///vz7///////////////////////////////////////////////////////+/v7+SkpKtAAA
ANkAAADZAAAA2QAAANkAAADMAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ACwAAADHAAAA2QAAANkAAADZAAAA2UpKSrT+/v7+////////////////////////////////////////
//////////////Pj1v/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/15SSdMAAADZAAAA2QAA
ANkAAADRAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAADRAAAA2QAA
ANkAAADZXlJJ092uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/8+PW////////////////////
//////////////////////////////z8/PxHR0e0AAAA2QAAANkAAADZAAAA2QAAAMcAAAAtAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAAxwAAANkAAADZAAAA2QAA
ANlHR0e0/v7+/v///////////////////////////////////////////////+jIrf/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/zaWE/QICAtYAAADZAAAA2QAAANkAAABjAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjAAAA2QAAANkAAADZAgIC1symhfzdrob/3a6G/92u
hv/drob/3a6G/92uhv/drob/6Mit/////////////////////////////////////////////v7+/js7
O7UAAADZAAAA2QAAANkAAADZAAAAxwAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAJAAAAMEAAADZAAAA2QAAANkAAADZhISEuv//////////////////
/////////////////////////v38/96xi//drob/3a6G/92uhv/drob/3a6G/92uhv/drob/b2BU2AAA
ANkAAADZAAAA2QAAALoAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAEAAAAugAAANkAAADZAAAA2W9gVNjdrob/3a6G/92uhv/drob/3a6G/92uhv/drob/3rGL//79
/P//////////////////////////////////////fX19uQAAANkAAADZAAAA2QAAANkAAADBAAAAJQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AB8AAADBAAAA2QAAANkAAADZERERwf//////////////////////////////////////////9+zj/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/crYb/Dw4MzgAAANkAAADZAAAA2QAAAFMAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUwAAANkAAADZAAAA2Q8O
DM7crYb/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G//fs4///////////////////////////////
////////EBAQwQAAANkAAADZAAAA2QAAAMEAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAA2QAAANkAAADZAgIC0f//
////////////////////////////////////////8NrI/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv+4mX71AAAA2QAAANkAAADZAAAAzAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAMwAAADZAAAA2QAAANm5mH723a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G//DayP//////////////////////////////////////AgIC0QAAANkAAADZAAAA2QAA
ACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAXAAAA2QAAANkAAADZCAgIyf//////////////////////////////////
////////6cyy/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv9+bF3dAAAA2QAAANkAAADZAAAAjwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AI4AAADZAAAA2QAAANl9a1zd3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+nMsv//////////////
////////////////////////CAgIyQAAANkAAADZAAAA2QAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvAAAA2QAA
ANkAAADZGBgYvf//////////////////////////////////////////5cCh/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv9DOzTOAAAA2QAAANkAAADZAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYAAADZAAAA2QAAANlDOzTO3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/+XAof//////////////////////////////////////GBgYvQAA
ANkAAADZAAAA2QAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA2QAAANkAAADZKysrt///////////////////
////////////////////////4beU/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv8dGRfLAAAA2QAA
ANkAAADZAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC4AAADZAAAA2QAAANkdGRfL3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+G4
lf//////////////////////////////////////KysrtwAAANkAAADZAAAA2QAAAEEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABLAAAA2QAAANkAAADZOjo6tf//////////////////////////////////////////37KM/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv8JBwbRAAAA2QAAANkAAADZAAAAEgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADZAAAA2QAA
ANkJBwfR3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/9+0j///////////////////////////////
////////Ozs7tQAAANkAAADZAAAA2QAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABRAAAA2QAAANkAAADZQEBAtP//
////////////////////////////////////////3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv8CAgLWAAAA2QAAANkAAADZAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAADZAAAA2QAAANkCAgLW3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/96wif//////////////////////////////////////QUFBtAAAANkAAADZAAAA2QAA
AFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABRAAAA2QAAANkAAADZQEBAtP//////////////////////////////////
////////3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv8CAgLWAAAA2QAAANkAAADZAAAABQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAUAAADZAAAA2QAAANkCAgLW3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv//////////////
////////////////////////QUFBtAAAANkAAADZAAAA2QAAAFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLAAAA2QAA
ANkAAADZOjo6tf//////////////////////////////////////////37KM/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv8JBwbRAAAA2QAAANkAAADZAAAAEgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABEAAADZAAAA2QAAANkJBwfR3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/9+yjP//////////////////////////////////////Ojo6tQAA
ANkAAADZAAAA2QAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDAAAA2QAAANkAAADZKysrt///////////////////
////////////////////////4beU/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv8dGRfLAAAA2QAA
ANkAAADZAAAALwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAC4AAADZAAAA2QAAANkdGRfL3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+G3
lP//////////////////////////////////////KysrtwAAANkAAADZAAAA2QAAAEEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAvAAAA2QAAANkAAADZGBgYvf//////////////////////////////////////////5cCh/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv9DOzTOAAAA2QAAANkAAADZAAAAVgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFYAAADZAAAA2QAA
ANlDOzTO3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+XAof//////////////////////////////
////////GBgYvQAAANkAAADZAAAA2QAAAC4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXAAAA2QAAANkAAADZCAgIyf//
////////////////////////////////////////6cyy/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv9+bF3dAAAA2QAAANkAAADZAAAAjwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAI4AAADZAAAA2QAAANl9a1zd3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/+nMsv//////////////////////////////////////CAgIyQAAANkAAADZAAAA2QAA
ABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAhAAAA2QAAANkAAADZAgIC0v//////////////////////////////////
////////8NrI/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv+4mX71AAAA2QAAANkAAADZAAAAzAAA
AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAA
AMwAAADZAAAA2QAAANm5mH723a6G/92uhv/drob/3a6G/92uhv/drob/3a6G//DayP//////////////
////////////////////////AgIC0QAAANkAAADZAAAA2QAAACEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAADBAAAA2QAA
ANkAAADZERERwf//////////////////////////////////////////9+zj/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/crYb/Dw4MzgAAANkAAADZAAAA2QAAAFMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAANkAAADZAAAA2Q8ODM7crYb/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G//fs4///////////////////////////////////////ERERwQAA
ANkAAADZAAAA2QAAAMEAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAJgAAAMEAAADZAAAA2QAAANkAAADZhISEuv//////////////////
/////////////////////////v38/96xi//drob/3a6G/92uhv/drob/3a6G/92uhv/drob/b2BU2AAA
ANkAAADZAAAA2QAAALoAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAEAAAAugAAANkAAADZAAAA2W9gVNjdrob/3a6G/92uhv/drob/3a6G/92uhv/drob/3rGL//79
/P//////////////////////////////////////fX19uQAAANkAAADZAAAA2QAAANkAAADCAAAAJgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmAAAAxwAA
ANkAAADZAAAA2QAAANlKSkq0/v7+/v///////////////////////////////////////////////+jJ
rv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/zaWE/QICAtYAAADZAAAA2QAAANkAAABjAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABjAAAA2QAAANkAAADZAgIC1sym
hfzdrob/3a6G/92uhv/drob/3a6G/92uhv/drob/6Mit////////////////////////////////////
/////////v7+/js7O7UAAADZAAAA2QAAANkAAADZAAAAxwAAACYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4AAADHAAAA2QAAANkAAADZAAAA2UpKSrT+/v7+////////
//////////////////////////////////////////////Tm2f/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/15SSdMAAADZAAAA2QAAANkAAADRAAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACYAAADRAAAA2QAAANkAAADZXlJJ092uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/9ObZ//////////////////////////////////////////////////z8/PxISEi0AAAA2QAA
ANkAAADZAAAA2QAAAMcAAAAvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwAA
AMwAAADZAAAA2QAAANkAAADZWFhYtP7+/v7/////////////////////////////////////////////
//////////////79/P/gtI//3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/9Kphv4KCQnQAAAA2QAA
ANkAAADZAAAAuwAAABIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEgAAALsAAADZAAAA2QAA
ANkKCQnQ0qmG/t2uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/gtI///v38////////////////////
///////////////////////////////////+/v7+TU1NtAAAANkAAADZAAAA2QAAANkAAADMAAAALwAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3AAAAzAAAANkAAADZAAAA2QAAANlcXFy1////////
///////////////////////////////////////////////////////////////////t1L//3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv+dhXHqAAAA2QAAANkAAADZAAAA2QAAALEAAAASAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAASAAAAsQAAANkAAADZAAAA2QAAANmdhXHq3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/t1L//////////////////////////////////////////////////////////
/////////////1xcXLUAAADZAAAA2QAAANkAAADZAAAAzAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
ADgAAADRAAAA2QAAANkAAADZAAAA2WxsbLb/////////////////////////////////////////////
///////////////////////////////////89/P/3rGK/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/XVFH0wAAANkAAADZAAAA2QAAANkAAAC7AAAAJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAAC7AAAA2QAA
ANkAAADZAAAA2V1RR9Pdrob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/96xiv/89/P/////////
//////////////////////////////////////////////////////////////7+/v9YWFi8AAAA2wAA
ANkAAADZAAAA2QAAANEAAAA4AAAAAAAAAAAAAAAAAAAAQAAAANEAAADZAAAA2QAAANkAAADbY2Njvvv7
+//+/v7/+vr6////////////////////////////////////////////////////////////////////
////////7dXA/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/262G/z01L80AAADZAAAA2QAA
ANkAAADZAAAA0QAAAGMAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAEAAAAYwAAANEAAADZAAAA2QAAANkAAADZPDUuzNuthv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/+3Uv///////////////////////////////////////////////
//////////////////////////////j4+P/m5ub/ZGRkvQAAANkAAADZAAAA2QAAANkAAADRAAAAQQAA
AAAAAAA6AAAA1AAAANkAAADZAAAA2QAAANh3d3e+5eXl//Dw8P/p6en/5ubm//39/f//////////////
/////////////////////////////////////////////////////////fv5/+G3k//drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/9erhv89NS/NAAAA2QAAANkAAADZAAAA2QAAANkAAAC6AAAAVAAA
AAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAFMAAAC6AAAA2QAA
ANkAAADZAAAA2QAAANk8NS7M16uG/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/4LaS//37
+P//////////////////////////////////////////////////////////////////////////////
///7+/v/9PT0/319fbkAAADaAAAA3AAAANoAAADZAAAA1AAAADYAAACfAAAA2QAAANkAAADZAAAA2IaG
hrv5+fn/9vb2///////s7Oz/6enp//r6+v//////////////////////////////////////////////
//////////////////////////////Xm2v/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/brYb/XVFH0wAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAAMwAAACPAAAAVgAAAC8AAAASAAAABgAA
AAYAAAASAAAALwAAAFYAAACPAAAAzAAAANkAAADZAAAA2QAAANkAAADZAAAA2V1RR9PbrYb/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/9OXZ////////////////////////////////////
////////////////////////////////////////9PT0//v7+//4+Pj/5eXl/+7u7v94eHjAAAAA3AAA
ANoAAADZAAAA2QAAAKIAAACNAAAA2QAAANkAAADZCgoKxvDw8Pnm5ub/8PDw//7+/v/w8PD//v7+////
////////////////////////////////////////////////////////////////////////////////
///rz7j/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/52FceoKCQfQAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkKCQfQnYVx6t2uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/rz7f/////////////////////////////////////////////////////////////////////////
///6+vr/5eXl/+bm5v/09PT/5ubm//T09P/6+vr6CgoKyAAAANkAAADZAAAA2QAAAI4AAAAkAAAA1gAA
ANkAAADZAAAA2XZ2drrl5eX/7+/v/+zs7P/l5eX/8/Pz//X19f/t7e3/////////////////////////
///////////////////////////////////////////////////+/Pv/5L6d/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/SqYb+XlJJ0wICAtYAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAgIC1l5SSdPSqYb+3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/+S+nf/+/Pv/////////////////////////
///////////////////////////////////////////////////9/f3/7+/v//Hx8f//////+fn5//X1
9f95eXm5AAAA2QAAANkAAADZAAAA1gAAACQAAAAAAAAAfQAAANkAAADZAAAA2QQEBM/o6Ojr//////j4
+P/r6+v/+fn5/+fn5//l5eX/+Pj4////////////////////////////////////////////////////
////////////////////////+/bx/+G3k//drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/82mhP1vYFTYDw4MzgAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2Q8ODM5vYFTYzaaE/d2uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/4beT//v28f//////////////////////////////////////////////////////////////
//////////////39/f///////f39/+zs7P/5+fn/7Ozs/9HR0e0EBATRAAAA2QAAANkAAADZAAAAfgAA
AAAAAAAAAAAADwAAAMoAAADZAAAA2QAAANlHR0e0/Pz8/+7u7v/39/f///////T09P/29vb/////////
//////////////////////////////////////////////////////////////////////////////nx
6v/gtZD/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3K2G/7iZ
fvV+bF3dQzs0zh0ZF8sJBwbRAgIC1QICAtUJBwbRHRkXy0M7NM5+bF3duJl+9dythv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/gtZD/+fHq////////////////////
/////////////////////////////////////////////////////////v7+/+jo6P/u7u7/8PDw/+Xl
5f/t7e3/9vb2/z8/P7oAAADZAAAA2QAAANkAAADKAAAADwAAAAAAAAAAAAAAAAAAAFwAAADZAAAA2QAA
ANkAAADYw8PD2eXl5f/q6ur/8/Pz/+bm5v/6+vr//v7+//n5+f//////////////////////////////
///////////////////////////////////////////////////58er/4beT/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/+G4lf/68+3/////////////////////////////////////////////////////////
////////////////////////+fn5/+bm5v/q6ur//v7+//Hx8f/6+vr/zs7O1wAAANcAAADZAAAA2QAA
ANkAAABdAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAC1AAAA2QAAANkAAADZHh4euvDw8P/8/Pz/8fHx/+Xl
5f/x8fH/6Ojo/+bm5v/8/Pz/////////////////////////////////////////////////////////
////////////////////////+/bx/+S+nf/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/5L6e//v28v//////////////
//////////////////////////////////////////////////////////////////////////////z8
/P/z8/P///////Pz8//o6Oj/Hh4evAAAANkAAADZAAAA2QAAALUAAAADAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAA7AAAA2QAAANkAAADZAAAA2aCgoML/////+Pj4//f39///////7u7u/+vr6//7+/v/////////
//////////////////////////////////////////////////////////////////////////////78
+//r0Lj/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/rz7f//vz7////////////////////////////////////////////////////
///////////////////////////////////y8vL/+fn5//b29v/l5eX/7e3t/+zs7P+MjIzIAAAA2gAA
ANkAAADZAAAA2QAAADwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlwAAANkAAADZAAAA2QoK
Csbr6+v35eXl/+/v7//8/Pz/7+/v//7+/v//////////////////////////////////////////////
////////////////////////////////////////////////////////9eba/+G3k//drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/4LaS//Xm2v//////////////
//////////////////////////////////////////////////////////////////////////////n5
+f/l5eX/5ubm//X19f/o6Oj/9fX1//f39/YKCgrHAAAA2QAAANkAAADZAAAAlwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAANQAAADZAAAA2QAAANlpaWm45ubm//Ly8v/s7Oz/5eXl//Ly
8v/z8/P/7Ozs////////////////////////////////////////////////////////////////////
//////////////////////////////37+f/t1cD/3rGK/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/96xiv/t1cD//fv5////////////////////////////////////////////////////
//////////////////////////////////////////////7+/v/x8fH/8vLy///////5+fn/8vLy/21t
bbcAAADZAAAA2QAAANkAAADUAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AHYAAADZAAAA2QAAANkCAgLS4+Pj5//////5+fn/7e3t//r6+v/o6Oj/5eXl//j4+P//////////////
////////////////////////////////////////////////////////////////////////////////
/////////Pfz/+3Uv//gtI//3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/gtI//7dS///z38///////////////
////////////////////////////////////////////////////////////////////////////////
/////////Pz8///////8/Pz/6urq//f39//r6+v/zMzM6QICAtQAAADZAAAA2QAAANkAAAB2AAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0AAADGAAAA2QAAANkAAADZOzs7tfv7
+//s7Oz/9vb2///////19fX/+Pj4////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////+/fz/9ObZ/+jJ
rv/esYv/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92uhv/drob/3a6G/92u
hv/fsoz/6Mit//Pj1v/+/fz/////////////////////////////////////////////////////////
///////////////////////////////////////////////////+/v7/5+fn/+zs7P/w8PD/5eXl/+7u
7v/4+Pj/NTU1ugAAANkAAADZAAAA2QAAAMYAAAANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABWAAAA2QAAANkAAADZAAAA2Lu7u9Pl5eX/6urq//Hx8f/m5ub/+fn5//39
/f/39/f//////////////////////9PT09qUlJS+jo6Ovd7e3uD/////////////////////////////
///////////////////////////////////////////////////+/fz/9+zj//DayP/pzLL/5cCh/+G3
lP/fsoz/3a6G/92uhv/fsoz/4beU/+XAof/pzLL/8NrI//fs4//+/fz/////////////////////////
///////////////////////////////////////////////////e3t7gjo6OvZSUlL7T09Pa////////
///////////////////5+fn/5+fn/+vr6///////8/Pz//r6+v/FxcXSAAAA2AAAANkAAADZAAAA2QAA
AFYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAArwAA
ANkAAADZAAAA2RgYGL3y8vL+/f39//Ly8v/l5eX/8vLy/+fn5//m5ub/8fHx9aqqqsVKSkq0CgoKxgAA
ANkAAADZAAAA2QAAANhYWFi0+fn5+P//////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////+fn5+FJSUrQAAADYAAAA2QAAANkAAADZCgoKx0pKSrSqqqrF9vb29P///////////f39//Ly
8v//////8vLy/+bm5v4YGBi/AAAA2QAAANkAAADZAAAAsAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANQAAANkAAADZAAAA2QAAANmUlJS+//////f3
9//4+Pj/1tbW3G9vb70gICC+AQEB1QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZFRUVvtnZ
2d3/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////W1tbcFBQUvwAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAQEB1CIiIrl6enq4zc3N3eXl5f/s7Oz/7e3t/4GBgcUAAADaAAAA2QAA
ANkAAADZAAAANQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAJAAAADZAAAA2QAAANkICAjJnp6ex0JCQrwKCgrKAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QEBAdRsbGy2+vr6+f//////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////+vr6+WpqarYBAQHUAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2gkJCctISEi3p6enxQgICMoAAADZAAAA2QAAANkAAACRAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAADRAAAA2QAA
ANkAAADZAAAA2QAAAN0AAADbAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANEAAACZAAAAvAAA
ANkAAADZAAAA2QAAANkAAADZDg4OwqWlpcT+/v7+////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////7+/v6kpKTEDg4OwgAAANkAAADZAAAA2QAA
ANkAAADZAAAAvAAAAJkAAADRAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANEAAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAALoAAAB7AAAAPAAAAAcAAAAAAAAADQAAAI4AAADZAAAA2QAAANkAAADZAAAA2QAA
ANkYGBi9pKSkxPz8/Pz/////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///8/Pz8pKSkxBgYGL0AAADZAAAA2QAAANkAAADZAAAA2QAAANkAAACOAAAADQAAAAAAAAAHAAAAPAAA
AHoAAAC6AAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAAHEAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAJAAAAwgAAANkAAADZAAAA2QAAANkAAADZAAAA0QAAAJsAAABdAAAAHwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAABLAAAAxgAAANkAAADZAAAA2QAAANkAAADZAAAA2QwMDMaSkpK+////////
////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////5KSkr4MDAzGAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAAxgAAAEsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAF0AAACbAAAA0QAA
ANkAAADZAAAA2QAAANkAAADZAAAAwgAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgAAANAAAADZAAAAvAAA
AH0AAABAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAA
AIEAAADWAAAA2QAAANkAAADZAAAA2QAAANkAAADZYGBgtf//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////YGBgtQAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANYAAACCAAAADgAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAEAAAAB9AAAAvAAAANkAAADQAAAAPgAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhAAAAkgAAANgAAADZAAAA2QAA
ANkAAADZAAAA2NnZ2d3/////////////////////////////////////////////////////////////
///////////////////////////////////////////////////a2treAAAA2AAAANkAAADZAAAA2QAA
ANkAAADYAAAAkwAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYAAACIAAAA0wAAANkAAADZAAAA2WxsbLb/////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////9xcXG3AAAA2QAAANkAAADZAAAA0wAAAIQAAAAkAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAVgAAANkAAADZAAAA2ScnJ7j/////////////////////////////////////////////
//////////////////////////////////////////////////////////////////8nJye4AAAA2QAA
ANkAAADZAAAAVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAANkAAADZAAAA2QIC
AtH8/Pz7////////////////////////////////////////////////////////////////////////
//////////////////////////////z8/PsCAgLRAAAA2QAAANkAAADZAAAAHwAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMEAAADZAAAA2QAAANnFxcXS////////////////////////
/////////////////////////////////////////////////////////////////////////////8XF
xdIAAADZAAAA2QAAANkAAADBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AIsAAADZAAAA2QAAANlxcXG3////////////////////////////////////////////////////////
/////////////////////////////////////////////3FxcbcAAADZAAAA2QAAANkAAACLAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFUAAADZAAAA2QAAANknJye4////////
///l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl5f/l5eX////////////l5eX/5eXl////
////////5eXl/yEhIb8AAADZAAAA2QAAANkAAABVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAB8AAADZAAAA2QAAANkCAgLR/Pz8+//////l5eX/5eXl////////////5eXl/+Xl
5f///////////+Xl5f/l5eX////////////l5eX/5eXl////////////4uLi+wICAtYAAADZAAAA2QAA
ANkAAAAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBAAAA2QAA
ANkAAADZrq6u1uXl5f///////////+Xl5f/l5eX////////////l5eX/5eXl////////////5eXl/+Xl
5f///////////+Xl5f/l5eX/xcXF0gAAANkAAADZAAAA2QAAAMUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACNAAAA2QAAANkAAADZYmJivuXl5f///////////+Xl
5f/l5eX////////////l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl5f/l5eX/cXFxtwAA
ANkAAADZAAAA2QAAAI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAABYAAAA2QAAANkAAADZJycnuP/////l5eX/5eXl////////////5eXl/+Xl5f///////////+Xl
5f/l5eX////////////l5eX/5eXl////////////ISEhvwAAAN0AAADZAAAA2QAAAFgAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiAAAA2QAAANkAAADZAgIC0fz8
/Pvl5eX/5eXl////////////5eXl/+Xl5f///////////+Xl5f/l5eX////////////l5eX/5eXl////
///8/Pz7AgIC1gAAAN0AAADZAAAA2QAAACIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAxQAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAAxQAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjgAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAAjgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUQAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAAUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAABQAAAI0AAADUAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAA
ANkAAADZAAAA2QAAANkAAADZAAAA2QAAANkAAADZAAAA2QAAANQAAACNAAAABQAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAD/////+AAAA//////gAAAA//////gAAAP/////4AAAAP/////4AAAD/////+AA
AAD/////+AAAA//////gAAAA//////AAAAH/////4AAAAP/////wAAAB/////+AAAAD/////8AAAAf//
///gAAAA//////AAAAH/////4AAAAP/////gAAAA/////+AAAAD/////4AAAAP/////gAAAA/////+AA
AAD/////4AAAAP/////gAAAA/////+AAAAD/////wAAAAH/////gAAAA/////8AAAAB/////4AAAAP//
//8AAAAAH////+AAAAD/5//8AAAAAAf//P/gAAAA/8B/8AAAAAAB/8B/4AAAAP+AD+AAAAAAAP4AP+AA
AAD/gACAAAAAAAAgAD/gAAAA/wAAAAAAAAAAAAAf4AAAAP8AAAAAAAAAAAAAH+AAAAD+AAAAAAAAAAAA
AA/gAAAA/AAAAAAAAAAAAAAH4AAAAPwAAAAAAAAAAAAAB+AAAAD4AAAAAAAAAAAAAAPgAAAA+AAAAAAA
AAAAAAAD4AAAAPAAAAAAAAAAAAAAAeAAAADwAAAAAAAAAAAAAAHgAAAA4AAAAAAAAAAAAAAA4AAAAMAA
AAAAAAAAAAAAAGAAAADAAAAAAAAAAAAAAABgAAAAgAAAAAAAAAAAAAAAIAAAAIAAAAAAAAAAAAAAACAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf+AAAA
AAAAAAAAgAAAAAAf/4AAAAAAIAAAAMAAAAAAf//gAAAAAGAAAADgAAAAAP//8AAAAADgAAAA8AAAAAH/
//gAAAAB4AAAAPgAAAAD///8AAAAA+AAAAD8AAAAB////gAAAAfgAAAA/gAAAAf///4AAAAP4AAAAP8A
AAAP////AAAAH+AAAAD/gAAAD////wAAAD/gAAAA/4AAAB////+AAAA/4AAAAP+AAAAf////gAAAP+AA
AAD/gAAAH////4AAAD/gAAAA/4AAAB////+AAAA/4AAAAP+AAAAf////gAAAP+AAAAD/gAAAH////4AA
AD/gAAAA/4AAAB////+AAAA/4AAAAP+AAAAf////gAAAP+AAAAD/gAAAH////4AAAD/gAAAA/4AAAB//
//+AAAA/4AAAAP+AAAAP////AAAAP+AAAAD/AAAAD////wAAAB/gAAAA/gAAAAf///4AAAAP4AAAAPwA
AAAH///+AAAAB+AAAAD4AAAAA////AAAAAPgAAAA8AAAAAH///gAAAAB4AAAAOAAAAAA///wAAAAAOAA
AADAAAAAAH//4AAAAABgAAAAgAAAAAAf/4AAAAAAIAAAAAAAAAAAB/4AAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAgAAAAgAAAAAAA
AAAAAAAAIAAAAMAAAAAAAAAAAAAAAGAAAADAAAAAAAAAAAAAAABgAAAA4AAAAAAAAAAAAAAA4AAAAPAA
AAAAAAAAAAAAAeAAAADwAAAAAAAAAAAAAAHgAAAA+AAAAAAAAAAAAAAD4AAAAPgAAAAAAAAAAAAAA+AA
AAD8AAAAAAAAAAAAAAfgAAAA/AAAAAAAAAAAAAAH4AAAAP4AAAAAAAAAAAAAD+AAAAD/AAAAAAAAAAAA
AB/gAAAA/wAAAAAAAAAAAAAf4AAAAP+AAIAAAAAAACAAP+AAAAD/gA/gAAAAAAD+AD/gAAAA/8B/8AAA
AAAB/8B/4AAAAP/n//wAAAAAB//8/+AAAAD/////AAAAAB/////gAAAA/////8AAAAB/////4AAAAP//
///AAAAAf////+AAAAD/////4AAAAP/////gAAAA/////+AAAAD/////4AAAAP/////gAAAA/////+AA
AAD/////4AAAAP/////gAAAA//////AAAAH/////4AAAAP/////wAAAB/////+AAAAD/////8AAAAf//
///gAAAA//////AAAAH/////4AAAAP/////4AAAD/////+AAAAD/////+AAAA//////gAAAA//////gA
AAP/////4AAAAP/////4AAAD/////+AAAAA=
</value>
</data>
</root>
\ No newline at end of file
ModbusDemo/ModbusDemo/Lib/LibModbus.dll
deleted
100644 → 0
View file @
38a1531c
File deleted
ModbusDemo/ModbusDemo/Lib/LibSocket.dll
deleted
100644 → 0
View file @
38a1531c
File deleted
ModbusDemo/ModbusDemo/MDemo.Designer.cs
deleted
100644 → 0
View file @
38a1531c
namespace
ModbusDemo
{
partial
class
MDemo
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private
System
.
ComponentModel
.
IContainer
components
=
null
;
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected
override
void
Dispose
(
bool
disposing
)
{
if
(
disposing
&&
(
components
!=
null
))
{
components
.
Dispose
();
}
base
.
Dispose
(
disposing
);
}
#
region
Windows
窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private
void
InitializeComponent
()
{
this
.
TestBtn
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
CoilBox
=
new
System
.
Windows
.
Forms
.
GroupBox
();
this
.
pictureBox16
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox15
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox14
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox13
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox12
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox11
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox10
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox9
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox8
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox7
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox6
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox5
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox4
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox3
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox2
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
pictureBox1
=
new
System
.
Windows
.
Forms
.
PictureBox
();
this
.
label16
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label15
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label14
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label13
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label12
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label11
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label10
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label9
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label8
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label7
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label6
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label5
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label4
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label3
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label2
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label1
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
stopbtn
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
label17
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
IPsetBox
=
new
System
.
Windows
.
Forms
.
TextBox
();
this
.
CoilBox
.
SuspendLayout
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox16
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox15
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox14
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox13
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox12
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox11
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox10
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox9
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox8
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox7
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox6
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox5
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox4
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox3
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox2
)).
BeginInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox1
)).
BeginInit
();
this
.
SuspendLayout
();
//
// TestBtn
//
this
.
TestBtn
.
Location
=
new
System
.
Drawing
.
Point
(
226
,
23
);
this
.
TestBtn
.
Name
=
"TestBtn"
;
this
.
TestBtn
.
Size
=
new
System
.
Drawing
.
Size
(
105
,
23
);
this
.
TestBtn
.
TabIndex
=
0
;
this
.
TestBtn
.
Text
=
"读线圈测试"
;
this
.
TestBtn
.
UseVisualStyleBackColor
=
true
;
this
.
TestBtn
.
Click
+=
new
System
.
EventHandler
(
this
.
TestBtn_Click
);
//
// CoilBox
//
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox16
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox15
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox14
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox13
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox12
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox11
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox10
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox9
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox8
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox7
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox6
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox5
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox4
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox3
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox2
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
pictureBox1
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label16
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label15
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label14
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label13
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label12
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label11
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label10
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label9
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label8
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label7
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label6
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label5
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label4
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label3
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label2
);
this
.
CoilBox
.
Controls
.
Add
(
this
.
label1
);
this
.
CoilBox
.
Location
=
new
System
.
Drawing
.
Point
(
13
,
63
);
this
.
CoilBox
.
Name
=
"CoilBox"
;
this
.
CoilBox
.
Size
=
new
System
.
Drawing
.
Size
(
424
,
164
);
this
.
CoilBox
.
TabIndex
=
1
;
this
.
CoilBox
.
TabStop
=
false
;
this
.
CoilBox
.
Text
=
"DI Port"
;
//
// pictureBox16
//
this
.
pictureBox16
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox16
.
Location
=
new
System
.
Drawing
.
Point
(
361
,
122
);
this
.
pictureBox16
.
Name
=
"pictureBox16"
;
this
.
pictureBox16
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox16
.
TabIndex
=
31
;
this
.
pictureBox16
.
TabStop
=
false
;
this
.
pictureBox16
.
Tag
=
"15"
;
//
// pictureBox15
//
this
.
pictureBox15
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox15
.
Location
=
new
System
.
Drawing
.
Point
(
361
,
90
);
this
.
pictureBox15
.
Name
=
"pictureBox15"
;
this
.
pictureBox15
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox15
.
TabIndex
=
30
;
this
.
pictureBox15
.
TabStop
=
false
;
this
.
pictureBox15
.
Tag
=
"14"
;
//
// pictureBox14
//
this
.
pictureBox14
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox14
.
Location
=
new
System
.
Drawing
.
Point
(
361
,
59
);
this
.
pictureBox14
.
Name
=
"pictureBox14"
;
this
.
pictureBox14
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox14
.
TabIndex
=
29
;
this
.
pictureBox14
.
TabStop
=
false
;
this
.
pictureBox14
.
Tag
=
"13"
;
//
// pictureBox13
//
this
.
pictureBox13
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox13
.
Location
=
new
System
.
Drawing
.
Point
(
361
,
26
);
this
.
pictureBox13
.
Name
=
"pictureBox13"
;
this
.
pictureBox13
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox13
.
TabIndex
=
28
;
this
.
pictureBox13
.
TabStop
=
false
;
this
.
pictureBox13
.
Tag
=
"12"
;
//
// pictureBox12
//
this
.
pictureBox12
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox12
.
Location
=
new
System
.
Drawing
.
Point
(
264
,
122
);
this
.
pictureBox12
.
Name
=
"pictureBox12"
;
this
.
pictureBox12
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox12
.
TabIndex
=
27
;
this
.
pictureBox12
.
TabStop
=
false
;
this
.
pictureBox12
.
Tag
=
"11"
;
//
// pictureBox11
//
this
.
pictureBox11
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox11
.
Location
=
new
System
.
Drawing
.
Point
(
264
,
90
);
this
.
pictureBox11
.
Name
=
"pictureBox11"
;
this
.
pictureBox11
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox11
.
TabIndex
=
26
;
this
.
pictureBox11
.
TabStop
=
false
;
this
.
pictureBox11
.
Tag
=
"10"
;
//
// pictureBox10
//
this
.
pictureBox10
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox10
.
Location
=
new
System
.
Drawing
.
Point
(
264
,
59
);
this
.
pictureBox10
.
Name
=
"pictureBox10"
;
this
.
pictureBox10
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox10
.
TabIndex
=
25
;
this
.
pictureBox10
.
TabStop
=
false
;
this
.
pictureBox10
.
Tag
=
"9"
;
//
// pictureBox9
//
this
.
pictureBox9
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox9
.
Location
=
new
System
.
Drawing
.
Point
(
264
,
26
);
this
.
pictureBox9
.
Name
=
"pictureBox9"
;
this
.
pictureBox9
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox9
.
TabIndex
=
24
;
this
.
pictureBox9
.
TabStop
=
false
;
this
.
pictureBox9
.
Tag
=
"8"
;
//
// pictureBox8
//
this
.
pictureBox8
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox8
.
Location
=
new
System
.
Drawing
.
Point
(
161
,
122
);
this
.
pictureBox8
.
Name
=
"pictureBox8"
;
this
.
pictureBox8
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox8
.
TabIndex
=
23
;
this
.
pictureBox8
.
TabStop
=
false
;
this
.
pictureBox8
.
Tag
=
"7"
;
//
// pictureBox7
//
this
.
pictureBox7
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox7
.
Location
=
new
System
.
Drawing
.
Point
(
161
,
90
);
this
.
pictureBox7
.
Name
=
"pictureBox7"
;
this
.
pictureBox7
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox7
.
TabIndex
=
22
;
this
.
pictureBox7
.
TabStop
=
false
;
this
.
pictureBox7
.
Tag
=
"6"
;
//
// pictureBox6
//
this
.
pictureBox6
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox6
.
Location
=
new
System
.
Drawing
.
Point
(
161
,
59
);
this
.
pictureBox6
.
Name
=
"pictureBox6"
;
this
.
pictureBox6
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox6
.
TabIndex
=
21
;
this
.
pictureBox6
.
TabStop
=
false
;
this
.
pictureBox6
.
Tag
=
"5"
;
//
// pictureBox5
//
this
.
pictureBox5
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox5
.
Location
=
new
System
.
Drawing
.
Point
(
161
,
26
);
this
.
pictureBox5
.
Name
=
"pictureBox5"
;
this
.
pictureBox5
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox5
.
TabIndex
=
20
;
this
.
pictureBox5
.
TabStop
=
false
;
this
.
pictureBox5
.
Tag
=
"4"
;
//
// pictureBox4
//
this
.
pictureBox4
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox4
.
Location
=
new
System
.
Drawing
.
Point
(
64
,
122
);
this
.
pictureBox4
.
Name
=
"pictureBox4"
;
this
.
pictureBox4
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox4
.
TabIndex
=
19
;
this
.
pictureBox4
.
TabStop
=
false
;
this
.
pictureBox4
.
Tag
=
"3"
;
//
// pictureBox3
//
this
.
pictureBox3
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox3
.
Location
=
new
System
.
Drawing
.
Point
(
64
,
90
);
this
.
pictureBox3
.
Name
=
"pictureBox3"
;
this
.
pictureBox3
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox3
.
TabIndex
=
18
;
this
.
pictureBox3
.
TabStop
=
false
;
this
.
pictureBox3
.
Tag
=
"2"
;
//
// pictureBox2
//
this
.
pictureBox2
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox2
.
Location
=
new
System
.
Drawing
.
Point
(
64
,
59
);
this
.
pictureBox2
.
Name
=
"pictureBox2"
;
this
.
pictureBox2
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox2
.
TabIndex
=
17
;
this
.
pictureBox2
.
TabStop
=
false
;
this
.
pictureBox2
.
Tag
=
"1"
;
//
// pictureBox1
//
this
.
pictureBox1
.
BackColor
=
System
.
Drawing
.
Color
.
Black
;
this
.
pictureBox1
.
Location
=
new
System
.
Drawing
.
Point
(
64
,
26
);
this
.
pictureBox1
.
Name
=
"pictureBox1"
;
this
.
pictureBox1
.
Size
=
new
System
.
Drawing
.
Size
(
36
,
19
);
this
.
pictureBox1
.
TabIndex
=
16
;
this
.
pictureBox1
.
TabStop
=
false
;
this
.
pictureBox1
.
Tag
=
"0"
;
//
// label16
//
this
.
label16
.
AutoSize
=
true
;
this
.
label16
.
Location
=
new
System
.
Drawing
.
Point
(
326
,
126
);
this
.
label16
.
Name
=
"label16"
;
this
.
label16
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label16
.
TabIndex
=
15
;
this
.
label16
.
Text
=
"DI16"
;
//
// label15
//
this
.
label15
.
AutoSize
=
true
;
this
.
label15
.
Location
=
new
System
.
Drawing
.
Point
(
326
,
94
);
this
.
label15
.
Name
=
"label15"
;
this
.
label15
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label15
.
TabIndex
=
14
;
this
.
label15
.
Text
=
"DI15"
;
//
// label14
//
this
.
label14
.
AutoSize
=
true
;
this
.
label14
.
Location
=
new
System
.
Drawing
.
Point
(
326
,
62
);
this
.
label14
.
Name
=
"label14"
;
this
.
label14
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label14
.
TabIndex
=
13
;
this
.
label14
.
Text
=
"DI14"
;
//
// label13
//
this
.
label13
.
AutoSize
=
true
;
this
.
label13
.
Location
=
new
System
.
Drawing
.
Point
(
326
,
30
);
this
.
label13
.
Name
=
"label13"
;
this
.
label13
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label13
.
TabIndex
=
12
;
this
.
label13
.
Text
=
"DI13"
;
//
// label12
//
this
.
label12
.
AutoSize
=
true
;
this
.
label12
.
Location
=
new
System
.
Drawing
.
Point
(
229
,
126
);
this
.
label12
.
Name
=
"label12"
;
this
.
label12
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label12
.
TabIndex
=
11
;
this
.
label12
.
Text
=
"DI12"
;
//
// label11
//
this
.
label11
.
AutoSize
=
true
;
this
.
label11
.
Location
=
new
System
.
Drawing
.
Point
(
229
,
94
);
this
.
label11
.
Name
=
"label11"
;
this
.
label11
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label11
.
TabIndex
=
10
;
this
.
label11
.
Text
=
"DI11"
;
//
// label10
//
this
.
label10
.
AutoSize
=
true
;
this
.
label10
.
Location
=
new
System
.
Drawing
.
Point
(
229
,
62
);
this
.
label10
.
Name
=
"label10"
;
this
.
label10
.
Size
=
new
System
.
Drawing
.
Size
(
29
,
12
);
this
.
label10
.
TabIndex
=
9
;
this
.
label10
.
Text
=
"DI10"
;
//
// label9
//
this
.
label9
.
AutoSize
=
true
;
this
.
label9
.
Location
=
new
System
.
Drawing
.
Point
(
229
,
30
);
this
.
label9
.
Name
=
"label9"
;
this
.
label9
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label9
.
TabIndex
=
8
;
this
.
label9
.
Text
=
"DI9"
;
//
// label8
//
this
.
label8
.
AutoSize
=
true
;
this
.
label8
.
Location
=
new
System
.
Drawing
.
Point
(
132
,
126
);
this
.
label8
.
Name
=
"label8"
;
this
.
label8
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label8
.
TabIndex
=
7
;
this
.
label8
.
Text
=
"DI8"
;
//
// label7
//
this
.
label7
.
AutoSize
=
true
;
this
.
label7
.
Location
=
new
System
.
Drawing
.
Point
(
132
,
94
);
this
.
label7
.
Name
=
"label7"
;
this
.
label7
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label7
.
TabIndex
=
6
;
this
.
label7
.
Text
=
"DI7"
;
//
// label6
//
this
.
label6
.
AutoSize
=
true
;
this
.
label6
.
Location
=
new
System
.
Drawing
.
Point
(
132
,
62
);
this
.
label6
.
Name
=
"label6"
;
this
.
label6
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label6
.
TabIndex
=
5
;
this
.
label6
.
Text
=
"DI6"
;
//
// label5
//
this
.
label5
.
AutoSize
=
true
;
this
.
label5
.
Location
=
new
System
.
Drawing
.
Point
(
132
,
30
);
this
.
label5
.
Name
=
"label5"
;
this
.
label5
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label5
.
TabIndex
=
4
;
this
.
label5
.
Text
=
"DI5"
;
//
// label4
//
this
.
label4
.
AutoSize
=
true
;
this
.
label4
.
Location
=
new
System
.
Drawing
.
Point
(
35
,
126
);
this
.
label4
.
Name
=
"label4"
;
this
.
label4
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label4
.
TabIndex
=
3
;
this
.
label4
.
Text
=
"DI4"
;
//
// label3
//
this
.
label3
.
AutoSize
=
true
;
this
.
label3
.
Location
=
new
System
.
Drawing
.
Point
(
35
,
94
);
this
.
label3
.
Name
=
"label3"
;
this
.
label3
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label3
.
TabIndex
=
2
;
this
.
label3
.
Text
=
"DI3"
;
//
// label2
//
this
.
label2
.
AutoSize
=
true
;
this
.
label2
.
Location
=
new
System
.
Drawing
.
Point
(
35
,
62
);
this
.
label2
.
Name
=
"label2"
;
this
.
label2
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label2
.
TabIndex
=
1
;
this
.
label2
.
Text
=
"DI2"
;
//
// label1
//
this
.
label1
.
AutoSize
=
true
;
this
.
label1
.
Location
=
new
System
.
Drawing
.
Point
(
35
,
30
);
this
.
label1
.
Name
=
"label1"
;
this
.
label1
.
Size
=
new
System
.
Drawing
.
Size
(
23
,
12
);
this
.
label1
.
TabIndex
=
0
;
this
.
label1
.
Text
=
"DI1"
;
//
// stopbtn
//
this
.
stopbtn
.
Location
=
new
System
.
Drawing
.
Point
(
350
,
23
);
this
.
stopbtn
.
Name
=
"stopbtn"
;
this
.
stopbtn
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
stopbtn
.
TabIndex
=
2
;
this
.
stopbtn
.
Text
=
"停止测试"
;
this
.
stopbtn
.
UseVisualStyleBackColor
=
true
;
this
.
stopbtn
.
Click
+=
new
System
.
EventHandler
(
this
.
stopbtn_Click
);
//
// label17
//
this
.
label17
.
AutoSize
=
true
;
this
.
label17
.
Location
=
new
System
.
Drawing
.
Point
(
23
,
28
);
this
.
label17
.
Name
=
"label17"
;
this
.
label17
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label17
.
TabIndex
=
3
;
this
.
label17
.
Text
=
"IP设置:"
;
//
// IPsetBox
//
this
.
IPsetBox
.
Location
=
new
System
.
Drawing
.
Point
(
76
,
25
);
this
.
IPsetBox
.
Name
=
"IPsetBox"
;
this
.
IPsetBox
.
Size
=
new
System
.
Drawing
.
Size
(
122
,
21
);
this
.
IPsetBox
.
TabIndex
=
4
;
//
// MDemo
//
this
.
AutoScaleDimensions
=
new
System
.
Drawing
.
SizeF
(
6F
,
12F
);
this
.
AutoScaleMode
=
System
.
Windows
.
Forms
.
AutoScaleMode
.
Font
;
this
.
ClientSize
=
new
System
.
Drawing
.
Size
(
449
,
234
);
this
.
Controls
.
Add
(
this
.
IPsetBox
);
this
.
Controls
.
Add
(
this
.
label17
);
this
.
Controls
.
Add
(
this
.
stopbtn
);
this
.
Controls
.
Add
(
this
.
CoilBox
);
this
.
Controls
.
Add
(
this
.
TestBtn
);
this
.
Name
=
"MDemo"
;
this
.
Text
=
"Demo"
;
this
.
CoilBox
.
ResumeLayout
(
false
);
this
.
CoilBox
.
PerformLayout
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox16
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox15
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox14
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox13
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox12
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox11
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox10
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox9
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox8
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox7
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox6
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox5
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox4
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox3
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox2
)).
EndInit
();
((
System
.
ComponentModel
.
ISupportInitialize
)(
this
.
pictureBox1
)).
EndInit
();
this
.
ResumeLayout
(
false
);
this
.
PerformLayout
();
}
#
endregion
private
System
.
Windows
.
Forms
.
Button
TestBtn
;
private
System
.
Windows
.
Forms
.
GroupBox
CoilBox
;
private
System
.
Windows
.
Forms
.
Label
label16
;
private
System
.
Windows
.
Forms
.
Label
label15
;
private
System
.
Windows
.
Forms
.
Label
label14
;
private
System
.
Windows
.
Forms
.
Label
label13
;
private
System
.
Windows
.
Forms
.
Label
label12
;
private
System
.
Windows
.
Forms
.
Label
label11
;
private
System
.
Windows
.
Forms
.
Label
label10
;
private
System
.
Windows
.
Forms
.
Label
label9
;
private
System
.
Windows
.
Forms
.
Label
label8
;
private
System
.
Windows
.
Forms
.
Label
label7
;
private
System
.
Windows
.
Forms
.
Label
label6
;
private
System
.
Windows
.
Forms
.
Label
label5
;
private
System
.
Windows
.
Forms
.
Label
label4
;
private
System
.
Windows
.
Forms
.
Label
label3
;
private
System
.
Windows
.
Forms
.
Label
label2
;
private
System
.
Windows
.
Forms
.
Label
label1
;
private
System
.
Windows
.
Forms
.
Button
stopbtn
;
private
System
.
Windows
.
Forms
.
Label
label17
;
private
System
.
Windows
.
Forms
.
TextBox
IPsetBox
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox1
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox2
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox3
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox16
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox15
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox14
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox13
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox12
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox11
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox10
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox9
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox8
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox7
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox6
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox5
;
private
System
.
Windows
.
Forms
.
PictureBox
pictureBox4
;
}
}
ModbusDemo/ModbusDemo/MDemo.cs
deleted
100644 → 0
View file @
38a1531c
using
System
;
using
System.Collections.Generic
;
using
System.ComponentModel
;
using
System.Data
;
using
System.Drawing
;
using
System.Linq
;
using
System.Text
;
using
System.Windows.Forms
;
using
ModbusDemo.Common
;
using
System.Threading
;
using
System.Text.RegularExpressions
;
namespace
ModbusDemo
{
public
partial
class
MDemo
:
Form
{
WTModbus
ReadTest
;
const
ushort
address
=
17
;
const
ushort
num
=
6
;
const
ushort
DevicePort
=
502
;
string
DeviceIP
;
ManualResetEvent
showmre
=
new
ManualResetEvent
(
false
);
public
delegate
void
invokeDelegate
();
public
MDemo
()
{
InitializeComponent
();
ReadTest
=
new
WTModbus
();
}
Thread
t_ReadCoil
;
private
void
TestBtn_Click
(
object
sender
,
EventArgs
e
)
{
this
.
TestBtn
.
Enabled
=
false
;
if
(
this
.
IPsetBox
.
Text
!=
""
)
{
DeviceIP
=
this
.
IPsetBox
.
Text
;
}
else
{
MessageBox
.
Show
(
"请检查IP输入是否正确"
);
this
.
TestBtn
.
Enabled
=
true
;
return
;
}
if
(
showmre
!=
null
)
{
showmre
.
Reset
();
}
t_ReadCoil
=
new
Thread
(
ReadCoilProc
);
t_ReadCoil
.
IsBackground
=
true
;
t_ReadCoil
.
Start
();
}
private
void
ReadCoilProc
(
object
obj
)
{
short
allval
;
byte
[]
temp
=
new
byte
[
6
];
int
ret
;
while
(!
showmre
.
WaitOne
(
500
))
{
//读线圈
ret
=
ReadTest
.
ReadCoilStatus
(
address
,
num
,
DeviceIP
,
DevicePort
,
ref
temp
);
allval
=
BitConverter
.
ToInt16
(
temp
,
0
);
invokeDelegate
update
=
()
=>
{
foreach
(
Control
control
in
this
.
CoilBox
.
Controls
)
{
if
(
control
is
PictureBox
)
{
if
((
allval
>>
Convert
.
ToUInt16
((
control
as
PictureBox
).
Tag
)
&
0x1
)
==
1
)
{
(
control
as
PictureBox
).
BackColor
=
Color
.
Green
;
}
else
{
(
control
as
PictureBox
).
BackColor
=
Color
.
Black
;
}
}
}
};
Invoke
(
update
);
}
}
private
void
stopbtn_Click
(
object
sender
,
EventArgs
e
)
{
this
.
TestBtn
.
Enabled
=
true
;
if
(
showmre
!=
null
)
showmre
.
Set
();
foreach
(
Control
control
in
this
.
CoilBox
.
Controls
)
{
if
(
control
is
PictureBox
)
{
(
control
as
PictureBox
).
BackColor
=
Color
.
Black
;
}
}
}
}
}
ModbusDemo/ModbusDemo/MDemo.resx
deleted
100644 → 0
View file @
38a1531c
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>
\ No newline at end of file
ModbusDemo/ModbusDemo/ModbusDemo.csproj
deleted
100644 → 0
View file @
38a1531c
<?xml version="1.0" encoding="utf-8"?>
<Project
ToolsVersion=
"12.0"
DefaultTargets=
"Build"
xmlns=
"http://schemas.microsoft.com/developer/msbuild/2003"
>
<Import
Project=
"$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props"
Condition=
"Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"
/>
<PropertyGroup>
<Configuration
Condition=
" '$(Configuration)' == '' "
>
Debug
</Configuration>
<Platform
Condition=
" '$(Platform)' == '' "
>
AnyCPU
</Platform>
<ProjectGuid>
{7D83EE1F-F3D9-4592-A0ED-A0D92DCF91AB}
</ProjectGuid>
<OutputType>
WinExe
</OutputType>
<AppDesignerFolder>
Properties
</AppDesignerFolder>
<RootNamespace>
ModbusDemo
</RootNamespace>
<AssemblyName>
ModbusDemo
</AssemblyName>
<TargetFrameworkVersion>
v4.0
</TargetFrameworkVersion>
<FileAlignment>
512
</FileAlignment>
</PropertyGroup>
<PropertyGroup
Condition=
" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "
>
<PlatformTarget>
x86
</PlatformTarget>
<DebugSymbols>
true
</DebugSymbols>
<DebugType>
full
</DebugType>
<Optimize>
false
</Optimize>
<OutputPath>
bin\Debug\
</OutputPath>
<DefineConstants>
DEBUG;TRACE
</DefineConstants>
<ErrorReport>
prompt
</ErrorReport>
<WarningLevel>
4
</WarningLevel>
</PropertyGroup>
<PropertyGroup
Condition=
" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "
>
<PlatformTarget>
AnyCPU
</PlatformTarget>
<DebugType>
pdbonly
</DebugType>
<Optimize>
true
</Optimize>
<OutputPath>
bin\Release\
</OutputPath>
<DefineConstants>
TRACE
</DefineConstants>
<ErrorReport>
prompt
</ErrorReport>
<WarningLevel>
4
</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference
Include=
"System"
/>
<Reference
Include=
"System.Core"
/>
<Reference
Include=
"System.Xml.Linq"
/>
<Reference
Include=
"System.Data.DataSetExtensions"
/>
<Reference
Include=
"Microsoft.CSharp"
/>
<Reference
Include=
"System.Data"
/>
<Reference
Include=
"System.Deployment"
/>
<Reference
Include=
"System.Drawing"
/>
<Reference
Include=
"System.Windows.Forms"
/>
<Reference
Include=
"System.Xml"
/>
</ItemGroup>
<ItemGroup>
<Compile
Include=
"Common\ModSearch.cs"
/>
<Compile
Include=
"Common\WTModbus.cs"
/>
<Compile
Include=
"Demo_818X.cs"
>
<SubType>
Form
</SubType>
</Compile>
<Compile
Include=
"Demo_818X.Designer.cs"
>
<DependentUpon>
Demo_818X.cs
</DependentUpon>
</Compile>
<Compile
Include=
"MDemo.cs"
>
<SubType>
Form
</SubType>
</Compile>
<Compile
Include=
"MDemo.Designer.cs"
>
<DependentUpon>
MDemo.cs
</DependentUpon>
</Compile>
<Compile
Include=
"Program.cs"
/>
<Compile
Include=
"Properties\AssemblyInfo.cs"
/>
<Compile
Include=
"ProTest.cs"
>
<SubType>
Form
</SubType>
</Compile>
<Compile
Include=
"ProTest.Designer.cs"
>
<DependentUpon>
ProTest.cs
</DependentUpon>
</Compile>
<EmbeddedResource
Include=
"Demo_818X.resx"
>
<DependentUpon>
Demo_818X.cs
</DependentUpon>
</EmbeddedResource>
<EmbeddedResource
Include=
"MDemo.resx"
>
<DependentUpon>
MDemo.cs
</DependentUpon>
</EmbeddedResource>
<EmbeddedResource
Include=
"Properties\Resources.resx"
>
<Generator>
ResXFileCodeGenerator
</Generator>
<LastGenOutput>
Resources.Designer.cs
</LastGenOutput>
<SubType>
Designer
</SubType>
</EmbeddedResource>
<Compile
Include=
"Properties\Resources.Designer.cs"
>
<AutoGen>
True
</AutoGen>
<DependentUpon>
Resources.resx
</DependentUpon>
<DesignTime>
True
</DesignTime>
</Compile>
<EmbeddedResource
Include=
"ProTest.resx"
>
<DependentUpon>
ProTest.cs
</DependentUpon>
</EmbeddedResource>
<None
Include=
"Properties\Settings.settings"
>
<Generator>
SettingsSingleFileGenerator
</Generator>
<LastGenOutput>
Settings.Designer.cs
</LastGenOutput>
</None>
<Compile
Include=
"Properties\Settings.Designer.cs"
>
<AutoGen>
True
</AutoGen>
<DependentUpon>
Settings.settings
</DependentUpon>
<DesignTimeSharedInput>
True
</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<Folder
Include=
"Lib\"
/>
</ItemGroup>
<ItemGroup>
<None
Include=
"Resources\057.png"
/>
</ItemGroup>
<Import
Project=
"$(MSBuildToolsPath)\Microsoft.CSharp.targets"
/>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
\ No newline at end of file
ModbusDemo/ModbusDemo/ProTest.Designer.cs
deleted
100644 → 0
View file @
38a1531c
namespace
ModbusDemo
{
partial
class
ProTest
{
/// <summary>
/// Required designer variable.
/// </summary>
private
System
.
ComponentModel
.
IContainer
components
=
null
;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected
override
void
Dispose
(
bool
disposing
)
{
if
(
disposing
&&
(
components
!=
null
))
{
components
.
Dispose
();
}
base
.
Dispose
(
disposing
);
}
#
region
Windows
Form
Designer
generated
code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private
void
InitializeComponent
()
{
this
.
groupBox1
=
new
System
.
Windows
.
Forms
.
GroupBox
();
this
.
label9
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label4
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label3
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label2
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label1
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
hwstart
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
groupBox2
=
new
System
.
Windows
.
Forms
.
GroupBox
();
this
.
label8
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label7
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label6
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label5
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
sfstart
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
groupBox3
=
new
System
.
Windows
.
Forms
.
GroupBox
();
this
.
label10
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label11
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label12
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label13
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label14
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label15
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label16
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label17
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label18
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label19
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label20
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label21
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label22
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label23
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label24
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label25
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label26
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label27
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label28
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
label29
=
new
System
.
Windows
.
Forms
.
Label
();
this
.
onethrun
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
tenthrun
=
new
System
.
Windows
.
Forms
.
Button
();
this
.
groupBox1
.
SuspendLayout
();
this
.
groupBox2
.
SuspendLayout
();
this
.
groupBox3
.
SuspendLayout
();
this
.
SuspendLayout
();
//
// groupBox1
//
this
.
groupBox1
.
Controls
.
Add
(
this
.
label9
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label4
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label3
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label2
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
label1
);
this
.
groupBox1
.
Controls
.
Add
(
this
.
hwstart
);
this
.
groupBox1
.
Location
=
new
System
.
Drawing
.
Point
(
15
,
9
);
this
.
groupBox1
.
Name
=
"groupBox1"
;
this
.
groupBox1
.
Size
=
new
System
.
Drawing
.
Size
(
434
,
65
);
this
.
groupBox1
.
TabIndex
=
0
;
this
.
groupBox1
.
TabStop
=
false
;
this
.
groupBox1
.
Text
=
"设备读取性能"
;
//
// label9
//
this
.
label9
.
AutoSize
=
true
;
this
.
label9
.
Location
=
new
System
.
Drawing
.
Point
(
247
,
32
);
this
.
label9
.
Name
=
"label9"
;
this
.
label9
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label9
.
TabIndex
=
5
;
this
.
label9
.
Text
=
"label9"
;
//
// label4
//
this
.
label4
.
AutoSize
=
true
;
this
.
label4
.
Location
=
new
System
.
Drawing
.
Point
(
381
,
32
);
this
.
label4
.
Name
=
"label4"
;
this
.
label4
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label4
.
TabIndex
=
4
;
this
.
label4
.
Text
=
"label4"
;
//
// label3
//
this
.
label3
.
AutoSize
=
true
;
this
.
label3
.
Location
=
new
System
.
Drawing
.
Point
(
324
,
32
);
this
.
label3
.
Name
=
"label3"
;
this
.
label3
.
Size
=
new
System
.
Drawing
.
Size
(
65
,
12
);
this
.
label3
.
TabIndex
=
3
;
this
.
label3
.
Text
=
"花费时间:"
;
//
// label2
//
this
.
label2
.
AutoSize
=
true
;
this
.
label2
.
Location
=
new
System
.
Drawing
.
Point
(
180
,
32
);
this
.
label2
.
Name
=
"label2"
;
this
.
label2
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label2
.
TabIndex
=
2
;
this
.
label2
.
Text
=
"label2"
;
//
// label1
//
this
.
label1
.
AutoSize
=
true
;
this
.
label1
.
Location
=
new
System
.
Drawing
.
Point
(
109
,
32
);
this
.
label1
.
Name
=
"label1"
;
this
.
label1
.
Size
=
new
System
.
Drawing
.
Size
(
65
,
12
);
this
.
label1
.
TabIndex
=
1
;
this
.
label1
.
Text
=
"读取次数:"
;
//
// hwstart
//
this
.
hwstart
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
27
);
this
.
hwstart
.
Name
=
"hwstart"
;
this
.
hwstart
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
hwstart
.
TabIndex
=
0
;
this
.
hwstart
.
Text
=
"开始"
;
this
.
hwstart
.
UseVisualStyleBackColor
=
true
;
this
.
hwstart
.
Click
+=
new
System
.
EventHandler
(
this
.
hwstart_Click
);
//
// groupBox2
//
this
.
groupBox2
.
Controls
.
Add
(
this
.
label8
);
this
.
groupBox2
.
Controls
.
Add
(
this
.
label7
);
this
.
groupBox2
.
Controls
.
Add
(
this
.
label6
);
this
.
groupBox2
.
Controls
.
Add
(
this
.
label5
);
this
.
groupBox2
.
Controls
.
Add
(
this
.
sfstart
);
this
.
groupBox2
.
Location
=
new
System
.
Drawing
.
Point
(
15
,
89
);
this
.
groupBox2
.
Name
=
"groupBox2"
;
this
.
groupBox2
.
Size
=
new
System
.
Drawing
.
Size
(
327
,
65
);
this
.
groupBox2
.
TabIndex
=
1
;
this
.
groupBox2
.
TabStop
=
false
;
this
.
groupBox2
.
Text
=
"ModSim读取性能"
;
//
// label8
//
this
.
label8
.
AutoSize
=
true
;
this
.
label8
.
Location
=
new
System
.
Drawing
.
Point
(
280
,
31
);
this
.
label8
.
Name
=
"label8"
;
this
.
label8
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label8
.
TabIndex
=
4
;
this
.
label8
.
Text
=
"label8"
;
//
// label7
//
this
.
label7
.
AutoSize
=
true
;
this
.
label7
.
Location
=
new
System
.
Drawing
.
Point
(
223
,
31
);
this
.
label7
.
Name
=
"label7"
;
this
.
label7
.
Size
=
new
System
.
Drawing
.
Size
(
65
,
12
);
this
.
label7
.
TabIndex
=
3
;
this
.
label7
.
Text
=
"花费时间:"
;
//
// label6
//
this
.
label6
.
AutoSize
=
true
;
this
.
label6
.
Location
=
new
System
.
Drawing
.
Point
(
166
,
31
);
this
.
label6
.
Name
=
"label6"
;
this
.
label6
.
Size
=
new
System
.
Drawing
.
Size
(
41
,
12
);
this
.
label6
.
TabIndex
=
2
;
this
.
label6
.
Text
=
"label6"
;
//
// label5
//
this
.
label5
.
AutoSize
=
true
;
this
.
label5
.
Location
=
new
System
.
Drawing
.
Point
(
109
,
31
);
this
.
label5
.
Name
=
"label5"
;
this
.
label5
.
Size
=
new
System
.
Drawing
.
Size
(
65
,
12
);
this
.
label5
.
TabIndex
=
1
;
this
.
label5
.
Text
=
"读取次数:"
;
//
// sfstart
//
this
.
sfstart
.
Location
=
new
System
.
Drawing
.
Point
(
26
,
26
);
this
.
sfstart
.
Name
=
"sfstart"
;
this
.
sfstart
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
sfstart
.
TabIndex
=
0
;
this
.
sfstart
.
Text
=
"开始"
;
this
.
sfstart
.
UseVisualStyleBackColor
=
true
;
this
.
sfstart
.
Click
+=
new
System
.
EventHandler
(
this
.
sfstart_Click
);
//
// groupBox3
//
this
.
groupBox3
.
Controls
.
Add
(
this
.
tenthrun
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
onethrun
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label29
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label28
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label27
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label26
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label25
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label24
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label23
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label22
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label21
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label20
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label19
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label18
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label17
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label16
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label15
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label14
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label13
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label12
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label11
);
this
.
groupBox3
.
Controls
.
Add
(
this
.
label10
);
this
.
groupBox3
.
Location
=
new
System
.
Drawing
.
Point
(
15
,
179
);
this
.
groupBox3
.
Name
=
"groupBox3"
;
this
.
groupBox3
.
Size
=
new
System
.
Drawing
.
Size
(
422
,
317
);
this
.
groupBox3
.
TabIndex
=
2
;
this
.
groupBox3
.
TabStop
=
false
;
this
.
groupBox3
.
Text
=
"groupBox3"
;
//
// label10
//
this
.
label10
.
AutoSize
=
true
;
this
.
label10
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
29
);
this
.
label10
.
Name
=
"label10"
;
this
.
label10
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label10
.
TabIndex
=
0
;
this
.
label10
.
Text
=
"label10"
;
//
// label11
//
this
.
label11
.
AutoSize
=
true
;
this
.
label11
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
57
);
this
.
label11
.
Name
=
"label11"
;
this
.
label11
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label11
.
TabIndex
=
0
;
this
.
label11
.
Text
=
"label10"
;
//
// label12
//
this
.
label12
.
AutoSize
=
true
;
this
.
label12
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
85
);
this
.
label12
.
Name
=
"label12"
;
this
.
label12
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label12
.
TabIndex
=
0
;
this
.
label12
.
Text
=
"label10"
;
//
// label13
//
this
.
label13
.
AutoSize
=
true
;
this
.
label13
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
113
);
this
.
label13
.
Name
=
"label13"
;
this
.
label13
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label13
.
TabIndex
=
0
;
this
.
label13
.
Text
=
"label10"
;
//
// label14
//
this
.
label14
.
AutoSize
=
true
;
this
.
label14
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
141
);
this
.
label14
.
Name
=
"label14"
;
this
.
label14
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label14
.
TabIndex
=
0
;
this
.
label14
.
Text
=
"label10"
;
//
// label15
//
this
.
label15
.
AutoSize
=
true
;
this
.
label15
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
169
);
this
.
label15
.
Name
=
"label15"
;
this
.
label15
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label15
.
TabIndex
=
0
;
this
.
label15
.
Text
=
"label10"
;
//
// label16
//
this
.
label16
.
AutoSize
=
true
;
this
.
label16
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
197
);
this
.
label16
.
Name
=
"label16"
;
this
.
label16
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label16
.
TabIndex
=
0
;
this
.
label16
.
Text
=
"label10"
;
//
// label17
//
this
.
label17
.
AutoSize
=
true
;
this
.
label17
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
225
);
this
.
label17
.
Name
=
"label17"
;
this
.
label17
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label17
.
TabIndex
=
0
;
this
.
label17
.
Text
=
"label10"
;
//
// label18
//
this
.
label18
.
AutoSize
=
true
;
this
.
label18
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
253
);
this
.
label18
.
Name
=
"label18"
;
this
.
label18
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label18
.
TabIndex
=
0
;
this
.
label18
.
Text
=
"label10"
;
//
// label19
//
this
.
label19
.
AutoSize
=
true
;
this
.
label19
.
Location
=
new
System
.
Drawing
.
Point
(
175
,
281
);
this
.
label19
.
Name
=
"label19"
;
this
.
label19
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label19
.
TabIndex
=
0
;
this
.
label19
.
Text
=
"label10"
;
//
// label20
//
this
.
label20
.
AutoSize
=
true
;
this
.
label20
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
29
);
this
.
label20
.
Name
=
"label20"
;
this
.
label20
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label20
.
TabIndex
=
1
;
this
.
label20
.
Text
=
"label20"
;
//
// label21
//
this
.
label21
.
AutoSize
=
true
;
this
.
label21
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
57
);
this
.
label21
.
Name
=
"label21"
;
this
.
label21
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label21
.
TabIndex
=
1
;
this
.
label21
.
Text
=
"label20"
;
//
// label22
//
this
.
label22
.
AutoSize
=
true
;
this
.
label22
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
85
);
this
.
label22
.
Name
=
"label22"
;
this
.
label22
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label22
.
TabIndex
=
1
;
this
.
label22
.
Text
=
"label20"
;
//
// label23
//
this
.
label23
.
AutoSize
=
true
;
this
.
label23
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
113
);
this
.
label23
.
Name
=
"label23"
;
this
.
label23
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label23
.
TabIndex
=
1
;
this
.
label23
.
Text
=
"label20"
;
//
// label24
//
this
.
label24
.
AutoSize
=
true
;
this
.
label24
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
141
);
this
.
label24
.
Name
=
"label24"
;
this
.
label24
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label24
.
TabIndex
=
1
;
this
.
label24
.
Text
=
"label20"
;
//
// label25
//
this
.
label25
.
AutoSize
=
true
;
this
.
label25
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
169
);
this
.
label25
.
Name
=
"label25"
;
this
.
label25
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label25
.
TabIndex
=
1
;
this
.
label25
.
Text
=
"label20"
;
//
// label26
//
this
.
label26
.
AutoSize
=
true
;
this
.
label26
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
197
);
this
.
label26
.
Name
=
"label26"
;
this
.
label26
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label26
.
TabIndex
=
1
;
this
.
label26
.
Text
=
"label20"
;
//
// label27
//
this
.
label27
.
AutoSize
=
true
;
this
.
label27
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
225
);
this
.
label27
.
Name
=
"label27"
;
this
.
label27
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label27
.
TabIndex
=
1
;
this
.
label27
.
Text
=
"label20"
;
//
// label28
//
this
.
label28
.
AutoSize
=
true
;
this
.
label28
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
253
);
this
.
label28
.
Name
=
"label28"
;
this
.
label28
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label28
.
TabIndex
=
1
;
this
.
label28
.
Text
=
"label20"
;
//
// label29
//
this
.
label29
.
AutoSize
=
true
;
this
.
label29
.
Location
=
new
System
.
Drawing
.
Point
(
263
,
281
);
this
.
label29
.
Name
=
"label29"
;
this
.
label29
.
Size
=
new
System
.
Drawing
.
Size
(
47
,
12
);
this
.
label29
.
TabIndex
=
1
;
this
.
label29
.
Text
=
"label20"
;
//
// onethrun
//
this
.
onethrun
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
29
);
this
.
onethrun
.
Name
=
"onethrun"
;
this
.
onethrun
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
onethrun
.
TabIndex
=
2
;
this
.
onethrun
.
Text
=
"单一线程测试"
;
this
.
onethrun
.
UseVisualStyleBackColor
=
true
;
this
.
onethrun
.
Click
+=
new
System
.
EventHandler
(
this
.
onethrun_Click
);
//
// tenthrun
//
this
.
tenthrun
.
Location
=
new
System
.
Drawing
.
Point
(
19
,
85
);
this
.
tenthrun
.
Name
=
"tenthrun"
;
this
.
tenthrun
.
Size
=
new
System
.
Drawing
.
Size
(
75
,
23
);
this
.
tenthrun
.
TabIndex
=
3
;
this
.
tenthrun
.
Text
=
"10线程测试"
;
this
.
tenthrun
.
UseVisualStyleBackColor
=
true
;
this
.
tenthrun
.
Click
+=
new
System
.
EventHandler
(
this
.
tenthrun_Click
);
//
// ProTest
//
this
.
AutoScaleDimensions
=
new
System
.
Drawing
.
SizeF
(
6F
,
12F
);
this
.
AutoScaleMode
=
System
.
Windows
.
Forms
.
AutoScaleMode
.
Font
;
this
.
ClientSize
=
new
System
.
Drawing
.
Size
(
461
,
548
);
this
.
Controls
.
Add
(
this
.
groupBox3
);
this
.
Controls
.
Add
(
this
.
groupBox2
);
this
.
Controls
.
Add
(
this
.
groupBox1
);
this
.
Name
=
"ProTest"
;
this
.
Text
=
"性能测试"
;
this
.
groupBox1
.
ResumeLayout
(
false
);
this
.
groupBox1
.
PerformLayout
();
this
.
groupBox2
.
ResumeLayout
(
false
);
this
.
groupBox2
.
PerformLayout
();
this
.
groupBox3
.
ResumeLayout
(
false
);
this
.
groupBox3
.
PerformLayout
();
this
.
ResumeLayout
(
false
);
}
#
endregion
private
System
.
Windows
.
Forms
.
GroupBox
groupBox1
;
private
System
.
Windows
.
Forms
.
GroupBox
groupBox2
;
private
System
.
Windows
.
Forms
.
Button
hwstart
;
private
System
.
Windows
.
Forms
.
Button
sfstart
;
private
System
.
Windows
.
Forms
.
Label
label4
;
private
System
.
Windows
.
Forms
.
Label
label3
;
private
System
.
Windows
.
Forms
.
Label
label2
;
private
System
.
Windows
.
Forms
.
Label
label1
;
private
System
.
Windows
.
Forms
.
Label
label8
;
private
System
.
Windows
.
Forms
.
Label
label7
;
private
System
.
Windows
.
Forms
.
Label
label6
;
private
System
.
Windows
.
Forms
.
Label
label5
;
private
System
.
Windows
.
Forms
.
Label
label9
;
private
System
.
Windows
.
Forms
.
GroupBox
groupBox3
;
private
System
.
Windows
.
Forms
.
Label
label29
;
private
System
.
Windows
.
Forms
.
Label
label28
;
private
System
.
Windows
.
Forms
.
Label
label27
;
private
System
.
Windows
.
Forms
.
Label
label26
;
private
System
.
Windows
.
Forms
.
Label
label25
;
private
System
.
Windows
.
Forms
.
Label
label24
;
private
System
.
Windows
.
Forms
.
Label
label23
;
private
System
.
Windows
.
Forms
.
Label
label22
;
private
System
.
Windows
.
Forms
.
Label
label21
;
private
System
.
Windows
.
Forms
.
Label
label20
;
private
System
.
Windows
.
Forms
.
Label
label19
;
private
System
.
Windows
.
Forms
.
Label
label18
;
private
System
.
Windows
.
Forms
.
Label
label17
;
private
System
.
Windows
.
Forms
.
Label
label16
;
private
System
.
Windows
.
Forms
.
Label
label15
;
private
System
.
Windows
.
Forms
.
Label
label14
;
private
System
.
Windows
.
Forms
.
Label
label13
;
private
System
.
Windows
.
Forms
.
Label
label12
;
private
System
.
Windows
.
Forms
.
Label
label11
;
private
System
.
Windows
.
Forms
.
Label
label10
;
private
System
.
Windows
.
Forms
.
Button
tenthrun
;
private
System
.
Windows
.
Forms
.
Button
onethrun
;
}
}
\ No newline at end of file
ModbusDemo/ModbusDemo/ProTest.cs
deleted
100644 → 0
View file @
38a1531c
using
System
;
using
System.Collections.Generic
;
using
System.ComponentModel
;
using
System.Data
;
using
System.Drawing
;
using
System.Linq
;
using
System.Text
;
using
System.Windows.Forms
;
using
ModbusDemo.Common
;
using
System.Threading
;
using
System.Text.RegularExpressions
;
namespace
ModbusDemo
{
public
partial
class
ProTest
:
Form
{
WTModbus
ReadTest
;
// WTModbus TenReadTest; // = new WTModbus[10];
const
ushort
address
=
1
;
const
ushort
num
=
16
;
const
ushort
DevicePort
=
502
;
string
DeviceIP
=
"192.168.1.57"
;
ManualResetEvent
showmre
=
new
ManualResetEvent
(
false
);
public
delegate
void
invokeDelegate
();
//Ten module
string
[]
TenDeviceIP
=
new
string
[
10
];
public
ProTest
()
{
InitializeComponent
();
setTenIP
();
}
private
void
setTenIP
()
{
TenDeviceIP
[
0
]
=
"192.168.102"
;
TenDeviceIP
[
1
]
=
"192.168.113"
;
TenDeviceIP
[
2
]
=
"192.168.112"
;
TenDeviceIP
[
3
]
=
"192.168.109"
;
TenDeviceIP
[
4
]
=
"192.168.110"
;
TenDeviceIP
[
5
]
=
"192.168.103"
;
TenDeviceIP
[
6
]
=
"192.168.111"
;
TenDeviceIP
[
7
]
=
"192.168.107"
;
TenDeviceIP
[
8
]
=
"192.168.104"
;
TenDeviceIP
[
9
]
=
"192.168.106"
;
}
Boolean
hwstartuse
=
false
;
Thread
t_ReadCoil
;
bool
closethread
=
false
;
private
void
hwstart_Click
(
object
sender
,
EventArgs
e
)
{
if
(!
hwstartuse
)
{
hwstartuse
=
!
hwstartuse
;
this
.
hwstart
.
Text
=
"停止"
;
t_ReadCoil
=
new
Thread
(
ReadCoilProc
);
t_ReadCoil
.
IsBackground
=
true
;
t_ReadCoil
.
Start
();
closethread
=
false
;
}
else
{
hwstartuse
=
!
hwstartuse
;
this
.
hwstart
.
Text
=
"开始"
;
closethread
=
true
;
}
}
private
void
ReadCoilProc
(
object
obj
)
{
short
allval
;
int
readcount
=
0
;
int
failcount
=
0
;
byte
[]
temp
=
new
byte
[
2
];
int
ret
;
ReadTest
=
new
WTModbus
();
int
starttime
=
System
.
Environment
.
TickCount
;
while
(
true
)
{
//读线圈
ret
=
ReadTest
.
ReadCoilStatus
(
address
,
num
,
DeviceIP
,
DevicePort
,
ref
temp
);
// allval = BitConverter.ToInt16(temp, 0);
if
(
ret
==
0
)
{
readcount
++;
}
else
{
failcount
++;
}
invokeDelegate
update
=
()
=>
{
this
.
label2
.
Text
=
readcount
.
ToString
()
+
"次"
;
this
.
label9
.
Text
=
failcount
.
ToString
()
+
"次"
;
this
.
label4
.
Text
=
(
System
.
Environment
.
TickCount
-
starttime
).
ToString
()
+
"ms"
;
};
Invoke
(
update
);
if
(
closethread
)
{
break
;
}
}
}
bool
[]
tenclosethread
=
new
bool
[
10
];
WTModbus
[]
TReadTest
=
new
WTModbus
[
10
];
private
void
eReadCoilProc
(
object
obj
)
{
//WTModbus TReadTest;
int
readcount
=
0
;
int
failcount
=
0
;
byte
[]
temp
=
new
byte
[
2
];
int
ret
;
int
thnum
=
0
;
thnum
=
int
.
Parse
(
obj
.
ToString
());
this
.
TReadTest
[
thnum
]
=
new
WTModbus
();
int
starttime
=
System
.
Environment
.
TickCount
;
while
(
true
)
{
//读线圈
ret
=
TReadTest
[
thnum
].
ReadCoilStatus
(
address
,
num
,
TenDeviceIP
[
thnum
],
DevicePort
,
ref
temp
);
if
(
ret
==
0
)
{
readcount
++;
}
else
{
failcount
++;
}
invokeDelegate
update
=
()
=>
{
foreach
(
Control
c
in
groupBox3
.
Controls
)
{
if
(
c
is
Label
)
{
if
(
c
.
Name
==
(
"label1"
+
thnum
.
ToString
())
)
c
.
Text
=
readcount
.
ToString
()
+
"次"
;
if
(
c
.
Name
==
(
"label2"
+
thnum
.
ToString
()))
c
.
Text
=
(
System
.
Environment
.
TickCount
-
starttime
).
ToString
()
+
"ms"
;
}
}
};
Invoke
(
update
);
if
(
tenclosethread
[
thnum
])
{
break
;
}
}
}
private
void
sfstart_Click
(
object
sender
,
EventArgs
e
)
{
}
Thread
[]
ten_ReadCoil
=
new
Thread
[
10
];
private
void
tenthrun_Click
(
object
sender
,
EventArgs
e
)
{
int
i
=
0
;
if
(!
hwstartuse
)
{
hwstartuse
=
!
hwstartuse
;
this
.
tenthrun
.
Text
=
"停止"
;
for
(
i
=
0
;
i
<
10
;
i
++
)
{
tenclosethread
[
i
]
=
false
;
ten_ReadCoil
[
i
]
=
new
Thread
(
new
ParameterizedThreadStart
(
eReadCoilProc
));
ten_ReadCoil
[
i
].
IsBackground
=
true
;
ten_ReadCoil
[
i
].
Start
(
i
.
ToString
());
}
}
else
{
hwstartuse
=
!
hwstartuse
;
for
(
i
=
0
;
i
<
10
;
i
++)
{
tenclosethread
[
i
]
=
true
;
}
this
.
tenthrun
.
Text
=
"10线程测试"
;
}
}
private
void
onethrun_Click
(
object
sender
,
EventArgs
e
)
{
if
(!
hwstartuse
)
{
hwstartuse
=
!
hwstartuse
;
this
.
onethrun
.
Text
=
"停止"
;
t_ReadCoil
=
new
Thread
(
oneReadCoilProc
);
t_ReadCoil
.
IsBackground
=
true
;
t_ReadCoil
.
Start
();
closethread
=
false
;
}
else
{
hwstartuse
=
!
hwstartuse
;
this
.
onethrun
.
Text
=
"单一线程测试"
;
closethread
=
true
;
}
}
WTModbus
[]
TenReadTest
=
new
WTModbus
[
10
];
private
void
oneReadCoilProc
(
object
obj
)
{
int
[]
readcount
=
new
int
[
10
];
int
[]
failcount
=
new
int
[
10
];
byte
[]
temp
=
new
byte
[
2
];
int
[]
ret
=
new
int
[
10
];
int
i
=
0
;
int
[]
tenstatrttime
=
new
int
[
10
];
for
(
i
=
0
;
i
<
10
;
i
++)
{
TenReadTest
[
i
]
=
new
WTModbus
();
}
for
(
i
=
0
;
i
<
10
;
i
++)
{
tenstatrttime
[
i
]
=
System
.
Environment
.
TickCount
;
}
while
(
true
)
{
//读线圈
for
(
i
=
0
;
i
<
10
;
i
++
)
{
ret
[
i
]
=
TenReadTest
[
i
].
ReadCoilStatus
(
address
,
num
,
TenDeviceIP
[
i
],
DevicePort
,
ref
temp
);
if
(
ret
[
i
]
==
0
)
{
readcount
[
i
]++;
}
else
{
failcount
[
i
]++;
}
invokeDelegate
update
=
()
=>
{
foreach
(
Control
c
in
groupBox3
.
Controls
)
{
if
(
c
is
Label
)
{
if
(
c
.
Name
==
(
"label1"
+
i
.
ToString
()))
c
.
Text
=
readcount
[
i
].
ToString
()
+
"次"
;
if
(
c
.
Name
==
(
"label2"
+
i
.
ToString
()))
c
.
Text
=
(
System
.
Environment
.
TickCount
-
tenstatrttime
[
i
]).
ToString
()
+
"ms"
;
}
}
};
Invoke
(
update
);
}
if
(
closethread
)
{
break
;
}
}
}
}
}
ModbusDemo/ModbusDemo/ProTest.resx
deleted
100644 → 0
View file @
38a1531c
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>
\ No newline at end of file
ModbusDemo/ModbusDemo/Program.cs
deleted
100644 → 0
View file @
38a1531c
using
System
;
using
System.Collections.Generic
;
using
System.Linq
;
using
System.Windows.Forms
;
namespace
ModbusDemo
{
static
class
Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[
STAThread
]
static
void
Main
()
{
Application
.
EnableVisualStyles
();
Application
.
SetCompatibleTextRenderingDefault
(
false
);
Application
.
Run
(
new
Demo_818X
());
//Application.Run(new ProTest());
//Application.Run(new MDemo());
}
}
}
ModbusDemo/ModbusDemo/Properties/AssemblyInfo.cs
deleted
100644 → 0
View file @
38a1531c
using
System.Reflection
;
using
System.Runtime.CompilerServices
;
using
System.Runtime.InteropServices
;
// 有关程序集的常规信息通过以下
// 特性集控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("ModbusDemo")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ModbusDemo")]
[assembly: AssemblyCopyright("Copyright © 2017")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 使此程序集中的类型
// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型,
// 则将该类型上的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("61938d34-0efc-49d0-ac79-236cb9be43d2")]
// 程序集的版本信息由下面四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
ModbusDemo/ModbusDemo/Properties/Resources.Designer.cs
deleted
100644 → 0
View file @
38a1531c
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace
ModbusDemo.Properties
{
using
System
;
/// <summary>
/// 一个强类型的资源类,用于查找本地化的字符串等。
/// </summary>
// 此类是由 StronglyTypedResourceBuilder
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
// (以 /str 作为命令选项),或重新生成 VS 项目。
[
global
::
System
.
CodeDom
.
Compiler
.
GeneratedCodeAttribute
(
"System.Resources.Tools.StronglyTypedResourceBuilder"
,
"15.0.0.0"
)]
[
global
::
System
.
Diagnostics
.
DebuggerNonUserCodeAttribute
()]
[
global
::
System
.
Runtime
.
CompilerServices
.
CompilerGeneratedAttribute
()]
internal
class
Resources
{
private
static
global
::
System
.
Resources
.
ResourceManager
resourceMan
;
private
static
global
::
System
.
Globalization
.
CultureInfo
resourceCulture
;
[
global
::
System
.
Diagnostics
.
CodeAnalysis
.
SuppressMessageAttribute
(
"Microsoft.Performance"
,
"CA1811:AvoidUncalledPrivateCode"
)]
internal
Resources
()
{
}
/// <summary>
/// 返回此类使用的缓存的 ResourceManager 实例。
/// </summary>
[
global
::
System
.
ComponentModel
.
EditorBrowsableAttribute
(
global
::
System
.
ComponentModel
.
EditorBrowsableState
.
Advanced
)]
internal
static
global
::
System
.
Resources
.
ResourceManager
ResourceManager
{
get
{
if
(
object
.
ReferenceEquals
(
resourceMan
,
null
))
{
global
::
System
.
Resources
.
ResourceManager
temp
=
new
global
::
System
.
Resources
.
ResourceManager
(
"ModbusDemo.Properties.Resources"
,
typeof
(
Resources
).
Assembly
);
resourceMan
=
temp
;
}
return
resourceMan
;
}
}
/// <summary>
/// 使用此强类型资源类,为所有资源查找
/// 重写当前线程的 CurrentUICulture 属性。
/// </summary>
[
global
::
System
.
ComponentModel
.
EditorBrowsableAttribute
(
global
::
System
.
ComponentModel
.
EditorBrowsableState
.
Advanced
)]
internal
static
global
::
System
.
Globalization
.
CultureInfo
Culture
{
get
{
return
resourceCulture
;
}
set
{
resourceCulture
=
value
;
}
}
/// <summary>
/// 查找 System.Drawing.Bitmap 类型的本地化资源。
/// </summary>
internal
static
System
.
Drawing
.
Bitmap
_057
{
get
{
object
obj
=
ResourceManager
.
GetObject
(
"057"
,
resourceCulture
);
return
((
System
.
Drawing
.
Bitmap
)(
obj
));
}
}
}
}
ModbusDemo/ModbusDemo/Properties/Resources.resx
deleted
100644 → 0
View file @
38a1531c
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema
id=
"root"
xmlns=
""
xmlns:xsd=
"http://www.w3.org/2001/XMLSchema"
xmlns:msdata=
"urn:schemas-microsoft-com:xml-msdata"
>
<xsd:import
namespace=
"http://www.w3.org/XML/1998/namespace"
/>
<xsd:element
name=
"root"
msdata:IsDataSet=
"true"
>
<xsd:complexType>
<xsd:choice
maxOccurs=
"unbounded"
>
<xsd:element
name=
"metadata"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
use=
"required"
type=
"xsd:string"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"assembly"
>
<xsd:complexType>
<xsd:attribute
name=
"alias"
type=
"xsd:string"
/>
<xsd:attribute
name=
"name"
type=
"xsd:string"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"data"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
<xsd:element
name=
"comment"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"2"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
msdata:Ordinal=
"1"
/>
<xsd:attribute
name=
"type"
type=
"xsd:string"
msdata:Ordinal=
"3"
/>
<xsd:attribute
name=
"mimetype"
type=
"xsd:string"
msdata:Ordinal=
"4"
/>
<xsd:attribute
ref=
"xml:space"
/>
</xsd:complexType>
</xsd:element>
<xsd:element
name=
"resheader"
>
<xsd:complexType>
<xsd:sequence>
<xsd:element
name=
"value"
type=
"xsd:string"
minOccurs=
"0"
msdata:Ordinal=
"1"
/>
</xsd:sequence>
<xsd:attribute
name=
"name"
type=
"xsd:string"
use=
"required"
/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader
name=
"resmimetype"
>
<value>
text/microsoft-resx
</value>
</resheader>
<resheader
name=
"version"
>
<value>
2.0
</value>
</resheader>
<resheader
name=
"reader"
>
<value>
System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader
name=
"writer"
>
<value>
System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<assembly
alias=
"System.Windows.Forms"
name=
"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
/>
<data
name=
"057"
type=
"System.Resources.ResXFileRef, System.Windows.Forms"
>
<value>
..\Resources\057.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
</value>
</data>
</root>
\ No newline at end of file
ModbusDemo/ModbusDemo/Properties/Settings.Designer.cs
deleted
100644 → 0
View file @
38a1531c
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.18408
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
namespace
ModbusDemo.Properties
{
[
global
::
System
.
Runtime
.
CompilerServices
.
CompilerGeneratedAttribute
()]
[
global
::
System
.
CodeDom
.
Compiler
.
GeneratedCodeAttribute
(
"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator"
,
"11.0.0.0"
)]
internal
sealed
partial
class
Settings
:
global
::
System
.
Configuration
.
ApplicationSettingsBase
{
private
static
Settings
defaultInstance
=
((
Settings
)(
global
::
System
.
Configuration
.
ApplicationSettingsBase
.
Synchronized
(
new
Settings
())));
public
static
Settings
Default
{
get
{
return
defaultInstance
;
}
}
}
}
ModbusDemo/ModbusDemo/Properties/Settings.settings
deleted
100644 → 0
View file @
38a1531c
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile
xmlns=
"http://schemas.microsoft.com/VisualStudio/2004/01/settings"
CurrentProfile=
"(Default)"
>
<Profiles>
<Profile
Name=
"(Default)"
/>
</Profiles>
<Settings
/>
</SettingsFile>
ModbusDemo/ModbusDemo/Resources/057.png
deleted
100644 → 0
View file @
38a1531c
18.9 KB
ModbusDemo/Modular/ModualPoll.cs
View file @
b8dca831
...
@@ -10,6 +10,7 @@ using MQTTnet;
...
@@ -10,6 +10,7 @@ using MQTTnet;
using
MQTTnet.Client
;
using
MQTTnet.Client
;
using
Newtonsoft.Json
;
using
Newtonsoft.Json
;
using
ModbusDemo
;
using
ModbusDemo
;
namespace
ModbusDemo.Modular
namespace
ModbusDemo.Modular
{
{
class
ModualPoll
class
ModualPoll
...
@@ -35,7 +36,7 @@ namespace ModbusDemo.Modular
...
@@ -35,7 +36,7 @@ namespace ModbusDemo.Modular
#if DEBUG_TEST
#if DEBUG_TEST
public
const
byte
byX18xNumber
=
1
;
public
const
byte
byX18xNumber
=
1
;
public
static
byte
[]
byX18xIdlist
=
{
13
};
public
static
byte
[]
byX18xIdlist
=
{
13
};
private
static
modual
.
eX18xSensorChannelType
[,]
sX18xChannelType
=
new
modual
.
eX18xSensorChannelType
[
byX18xNumber
,
byX18xReadDataNumber
]
{
{
modual
.
eX18xSensorChannelType
.
Mike_
5
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
}};
private
static
modual
.
eX18xSensorChannelType
[,]
sX18xChannelType
=
new
modual
.
eX18xSensorChannelType
[
byX18xNumber
,
byX18xReadDataNumber
]
{
{
modual
.
eX18xSensorChannelType
.
Mike_
6
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
,
modual
.
eX18xSensorChannelType
.
Null
}};
#else
#else
public
const
byte
byX18xNumber
=
6
;
public
const
byte
byX18xNumber
=
6
;
public
static
byte
[]
byX18xIdlist
=
{
3
,
53
,
6
,
12
,
21
,
25
};
public
static
byte
[]
byX18xIdlist
=
{
3
,
53
,
6
,
12
,
21
,
25
};
...
@@ -70,8 +71,8 @@ namespace ModbusDemo.Modular
...
@@ -70,8 +71,8 @@ namespace ModbusDemo.Modular
public
static
modual
.
pcx78C
cx78c
=
new
modual
.
pcx78C
(
byX78cIdlist
);
public
static
modual
.
pcx78C
cx78c
=
new
modual
.
pcx78C
(
byX78cIdlist
);
#if DEBUG_TEST
#if DEBUG_TEST
public
const
byte
byX66cNumber
=
3
;
public
const
byte
byX66cNumber
=
5
;
public
static
byte
[]
byX66cIdlist
=
{
16
,
31
,
35
};
public
static
byte
[]
byX66cIdlist
=
{
16
,
31
,
35
,
39
,
90
};
#else
#else
public
const
byte
byX66cNumber
=
32
;
public
const
byte
byX66cNumber
=
32
;
public
static
byte
[]
byX66cIdlist
=
{
4
,
5
,
7
,
8
,
9
,
10
,
14
,
15
,
19
,
22
,
23
,
24
,
26
,
30
,
32
,
36
,
37
,
38
,
40
,
41
,
42
,
43
,
44
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
54
,
57
};
public
static
byte
[]
byX66cIdlist
=
{
4
,
5
,
7
,
8
,
9
,
10
,
14
,
15
,
19
,
22
,
23
,
24
,
26
,
30
,
32
,
36
,
37
,
38
,
40
,
41
,
42
,
43
,
44
,
46
,
47
,
48
,
49
,
50
,
51
,
52
,
54
,
57
};
...
@@ -80,7 +81,7 @@ namespace ModbusDemo.Modular
...
@@ -80,7 +81,7 @@ namespace ModbusDemo.Modular
public
const
byte
byX66cRelayRegNumber
=
6
;
public
const
byte
byX66cRelayRegNumber
=
6
;
public
static
modual
.
pcx66C
cx66c
=
new
modual
.
pcx66C
(
byX66cIdlist
);
public
static
modual
.
pcx66C
cx66c
=
new
modual
.
pcx66C
(
byX66cIdlist
);
public
const
byte
COMMFAILALARM
=
3
;
public
static
void
vAllNodePoll
()
public
static
void
vAllNodePoll
()
{
{
for
(
byte
i
=
0
;
i
<
byX14pNumber
;
i
++)
for
(
byte
i
=
0
;
i
<
byX14pNumber
;
i
++)
...
@@ -94,7 +95,8 @@ namespace ModbusDemo.Modular
...
@@ -94,7 +95,8 @@ namespace ModbusDemo.Modular
{
{
for
(
byte
j
=
0
;
j
<
byX14pReadTypeNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX14pReadTypeNumber
;
j
++)
{
{
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx14P
.
sX14PAlarmStruct
[
i
].
usCommFailTimes
[
j
]++;
}
}
}
}
else
else
...
@@ -102,6 +104,7 @@ namespace ModbusDemo.Modular
...
@@ -102,6 +104,7 @@ namespace ModbusDemo.Modular
for
(
byte
j
=
0
;
j
<
byX14pReadTypeNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX14pReadTypeNumber
;
j
++)
{
{
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx14P
.
sX14PAlarmStruct
[
i
].
usCommFailTimes
[
j
]
=
0
;
}
}
}
}
for
(
byte
j
=
0
;
j
<
byX14pReadTypeNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX14pReadTypeNumber
;
j
++)
...
@@ -159,6 +162,7 @@ namespace ModbusDemo.Modular
...
@@ -159,6 +162,7 @@ namespace ModbusDemo.Modular
for
(
sbyte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
for
(
sbyte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
{
{
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx18x
.
sX18xAlarmstruct
[
i
].
usCommFailTimes
[
j
]++;
}
}
}
}
else
else
...
@@ -166,6 +170,7 @@ namespace ModbusDemo.Modular
...
@@ -166,6 +170,7 @@ namespace ModbusDemo.Modular
for
(
sbyte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
for
(
sbyte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
{
{
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx18x
.
sX18xAlarmstruct
[
i
].
usCommFailTimes
[
j
]
=
0
;
}
}
}
}
for
(
byte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
...
@@ -233,6 +238,7 @@ namespace ModbusDemo.Modular
...
@@ -233,6 +238,7 @@ namespace ModbusDemo.Modular
for
(
sbyte
j
=
0
;
j
<
byX78cInputRegNumber
+
byX78cOutputRegNumber
;
j
++)
for
(
sbyte
j
=
0
;
j
<
byX78cInputRegNumber
+
byX78cOutputRegNumber
;
j
++)
{
{
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx78c
.
sX78cAlarmStruct
[
i
].
usCommFailTimes
[
j
]
++;
}
}
}
}
else
else
...
@@ -240,6 +246,7 @@ namespace ModbusDemo.Modular
...
@@ -240,6 +246,7 @@ namespace ModbusDemo.Modular
for
(
sbyte
j
=
0
;
j
<
byX78cInputRegNumber
+
byX78cOutputRegNumber
;
j
++)
for
(
sbyte
j
=
0
;
j
<
byX78cInputRegNumber
+
byX78cOutputRegNumber
;
j
++)
{
{
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx78c
.
sX78cAlarmStruct
[
i
].
usCommFailTimes
[
j
]
=
0
;
}
}
}
}
}
}
...
@@ -253,6 +260,7 @@ namespace ModbusDemo.Modular
...
@@ -253,6 +260,7 @@ namespace ModbusDemo.Modular
for
(
sbyte
j
=
0
;
j
<
byX66cRelayRegNumber
;
j
++)
for
(
sbyte
j
=
0
;
j
<
byX66cRelayRegNumber
;
j
++)
{
{
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
|=
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx66c
.
sX66cAlarmStruct
[
i
].
usCommFailTimes
[
j
]
++;
}
}
}
}
else
else
...
@@ -260,6 +268,7 @@ namespace ModbusDemo.Modular
...
@@ -260,6 +268,7 @@ namespace ModbusDemo.Modular
for
(
sbyte
j
=
0
;
j
<
byX66cRelayRegNumber
;
j
++)
for
(
sbyte
j
=
0
;
j
<
byX66cRelayRegNumber
;
j
++)
{
{
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
cx66c
.
sX66cAlarmStruct
[
i
].
usCommFailTimes
[
j
]
=
0
;
}
}
}
}
}
}
...
@@ -319,6 +328,10 @@ namespace ModbusDemo.Modular
...
@@ -319,6 +328,10 @@ namespace ModbusDemo.Modular
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
for
(
byte
j
=
0
;
j
<
byX14pReadDataNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX14pReadDataNumber
;
j
++)
{
{
if
((
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
)
==
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
&&
cx14P
.
sX14PAlarmStruct
[
i
].
usCommFailTimes
[
j
]
<
COMMFAILALARM
)
{
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
}
if
(
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx14P
.
sX14PAlarmStruct
[
i
].
usBeforeAlarmCode
[
j
])
if
(
cx14P
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx14P
.
sX14PAlarmStruct
[
i
].
usBeforeAlarmCode
[
j
])
{
{
bOccurErrorChange
=
true
;
bOccurErrorChange
=
true
;
...
@@ -342,6 +355,10 @@ namespace ModbusDemo.Modular
...
@@ -342,6 +355,10 @@ namespace ModbusDemo.Modular
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
for
(
byte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX18xReadTypeNumber
;
j
++)
{
{
if
((
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
&
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
)
==
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
&&
cx18x
.
sX18xAlarmstruct
[
i
].
usCommFailTimes
[
j
]
<
COMMFAILALARM
)
{
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
}
if
(
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx18x
.
sX18xAlarmstruct
[
i
].
usBeforeAlarmCode
[
j
])
if
(
cx18x
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx18x
.
sX18xAlarmstruct
[
i
].
usBeforeAlarmCode
[
j
])
{
{
bX18xError
=
true
;
bX18xError
=
true
;
...
@@ -366,6 +383,10 @@ namespace ModbusDemo.Modular
...
@@ -366,6 +383,10 @@ namespace ModbusDemo.Modular
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
for
(
byte
j
=
0
;
j
<
byX78cOutputRegNumber
+
byX78cInputRegNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX78cOutputRegNumber
+
byX78cInputRegNumber
;
j
++)
{
{
if
((
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
)
==
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
&&
cx78c
.
sX78cAlarmStruct
[
i
].
usCommFailTimes
[
j
]
<
COMMFAILALARM
)
{
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
}
if
(
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx78c
.
sX78cAlarmStruct
[
i
].
usBeforeAlarmCode
[
j
])
if
(
cx78c
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx78c
.
sX78cAlarmStruct
[
i
].
usBeforeAlarmCode
[
j
])
{
{
bOccurErrorChange
=
true
;
bOccurErrorChange
=
true
;
...
@@ -390,6 +411,10 @@ namespace ModbusDemo.Modular
...
@@ -390,6 +411,10 @@ namespace ModbusDemo.Modular
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
List
<
ushort
>
usChannelErrorCodeList
=
new
List
<
ushort
>();
for
(
byte
j
=
0
;
j
<
byX66cRelayRegNumber
;
j
++)
for
(
byte
j
=
0
;
j
<
byX66cRelayRegNumber
;
j
++)
{
{
if
((
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
)
==
(
ushort
)
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
&&
cx66c
.
sX66cAlarmStruct
[
i
].
usCommFailTimes
[
j
]
<
COMMFAILALARM
)
{
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
&=
(
ushort
)~
ModualAlarm
.
eAlarmCode
.
ChannelCommunError
;
}
if
(
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx66c
.
sX66cAlarmStruct
[
i
].
usBeforeAlarmCode
[
j
])
if
(
cx66c
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
[
j
]
!=
cx66c
.
sX66cAlarmStruct
[
i
].
usBeforeAlarmCode
[
j
])
{
{
bOccurErrorChange
=
true
;
bOccurErrorChange
=
true
;
...
...
ModbusDemo/Modular/modual.cs
View file @
b8dca831
...
@@ -21,11 +21,20 @@ namespace ModbusDemo.Modular
...
@@ -21,11 +21,20 @@ namespace ModbusDemo.Modular
Normal
=
0
,
Normal
=
0
,
Null
,
Null
,
}
}
public
enum
eModualType
:
byte
{
IDLE
=
0
,
WTDR14P
,
WTDR18X
,
WTDR78C
,
WTDR66C
,
}
public
struct
psxModualAlarm
public
struct
psxModualAlarm
{
{
public
bool
bDataNotFirstIncreaseOrDecrease
;
public
bool
bDataNotFirstIncreaseOrDecrease
;
public
ushort
[]
usNowAlarmCode
;
public
ushort
[]
usNowAlarmCode
;
public
ushort
[]
usBeforeAlarmCode
;
public
ushort
[]
usBeforeAlarmCode
;
public
ushort
[]
usCommFailTimes
;
}
}
public
class
pcx14P
public
class
pcx14P
{
{
...
@@ -43,8 +52,9 @@ namespace ModbusDemo.Modular
...
@@ -43,8 +52,9 @@ namespace ModbusDemo.Modular
this
.
sX14pDataStruct
[
i
].
dNowConvertData
=
new
double
[
ModualPoll
.
byX14pReadDataNumber
];
this
.
sX14pDataStruct
[
i
].
dNowConvertData
=
new
double
[
ModualPoll
.
byX14pReadDataNumber
];
//this.sX14pDataStruct[i].usX14pRegType = new ushort[ModualPoll.byX14pReadDataNumber];
//this.sX14pDataStruct[i].usX14pRegType = new ushort[ModualPoll.byX14pReadDataNumber];
//this.sX14pDataStruct[i].usX14pRegData = new ushort[ModualPoll.byX14pReadDataNumber];
//this.sX14pDataStruct[i].usX14pRegData = new ushort[ModualPoll.byX14pReadDataNumber];
this
.
sX14PAlarmStruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX14pReadDataNumber
];
this
.
sX14PAlarmStruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX14pReadDataNumber
];
this
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX14pReadDataNumber
];
this
.
sX14PAlarmStruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX14pReadDataNumber
];
this
.
sX14PAlarmStruct
[
i
].
usCommFailTimes
=
new
ushort
[
ModualPoll
.
byX14pReadDataNumber
];
}
}
}
}
}
}
...
@@ -83,6 +93,7 @@ namespace ModbusDemo.Modular
...
@@ -83,6 +93,7 @@ namespace ModbusDemo.Modular
//this.sX18xDataStruct[i].usTypeData = new ushort[ModualPoll.byX18xReadDataNumber];
//this.sX18xDataStruct[i].usTypeData = new ushort[ModualPoll.byX18xReadDataNumber];
this
.
sX18xAlarmstruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX18xReadDataNumber
];
this
.
sX18xAlarmstruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX18xReadDataNumber
];
this
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX18xReadDataNumber
];
this
.
sX18xAlarmstruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX18xReadDataNumber
];
this
.
sX18xAlarmstruct
[
i
].
usCommFailTimes
=
new
ushort
[
ModualPoll
.
byX18xReadDataNumber
];
}
}
}
}
}
}
...
@@ -105,6 +116,7 @@ namespace ModbusDemo.Modular
...
@@ -105,6 +116,7 @@ namespace ModbusDemo.Modular
this
.
sX78cRegStatusStruct
[
i
].
bOutPutRegStatus
=
new
bool
[
ModualPoll
.
byX78cOutputRegNumber
];
this
.
sX78cRegStatusStruct
[
i
].
bOutPutRegStatus
=
new
bool
[
ModualPoll
.
byX78cOutputRegNumber
];
this
.
sX78cAlarmStruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX78cInputRegNumber
+
ModualPoll
.
byX78cOutputRegNumber
];
this
.
sX78cAlarmStruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX78cInputRegNumber
+
ModualPoll
.
byX78cOutputRegNumber
];
this
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX78cInputRegNumber
+
ModualPoll
.
byX78cOutputRegNumber
];
this
.
sX78cAlarmStruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX78cInputRegNumber
+
ModualPoll
.
byX78cOutputRegNumber
];
this
.
sX78cAlarmStruct
[
i
].
usCommFailTimes
=
new
ushort
[
ModualPoll
.
byX78cInputRegNumber
+
ModualPoll
.
byX78cOutputRegNumber
];
}
}
}
}
}
}
...
@@ -125,6 +137,7 @@ namespace ModbusDemo.Modular
...
@@ -125,6 +137,7 @@ namespace ModbusDemo.Modular
this
.
sX66cRegStatusStruct
[
i
].
bRegRelayStatus
=
new
bool
[
ModualPoll
.
byX66cRelayRegNumber
];
this
.
sX66cRegStatusStruct
[
i
].
bRegRelayStatus
=
new
bool
[
ModualPoll
.
byX66cRelayRegNumber
];
this
.
sX66cAlarmStruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX66cRelayRegNumber
];
this
.
sX66cAlarmStruct
[
i
].
usBeforeAlarmCode
=
new
ushort
[
ModualPoll
.
byX66cRelayRegNumber
];
this
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX66cRelayRegNumber
];
this
.
sX66cAlarmStruct
[
i
].
usNowAlarmCode
=
new
ushort
[
ModualPoll
.
byX66cRelayRegNumber
];
this
.
sX66cAlarmStruct
[
i
].
usCommFailTimes
=
new
ushort
[
ModualPoll
.
byX66cRelayRegNumber
];
}
}
}
}
}
}
...
...
ModbusDemo/windows/Form1.cs
View file @
b8dca831
...
@@ -26,26 +26,22 @@ namespace ModbusDemo
...
@@ -26,26 +26,22 @@ namespace ModbusDemo
{
{
public
partial
class
Form1
:
Form
public
partial
class
Form1
:
Form
{
{
//Pond FunctionalService = new Pond();
const
bool
LOCALDEBUG
=
false
;
const
bool
LOCALDEBUG
=
false
;
private
bool
bStart
=
false
;
private
bool
bStart
=
false
;
FileStream
fsl
;
AutoResetEvent
exitEvent
;
AutoResetEvent
exitEvent
;
private
int
waitTime
;
private
int
waitTime
;
private
Thread
t_UpgradeConn
;
private
Thread
t_UpgradeConn
;
public
delegate
void
invokeDelegate
();
public
delegate
void
invokeDelegate
();
System
.
Timers
.
Timer
timer
=
new
System
.
Timers
.
Timer
();
System
.
Timers
.
Timer
MQTTTimer
=
new
System
.
Timers
.
Timer
();
System
.
Timers
.
Timer
MQTTTimer
=
new
System
.
Timers
.
Timer
();
BackgroundWorker
m_bgw0
=
new
BackgroundWorker
();
BackgroundWorker
m_bgw0
=
new
BackgroundWorker
();
bool
m_Isbgw0_CanContinueRun
=
true
;
bool
m_Isbgw0_CanContinueRun
=
true
;
bool
State_enable
=
true
;
bool
bCretaThead
=
false
;
public
static
ModbusDemo
.
windows
.
Totxt
totxt
=
new
windows
.
Totxt
(
AppDomain
.
CurrentDomain
.
BaseDirectory
+
@"/log/Log.txt"
);
public
static
ModbusDemo
.
windows
.
Totxt
totxt
=
new
windows
.
Totxt
(
AppDomain
.
CurrentDomain
.
BaseDirectory
+
@"/log/Log.txt"
);
public
Form1
()
public
Form1
()
{
{
InitializeComponent
();
InitializeComponent
();
m_bgw0
.
WorkerSupportsCancellation
=
tru
e
;
m_bgw0
.
WorkerSupportsCancellation
=
fals
e
;
m_bgw0
.
DoWork
+=
m_bgw0_DoWork
;
m_bgw0
.
DoWork
+=
m_bgw0_DoWork
;
}
}
private
void
Form1_Load
(
object
sender
,
EventArgs
e
)
private
void
Form1_Load
(
object
sender
,
EventArgs
e
)
...
@@ -63,54 +59,34 @@ namespace ModbusDemo
...
@@ -63,54 +59,34 @@ namespace ModbusDemo
t_UpgradeConn
=
new
Thread
(
UpgradeProc
);
t_UpgradeConn
=
new
Thread
(
UpgradeProc
);
t_UpgradeConn
.
IsBackground
=
true
;
t_UpgradeConn
.
IsBackground
=
true
;
t_UpgradeConn
.
Start
();
t_UpgradeConn
.
Start
();
Thread
AutoControl
=
new
Thread
(
Auto_Control
);
AutoControl
.
Start
();
}
}
private
void
Form1_FormClosed
(
object
sender
,
FormClosedEventArgs
e
)
private
void
Form1_FormClosed
(
object
sender
,
FormClosedEventArgs
e
)
{
{
System
.
Environment
.
Exit
(
0
);
System
.
Environment
.
Exit
(
0
);
}
}
#
region
参数
/// <summary>
/// 串口变量
/// </summary>
SerialPort
serialPort
;
string
portName
;
int
baudRate
;
int
dataBits
;
Parity
parity
;
StopBits
stopBits
;
private
SerialPort
comPort
=
new
SerialPort
();
private
SerialPort
comPort
=
new
SerialPort
();
public
static
ModbusMaster
master
;
public
static
ModbusMaster
master
;
//////////////////////////////////////////////////////////////
private
MethodInvoker
MQTT_thread
;
string
mqttIp
;
string
mqttIp
;
string
mqttClientId
;
string
mqttClientId
;
int
mqttPort
;
int
mqttPort
;
string
mqttUsername
;
string
mqttUsername
;
string
mqttPwd
;
string
mqttPwd
;
string
mqttTopic
;
public
const
string
mqttSn
=
"66666666"
;
string
mqttSubscribeTopic
;
public
const
string
mqttSubscribeControlTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Ctrl"
;
string
mqttBackTopic
;
public
const
string
mqttBackTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Back"
;
string
mqttSn
=
"66666666"
;
public
const
string
mqttCfgTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Config"
;
public
const
string
mqttCfgResTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/CfgRes"
;
public
const
string
mqttTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Data"
;
public
const
string
sAlarmTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Alarm"
;
string
mqttData
;
//数据
string
mqttData
;
//数据
string
mqttData_Back
;
//数据
string
mqttData_Back
;
//数据
private
IMqttClient
mqttClient
=
null
;
private
IMqttClient
mqttClient
=
null
;
private
bool
isReconnect
=
true
;
private
bool
isReconnect
=
true
;
ushort
address
;
byte
ID
;
int
readyState
;
bool
[]
DI
=
new
bool
[
10
];
bool
[]
DO
=
new
bool
[
10
];
float
[]
AI
=
new
float
[
10
];
float
[]
AO
=
new
float
[
10
];
#
endregion
private
void
SetMqtt
()
private
void
SetMqtt
()
{
{
mqttTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Data"
;
if
(
LOCALDEBUG
==
true
)
if
(
LOCALDEBUG
==
true
)
{
{
mqttIp
=
"47.101.50.24"
;
mqttIp
=
"47.101.50.24"
;
...
@@ -121,19 +97,13 @@ namespace ModbusDemo
...
@@ -121,19 +97,13 @@ namespace ModbusDemo
}
}
else
else
{
{
mqttIp
=
"1
20.27.235.39"
;
mqttIp
=
"1
72.16.1.24"
;
//"120.27.235.39"
mqttClientId
=
GetTimeStamp
()
+
"sxz"
;
mqttClientId
=
GetTimeStamp
()
+
"sxz"
;
mqttPort
=
1883
;
mqttPort
=
1883
;
mqttUsername
=
"pasture"
;
mqttUsername
=
"pasture"
;
mqttPwd
=
"Pasture37774020"
;
mqttPwd
=
"Pasture37774020"
;
}
}
}
}
private
void
SetTopic
()
{
mqttSubscribeTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Ctrl"
;
mqttBackTopic
=
"Witium/WTDS78X/"
+
mqttSn
+
"/Back"
;
}
void
m_bgw0_DoWork
(
object
sender
,
DoWorkEventArgs
e
)
void
m_bgw0_DoWork
(
object
sender
,
DoWorkEventArgs
e
)
{
{
while
(
m_Isbgw0_CanContinueRun
)
while
(
m_Isbgw0_CanContinueRun
)
...
@@ -141,13 +111,11 @@ namespace ModbusDemo
...
@@ -141,13 +111,11 @@ namespace ModbusDemo
int
_n
=
2
;
int
_n
=
2
;
this
.
Invoke
(
new
Action
(()
=>
this
.
Invoke
(
new
Action
(()
=>
{
{
}));
}));
Thread
.
Sleep
(
1000
);
Thread
.
Sleep
(
1000
);
}
}
}
}
#region 时间戳
#
region
时间戳
/// <summary>
/// <summary>
/// 获取时间戳
/// 获取时间戳
/// </summary>
/// </summary>
...
@@ -158,67 +126,14 @@ namespace ModbusDemo
...
@@ -158,67 +126,14 @@ namespace ModbusDemo
return
Convert
.
ToUInt64
(
ts
.
TotalSeconds
);
return
Convert
.
ToUInt64
(
ts
.
TotalSeconds
);
}
}
#endregion
#
endregion
#region 方法
public
void
control
(
byte
SlaveAddress
,
ushort
startAddress
,
bool
value
)
{
bool
OutputValue
;
int
Caution
=
0
;
bool
[]
StateValue
=
{
};
int
[]
WOnOff
=
{
0
};
//Modbus_ReadCoilsTask(out StateValue, SlaveAddress, 16, 6, out int signW);
//WOnOff = state.IO(StateValue);
if
(
WOnOff
[
0
]
==
1
)
{
if
(
startAddress
==
18
)
{
return
;
}
else
{
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, startAddress, value, out Caution);
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, (ushort)(startAddress + 1), value, out Caution);
}
}
else
if
(
WOnOff
[
2
]==
1
)
{
if
(
startAddress
==
16
)
{
return
;
}
else
{
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, startAddress, value, out Caution);
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, (ushort)(startAddress + 1), value, out Caution);
}
}
else
{
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, startAddress, value, out Caution);
//Modbus_WriteSingleCoil(out OutputValue, SlaveAddress, (ushort)(startAddress + 1), value, out Caution);
}
}
public
static
byte
[]
getByte
(
bool
[]
array
)
{
byte
[]
data
=
new
byte
[
array
.
Length
];
for
(
int
i
=
0
;
i
<
array
.
Length
;
i
++)
{
if
(
array
[
i
])
data
[
i
]
=
1
;
else
data
[
i
]
=
0
;
}
return
data
;
}
#endregion
#region mqtt服务
#
region
mqtt
服务
//创建一个委托,是为访问TextBox控件服务的。
//创建一个委托,是为访问TextBox控件服务的。
public
delegate
void
UpdateTxt
(
string
msg
);
public
delegate
void
UpdateTxt
(
string
msg
);
//定义一个委托变量
//定义一个委托变量
public
UpdateTxt
updateTxt
;
public
UpdateTxt
updateTxt
;
private
Thread
ModbusControlThread
;
private
async
Task
Publish
()
private
async
Task
Publish
()
{
{
var
message
=
new
MqttApplicationMessageBuilder
()
var
message
=
new
MqttApplicationMessageBuilder
()
...
@@ -232,7 +147,7 @@ namespace ModbusDemo
...
@@ -232,7 +147,7 @@ namespace ModbusDemo
await
mqttClient
.
PublishAsync
(
message
);
await
mqttClient
.
PublishAsync
(
message
);
}
}
}
}
private
async
Task
Back
()
private
async
Task
vControlResponse
Back
()
{
{
var
message
=
new
MqttApplicationMessageBuilder
()
var
message
=
new
MqttApplicationMessageBuilder
()
.
WithTopic
(
mqttBackTopic
)
.
WithTopic
(
mqttBackTopic
)
...
@@ -243,6 +158,18 @@ namespace ModbusDemo
...
@@ -243,6 +158,18 @@ namespace ModbusDemo
await
mqttClient
.
PublishAsync
(
message
);
await
mqttClient
.
PublishAsync
(
message
);
totxt
.
Log
(
"我在247,执行了Back"
);
totxt
.
Log
(
"我在247,执行了Back"
);
}
}
private
async
Task
vCfgResponseBack
(
string
data
)
{
var
message
=
new
MqttApplicationMessageBuilder
()
.
WithTopic
(
mqttCfgResTopic
)
.
WithPayload
(
data
)
.
WithAtMostOnceQoS
()
.
WithRetainFlag
(
false
)
.
Build
();
await
mqttClient
.
PublishAsync
(
message
);
totxt
.
Log
(
"我在247,执行了Back"
);
}
private
async
Task
Subscribe
()
private
async
Task
Subscribe
()
{
{
if
(!
mqttClient
.
IsConnected
)
if
(!
mqttClient
.
IsConnected
)
...
@@ -253,31 +180,34 @@ namespace ModbusDemo
...
@@ -253,31 +180,34 @@ namespace ModbusDemo
// Subscribe to a topic
// Subscribe to a topic
await
mqttClient
.
SubscribeAsync
(
new
TopicFilterBuilder
()
await
mqttClient
.
SubscribeAsync
(
new
TopicFilterBuilder
()
.
WithTopic
(
mqttSubscribeTopic
)
.
WithTopic
(
mqttSubscribe
Control
Topic
)
.
WithAtMostOnceQoS
()
.
WithAtMostOnceQoS
()
.
Build
()
.
Build
()
);
);
await
mqttClient
.
SubscribeAsync
(
new
TopicFilterBuilder
()
.
WithTopic
(
mqttCfgTopic
)
.
WithAtMostOnceQoS
()
.
Build
()
);
Invoke
((
new
Action
(()
=>
Invoke
((
new
Action
(()
=>
{
{
Console
.
WriteLine
(
"已订阅[{topic}]主题{Environment.NewLine}"
);
Console
.
WriteLine
(
"已订阅[{topic}]主题{Environment.NewLine}"
);
txtReceiveMessage
.
AppendText
(
$"已订阅[
{
mqttSubscribeTopic
}
]主题
{
Environment
.
NewLine
}
"
);
txtReceiveMessage
.
AppendText
(
$"已订阅[
{
mqttSubscribeControlTopic
}
]主题
{
Environment
.
NewLine
}
"
);
txtReceiveMessage
.
AppendText
(
$"已订阅[
{
mqttCfgTopic
}
]主题
{
Environment
.
NewLine
}
"
);
//totxt.Log($"已订阅[{mqttSubscribeTopic}]主题{Environment.NewLine}");
//totxt.Log($"已订阅[{mqttSubscribeTopic}]主题{Environment.NewLine}");
//txtReceiveMessage.AppendText($"已订阅[{Data}]主题{Environment.NewLine}");
//txtReceiveMessage.AppendText($"已订阅[{Data}]主题{Environment.NewLine}");
})));
})));
}
}
private
async
Task
ConnectMqttServerAsync
()
private
async
Task
ConnectMqttServerAsync
()
{
{
// Create a new MQTT client.
// Create a new MQTT client.
if
(
mqttClient
==
null
)
if
(
mqttClient
==
null
)
{
{
var
factory
=
new
MqttFactory
();
var
factory
=
new
MqttFactory
();
mqttClient
=
factory
.
CreateMqttClient
();
mqttClient
=
factory
.
CreateMqttClient
();
mqttClient
.
ApplicationMessageReceived
+=
MqttClient_ApplicationMessageReceived
;
mqttClient
.
ApplicationMessageReceived
+=
MqttClient_ApplicationMessageReceived
;
mqttClient
.
Connected
+=
MqttClient_Connected
;
mqttClient
.
Connected
+=
MqttClient_Connected
;
mqttClient
.
Disconnected
+=
MqttClient_Disconnected
;
mqttClient
.
Disconnected
+=
MqttClient_Disconnected
;
...
@@ -292,7 +222,7 @@ namespace ModbusDemo
...
@@ -292,7 +222,7 @@ namespace ModbusDemo
.
WithClientId
(
mqttClientId
)
.
WithClientId
(
mqttClientId
)
.
WithTcpServer
(
mqttIp
,
mqttPort
)
.
WithTcpServer
(
mqttIp
,
mqttPort
)
.
WithCredentials
(
mqttUsername
,
mqttPwd
)
.
WithCredentials
(
mqttUsername
,
mqttPwd
)
//.WithTls()//服务器端没有启用加密协议,这里用tls的会提示协议异常
//.WithTls()//服务器端没有启用加密协议,这里用tls的会提示协议异常
.
WithCleanSession
()
.
WithCleanSession
()
.
Build
();
.
Build
();
...
@@ -319,18 +249,16 @@ namespace ModbusDemo
...
@@ -319,18 +249,16 @@ namespace ModbusDemo
}
}
}
}
private
void
MqttClient_Connected
(
object
sender
,
EventArgs
e
)
private
void
MqttClient_Connected
(
object
sender
,
EventArgs
e
)
{
{
Invoke
((
new
Action
(()
=>
Invoke
((
new
Action
(()
=>
{
{
txtReceiveMessage
.
Clear
();
//
txtReceiveMessage.Clear();
txtReceiveMessage
.
AppendText
(
"已连接到MQTT服务器!"
+
Environment
.
NewLine
);
txtReceiveMessage
.
AppendText
(
"已连接到MQTT服务器!"
+
Environment
.
NewLine
);
//totxt.Log("已连接到MQTT服务器!" + Environment.NewLine);
//totxt.Log("已连接到MQTT服务器!" + Environment.NewLine);
//Console.WriteLine("已连接到MQTT服务器!" + Environment.NewLine);
//Console.WriteLine("已连接到MQTT服务器!" + Environment.NewLine);
})));
})));
}
}
private
void
MqttClient_Disconnected
(
object
sender
,
EventArgs
e
)
private
void
MqttClient_Disconnected
(
object
sender
,
EventArgs
e
)
{
{
Invoke
((
new
Action
(()
=>
Invoke
((
new
Action
(()
=>
...
@@ -390,7 +318,6 @@ namespace ModbusDemo
...
@@ -390,7 +318,6 @@ namespace ModbusDemo
})));
})));
}
}
}
}
private
void
MqttClient_ApplicationMessageReceived
(
object
sender
,
MqttApplicationMessageReceivedEventArgs
e
)
private
void
MqttClient_ApplicationMessageReceived
(
object
sender
,
MqttApplicationMessageReceivedEventArgs
e
)
{
{
Invoke
((
new
Action
(()
=>
Invoke
((
new
Action
(()
=>
...
@@ -407,91 +334,22 @@ namespace ModbusDemo
...
@@ -407,91 +334,22 @@ namespace ModbusDemo
})));
})));
Invoke
((
new
Action
(
async
()
=>
Invoke
((
new
Action
(
async
()
=>
{
{
bool
on_off
=
true
;
string
passageway
;
string
stConvertString
;
string
stConvertString
;
//消息的内容
//消息的内容
txtReceiveMessage
.
AppendText
(
$">> Payload =
{
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
)}{
Environment
.
NewLine
}
"
);
txtReceiveMessage
.
AppendText
(
$">> Payload =
{
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
)}{
Environment
.
NewLine
}
"
);
totxt
.
Log
(
$">> Payload =
{
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
)}{
Environment
.
NewLine
}
"
);
totxt
.
Log
(
$">> Payload =
{
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
)}{
Environment
.
NewLine
}
"
);
stConvertString
=
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
);
stConvertString
=
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
);
Console
.
WriteLine
(
stConvertString
);
Console
.
WriteLine
(
stConvertString
);
//ModualControl.vGetaWay_Receive_Control(stConvertString);
if
(
e
.
ApplicationMessage
.
Topic
==
mqttSubscribeControlTopic
)
Ctrl
ctrl
=
JsonConvert
.
DeserializeObject
<
Ctrl
>(
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
));
Ctrl
ctrl_Back
=
new
Ctrl
();
Ctrl2
ctrl2
=
new
Ctrl2
();
List
<
Sss
>
ssses
=
new
List
<
Sss
>();
ssses
.
Add
(
new
Sss
());
List
<
Ss
>
ctrl_Back_ss
=
new
List
<
Ss
>();
ctrl_Back_ss
.
Add
(
new
Ss
());
string
txt
=
Encoding
.
UTF8
.
GetString
(
e
.
ApplicationMessage
.
Payload
);
for
(
int
i
=
0
;
i
<
6
;
i
++)
{
{
if
(
txt
.
Contains
(
"d"
+
i
))
ModualControl
.
vGetaWay_Receive_Control
(
stConvertString
,
out
mqttData_Back
);
{
await
vControlResponseBack
();
address
=
(
ushort
)(
16
+
i
);
ctrl2
.
taskId
=
ctrl
.
taskId
.
ToString
();
passageway
=
"d"
+
i
;
if
(
passageway
==
"d0"
)
{
readyState
=
ctrl
.
ss
[
0
].
op
.
d0
;
}
if
(
passageway
==
"d2"
)
{
readyState
=
ctrl
.
ss
[
0
].
op
.
d2
;
}
if
(
passageway
==
"d4"
)
{
readyState
=
ctrl
.
ss
[
0
].
op
.
d4
;
}
ssses
[
0
].
addr
=
ctrl
.
ss
[
0
].
getAddr
();
ssses
[
0
].
op
.
Add
(
"duration"
,
ctrl
.
ss
[
0
].
op
.
getDuration
());
ssses
[
0
].
op
.
Add
(
"startTime"
,
ctrl
.
ss
[
0
].
op
.
getStartTime
());
ssses
[
0
].
op
.
Add
(
passageway
,
readyState
);
ssses
[
0
].
op
.
Add
(
"ts"
,
GetTimeStamp
());
ctrl2
.
ss
=
ssses
;
}
if
(
ctrl
.
ss
[
0
].
op
.
d1
==
1
||
ctrl
.
ss
[
0
].
op
.
d0
==
1
||
ctrl
.
ss
[
0
].
op
.
d2
==
1
||
ctrl
.
ss
[
0
].
op
.
d3
==
1
||
ctrl
.
ss
[
0
].
op
.
d4
==
1
||
ctrl
.
ss
[
0
].
op
.
d5
==
1
)
{
on_off
=
true
;
}
else
on_off
=
false
;
}
ID
=
ctrl
.
ss
[
0
].
getAddr
();
ctrl_Back
.
taskId
=
ctrl
.
taskId
.
ToString
();
ctrl_Back_ss
[
0
]
=
ctrl
.
ss
[
0
];
totxt
.
Log
(
"我在469_ctrl_Back_ss[0] = ctrl.ss[0];"
);
//ctrl_Back.ss[0].op.setStartTime(long.Parse(GetTimeStamp()));
if
(
ctrl
.
ss
[
0
].
op
.
getStartTime
()
!=
0
)
{
Thread
objThread
=
new
Thread
(
new
ThreadStart
(
async
delegate
{
await
ThreadMethodTxtAsync
(
Convert
.
ToInt32
(
ctrl
.
ss
[
0
].
op
.
getDuration
()));
}));
objThread
.
Start
();
}
}
else
if
(
e
.
ApplicationMessage
.
Topic
==
mqttCfgTopic
)
if
(
State_enable
==
true
)
{
{
control
(
ctrl
.
ss
[
0
].
getAddr
(),
address
,
on_off
);
//根据下发确定控制通道
ModualControl
.
vPoolLevelParse
(
stConvertString
,
out
mqttData_Back
);
mqttData_Back
=
JsonConvert
.
SerializeObject
(
ctrl2
);
await
vCfgResponseBack
(
mqttData_Back
);
//Modbus_polling();
await
Publish
();
await
Back
();
}
}
//订阅内容部分jSON 解析转对象 根据modbusID或者设备类型处理设备消息
//解析控制部分
})));
})));
Invoke
((
new
Action
(()
=>
Invoke
((
new
Action
(()
=>
{
{
...
@@ -503,76 +361,29 @@ namespace ModbusDemo
...
@@ -503,76 +361,29 @@ namespace ModbusDemo
txtReceiveMessage
.
AppendText
(
$">> Retain =
{
e
.
ApplicationMessage
.
Retain
}{
Environment
.
NewLine
}
"
);
txtReceiveMessage
.
AppendText
(
$">> Retain =
{
e
.
ApplicationMessage
.
Retain
}{
Environment
.
NewLine
}
"
);
//totxt.Log($">> Retain = {e.ApplicationMessage.Retain}{Environment.NewLine}");
//totxt.Log($">> Retain = {e.ApplicationMessage.Retain}{Environment.NewLine}");
})));
})));
mqttData
=
null
;
mqttData
=
null
;
}
public
async
Task
ThreadMethodTxtAsync
(
int
n
)
{
this
.
BeginInvoke
(
updateTxt
,
"线程开始执行,执行"
+
n
+
"次,每一秒执行一次"
);
int
time
=
n
*
60
;
for
(
int
i
=
0
;
i
<
time
;
i
++)
{
State_enable
=
false
;
this
.
BeginInvoke
(
updateTxt
,
i
.
ToString
());
//一秒 执行一次
Thread
.
Sleep
(
1000
);
if
(
i
>
time
-
2
)
{
control
(
ID
,
address
,
false
);
//根据下发确定控制通道
control
(
ID
,
(
ushort
)(
address
+
1
),
false
);
//根据下发确定控制通道
//Modbus_polling();
await
Publish
();
time
=
0
;
n
=
0
;
State_enable
=
true
;
}
}
this
.
BeginInvoke
(
updateTxt
,
"线程结束"
);
}
}
#endregion
#
endregion
#region modbus线程
//自动控制
private
void
Auto_Control
()
{
AutoControl
.
Control
control_new
=
new
AutoControl
.
Control
();
//东中转池的数据
AutoControl
.
CriticalValueMonitoring
(
true
,
6.5
,
2
,
ModualPoll
.
cx18x
.
sX18xDataStruct
[
0
].
dNowConvertData
[
0
],
"东中转池"
,
out
control_new
);
}
#
region
modbus
线程
private
static
bool
bSetDataIsRunning
=
false
;
private
static
bool
bSetDataIsRunning
=
false
;
private
Thread
ModbusPollThread
;
private
Thread
ModbusPollThread
;
private
bool
bModbusPollThreadStart
=
false
;
private
void
GetData
()
{
//timer.Interval = 12000;
//timer.Enabled = true;
//timer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
//timer.Start();
//timer.Elapsed += (o, a) =>
//{
// SetData();
//};
}
private
void
vModbusPoll
()
private
void
vModbusPoll
()
{
{
while
(
bModbusPollThreadStart
)
while
(
true
)
{
{
bSetDataIsRunning
=
true
;
bSetDataIsRunning
=
true
;
totxt
.
Log
(
"开始执行"
);
ModualPoll
.
vAllNodePoll
();
ModualPoll
.
vAllNodePoll
();
mqttData
=
ModualPoll
.
stAll_Poll_Package
();
mqttData
=
ModualPoll
.
stAll_Poll_Package
();
ModualPoll
.
vCheckAlarm_And_Send
(
mqttClient
);
ModualPoll
.
vCheckAlarm_And_Send
(
mqttClient
);
totxt
.
Log
(
"执行结束"
);
label5
.
Text
=
ModbusComm
.
usCommunFailTimes
.
ToString
();
label5
.
Text
=
ModbusComm
.
usCommunFailTimes
.
ToString
();
Thread
.
Sleep
(
100
);
}
}
}
}
private
void
Sendout
()
private
void
Sendout
()
{
{
Control
.
CheckForIllegalCrossThreadCalls
=
false
;
Control
.
CheckForIllegalCrossThreadCalls
=
false
;
MQTTTimer
.
Interval
=
2
0000
;
//120500
MQTTTimer
.
Interval
=
6
0000
;
//120500
MQTTTimer
.
Enabled
=
true
;
MQTTTimer
.
Enabled
=
true
;
MQTTTimer
.
AutoReset
=
true
;
//设置是执行一次(false)还是一直执行(true);
MQTTTimer
.
AutoReset
=
true
;
//设置是执行一次(false)还是一直执行(true);
MQTTTimer
.
Start
();
MQTTTimer
.
Start
();
...
@@ -615,9 +426,6 @@ namespace ModbusDemo
...
@@ -615,9 +426,6 @@ namespace ModbusDemo
}
}
}
}
}
}
#
region
PoolTest
#endregion
//声明委托
//声明委托
private
delegate
void
ShowMessageDelegate
(
string
message
);
private
delegate
void
ShowMessageDelegate
(
string
message
);
private
void
ShowMessage
(
string
message
)
private
void
ShowMessage
(
string
message
)
...
@@ -633,9 +441,9 @@ namespace ModbusDemo
...
@@ -633,9 +441,9 @@ namespace ModbusDemo
//totxt.Log(message);
//totxt.Log(message);
}
}
}
}
#endregion
#
endregion
#region json字符串转对象
#
region
json
字符串转对象
/// <summary>
/// <summary>
/// json字符串转对象
/// json字符串转对象
/// </summary>
/// </summary>
...
@@ -700,9 +508,9 @@ namespace ModbusDemo
...
@@ -700,9 +508,9 @@ namespace ModbusDemo
return
""
;
return
""
;
}
}
}
}
#endregion
#
endregion
#region 网络检测
#
region
网络检测
ManualResetEvent
network
=
new
ManualResetEvent
(
false
);
ManualResetEvent
network
=
new
ManualResetEvent
(
false
);
Thread
MonitorThread
;
Thread
MonitorThread
;
...
@@ -716,12 +524,10 @@ namespace ModbusDemo
...
@@ -716,12 +524,10 @@ namespace ModbusDemo
MonitorThread
.
IsBackground
=
true
;
MonitorThread
.
IsBackground
=
true
;
MonitorThread
.
Start
();
MonitorThread
.
Start
();
}
}
public
void
MonitorThreadStop
()
public
void
MonitorThreadStop
()
{
{
network
.
Set
();
network
.
Set
();
}
}
private
void
MonitorNetWork
()
private
void
MonitorNetWork
()
{
{
while
(!
network
.
WaitOne
(
500
))
while
(!
network
.
WaitOne
(
500
))
...
@@ -829,11 +635,9 @@ namespace ModbusDemo
...
@@ -829,11 +635,9 @@ namespace ModbusDemo
// isconn = true;
// isconn = true;
return
isconn
;
return
isconn
;
}
}
#
endregion
#
region
更新线程
#endregion
#region 更新线程
string
ImagefilePath
=
null
;
string
ImagefilePath
=
null
;
private
void
bgWorker_DoWork
(
object
sender
,
DoWorkEventArgs
e
)
private
void
bgWorker_DoWork
(
object
sender
,
DoWorkEventArgs
e
)
{
{
...
@@ -941,7 +745,6 @@ namespace ModbusDemo
...
@@ -941,7 +745,6 @@ namespace ModbusDemo
const
int
Singlepackage
=
100
;
const
int
Singlepackage
=
100
;
const
int
PerBlockPacket
=
Singlepackage
;
const
int
PerBlockPacket
=
Singlepackage
;
const
int
MB_ENOERR
=
0
;
int
iFileSizeNow
=
0
;
int
iFileSizeNow
=
0
;
int
iFileSize
=
0
;
int
iFileSize
=
0
;
int
iMaxBufSize
=
1024
*
100
;
int
iMaxBufSize
=
1024
*
100
;
...
@@ -954,7 +757,6 @@ namespace ModbusDemo
...
@@ -954,7 +757,6 @@ namespace ModbusDemo
ushort
[]
usTrans
=
new
ushort
[
Singlepackage
];
ushort
[]
usTrans
=
new
ushort
[
Singlepackage
];
UInt16
[]
u16unlock
=
{
0x5749
,
0x5449
,
0x554D
};
UInt16
[]
u16unlock
=
{
0x5749
,
0x5449
,
0x554D
};
int
ret
;
int
errCnt
=
0
;
int
errCnt
=
0
;
FileStream
fsl
=
File
.
Open
(
ImagefilePath
,
FileMode
.
Open
,
FileAccess
.
ReadWrite
);
FileStream
fsl
=
File
.
Open
(
ImagefilePath
,
FileMode
.
Open
,
FileAccess
.
ReadWrite
);
...
@@ -1143,21 +945,21 @@ namespace ModbusDemo
...
@@ -1143,21 +945,21 @@ namespace ModbusDemo
switch
(
ExceptionCode
.
Trim
())
switch
(
ExceptionCode
.
Trim
())
{
{
case
"1"
:
case
"1"
:
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal function!"
);
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal function!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal function!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal function!"
);
break
;
break
;
case
"2"
:
case
"2"
:
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data address!"
);
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data address!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data address!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data address!"
);
break
;
break
;
case
"3"
:
case
"3"
:
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data value!"
);
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data value!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data value!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Illegal data value!"
);
break
;
break
;
case
"4"
:
case
"4"
:
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Slave device failure!"
);
Console
.
WriteLine
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Slave device failure!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Slave device failure!"
);
MessageBox
.
Show
(
"Exception Code: "
+
ExceptionCode
.
Trim
()
+
"----> Slave device failure!"
);
break
;
break
;
}
}
this
.
UpdateBar
.
Value
=
this
.
UpdateBar
.
Minimum
;
this
.
UpdateBar
.
Value
=
this
.
UpdateBar
.
Minimum
;
...
@@ -1168,11 +970,10 @@ namespace ModbusDemo
...
@@ -1168,11 +970,10 @@ namespace ModbusDemo
}
}
}
}
}
}
#endregion
#
endregion
private
void
txtReceiveMessage_TextChanged
(
object
sender
,
EventArgs
e
)
private
void
txtReceiveMessage_TextChanged
(
object
sender
,
EventArgs
e
)
{
{
if
(
txtReceiveMessage
.
TextLength
>
3000
)
if
(
txtReceiveMessage
.
TextLength
>
3000
)
{
{
txtReceiveMessage
.
Text
=
"0"
;
txtReceiveMessage
.
Text
=
"0"
;
...
@@ -1181,97 +982,66 @@ namespace ModbusDemo
...
@@ -1181,97 +982,66 @@ namespace ModbusDemo
private
void
button2_Click
(
object
sender
,
EventArgs
e
)
private
void
button2_Click
(
object
sender
,
EventArgs
e
)
{
{
AutoControl
.
Control
control
=
new
AutoControl
.
Control
();
ModualPoll
.
vAllNodePoll
();
for
(
double
i
=
0
;
i
<
7
;
i
++)
mqttData
=
ModualPoll
.
stAll_Poll_Package
();
{
AutoControl
.
CriticalValueMonitoring
(
true
,
6.5
,
2
,
i
,
"东中转池"
,
out
control
);
Console
.
WriteLine
(
control
.
Name
);
Console
.
WriteLine
(
control
.
maxLevel
);
Console
.
WriteLine
(
control
.
minLevel
);
Console
.
WriteLine
(
control
.
Enablation
);
Console
.
WriteLine
(
control
.
realTimeLevel
);
Console
.
WriteLine
(
control
.
status
);
Console
.
WriteLine
(
control
.
Beyond_the_limit
);
Console
.
WriteLine
(
control
.
Minimum_Early_Warning
);
Console
.
WriteLine
(
control
.
normal
);
Console
.
WriteLine
(
control
.
StatusTime
);
}
//ModualPoll.cx18x.sX18xDataStruct[0].dNowConvertData[0]
//返回状态
//调用modbus读写线圈
//调用modbus异常报警
}
}
private
async
void
SubscribeBut_Click
(
object
sender
,
EventArgs
e
)
private
async
void
SubscribeBut_Click
(
object
sender
,
EventArgs
e
)
{
{
SetTopic
();
await
Subscribe
();
await
Subscribe
();
}
}
private
MethodInvoker
simpleDelegate1
;
private
MethodInvoker
MQTT_thread
;
[
Obsolete
]
[
Obsolete
]
private
void
btOpenCOM_Click
(
object
sender
,
EventArgs
e
)
private
void
btOpenCOM_Click
(
object
sender
,
EventArgs
e
)
{
{
if
(
LOCALDEBUG
==
true
)
if
(
LOCALDEBUG
==
true
)
{
comPort
.
PortName
=
"COM14"
;
comPort
.
BaudRate
=
9600
;
comPort
.
Parity
=
Parity
.
None
;
comPort
.
StopBits
=
StopBits
.
One
;
comPort
.
DataBits
=
8
;
}
else
{
if
(
cmbPort
.
Text
==
""
)
{
MessageBox
.
Show
(
"串口打开错误"
);
return
;
}
comPort
.
PortName
=
cmbPort
.
Text
;
comPort
.
BaudRate
=
int
.
Parse
(
cmbBaud
.
Text
);
comPort
.
DataBits
=
int
.
Parse
(
cmbDataBit
.
Text
);
if
(
cmbParity
.
Text
.
Substring
(
0
,
1
)
==
"0"
)
{
{
comPort
.
PortName
=
"COM6"
;
comPort
.
BaudRate
=
9600
;
comPort
.
Parity
=
Parity
.
None
;
comPort
.
Parity
=
Parity
.
None
;
comPort
.
StopBits
=
StopBits
.
One
;
comPort
.
DataBits
=
8
;
}
}
else
if
(
cmbParity
.
Text
.
Substring
(
0
,
1
)
==
"1"
)
else
{
comPort
.
Parity
=
Parity
.
Odd
;
}
else
if
(
cmbParity
.
Text
.
Substring
(
0
,
1
)
==
"2"
)
{
comPort
.
Parity
=
Parity
.
Even
;
}
if
(
cmbStopBit
.
Text
==
"0"
)
{
comPort
.
StopBits
=
StopBits
.
None
;
}
else
if
(
cmbStopBit
.
Text
==
"1"
)
{
{
comPort
.
StopBits
=
StopBits
.
One
;
if
(
cmbPort
.
Text
==
""
)
{
MessageBox
.
Show
(
"串口打开错误"
);
return
;
}
comPort
.
PortName
=
cmbPort
.
Text
;
comPort
.
BaudRate
=
int
.
Parse
(
cmbBaud
.
Text
);
comPort
.
DataBits
=
int
.
Parse
(
cmbDataBit
.
Text
);
if
(
cmbParity
.
Text
.
Substring
(
0
,
1
)
==
"0"
)
{
comPort
.
Parity
=
Parity
.
None
;
}
else
if
(
cmbParity
.
Text
.
Substring
(
0
,
1
)
==
"1"
)
{
comPort
.
Parity
=
Parity
.
Odd
;
}
else
if
(
cmbParity
.
Text
.
Substring
(
0
,
1
)
==
"2"
)
{
comPort
.
Parity
=
Parity
.
Even
;
}
if
(
cmbStopBit
.
Text
==
"0"
)
{
comPort
.
StopBits
=
StopBits
.
None
;
}
else
if
(
cmbStopBit
.
Text
==
"1"
)
{
comPort
.
StopBits
=
StopBits
.
One
;
}
}
}
}
try
try
{
{
comPort
.
Open
();
comPort
.
Open
();
isReconnect
=
true
;
isReconnect
=
true
;
SetMqtt
();
SetMqtt
();
if
(
ModbusPollThread
==
null
)
{
ModbusPollThread
=
new
Thread
(
vModbusPoll
);
ModbusPollThread
.
Start
();
}
else
ModbusPollThread
.
Resume
();
bModbusPollThreadStart
=
true
;
//simpleDelegate1 = new MethodInvoker(GetData);
//simpleDelegate1.BeginInvoke(null, null);
MQTT_thread
=
new
MethodInvoker
(
Sendout
);
MQTT_thread
=
new
MethodInvoker
(
Sendout
);
MQTT_thread
.
BeginInvoke
(
null
,
null
);
MQTT_thread
.
BeginInvoke
(
null
,
null
);
Task
.
Run
(
async
()
=>
{
await
ConnectMqttServerAsync
();
});
Task
.
Run
(
async
()
=>
{
await
ConnectMqttServerAsync
();
});
ModbusComm
.
Modbus
=
ModbusSerialMaster
.
CreateRtu
(
comPort
);
ModbusComm
.
Modbus
=
ModbusSerialMaster
.
CreateRtu
(
comPort
);
ModbusComm
.
Modbus
.
Transport
.
Retries
=
0
;
ModbusComm
.
Modbus
.
Transport
.
Retries
=
0
;
ModbusComm
.
Modbus
.
Transport
.
ReadTimeout
=
1000
;
ModbusComm
.
Modbus
.
Transport
.
ReadTimeout
=
1000
;
...
@@ -1282,24 +1052,35 @@ namespace ModbusDemo
...
@@ -1282,24 +1052,35 @@ namespace ModbusDemo
modbus_Timer
.
Enabled
=
true
;
modbus_Timer
.
Enabled
=
true
;
btOpenCOM
.
Enabled
=
false
;
btOpenCOM
.
Enabled
=
false
;
btCloseCOM
.
Enabled
=
true
;
btCloseCOM
.
Enabled
=
true
;
if
(
bCretaThead
==
false
)
{
bCretaThead
=
true
;
ModbusPollThread
=
new
Thread
(
vModbusPoll
);
ModbusPollThread
.
Start
();
ModbusControlThread
=
new
Thread
(
ModualControl
.
vControl_Poll
);
ModbusControlThread
.
Start
();
}
else
{
ModbusPollThread
.
Resume
();
}
totxt
.
Log
(
DateTime
.
Now
.
ToString
()
+
" =>Open "
+
comPort
.
PortName
+
" sucessfully!"
);
totxt
.
Log
(
DateTime
.
Now
.
ToString
()
+
" =>Open "
+
comPort
.
PortName
+
" sucessfully!"
);
}
catch
(
Exception
ex
)
{
totxt
.
Log
(
"Error: "
+
ex
.
Message
);
MessageBox
.
Show
(
"Error: "
+
ex
.
Message
);
return
;
}
}
catch
(
Exception
ex
)
{
totxt
.
Log
(
"Error: "
+
ex
.
Message
);
MessageBox
.
Show
(
"Error: "
+
ex
.
Message
);
return
;
}
}
}
[
Obsolete
]
[
Obsolete
]
private
void
btCloseCOM_Click
(
object
sender
,
EventArgs
e
)
private
void
btCloseCOM_Click
(
object
sender
,
EventArgs
e
)
{
{
//Close comport first,then stop and dispose slave.
//Close comport first,then stop and dispose slave.
//timer.Stop();
if
(
ModbusPollThread
.
IsAlive
==
true
)
bModbusPollThreadStart
=
false
;
ModbusPollThread
.
Suspend
();
if
(
ModbusPollThread
.
IsAlive
)
ModbusPollThread
.
Suspend
();
isReconnect
=
false
;
isReconnect
=
false
;
modbus_Timer
.
Enabled
=
false
;
modbus_Timer
.
Enabled
=
false
;
btOpenCOM
.
Enabled
=
true
;
btOpenCOM
.
Enabled
=
true
;
...
@@ -1309,4 +1090,5 @@ namespace ModbusDemo
...
@@ -1309,4 +1090,5 @@ namespace ModbusDemo
totxt
.
Log
(
DateTime
.
Now
.
ToString
()
+
" =>Disconnect "
+
comPort
.
PortName
);
totxt
.
Log
(
DateTime
.
Now
.
ToString
()
+
" =>Disconnect "
+
comPort
.
PortName
);
}
}
}
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment