Commit 0bbb9e7b authored by leon.huang's avatar leon.huang

add channel communication fail times

parent 051dba9a
......@@ -11,6 +11,8 @@ using ModbusDemo.windows;
using ModbusDemo;
using ModbusDemo.Modular;
using ModbusDemo.Common;
using System.Threading;
using System.Threading.Tasks;
namespace ModbusDemo.MessageFormat
{
public class ModualControl
......@@ -60,15 +62,19 @@ namespace ModbusDemo.MessageFormat
public bool[] bControlBit = new bool[8];
}
public static List<ModualCntrol> liModuualControl = new List<ModualCntrol>();
public const ushort usDefineControlTimes = 1;
string strMapCfg = "[{ srcId: 123, srcType: \"WTDR66C\", srcCh:\"d0\", dstCh:[\"d0\",\"d1\"]}";
public static void vGetaWay_Receive_Control(string sDataString, out string stResponseData)
{
byte byModualIndex = 0;
MqttRoot cControl = new MqttRoot();
var jsonObj = new JObject();
MqttRoot cControl = new MqttRoot();
var jsonObj = new JObject();
try
{
cControl = JsonConvert.DeserializeObject<MqttRoot>(sDataString);
jsonObj = JObject.Parse(sDataString);
}
......@@ -97,8 +103,8 @@ namespace ModbusDemo.MessageFormat
}
else
{
byModualIndex = 0;
cModualCntrol.sbModualIndex = j;
byModualIndex = 0xFF;
cModualCntrol.sbModualIndex = 0xFF;
}
}
if (jsonObj["ss"][i]["op"] != null)
......@@ -106,49 +112,49 @@ namespace ModbusDemo.MessageFormat
if (jsonObj["ss"][i]["op"]["d0"] != null)
{
cControl.ss[i].op.bD0HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d0);
cModualCntrol.bControlData[0] = Convert.ToBoolean(cControl.ss[i].op.d0);
cModualCntrol.bControlBit[0] = true;
}
if (jsonObj["ss"][i]["op"]["d1"] != null)
{
cControl.ss[i].op.bD1HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d1);
cModualCntrol.bControlData[1] = Convert.ToBoolean(cControl.ss[i].op.d1);
cModualCntrol.bControlBit[1] = true;
}
if (jsonObj["ss"][i]["op"]["d2"] != null)
{
cControl.ss[i].op.bD2HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d2);
cModualCntrol.bControlData[2] = Convert.ToBoolean(cControl.ss[i].op.d2);
cModualCntrol.bControlBit[2] = true;
}
if (jsonObj["ss"][i]["op"]["d3"] != null)
{
cControl.ss[0].op.bD3HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d3);
cModualCntrol.bControlData[3] = Convert.ToBoolean(cControl.ss[i].op.d3);
cModualCntrol.bControlBit[3] = true;
}
if (jsonObj["ss"][i]["op"]["d4"] != null)
{
cControl.ss[i].op.bD4HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d4);
cModualCntrol.bControlData[4] = Convert.ToBoolean(cControl.ss[i].op.d4);
cModualCntrol.bControlBit[4] = true;
}
if (jsonObj["ss"][i]["op"]["d5"] != null)
{
cControl.ss[i].op.bD5HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d5);
cModualCntrol.bControlData[5] = Convert.ToBoolean(cControl.ss[i].op.d5);
cModualCntrol.bControlBit[5] = true;
}
if (jsonObj["ss"][i]["op"]["d6"] != null)
{
cControl.ss[i].op.bD6HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d6);
cModualCntrol.bControlData[6] = Convert.ToBoolean(cControl.ss[i].op.d6);
cModualCntrol.bControlBit[6] = true;
}
if (jsonObj["ss"][i]["op"]["d7"] != null)
{
cControl.ss[i].op.bD7HasConfig = true;
cModualCntrol.bControlData[i] = Convert.ToBoolean(cControl.ss[i].op.d7);
cModualCntrol.bControlData[7] = Convert.ToBoolean(cControl.ss[i].op.d7);
cModualCntrol.bControlBit[7] = true;
}
if (ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && cModualCntrol.ulStartTime <= Form1.GetTimeStamp())
......@@ -163,11 +169,11 @@ namespace ModbusDemo.MessageFormat
}
if (ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
if (cModualCntrol.bStartControl == true && cModualCntrol.ulStartTime != 0 && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
{
liModuualControl.Add(cModualCntrol);
}
else if (cModualCntrol.bStartControl == false)
else if (cModualCntrol.bStartControl == false && cModualCntrol.ulStartTime != 0)
{
liModuualControl.Add(cModualCntrol);
}
......@@ -175,9 +181,10 @@ namespace ModbusDemo.MessageFormat
if (cControl.ss[i].op.bD0HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d0"] = 1;
if (byModualIndex != 0)
if (byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[0] = 0;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -185,12 +192,13 @@ namespace ModbusDemo.MessageFormat
else if (cControl.ss[i].op.bD0HasConfig == true)
{
jsonObj["ss"][i]["op"]["d0"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[0] +=usDefineControlTimes;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0xFF && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[0] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -199,9 +207,10 @@ namespace ModbusDemo.MessageFormat
if (cControl.ss[i].op.bD1HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d1"] = 1;
if (byModualIndex != 0)
if (byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[1] = 0;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -209,12 +218,13 @@ namespace ModbusDemo.MessageFormat
else if (cControl.ss[i].op.bD1HasConfig == true)
{
jsonObj["ss"][i]["op"]["d1"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] += usDefineControlTimes;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0xFF && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[1] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -222,9 +232,10 @@ namespace ModbusDemo.MessageFormat
if (cControl.ss[i].op.bD2HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d2"] = 1;
if (byModualIndex != 0)
if (byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[2] = 0;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -232,12 +243,13 @@ namespace ModbusDemo.MessageFormat
else if (cControl.ss[i].op.bD2HasConfig == true)
{
jsonObj["ss"][i]["op"]["d2"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[2] += usDefineControlTimes;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0xFF && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[2] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -245,9 +257,10 @@ namespace ModbusDemo.MessageFormat
if (cControl.ss[i].op.bD3HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d3"] = 1;
if (byModualIndex != 0)
if (byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[3] = 0;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -255,12 +268,13 @@ namespace ModbusDemo.MessageFormat
else if (cControl.ss[i].op.bD3HasConfig == true)
{
jsonObj["ss"][i]["op"]["d3"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[3] += usDefineControlTimes;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0xFF && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[3] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -268,9 +282,10 @@ namespace ModbusDemo.MessageFormat
if (cControl.ss[i].op.bD4HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d4"] = 1;
if (byModualIndex != 0)
if (byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[4] = 0;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -278,12 +293,13 @@ namespace ModbusDemo.MessageFormat
else if (cControl.ss[i].op.bD4HasConfig == true)
{
jsonObj["ss"][i]["op"]["d4"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[4] += usDefineControlTimes;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
if (!Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0xFF && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[4] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -291,9 +307,10 @@ namespace ModbusDemo.MessageFormat
if (cControl.ss[i].op.bD5HasConfig == true && ModbusErrorCode == ModbusComm.eModbusErrorCode.MB_EMASTERNOERR)
{
jsonObj["ss"][i]["op"]["d5"] = 1;
if (byModualIndex != 0)
if (byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[5] = 0;
if (cModualCntrol.bStartControl == true && Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData))
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -301,12 +318,13 @@ namespace ModbusDemo.MessageFormat
else if (cControl.ss[i].op.bD5HasConfig == true)
{
jsonObj["ss"][i]["op"]["d5"] = 0;
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0)
if (ModbusErrorCode != ModbusComm.eModbusErrorCode.MB_EMASTERNOERR && byModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usCommFailTimes[5] += usDefineControlTimes;
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
if (Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0 && cModualCntrol.bStartControl == true)
if (Enumerable.SequenceEqual(cModualCntrol.bControlData, btReadTempData) && byModualIndex != 0xFF && cModualCntrol.bStartControl == true)
{
ModualPoll.cx66c.sX66cAlarmStruct[byModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
}
......@@ -364,10 +382,11 @@ namespace ModbusDemo.MessageFormat
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
if (liModuualControl[i].bControlBit[k] == true && liModuualControl[i].sbModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
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;
}
}
}
......@@ -375,11 +394,12 @@ namespace ModbusDemo.MessageFormat
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
if (liModuualControl[i].bControlBit[k] == true && liModuualControl[i].sbModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
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[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[k] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
}
......@@ -407,10 +427,11 @@ namespace ModbusDemo.MessageFormat
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
if (liModuualControl[i].bControlBit[k] == true && liModuualControl[i].sbModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] |= (ushort)ModualAlarm.eAlarmCode.ChannelControlError;
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;
}
}
}
......@@ -418,11 +439,12 @@ namespace ModbusDemo.MessageFormat
{
for (sbyte k = 0; k < 6; k++)
{
if (liModuualControl[i].bControlBit[k] == true)
if (liModuualControl[i].bControlBit[k] == true && liModuualControl[i].sbModualIndex != 0xFF)
{
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
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[5] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
ModualPoll.cx66c.sX66cAlarmStruct[liModuualControl[i].sbModualIndex].usNowAlarmCode[k] &= (ushort)~ModualAlarm.eAlarmCode.ChannelControlError;
}
}
}
......@@ -431,7 +453,11 @@ namespace ModbusDemo.MessageFormat
}
}
}
Thread.Sleep(100);
}
}
private void v
}
}
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;
}
}
}
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;
}
}
}
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
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做判断并输出一个数组
}
}
}
<?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
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;
}
}
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;
}
}
}
}
}
<?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
<?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
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
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;
}
}
}
}
}
<?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
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());
}
}
}
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")]
//------------------------------------------------------------------------------
// <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));
}
}
}
}
<?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
//------------------------------------------------------------------------------
// <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;
}
}
}
}
<?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>
......@@ -36,7 +36,7 @@ namespace ModbusDemo.Modular
#if DEBUG_TEST
public const byte byX18xNumber = 1;
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
public const byte byX18xNumber = 6;
public static byte[] byX18xIdlist = {3,53,6,12,21,25};
......@@ -81,7 +81,7 @@ namespace ModbusDemo.Modular
public const byte byX66cRelayRegNumber = 6;
public static modual.pcx66C cx66c = new modual.pcx66C(byX66cIdlist);
public const byte COMMFAILALARM = 3;
public static void vAllNodePoll()
{
for (byte i = 0; i < byX14pNumber; i++)
......@@ -95,7 +95,8 @@ namespace ModbusDemo.Modular
{
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
......@@ -103,6 +104,7 @@ namespace ModbusDemo.Modular
for (byte j = 0; j < byX14pReadTypeNumber; j++)
{
cx14P.sX14PAlarmStruct[i].usNowAlarmCode[j] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
cx14P.sX14PAlarmStruct[i].usCommFailTimes[j] = 0;
}
}
for (byte j = 0; j < byX14pReadTypeNumber; j++)
......@@ -160,6 +162,7 @@ namespace ModbusDemo.Modular
for (sbyte j = 0; j < byX18xReadTypeNumber; j++)
{
cx18x.sX18xAlarmstruct[i].usNowAlarmCode[j] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
cx18x.sX18xAlarmstruct[i].usCommFailTimes[j]++;
}
}
else
......@@ -167,6 +170,7 @@ namespace ModbusDemo.Modular
for (sbyte j = 0; j < byX18xReadTypeNumber; j++)
{
cx18x.sX18xAlarmstruct[i].usNowAlarmCode[j] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
cx18x.sX18xAlarmstruct[i].usCommFailTimes[j] = 0;
}
}
for (byte j = 0; j < byX18xReadTypeNumber ; j++)
......@@ -234,6 +238,7 @@ namespace ModbusDemo.Modular
for (sbyte j = 0; j < byX78cInputRegNumber + byX78cOutputRegNumber; j++)
{
cx78c.sX78cAlarmStruct[i].usNowAlarmCode[j] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
cx78c.sX78cAlarmStruct[i].usCommFailTimes[j] ++;
}
}
else
......@@ -241,6 +246,7 @@ namespace ModbusDemo.Modular
for (sbyte j = 0; j < byX78cInputRegNumber + byX78cOutputRegNumber; j++)
{
cx78c.sX78cAlarmStruct[i].usNowAlarmCode[j] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
cx78c.sX78cAlarmStruct[i].usCommFailTimes[j] = 0;
}
}
}
......@@ -254,6 +260,7 @@ namespace ModbusDemo.Modular
for (sbyte j = 0; j < byX66cRelayRegNumber; j++)
{
cx66c.sX66cAlarmStruct[i].usNowAlarmCode[j] |= (ushort)ModualAlarm.eAlarmCode.ChannelCommunError;
cx66c.sX66cAlarmStruct[i].usCommFailTimes[j] ++;
}
}
else
......@@ -261,6 +268,7 @@ namespace ModbusDemo.Modular
for (sbyte j = 0; j < byX66cRelayRegNumber; j++)
{
cx66c.sX66cAlarmStruct[i].usNowAlarmCode[j] &= (ushort)~ModualAlarm.eAlarmCode.ChannelCommunError;
cx66c.sX66cAlarmStruct[i].usCommFailTimes[j] = 0;
}
}
}
......@@ -320,6 +328,10 @@ namespace ModbusDemo.Modular
List<ushort> usChannelErrorCodeList = new List<ushort>();
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])
{
bOccurErrorChange = true;
......@@ -343,6 +355,10 @@ namespace ModbusDemo.Modular
List<ushort> usChannelErrorCodeList = new List<ushort>();
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])
{
bX18xError = true;
......@@ -367,6 +383,10 @@ namespace ModbusDemo.Modular
List<ushort> usChannelErrorCodeList = new List<ushort>();
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])
{
bOccurErrorChange = true;
......@@ -391,6 +411,10 @@ namespace ModbusDemo.Modular
List<ushort> usChannelErrorCodeList = new List<ushort>();
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])
{
bOccurErrorChange = true;
......
......@@ -26,6 +26,7 @@ namespace ModbusDemo.Modular
public bool bDataNotFirstIncreaseOrDecrease;
public ushort[] usNowAlarmCode;
public ushort[] usBeforeAlarmCode;
public ushort[] usCommFailTimes;
}
public class pcx14P
{
......@@ -43,8 +44,9 @@ namespace ModbusDemo.Modular
this.sX14pDataStruct[i].dNowConvertData = new double[ModualPoll.byX14pReadDataNumber];
//this.sX14pDataStruct[i].usX14pRegType = new ushort[ModualPoll.byX14pReadDataNumber];
//this.sX14pDataStruct[i].usX14pRegData = new ushort[ModualPoll.byX14pReadDataNumber];
this.sX14PAlarmStruct[i].usBeforeAlarmCode = new ushort[ModualPoll.byX14pReadDataNumber];
this.sX14PAlarmStruct[i].usNowAlarmCode = new ushort[ModualPoll.byX14pReadDataNumber];
this.sX14PAlarmStruct[i].usBeforeAlarmCode = new ushort[ModualPoll.byX14pReadDataNumber];
this.sX14PAlarmStruct[i].usNowAlarmCode = new ushort[ModualPoll.byX14pReadDataNumber];
this.sX14PAlarmStruct[i].usCommFailTimes = new ushort[ModualPoll.byX14pReadDataNumber];
}
}
}
......@@ -83,6 +85,7 @@ namespace ModbusDemo.Modular
//this.sX18xDataStruct[i].usTypeData = new ushort[ModualPoll.byX18xReadDataNumber];
this.sX18xAlarmstruct[i].usBeforeAlarmCode = new ushort[ModualPoll.byX18xReadDataNumber];
this.sX18xAlarmstruct[i].usNowAlarmCode = new ushort[ModualPoll.byX18xReadDataNumber];
this.sX18xAlarmstruct[i].usCommFailTimes = new ushort[ModualPoll.byX18xReadDataNumber];
}
}
}
......@@ -105,6 +108,7 @@ namespace ModbusDemo.Modular
this.sX78cRegStatusStruct[i].bOutPutRegStatus = new bool[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].usCommFailTimes = new ushort[ModualPoll.byX78cInputRegNumber + ModualPoll.byX78cOutputRegNumber];
}
}
}
......@@ -125,6 +129,7 @@ namespace ModbusDemo.Modular
this.sX66cRegStatusStruct[i].bRegRelayStatus = new bool[ModualPoll.byX66cRelayRegNumber];
this.sX66cAlarmStruct[i].usBeforeAlarmCode = new ushort[ModualPoll.byX66cRelayRegNumber];
this.sX66cAlarmStruct[i].usNowAlarmCode = new ushort[ModualPoll.byX66cRelayRegNumber];
this.sX66cAlarmStruct[i].usCommFailTimes = new ushort[ModualPoll.byX66cRelayRegNumber];
}
}
}
......
......@@ -26,18 +26,15 @@ namespace ModbusDemo
{
public partial class Form1 : Form
{
//Pond FunctionalService = new Pond();
const bool LOCALDEBUG = true;
const bool LOCALDEBUG = false;
private bool bStart = false;
AutoResetEvent exitEvent;
private int waitTime;
private Thread t_UpgradeConn;
public delegate void invokeDelegate();
System.Timers.Timer timer = new System.Timers.Timer();
System.Timers.Timer MQTTTimer = new System.Timers.Timer();
BackgroundWorker m_bgw0 = new BackgroundWorker();
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");
......@@ -77,7 +74,7 @@ namespace ModbusDemo
int mqttPort;
string mqttUsername;
string mqttPwd;
public const string mqttSn = "66666666";
public const string mqttSn = "66666666";
public const string mqttSubscribeControlTopic = "Witium/WTDS78X/" + mqttSn + "/Ctrl";
public const string mqttBackTopic = "Witium/WTDS78X/" + mqttSn + "/Back";
public const string mqttTopic = "Witium/WTDS78X/" + mqttSn + "/Data";
......@@ -86,8 +83,6 @@ namespace ModbusDemo
string mqttData_Back;//数据
private IMqttClient mqttClient = null;
private bool isReconnect = true;
private void SetMqtt()
{
if (LOCALDEBUG == true)
......@@ -100,7 +95,7 @@ namespace ModbusDemo
}
else
{
mqttIp = "120.27.235.39";
mqttIp = "172.16.1.24";//"120.27.235.39"
mqttClientId = GetTimeStamp() + "sxz";
mqttPort = 1883;
mqttUsername = "pasture";
......@@ -114,13 +109,11 @@ namespace ModbusDemo
int _n = 2;
this.Invoke(new Action(() =>
{
}));
Thread.Sleep(1000);
}
}
#region 时间戳
#region 时间戳
/// <summary>
/// 获取时间戳
/// </summary>
......@@ -131,8 +124,9 @@ namespace ModbusDemo
return Convert.ToUInt64(ts.TotalSeconds);
}
#endregion
#region mqtt服务
#endregion
#region mqtt服务
//创建一个委托,是为访问TextBox控件服务的。
public delegate void UpdateTxt(string msg);
//定义一个委托变量
......@@ -190,7 +184,6 @@ namespace ModbusDemo
private async Task ConnectMqttServerAsync()
{
// Create a new MQTT client.
if (mqttClient == null)
{
var factory = new MqttFactory();
......@@ -209,7 +202,7 @@ namespace ModbusDemo
.WithClientId(mqttClientId)
.WithTcpServer(mqttIp, mqttPort)
.WithCredentials(mqttUsername, mqttPwd)
//.WithTls()//服务器端没有启用加密协议,这里用tls的会提示协议异常
.WithCleanSession()
.Build();
......@@ -240,7 +233,7 @@ namespace ModbusDemo
{
Invoke((new Action(() =>
{
txtReceiveMessage.Clear();
//txtReceiveMessage.Clear();
txtReceiveMessage.AppendText("已连接到MQTT服务器!" + Environment.NewLine);
//totxt.Log("已连接到MQTT服务器!" + Environment.NewLine);
//Console.WriteLine("已连接到MQTT服务器!" + Environment.NewLine);
......@@ -343,25 +336,23 @@ namespace ModbusDemo
txtReceiveMessage.AppendText($">> Retain = {e.ApplicationMessage.Retain}{Environment.NewLine}");
//totxt.Log($">> Retain = {e.ApplicationMessage.Retain}{Environment.NewLine}");
})));
mqttData = null ;
mqttData = null;
}
#endregion
#endregion
#region modbus线程
#region modbus线程
private static bool bSetDataIsRunning = false;
private Thread ModbusPollThread;
private bool bModbusPollThreadStart = false;
private void vModbusPoll()
{
while(bModbusPollThreadStart)
while (true)
{
bSetDataIsRunning = true;
totxt.Log("开始执行");
ModualPoll.vAllNodePoll();
mqttData = ModualPoll.stAll_Poll_Package();
ModualPoll.vCheckAlarm_And_Send(mqttClient);
totxt.Log("执行结束");
label5.Text = ModbusComm.usCommunFailTimes.ToString();
Thread.Sleep(100);
}
}
private void Sendout()
......@@ -409,18 +400,7 @@ namespace ModbusDemo
bSetDataIsRunning = false;
}
}
<<<<<<< HEAD
=======
<<<<<<< HEAD
}
#region PoolTest
=======
}
#region PoolTest
>>>>>>> ae9d62a8c8c10f8339da24024e6330c7ac4ff704
#endregion
//声明委托
private delegate void ShowMessageDelegate(string message);
private void ShowMessage(string message)
......@@ -436,9 +416,9 @@ namespace ModbusDemo
//totxt.Log(message);
}
}
#endregion
#endregion
#region json字符串转对象
#region json字符串转对象
/// <summary>
/// json字符串转对象
/// </summary>
......@@ -502,11 +482,10 @@ namespace ModbusDemo
Console.WriteLine(ex.Message);
return "";
}
>>>>>>> origin/master
}
#endregion
#endregion
#region 网络检测
#region 网络检测
ManualResetEvent network = new ManualResetEvent(false);
Thread MonitorThread;
......@@ -631,9 +610,9 @@ namespace ModbusDemo
// isconn = true;
return isconn;
}
#endregion
#endregion
#region 更新线程
#region 更新线程
string ImagefilePath = null;
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
......@@ -941,21 +920,21 @@ namespace ModbusDemo
switch (ExceptionCode.Trim())
{
case "1":
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Illegal function!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Illegal function!");
break;
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Illegal function!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Illegal function!");
break;
case "2":
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data address!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data address!");
break;
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data address!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data address!");
break;
case "3":
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data value!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data value!");
break;
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data value!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Illegal data value!");
break;
case "4":
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Slave device failure!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Slave device failure!");
break;
Console.WriteLine("Exception Code: " + ExceptionCode.Trim() + "----> Slave device failure!");
MessageBox.Show("Exception Code: " + ExceptionCode.Trim() + "----> Slave device failure!");
break;
}
this.UpdateBar.Value = this.UpdateBar.Minimum;
......@@ -966,7 +945,7 @@ namespace ModbusDemo
}
}
}
#endregion
#endregion
private void txtReceiveMessage_TextChanged(object sender, EventArgs e)
{
......@@ -979,7 +958,7 @@ namespace ModbusDemo
private void button2_Click(object sender, EventArgs e)
{
ModualPoll.vAllNodePoll();
mqttData=ModualPoll.stAll_Poll_Package();
mqttData = ModualPoll.stAll_Poll_Package();
}
private async void SubscribeBut_Click(object sender, EventArgs e)
......@@ -990,67 +969,54 @@ namespace ModbusDemo
[Obsolete]
private void btOpenCOM_Click(object sender, EventArgs e)
{
if (LOCALDEBUG == true)
{
comPort.PortName = "COM6";
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")
if (LOCALDEBUG == true)
{
comPort.PortName = "COM6";
comPort.BaudRate = 9600;
comPort.Parity = Parity.None;
comPort.StopBits = StopBits.One;
comPort.DataBits = 8;
}
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")
else
{
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
{
comPort.Open();
isReconnect = true;
SetMqtt();
if (bCretaThead == false)
{
bCretaThead = true;
ModbusPollThread = new Thread(vModbusPoll);
ModbusPollThread.Start();
ModbusControlThread = new Thread(ModualControl.vControl_Poll);
ModbusControlThread.Start();
}
else
{
ModbusPollThread.Resume();
}
bModbusPollThreadStart = true;
MQTT_thread = new MethodInvoker(Sendout);
MQTT_thread.BeginInvoke(null, null);
Task.Run(async () => { await ConnectMqttServerAsync(); });
ModbusComm.Modbus = ModbusSerialMaster.CreateRtu(comPort);
ModbusComm.Modbus.Transport.Retries = 0;
ModbusComm.Modbus.Transport.ReadTimeout = 1000;
......@@ -1061,23 +1027,35 @@ namespace ModbusDemo
modbus_Timer.Enabled = true;
btOpenCOM.Enabled = false;
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!");
}
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]
private void btCloseCOM_Click(object sender, EventArgs e)
{
//Close comport first,then stop and dispose slave.
bModbusPollThreadStart = false;
if(ModbusPollThread.IsAlive)
ModbusPollThread.Suspend();
if (ModbusPollThread.IsAlive == true)
ModbusPollThread.Suspend();
isReconnect = false;
modbus_Timer.Enabled = false;
btOpenCOM.Enabled = true;
......@@ -1087,4 +1065,5 @@ namespace ModbusDemo
totxt.Log(DateTime.Now.ToString() + " =>Disconnect " + comPort.PortName);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment