commit 214368166ad43d5e66ba47f81f167c4a92c9e17e Author: 廖德云 Date: Sat Nov 8 08:17:36 2025 +0800 老的采集程序 diff --git a/ConsoleGetPLCData/App.config b/ConsoleGetPLCData/App.config new file mode 100644 index 0000000..74ade9d --- /dev/null +++ b/ConsoleGetPLCData/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/ConsoleGetPLCData/CS/Coder.cs b/ConsoleGetPLCData/CS/Coder.cs new file mode 100644 index 0000000..df058b8 --- /dev/null +++ b/ConsoleGetPLCData/CS/Coder.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace ConsoleGetPLCData.CS +{ + + /// + /// 通讯编码格式提供者,为通讯服务提供编码和解码服务 + /// 你可以在继承类中定制自己的编码方式如:数据加密传输等 + /// + public class Coder + { + /// + /// 编码方式 + /// + private EncodingMothord _encodingMothord; + + protected Coder() + { + + } + + public Coder(EncodingMothord encodingMothord) + { + _encodingMothord = encodingMothord; + } + + public enum EncodingMothord + { + Default = 0, + Unicode, + UTF8, + ASCII, + } + + /// + /// 通讯数据解码 + /// + /// 需要解码的数据 + /// 编码后的数据 + public virtual string GetEncodingString(byte[] dataBytes, int start, int size) + { + switch (_encodingMothord) + { + case EncodingMothord.Default: + { + return Encoding.Default.GetString(dataBytes, start, size); + } + case EncodingMothord.Unicode: + { + return Encoding.Unicode.GetString(dataBytes, start, size); + } + case EncodingMothord.UTF8: + { + return Encoding.UTF8.GetString(dataBytes, start, size); + } + case EncodingMothord.ASCII: + { + return Encoding.ASCII.GetString(dataBytes, start, size); + } + default: + { + throw (new Exception("未定义的编码格式")); + } + } + + } + + /// + /// Saves the file. + /// + /// Name of the file. + /// The result. + public void SaveFile(string FileName, byte[] Result) + { + try + { + FileStream fs = new FileStream(FileName, FileMode.OpenOrCreate); + fs.Write(Result, 5 + Result[1], Result[2] * 65536 + Result[3] * 256 + Result[4]); + fs.Flush(); + fs.Close(); + } + catch + { + + } + + } + + StreamWriter writer = null; + /// + /// Saves the file. + /// + /// Name of the file. + /// The result. + public void WriteFile(string FileName, string Result) + { + try + { + if (writer == null) + { + writer = new StreamWriter(FileName); + } + writer.Write(string.Concat(Result.ToString(), Environment.NewLine)); + writer.Flush(); + } + catch + { + + } + + } + + /// + /// 数据编码 + /// + /// 需要编码的报文 + /// 编码后的数据 + public virtual byte[] GetTextBytes(string datagram) + { + byte[] rbyte = new byte[Encoding.UTF8.GetBytes(datagram).Length + 1]; + rbyte[0] = 0x55; + switch (_encodingMothord) + { + case EncodingMothord.Default: + { + Encoding.Default.GetBytes(datagram, 0, datagram.Length, rbyte, 1); + return rbyte; + } + case EncodingMothord.Unicode: + { + Encoding.Unicode.GetBytes(datagram, 0, datagram.Length, rbyte, 1); + return rbyte; + } + case EncodingMothord.UTF8: + { + Encoding.UTF8.GetBytes(datagram, 0, datagram.Length, rbyte, 1); + return rbyte; + } + case EncodingMothord.ASCII: + { + Encoding.ASCII.GetBytes(datagram, 0, datagram.Length, rbyte, 1); + return rbyte; + } + default: + { + throw (new Exception("未定义的编码格式")); + } + } + + } + + public virtual byte[] GetFileBytes(string FilePath) + { + if (File.Exists(FilePath)) + { + string fileName = Path.GetFileName(FilePath); + byte[] bytFileName = this.GetTextBytes(fileName); + FileStream fs = new FileStream(FilePath, FileMode.Open); + Byte[] RByte = new byte[fs.Length + 5 + bytFileName.Length]; + RByte[0] = 0x66; + RByte[1] = (byte)(bytFileName.Length); + RByte[2] = (byte)(fs.Length / 65536); + RByte[3] = (byte)(fs.Length / 256); + RByte[4] = (byte)(fs.Length % 256); + bytFileName.CopyTo(RByte, 5); + fs.Read(RByte, 5 + bytFileName.Length, (int)fs.Length); + return RByte; + } + else + { + throw (new Exception("文件不存在")); + } + } + + } +} diff --git a/ConsoleGetPLCData/CS/DatagramResolver.cs b/ConsoleGetPLCData/CS/DatagramResolver.cs new file mode 100644 index 0000000..1131f27 --- /dev/null +++ b/ConsoleGetPLCData/CS/DatagramResolver.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ConsoleGetPLCData.CS +{ + + /// + /// 数据报文分析器,通过分析接收到的原始数据,得到完整的数据报文. + /// 继承该类可以实现自己的报文解析方法. + /// 通常的报文识别方法包括:固定长度,长度标记,标记符等方法 + /// 本类的现实的是标记符的方法,你可以在继承类中实现其他的方法 + /// + public class DatagramResolver + { + /// + /// 报文结束标记 + /// + private string endTag; + + /// + /// 返回结束标记 + /// + public string EndTag + { + get + { + return endTag; + } + } + + /// + /// 受保护的默认构造函数,提供给继承类使用 + /// + protected DatagramResolver() + { + + } + + /// + /// 构造函数 + /// + /// 报文结束标记 + public DatagramResolver(string endTag) + { + if (endTag == null) + { + throw (new ArgumentNullException("结束标记不能为null")); + } + + if (endTag == "") + { + throw (new ArgumentException("结束标记符号不能为空字符串")); + } + + this.endTag = endTag; + } + + /// + /// 解析报文 + /// + /// 原始数据,返回未使用的报文片断, + /// 该片断会保存在Session的Datagram对象中 + /// 报文数组,原始数据可能包含多个报文 + public virtual string[] Resolve(ref string rawDatagram) + { + ArrayList datagrams = new ArrayList(); + + //末尾标记位置索引 + int tagIndex = -1; + + while (true) + { + tagIndex = rawDatagram.IndexOf(endTag, tagIndex + 1); + + if (tagIndex == -1) + { + break; + } + else + { + //按照末尾标记把字符串分为左右两个部分 + string newDatagram = rawDatagram.Substring( + 0, tagIndex + endTag.Length); + + datagrams.Add(newDatagram); + + if (tagIndex + endTag.Length >= rawDatagram.Length) + { + rawDatagram = ""; + + break; + } + + rawDatagram = rawDatagram.Substring(tagIndex + endTag.Length, + rawDatagram.Length - newDatagram.Length); + + //从开始位置开始查找 + tagIndex = 0; + } + } + + string[] results = new string[datagrams.Count]; + + datagrams.CopyTo(results); + + return results; + } + + } + +} diff --git a/ConsoleGetPLCData/CS/GETDataGPRS.cs b/ConsoleGetPLCData/CS/GETDataGPRS.cs new file mode 100644 index 0000000..4c209bc --- /dev/null +++ b/ConsoleGetPLCData/CS/GETDataGPRS.cs @@ -0,0 +1,688 @@ +using ConsoleGetPLCData.CS; +using GetData_PLC; +using Modbus.Device; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace ConsoleGetPLCData +{ + + + public class StateObject + { + // Client socket. + public Socket workSocket = null; + // Size of receive buffer. + public const int BufferSize = 1024; + // Receive buffer. + public byte[] buffer = new byte[BufferSize]; + // Received data string. + public StringBuilder sb = new StringBuilder(); + } + class GETDataGPRS + { + stStation Station = new stStation(); + private ModbusIpMaster master; + private TcpClient client; + private bool WriteDateTimeFlag; + public static ManualResetEvent allDone = new ManualResetEvent(false); + + DataTable dtToday_Flow = new DataTable(); //今日流量总累计 表格 + DataTable dtYesToday_FLOW = new DataTable();//昨日流量总累计 表格 + //private bool readFlag; //读取盘古积算仪 昨日 今日累积量标志 + bool SaveFlag; //保存盘古积算仪 总累计量标志 + DataRow[] drDataTemp;//GPRS PLC设备采集上来的数据临时存放,再赋值 + + static int intTimes = 0; + + static bool blReadSucess = false; + + ///构造函数 初始化 + public GETDataGPRS(stStation strZhan) + { + Station = strZhan; + } + + /// + /// 线程入口函数 + /// + public void GetDataStart() + { + + GetDataByGPRS_YB();//异步通信 + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + "准备采集" + Station.ZCName + "数据"); + + + } + + #region ---------------------异步通讯 + /// + /// 带地址的计量点设备,采用异步通信方式 + /// + private void GetDataByGPRS_YB() + { + try + { + //当点击开始监听的时候 在服务器端创建一个负责监IP地址跟端口号的Socket + Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPAddress ip = IPAddress.Parse(Station.ip); + //IPAddress ip = IPAddress.Parse("127.0.0.1"); + //创建端口号对象 + IPEndPoint point = new IPEndPoint(ip, Station.port); + //监听 + socketWatch.Bind(point); + socketWatch.Listen(10); + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "监听成功!"); + + Thread th = new Thread(Listen); + th.IsBackground = true; + th.Start(socketWatch); + //socketWatch.BeginAccept(new AsyncCallback(AcceptCallback), socketWatch); + + } + catch (Exception ex) + { + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + ex.Message); + + } + + + } + + /// + /// 等待客户端的连接 并且创建与之通信用的Socket + /// + /// + void Listen(object o) + { + Socket socketWatch = o as Socket; + //等待客户端的连接 并且创建一个负责通信的Socket + //while (true) + { + try + { + //开始一个一步操作接受一个连接尝试 + socketWatch.BeginAccept(new AsyncCallback(AcceptCallback), socketWatch); + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "连接成功!"); + //开启 一个新线程不停的接受客户端发送过来的消息 + } + catch + { } + Thread.Sleep(1000); + } + } + /// + /// 异步通信回调函数 + /// + /// + public void AcceptCallback(IAsyncResult ar) + { + //allDone.Set(); + Socket socketSend = (Socket)ar.AsyncState; + Socket socketRecive = socketSend.EndAccept(ar); + StateObject state = new StateObject(); + state.workSocket = socketRecive; + + if (Station.MeterTYPE == "1" || Station.MeterTYPE == "5") + { + readTodayYesTerdayQL(); + } + if (Station.MeterTYPE == "0") //PLC赋值 定义一个数组 暂存 采集上来的所有计量点的数据,再一并赋值给数据集jldID 和ID转换 + { + int jldMax = ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; + + } + while (true) + { + + try + { + + byte[] SendByte = new byte[8]; + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "正在采集......!"); + switch (Station.MeterTYPE) + { + case "0": //施耐德PLC 异步通讯 采集计量点数目变化 来判断采集的是哪一个计量点的数据 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + //读取PLC的时钟 + SendByte = TranData.Modbus_ReadData(1, 3, 16, 4); + SendByte = TranData.Modbus_ReadData(1, 3, 400 + _jldID * 20, 20); + socketRecive.Send(SendByte); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PLC), state); + Thread.Sleep(1000); + } + break; + case "1": //盘古积算仪 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 0, 16); + socketRecive.Send(SendByte); + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-发送采集命令:" + getString(SendByte, 8)); + + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + + if ((DateTime.Now.Hour == 0 & DateTime.Now.Minute == 0 & DateTime.Now.Second == 10)) //过了零点存取累计总量,然后读取昨日累计总量 + { + SaveFlag = true; + } + + if (SaveFlag & blReadSucess) + { + SaveTable(0); + readTodayYesTerdayQL(); + //Console.WriteLine("存数据库成功" + readFlag.ToString() + timeNow.ToString() + "--" + (SbType == "2" & (timeNow.Hour == 20 & timeNow.Minute == 45 & timeNow.Second > 10) & readFlag == false).ToString ()); + SaveFlag = false; + } + + } + break; + case "2": //103 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 7102, 22); + + socketRecive.Send(SendByte); + Console.WriteLine(DateTime.Now.ToString()+"------" + Station.ZCName + "-发送采集命令:" + getString(SendByte,8)); + + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + + break; + case "3": + break; + case "4": //爱知超声波流量计 + for (int i = 0; i < ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 511, 15); + socketRecive.Send(SendByte); + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-发送采集命令:" + getString(SendByte, 8)); + Thread.Sleep(2000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_CSB), state); + + } + break; + + + case "5":// 温州福鑫旋进旋涡流量计 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 4, 30); + socketRecive.Send(SendByte); + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-发送采集命令:" + getString(SendByte, 8)); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_WZFX), state); + + if ((DateTime.Now.Hour == 0 & DateTime.Now.Minute == 0 & DateTime.Now.Second == 10)) //过了零点存取累计总量,然后读取昨日累计总量 + { + SaveFlag = true; + } + + if (SaveFlag & blReadSucess ) + { + SaveTable(0); + readTodayYesTerdayQL(); + //Console.WriteLine("存数据库成功" + readFlag.ToString() + timeNow.ToString() + "--" + (SbType == "2" & (timeNow.Hour == 20 & timeNow.Minute == 45 & timeNow.Second > 10) & readFlag == false).ToString ()); + SaveFlag = false; + } + + } + break; + + + case "6": //腾空PLC + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 10100, 22); + socketRecive.Send(SendByte); + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-发送采集命令:" + getString(SendByte, 8)); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + + break; + + + default: + break; + } + + } + catch (Exception ex) + { + + Console.WriteLine(DateTime.Now.ToString() + "------" + ex.Message ); + } + + if (DateTime.Now.Hour == 23 && DateTime.Now.Minute == 59) + { + Thread.Sleep(2000); + + } + else + { + if (intTimes > 5) + { + intTimes = 5; + Thread.Sleep(Station.readDiffTime); + } + else + { + Thread.Sleep(3000); + } + } + + intTimes = intTimes + 1; + } + } + + public static string getString(Byte[] temp,int intCount) + { + string strTemp = ""; + for (int i = 0; i < intCount; i++) + { + strTemp = strTemp + temp[i].ToString() + " "; + } + return strTemp; + } + /// + /// 解析GPRS读取的PLC数据 + /// + /// + + public void ReadCallback_PLC(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + + + try + { + if (dataNum == 8) //读取的时钟 + { + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["PLCTime"] = getPLCDateTime(state.buffer); //获取PLC时间 + } + } + catch + { } + + try + { + if (dataNum == 40) // 代表1个计量点 jldID=0 + { + + DataRow[] drJldS = { drDataTemp[0] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + drDataTemp[0].ItemArray = drData[0].ItemArray; + + } + } + catch + { } + + + + + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PLC), state); + + } + catch (Exception ex) + { + } + } + + /// + /// 获取并解析福鑫的数据 + /// + /// + public void ReadCallback_WZFX(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 60) + { + Console.WriteLine(DateTime.Now.ToString()+ "------" + Station.ZCName + "-接收数据:" + getString(state.buffer, dataNum)); + + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + blReadSucess = true; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_WZFX), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + blReadSucess = false; + } + } + + /// + /// 获取并解析盘古积算仪的数据 + /// + /// + public void ReadCallback_PG(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 32) + { + + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-接收数据:" + getString(state.buffer, dataNum)); + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + blReadSucess = true; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch (Exception ex) + { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + blReadSucess = false; + } + } + /// + /// 获取并解析爱知超声波的数据 + /// + /// + public void ReadCallback_CSB(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 30) + { + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-接收数据:" + getString(state.buffer, dataNum)); + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + blReadSucess = true; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + blReadSucess = false; + } + } + + /// + /// 获取并解析103的数据 + /// + /// + public void ReadCallback_103(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 44) + { + + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "-接收数据:" + getString(state.buffer, dataNum)); + + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + + blReadSucess = true; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + } + catch + { + } + + } + + /// + /// 获得打印数据监视字符串 + /// + /// + /// + private string strPrint(DataRow dr) + { + return dr["JLD_NAME"] + "\t瞬时量:" + dr["SSL"] + "\t温度:" + dr["WD"] + "\t压力:" + dr["YL"] + "\t累积量:" + dr["LJL"]; + } + + /// + /// 对于没在PLC的设备,每次采集程序启动读取存储的昨日量 今日量的总累积量 + /// + private void readTodayYesTerdayQL() + { + DateTime _Date = DateTime.Now.AddDays(-1); + _Date = DateTime.Parse(_Date.ToString("yyyy-MM-dd")); + string strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "' and RTIME=to_date('" + _Date.ToShortDateString() + "', 'yyyy-mm-dd') order by JLD_ID"; + dtToday_Flow = OracleLink.ExecuteDataTable(strSQL, "DTJK", ""); + strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "' and RTIME=to_date('" + _Date.AddDays(-1).ToShortDateString() + "', 'yyyy-mm-dd') order by JLD_ID"; + dtYesToday_FLOW = OracleLink.ExecuteDataTable(strSQL, "DTJK", ""); + } + /// + /// 保存昨日量、今日量到数据库 + /// + /// + private void SaveTable(int intSaveFlag) + { + SaveFlag = true; + Thread.Sleep(2000); + string strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "'"; + OracleLink.SaveDataTable(strSQL, dtToday_Flow, "DTJK", ""); + } + /// + /// 读取GPRS站场PLC的时间 + /// + /// + private string getPLCDateTime(byte[] plc_DateTime) + { + + string[] Uplc_DateTime = new string[4]; + + Uplc_DateTime[0] = plc_DateTime[4].ToString("X2") + plc_DateTime[3].ToString("X2"); + Uplc_DateTime[1] = plc_DateTime[6].ToString("X2") + plc_DateTime[5].ToString("X2"); + Uplc_DateTime[2] = plc_DateTime[8].ToString("X2") + plc_DateTime[7].ToString("X2"); + Uplc_DateTime[3] = plc_DateTime[10].ToString("X2") + plc_DateTime[9].ToString("X2"); + + string plc_Year = Uplc_DateTime[0]; + string plc_Month = Uplc_DateTime[1]; + string plc_Minute = Uplc_DateTime[2]; + string plc_Second = Uplc_DateTime[3]; + string plcDatetime = plc_Year + "-" + plc_Month.Substring(0, 2) + "-" + plc_Month.Substring(2, 2) + " " + plc_Minute.Substring(0, 2) + ":" + plc_Minute.Substring(2, 2) + ":" + plc_Second;//.Substring(0, 2);// +plc_Second.Substring(2, 2); + return plcDatetime; + } + + #endregion + + + } +} diff --git a/ConsoleGetPLCData/CS/GETDataGPRS——.cs b/ConsoleGetPLCData/CS/GETDataGPRS——.cs new file mode 100644 index 0000000..39b6c7d --- /dev/null +++ b/ConsoleGetPLCData/CS/GETDataGPRS——.cs @@ -0,0 +1,1496 @@ +using GetData_PLC; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace ConsoleGetPLCData.CS +{ + + /// + /// 提供TCP连接服务的服务器类 + /// + /// 特点: + /// 1.使用hash表保存所有已连接客户端的状态,收到数据时能实现快速查找.每当 + /// 有一个新的客户端连接就会产生一个新的会话(Session).该Session代表了客 + /// 户端对象. + /// 2.使用异步的Socket事件作为基础,完成网络通讯功能. + /// 3.支持带标记的数据报文格式的识别,以完成大数据报文的传输和适应恶劣的网 + /// 络环境.初步规定该类支持的最大数据报文为640K(即一个数据包的大小不能大于 + /// 640K,否则服务器程序会自动删除报文数据,认为是非法数据),防止因为数据报文 + /// 无限制的增长而导致服务器崩溃 + /// 4.通讯格式默认使用Encoding.Default格式这样就可以和以前32位程序的客户端 + /// 通讯.也可以使用U-16和U-8的的通讯方式进行.可以在该DatagramResolver类的 + /// 继承类中重载编码和解码函数,自定义加密格式进行通讯.总之确保客户端与服务 + /// 器端使用相同的通讯格式 + /// 5.使用C# native code,将来出于效率的考虑可以将C++代码写成的32位dll来代替 + /// C#核心代码, 但这样做缺乏可移植性,而且是Unsafe代码(该类的C++代码也存在) + /// 6.可以限制服务器的最大登陆客户端数目 + /// 7.比使用TcpListener提供更加精细的控制和更加强大异步数据传输的功能,可作为 + /// TcpListener的替代类 + /// 8.使用异步通讯模式,完全不用担心通讯阻塞和线程问题,无须考虑通讯的细节 + /// + /// + public class GETDataGPRS + { + #region 定义字段 + + /// + /// 站场属性赋值 + /// + stStation Station = new stStation(); + DataTable dtToday_Flow = new DataTable(); //今日流量总累计 表格 + DataTable dtYesToday_FLOW = new DataTable();//昨日流量总累计 表格 + //private bool readFlag; //读取盘古积算仪 昨日 今日累积量标志 + bool SaveFlag; //保存盘古积算仪 总累计量标志 + + + DataRow[] drDataTemp;//GPRS PLC设备采集上来的数据临时存放,再赋值 + static int intTimes = 0; + /// + /// 默认的服务器最大连接客户端端数据 + /// + public const int DefaultMaxClient = 100; + + /// + /// 接收数据缓冲区大小64K + /// + public const int DefaultBufferSize = 4 * 1024 * 1024; + + /// + /// 最大数据报文大小 + /// + public const int MaxDatagramSize = 4 * 1024 * 1024; + + /// + /// 报文解析器 + /// + private DatagramResolver _resolver; + + /// + /// 通讯格式编码解码器 + /// + private Coder _coder; + + /// + /// 服务器程序监听的IP地址 + /// + private IPAddress _serverIP; + /// + /// 服务器程序使用的端口 + /// + private int _port; + + /// + /// 服务器程序允许的最大客户端连接数 + /// + private ushort _maxClient; + + /// + /// 服务器的运行状态 + /// + private bool _isRun; + + /// + /// 接收数据缓冲区 + /// + private byte[] _recvDataBuffer; + + /// + /// 服务器使用的异步Socket类, + /// + private Socket _svrSock; + + /// + /// 保存所有客户端会话的哈希表 + /// + private Hashtable _sessionTable; + + /// + /// 当前的连接的客户端数 + /// + private ushort _clientCount; + + /// + /// 服务器端文件保存路径 + /// + private string _filePath; + + #endregion + + #region 事件定义 + + /// + /// 客户端建立连接事件 + /// + public event NetEvent ClientConn; + + /// + /// 客户端关闭事件 + /// + public event NetEvent ClientClose; + + /// + /// 服务器已经满事件 + /// + public event NetEvent ServerFull; + + /// + /// 服务器接收到数据事件 + /// + public event NetEvent RecvData; + + #endregion + + #region 构造函数 + + /// + /// 构造函数 + /// + /// 服务器端监听的端口号 + /// 服务器能容纳客户端的最大能力 + /// 通讯的编码方式 + public GETDataGPRS(IPAddress serverIP, int port, ushort maxClient, Coder coder, string filePath) + { + _serverIP = serverIP; + _port = port; + _maxClient = maxClient; + _coder = coder; + if (!filePath.EndsWith("\\")) + filePath = filePath + "\\"; + _filePath = filePath; + } + + /// + /// 构造函数 + /// + /// 服务器端监听的端口号 + /// 服务器能容纳客户端的最大能力 + /// 通讯的编码方式 + public GETDataGPRS(stStation strZhan) + { + Station = strZhan; + _serverIP = IPAddress.Parse(Station.ip); + _port = Station.port; + + + //_serverIP = IPAddress.Parse("116.62.236.74"); + //_port = 15001; + } + /// + /// 构造函数(默认使用Default编码方式) + /// + /// 服务器端监听的端口号 + /// 服务器能容纳客户端的最大能力 + public GETDataGPRS(IPAddress serverIP, int port, ushort maxClient, string filePath) + { + _serverIP = serverIP; + _port = port; + _maxClient = maxClient; + _coder = new Coder(Coder.EncodingMothord.Default); + if (!filePath.EndsWith("\\")) + filePath = filePath + "\\"; + _filePath = filePath; + } + + + // + /// 构造函数(默认使用Default编码方式和DefaultMaxClient(100)个客户端的容量) + /// + /// 服务器端监听的端口号 + public GETDataGPRS(IPAddress serverIP, int port, string filePath) + : this(serverIP, port, DefaultMaxClient, filePath) + { + } + + #endregion + + #region 属性 + + /// + /// 服务器的Socket对象 + /// + public Socket ServerSocket + { + get + { + return _svrSock; + } + } + + /// + /// 数据报文分析器 + /// + public DatagramResolver Resovlver + { + get + { + return _resolver; + } + set + { + _resolver = value; + } + } + + /// + /// 客户端会话数组,保存所有的客户端,不允许对该数组的内容进行修改 + /// + public Hashtable SessionTable + { + get + { + return _sessionTable; + } + } + + /// + /// 服务器可以容纳客户端的最大能力 + /// + public int Capacity + { + get + { + return _maxClient; + } + } + + /// + /// 当前的客户端连接数 + /// + public int SessionCount + { + get + { + return _clientCount; + } + } + + /// + /// 服务器运行状态 + /// + public bool IsRun + { + get + { + return _isRun; + } + + } + /// + /// 服务器端文件保存路径 + /// + public string FilePath + { + get + { + return _filePath; + } + + } + + #endregion + + #region 公有方法 + + /// + /// 启动服务器程序,开始监听客户端请求 + /// + public virtual void Start() + { + try + { + + + if (_isRun) + { + throw (new ApplicationException("TcpSvr已经在运行.")); + } + + _sessionTable = new Hashtable(53); + + _recvDataBuffer = new byte[DefaultBufferSize]; + + //初始化socket + _svrSock = new Socket(AddressFamily.InterNetwork, + SocketType.Stream, ProtocolType.Tcp); + + //绑定端口 + IPEndPoint iep = new IPEndPoint(_serverIP, _port); + _svrSock.Bind(iep); + + //开始监听 + _svrSock.Listen(5); + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "监听成功!"); + //设置异步方法接受客户端连接 + _svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock); + + _isRun = true; + } + catch (Exception ex) + { + } + } + + + + /// + /// 停止服务器程序,所有与客户端的连接将关闭 + /// + public virtual void Stop() + { + if (!_isRun) + { + throw (new ApplicationException("TcpSvr已经停止")); + } + + //这个条件语句,一定要在关闭所有客户端以前调用 + //否则在EndConn会出现错误 + _isRun = false; + + //关闭数据连接,负责客户端会认为是强制关闭连接 + if (_svrSock.Connected) + { + _svrSock.Shutdown(SocketShutdown.Both); + } + + CloseAllClient(); + + //清理资源 + _svrSock.Close(); + + _sessionTable = null; + + } + + + /// + /// 关闭所有的客户端会话,与所有的客户端连接会断开 + /// + public virtual void CloseAllClient() + { + foreach (Session client in _sessionTable.Values) + { + client.Close(); + } + + _sessionTable.Clear(); + } + + + /// + /// 关闭一个与客户端之间的会话 + /// + /// 需要关闭的客户端会话对象 + public virtual void CloseSession(Session closeClient) + { + Debug.Assert(closeClient != null); + + if (closeClient != null) + { + + closeClient.Datagram = null; + + _sessionTable.Remove(closeClient.ID); + + _clientCount--; + + //客户端强制关闭链接 + if (ClientClose != null) + { + ClientClose(this, new NetEventArgs(closeClient)); + } + + closeClient.Close(); + } + } + + + /// + /// 发送数据 + /// + /// 接收数据的客户端会话 + /// 数据报文 + public virtual void SendText(Session recvDataClient, string datagram) + { + //获得数据编码 + byte[] data = _coder.GetTextBytes(datagram); + + recvDataClient.ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, + new AsyncCallback(SendDataEnd), recvDataClient.ClientSocket); + + } + + + public virtual void SendFile(Session recvDataClient, string FilePath) + { + if (File.Exists(FilePath)) + { + byte[] data = _coder.GetFileBytes(FilePath); + + recvDataClient.ClientSocket.BeginSend(data, 0, data.Length, SocketFlags.None, + new AsyncCallback(SendDataEnd), recvDataClient.ClientSocket); + } + else + { + throw new Exception("文件不存在"); + } + } + #endregion + + #region 受保护方法 + /// + /// 关闭一个客户端Socket,首先需要关闭Session + /// + /// 目标Socket对象 + /// 客户端退出的类型 + protected virtual void CloseClient(Socket client, Session.ExitType exitType) + { + Debug.Assert(client != null); + + //查找该客户端是否存在,如果不存在,抛出异常 + Session closeClient = FindSession(client); + + closeClient.TypeOfExit = exitType; + + if (closeClient != null) + { + CloseSession(closeClient); + } + else + { + throw (new ApplicationException("需要关闭的Socket对象不存在")); + } + } + + + /// + /// 客户端连接处理函数 + /// + /// 欲建立服务器连接的Socket对象 + protected virtual void AcceptConn(IAsyncResult ar) + { + + //allDone.Set(); + Socket socketSend = (Socket)ar.AsyncState; + Socket socketRecive = socketSend.EndAccept(ar); + StateObject state = new StateObject(); + state.workSocket = socketRecive; + + if (Station.MeterTYPE == "1" || Station.MeterTYPE == "5") + { + readTodayYesTerdayQL(); + } + if (Station.MeterTYPE == "0") //PLC赋值 定义一个数组 暂存 采集上来的所有计量点的数据,再一并赋值给数据集jldID 和ID转换 + { + int jldMax = ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; + int jld_IDMax = Convert.ToInt16(ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows[jldMax - 1]["jld_id"]); + + if (jld_IDMax == 0) + { + drDataTemp = new DataRow[1]; + + } + if (jld_IDMax >= 1) + { + drDataTemp = new DataRow[3]; + + } + if (jld_IDMax >= 3) + { + drDataTemp = new DataRow[6]; + + } + if (jld_IDMax >= 6) + { + drDataTemp = new DataRow[10]; + + } + if (jld_IDMax >= 10) + { + drDataTemp = new DataRow[15]; + + } + if (jld_IDMax >= 15) + { + drDataTemp = new DataRow[21]; + + } + for (int i = 0; i < drDataTemp.Length; i++) + { + DataRow dr = ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].NewRow(); + drDataTemp[i] = dr; + drDataTemp[i]["jld_id"] = i; + drDataTemp[i]["STATION_NAME"] = Station.ZCName; + } + } + while (true) + { + + try + { + + byte[] SendByte = new byte[8]; + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "正在采集......!"); + switch (Station.MeterTYPE) + { + case "0": //施耐德PLC 异步通讯 采集计量点数目变化 来判断采集的是哪一个计量点的数据 + + //读取PLC的时钟 + SendByte = TranData.Modbus_ReadData(1, 3, 16, 4); + + + for (int i = 0; i < drDataTemp.Length; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + if (i == 0) //第一次发一个计量点命令 jldID=0 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 20); + } + if (i == 1) //第二次发2个计量点命令 jldID=1,2 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 40); + i = 2; + } + + if (i == 3) //第三次发3个计量点命令 jldID=3,4,5 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 60); + i = 5; + } + if (i == 6) //第4次发4个计量点命令 jldID=6,7,8,9 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 80); + i = 9; + } + + if (i == 10) //第5次发5个计量点命令 jldID=10,11,12,13,14 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 100); + i = 14; + } + + if (i == 15) //第5次发5个计量点命令 jldID=15,16,17,18,19,20 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 120); + i = 20; + } + socketRecive.Send(SendByte); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PLC), state); + Thread.Sleep(1000); + } + + break; + case "1": //盘古积算仪 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 0, 16); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + + if ((DateTime.Now.Hour == 0 & DateTime.Now.Minute == 0 & DateTime.Now.Second == 10)) //过了零点存取累计总量,然后读取昨日累计总量 + { + SaveFlag = true; + } + + if (SaveFlag) + { + SaveTable(0); + readTodayYesTerdayQL(); + //Console.WriteLine("存数据库成功" + readFlag.ToString() + timeNow.ToString() + "--" + (SbType == "2" & (timeNow.Hour == 20 & timeNow.Minute == 45 & timeNow.Second > 10) & readFlag == false).ToString ()); + SaveFlag = false; + } + + } + break; + case "2": //103 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 7102, 22); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + + break; + case "3": + break; + case "4": + for (int i = 0; i < ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 511, 15); + socketRecive.Send(SendByte); + string strMessage = ""; + for (int j = 0; j < 8; j++) + { + strMessage = strMessage + " " + SendByte[j].ToString(); + } + Thread.Sleep(2000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_CSB), state); + + } + break; + + + case "5": + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 4, 30); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_WZFX), state); + + if ((DateTime.Now.Hour == 0 & DateTime.Now.Minute == 0 & DateTime.Now.Second == 10)) //过了零点存取累计总量,然后读取昨日累计总量 + { + SaveFlag = true; + } + + if (SaveFlag) + { + SaveTable(0); + readTodayYesTerdayQL(); + //Console.WriteLine("存数据库成功" + readFlag.ToString() + timeNow.ToString() + "--" + (SbType == "2" & (timeNow.Hour == 20 & timeNow.Minute == 45 & timeNow.Second > 10) & readFlag == false).ToString ()); + SaveFlag = false; + } + + } + break; + + + case "6": //腾空PLC + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 10100, 22); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + + break; + + + default: + break; + } + + } + catch (Exception ex) + { + } + + if (DateTime.Now.Hour == 23 && DateTime.Now.Minute == 59) + { + Thread.Sleep(2000); + + } + else + { + if (intTimes > 5) + { + intTimes = 5; + Thread.Sleep(Station.readDiffTime); + } + else + { + Thread.Sleep(3000); + } + } + + intTimes = intTimes + 1; + } + + //while (true) + //{ + // //如果服务器停止了服务,就不能再接收新的客户端 + // if (!_isRun) + // { + // return; + // } + // //接受一个客户端的连接请求 + // Socket oldserver = (Socket)iar.AsyncState; + // Socket client = oldserver.EndAccept(iar); + // //检查是否达到最大的允许的客户端数目 + // if (_clientCount == _maxClient) + // { + // //服务器已满,发出通知 + // if (ServerFull != null) + // { + // ServerFull(this, new NetEventArgs(new Session(client))); + // } + + // } + // else + // { + + // Session newSession = new Session(client); + + // _sessionTable.Add(newSession.ID, newSession); + + // //客户端引用计数+1 + // _clientCount++; + + // //开始接受来自该客户端的数据 + // client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, + // new AsyncCallback(ReceiveData), client); + + // //新的客户段连接,发出通知 + // if (ClientConn != null) + // { + // ClientConn(this, new NetEventArgs(newSession)); + // } + // } + + // //继续接受客户端 + // _svrSock.BeginAccept(new AsyncCallback(AcceptConn), _svrSock); + + // if (DateTime.Now.Hour == 23 && DateTime.Now.Minute == 59) + // { + // Thread.Sleep(2000); + + // } + // else + // { + // if (intTimes > 5) + // { + // intTimes = 5; + // Thread.Sleep(Station.readDiffTime); + // } + // else + // { + // Thread.Sleep(3000); + // } + // } + + // intTimes = intTimes + 1; + + //} + } + + + /// + /// 读取GPRS站场PLC的时间 + /// + /// + private string getPLCDateTime(byte[] plc_DateTime) + { + + string[] Uplc_DateTime = new string[4]; + + Uplc_DateTime[0] = plc_DateTime[4].ToString("X2") + plc_DateTime[3].ToString("X2"); + Uplc_DateTime[1] = plc_DateTime[6].ToString("X2") + plc_DateTime[5].ToString("X2"); + Uplc_DateTime[2] = plc_DateTime[8].ToString("X2") + plc_DateTime[7].ToString("X2"); + Uplc_DateTime[3] = plc_DateTime[10].ToString("X2") + plc_DateTime[9].ToString("X2"); + + string plc_Year = Uplc_DateTime[0]; + string plc_Month = Uplc_DateTime[1]; + string plc_Minute = Uplc_DateTime[2]; + string plc_Second = Uplc_DateTime[3]; + string plcDatetime = plc_Year + "-" + plc_Month.Substring(0, 2) + "-" + plc_Month.Substring(2, 2) + " " + plc_Minute.Substring(0, 2) + ":" + plc_Minute.Substring(2, 2) + ":" + plc_Second;//.Substring(0, 2);// +plc_Second.Substring(2, 2); + return plcDatetime; + } + + /// + /// 解析GPRS读取的PLC数据 + /// + /// + + public void ReadCallback_PLC(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + + + try + { + if (dataNum == 8) //读取的时钟 + { + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["PLCTime"] = getPLCDateTime(state.buffer); //获取PLC时间 + } + } + catch + { } + + try + { + if (dataNum == 40) // 代表1个计量点 jldID=0 + { + + DataRow[] drJldS = { drDataTemp[0] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + drDataTemp[0].ItemArray = drData[0].ItemArray; + + } + } + catch + { } + + try + { + if (dataNum == 80) // 代表2个计量点 jldID=1,2 + { + DataRow[] drJldS = { drDataTemp[1], drDataTemp[2] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 1; i < 3; i++) + { + drDataTemp[i].ItemArray = drData[i - 1].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 120) // 代表3个计量点 jldID=3,4,5 + { + DataRow[] drJldS = { drDataTemp[3], drDataTemp[4], drDataTemp[5] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 3; i < 6; i++) + { + drDataTemp[i].ItemArray = drData[i - 3].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 160) // 代表4个计量点 jldID=6,7,8,9 + { + DataRow[] drJldS = { drDataTemp[6], drDataTemp[7], drDataTemp[8], drDataTemp[9] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 6; i < 10; i++) + { + drDataTemp[i].ItemArray = drData[i - 6].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 200) // 代表5个计量点 jldID=10,11,12,13,14 + { + DataRow[] drJldS = { drDataTemp[10], drDataTemp[11], drDataTemp[12], drDataTemp[13], drDataTemp[14] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 10; i < 15; i++) + { + drDataTemp[i].ItemArray = drData[i - 10].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 240) // 代表6个计量点 jldID=15,16,17,18,19,20 + { + DataRow[] drJldS = { drDataTemp[15], drDataTemp[16], drDataTemp[17], drDataTemp[18], drDataTemp[19], drDataTemp[20] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 15; i < 21; i++) + { + drDataTemp[i].ItemArray = drData[i - 15].ItemArray; + } + } + } + catch + { } + + + // + foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + { + int jld_id = Convert.ToInt16(dr["jld_ID"]); + + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(dr), Station.ZCName); + + //温度 + dr["WD"] = drDataTemp[jld_id]["WD"]; + //压力 + dr["YL"] = drDataTemp[jld_id]["YL"]; + //差压 + dr["CY"] = drDataTemp[jld_id]["CY"]; + //瞬时量 + dr["SSL"] = drDataTemp[jld_id]["SSL"]; + //今日量 + dr["JRL"] = drDataTemp[jld_id]["JRL"]; + //昨日量 + dr["ZRL"] = drDataTemp[jld_id]["ZRL"]; + //累计量 + dr["LJL"] = drDataTemp[jld_id]["LJL"]; + //本月量 + dr["BYL"] = drDataTemp[jld_id]["BYL"]; + //上月量 + dr["SYL"] = drDataTemp[jld_id]["SYL"]; + //今日时间 + dr["JRSJ"] = drDataTemp[jld_id]["JRSJ"]; + //昨日时间 + dr["ZRSJ"] = drDataTemp[jld_id]["ZRSJ"]; + //仪表状态 + dr["YBZT"] = drDataTemp[jld_id]["YBZT"]; + + try + { + if (dr["MeterTYPE"].ToString() == "脉冲") + { + //计算工况流量 + Single sngQN; + Single sngTf; + float sngPf; + if (dr["SSL"].ToString() != "") + { + sngQN = Convert.ToSingle(dr["SSL"].ToString()); + } + else + { + sngQN = 0; + } + if (dr["WD"].ToString() != "") + { + sngTf = float.Parse(dr["WD"].ToString()); + sngTf = sngTf + 273.15f; + } + else + { + sngTf = 0; + } + + if (dr["YL"].ToString() != "" && dr["YL"].ToString() != "0") + { + sngPf = Convert.ToSingle(dr["YL"].ToString()); + Single sngFz2; + + if (sngPf > 0.1 && sngPf < 0.5) + { + sngFz2 = 0.999f - 0.008f * (sngPf - 0.1f) / (0.5f - sngPf); + + } + else + { + if (sngPf < 0.1) sngFz2 = 0.998f; + if (sngPf > 0.5) sngFz2 = 0.988f; + } + + dr["SSGKLL"] = (sngQN * sngTf * 0.101325 * 0.998 / 293.15 / sngPf / 24).ToString("#.#"); + + } + else + { + dr["SSGKLL"] = 0; + } + + + + DataRow[] drS = ProgramGetData.dsPparameter.Tables[Station.ZCID].Select("jld_id='" + jld_id + "'"); + string strXx = drS[0]["CLXX"].ToString(); + string strSx = drS[0]["CLSX"].ToString(); + + dr["CXFLAG"] = TranData.GetCxFlag(dr["SSGKLL"].ToString(), strXx, strSx); + if (jld_id == 3) + { + + } + } + else + { + dr["CXFLAG"] = TranData.GetCxFlag(dr["CY"].ToString()); + } + + } + catch + { + + + } + + + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(dr), Station.ZCName); + + //Console.WriteLine(jld_id.ToString() + "_" + dr["SSL"] + "_" + dr["CY"]); + } + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PLC), state); + + } + catch (Exception ex) + { + } + } + + /// + /// 对于没在PLC的设备,每次采集程序启动读取存储的昨日量 今日量的总累积量 + /// + private void readTodayYesTerdayQL() + { + DateTime _Date = DateTime.Now.AddDays(-1); + _Date = DateTime.Parse(_Date.ToString("yyyy-MM-dd")); + string strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "' and RTIME=to_date('" + _Date.ToShortDateString() + "', 'yyyy-mm-dd') order by JLD_ID"; + dtToday_Flow = OracleLink.ExecuteDataTable(strSQL, "DTJK", ""); + strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "' and RTIME=to_date('" + _Date.AddDays(-1).ToShortDateString() + "', 'yyyy-mm-dd') order by JLD_ID"; + dtYesToday_FLOW = OracleLink.ExecuteDataTable(strSQL, "DTJK", ""); + } + /// + /// 保存昨日量、今日量到数据库 + /// + /// + private void SaveTable(int intSaveFlag) + { + SaveFlag = true; + Thread.Sleep(2000); + string strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "'"; + OracleLink.SaveDataTable(strSQL, dtToday_Flow, "DTJK", ""); + } + + /// + /// 获取并解析福鑫的数据 + /// + /// + public void ReadCallback_WZFX(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 60) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_WZFX), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + + } + } + + /// + /// 获取并解析盘古积算仪的数据 + /// + /// + public void ReadCallback_PG(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 32) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch (Exception ex) + { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + + } + } + /// + /// 获取并解析爱知超声波的数据 + /// + /// + public void ReadCallback_CSB(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 30) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + + } + } + + /// + /// 获得打印数据监视字符串 + /// + /// + /// + private string strPrint(DataRow dr) + { + return dr["JLD_NAME"] + "\t瞬时量:" + dr["SSL"] + "\t温度:" + dr["WD"] + "\t压力:" + dr["YL"] + "\t累积量:" + dr["LJL"]; + } + + /// + /// 获取并解析103的数据 + /// + /// + public void ReadCallback_103(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 44) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + } + } + catch + { + } + + } + + /// + /// 通过Socket对象查找Session对象 + /// + /// + /// 找到的Session对象,如果为null,说明并不存在该回话 + private Session FindSession(Socket client) + { + SessionId id = new SessionId((int)client.Handle); + + return (Session)_sessionTable[id]; + } + + + /// + /// 接受数据完成处理函数,异步的特性就体现在这个函数中, + /// 收到数据后,会自动解析为字符串报文 + /// + /// 目标客户端Socket + protected virtual void ReceiveData(IAsyncResult iar) + { + Socket client = (Socket)iar.AsyncState; + + try + { + //如果两次开始了异步的接收,所以当客户端退出的时候 + //会两次执行EndReceive + + int recv = client.EndReceive(iar); + + if (recv == 0) + { + //正常的关闭 + CloseClient(client, Session.ExitType.NormalExit); + return; + } + string receivedData; + if (_recvDataBuffer[0] == 0x55) + { + receivedData = _coder.GetEncodingString(_recvDataBuffer, 1, recv - 1); + } + else + { + string fileName = "TCP监控.txt"; + //string fileName =this._coder.GetEncodingString(_recvDataBuffer,6,_recvDataBuffer[1]-1); + receivedData = _coder.GetEncodingString(_recvDataBuffer, 0, recv); + _coder.WriteFile(_filePath + fileName, receivedData); + receivedData = "Receive Data:" + receivedData + "##"; + } + //发布收到数据的事件 + if (RecvData != null) + { + Session sendDataSession = FindSession(client); + + Debug.Assert(sendDataSession != null); + + //如果定义了报文的尾标记,需要处理报文的多种情况 + if (_resolver != null) + { + if (sendDataSession.Datagram != null && + sendDataSession.Datagram.Length != 0) + { + //加上最后一次通讯剩余的报文片断 + receivedData = sendDataSession.Datagram + receivedData; + } + + string[] recvDatagrams = _resolver.Resolve(ref receivedData); + + + foreach (string newDatagram in recvDatagrams) + { + //深拷贝,为了保持Datagram的对立性 + ICloneable copySession = (ICloneable)sendDataSession; + + Session clientSession = (Session)copySession.Clone(); + + clientSession.Datagram = newDatagram; + + clientSession.DataBuffer = _recvDataBuffer; + + //发布一个报文消息 + RecvData(this, new NetEventArgs(clientSession)); + } + + //剩余的代码片断,下次接收的时候使用 + sendDataSession.Datagram = receivedData; + + + if (sendDataSession.Datagram.Length > MaxDatagramSize) + { + sendDataSession.Datagram = null; + } + + } + //没有定义报文的尾标记,直接交给消息订阅者使用 + else + { + ICloneable copySession = (ICloneable)sendDataSession; + + Session clientSession = (Session)copySession.Clone(); + + clientSession.Datagram = receivedData; + + clientSession.DataBuffer = _recvDataBuffer; + + RecvData(this, new NetEventArgs(clientSession)); + } + + }//end of if(RecvData!=null) + + //继续接收来自来客户端的数据 + client.BeginReceive(_recvDataBuffer, 0, _recvDataBuffer.Length, SocketFlags.None, + new AsyncCallback(ReceiveData), client); + + } + catch (SocketException ex) + { + //客户端退出 + if (10054 == ex.ErrorCode) + { + //客户端强制关闭 + CloseClient(client, Session.ExitType.ExceptionExit); + } + + } + catch (ObjectDisposedException ex) + { + //这里的实现不够优雅 + //当调用CloseSession()时,会结束数据接收,但是数据接收 + //处理中会调用int recv = client.EndReceive(iar); + //就访问了CloseSession()已经处置的对象 + //我想这样的实现方法也是无伤大雅的. + if (ex != null) + { + ex = null; + //DoNothing; + } + } + + } + + + /// + /// 发送数据完成处理函数 + /// + /// 目标客户端Socket + protected virtual void SendDataEnd(IAsyncResult iar) + { + Socket client = (Socket)iar.AsyncState; + + int sent = client.EndSend(iar); + } + + #endregion + + } +} \ No newline at end of file diff --git a/ConsoleGetPLCData/CS/GetDataNet.cs b/ConsoleGetPLCData/CS/GetDataNet.cs new file mode 100644 index 0000000..56536ca --- /dev/null +++ b/ConsoleGetPLCData/CS/GetDataNet.cs @@ -0,0 +1,341 @@ +using Modbus.Device; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading; + +namespace ConsoleGetPLCData.CS +{ + + class GetDataNet + { + stStation Station = new stStation(); + private ModbusIpMaster master; + private TcpClient client; + private bool WriteDateTimeFlag; + public static ManualResetEvent allDone = new ManualResetEvent(false); + + ///构造函数 初始化 + public GetDataNet(stStation strZhan) + { + Station = strZhan; + } + + /// + /// 线程入口函数 + /// + public void GetPLCData() + { + + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + "开始采集" + Station.ZCName + "数据"); + + GetDataByNet(); + + } + + + + #region 局域网采集功能 + /// + /// 局域网获取PLC的数据 + /// + private void GetDataByNet() + { + + while (true) + { + using (client = new TcpClient()) + { + try + { + client.Connect(Station.ip, Station.port); + master = ModbusIpMaster.CreateIp(client); + int JldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + + } + catch (SystemException err) + { + if (err.Message != null) + { + // string strZCIDtemp[]=Station.ZCID.Split ('_'); + // if (strZCIDtemp .Length >1) + //{ + + //} + // else + // { + int JldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + + //} + + + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //PLC计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + //故障赋值 + //TranData.netError(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]); + + } + + foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + { + TranData.netError(dr); + + } + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + Station.ZCID + "网络连接故障!"); + + + } + } + try + { + int JldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["PLCTime"] = getPLCDateTime(); //获取PLC时间 + SetPLCDateTime(); //同步PLC时间 + + //PLC计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + { + int _jldID = 0; + try + { + _jldID = int.Parse(dr["jld_id"].ToString()); + } + catch (Exception ex) + { + + } + DataRow[] drPars = ProgramGetData.dsPparameter.Tables[Station.ZCID].Select("jld_id='" + _jldID.ToString() + "'"); + //判断是否读取计量点参数 + if (dr["readparflag"].ToString() == "1") + { + ushort[] ParWord = master.ReadHoldingRegisters(Convert.ToUInt16((int)(24360 + (240 * _jldID))), 60); + drPars[0].ItemArray = TranData.GetPLCPar_Net(drPars[0], ParWord, Station.MeterTYPE).ItemArray; + dr["readparflag"] = "0"; + drPars[0]["ReadTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + } + //采集实时计量数据 + ushort[] Word = master.ReadHoldingRegisters(Convert.ToUInt16((int)(400 + (20 * _jldID))), 20); + //解析数据 根据设备类型解析 + dr.ItemArray = TranData.GetDataTran_Net(dr, Word, Station.MeterTYPE).ItemArray; + //读取计算脉冲仪表的工况流量或雷诺数 + string strPlusNum = ""; + + try + { + + + if (dr["MeterTYPE"].ToString() == "脉冲") + { + //采集脉冲数 + ushort[] PlusNum = master.ReadHoldingRegisters(Convert.ToUInt16((int)(5000 + (80 * _jldID))), 4); + //采集K系数 + ushort[] PlusK = master.ReadHoldingRegisters(Convert.ToUInt16((int)(2600 + (30 * _jldID))), 4); + string ssgkll = TranData.GetFlowGK(PlusNum, PlusK, out strPlusNum); + dr["SSGKLL"] = ssgkll; + string strCxXx = drPars[0]["CLXX"].ToString(); + string strCxSx = drPars[0]["CLSX"].ToString(); + dr["CXFlag"] = TranData.GetCxFlag(ssgkll, strCxXx, strCxSx); + + } + + + + dr["JLD_NAME"] = drPars[0]["JLD_NAME"]; + if (dr["MeterTYPE"].ToString() == "脉冲") dr["CY"] = strPlusNum; + //差压式流量计则计算雷诺数 + if (dr["MeterTYPE"].ToString() != "脉冲") + { + string strXdmd = drPars[0]["Gr"].ToString(); + string strGj = drPars[0]["gj"].ToString(); + float sngDlnd = 19768.8f; + string strQn = dr["SSL"].ToString(); + if (strQn == "") strQn = "0"; + if (strXdmd == "") strXdmd = "0"; + + if (Station.ZCID == "4708") + { + + + } + + if (strGj != "") + { + dr["SSGKLL"] = (1615.7238 * Convert.ToSingle(strQn) * Convert.ToSingle(strXdmd) / Convert.ToSingle(strGj)).ToString("#.#"); + } + dr["CXFlag"] = TranData.GetCxFlag(dr["CY"].ToString()); + + + } + } + catch (Exception ex) + { + + } + } + } + catch (Exception ex) + { + if (ex.Message != null) + { + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + Station.ZCID + "计量点 " + "读取寄存器错误!"); + continue; + } + } + Thread.Sleep(Station.readDiffTime); + + } + } + + } + /// + /// 将服务器的时间同步到PLC + /// + private void SetPLCDateTime() + { + DateTime SAVETIME = DateTime.Now; + + if ((SAVETIME.Hour.ToString() == "16" && SAVETIME.Minute == 00 && WriteDateTimeFlag == false) || (ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["TongBuFlag"].ToString() == "同步")) //到每日23:40 同步时间 + { + try + { + ushort[] DateData = getTimeData(); + master.WriteSingleRegister(380, DateData[0]); + master.WriteSingleRegister(381, DateData[1]); + master.WriteSingleRegister(382, DateData[2]); + master.WriteSingleRegister(383, DateData[3]); + + master.WriteSingleRegister(384, 1); + master.WriteSingleRegister(386, 1); + + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["TongBuTime"] = SAVETIME; + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["TongBuFlag"] = "成功"; + WriteDateTimeFlag = true; + } + catch (SystemException error) + { + if (error.Message != null) + { + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + Station.ZCID + "时间同步失败!"); + } + } + } + + + if (SAVETIME.Hour.ToString() != "16" && SAVETIME.Minute != 00) // 同步时间标志位false + { + WriteDateTimeFlag = false; + } + + + + } + /// + /// 读取局域网站场PLC的时间 + /// + /// + private string getPLCDateTime() + { + //读取站场PLC的系统时间 + ushort[] plc_DateTime = master.ReadHoldingRegisters(16, 4); + + string plc_Year = plc_DateTime[0].ToString("x4"); + string plc_Month = plc_DateTime[1].ToString("x4"); + string plc_Minute = plc_DateTime[2].ToString("x4"); + string plc_Second = plc_DateTime[3].ToString("x4"); + string plcDatetime = plc_Year + "-" + plc_Month.Substring(0, 2) + "-" + plc_Month.Substring(2, 2) + " " + plc_Minute.Substring(0, 2) + ":" + plc_Minute.Substring(2, 2) + ":" + plc_Second;//.Substring(0, 2);// +plc_Second.Substring(2, 2); + return plcDatetime; + } + + /// + /// 将日期时间转换为Ushort类型数组 + /// + /// + private ushort[] getTimeData() + { + + ushort[] data = new ushort[4]; + DateTime now = new DateTime(); + now = DateTime.Now; + string str = ""; + str = now.Year.ToString(); + int num4 = Convert.ToInt16(str.Substring(0, 1)); + int num5 = Convert.ToInt16(str.Substring(1, 1)); + int num6 = Convert.ToInt16(str.Substring(2, 1)); + int num7 = Convert.ToInt16(str.Substring(3, 1)); + data[0] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + string str3 = ""; + if (now.Month < 10) + { + str3 = str3 + "0" + now.Month.ToString(); + } + else + { + str3 = str3 + now.Month.ToString(); + } + if (now.Day < 10) + { + str3 = str3 + "0" + now.Day.ToString(); + } + else + { + str3 = str3 + now.Day.ToString(); + } + str = str3; + num4 = Convert.ToInt16(str.Substring(0, 1)); + num5 = Convert.ToInt16(str.Substring(1, 1)); + num6 = Convert.ToInt16(str.Substring(2, 1)); + num7 = Convert.ToInt16(str.Substring(3, 1)); + data[1] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + string str4 = ""; + if (now.Hour < 10) + { + str4 = str4 + "0" + now.Hour.ToString(); + } + else + { + str4 = str4 + now.Hour.ToString(); + } + if (now.Minute < 10) + { + str4 = str4 + "0" + now.Minute.ToString(); + } + else + { + str4 = str4 + now.Minute.ToString(); + } + str = str4; + num4 = Convert.ToInt16(str.Substring(0, 1)); + num5 = Convert.ToInt16(str.Substring(1, 1)); + num6 = Convert.ToInt16(str.Substring(2, 1)); + num7 = Convert.ToInt16(str.Substring(3, 1)); + data[2] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + string str5 = ""; + if (now.Second < 10) + { + str5 = str5 + "000" + now.Second.ToString(); + } + else + { + str5 = str5 + "00" + now.Second.ToString(); + } + str = str5; + num4 = Convert.ToInt16(str.Substring(0, 1)); + num5 = Convert.ToInt16(str.Substring(1, 1)); + num6 = Convert.ToInt16(str.Substring(2, 1)); + num7 = Convert.ToInt16(str.Substring(3, 1)); + data[3] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + + return data; + + } + #endregion + + + + + } +} diff --git a/ConsoleGetPLCData/CS/GetDataThread.cs b/ConsoleGetPLCData/CS/GetDataThread.cs new file mode 100644 index 0000000..8819be8 --- /dev/null +++ b/ConsoleGetPLCData/CS/GetDataThread.cs @@ -0,0 +1,1409 @@ +using GetData_PLC; +using Modbus.Device; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ConsoleGetPLCData.CS +{ + + public class StateObject + { + // Client socket. + public Socket workSocket = null; + // Size of receive buffer. + public const int BufferSize = 1024; + // Receive buffer. + public byte[] buffer = new byte[BufferSize]; + // Received data string. + public StringBuilder sb = new StringBuilder(); + } + + class GetDataThread + { + + stStation Station = new stStation(); + private ModbusIpMaster master; + private TcpClient client; + private bool WriteDateTimeFlag; + public static ManualResetEvent allDone = new ManualResetEvent(false); + + DataTable dtToday_Flow = new DataTable(); //今日流量总累计 表格 + DataTable dtYesToday_FLOW = new DataTable();//昨日流量总累计 表格 + //private bool readFlag; //读取盘古积算仪 昨日 今日累积量标志 + bool SaveFlag; //保存盘古积算仪 总累计量标志 + DataRow[] drDataTemp;//GPRS PLC设备采集上来的数据临时存放,再赋值 + + static int intTimes = 0; + + ///构造函数 初始化 + public GetDataThread(stStation strZhan) + { + Station = strZhan; + } + + /// + /// 线程入口函数 + /// + public void GetPLCData() + { + + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + "开始采集" + Station.ZCName + "数据"); + + if (Station.NetTYPE == "0") + { + GetDataByNet(); + } + + if (Station.NetTYPE == "1") + { + //if (Station.MeterTYPE != "0") + //{ + GetDataByGPRS_YB();//异步通信 + + //} + //else + //{ + //GetDataByGPRS_TB();//同步通信 + //} + } + } + + + + #region 局域网采集功能 + /// + /// 局域网获取PLC的数据 + /// + private void GetDataByNet() + { + + while (true) + { + using (client = new TcpClient()) + { + try + { + client.Connect(Station.ip, Station.port); + master = ModbusIpMaster.CreateIp(client); + int JldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + + } + catch (SystemException err) + { + if (err.Message != null) + { + // string strZCIDtemp[]=Station.ZCID.Split ('_'); + // if (strZCIDtemp .Length >1) + //{ + + //} + // else + // { + int JldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + + //} + + + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //PLC计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + //故障赋值 + //TranData.netError(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]); + + } + + foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + { + TranData.netError(dr); + + } + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + Station.ZCID + "网络连接故障!"); + + + } + } + try + { + int JldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["PLCTime"] = getPLCDateTime(); //获取PLC时间 + SetPLCDateTime(); //同步PLC时间 + + //PLC计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + { + int _jldID = 0; + try + { + _jldID = int.Parse(dr["jld_id"].ToString()); + } + catch (Exception ex) + { + + } + DataRow[] drPars = ProgramGetData.dsPparameter.Tables[Station.ZCID].Select("jld_id='" + _jldID.ToString() + "'"); + //判断是否读取计量点参数 + if (dr["readparflag"].ToString() == "1") + { + ushort[] ParWord = master.ReadHoldingRegisters(Convert.ToUInt16((int)(24360 + (240 * _jldID))), 60); + drPars[0].ItemArray = TranData.GetPLCPar_Net(drPars[0], ParWord, Station.MeterTYPE).ItemArray; + dr["readparflag"] = "0"; + drPars[0]["ReadTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + } + //采集实时计量数据 + ushort[] Word = master.ReadHoldingRegisters(Convert.ToUInt16((int)(400 + (20 * _jldID))), 20); + //解析数据 根据设备类型解析 + dr.ItemArray = TranData.GetDataTran_Net(dr, Word, Station.MeterTYPE).ItemArray; + //读取计算脉冲仪表的工况流量或雷诺数 + string strPlusNum = ""; + + try + { + + + if (dr["MeterTYPE"].ToString() == "脉冲") + { + //采集脉冲数 + ushort[] PlusNum = master.ReadHoldingRegisters(Convert.ToUInt16((int)(5000 + (80 * _jldID))), 4); + //采集K系数 + ushort[] PlusK = master.ReadHoldingRegisters(Convert.ToUInt16((int)(2600 + (30 * _jldID))), 4); + string ssgkll = TranData.GetFlowGK(PlusNum, PlusK, out strPlusNum); + dr["SSGKLL"] = ssgkll; + string strCxXx = drPars[0]["CLXX"].ToString(); + string strCxSx = drPars[0]["CLSX"].ToString(); + dr["CXFlag"] = TranData.GetCxFlag(ssgkll, strCxXx, strCxSx); + + } + + + + dr["JLD_NAME"] = drPars[0]["JLD_NAME"]; + if (dr["MeterTYPE"].ToString() == "脉冲") dr["CY"] = strPlusNum; + //差压式流量计则计算雷诺数 + if (dr["MeterTYPE"].ToString() != "脉冲") + { + string strXdmd = drPars[0]["Gr"].ToString(); + string strGj = drPars[0]["gj"].ToString(); + float sngDlnd = 19768.8f; + string strQn = dr["SSL"].ToString(); + if (strQn == "") strQn = "0"; + if (strXdmd == "") strXdmd = "0"; + + if (Station.ZCID == "4708") + { + + + } + + if (strGj != "") + { + dr["SSGKLL"] = (1615.7238 * Convert.ToSingle(strQn) * Convert.ToSingle(strXdmd) / Convert.ToSingle(strGj)).ToString("#.#"); + } + dr["CXFlag"] = TranData.GetCxFlag(dr["CY"].ToString()); + + + } + } + catch (Exception ex) + { + + } + } + } + catch (Exception ex) + { + if (ex.Message != null) + { + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + Station.ZCID + "计量点 " + "读取寄存器错误!"); + continue; + } + } + Thread.Sleep(Station.readDiffTime); + + } + } + + } + /// + /// 将服务器的时间同步到PLC + /// + private void SetPLCDateTime() + { + DateTime SAVETIME = DateTime.Now; + + if ((SAVETIME.Hour.ToString() == "16" && SAVETIME.Minute == 00 && WriteDateTimeFlag == false) || (ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["TongBuFlag"].ToString() == "同步")) //到每日23:40 同步时间 + { + try + { + ushort[] DateData = getTimeData(); + master.WriteSingleRegister(380, DateData[0]); + master.WriteSingleRegister(381, DateData[1]); + master.WriteSingleRegister(382, DateData[2]); + master.WriteSingleRegister(383, DateData[3]); + + master.WriteSingleRegister(384, 1); + master.WriteSingleRegister(386, 1); + + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["TongBuTime"] = SAVETIME; + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["TongBuFlag"] = "成功"; + WriteDateTimeFlag = true; + } + catch (SystemException error) + { + if (error.Message != null) + { + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + Station.ZCID + "时间同步失败!"); + } + } + } + + + if (SAVETIME.Hour.ToString() != "16" && SAVETIME.Minute != 00) // 同步时间标志位false + { + WriteDateTimeFlag = false; + } + + + + } + /// + /// 读取局域网站场PLC的时间 + /// + /// + private string getPLCDateTime() + { + //读取站场PLC的系统时间 + ushort[] plc_DateTime = master.ReadHoldingRegisters(16, 4); + + string plc_Year = plc_DateTime[0].ToString("x4"); + string plc_Month = plc_DateTime[1].ToString("x4"); + string plc_Minute = plc_DateTime[2].ToString("x4"); + string plc_Second = plc_DateTime[3].ToString("x4"); + string plcDatetime = plc_Year + "-" + plc_Month.Substring(0, 2) + "-" + plc_Month.Substring(2, 2) + " " + plc_Minute.Substring(0, 2) + ":" + plc_Minute.Substring(2, 2) + ":" + plc_Second;//.Substring(0, 2);// +plc_Second.Substring(2, 2); + return plcDatetime; + } + + /// + /// 将日期时间转换为Ushort类型数组 + /// + /// + private ushort[] getTimeData() + { + + ushort[] data = new ushort[4]; + DateTime now = new DateTime(); + now = DateTime.Now; + string str = ""; + str = now.Year.ToString(); + int num4 = Convert.ToInt16(str.Substring(0, 1)); + int num5 = Convert.ToInt16(str.Substring(1, 1)); + int num6 = Convert.ToInt16(str.Substring(2, 1)); + int num7 = Convert.ToInt16(str.Substring(3, 1)); + data[0] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + string str3 = ""; + if (now.Month < 10) + { + str3 = str3 + "0" + now.Month.ToString(); + } + else + { + str3 = str3 + now.Month.ToString(); + } + if (now.Day < 10) + { + str3 = str3 + "0" + now.Day.ToString(); + } + else + { + str3 = str3 + now.Day.ToString(); + } + str = str3; + num4 = Convert.ToInt16(str.Substring(0, 1)); + num5 = Convert.ToInt16(str.Substring(1, 1)); + num6 = Convert.ToInt16(str.Substring(2, 1)); + num7 = Convert.ToInt16(str.Substring(3, 1)); + data[1] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + string str4 = ""; + if (now.Hour < 10) + { + str4 = str4 + "0" + now.Hour.ToString(); + } + else + { + str4 = str4 + now.Hour.ToString(); + } + if (now.Minute < 10) + { + str4 = str4 + "0" + now.Minute.ToString(); + } + else + { + str4 = str4 + now.Minute.ToString(); + } + str = str4; + num4 = Convert.ToInt16(str.Substring(0, 1)); + num5 = Convert.ToInt16(str.Substring(1, 1)); + num6 = Convert.ToInt16(str.Substring(2, 1)); + num7 = Convert.ToInt16(str.Substring(3, 1)); + data[2] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + string str5 = ""; + if (now.Second < 10) + { + str5 = str5 + "000" + now.Second.ToString(); + } + else + { + str5 = str5 + "00" + now.Second.ToString(); + } + str = str5; + num4 = Convert.ToInt16(str.Substring(0, 1)); + num5 = Convert.ToInt16(str.Substring(1, 1)); + num6 = Convert.ToInt16(str.Substring(2, 1)); + num7 = Convert.ToInt16(str.Substring(3, 1)); + data[3] = (ushort)((((((num4 * 0x10) * 0x10) * 0x10) + ((num5 * 0x10) * 0x10)) + (num6 * 0x10)) + num7); + + return data; + + } + #endregion + + + + + + #region ----------------------同步通讯 + ///////// + ///////// 施耐德PLC不带地址的计量点用同步采集,以区分不同计量点 + ///////// + ///////// + + //////private void GetDataByGPRS_TB() + //////{ + ////// try + ////// { + ////// //当点击开始监听的时候 在服务器端创建一个负责监IP地址跟端口号的Socket + ////// Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + ////// IPAddress ip = IPAddress.Parse(Station.ip); + ////// //IPAddress ip = IPAddress.Parse("127.0.0.1"); + ////// //创建端口号对象 + ////// IPEndPoint point = new IPEndPoint(ip, Station.port); + ////// //监听 + ////// socketWatch.Bind(point); + ////// ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "监听成功!"); + ////// socketWatch.Listen(10); + + + ////// Thread th = new Thread(ListenTB); + ////// th.IsBackground = true; + ////// th.Start(socketWatch); + + + + ////// } + ////// catch + ////// { } + + //////} + + //////Socket socketSendTB; + + + ///////// + ///////// 服务器端不停的接受客户端发送过来的消息 + ///////// + ///////// + //////void Recive(object o) + //////{ + ////// Socket socketSend = o as Socket; + + ////// try + ////// { + ////// byte[] SendByte = new byte[8]; + ////// int ReciveTimes = 0; + ////// while (true) + ////// { + ////// int intJldNum = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; + ////// foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + ////// { + + ////// //PLC_JLDID = i; + ////// //Console.WriteLine("读取" + ZcName + "计量点" +PLC_JLDID.ToString()+ "数据"); + ////// string strJLD_Name = dr["JLD_NAME"].ToString(); + ////// int _jldID = Convert.ToInt16(dr["jld_id"].ToString()); + ////// SendByte = TranData.Modbus_ReadData(1, 3, 400 + _jldID * 20, 20); + ////// socketSend.Send(SendByte); + ////// Thread.Sleep(1000); + ////// int dataNum; + ////// byte[] ReciveByte = new byte[1024]; + ////// dataNum = socketSend.Receive(ReciveByte); + ////// int bufferLength = ReciveByte.Length; + ////// dataNum = ReciveByte[2]; + ////// if (dataNum == 40) + ////// { + ////// dr.ItemArray = TranData.GetDataTran_GPRS(dr, ReciveByte, Station.MeterTYPE).ItemArray; + ////// dr["JLD_NAME"] = strJLD_Name; + ////// if (Station.MeterTYPE == "脉冲") + ////// { + ////// string ssgkll = dr["SSGKLL"].ToString(); + ////// //判断工况是否超限 + ////// try + ////// { + ////// if (ssgkll != "") + ////// { + ////// string strCxXx = dr["CLXX"].ToString(); + ////// string strCxSx = dr["CLSX"].ToString(); + ////// dr["CXFlag"] = TranData.GetCxFlag(ssgkll, strCxXx, strCxSx); + ////// } + ////// } + ////// catch { } + ////// } + ////// else + ////// { + ////// //判断差压是否超限 + ////// try + ////// { + ////// dr["CXFlag"] = TranData.GetCxFlag(dr["CY"].ToString()); + ////// } + ////// catch { } + ////// } + + ////// } + ////// else + ////// { + ////// socketSend.Receive(ReciveByte); + ////// break; + ////// //ProgramGetData.dsJLDataRealTime.Tables[ZCID].Rows[i].ItemArray = TranData.netError(ProgramGetData.dsJLDataRealTime.Tables[ZCID].Rows[i]).ItemArray; + ////// //ProgramGetData.dsJLDataRealTime.Tables[ZCID].Rows[i]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[ZCID].Rows[i]["JLD_NAME"]; + + ////// } + ////// } + + + ////// ReciveTimes = ReciveTimes + 1; + + ////// if (DateTime.Now.Hour == 23 && DateTime.Now.Minute == 59) + ////// { + ////// Thread.Sleep(2000); + ////// } + ////// else + ////// { + ////// if (ReciveTimes > 3) //头四次 采集时间短 + ////// { + ////// ReciveTimes = 4; + ////// Thread.Sleep(Station.readDiffTime); + + ////// } + ////// else + ////// { + ////// Thread.Sleep(2000); + + ////// } + + ////// } + ////// } + ////// } + + ////// catch + ////// { } + + //////} + ///////// + ///////// 同步通讯监听 + ///////// + ///////// + //////private void ListenTB(object o) + //////{ + ////// Socket socketWatch = o as Socket; + ////// //等待客户端的连接 并且创建一个负责通信的Socket + ////// while (true) + ////// { + + ////// try + ////// { + ////// try + ////// { + ////// //负责跟客户端通信的Socket + ////// socketSendTB = socketWatch.Accept(); + ////// ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "连接成功!"); + + ////// //开启 一个新线程不停的接受客户端发送过来的消息 + ////// Thread th = new Thread(Recive); + ////// th.IsBackground = true; + ////// th.Start(socketSendTB); + ////// } + ////// catch + ////// { } + ////// } + ////// catch + ////// { } + ////// Thread.Sleep(1000); + ////// } + //////} + #endregion + #region ---------------------异步通讯 + /// + /// 带地址的计量点设备,采用异步通信方式 + /// + private void GetDataByGPRS_YB() + { + try + { + //当点击开始监听的时候 在服务器端创建一个负责监IP地址跟端口号的Socket + Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + IPAddress ip = IPAddress.Parse(Station.ip); + //IPAddress ip = IPAddress.Parse("127.0.0.1"); + //创建端口号对象 + IPEndPoint point = new IPEndPoint(ip, Station.port); + //监听 + socketWatch.Bind(point); + socketWatch.Listen(10); + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "监听成功!"); + + Thread th = new Thread(Listen); + th.IsBackground = true; + th.Start(socketWatch); + //socketWatch.BeginAccept(new AsyncCallback(AcceptCallback), socketWatch); + + } + catch (Exception ex) + { + ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + ex.Message); + + } + + + } + + /// + /// 等待客户端的连接 并且创建与之通信用的Socket + /// + /// + void Listen(object o) + { + Socket socketWatch = o as Socket; + //等待客户端的连接 并且创建一个负责通信的Socket + //while (true) + { + try + { + //开始一个一步操作接受一个连接尝试 + socketWatch.BeginAccept(new AsyncCallback(AcceptCallback), socketWatch); + //ProgramGetData.strAppend(DateTime.Now.ToString() + "------" + Station.ZCName + "连接成功!"); + //开启 一个新线程不停的接受客户端发送过来的消息 + } + catch + { } + Thread.Sleep(1000); + } + } + /// + /// 异步通信回调函数 + /// + /// + public void AcceptCallback(IAsyncResult ar) + { + //allDone.Set(); + Socket socketSend = (Socket)ar.AsyncState; + Socket socketRecive = socketSend.EndAccept(ar); + StateObject state = new StateObject(); + state.workSocket = socketRecive; + + if (Station.MeterTYPE == "1" || Station.MeterTYPE == "5") + { + readTodayYesTerdayQL(); + } + if (Station.MeterTYPE == "0") //PLC赋值 定义一个数组 暂存 采集上来的所有计量点的数据,再一并赋值给数据集jldID 和ID转换 + { + int jldMax = ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; + int jld_IDMax = Convert.ToInt16(ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows[jldMax - 1]["jld_id"]); + + if (jld_IDMax == 0) + { + drDataTemp = new DataRow[1]; + + } + if (jld_IDMax >= 1) + { + drDataTemp = new DataRow[3]; + + } + if (jld_IDMax >= 3) + { + drDataTemp = new DataRow[6]; + + } + if (jld_IDMax >= 6) + { + drDataTemp = new DataRow[10]; + + } + if (jld_IDMax >= 10) + { + drDataTemp = new DataRow[15]; + + } + if (jld_IDMax >= 15) + { + drDataTemp = new DataRow[21]; + + } + for (int i = 0; i < drDataTemp.Length; i++) + { + DataRow dr = ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].NewRow(); + drDataTemp[i] = dr; + drDataTemp[i]["jld_id"] = i; + drDataTemp[i]["STATION_NAME"] = Station.ZCName; + } + } + while (true) + { + + try + { + + byte[] SendByte = new byte[8]; + Console.WriteLine(DateTime.Now.ToString() + "------" + Station.ZCName + "正在采集......!"); + switch (Station.MeterTYPE) + { + case "0": //施耐德PLC 异步通讯 采集计量点数目变化 来判断采集的是哪一个计量点的数据 + + //读取PLC的时钟 + SendByte = TranData.Modbus_ReadData(1, 3, 16, 4); + + + for (int i = 0; i < drDataTemp.Length; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + if (i == 0) //第一次发一个计量点命令 jldID=0 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 20); + } + if (i == 1) //第二次发2个计量点命令 jldID=1,2 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 40); + i = 2; + } + + if (i == 3) //第三次发3个计量点命令 jldID=3,4,5 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 60); + i = 5; + } + if (i == 6) //第4次发4个计量点命令 jldID=6,7,8,9 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 80); + i = 9; + } + + if (i == 10) //第5次发5个计量点命令 jldID=10,11,12,13,14 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 100); + i = 14; + } + + if (i == 15) //第5次发5个计量点命令 jldID=15,16,17,18,19,20 + { + SendByte = TranData.Modbus_ReadData(1, 3, 400 + i * 20, 120); + i = 20; + } + socketRecive.Send(SendByte); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PLC), state); + Thread.Sleep(1000); + } + + break; + case "1": //盘古积算仪 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 0, 16); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + + if ((DateTime.Now.Hour == 0 & DateTime.Now.Minute == 0 & DateTime.Now.Second == 10)) //过了零点存取累计总量,然后读取昨日累计总量 + { + SaveFlag = true; + } + + if (SaveFlag) + { + SaveTable(0); + readTodayYesTerdayQL(); + //Console.WriteLine("存数据库成功" + readFlag.ToString() + timeNow.ToString() + "--" + (SbType == "2" & (timeNow.Hour == 20 & timeNow.Minute == 45 & timeNow.Second > 10) & readFlag == false).ToString ()); + SaveFlag = false; + } + + } + break; + case "2": //103 + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 7102, 22); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + + break; + case "3": + break; + case "4": + for (int i = 0; i < ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 511, 15); + socketRecive.Send(SendByte); + string strMessage = ""; + for (int j = 0; j < 8; j++) + { + strMessage = strMessage + " " + SendByte[j].ToString(); + } + Thread.Sleep(2000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_CSB), state); + + } + break; + + + case "5": + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[this.Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 4, 30); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_WZFX), state); + + if ((DateTime.Now.Hour == 0 & DateTime.Now.Minute == 0 & DateTime.Now.Second == 10)) //过了零点存取累计总量,然后读取昨日累计总量 + { + SaveFlag = true; + } + + if (SaveFlag) + { + SaveTable(0); + readTodayYesTerdayQL(); + //Console.WriteLine("存数据库成功" + readFlag.ToString() + timeNow.ToString() + "--" + (SbType == "2" & (timeNow.Hour == 20 & timeNow.Minute == 45 & timeNow.Second > 10) & readFlag == false).ToString ()); + SaveFlag = false; + } + + } + break; + + + case "6": //腾空PLC + for (int i = 0; i < ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows.Count; i++) //计量点读取循环 循环数由主程序建立该站的实时数据表中的记录数决定 + { + int _jldID = int.Parse(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[i]["jld_id"].ToString()); + SendByte = TranData.Modbus_ReadData(_jldID + 1, 3, 10100, 22); + socketRecive.Send(SendByte); + Thread.Sleep(1000); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + } + + break; + + + default: + break; + } + + } + catch (Exception ex) + { + } + + if (DateTime.Now.Hour == 23 && DateTime.Now.Minute == 59) + { + Thread.Sleep(2000); + + } + else + { + if (intTimes > 5) + { + intTimes = 5; + Thread.Sleep(Station.readDiffTime); + } + else + { + Thread.Sleep(3000); + } + } + + intTimes = intTimes + 1; + } + } + /// + /// 解析GPRS读取的PLC数据 + /// + /// + + public void ReadCallback_PLC(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + + + try + { + if (dataNum == 8) //读取的时钟 + { + ProgramGetData.dsZhanDateTime.Tables[Station.ZCID].Rows[0]["PLCTime"] = getPLCDateTime(state.buffer); //获取PLC时间 + } + } + catch + { } + + try + { + if (dataNum == 40) // 代表1个计量点 jldID=0 + { + + DataRow[] drJldS = { drDataTemp[0] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + drDataTemp[0].ItemArray = drData[0].ItemArray; + + } + } + catch + { } + + try + { + if (dataNum == 80) // 代表2个计量点 jldID=1,2 + { + DataRow[] drJldS = { drDataTemp[1], drDataTemp[2] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 1; i < 3; i++) + { + drDataTemp[i].ItemArray = drData[i - 1].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 120) // 代表3个计量点 jldID=3,4,5 + { + DataRow[] drJldS = { drDataTemp[3], drDataTemp[4], drDataTemp[5] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 3; i < 6; i++) + { + drDataTemp[i].ItemArray = drData[i - 3].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 160) // 代表4个计量点 jldID=6,7,8,9 + { + DataRow[] drJldS = { drDataTemp[6], drDataTemp[7], drDataTemp[8], drDataTemp[9] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 6; i < 10; i++) + { + drDataTemp[i].ItemArray = drData[i - 6].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 200) // 代表5个计量点 jldID=10,11,12,13,14 + { + DataRow[] drJldS = { drDataTemp[10], drDataTemp[11], drDataTemp[12], drDataTemp[13], drDataTemp[14] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 10; i < 15; i++) + { + drDataTemp[i].ItemArray = drData[i - 10].ItemArray; + } + } + } + catch + { } + try + { + if (dataNum == 240) // 代表6个计量点 jldID=15,16,17,18,19,20 + { + DataRow[] drJldS = { drDataTemp[15], drDataTemp[16], drDataTemp[17], drDataTemp[18], drDataTemp[19], drDataTemp[20] }; + DataRow[] drData = TranData.GetDataTran_GPRS(drJldS, state.buffer, Station.MeterTYPE); + for (int i = 15; i < 21; i++) + { + drDataTemp[i].ItemArray = drData[i - 15].ItemArray; + } + } + } + catch + { } + + + // + foreach (DataRow dr in ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows) + { + int jld_id = Convert.ToInt16(dr["jld_ID"]); + + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(dr), Station.ZCName); + + //温度 + dr["WD"] = drDataTemp[jld_id]["WD"]; + //压力 + dr["YL"] = drDataTemp[jld_id]["YL"]; + //差压 + dr["CY"] = drDataTemp[jld_id]["CY"]; + //瞬时量 + dr["SSL"] = drDataTemp[jld_id]["SSL"]; + //今日量 + dr["JRL"] = drDataTemp[jld_id]["JRL"]; + //昨日量 + dr["ZRL"] = drDataTemp[jld_id]["ZRL"]; + //累计量 + dr["LJL"] = drDataTemp[jld_id]["LJL"]; + //本月量 + dr["BYL"] = drDataTemp[jld_id]["BYL"]; + //上月量 + dr["SYL"] = drDataTemp[jld_id]["SYL"]; + //今日时间 + dr["JRSJ"] = drDataTemp[jld_id]["JRSJ"]; + //昨日时间 + dr["ZRSJ"] = drDataTemp[jld_id]["ZRSJ"]; + //仪表状态 + dr["YBZT"] = drDataTemp[jld_id]["YBZT"]; + + try + { + if (dr["MeterTYPE"].ToString() == "脉冲") + { + //计算工况流量 + Single sngQN; + Single sngTf; + float sngPf; + if (dr["SSL"].ToString() != "") + { + sngQN = Convert.ToSingle(dr["SSL"].ToString()); + } + else + { + sngQN = 0; + } + if (dr["WD"].ToString() != "") + { + sngTf = float.Parse(dr["WD"].ToString()); + sngTf = sngTf + 273.15f; + } + else + { + sngTf = 0; + } + + if (dr["YL"].ToString() != "" && dr["YL"].ToString() != "0") + { + sngPf = Convert.ToSingle(dr["YL"].ToString()); + Single sngFz2; + + if (sngPf > 0.1 && sngPf < 0.5) + { + sngFz2 = 0.999f - 0.008f * (sngPf - 0.1f) / (0.5f - sngPf); + + } + else + { + if (sngPf < 0.1) sngFz2 = 0.998f; + if (sngPf > 0.5) sngFz2 = 0.988f; + } + + dr["SSGKLL"] = (sngQN * sngTf * 0.101325 * 0.998 / 293.15 / sngPf / 24).ToString("#.#"); + + } + else + { + dr["SSGKLL"] = 0; + } + + + + DataRow[] drS = ProgramGetData.dsPparameter.Tables[Station.ZCID].Select("jld_id='" + jld_id + "'"); + string strXx = drS[0]["CLXX"].ToString(); + string strSx = drS[0]["CLSX"].ToString(); + + dr["CXFLAG"] = TranData.GetCxFlag(dr["SSGKLL"].ToString(), strXx, strSx); + if (jld_id == 3) + { + + } + } + else + { + dr["CXFLAG"] = TranData.GetCxFlag(dr["CY"].ToString()); + } + + } + catch + { + + + } + + + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(dr), Station.ZCName); + + //Console.WriteLine(jld_id.ToString() + "_" + dr["SSL"] + "_" + dr["CY"]); + } + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PLC), state); + + } + catch (Exception ex) + { + } + } + + /// + /// 对于没在PLC的设备,每次采集程序启动读取存储的昨日量 今日量的总累积量 + /// + private void readTodayYesTerdayQL() + { + DateTime _Date = DateTime.Now.AddDays(-1); + _Date = DateTime.Parse(_Date.ToString("yyyy-MM-dd")); + string strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "' and RTIME=to_date('" + _Date.ToShortDateString() + "', 'yyyy-mm-dd') order by JLD_ID"; + dtToday_Flow = OracleLink.ExecuteDataTable(strSQL, "DTJK", ""); + strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "' and RTIME=to_date('" + _Date.AddDays(-1).ToShortDateString() + "', 'yyyy-mm-dd') order by JLD_ID"; + dtYesToday_FLOW = OracleLink.ExecuteDataTable(strSQL, "DTJK", ""); + } + /// + /// 保存昨日量、今日量到数据库 + /// + /// + private void SaveTable(int intSaveFlag) + { + SaveFlag = true; + Thread.Sleep(2000); + string strSQL = SQL_Strings.strSQL_Read_Today_YesterDay_Flow + " where STATION_ID='" + Station.ZCID + "'"; + OracleLink.SaveDataTable(strSQL, dtToday_Flow, "DTJK", ""); + } + + /// + /// 获取并解析福鑫的数据 + /// + /// + public void ReadCallback_WZFX(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 60) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_WZFX), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + + } + } + + /// + /// 获取并解析盘古积算仪的数据 + /// + /// + public void ReadCallback_PG(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 32) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch (Exception ex) + { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + + } + } + /// + /// 获取并解析爱知超声波的数据 + /// + /// + public void ReadCallback_CSB(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 30) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + try + { + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["CXFlag"] = TranData.GetCxFlag(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SSGKLL"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLXX"].ToString(), ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["CLSX"].ToString()); + } + catch { } + + ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["Gr"] = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"]; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["SYL"] = ""; + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_PG), state); + } + #region //提取昨日凌晨总累积量 计算今日量 + try + { + string strTotalFlowNow = ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["LJL"].ToString(); + DataRow[] drTotay; ; + drTotay = dtToday_Flow.Select("JLD_ID in( '" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drTotay.Length.ToString() + "\n"); + if (drTotay.Length == 0) //如果今日流量记录为空 把当前的流量总量写入表格 并保存到数据库中 + { + DataRow drToday = dtToday_Flow.NewRow(); + drToday["rtime"] = DateTime.Parse(DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")); + drToday["station_id"] = Station.ZCID; + drToday["jld_id"] = jldID; + drToday["flowtotal"] = strTotalFlowNow; + dtToday_Flow.Rows.Add(drToday); + SaveFlag = true; + } + else + { + //今日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JRL"] = float.Parse(strTotalFlowNow) - float.Parse(drTotay[0]["flowtotal"].ToString()); + } + + DataRow[] drYesterday; + drYesterday = dtYesToday_FLOW.Select("JLD_ID in ('" + jldID + "')"); + //Console.WriteLine("时间:" + DateTime.Now + "JLD_ID in( '" + jldID + "')--" + drYesterday.Length.ToString() + "\n"); + if (drYesterday.Length < 1) + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = ""; + } + else + { + //昨日量 + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["ZRL"] = float.Parse(drTotay[0]["flowtotal"].ToString()) - float.Parse(drYesterday[0]["flowtotal"].ToString()); ; + } + + } + catch { } + + #endregion + } + catch + { + + } + } + /// + /// 获得打印数据监视字符串 + /// + /// + /// + private string strPrint(DataRow dr) + { + return dr["JLD_NAME"] + "\t瞬时量:" + dr["SSL"] + "\t温度:" + dr["WD"] + "\t压力:" + dr["YL"] + "\t累积量:" + dr["LJL"]; + } + + /// + /// 获取并解析103的数据 + /// + /// + public void ReadCallback_103(IAsyncResult ar) + { + try + { + StateObject state = (StateObject)ar.AsyncState; + Socket socketRecive = state.workSocket; + //从远程设备读取数据 + int bytesRead = socketRecive.EndReceive(ar); + int dataNum; + dataNum = state.buffer[2]; + int jldID = state.buffer[0] - 1; + if (dataNum == 44) + { + ProgramGetData.strAppend("前\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID].ItemArray = TranData.GetDataTran_GPRS(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID], state.buffer, Station.MeterTYPE).ItemArray; + ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"] = ProgramGetData.dsPparameter.Tables[Station.ZCID].Rows[jldID]["JLD_NAME"]; + socketRecive.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReadCallback_103), state); + ProgramGetData.strAppend("后\t" + DateTime.Now.ToString() + "\t" + strPrint(ProgramGetData.dsJLDataRealTime.Tables[Station.ZCID].Rows[jldID]), Station.ZCName); + } + } + catch + { + } + + } + + + /// + /// 读取GPRS站场PLC的时间 + /// + /// + private string getPLCDateTime(byte[] plc_DateTime) + { + + string[] Uplc_DateTime = new string[4]; + + Uplc_DateTime[0] = plc_DateTime[4].ToString("X2") + plc_DateTime[3].ToString("X2"); + Uplc_DateTime[1] = plc_DateTime[6].ToString("X2") + plc_DateTime[5].ToString("X2"); + Uplc_DateTime[2] = plc_DateTime[8].ToString("X2") + plc_DateTime[7].ToString("X2"); + Uplc_DateTime[3] = plc_DateTime[10].ToString("X2") + plc_DateTime[9].ToString("X2"); + + string plc_Year = Uplc_DateTime[0]; + string plc_Month = Uplc_DateTime[1]; + string plc_Minute = Uplc_DateTime[2]; + string plc_Second = Uplc_DateTime[3]; + string plcDatetime = plc_Year + "-" + plc_Month.Substring(0, 2) + "-" + plc_Month.Substring(2, 2) + " " + plc_Minute.Substring(0, 2) + ":" + plc_Minute.Substring(2, 2) + ":" + plc_Second;//.Substring(0, 2);// +plc_Second.Substring(2, 2); + return plcDatetime; + } + + #endregion + + + + + } +} \ No newline at end of file diff --git a/ConsoleGetPLCData/CS/NetEvent.cs b/ConsoleGetPLCData/CS/NetEvent.cs new file mode 100644 index 0000000..e13944c --- /dev/null +++ b/ConsoleGetPLCData/CS/NetEvent.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace ConsoleGetPLCData.CS +{ + public delegate void NetEvent(object sender, NetEventArgs e); + + /// + /// 服务器程序的事件参数,包含了激发该事件的会话对象 + /// + public class NetEventArgs : EventArgs + { + + #region 字段 + + /// + /// 客户端与服务器之间的会话 + /// + private Session _client; + + #endregion + + #region 构造函数 + /// + /// 构造函数 + /// + /// 客户端会话 + public NetEventArgs(Session client) + { + if (null == client) + { + throw (new ArgumentNullException()); + } + + _client = client; + } + #endregion + + #region 属性 + + /// + /// 获得激发该事件的会话对象 + /// + public Session Client + { + get + { + return _client; + } + + } + + #endregion + + } +} diff --git a/ConsoleGetPLCData/CS/ScCal.cs b/ConsoleGetPLCData/CS/ScCal.cs new file mode 100644 index 0000000..4312404 --- /dev/null +++ b/ConsoleGetPLCData/CS/ScCal.cs @@ -0,0 +1,282 @@ + +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading; +using GetData_PLC; +namespace ConsoleGetPLCData.CS +{ + class ScCal + { + + string strError=""; + public void ZhanXianScCal() //通过selcet语句从 oracle 输差配置读取站内所有输差类型 ,再分系统计算输差 + { + Thread .Sleep (2000); + ProgramGetData.strAppend( DateTime.Now.ToString() + "------开始计算输差"); + while (true) + { + + DataSet dsSsData = new DataSet(); ; + DataTable dtTotal = new DataTable(); + dtTotal.TableName = "TotalData"; + try + { + dsSsData.ReadXml(ProgramGetData.strDataPath + "SsData.xml", XmlReadMode.ReadSchema); + for (int i = 0; i < dsSsData.Tables.Count; i++) //构建出实时数据总表 + { + dtTotal.Merge(dsSsData.Tables[i].Copy()); + } + dtTotal.WriteXml(ProgramGetData.strDataPath + "TotalData.xml",XmlWriteMode .WriteSchema); + + + + if (dtTotal.Rows.Count > 0) + { + + for (int i = 0; i < ProgramGetData.dtScRealTime.Rows.Count; i++) + { + Thread.Sleep(10); //暂停10毫秒 释放资源 + + ScDataCal(ProgramGetData.dtScRealTime.Rows[i], dtTotal); + } + ProgramGetData.dtScRealTime.WriteXml(ProgramGetData.strDataPath + "ScData.xml", XmlWriteMode.WriteSchema); + + DataRow[] drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='管线输差'"); //写线输差xml + + DataTable dtScTemp = ProgramGetData.dtScRealTime.Clone(); + for (int mm = 0; mm < drScRealTime.Length; mm++) + { + DataRow dr = dtScTemp.NewRow(); + dr.ItemArray = drScRealTime[mm].ItemArray; + dtScTemp.Rows.Add(dr); + } + dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\XIANSC.xml", XmlWriteMode.WriteSchema); + + + drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='站场输差'"); //写线输差xml + + dtScTemp = ProgramGetData.dtScRealTime.Clone(); + for (int mm = 0; mm < drScRealTime.Length; mm++) + { + DataRow dr = dtScTemp.NewRow(); + dr.ItemArray = drScRealTime[mm].ItemArray; + dtScTemp.Rows.Add(dr); + } + dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\ZHANSC.xml", XmlWriteMode.WriteSchema); + + drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='自定义输差'"); //写线输差xml + + dtScTemp = ProgramGetData.dtScRealTime.Clone(); + for (int mm = 0; mm < drScRealTime.Length; mm++) + { + DataRow dr = dtScTemp.NewRow(); + dr.ItemArray = drScRealTime[mm].ItemArray; + dtScTemp.Rows.Add(dr); + } + dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\ZDYSC.xml", XmlWriteMode.WriteSchema); + + //drScRealTime = ProgramGetData.dtScRealTime.Select("sctype='管线输差' and DEPT_ID='14'"); //巡线一支队 + //dtScTemp = ProgramGetData.dtScRealTime.Clone(); + //for (int mm = 0; mm < drScRealTime.Length; mm++) + //{ + // DataRow dr = dtScTemp.NewRow(); + // dr.ItemArray = drScRealTime[mm].ItemArray; + // dtScTemp.Rows.Add(dr); + //} + //dtScTemp.WriteXml(ProgramGetData.strDataPath + "\\ScData\\14.xml", XmlWriteMode.WriteSchema); + + } + } + + catch (SystemException err) + { + if (err.Message != null) + { + ProgramGetData.strAppend( DateTime.Now.ToString() + "------输差计算读取总表格xml时 文件占用"); + } + } + Thread.Sleep(1799); + } + } + + + private void ScDataCal(DataRow _DataRow, DataTable dtTotalData) + { + + try + { + + //_ScDataTable.Rows.Clear(); + + string strInJLD = _DataRow["IN_JLD_ID"].ToString(); + string strOutJLD = _DataRow["OUT_JLD_ID"].ToString(); + string strScType = _DataRow["SCTYPE"].ToString(); + string Express = ""; + + Single SsSumIn = 0; + Single JrSumIn = 0; + Single ZrSumIn = 0; + Single SsSumOut = 0; + Single JrSumOut = 0; + Single ZrSumOut = 0; + string strIn_P = ""; + string strOut_P = ""; + + if (strInJLD != "") + { + Express = "ID in(" + strInJLD + ")"; + DataRow[] SumRow = dtTotalData.Select(Express); + if (SumRow.Length >= 0) + { + SsSumIn = 0; JrSumIn = 0; ZrSumIn = 0; + SsSumIn = sumColumon(SumRow, "SSL"); + JrSumIn = sumColumon(SumRow, "JRL"); + ZrSumIn = sumColumon(SumRow, "ZRL"); + if (strScType == "管线输差") + { + for (int m = 0; m < SumRow.Length; m++) + { + strIn_P = strIn_P + SumRow[m]["YL"].ToString() + "★"; + + } + if (strIn_P.Length > 0) + strIn_P = strIn_P.Substring(0, strIn_P.Length - 1); + } + } + else + { + SsSumIn = 0; JrSumIn = 0; ZrSumIn = 0; strIn_P = ""; + } + } + + if (strOutJLD != "") + { + + Express = "ID in(" + strOutJLD + ")"; + DataRow[] SumRow = dtTotalData.Select(Express); + if (SumRow.Length >= 0) + { + SsSumOut = 0; JrSumOut = 0; ZrSumOut = 0; + SsSumOut = sumColumon(SumRow, "SSL"); + JrSumOut = sumColumon(SumRow, "JRL"); + ZrSumOut = sumColumon(SumRow, "ZRL"); + if (strScType == "管线输差") + { + for (int m = 0; m < SumRow.Length; m++) + { + strOut_P = strOut_P + SumRow[m]["YL"].ToString() + "★"; + } + if (strOut_P.Length > 0) + strOut_P = strOut_P.Substring(0, strOut_P.Length - 1); + + } + } + else + { + SsSumOut = 0; JrSumOut = 0; ZrSumOut = 0; strOut_P = ""; + + } + } + + _DataRow["IN_P"] =strIn_P ; + _DataRow["OUT_P"] = strOut_P ; + + _DataRow["SsInTotal"] = SsSumIn.ToString("0.####"); + _DataRow["SsOutTotal"] = SsSumOut.ToString("0.###"); + _DataRow["SsSc"] = (SsSumOut - SsSumIn).ToString("0.####"); + if (SsSumIn != 0) + { + _DataRow["SsPer"] = ((SsSumOut - SsSumIn) * 100 / SsSumIn).ToString("0.##") + "%"; + } + else + { + if (SsSumOut == 0) + { + _DataRow["SsSc"] = "0"; + _DataRow["SsPer"] = "0%"; + } + else + { + _DataRow["SsPer"] = "故障"; + } + + } + + _DataRow["JrInTotal"] = JrSumIn.ToString("0.####"); + _DataRow["JrOutTotal"] = JrSumOut.ToString("0.###"); + _DataRow["JrSc"] = (JrSumOut - JrSumIn).ToString("0.####"); + if (JrSumIn != 0) + { + _DataRow["JrPer"] = ((JrSumOut - JrSumIn) * 100 / JrSumIn).ToString("0.##") + "%"; + } + else + { + if (JrSumOut == 0) + { + _DataRow["JrSc"] = "0"; + _DataRow["JrPer"] = "0%"; + } + else + { + _DataRow["JrPer"] = "故障"; + } + + } + + _DataRow["ZrInTotal"] = ZrSumIn.ToString("0.####"); + _DataRow["ZrOutTotal"] = ZrSumOut.ToString("0.###"); + _DataRow["ZrSc"] = (ZrSumOut - ZrSumIn).ToString("0.####"); + if (ZrSumIn != 0) + { + _DataRow["ZrPer"] = ((ZrSumOut - ZrSumIn) * 100 / ZrSumIn).ToString("0.##") + "%"; + } + else + { + if (ZrSumOut == 0) + { + _DataRow["ZrSc"] = "0"; + _DataRow["ZrPer"] = "0%"; + } + else + { + _DataRow["ZrPer"] = "故障"; + } + + } + + } + catch (SystemException err) + { + if (err.Message != null) + { + ProgramGetData . strAppend( DateTime.Now.ToString() + "------" + "输差计算时出错"); + + } + } + } + private float sumColumon(DataRow[] _DataRow, string _ColumonName) + { + float FlowSum = 0; + + foreach (DataRow Dr1 in _DataRow) + { + try + { + FlowSum = FlowSum + float.Parse(Dr1[_ColumonName].ToString()); + } + catch (SystemException err) + { + if (err.Message != "") + { + continue; + } + } + } + return FlowSum; + + } + } +} diff --git a/ConsoleGetPLCData/CS/Session.cs b/ConsoleGetPLCData/CS/Session.cs new file mode 100644 index 0000000..9cc3f80 --- /dev/null +++ b/ConsoleGetPLCData/CS/Session.cs @@ -0,0 +1,287 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net.Sockets; +using System.Text; + +namespace ConsoleGetPLCData.CS +{ + /// + /// 客户端与服务器之间的会话类 + /// + /// 说明: + /// 会话类包含远程通讯端的状态,这些状态包括Socket,报文内容, + /// 客户端退出的类型(正常关闭,强制退出两种类型) + /// + public class Session : ICloneable + { + #region 字段 + + /// + /// 会话ID + /// + private SessionId _id; + + /// + /// 客户端发送到服务器的报文 + /// 注意:在有些情况下报文可能只是报文的片断而不完整 + /// + private string _datagram; + + /// + /// 客户端发送到服务器的以字节形式的报文, + /// 注意:在有些情况下报文可能只是报文的片断而不完整 + /// + private byte[] _databuffer; + + /// + /// 客户端的Socket + /// + private Socket _cliSock; + + /// + /// 客户端的退出类型 + /// + private ExitType _exitType; + + /// + /// 退出类型枚举 + /// + public enum ExitType + { + NormalExit, + ExceptionExit + }; + + #endregion + + #region 属性 + + /// + /// 返回会话的ID + /// + public SessionId ID + { + get + { + return _id; + } + } + + /// + /// 存取会话的报文 + /// + public string Datagram + { + get + { + return _datagram; + } + set + { + _datagram = value; + } + } + + + /// + /// 存取以二进制形式存放会话的报文 + /// + public byte[] DataBuffer + { + get + { + return _databuffer; + } + set + { + _databuffer = value; + } + } + + /// + /// 获得与客户端会话关联的Socket对象 + /// + public Socket ClientSocket + { + get + { + return _cliSock; + } + } + + /// + /// 存取客户端的退出方式 + /// + public ExitType TypeOfExit + { + get + { + return _exitType; + } + + set + { + _exitType = value; + } + } + + #endregion + + #region 方法 + + /// + /// 使用Socket对象的Handle值作为HashCode,它具有良好的线性特征. + /// + /// + public override int GetHashCode() + { + return (int)_cliSock.Handle; + } + + /// + /// 返回两个Session是否代表同一个客户端 + /// + /// + /// + public override bool Equals(object obj) + { + Session rightObj = (Session)obj; + + return (int)_cliSock.Handle == (int)rightObj.ClientSocket.Handle; + + } + + /// + /// 重载ToString()方法,返回Session对象的特征 + /// + /// + public override string ToString() + { + string result = string.Format("Session:{0},IP:{1}", + _id, _cliSock.RemoteEndPoint.ToString()); + + //result.C + return result; + } + + /// + /// 构造函数 + /// + /// 会话使用的Socket连接 + public Session(Socket cliSock) + { + Debug.Assert(cliSock != null); + + _cliSock = cliSock; + + _id = new SessionId((int)cliSock.Handle); + } + + /// + /// 关闭会话 + /// + public void Close() + { + Debug.Assert(_cliSock != null); + + //关闭数据的接受和发送 + _cliSock.Shutdown(SocketShutdown.Both); + + //清理资源 + _cliSock.Close(); + } + + #endregion + + #region ICloneable 成员 + + object System.ICloneable.Clone() + { + Session newSession = new Session(_cliSock); + newSession.Datagram = _datagram; + newSession.TypeOfExit = _exitType; + + return newSession; + } + + #endregion + } + + + /// + /// 唯一的标志一个Session,辅助Session对象在Hash表中完成特定功能 + /// + public class SessionId + { + /// + /// 与Session对象的Socket对象的Handle值相同,必须用这个值来初始化它 + /// + private int _id; + + /// + /// 返回ID值 + /// + public int ID + { + get + { + return _id; + } + } + + /// + /// 构造函数 + /// + /// Socket的Handle值 + public SessionId(int id) + { + _id = id; + } + + /// + /// 重载.为了符合Hashtable键值特征 + /// + /// + /// + public override bool Equals(object obj) + { + if (obj != null) + { + SessionId right = (SessionId)obj; + + return _id == right._id; + } + else if (this == null) + { + return true; + } + else + { + return false; + } + + } + + /// + /// 重载.为了符合Hashtable键值特征 + /// + /// + public override int GetHashCode() + { + return _id; + } + + /// + /// 重载,为了方便显示输出 + /// + /// + public override string ToString() + { + return _id.ToString(); + } + + } + +} diff --git a/ConsoleGetPLCData/CS/TranData.cs b/ConsoleGetPLCData/CS/TranData.cs new file mode 100644 index 0000000..94c7ad4 --- /dev/null +++ b/ConsoleGetPLCData/CS/TranData.cs @@ -0,0 +1,1107 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Text; + +namespace ConsoleGetPLCData.CS +{ + public class TranData + { + /// + /// 局域网Modbus通讯协议解析 + /// + /// 存储数据的datarow + /// ushort 数组 + /// 设备类型 + /// + public static DataRow GetDataTran_Net(DataRow drData, ushort[] usWord, string SbType) + { + switch (SbType) + { + case "0": //局域网解析施耐德PLC数据 + string[] tempWord; + tempWord = new string[20]; + + for (int j = 0; j < 20; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中 + { + tempWord[j] = usWord[j].ToString("x4"); + } + + //解析数据为明文----------------------------------------------------- + //温度 + drData["wd"] = (getInt16(tempWord[13].ToString()) / 10.0).ToString("0.##"); + //压力 + drData["yl"] = (getInt16(tempWord[12].ToString()) / 1000.0).ToString("0.###"); + //差压 + drData["CY"] = (getInt16(tempWord[14].ToString()) / 100.0).ToString("0.###"); + if (drData["CY"].Equals("0")) + { + drData["CY"] = "-"; + } + //瞬时量 + drData["SSL"] = (getUInt32(tempWord[0].ToString(), tempWord[1].ToString()) / 100 * 24).ToString(); + //今日量 + drData["JRL"] = (getUInt32(tempWord[2].ToString(), tempWord[3].ToString())).ToString(); + //昨日量 + drData["ZRL"] = (getUInt32(tempWord[4].ToString(), tempWord[5].ToString())).ToString(); + //累计量 + drData["LJL"] = (getUInt32(tempWord[10].ToString(), tempWord[11].ToString()) / 10000.0).ToString(); + //本月量 + drData["BYL"] = (getUInt32(tempWord[6].ToString(), tempWord[7].ToString()) / 10000.0).ToString(); + //上月量 + drData["SYL"] = (getUInt32(tempWord[8].ToString(), tempWord[9].ToString()) / 10000.0).ToString(); + //今日时间 + drData["JRSJ"] = (getInt16(tempWord[16].ToString())).ToString(); + //昨日时间 + drData["ZRSJ"] = (getInt16(tempWord[17].ToString())).ToString(); + + //仪表状态 + + switch (getInt16(tempWord[15].ToString().Substring(2, 2)).ToString()) + { + + case "0": + drData["YBZT"] = "停表"; + break; + case "1": + drData["YBZT"] = "运行"; + break; + case "2": + drData["YBZT"] = "补偿"; + break; + case "3": + drData["YBZT"] = "测试"; + break; + } + + + break; + default: + break; + } + + return drData; + + } + + /// + /// GPRS模块通讯 数据解析 + /// + /// 存储数据的datarow + /// ushort 数组 + /// 设备类型 + /// + public static DataRow GetDataTran_GPRS(DataRow drData, byte[] bufTemp, string SbType) + { + int dataNum = bufTemp[2]; + byte[] CrcNum; + string strPrint = ""; + switch (SbType) + { + #region //施耐德PLC + case "0": //施耐德PLC + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[20]; + for (int i = 0; i < 20; i++) + { + strData[i] = bufTemp[i * 2 + 3].ToString("X2") + bufTemp[i * 2 + 1 + 3].ToString("X2"); + } + + //解析数据为明文----------------------------------------------------- + //温度 + drData["WD"] = (getInt16(strData[13].ToString()) / 10.0).ToString("0.##"); + //压力 + drData["YL"] = (getInt16(strData[12].ToString()) / 1000.0).ToString("0.###"); + //差压 + drData["CY"] = (getInt16(strData[14].ToString()) / 100.0).ToString("0.###"); + //if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0")) + // { + // ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = ""; + // } + + //瞬时量 + drData["SSL"] = (getUInt32(strData[0].ToString(), strData[1].ToString()) / 100 * 24).ToString(); + //今日量 + drData["JRL"] = (getUInt32(strData[2].ToString(), strData[3].ToString())).ToString(); + //昨日量 + drData["ZRL"] = (getUInt32(strData[4].ToString(), strData[5].ToString())).ToString(); + //累计量 + drData["LJL"] = (getUInt32(strData[10].ToString(), strData[11].ToString()) / 10000.0).ToString(); + //本月量 + drData["BYL"] = (getUInt32(strData[6].ToString(), strData[7].ToString()) / 10000.0).ToString(); + //上月量 + drData["SYL"] = (getUInt32(strData[8].ToString(), strData[9].ToString()) / 10000.0).ToString(); + //今日时间 + drData["JRSJ"] = (getInt16(strData[16].ToString())).ToString(); + //昨日时间 + drData["ZRSJ"] = (getInt16(strData[17].ToString())).ToString(); + //仪表状态 + drData["YBZT"] = "运行"; + + } + break; + #endregion + #region //盘古积算仪 + + case "1": + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + string[] jldData = new string[8]; + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[32]; + for (int i = 0; i < 32; i++) + { + strData[i] = bufTemp[i + 3].ToString("X2"); + } + jldData[0] = getsingle(strData[2] + strData[3] + strData[0] + strData[1]).ToString("f1"); //瞬时流量 + jldData[1] = getsingle(strData[6] + strData[7] + strData[4] + strData[5]).ToString(); //差压//频率 + jldData[2] = getsingle(strData[10] + strData[11] + strData[8] + strData[9]).ToString("f2"); //温度 + jldData[3] = getsingle(strData[14] + strData[15] + strData[12] + strData[13]).ToString("f3"); //压力 + jldData[4] = getint(strData[18] + strData[19] + strData[16] + strData[17]).ToString(); //总累计流量 + jldData[7] = getsingle(strData[30] + strData[31] + strData[28] + strData[29]).ToString("f4"); //密度 + } + try + { + + + //温度 + drData["WD"] = jldData[2]; + //压力 + drData["YL"] = jldData[3]; + //差压 + try + { + drData["CY"] = string.Format("{0:F}", jldData[1]); + } + catch (Exception ex) + { + + } + //if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0")) + //{ + // ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = ""; + //} + + //累计量 + drData["LJL"] = jldData[4]; + try + { + //瞬时量 + drData["SSL"] = (float.Parse(jldData[0]) * 24).ToString("#.#"); + if (drData["SSL"].ToString() == "") drData["SSL"] = "0"; + } + catch (Exception ex) + { + drData["SSL"] = "0"; + } + + + + //本月量 + drData["BYL"] = ""; + //上月量 + drData["SYL"] = jldData[7]; + //今日时间 + drData["JRSJ"] = ""; + //昨日时间 + drData["ZRSJ"] = ""; + //仪表状态 + drData["YBZT"] = "运行"; + //计算工况流量 + Single sngQN; + Single sngTf; + float sngPf; + if (jldData[0] != "") + { + sngQN = Convert.ToSingle(jldData[0]); + } + else + { + sngQN = 0; + } + if (jldData[2] != "") + { + sngTf = float.Parse(jldData[2]); + sngTf = sngTf + 273.15f; + } + else + { + sngTf = 0; + } + + if (jldData[3] != "" && jldData[3] != "0") + { + sngPf = Convert.ToSingle(jldData[3]); + Single sngFz2; + + if (sngPf > 0.1 && sngPf < 0.5) + { + sngFz2 = 0.999f - 0.008f * (sngPf - 0.1f) / (0.5f - sngPf); + + } + else + { + if (sngPf < 0.1) sngFz2 = 0.998f; + if (sngPf > 0.5) sngFz2 = 0.988f; + } + + drData["SSGKLL"] = (sngQN * sngTf * 0.101325 * 0.998 / 293.15 / sngPf).ToString("#.#"); + + } + else + { + drData["SSGKLL"] = 0; + } + } + catch (Exception) + { + + + } + //try + //{ + // drData["CXFlag"] = GetCxFlag(drData["SSGKLL"].ToString(), drData["CLXX"].ToString(), drData["CLSX"].ToString()); + + //} + //catch (Exception) + //{ + + + //} + + //ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[2] + "\t压力:" + jldData[2] + "\t累积量:" + jldData[4], drData["STATION_NAME"].ToString()); + + break; + #endregion + #region Floboss103 + case "2": + + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + + jldData = new string[11]; + + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[44]; + for (int i = 0; i < 44; i++) + { + strData[i] = bufTemp[i + 3].ToString("X2"); + } + // 0B 03 2C 50 87 43 9B 12 D9 41 96 C6 5E 42 7B 12 D9 41 96 C2 AA 44 22 9B 5F 44 4D 33 33 42 C7 2E EF 43 E7 26 31 BD 68 28 69 BE BE 87 D5 C3 77 1A A8 + //jldData[0] = getsingle("439B5087").ToString(); + jldData[0] = (getsingle(strData[2] + strData[3] + strData[0] + strData[1]) * 1000).ToString(); + jldData[1] = (getsingle(strData[6] + strData[7] + strData[4] + strData[5]) * 1000).ToString(); + jldData[2] = (getsingle(strData[10] + strData[11] + strData[8] + strData[9]) * 1000).ToString(); + jldData[3] = (getsingle(strData[14] + strData[15] + strData[12] + strData[12]) / 10).ToString(); + jldData[4] = (getsingle(strData[18] + strData[19] + strData[16] + strData[16]) / 10).ToString(); + jldData[5] = (getsingle(strData[22] + strData[23] + strData[20] + strData[20]) / 10).ToString(); + jldData[6] = getsingle(strData[26] + strData[27] + strData[24] + strData[24]).ToString(); + jldData[7] = getsingle(strData[30] + strData[31] + strData[28] + strData[28]).ToString(); + jldData[8] = getsingle(strData[34] + strData[35] + strData[32] + strData[32]).ToString("f2"); + jldData[9] = (getsingle(strData[38] + strData[39] + strData[36] + strData[36]) / 1000).ToString("f3"); + jldData[10] = getsingle(strData[42] + strData[43] + strData[40] + strData[40]).ToString("f2"); + + + } + //ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[10] + "\t压力:" + jldData[9] + "\t累积量:" + jldData[5], drData["STATION_NAME"].ToString()); + + //温度 + drData["WD"] = jldData[10]; + //压力 + drData["YL"] = jldData[9]; + //差压 + drData["CY"] = jldData[8]; + //瞬时量 + drData["SSL"] = jldData[0]; + //今日量 + drData["JRL"] = jldData[1]; + //昨日量 + drData["ZRL"] = jldData[2]; + //累计量 + drData["LJL"] = jldData[5]; + //本月量 + drData["BYL"] = jldData[3]; + //上月量 + drData["SYL"] = jldData[4]; + //今日时间 + drData["JRSJ"] = jldData[6].Substring(0, jldData[6].IndexOf('.')); + //昨日时间 + drData["ZRSJ"] = jldData[7]; + //仪表状态 + drData["YBZT"] = "运行"; + + drData["CXFlag"] = GetCxFlag(jldData[8]); + + + break; + #endregion + #region tengkongPLC + case "6": + + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + + jldData = new string[11]; + + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[44]; + for (int i = 0; i < 44; i++) + { + strData[i] = bufTemp[i + 3].ToString("X2"); + } + // 0B 03 2C 50 87 43 9B 12 D9 41 96 C6 5E 42 7B 12 D9 41 96 C2 AA 44 22 9B 5F 44 4D 33 33 42 C7 2E EF 43 E7 26 31 BD 68 28 69 BE BE 87 D5 C3 77 1A A8 + //jldData[0] = getsingle("439B5087").ToString(); + jldData[0] = (getsingle(strData[2] + strData[3] + strData[0] + strData[1]) * 1000).ToString(); + jldData[1] = (getsingle(strData[6] + strData[7] + strData[4] + strData[5]) * 1000).ToString(); + jldData[2] = (getsingle(strData[10] + strData[11] + strData[8] + strData[9]) * 1000).ToString(); + jldData[3] = (getsingle(strData[14] + strData[15] + strData[12] + strData[12]) / 10).ToString(); + jldData[4] = (getsingle(strData[18] + strData[19] + strData[16] + strData[16]) / 10).ToString(); + jldData[5] = (getsingle(strData[22] + strData[23] + strData[20] + strData[20]) / 10).ToString(); + jldData[6] = getsingle(strData[26] + strData[27] + strData[24] + strData[24]).ToString(); + jldData[7] = getsingle(strData[30] + strData[31] + strData[28] + strData[28]).ToString(); + jldData[8] = getsingle(strData[34] + strData[35] + strData[32] + strData[32]).ToString("f2"); + jldData[9] = (getsingle(strData[38] + strData[39] + strData[36] + strData[36]) / 1000).ToString("f3"); + jldData[10] = getsingle(strData[42] + strData[43] + strData[40] + strData[40]).ToString("f2"); + + + } + //ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[10] + "\t压力:" + jldData[9] + "\t累积量:" + jldData[5], drData["STATION_NAME"].ToString()); + + //温度 + drData["WD"] = jldData[10]; + //压力 + drData["YL"] = jldData[9]; + //差压 + drData["CY"] = jldData[8]; + //瞬时量 + drData["SSL"] = jldData[0]; + //今日量 + drData["JRL"] = jldData[1]; + //昨日量 + drData["ZRL"] = jldData[2]; + //累计量 + drData["LJL"] = jldData[5]; + //本月量 + drData["BYL"] = jldData[3]; + //上月量 + drData["SYL"] = jldData[4]; + //今日时间 + drData["JRSJ"] = jldData[6].Substring(0, jldData[6].IndexOf('.')); + //昨日时间 + drData["ZRSJ"] = jldData[7]; + //仪表状态 + drData["YBZT"] = "运行"; + + drData["CXFlag"] = GetCxFlag(jldData[8]); + + + break; + #endregion + #region 西门子PLC + case "3": + + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[120]; + for (int i = 0; i < 120; i++) + { + strData[i] = bufTemp[i * 2 + 3].ToString("X2") + bufTemp[i * 2 + 1 + 3].ToString("X2"); + } + //解析数据为明文----------------------------------------------------- + //温度 + drData["WD"] = (getInt16(strData[13].ToString()) / 10.0).ToString("0.##"); + //压力 + drData["YL"] = (getInt16(strData[12].ToString()) / 1000.0).ToString("0.###"); + //差压 + drData["CY"] = (getInt16(strData[14].ToString()) / 100.0).ToString("0.###"); + //if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0")) + // { + // ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = ""; + // } + + //瞬时量 + drData["SSL"] = (getUInt32(strData[0].ToString(), strData[1].ToString()) / 100 * 24).ToString(); + //今日量 + drData["JRL"] = (getUInt32(strData[2].ToString(), strData[3].ToString())).ToString(); + //昨日量 + drData["ZRL"] = (getUInt32(strData[4].ToString(), strData[5].ToString())).ToString(); + //累计量 + drData["LJL"] = (getUInt32(strData[10].ToString(), strData[11].ToString()) / 10000.0).ToString(); + //本月量 + drData["BYL"] = (getUInt32(strData[6].ToString(), strData[7].ToString()) / 10000.0).ToString(); + //上月量 + drData["SYL"] = (getUInt32(strData[8].ToString(), strData[9].ToString()) / 10000.0).ToString(); + //今日时间 + drData["JRSJ"] = (getInt16(strData[16].ToString())).ToString(); + //昨日时间 + drData["ZRSJ"] = (getInt16(strData[17].ToString())).ToString(); + //仪表状态 + drData["YBZT"] = "运行"; + + } + + break; + + #endregion + #region 超声波流量计爱知 + case "4": + + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + + jldData = new string[11]; + + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[30]; + for (int i = 0; i < 30; i++) + { + strData[i] = bufTemp[i + 3].ToString("X2"); + } + // 0B 03 2C 50 87 43 9B 12 D9 41 96 C6 5E 42 7B 12 D9 41 96 C2 AA 44 22 9B 5F 44 4D 33 33 42 C7 2E EF 43 E7 26 31 BD 68 28 69 BE BE 87 D5 C3 77 1A A8 + //jldData[0] = getsingle("439B5087").ToString(); + //瞬时工况流量 + drData["CY"] = (getInt32(strData[0] + strData[1] + strData[2] + strData[3]) / 100.0).ToString("0.###"); + //瞬时标况量 + drData["SSL"] = (getInt32(strData[4] + strData[5] + strData[6] + strData[7]) / 100.0).ToString("0.#"); + //压力 + drData["YL"] = (getInt32(strData[8] + strData[9] + strData[10] + strData[11]) / 100000.0).ToString("0.###"); + //温度 + drData["WD"] = (getInt32(strData[12] + strData[13] + strData[14] + strData[15]) / 100.0).ToString("0.#"); + //累计量 + drData["LJL"] = (getInt32(strData[20] + strData[21] + strData[22] + strData[23])/10.0).ToString(); + //jldData[5] = (getInt32(strData[20] + strData[21] + strData[22] + strData[23]) / 10).ToString(); + + + + } + + ////温度 + //drData["WD"] = jldData[10]; + ////压力 + //drData["YL"] = jldData[9]; + ////差压 + //drData["CY"] = jldData[8]; + ////瞬时量 + //drData["SSL"] = jldData[0]; + //今日量 + drData["JRL"] = ""; + //昨日量 + drData["ZRL"] = ""; + //累计量 + //drData["LJL"] = ""; + //本月量 + drData["BYL"] =""; + //上月量 + drData["SYL"] = ""; + //今日时间 + drData["JRSJ"] = ""; + //昨日时间 + drData["ZRSJ"] = ""; + //仪表状态 + drData["YBZT"] = "运行"; + + break; + + #endregion + + #region //盘古积算仪 + + case "5": + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + jldData = new string[8]; + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + string[] strData = new string[60]; + for (int i = 0; i < 60; i++) + { + strData[i] = bufTemp[i + 3].ToString("X2"); + } + jldData[0] = (getsingle(strData[24] + strData[25] + strData[36] + strData[27]) / 1).ToString(); //瞬时流量 + jldData[1] = (getsingle(strData[34] + strData[35] + strData[36] + strData[37]) / 1).ToString(); //差压//频率 + jldData[2] = (getsingle(strData[44] + strData[45] + strData[46] + strData[47]) / 1).ToString(); ; //温度 + jldData[3] = (getsingle(strData[48] + strData[49] + strData[50] + strData[51]) / 1000).ToString(); //压力 + jldData[4] = (getsingle(strData[16] + strData[17] + strData[18] + strData[19]) / 1).ToString(); //总累计流量 + jldData[7] = (getsingle(strData[56] + strData[57] + strData[58] + strData[59]) / 1).ToString(); //瞬时工况流量 + + + + } + try + { + + + //温度 + drData["WD"] = jldData[2]; + //压力 + drData["YL"] = jldData[3]; + //差压 + try + { + drData["CY"] = string.Format("{0:F}", jldData[1]); + } + catch (Exception ex) + { + + } + //if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0")) + //{ + // ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = ""; + //} + + //累计量 + drData["LJL"] = jldData[4]; + try + { + //瞬时量 + drData["SSL"] = (float.Parse(jldData[0]) * 24).ToString("#.#"); + if (drData["SSL"].ToString() == "") drData["SSL"] = "0"; + } + catch (Exception ex) + { + drData["SSL"] = "0"; + } + + + + //本月量 + drData["BYL"] = ""; + //上月量 + drData["SYL"] =""; + //今日时间 + drData["JRSJ"] = ""; + //昨日时间 + drData["ZRSJ"] = ""; + //仪表状态 + drData["YBZT"] = "运行"; + ////计算工况流量 + + drData["SSGKLL"] = jldData[7]; + //Single sngQN; + //Single sngTf; + //float sngPf; + //if (jldData[0] != "") + //{ + // sngQN = Convert.ToSingle(jldData[0]); + //} + //else + //{ + // sngQN = 0; + //} + //if (jldData[2] != "") + //{ + // sngTf = float.Parse(jldData[2]); + // sngTf = sngTf + 273.15f; + //} + //else + //{ + // sngTf = 0; + //} + + //if (jldData[3] != "" && jldData[3] != "0") + //{ + // sngPf = Convert.ToSingle(jldData[3]); + // Single sngFz2; + + // if (sngPf > 0.1 && sngPf < 0.5) + // { + // sngFz2 = 0.999f - 0.008f * (sngPf - 0.1f) / (0.5f - sngPf); + + // } + // else + // { + // if (sngPf < 0.1) sngFz2 = 0.998f; + // if (sngPf > 0.5) sngFz2 = 0.988f; + // } + + // drData["SSGKLL"] = (sngQN * sngTf * 0.101325 * 0.998 / 293.15 / sngPf).ToString("#.#"); + + //} + //else + //{ + // drData["SSGKLL"] = 0; + //} + } + catch (Exception) + { + + + } + //try + //{ + // drData["CXFlag"] = GetCxFlag(drData["SSGKLL"].ToString(), drData["CLXX"].ToString(), drData["CLSX"].ToString()); + + //} + //catch (Exception) + //{ + + + //} + + //ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData["JLD_NAME"] + "\t 瞬时量:" + jldData[0] + "\t温度:" + jldData[2] + "\t压力:" + jldData[2] + "\t累积量:" + jldData[4], drData["STATION_NAME"].ToString()); + + break; + #endregion + + + } + + return drData; + + } + /// + /// GPRS模块通讯 数据解析 PLC变化的计量点个数 + /// + /// 存储数据的datarow + /// ushort 数组 + /// 设备类型 + /// + public static DataRow[] GetDataTran_GPRS(DataRow[] drData, byte[] bufTemp, string SbType) + { + int dataNum = bufTemp[2]; + byte[] CrcNum; + string strPrint = ""; + switch (SbType) + { + #region //施耐德PLC + case "0": //施耐德PLC + CrcNum = GetCRC16(bufTemp, dataNum + 3, true); + if (bufTemp[1] == 0x3 && CrcNum[0] == bufTemp[dataNum + 3] && CrcNum[1] == bufTemp[dataNum + 4]) + { + int jldNum = dataNum / 40; + string[] strData = new string[jldNum * 20]; + for (int i = 0; i < jldNum * 20; i++) + { + strData[i] = bufTemp[i * 2 + 3].ToString("X2") + bufTemp[i * 2 + 1 + 3].ToString("X2"); + } + + for (int jldID = 0; jldID < jldNum; jldID++) + { + //解析数据为明文----------------------------------------------------- + //温度 + drData[jldID]["WD"] = (getInt16(strData[13 + jldID * 20].ToString()) / 10.0).ToString("0.##"); + //压力 + drData[jldID]["YL"] = (getInt16(strData[12 + jldID * 20].ToString()) / 1000.0).ToString("0.###"); + //差压 + drData[jldID]["CY"] = (getInt16(strData[14 + jldID * 20].ToString()) / 100.0).ToString("0.###"); + //if (ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4].Equals("0")) + // { + // ProgramReadPLC.SsDataDs.Tables[ZCID].Rows[i][4] = ""; + // } + + //瞬时量 + drData[jldID]["SSL"] = (getUInt32(strData[0 + jldID * 20].ToString(), strData[1 + jldID * 20].ToString()) / 100 * 24).ToString(); + //今日量 + drData[jldID]["JRL"] = (getUInt32(strData[2 + jldID * 20].ToString(), strData[3 + jldID * 20].ToString())).ToString(); + //昨日量 + drData[jldID]["ZRL"] = (getUInt32(strData[4 + jldID * 20].ToString(), strData[5 + jldID * 20].ToString())).ToString(); + //累计量 + drData[jldID]["LJL"] = (getUInt32(strData[10 + jldID * 20].ToString(), strData[11 + jldID * 20].ToString()) / 10000.0).ToString(); + //本月量 + drData[jldID]["BYL"] = (getUInt32(strData[6 + jldID * 20].ToString(), strData[7 + jldID * 20].ToString()) / 10000.0).ToString(); + //上月量 + drData[jldID]["SYL"] = (getUInt32(strData[8 + jldID * 20].ToString(), strData[9 + jldID * 20].ToString()) / 10000.0).ToString(); + //今日时间 + drData[jldID]["JRSJ"] = (getInt16(strData[16 + jldID * 20].ToString())).ToString(); + //昨日时间 + drData[jldID]["ZRSJ"] = (getInt16(strData[17 + jldID * 20].ToString())).ToString(); + //仪表状态 + drData[jldID]["YBZT"] = "运行"; + + //ProgramGetData.strAppend("中\t" + DateTime.Now.ToString() + "\t" + drData[jldID]["JLD_ID"] + ":\t 瞬时量:" + (getUInt32(strData[0 + jldID * 20].ToString(), strData[1 + jldID * 20].ToString()) / 100 * 24).ToString() + // + "\t温度:" + (getInt16(strData[13 + jldID * 20].ToString()) / 10.0).ToString("0.##") + // + "\t压力:" + (getInt16(strData[12 + jldID * 20].ToString()) / 1000.0).ToString("0.###") + // + "\t累积量:" + (getUInt32(strData[10 + jldID * 20].ToString(), strData[11 + jldID * 20].ToString()) / 10000.0).ToString(), drData[jldID]["STATION_NAME"].ToString()); + + + + } + + } + break; + #endregion + } + + return drData; + + } + + /// + /// 判断脉冲仪表工况运行状态 + /// + /// 工况流量 + /// 仪表上限 + /// 仪表下限 + /// 超限级别 4 3 2 1 0 -1 -2 -3 -4 + public static string GetCxFlag(string Value, string strXx, string strSx) + { + string strCxFlag = ""; + try + { + //判断工况是否超限 + if (Value != "") + { + Single sngSSGK = Convert.ToSingle(Value); + Single sngCLXX = Convert.ToSingle(strXx); + Single sngCLSX = Convert.ToSingle(strSx); + + if (sngSSGK > 0.8 * sngCLSX) strCxFlag = "1"; + if (sngSSGK > 0.95 * sngCLSX) strCxFlag = "2"; + if (sngSSGK > sngCLSX) strCxFlag = "3"; + + if (sngSSGK >= 0.3 * sngCLSX && sngSSGK <= 0.8 * sngCLSX) strCxFlag = "0"; + + if (sngSSGK < 0.3 * sngCLSX) strCxFlag = "-1"; + if (sngSSGK < 0.1 * sngCLSX) strCxFlag = "-2"; + if (sngSSGK < sngCLXX && sngSSGK > 0) strCxFlag = "-3"; + if (sngSSGK == 0) strCxFlag = "-4"; + } + } + catch (Exception) + { + + } + return strCxFlag; + } + /// + /// 判断孔板差压运行情况是否超限 + /// + /// 差压值 + /// 超限级别 4 3 2 1 0 -1 -2 -3 -4 + public static string GetCxFlag(string Value) + { + string strCxFlag = ""; + //判断差压是否超限 + try + { + Single sngCy = 0; + if (Value != "" && Value != "-") + { + sngCy = Convert.ToSingle(Value); + } + + if (sngCy > 40) strCxFlag = "1"; + if (sngCy > 50) strCxFlag = "2"; + if (sngCy > 55) strCxFlag = "3"; + if (sngCy > 60) strCxFlag = "4"; + + if (sngCy >= 5 && sngCy <= 40) strCxFlag = "0"; + + if (sngCy < 5) strCxFlag = "-1"; + if (sngCy < 3) strCxFlag = "-2"; + if (sngCy < 1 && sngCy > 0) strCxFlag = "-3"; + if (sngCy == 0) strCxFlag = "-4"; + } + catch (Exception ex) + { + + } + + + return strCxFlag; + } + + + public static DataRow GetPLCPar_Net(DataRow drData, ushort[] usWord, string SbType) + { + string[] tempWord; + tempWord = new string[60]; + for (int j = 0; j < 60; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中 + { + tempWord[j] = usWord[j].ToString("x4"); + } + string[] sngPar = new string[30]; + + for (int j = 0; j < 30; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中 + { + if (j <= 21) + { + sngPar[j] = (getsingle(tempWord[j * 2 + 1] + tempWord[j * 2]) * 100).ToString(); + } + else + { + sngPar[j] = getsingle(tempWord[j * 2 + 1] + tempWord[j * 2]).ToString(); + } + drData[j] = sngPar[j]; + if (j == 28) + { + drData["BAK3"] = "读取成功"; + } + } + float c1bfs = float.Parse(sngPar[0]); + if (c1bfs > 7000) + { + for (int j = 0; j < 21; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中 + { + sngPar[j] = (Single.Parse(sngPar[j]) / 100).ToString(); + drData[j] = sngPar[j]; + } + } + return drData; + } + + public static DataRow netError(DataRow drData) + { + //温度 + drData["WD"] = ""; + //压力 + drData["YL"] = ""; + //差压 + drData["CY"] = ""; + //瞬时量 + drData["SSL"] = ""; + //今日量 + drData["JRL"] = ""; + //昨日量 + drData["ZRL"] = ""; + //累计量 + drData["LJL"] = ""; + //本月量 + drData["BYL"] = ""; + //上月量 + drData["SYL"] = ""; + //今日时间 + drData["JRSJ"] = ""; + //昨日时间 + drData["ZRSJ"] = ""; + //仪表状态 + + + drData["YBZT"] = "通讯故障"; + + return drData; + } + + public static byte[] Modbus_ReadData(int Addr, int Func, int StartAddr, int DataNum) + { + Byte[] RcvStr; + Byte[] SendStr; + SendStr = new Byte[8]; + SendStr[0] = byte.Parse(Addr.ToString()); //' ,从站号是2 + SendStr[1] = byte.Parse(Func.ToString());//' ,读多个字的命令代码 + int Hibyte = StartAddr / 256; + int LowByte = StartAddr % 256; + SendStr[2] = byte.Parse(Hibyte.ToString());// ',起始地址高字节 0x807开始 + SendStr[3] = byte.Parse(LowByte.ToString());// ',起始地址低字节 + Hibyte = DataNum / 256; + LowByte = DataNum % 256; + SendStr[4] = byte.Parse(Hibyte.ToString());//',数据长度高字节 + SendStr[5] = byte.Parse(LowByte.ToString()); //',数据长度低字节 + RcvStr = GetCRC16(SendStr, 6, true);// ',CRC计算 + SendStr[6] = RcvStr[0]; + SendStr[7] = RcvStr[1]; + return SendStr; + } + public static string GetFlowGK(ushort[] uhNum, ushort[] uhK,out string strPlusNum) + { + int intPlusNum = 0; + intPlusNum = Convert.ToInt16(uhNum[0]); + + string[] strPlusK; + strPlusK = new string[4]; + for (int j = 0; j < 4; j++) //计量点数据读取上来之后,将20个寄存器的数据解析出来赋给数据行变量,添加到表中 + { + strPlusK[j] = uhK[j].ToString("x4"); + } + float sngPlusK = 0; + sngPlusK = getsingle(strPlusK[1] + strPlusK[0]); + strPlusNum = intPlusNum.ToString(); + return (intPlusNum / sngPlusK * 3600).ToString("0.#"); + + } + + + #region 数据格式转换 + private static uint getUInt32(string low, string hight) + { + if (low == "" & hight == "") + { + return 0; + } + else + { + return (uint)(Convert.ToUInt16(low, 0x10) + (Convert.ToUInt16(hight, 0x10) * 0xffff)); + } + } + + private static short getInt16(string low) + { + if (low == "") + { + return 0; + } + else + { + return Convert.ToInt16(low, 0x10); + } + } + + private static int getInt32(string low) + { + if (low == "") + { + return 0; + } + else + { + return Convert.ToInt32(low, 0x10); + } + } + + private static UInt32 getint(string _strData) + { + string shuju = _strData; + uint num = uint.Parse(shuju, System.Globalization.NumberStyles.AllowHexSpecifier); + byte[] floatValues = BitConverter.GetBytes(num); + string f = BitConverter.ToUInt32(floatValues, 0).ToString("0.######"); + return UInt32.Parse(f); + } + + + + private static Single getsingle(string _strData) + { + string shuju = _strData; + uint num = uint.Parse(shuju, System.Globalization.NumberStyles.AllowHexSpecifier); + byte[] floatValues = BitConverter.GetBytes(num); + string f = BitConverter.ToSingle(floatValues, 0).ToString("0.######"); + return Single.Parse(f); + } + + + #endregion + + + #region 校验和 + /// + /// 计算按位异或校验和(返回校验和值) + /// + /// 命令数组 + /// 校验和值 + private static byte GetXOR(byte[] Cmd) + { + byte check = (byte)(Cmd[0] ^ Cmd[1]); + for (int i = 2; i < Cmd.Length; i++) + { + check = (byte)(check ^ Cmd[i]); + } + return check; + } + + /// + /// 计算按位异或校验和(返回包含校验和的完整命令数组) + /// + /// 命令数组 + /// 包含校验和的完整命令数组 + private static byte[] GetXORFull(byte[] Cmd) + { + byte check = GetXOR(Cmd); + List newCmd = new List(); + newCmd.AddRange(Cmd); + newCmd.Add(check); + return newCmd.ToArray(); + } + #endregion + #region CRC16查表法 + + #region CRC对应表 + //高位表 + readonly static byte[] CRCHigh = new byte[]{ + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, + 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, + 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, + 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, + 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40}; + //低位表 + readonly static byte[] CRCLow = new byte[]{ + 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, + 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, + 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, + 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, + 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, + 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, + 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, + 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, + 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, + 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, + 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, + 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, + 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, + 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, + 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, + 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, + 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, + 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, + 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, + 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, + 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, + 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, + 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, + 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, + 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, + 0x43, 0x83, 0x41, 0x81, 0x80, 0x40}; + #endregion + + /// + /// 计算CRC16循环校验码 + /// + /// 命令数组 + /// 高位是否在前 + /// 高低位校验码 + public static byte[] GetCRC16(byte[] Cmd, int Num, bool IsHighBefore) + { + int index; + int crc_Low = 0xFF; + int crc_High = 0xFF; + for (int i = 0; i < Num; i++) + { + index = crc_High ^ (char)Cmd[i]; + crc_High = crc_Low ^ CRCHigh[index]; + crc_Low = (byte)CRCLow[index]; + } + if (IsHighBefore == true) + { + return new byte[2] { (byte)crc_High, (byte)crc_Low }; + } + else + { + return new byte[2] { (byte)crc_Low, (byte)crc_High }; + } + } + + /// + /// 计算CRC16循环校验码(返回包含校验码的完整命令数组) + /// + /// 命令数组 + /// 高位是否在前 + /// + + #endregion + + + } +} diff --git a/ConsoleGetPLCData/ConsoleGetPLCData.csproj b/ConsoleGetPLCData/ConsoleGetPLCData.csproj new file mode 100644 index 0000000..d4fdb6d --- /dev/null +++ b/ConsoleGetPLCData/ConsoleGetPLCData.csproj @@ -0,0 +1,87 @@ + + + + + Debug + AnyCPU + {A2378DFD-D382-44FB-B280-61224B8E0ACA} + Exe + Properties + ConsoleGetPLCData + ConsoleGetPLCData + v4.0 + 512 + + + + x86 + true + full + false + D:\GetPLCData\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + bin\Debug\FtdAdapter.dll + + + False + bin\Debug\log4net.dll + + + False + bin\Debug\Modbus.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {3412cc68-9c7e-4f3e-a9db-285efd5f55db} + GetData_PLC + + + + + \ No newline at end of file diff --git a/ConsoleGetPLCData/Program.cs b/ConsoleGetPLCData/Program.cs new file mode 100644 index 0000000..b72a92a --- /dev/null +++ b/ConsoleGetPLCData/Program.cs @@ -0,0 +1,1084 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using GetData_PLC; +using ConsoleGetPLCData.CS; +using System.Net; + +namespace ConsoleGetPLCData +{ + + public struct stStation + { + public string ip; + public int port; + public string ZCID; + public int readDiffTime; + public string strError; + public string ZCName; + public string MeterTYPE; + public string NetTYPE; + } + class ProgramGetData + { + + public static DataSet dsJLDataRealTime = new DataSet(); //实时采集数据集 + public static DataSet dsPparameter = new DataSet(); //站场参数数据集 + public static DataTable dtScRealTime = new DataTable(); // 实时输差数据集 + public static DataSet dsZhanDateTime = new DataSet(); // 实时PLC时间 + + + public static DataTable dtZhan = new DataTable(); //站场数据集 + public static DataTable dtZhanNet = new DataTable(); //局域网站场数据集 + public static DataTable dtZhanGPRS = new DataTable(); //GPRS站场数据集 + + + public static string strAPPDataPath = Environment.CurrentDirectory + @"\Data\"; //采集程序路径 + public static string strParPath = strAPPDataPath + @"par\"; //计量参数文件存储路径 + public static string strConfigPath = strAPPDataPath + @"Config\"; //采集程序参数保存路径 + public static string strDataPath = strAPPDataPath + @"RealTime\"; //实时数据存储路径 + + public static string strDataPath_JlData = strDataPath + @"JlData\"; //分站计量实时数据存储路径 + public static string strDataPath_ScData = strDataPath + @"ScData\"; //输差数据XML存储文件夹 + public static string strDataPath_DataTime = strDataPath + @"DateTime\"; //分站时间xml存储文件夹 + public static string strDataPath_Log = strDataPath + @"Log\"; //日志存储文件夹 + + + + //log 日志存放数据 + public static string strLogPath = strDataPath + @"log\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "_log.txt"; + public static string strLogPath_Data = strDataPath + @"log\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "_Datalog_"; + + private string strErr = ""; + private string strSQL = ""; + public static bool blWriteParXMLFlag; + private Thread[] GetPLCDataThread; + Dictionary ThreadDictionary = new Dictionary(); + static void Main(string[] args) + { + strAppend(DateTime.Now.ToString() + "------启动实时采集程序!"); + + System.IO.Directory.CreateDirectory(strAPPDataPath); //Data文件夹 + System.IO.Directory.CreateDirectory(strParPath); //Data\par文件夹 + System.IO.Directory.CreateDirectory(strDataPath); //Data\realtime文件夹 + System.IO.Directory.CreateDirectory(strConfigPath); //Data\realtime文件夹 + + System.IO.Directory.CreateDirectory(strDataPath_JlData + "JSON\\"); //分站xml存储文件夹 + System.IO.Directory.CreateDirectory(strDataPath_ScData); //输差数据XML存储文件夹 + System.IO.Directory.CreateDirectory(strDataPath_DataTime);//分站时间xml存储文件夹 + System.IO.Directory.CreateDirectory(strDataPath_Log); //日志存储文件夹 + + FileInfo fi = new FileInfo(ProgramGetData.strLogPath); + + if (fi.Exists == false) + { + File.CreateText(ProgramGetData.strLogPath); + } + ProgramGetData objPLC = new ProgramGetData(); + objPLC.InitialTalbe();// 初始化采集相关表格 + Thread.Sleep(5000); + + + //objPLC.GetPLCDataStart(); + objPLC.GetGPRSStart(); + objPLC.GetNetStart(); + + Thread.Sleep(3000); + + + + strAppend(DateTime.Now.ToString() + "------启动输差实时计算线程!"); + objPLC.ScCal();//启动输差实时计算 + Thread.Sleep(3000); + objPLC.SaveXML();//启动保存xml线程 + + Console.ReadKey(); + } + private void SaveXML() //输差计算 + { + //保存实时数据到xml + Thread th = new Thread(SaveXML_ReadPar); + th.Start(); + } + + private void ScCal() //输差计算 + { + ScCal newSccal = new ScCal(); + Thread ScThread = new Thread(new ThreadStart(newSccal.ZhanXianScCal)); + ScThread.Start(); + strAppend(DateTime.Now.ToString() + "------启动输差实时计算线程---完成!"); + } + /// + /// 向IP端口发json + /// + /// + /// + /// + public static string HttpWebRequestPost(string url, string param) + { + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); + Encoding encoding = Encoding.UTF8; + byte[] byteArray = Encoding.ASCII.GetBytes(param); + string responseData = String.Empty; + req.Method = "POST"; + req.ContentType = "application/x-www-form-urlencoded"; + req.ContentLength = byteArray.Length; + + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(byteArray, 0, byteArray.Length); + } + using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) + { + using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) + { + responseData = reader.ReadToEnd(); + } + return responseData; + } + } + + public string HttpWebRequestGet(string url, string param) + { + param = param.IndexOf('?') > -1 ? (param) : ("?" + param); + + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + param); + Encoding encoding = Encoding.UTF8; + string responseData = String.Empty; + req.Method = "GET"; + using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) + { + using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) + { + responseData = reader.ReadToEnd(); + } + return responseData; + } + } + + /// + /// 实时保存采集的数据到XML文件,监控是否有读取计量点参数的命令 + /// + private void SaveXML_ReadPar() + { + while (true) + { + #region 保存实时采集数据 XML + string name = strDataPath + "SsData.xml"; + try + { + dsJLDataRealTime.WriteXml(name, XmlWriteMode.WriteSchema);//保存所有站场实时采集的计量数据集 + dsZhanDateTime.WriteXml(strDataPath + "dtTime.xml", XmlWriteMode.WriteSchema);//保存所有站场实时采集的时钟数据集 + string strTotalJson = "{"; + int ii = 0; + foreach (DataTable dtTemp in dsJLDataRealTime.Tables) //分站保存所有站场实时采集的计量数据集 + { + string strID = dtTemp.TableName; + dtTemp.WriteXml(strDataPath_JlData + dtTemp.TableName + ".xml", XmlWriteMode.WriteSchema); + try + { + string json = DataTableToJson(dtTemp, dsZhanDateTime.Tables[strID], strID); + strTotalJson += "\"" + dtTemp.TableName + "\":" + json + ","; + File.WriteAllText(strDataPath_JlData + "\\JSON\\" + dtTemp.TableName + ".json", json); + } + catch (Exception ex) + { + + } + //ii += 1; + //if (ii > 6) + //{ + // break; + //} + } + strTotalJson = strTotalJson.TrimEnd(',') + "}"; + //HttpWebRequestPost("Http://10.75.166.59:8081", strTotalJson); + File.WriteAllText(strDataPath_JlData + "\\JSON\\" + "Total.json", strTotalJson); + foreach (DataTable dtTemp in dsZhanDateTime.Tables)//分站保存所有站场实时采集的时钟数据集 + { + dtTemp.WriteXml(strDataPath_DataTime + dtTemp.TableName + ".xml", XmlWriteMode.WriteSchema); + } + if (blWriteParXMLFlag) //分站保存计量点参数数据集 + { + foreach (DataTable dtTemp in dsPparameter.Tables) + { + dtTemp.WriteXml(strParPath + dtTemp.TableName + ".xml", XmlWriteMode.WriteSchema); + } + blWriteParXMLFlag = false; + } + //Console.WriteLine("。。。。。保存实时数据,PLC时间,计量点参数到xml!"); + } + catch (SystemException err) + { + if (err.Message != null) + { + //strErr = "注意:" + DateTime.Now + "保存到实时数据到xml出错" + err.Message + err.StackTrace.Substring(err.StackTrace.LastIndexOf("行号") - 1) + "\r\n"; + } + } + #endregion + + #region 读取参数 + try + { + ; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + DataTable dtReadFlag = OracleLink.ExecuteDataTable(SQL_Strings.strReadParFlag + " and readparflag='1'", "JLXT", strErr); + if (dtReadFlag.Rows.Count > 0) + { + foreach (DataRow drFlag in dtReadFlag.Rows) + { + string strTempZCID = drFlag["STATION_NAME"].ToString(); + string strTempJLD_ID = drFlag["JLD_ID"].ToString(); + + DataRow[] drJldPar = dsJLDataRealTime.Tables[strTempZCID].Select("jld_id='" + strTempJLD_ID + "'"); + drJldPar[0]["readparflag"] = "1"; + + blWriteParXMLFlag = true; + string SQL = "update RV2_BASEINFO set readparflag='' where xh='" + drFlag["ID"] + "'"; + OracleLink.ExecuteNonQuery(SQL, "JLXT", strErr); + } + } + //启动或停止某个站的线程 + try + { + string strQuery = "select * from control"; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + string RestartFlag = ""; + DataTable ReadFlagTable = OracleLink.ExecuteDataTable(strQuery, "DTJK", ""); + RestartFlag = ReadFlagTable.Rows[0]["ThreadRestartFlag"].ToString(); + string zcid = ReadFlagTable.Rows[0]["Thread_ZCID"].ToString(); + if (RestartFlag == "1") + { + ThreadDictionary[zcid].Abort(); + dtJldList(zcid); + strQuery = "update control set ThreadRestartFlag='0',Thread_ZCID='' where id=1 "; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + OracleLink.ExecuteNonQuery(strQuery, "DTJK", strErr); + GetPLCDataStart(zcid); + } + } + catch + { + } + //同步PLC时间 + DataTable dtTBTime = OracleLink.ExecuteDataTable(SQL_Strings.strSQLZhan + " and TBTime='1'", "JLXT", strErr); + if (dtTBTime.Rows.Count > 0) + { + foreach (DataRow drFlag in dtTBTime.Rows) + { + string strTempZCID = drFlag["ID"].ToString(); + dsZhanDateTime.Tables[strTempZCID].Rows[0]["TongBuFlag"] = "同步"; + string SQL = "update 集输站场 set TBTime='' where ID='" + strTempZCID + "'"; + OracleLink.ExecuteNonQuery(SQL, "JLXT", strErr); + } + } + } + catch { } + #endregion + Thread.Sleep(1111); + } + } + /// + /// 启动各站数据采集线程 + /// + private void GetPLCDataStart() //启动各站数据采集线程 + { + //int ThreadNum = dtZhan.Rows.Count; + //GetDataThread[] arrayThread; + //GetPLCDataThread = new Thread[ThreadNum]; + //arrayThread = new GetDataThread[ThreadNum]; + try + { + + + int ThreadNum = dtZhan.Rows.Count; + GetDataThread[] arrayThread; + GetPLCDataThread = new Thread[ThreadNum]; + arrayThread = new GetDataThread[ThreadNum]; + for (int i = 0; i < ThreadNum; i++) + { + string ZCID = dtZhan.Rows[i]["ORG_ID"].ToString(); + if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) + { + //if (dtZhan.Rows[i]["PORT"].ToString() == "1512") + { + + + + //if (ZCID.Split('_').Length > 1) + { + try + { + stStation Station = new stStation(); + Station.ZCID = dtZhan.Rows[i]["ORG_ID"].ToString(); + Station.ZCName = dtZhan.Rows[i]["ORG_NAME"].ToString(); + Station.ip = dtZhan.Rows[i]["IP"].ToString(); + Station.port = Convert.ToInt32(dtZhan.Rows[i]["PORT"].ToString()); + Station.NetTYPE = dtZhan.Rows[i]["NETTYPE"].ToString(); + Station.MeterTYPE = dtZhan.Rows[i]["DEVICETYPE"].ToString(); + Station.readDiffTime = Convert.ToInt32(dtZhan.Rows[i]["READTIMESPAN"].ToString()); + arrayThread[i] = new GetDataThread(Station); + GetPLCDataThread[i] = new Thread(new ThreadStart(arrayThread[i].GetPLCData)); //string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); + + GetPLCDataThread[i].Start(); + ThreadDictionary.Add(Station.ZCID, GetPLCDataThread[i]); + } + catch (Exception ex) + { + continue; + } + } + } + // + } + + } + } + catch (Exception ex) + { + + + } + } + + /// + /// 启动GPRS数据采集线程 + /// + private void GetGPRSStart() //启动各站数据采集线程 + { + //int ThreadNum = dtZhan.Rows.Count; + //GetDataThread[] arrayThread; + //GetPLCDataThread = new Thread[ThreadNum]; + //arrayThread = new GetDataThread[ThreadNum]; + try + { + + + int ThreadNum = dtZhanGPRS.Rows.Count; + GETDataGPRS[] arrayThread; + GetPLCDataThread = new Thread[ThreadNum]; + arrayThread = new GETDataGPRS[ThreadNum]; + for (int i = 0; i < ThreadNum; i++) + { + string ZCID = dtZhanGPRS.Rows[i]["ORG_ID"].ToString(); + if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) + { + //if (dtZhanGPRS.Rows[i]["PORT"].ToString() == "8059") + { + //if (ZCID.Split('_').Length > 1) + { + try + { + stStation Station = new stStation(); + Station.ZCID = dtZhanGPRS.Rows[i]["ORG_ID"].ToString(); + Station.ZCName = dtZhanGPRS.Rows[i]["ORG_NAME"].ToString(); + Station.ip = dtZhanGPRS.Rows[i]["IP"].ToString(); + Station.port = Convert.ToInt32(dtZhanGPRS.Rows[i]["PORT"].ToString()); + Station.NetTYPE = dtZhanGPRS.Rows[i]["NETTYPE"].ToString(); + Station.MeterTYPE = dtZhanGPRS.Rows[i]["DEVICETYPE"].ToString(); + Station.readDiffTime = Convert.ToInt32(dtZhanGPRS.Rows[i]["READTIMESPAN"].ToString()); + arrayThread[i] = new GETDataGPRS(Station); + GetPLCDataThread[i] = new Thread(new ThreadStart(arrayThread[i].GetDataStart)); + //string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); + + GetPLCDataThread[i].Start(); + ThreadDictionary.Add(Station.ZCID, GetPLCDataThread[i]); + } + catch (Exception ex) + { + continue; + } + } + } + // + } + + } + } + catch (Exception ex) + { + + + } + } + + /// + /// 启动Net数据采集线程 + /// + private void GetNetStart() //启动各站数据采集线程 + { + //int ThreadNum = dtZhan.Rows.Count; + //GetDataThread[] arrayThread; + //GetPLCDataThread = new Thread[ThreadNum]; + //arrayThread = new GetDataThread[ThreadNum]; + try + { + + + int ThreadNum = dtZhanNet.Rows.Count; + GetDataNet[] arrayThread; + GetPLCDataThread = new Thread[ThreadNum]; + arrayThread = new GetDataNet[ThreadNum]; + for (int i = 0; i < ThreadNum; i++) + { + string ZCID = dtZhanNet.Rows[i]["ORG_ID"].ToString(); + if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) + { + //if (dtZhanNet.Rows[i]["ORG_ID"].ToString() == "6C1AB9BC-AFEC-48B5-AD7D-3932DE414641") + { + //if (ZCID.Split('_').Length > 1) + { + try + { + stStation Station = new stStation(); + Station.ZCID = dtZhanNet.Rows[i]["ORG_ID"].ToString(); + Station.ZCName = dtZhanNet.Rows[i]["ORG_NAME"].ToString(); + Station.ip = dtZhanNet.Rows[i]["IP"].ToString(); + Station.port = Convert.ToInt32(dtZhanNet.Rows[i]["PORT"].ToString()); + Station.NetTYPE = dtZhanNet.Rows[i]["NETTYPE"].ToString(); + Station.MeterTYPE = dtZhanNet.Rows[i]["DEVICETYPE"].ToString(); + Station.readDiffTime = Convert.ToInt32(dtZhanNet.Rows[i]["READTIMESPAN"].ToString()); + arrayThread[i] = new GetDataNet(Station); + GetPLCDataThread[i] = new Thread(new ThreadStart(arrayThread[i].GetPLCData)); //string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); + + GetPLCDataThread[i].Start(); + ThreadDictionary.Add(Station.ZCID, GetPLCDataThread[i]); + } + catch (Exception ex) + { + continue; + } + } + } + // + } + + } + } + catch (Exception ex) + { + + + } + } + + + private void GetPLCDataStart(string ZCID) //启动各站数据采集线程 + { + DataRow[] drZhan = dtZhan.Select("ID='" + ZCID + "'"); + if (dsJLDataRealTime.Tables[ZCID].Rows.Count > 0) + { + + try + { + stStation Station = new stStation(); + Station.ZCID = drZhan[0]["ID"].ToString(); + Station.ZCName = drZhan[0]["ZCMC"].ToString(); + Station.ip = drZhan[0]["IP"].ToString(); + Station.port = Convert.ToInt32(drZhan[0]["PORT"].ToString()); + Station.NetTYPE = drZhan[0]["NETTYPE"].ToString(); + Station.MeterTYPE = drZhan[0]["SBTYPE"].ToString(); + Station.readDiffTime = Convert.ToInt32(drZhan[0]["READTIMESPAN"].ToString()); + GetDataThread arrayThread = new GetDataThread(Station); + Thread ThreadZCID = new Thread(new ThreadStart(arrayThread.GetPLCData)); + ThreadZCID.Start(); + ThreadDictionary[ZCID] = ThreadZCID; + strAppend("重启" + Station.ZCName + "采集成功"); + + } + catch (Exception ex) + { } + } + + + } + + /// + /// 初始化系统所需要的DataSet 和DataTable 结构和数据 + /// + protected void InitialTalbe() //初始化实时数据表格过程,以便添加计量点后重新构建实时数据表格 + { + strAppend(DateTime.Now.ToString() + "------开始初始化相关表格!"); + + try + { + + DataTable dtDateTime = new DataTable(); + dtDateTime.Columns.Add("ZCID", typeof(string)); + dtDateTime.Columns.Add("ZCNAME", typeof(string)); + dtDateTime.Columns.Add("PLCTime", typeof(string)); + dtDateTime.Columns.Add("TongBuTime", typeof(string)); + dtDateTime.Columns.Add("TongBuFlag", typeof(string)); + + DataTable parTable = new DataTable(); + parTable.Columns.Add("CH4", typeof(string)); + parTable.Columns.Add("N2", typeof(string)); + parTable.Columns.Add("CO2", typeof(string)); + parTable.Columns.Add("C2H6", typeof(string)); + parTable.Columns.Add("C3H8", typeof(string)); + parTable.Columns.Add("H2O", typeof(string)); + parTable.Columns.Add("H2S", typeof(string)); + parTable.Columns.Add("H2", typeof(string)); + parTable.Columns.Add("CO ", typeof(string)); + parTable.Columns.Add("O2", typeof(string)); + parTable.Columns.Add("i-C4H10", typeof(string)); + parTable.Columns.Add("n-C4H10", typeof(string)); + parTable.Columns.Add("i-C5H12", typeof(string)); + parTable.Columns.Add("n-C5H12", typeof(string)); + parTable.Columns.Add("n-C6H14", typeof(string)); + parTable.Columns.Add("n-C7H16", typeof(string)); + parTable.Columns.Add("n-C8H18", typeof(string)); + parTable.Columns.Add("n-C9H20", typeof(string)); + parTable.Columns.Add("n-C10H22", typeof(string)); + parTable.Columns.Add("He", typeof(string)); + parTable.Columns.Add("Ar", typeof(string)); + parTable.Columns.Add("bak", typeof(string)); + parTable.Columns.Add("GJ", typeof(string)); + parTable.Columns.Add("KJ", typeof(string)); + parTable.Columns.Add("Gr", typeof(string)); + parTable.Columns.Add("DLND", typeof(string)); + parTable.Columns.Add("DSZS", typeof(string)); + parTable.Columns.Add("BAK1", typeof(string)); + parTable.Columns.Add("BAK2", typeof(string)); + parTable.Columns.Add("BAK3", typeof(string)); + parTable.Columns.Add("Station_ID", typeof(string)); + parTable.Columns.Add("ID", typeof(string)); + parTable.Columns.Add("JLD_ID", typeof(string)); + parTable.Columns.Add("ReadTime", typeof(string)); + parTable.Columns.Add("JLD_NAME", typeof(string)); + parTable.Columns.Add("CLXX", typeof(string)); + parTable.Columns.Add("CLSX", typeof(string)); + + + dtZhan.Clear(); + dsJLDataRealTime.Tables.Clear(); + + #region 初始化站场表格,获取所有自动计量站场 + strAppend(DateTime.Now.ToString() + "------查询数据库获取所有站场资料!"); + + try + { + + + dtZhan = new DataTable(); + dtZhan = OracleLink.ExecuteDataTable(SQL_Strings.strSQLZhan, "JLXT", strErr); + } + catch (Exception ex) + { + string strFileName = strDataPath + "dtZhan.xml"; + dtZhan.ReadXml(strFileName); + } + + dtZhan.TableName = "集输站场"; + DataTable dtStationNew = dtZhan.Copy(); + + for (int i = 0; i < dtZhan.Rows.Count; i++) + { + + //柳屯配气站两台PLC 区分 + + string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); + string[] tempPORT = dtZhan.Rows[i]["PORT"].ToString().Split(','); + + if (tempIp.Length > 1) + { + DataRow drTemp = dtStationNew.NewRow(); + drTemp.ItemArray = dtZhan.Rows[i].ItemArray; + dtStationNew.Rows[i]["org_id"] = dtZhan.Rows[i]["org_id"].ToString() + "_0"; + dtStationNew.Rows[i]["org_name"] = dtZhan.Rows[i]["org_name"].ToString() + "_0"; + dtStationNew.Rows[i]["IP"] = tempIp[0]; + dtStationNew.Rows[i]["PORT"] = tempPORT[0]; + for (int j = 1; j < tempIp.Length; j++) + { + drTemp["org_id"] = dtZhan.Rows[i]["org_id"].ToString() + "_" + j.ToString(); + drTemp["org_name"] = dtZhan.Rows[i]["org_name"].ToString() + "_" + j.ToString(); + drTemp["IP"] = tempIp[j]; + drTemp["PORT"] = tempPORT[j]; + dtStationNew.Rows.Add(drTemp); + } + } + } + + + + DataView dv = dtStationNew.DefaultView; + + dv.RowFilter = "NETTYPE='0'"; + dtZhanNet = dv.ToTable(); + + dv.RowFilter = "NETTYPE='1'"; + dtZhanGPRS = dv.ToTable(); + + strAppend(DateTime.Now.ToString() + "------站场资料获取成功!"); + #endregion + #region 初始化站场计量点结构Dataset + + DataTable dtDataRealTime = new DataTable(); + + //ID,JLD_NAME,WD,YL,CY,SSL,JRL,ZRL,LJL,BYL,SYL,ZRSJ,JRSJ,YBZT,RTIME,JLD_ID,STATION_ID,STATION_NAME,DEPT_ID + + dtDataRealTime.Columns.Add("ID", typeof(string)); + dtDataRealTime.Columns.Add("RTIME", typeof(string)); + dtDataRealTime.Columns.Add("JLD_NAME", typeof(string)); + dtDataRealTime.Columns.Add("WD", typeof(string)); + dtDataRealTime.Columns.Add("YL", typeof(string)); + dtDataRealTime.Columns.Add("CY", typeof(string)); + dtDataRealTime.Columns.Add("SSL", typeof(string)); + dtDataRealTime.Columns.Add("JRL", typeof(string)); + dtDataRealTime.Columns.Add("ZRL", typeof(string)); + dtDataRealTime.Columns.Add("LJL", typeof(string)); + dtDataRealTime.Columns.Add("BYL", typeof(string)); + dtDataRealTime.Columns.Add("SYL", typeof(string)); + dtDataRealTime.Columns.Add("JRSJ", typeof(string)); + dtDataRealTime.Columns.Add("ZRSJ", typeof(string)); + dtDataRealTime.Columns.Add("YBZT", typeof(string)); + dtDataRealTime.Columns.Add("SSGKLL", typeof(string)); + dtDataRealTime.Columns.Add("JLD_ID", typeof(string)); + dtDataRealTime.Columns.Add("STATION_ID", typeof(string)); + dtDataRealTime.Columns.Add("STATION_NAME", typeof(string)); + dtDataRealTime.Columns.Add("DEPT_ID", typeof(string)); + dtDataRealTime.Columns.Add("MeterTYPE", typeof(string)); + dtDataRealTime.Columns.Add("readparflag", typeof(string)); + dtDataRealTime.Columns.Add("TongBuFlag", typeof(string)); + dtDataRealTime.Columns.Add("CXFlag", typeof(string)); + dtDataRealTime.Columns.Add("LinkStatu", typeof(string)); //计量点连接情况,对于流量积算仪的模式 如果没装表读不上来数可以设置 + + // 初始化站场计量点表格 + + strAppend(DateTime.Now.ToString() + "------初始化站场计量点表格和计量点参数"); + + for (int i = 0; i < dtStationNew.Rows.Count; i++) + { + DataTable dtPar = new DataTable(); + DataTable dtJLD = new DataTable(); + dtJLD = dtJldList(dtStationNew.Rows[i]["ORG_ID"].ToString(), dtStationNew.Rows[i]["PARENT_ORG_ID"].ToString(), dtDataRealTime, parTable, out dtPar); + dsPparameter.Tables.Add(dtPar); + dsJLDataRealTime.Tables.Add(dtJLD); + + + //初始化站场时间表格结构和数据 + DataTable dtTimeTemp = dtDateTime.Clone(); + dtTimeTemp.TableName = dtStationNew.Rows[i]["ORG_ID"].ToString(); + DataRow drTime = dtTimeTemp.NewRow(); + drTime["ZCID"] = dtStationNew.Rows[i]["ORG_ID"]; + drTime["ZCNAME"] = dtStationNew.Rows[i]["ORG_NAME"]; + dtTimeTemp.Rows.Add(drTime); + dsZhanDateTime.Tables.Add(dtTimeTemp); + } + strAppend(DateTime.Now.ToString() + "------站场参数、计量点、时间结构和数据表格初始化完成!"); + + #endregion + #region 初始化输差表格 + strAppend(DateTime.Now.ToString() + "------初始化输差表格 开始!"); + blWriteParXMLFlag = true; + dtScRealTime.Columns.Add("SCID", typeof(string)); + dtScRealTime.Columns.Add("RTIME", typeof(string)); + dtScRealTime.Columns.Add("SCNAME", typeof(string)); + dtScRealTime.Columns.Add("SCTYPE", typeof(string)); + + dtScRealTime.Columns.Add("IN_P", typeof(string)); + dtScRealTime.Columns.Add("OUT_P", typeof(string)); + dtScRealTime.Columns.Add("SsInTotal", typeof(string)); + dtScRealTime.Columns.Add("SsOutTotal", typeof(string)); + dtScRealTime.Columns.Add("SsSc", typeof(string)); + dtScRealTime.Columns.Add("SsPer", typeof(string)); + + dtScRealTime.Columns.Add("JrInTotal", typeof(string)); + dtScRealTime.Columns.Add("JrOutTotal", typeof(string)); + dtScRealTime.Columns.Add("JrSc", typeof(string)); + dtScRealTime.Columns.Add("JrPer", typeof(string)); + + dtScRealTime.Columns.Add("ZrInTotal", typeof(string)); + dtScRealTime.Columns.Add("ZrOutTotal", typeof(string)); + dtScRealTime.Columns.Add("ZrSc", typeof(string)); + dtScRealTime.Columns.Add("ZrPer", typeof(string)); + + dtScRealTime.Columns.Add("IN_JLD_ID", typeof(string)); + dtScRealTime.Columns.Add("OUT_JLD_ID", typeof(string)); + dtScRealTime.Columns.Add("DEPT_ID", typeof(string)); + dtScRealTime.Columns.Add("STATION_ID", typeof(string)); + dtScRealTime.Columns.Add("RE_DEPT_ID", typeof(string)); + dtScRealTime.TableName = "SsSC"; + + strSQL = SQL_Strings.strSQLScConfig + " order by ID"; + DataTable dtScConfig = new DataTable(); + dtScConfig = OracleLink.ExecuteDataTable(strSQL, "JLXT", strErr); + if (dtScConfig.Rows.Count > 0) + { + foreach (DataRow dr1 in dtScConfig.Rows) + { + DataRow drJld = dtScRealTime.NewRow(); + drJld["SCID"] = dr1["ID"]; + drJld["SCNAME"] = dr1["TRANS_NAME"]; + drJld["IN_JLD_ID"] = dr1["IN_POINTS"]; + drJld["OUT_JLD_ID"] = dr1["OUT_POINTS"]; + drJld["DEPT_ID"] = dr1["DEPT_ID"]; + drJld["STATION_ID"] = dr1["STATION_ID"]; + drJld["SCTYPE"] = dr1["TRANS_TYPE"]; + drJld["RE_DEPT_ID"] = dr1["RE_DEPT_ID"]; + dtScRealTime.Rows.Add(drJld); + } + } + + + File.Delete(strConfigPath + "dsJlDataRealTime.xml"); + File.Delete(strConfigPath + "dsPparameter.xml"); + File.Delete(strConfigPath + "dsZhanDateTime.xml"); + + dsJLDataRealTime.WriteXml(strConfigPath + "dsJlDataRealTime.xml", XmlWriteMode.WriteSchema);//暂存数据结构表 + dsPparameter.WriteXml(strConfigPath + "dsPparameter.xml", XmlWriteMode.WriteSchema);//暂存数据结构表 + dsZhanDateTime.WriteXml(strConfigPath + "dsZhanDateTime.xml", XmlWriteMode.WriteSchema);//暂存数据结构表 + } + catch (Exception ex) + { } + strAppend(DateTime.Now.ToString() + "------初始化完成!"); + #endregion + } + /// + /// 获取某个站场的计量点结构 和参数表结构 + /// + /// 传递站场ID + /// 传递单位ID + /// 计量点表结构 + /// 参数表结构 + /// 返回参数表结构 + /// 返回计量点表结构 + private DataTable dtJldList(string ZCID, string Dept_ID, DataTable dtDataRealTime, DataTable parTable, out DataTable dtParList) + { + + DataTable dtTempStation = new DataTable(); + DataTable dtJLD = new DataTable(); + string strSTATION_Name = ""; + string[] tempZCID = ZCID.Split('_'); + strSQL = SQL_Strings.strSQLJld + tempZCID[0] + "' and plc='1' order by jld_id"; + dtTempStation = OracleLink.ExecuteDataTable("select * from SYS_ORGANISE where ORG_ID='" + tempZCID[0] + "'", "JLXT", ""); + string[] tempIp = dtTempStation.Rows[0]["IP"].ToString().Split(','); + strSTATION_Name = dtTempStation.Rows[0]["ORG_NAME"].ToString();// OracleLink.getStationName(ZCID); + try + { + if (tempZCID.Length > 1) + { + dtJLD = OracleLink.ExecuteDataTable(SQL_Strings.strSQLJld + tempZCID[0] + "' and plc='1' and device_id='" + tempZCID[1] + "' order by jld_id", "JLXT", strErr); + } + else + { + dtJLD = OracleLink.ExecuteDataTable(strSQL, "JLXT", strErr); + } + } + catch (Exception ex) + { + } + if (dtJLD.Rows.Count > 0) + { + DataTable dtTemp = dtDataRealTime.Clone(); + DataTable dtPar = parTable.Clone(); + foreach (DataRow dr1 in dtJLD.Rows) + { + // 初始化站场计量点表格结构和数据 + DataRow drJld = dtTemp.NewRow(); + drJld["ID"] = dr1["ID"]; + drJld["JLD_NAME"] = dr1["Jld_name"]; + drJld["JLD_ID"] = dr1["JLD_ID"]; + drJld["MeterTYPE"] = dr1["FLOWMETER_TYPE"]; + drJld["STATION_ID"] = dr1["STATION_NAME"]; + drJld["STATION_NAME"] = strSTATION_Name; + drJld["readparflag"] = "1"; + drJld["DEPT_ID"] = Dept_ID; + dtTemp.Rows.Add(drJld); + + // 初始化站场参数表格结构和数据 + DataRow drPar = dtPar.NewRow(); + drPar["ID"] = dr1["ID"]; + drPar["JLD_ID"] = dr1["JLD_ID"]; + drPar["Station_ID"] = dr1["STATION_NAME"]; + drPar["JLD_NAME"] = dr1["Jld_name"]; + try + { + string strTempSQL = "select clsbmc,ccbh,clfw from 测量设备台帐 where sycfdd='" + dr1["AZDD"].ToString() + "' and ZT='在用' and clsbmc like'%流量计%'"; + DataTable dtTempCLSB = OracleLink.ExecuteDataTable(strTempSQL, "JLXT", strErr); + if (dtTempCLSB.Rows.Count > 0) + { + string[] strCLFW = dtTempCLSB.Rows[0]["CLFW"].ToString().Split('~'); + drPar["CLXX"] = strCLFW[0].Substring(1, strCLFW[0].Length - 1); + drPar["CLSX"] = strCLFW[1].Substring(0, strCLFW[1].IndexOf(')')); + } + } + catch { } + dtPar.Rows.Add(drPar); + } + dtTemp.TableName = ZCID; + dtPar.TableName = ZCID; + dtParList = dtPar.Copy(); + return dtTemp; + } + else + { + DataTable dtTemp = dtDataRealTime.Clone(); + DataTable dtPar = parTable.Clone(); + dtTemp.TableName = ZCID; + dtPar.TableName = ZCID; + dtParList = dtPar.Copy(); + return dtTemp; + } + } + private DataTable dtJldList(string ZCID) + { + + dsJLDataRealTime.Tables[ZCID].Clear(); + dsPparameter.Tables[ZCID].Clear(); + + string strTempFileName = @"D:\GetPLCData\Data\Config\"; + DataSet dsJldTemp = new DataSet(); + dsJldTemp.ReadXml(strTempFileName + "dsJlDataRealTime.xml");//暂存数据结构表 + DataSet dsParTemp = new DataSet(); + dsParTemp.ReadXml(strTempFileName + "dsPparameter.xml");//暂存数据结构表 + + + foreach (DataRow dr1 in dsJldTemp.Tables[ZCID].Rows) + { + // 初始化站场计量点表格结构和数据 + DataRow drJld = dsJLDataRealTime.Tables[ZCID].NewRow(); + drJld["ID"] = dr1["ID"]; + drJld["JLD_NAME"] = dr1["Jld_name"]; + drJld["JLD_ID"] = dr1["JLD_ID"]; + drJld["MeterTYPE"] = dr1["FLOWMETER_TYPE"]; + drJld["STATION_ID"] = dr1["STATION_ID"]; + drJld["STATION_NAME"] = dr1["STATION_NAME"]; + drJld["readparflag"] = dr1["readparflag"]; + drJld["DEPT_ID"] = dr1["DEPT_ID"]; + + dsJLDataRealTime.Tables[ZCID].Rows.Add(drJld); + + // 初始化站场参数表格结构和数据 + DataRow drPar = dsPparameter.Tables[ZCID].NewRow(); + drPar["ID"] = dr1["ID"]; + drPar["JLD_ID"] = dr1["JLD_ID"]; + drPar["Station_ID"] = dr1["ZCID"]; + drPar["JLD_NAME"] = dr1["Jld_name"]; + drPar["CLFW"] = dr1["CLFW"]; + drPar["CLXX"] = dr1["CLXX"]; + drPar["CLSX"] = dr1["CLSX"]; + + dsPparameter.Tables[ZCID].Rows.Add(drPar); + } + return null; + + } + /// + /// 控制台输出运行信息,并写入日志文件 + /// + /// + public static void strAppend(string strMessage) + { + + string strFilePath = strLogPath; + try + { + Console.WriteLine(strMessage); + using (StreamWriter sw = File.AppendText(strFilePath)) + { + sw.WriteLine(strMessage); + sw.Flush(); + sw.Close(); + } + } + catch (Exception) + { + } + } + /// + /// 控制台输出运行信息,并写入日志文件 + /// + /// + public static void strAppend(string strMessage, string ZCMC) + { + + string strFilePath = strLogPath_Data + ZCMC + ".txt"; + try + { + Console.WriteLine(strMessage); + using (StreamWriter sw = File.AppendText(strFilePath)) + { + sw.WriteLine(strMessage); + sw.Flush(); + sw.Close(); + } + } + catch (Exception) + { + } + } + + + protected bool isNumberic(string message) + { + System.Text.RegularExpressions.Regex rex = + new System.Text.RegularExpressions.Regex(@"^(-)?[1-9][0-9]*$"); + if (rex.IsMatch(message)) + { + return true; + } + else + return false; + } + /// + /// 把DataTable数据转换为Json格式 + /// + /// 传入DataTable数据 + /// + public string DataTableToJson(DataTable dt, DataTable dtTime, string strStationID) + { + try + { + + + string[] stationid = strStationID.Split('_'); + string strDept_ID = ""; + string strStationName = ""; + string strDeptName = ""; + if (stationid.Length > 1) + { + strStationName = OracleLink.getStationName(stationid[0], ref strDept_ID) + stationid[1]; + strDeptName = OracleLink.getStationName(strDept_ID); + } + else + { + strStationName = OracleLink.getStationName(stationid[0], ref strDept_ID); + strDeptName = OracleLink.getStationName(strDept_ID); + } + StringBuilder jsonBuilder = new StringBuilder(); + jsonBuilder.Append("{\"total\""); + jsonBuilder.Append(":"); + jsonBuilder.Append(dt.Rows.Count); + jsonBuilder.Append(",\"Dept_ID\""); + jsonBuilder.Append(":\""); + jsonBuilder.Append(strDept_ID); + jsonBuilder.Append("\",\"Dept_Name\""); + jsonBuilder.Append(":\""); + jsonBuilder.Append(strDeptName); + jsonBuilder.Append("\",\"Station_ID\""); + jsonBuilder.Append(":\""); + jsonBuilder.Append(strStationID); + jsonBuilder.Append("\",\"Station_Name\""); + jsonBuilder.Append(":\""); + jsonBuilder.Append(strStationName); + jsonBuilder.Append("\",\"Time\""); + jsonBuilder.Append(":\""); + jsonBuilder.Append(dtTime.Rows[0]["PLCTime"]); + jsonBuilder.Append("\",\"rows"); + jsonBuilder.Append("\":["); + for (int i = 0; i < dt.Rows.Count; i++) + { + jsonBuilder.Append("{"); + for (int j = 0; j < dt.Columns.Count; j++) + { + jsonBuilder.Append("\""); + jsonBuilder.Append(dt.Columns[j].ColumnName); + jsonBuilder.Append("\":\""); + if (dt.Columns[j].ColumnName == "RQ") + { + jsonBuilder.Append(dt.Rows[i][j].ToString().Split(' ')[0]); + } + else + { + jsonBuilder.Append(dt.Rows[i][j].ToString()); + } + + + jsonBuilder.Append("\","); + } + jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + jsonBuilder.Append("},"); + } + if (dt.Rows.Count > 0) + { + jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + } + jsonBuilder.Append("],"); + jsonBuilder.Append("\"title"); + //jsonBuilder.Append(dt.TableName); + jsonBuilder.Append("\":["); + //这是循环获取列名称 + for (int n = 0; n < dt.Columns.Count; n++) + { + jsonBuilder.Append("{"); + jsonBuilder.Append("\"field"); + jsonBuilder.Append("\":\""); + jsonBuilder.Append(dt.Columns[n].ColumnName); + jsonBuilder.Append("\","); + jsonBuilder.Append("\"title"); + jsonBuilder.Append("\":\""); + jsonBuilder.Append(getStrColumnName(dt.Columns[n].ColumnName)); + jsonBuilder.Append("\""); + jsonBuilder.Append("},"); + } + jsonBuilder.Remove(jsonBuilder.Length - 1, 1); + jsonBuilder.Append("},"); + + jsonBuilder.Remove(jsonBuilder.Length - 2, 2); + jsonBuilder.Append("]"); + jsonBuilder.Append("}"); + return jsonBuilder.ToString(); + + } + catch (Exception ex) + { + + return "错误"; + } + + } + + private string getStrColumnName(string strName) + { + string temp = ""; + switch (strName) + { + case "YL": + temp = "压力(MPa)"; + //temp = "压力(MPa)"; + break; + case "CY": + temp = "压力(kPa)"; + break; + case "WD": + temp = "温度(℃)"; + break; + case "SSL": + temp = "瞬时流量(Nm³/d)"; + break; + case "JRL": + temp = "今日流量(Nm³)"; + break; + case "ZRL": + temp = "昨日流量(Nm³)"; + break; + case "JLD_NAME": + temp = "计量点名称"; + break; + case "JRSJ": + temp = "今日时间(分钟)"; + break; + case "ZRSJ": + temp = "昨日时间(分钟)"; + break; + case "YBZT": + temp = "仪表状态"; + break; + case "SSGKLL": + temp = "瞬时工况流量"; + break; + case "JLD_ID": + temp = "站内ID"; + break; + + + } + + return temp; + } + + } +} diff --git a/ConsoleGetPLCData/Properties/AssemblyInfo.cs b/ConsoleGetPLCData/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..3d6afbf --- /dev/null +++ b/ConsoleGetPLCData/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("ConsoleGetPLCData")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("ConsoleGetPLCData")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("5f2100e3-472a-4a38-becc-5a4631636f82")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.exe b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.exe new file mode 100644 index 0000000..58ad63b Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.exe differ diff --git a/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.exe.config b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.exe.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.pdb b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.pdb new file mode 100644 index 0000000..d77f5d3 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.pdb differ diff --git a/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.vshost.exe.config b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.vshost.exe.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.vshost.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.vshost.exe.manifest b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.vshost.exe.manifest new file mode 100644 index 0000000..061c9ca --- /dev/null +++ b/ConsoleGetPLCData/bin/Debug/ConsoleGetPLCData.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ConsoleGetPLCData/bin/Debug/Data/RealTime/Log/2015-3-26_log.txt b/ConsoleGetPLCData/bin/Debug/Data/RealTime/Log/2015-3-26_log.txt new file mode 100644 index 0000000..7c2e628 --- /dev/null +++ b/ConsoleGetPLCData/bin/Debug/Data/RealTime/Log/2015-3-26_log.txt @@ -0,0 +1,53 @@ +2015/3/26 21:19:55------启动实时采集程序! +2015/3/26 21:19:55------开始初始化相关表格! +2015/3/26 21:19:55------查询数据库获取所有站场资料! +2015/3/26 21:19:56------站场资料获取成功! +2015/3/26 21:19:56------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:19:56------初始化完成! +2015/3/26 21:20:06------启动实时采集程序! +2015/3/26 21:20:06------开始初始化相关表格! +2015/3/26 21:20:06------查询数据库获取所有站场资料! +2015/3/26 21:20:06------站场资料获取成功! +2015/3/26 21:20:06------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:20:06------初始化完成! +2015/3/26 21:21:08------启动实时采集程序! +2015/3/26 21:21:08------开始初始化相关表格! +2015/3/26 21:21:08------查询数据库获取所有站场资料! +2015/3/26 21:21:08------站场资料获取成功! +2015/3/26 21:21:08------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:21:08------初始化完成! +2015/3/26 21:22:14------启动实时采集程序! +2015/3/26 21:22:14------开始初始化相关表格! +2015/3/26 21:22:14------查询数据库获取所有站场资料! +2015/3/26 21:22:18------站场资料获取成功! +2015/3/26 21:22:18------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:22:18------初始化完成! +2015/3/26 21:23:01------启动实时采集程序! +2015/3/26 21:23:01------开始初始化相关表格! +2015/3/26 21:23:01------查询数据库获取所有站场资料! +2015/3/26 21:23:01------站场资料获取成功! +2015/3/26 21:23:09------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:24:16------启动实时采集程序! +2015/3/26 21:24:16------开始初始化相关表格! +2015/3/26 21:24:16------查询数据库获取所有站场资料! +2015/3/26 21:24:17------站场资料获取成功! +2015/3/26 21:24:20------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:24:25------站场参数、计量点、时间结构和数据表格初始化完成! +2015/3/26 21:24:25------初始化输差表格 开始! +2015/3/26 21:24:25------初始化完成! +2015/3/26 21:26:16------启动实时采集程序! +2015/3/26 21:26:16------开始初始化相关表格! +2015/3/26 21:26:16------查询数据库获取所有站场资料! +2015/3/26 21:26:16------站场资料获取成功! +2015/3/26 21:26:16------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:26:17------站场参数、计量点、时间结构和数据表格初始化完成! +2015/3/26 21:26:17------初始化输差表格 开始! +2015/3/26 21:26:17------初始化完成! +2015/3/26 21:55:02------启动实时采集程序! +2015/3/26 21:55:02------开始初始化相关表格! +2015/3/26 21:55:02------查询数据库获取所有站场资料! +2015/3/26 21:55:02------站场资料获取成功! +2015/3/26 21:55:02------初始化局域网站场计量点表格和计量点参数 +2015/3/26 21:55:03------站场参数、计量点、时间结构和数据表格初始化完成! +2015/3/26 21:55:03------初始化输差表格 开始! +2015/3/26 21:55:03------初始化完成! diff --git a/ConsoleGetPLCData/bin/Debug/FTD2XX.dll b/ConsoleGetPLCData/bin/Debug/FTD2XX.dll new file mode 100644 index 0000000..8067698 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/FTD2XX.dll differ diff --git a/ConsoleGetPLCData/bin/Debug/FtdAdapter.dll b/ConsoleGetPLCData/bin/Debug/FtdAdapter.dll new file mode 100644 index 0000000..8d2c836 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/FtdAdapter.dll differ diff --git a/ConsoleGetPLCData/bin/Debug/GetData_PLC.exe b/ConsoleGetPLCData/bin/Debug/GetData_PLC.exe new file mode 100644 index 0000000..1e6e3b8 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/GetData_PLC.exe differ diff --git a/ConsoleGetPLCData/bin/Debug/GetData_PLC.pdb b/ConsoleGetPLCData/bin/Debug/GetData_PLC.pdb new file mode 100644 index 0000000..c6cc1d8 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/GetData_PLC.pdb differ diff --git a/ConsoleGetPLCData/bin/Debug/HttpServer.dll b/ConsoleGetPLCData/bin/Debug/HttpServer.dll new file mode 100644 index 0000000..77b802e Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/HttpServer.dll differ diff --git a/ConsoleGetPLCData/bin/Debug/Modbus.dll b/ConsoleGetPLCData/bin/Debug/Modbus.dll new file mode 100644 index 0000000..4dca3a7 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/Modbus.dll differ diff --git a/ConsoleGetPLCData/bin/Debug/Unme.Common.dll b/ConsoleGetPLCData/bin/Debug/Unme.Common.dll new file mode 100644 index 0000000..f530d6e Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/Unme.Common.dll differ diff --git a/ConsoleGetPLCData/bin/Debug/log4net.dll b/ConsoleGetPLCData/bin/Debug/log4net.dll new file mode 100644 index 0000000..ffc57e1 Binary files /dev/null and b/ConsoleGetPLCData/bin/Debug/log4net.dll differ diff --git a/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.csproj.FileListAbsolute.txt b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..0008644 --- /dev/null +++ b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.csproj.FileListAbsolute.txt @@ -0,0 +1,24 @@ +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\bin\Debug\ConsoleGetPLCData.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\bin\Debug\ConsoleGetPLCData.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\bin\Debug\ConsoleGetPLCData.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\bin\Debug\GetData_PLC.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\bin\Debug\GetData_PLC.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\bin\Debug\Unme.Common.dll +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.csprojResolveAssemblyReference.cache +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.pdb +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.csprojResolveAssemblyReference.cache +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.exe +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.pdb +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.csprojResolveAssemblyReference.cache +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.exe +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.pdb +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.exe +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.pdb +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.csprojResolveAssemblyReference.cache +D:\GetPLCData\ConsoleGetPLCData.exe.config +D:\GetPLCData\ConsoleGetPLCData.exe +D:\GetPLCData\ConsoleGetPLCData.pdb +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.csprojResolveAssemblyReference.cache +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.exe +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\ConsoleGetPLCData\obj\Debug\ConsoleGetPLCData.pdb diff --git a/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.csprojResolveAssemblyReference.cache b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..552e344 Binary files /dev/null and b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.csprojResolveAssemblyReference.cache differ diff --git a/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.exe b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.exe new file mode 100644 index 0000000..bb3609f Binary files /dev/null and b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.exe differ diff --git a/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.pdb b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.pdb new file mode 100644 index 0000000..c892c5a Binary files /dev/null and b/ConsoleGetPLCData/obj/Debug/ConsoleGetPLCData.pdb differ diff --git a/ConsoleGetPLCData/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/ConsoleGetPLCData/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..2561e97 Binary files /dev/null and b/ConsoleGetPLCData/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/ConsoleGetPLCData/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/ConsoleGetPLCData/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..460a24c Binary files /dev/null and b/ConsoleGetPLCData/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/ConsoleGetPLCData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/ConsoleGetPLCData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/ConsoleGetPLCData/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/ConsoleGetPLCData/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/ConsoleGetPLCData/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/ConsoleGetPLCData/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/GetData_PLC.sln b/GetData_PLC.sln new file mode 100644 index 0000000..b37fffc --- /dev/null +++ b/GetData_PLC.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GetData_PLC", "GetData_PLC\GetData_PLC.csproj", "{3412CC68-9C7E-4F3E-A9DB-285EFD5F55DB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleGetPLCData", "ConsoleGetPLCData\ConsoleGetPLCData.csproj", "{A2378DFD-D382-44FB-B280-61224B8E0ACA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UpdateMeter", "UpdateMeter\UpdateMeter.csproj", "{07D0B046-C0AD-49E9-BDA6-C6BB0252F26A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3412CC68-9C7E-4F3E-A9DB-285EFD5F55DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3412CC68-9C7E-4F3E-A9DB-285EFD5F55DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3412CC68-9C7E-4F3E-A9DB-285EFD5F55DB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3412CC68-9C7E-4F3E-A9DB-285EFD5F55DB}.Release|Any CPU.Build.0 = Release|Any CPU + {A2378DFD-D382-44FB-B280-61224B8E0ACA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2378DFD-D382-44FB-B280-61224B8E0ACA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2378DFD-D382-44FB-B280-61224B8E0ACA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2378DFD-D382-44FB-B280-61224B8E0ACA}.Release|Any CPU.Build.0 = Release|Any CPU + {07D0B046-C0AD-49E9-BDA6-C6BB0252F26A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07D0B046-C0AD-49E9-BDA6-C6BB0252F26A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07D0B046-C0AD-49E9-BDA6-C6BB0252F26A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07D0B046-C0AD-49E9-BDA6-C6BB0252F26A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/GetData_PLC.v11.suo b/GetData_PLC.v11.suo new file mode 100644 index 0000000..25a87da Binary files /dev/null and b/GetData_PLC.v11.suo differ diff --git a/GetData_PLC.v12.suo b/GetData_PLC.v12.suo new file mode 100644 index 0000000..cb16b03 Binary files /dev/null and b/GetData_PLC.v12.suo differ diff --git a/GetData_PLC/App.config b/GetData_PLC/App.config new file mode 100644 index 0000000..723be24 --- /dev/null +++ b/GetData_PLC/App.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/GetData_PLC/DataToByte.cs b/GetData_PLC/DataToByte.cs new file mode 100644 index 0000000..70b46c7 --- /dev/null +++ b/GetData_PLC/DataToByte.cs @@ -0,0 +1,218 @@ +using System; +using System.Collections.Generic; +using System.IO.Compression; +using System.Text; +using System.Data; +using System.IO; +using System.Runtime.Serialization; +using System.Runtime.Serialization.Formatters.Binary; +using System.Xml; + +namespace GetData_PLC +{ + class DataToByte + { + public DataToByte() { } + + public static int TranNetDataByte() + { + + try + { + + + + + return 1; + } + catch (Exception ex) + { + + return 0; + } + } + + /// + /// 将DataSet格式化成字节数组byte[] + /// + /// DataSet对象 + /// 字节数组 + public static byte[] GetBinaryFormatData(DataSet dsOriginal) + { + byte[] binaryDataResult = null; + MemoryStream memStream = new MemoryStream(); + IFormatter brFormatter = new BinaryFormatter(); + dsOriginal.RemotingFormat = SerializationFormat.Binary; + brFormatter.Serialize(memStream, dsOriginal); + binaryDataResult = memStream.ToArray(); + memStream.Close(); + memStream.Dispose(); + return binaryDataResult; + } + + /// + /// 将DataSet格式化成字节数组byte[],并且已经经过压缩 + /// + /// DataSet对象 + /// 字节数组 + public static byte[] GetBinaryFormatDataCompress(DataSet dsOriginal) + { + byte[] binaryDataResult = null; + MemoryStream memStream = new MemoryStream(); + IFormatter brFormatter = new BinaryFormatter(); + dsOriginal.RemotingFormat = SerializationFormat.Binary; + brFormatter.Serialize(memStream, dsOriginal); + binaryDataResult = memStream.ToArray(); + memStream.Close(); + memStream.Dispose(); + return Compress(binaryDataResult); + } + + /// + /// 解压数据 + /// + /// + /// + public static byte[] Decompress(byte[] data) + { + byte[] bData; + MemoryStream ms = new MemoryStream(); + ms.Write(data, 0, data.Length); + ms.Position = 0; + GZipStream stream = new GZipStream(ms, CompressionMode.Decompress, true); + byte[] buffer = new byte[1024]; + MemoryStream temp = new MemoryStream(); + int read = stream.Read(buffer, 0, buffer.Length); + while (read > 0) + { + temp.Write(buffer, 0, read); + read = stream.Read(buffer, 0, buffer.Length); + } + //必须把stream流关闭才能返回ms流数据,不然数据会不完整 + stream.Close(); + stream.Dispose(); + ms.Close(); + ms.Dispose(); + bData = temp.ToArray(); + temp.Close(); + temp.Dispose(); + return bData; + } + + /// + /// 压缩数据 + /// + /// + /// + public static byte[] Compress(byte[] data) + { + byte[] bData; + MemoryStream ms = new MemoryStream(); + GZipStream stream = new GZipStream(ms, CompressionMode.Compress, true); + stream.Write(data, 0, data.Length); + stream.Close(); + stream.Dispose(); + //必须把stream流关闭才能返回ms流数据,不然数据会不完整 + //并且解压缩方法stream.Read(buffer, 0, buffer.Length)时会返回0 + bData = ms.ToArray(); + ms.Close(); + ms.Dispose(); + return bData; + } + + /// + /// 将字节数组反序列化成DataSet对象 + /// + /// 字节数组 + /// DataSet对象 + public static DataSet RetrieveDataSet(byte[] binaryData) + { + DataSet ds = null; + MemoryStream memStream = new MemoryStream(binaryData,true); + //byte[] bs = memStream.GetBuffer(); + + // memStream.Write(bs, 0, bs.Length); + //memStream.Seek(0, SeekOrigin.Begin); + + IFormatter brFormatter = new BinaryFormatter(); + ds =(DataSet)brFormatter.Deserialize(memStream); + return ds; + } + + /// + /// 将字节数组反解压后序列化成DataSet对象 + /// + /// 字节数组 + /// DataSet对象 + public static DataSet RetrieveDataSetDecompress(byte[] binaryData) + { + DataSet dsOriginal = null; + MemoryStream memStream = new MemoryStream(Decompress(binaryData)); + IFormatter brFormatter = new BinaryFormatter(); + Object obj = brFormatter.Deserialize(memStream); + dsOriginal = (DataSet)obj; + return dsOriginal; + } + + /// + /// 将object格式化成字节数组byte[] + /// + /// object对象 + /// 字节数组 + public static byte[] GetBinaryFormatData(object dsOriginal) + { + byte[] binaryDataResult = null; + MemoryStream memStream = new MemoryStream(); + IFormatter brFormatter = new BinaryFormatter(); + brFormatter.Serialize(memStream, dsOriginal); + binaryDataResult = memStream.ToArray(); + memStream.Close(); + memStream.Dispose(); + return binaryDataResult; + } + + /// + /// 将objec格式化成字节数组byte[],并压缩 + /// + /// object对象 + /// 字节数组 + public static byte[] GetBinaryFormatDataCompress(object dsOriginal) + { + byte[] binaryDataResult = null; + MemoryStream memStream = new MemoryStream(); + IFormatter brFormatter = new BinaryFormatter(); + brFormatter.Serialize(memStream, dsOriginal); + binaryDataResult = memStream.ToArray(); + memStream.Close(); + memStream.Dispose(); + return Compress(binaryDataResult); + } + + /// + /// 将字节数组反序列化成object对象 + /// + /// 字节数组 + /// object对象 + public static object RetrieveObject(byte[] binaryData) + { + MemoryStream memStream = new MemoryStream(binaryData); + IFormatter brFormatter = new BinaryFormatter(); + Object obj = brFormatter.Deserialize(memStream); + return obj; + } + + /// + /// 将字节数组解压后反序列化成object对象 + /// + /// 字节数组 + /// object对象 + public static object RetrieveObjectDecompress(byte[] binaryData) + { + MemoryStream memStream = new MemoryStream(Decompress(binaryData)); + IFormatter brFormatter = new BinaryFormatter(); + Object obj = brFormatter.Deserialize(memStream); + return obj; + } + + } +} diff --git a/GetData_PLC/GetData_PLC.csproj b/GetData_PLC/GetData_PLC.csproj new file mode 100644 index 0000000..8c34fad --- /dev/null +++ b/GetData_PLC/GetData_PLC.csproj @@ -0,0 +1,158 @@ + + + + + Debug + AnyCPU + {3412CC68-9C7E-4F3E-A9DB-285EFD5F55DB} + WinExe + Properties + GetData_PLC + GetData_PLC + v4.0 + 512 + + false + D:\GetPLCData\ + true + Disk + false + Foreground + 7 + Days + false + false + true + true + 1 + 1.0.0.%2a + false + true + true + + + x86 + true + full + false + D:\GetPLCData\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + C9CCE7BB53638EA44ED6B3046F9EB5C26E69B6CF + + + GetData_PLC_TemporaryKey.pfx + + + true + + + false + + + GetData_PLC.Program + + + Mario.ico + + + + + + + + + + + + + + + + + + + Form + + + frmMain.cs + + + + + + + + frmMain.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + False + Microsoft .NET Framework 4 %28x86 和 x64%29 + true + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 3.5 SP1 + false + + + False + Windows Installer 4.5 + true + + + + + + + + \ No newline at end of file diff --git a/GetData_PLC/GetData_PLC.csproj.user b/GetData_PLC/GetData_PLC.csproj.user new file mode 100644 index 0000000..b159ef0 --- /dev/null +++ b/GetData_PLC/GetData_PLC.csproj.user @@ -0,0 +1,13 @@ + + + + + + + + + + zh-CN + false + + \ No newline at end of file diff --git a/GetData_PLC/GetData_PLC_TemporaryKey.pfx b/GetData_PLC/GetData_PLC_TemporaryKey.pfx new file mode 100644 index 0000000..b863e7a Binary files /dev/null and b/GetData_PLC/GetData_PLC_TemporaryKey.pfx differ diff --git a/GetData_PLC/Mario.ico b/GetData_PLC/Mario.ico new file mode 100644 index 0000000..68b2dc4 Binary files /dev/null and b/GetData_PLC/Mario.ico differ diff --git a/GetData_PLC/OracleLink.cs b/GetData_PLC/OracleLink.cs new file mode 100644 index 0000000..e24415e --- /dev/null +++ b/GetData_PLC/OracleLink.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Data.OracleClient; +using System.IO; +using System.Linq; +using System.Text; + +#pragma warning disable 0618 +namespace GetData_PLC +{ + public class OracleLink + { + + private static string strCon_jlxt = "data source=orcl;user id=cxc;password=cxc"; + private static string strCon_Dtjk = "data source=TRQSCADA;user id=dtjk;password=Dtjk_123"; + + public static void SaveDataTable(string sql, DataTable _TempTable, string strDataBaseName, string strErr) + { + // Create a new Oracle command + OracleCommand command = null; + string ConnectionStrings = ""; + if (strDataBaseName == "JLXT") ConnectionStrings = strCon_jlxt; + if (strDataBaseName == "DTJK") ConnectionStrings = strCon_Dtjk; + try + { + //Create a connection + using (OracleConnection connection = new OracleConnection(ConnectionStrings)) + { + command = new OracleCommand(sql, connection); + OracleDataAdapter adapter = new OracleDataAdapter(command); + OracleCommandBuilder cb = new OracleCommandBuilder(adapter); + adapter.Update(_TempTable); + strErr = ""; + //return _TempTable; + + } + } + catch (Exception ex) + { + + strErr = " oracle保存表格错误!" + ex.Message; + + } + + } + + public static string getStationName(string strID) + { + DataTable dtStation = new DataTable(); + dtStation = ExecuteDataTable("select * from SYS_ORGANISE where ORG_ID='" + strID + "'", "JLXT", ""); + if (dtStation.Rows.Count > 0) + { + return dtStation.Rows[0]["ORG_NAME"].ToString(); + } + else + { + return ""; + } + + } + public static string getStationName(string strID,ref string strDeptID) + { + DataTable dtStation = new DataTable(); + dtStation = ExecuteDataTable("select * from SYS_ORGANISE where ORG_ID='" + strID + "'", "JLXT", ""); + if (dtStation.Rows.Count > 0) + { + strDeptID = dtStation.Rows[0]["PARENT_ORG_ID"].ToString(); + return dtStation.Rows[0]["ORG_NAME"].ToString(); + } + else + { + return ""; + } + + } + public static string getDeptID(string strID) + { + DataTable dtStation = new DataTable(); + dtStation = ExecuteDataTable("select * from SYS_ORGANISE where ORG_ID='" + strID + "'", "JLXT", ""); + if (dtStation.Rows.Count > 0) + { + return dtStation.Rows[0]["PARENT_ORG_ID"].ToString(); + } + else + { + return ""; + } + + } + + public static DataTable ExecuteDataTable(string sql,string strDataBaseName,string strError) + { + // Create a new Oracle command + OracleCommand command = null; + string ConnectionStrings=""; + + + if (strDataBaseName == "JLXT") ConnectionStrings = strCon_jlxt; + if (strDataBaseName == "DTJK") ConnectionStrings = strCon_Dtjk; + + try + { + //Create a connection + using (OracleConnection connection = new OracleConnection(ConnectionStrings)) + { + command = new OracleCommand(sql, connection); + OracleDataAdapter adapter = new OracleDataAdapter(command); + DataSet ds = new DataSet(); + //System.Threading.Thread.Sleep(10) + adapter.Fill(ds); + + + //if(ds.Tables.Count<1) + // return; + DataTable dt = ds.Tables[0].Copy(); + ds.Dispose(); + strError = ""; + return dt; + + } + } + catch (Exception ex) + { + + strError = " oracle查询表格出错!" + ex.Message; + return null; + } + + } + + public static int ExecuteNonQuery(string sql, string strDataBaseName, string strError) + { + string ConnectionStrings = ""; + + + if (strDataBaseName == "JLXT") ConnectionStrings = strCon_jlxt; + if (strDataBaseName == "DTJK") ConnectionStrings = strCon_Dtjk; + using (OracleConnection con = new OracleConnection(ConnectionStrings)) + { + int Num; + con.Open(); + OracleCommand cmd = new OracleCommand(sql, con); + Num = cmd.ExecuteNonQuery(); + con.Close(); + return Num; + } + } + + public static void strAppend(string strFilePath, string strMessage) + { + using (StreamWriter sw = File.AppendText(strFilePath)) + { + sw.WriteLine(strMessage); + sw.Flush(); + sw.Close(); + } + } + + + } +} diff --git a/GetData_PLC/Program.cs b/GetData_PLC/Program.cs new file mode 100644 index 0000000..ff4a5fc --- /dev/null +++ b/GetData_PLC/Program.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace GetData_PLC +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + //frmMain frmMainSingle = frmMain.getSingle(); + //Application.Run(frmMainSingle); + + + + bool createdNew; Mutex instance = new Mutex(true, "互斥名(保证在本机中唯一)", out createdNew); + if (createdNew) + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new frmMain()); + instance.ReleaseMutex(); + } + + else + { + MessageBox.Show("已经启动了一个程序,请先退出!", "系统提示", MessageBoxButtons.OK, + MessageBoxIcon.Error); + Application.Exit(); + } + } + } +} diff --git a/GetData_PLC/Properties/AssemblyInfo.cs b/GetData_PLC/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..1039699 --- /dev/null +++ b/GetData_PLC/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("GetData_PLC")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("GetData_PLC")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("d0ed4364-25a9-4717-a315-632b20646a80")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GetData_PLC/Properties/Resources.Designer.cs b/GetData_PLC/Properties/Resources.Designer.cs new file mode 100644 index 0000000..0f9883e --- /dev/null +++ b/GetData_PLC/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.18444 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace GetData_PLC.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [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("GetData_PLC.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 使用此强类型资源类,为所有资源查找 + /// 重写当前线程的 CurrentUICulture 属性。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/GetData_PLC/Properties/Resources.resx b/GetData_PLC/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/GetData_PLC/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/GetData_PLC/Properties/Settings.Designer.cs b/GetData_PLC/Properties/Settings.Designer.cs new file mode 100644 index 0000000..efc116b --- /dev/null +++ b/GetData_PLC/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.18444 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace GetData_PLC.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.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; + } + } + } +} diff --git a/GetData_PLC/Properties/Settings.settings b/GetData_PLC/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/GetData_PLC/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/GetData_PLC/bin/Debug/GetData_PLC.exe b/GetData_PLC/bin/Debug/GetData_PLC.exe new file mode 100644 index 0000000..21d5caf Binary files /dev/null and b/GetData_PLC/bin/Debug/GetData_PLC.exe differ diff --git a/GetData_PLC/bin/Debug/GetData_PLC.exe.config b/GetData_PLC/bin/Debug/GetData_PLC.exe.config new file mode 100644 index 0000000..74ade9d --- /dev/null +++ b/GetData_PLC/bin/Debug/GetData_PLC.exe.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/GetData_PLC/bin/Debug/GetData_PLC.pdb b/GetData_PLC/bin/Debug/GetData_PLC.pdb new file mode 100644 index 0000000..57a74cd Binary files /dev/null and b/GetData_PLC/bin/Debug/GetData_PLC.pdb differ diff --git a/GetData_PLC/bin/Debug/GetData_PLC.vshost.exe.config b/GetData_PLC/bin/Debug/GetData_PLC.vshost.exe.config new file mode 100644 index 0000000..74ade9d --- /dev/null +++ b/GetData_PLC/bin/Debug/GetData_PLC.vshost.exe.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/GetData_PLC/bin/Debug/GetData_PLC.vshost.exe.manifest b/GetData_PLC/bin/Debug/GetData_PLC.vshost.exe.manifest new file mode 100644 index 0000000..061c9ca --- /dev/null +++ b/GetData_PLC/bin/Debug/GetData_PLC.vshost.exe.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/GetData_PLC/bin/Release/GetData_PLC.application b/GetData_PLC/bin/Release/GetData_PLC.application new file mode 100644 index 0000000..523c4c9 --- /dev/null +++ b/GetData_PLC/bin/Release/GetData_PLC.application @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + gsYXw7AaTnDdt4jSKteFW0iOfUI= + + + + \ No newline at end of file diff --git a/GetData_PLC/bin/Release/GetData_PLC.exe b/GetData_PLC/bin/Release/GetData_PLC.exe new file mode 100644 index 0000000..26aaf0b Binary files /dev/null and b/GetData_PLC/bin/Release/GetData_PLC.exe differ diff --git a/GetData_PLC/bin/Release/GetData_PLC.exe.config b/GetData_PLC/bin/Release/GetData_PLC.exe.config new file mode 100644 index 0000000..0207790 --- /dev/null +++ b/GetData_PLC/bin/Release/GetData_PLC.exe.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/GetData_PLC/bin/Release/GetData_PLC.exe.manifest b/GetData_PLC/bin/Release/GetData_PLC.exe.manifest new file mode 100644 index 0000000..dd380b4 --- /dev/null +++ b/GetData_PLC/bin/Release/GetData_PLC.exe.manifest @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 43jSD4jmjgww0RXnhxmLOXSBso0= + + + + + + + + + + mRxWD7Tvc0gMvp8wlC1jcMSFaVc= + + + \ No newline at end of file diff --git a/GetData_PLC/bin/Release/GetData_PLC.pdb b/GetData_PLC/bin/Release/GetData_PLC.pdb new file mode 100644 index 0000000..b6ff1e6 Binary files /dev/null and b/GetData_PLC/bin/Release/GetData_PLC.pdb differ diff --git a/GetData_PLC/frmMain.Designer.cs b/GetData_PLC/frmMain.Designer.cs new file mode 100644 index 0000000..884ae56 --- /dev/null +++ b/GetData_PLC/frmMain.Designer.cs @@ -0,0 +1,340 @@ +namespace GetData_PLC +{ + partial class frmMain + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows 窗体设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(frmMain)); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.button4 = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.textBox2 = new System.Windows.Forms.TextBox(); + this.button3 = new System.Windows.Forms.Button(); + this.checkBox1 = new System.Windows.Forms.CheckBox(); + this.button2 = new System.Windows.Forms.Button(); + this.button1 = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.splitContainer2 = new System.Windows.Forms.SplitContainer(); + this.dataGridView1 = new System.Windows.Forms.DataGridView(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.statusStrip1 = new System.Windows.Forms.StatusStrip(); + this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel2 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel3 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel4 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel5 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel6 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel7 = new System.Windows.Forms.ToolStripStatusLabel(); + this.toolStripStatusLabel8 = new System.Windows.Forms.ToolStripStatusLabel(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.timer2 = new System.Windows.Forms.Timer(this.components); + this.timer3 = new System.Windows.Forms.Timer(this.components); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).BeginInit(); + this.splitContainer2.Panel1.SuspendLayout(); + this.splitContainer2.Panel2.SuspendLayout(); + this.splitContainer2.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); + this.statusStrip1.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer1 + // + this.splitContainer1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Top; + this.splitContainer1.Location = new System.Drawing.Point(0, 0); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; + // + // splitContainer1.Panel1 + // + this.splitContainer1.Panel1.Controls.Add(this.button4); + this.splitContainer1.Panel1.Controls.Add(this.label1); + this.splitContainer1.Panel1.Controls.Add(this.textBox2); + this.splitContainer1.Panel1.Controls.Add(this.button3); + this.splitContainer1.Panel1.Controls.Add(this.checkBox1); + this.splitContainer1.Panel1.Controls.Add(this.button2); + this.splitContainer1.Panel1.Controls.Add(this.button1); + this.splitContainer1.Panel1.Controls.Add(this.comboBox1); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.splitContainer2); + this.splitContainer1.Size = new System.Drawing.Size(1250, 616); + this.splitContainer1.SplitterDistance = 49; + this.splitContainer1.TabIndex = 0; + // + // button4 + // + this.button4.Location = new System.Drawing.Point(992, 18); + this.button4.Name = "button4"; + this.button4.Size = new System.Drawing.Size(66, 23); + this.button4.TabIndex = 5; + this.button4.Text = "浏览……"; + this.button4.UseVisualStyleBackColor = true; + this.button4.Click += new System.EventHandler(this.button4_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(629, 23); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(137, 12); + this.label1.TabIndex = 4; + this.label1.Text = "Copy实时采集文件Data到"; + // + // textBox2 + // + this.textBox2.Location = new System.Drawing.Point(772, 20); + this.textBox2.Name = "textBox2"; + this.textBox2.Size = new System.Drawing.Size(214, 21); + this.textBox2.TabIndex = 3; + // + // button3 + // + this.button3.Location = new System.Drawing.Point(532, 15); + this.button3.Name = "button3"; + this.button3.Size = new System.Drawing.Size(75, 23); + this.button3.TabIndex = 2; + this.button3.Text = "重启线程"; + this.button3.UseVisualStyleBackColor = true; + this.button3.Click += new System.EventHandler(this.button3_Click); + // + // checkBox1 + // + this.checkBox1.AutoSize = true; + this.checkBox1.Location = new System.Drawing.Point(250, 15); + this.checkBox1.Name = "checkBox1"; + this.checkBox1.Size = new System.Drawing.Size(96, 16); + this.checkBox1.TabIndex = 2; + this.checkBox1.Text = "保存到数据库"; + this.checkBox1.UseVisualStyleBackColor = true; + // + // button2 + // + this.button2.Location = new System.Drawing.Point(123, 11); + this.button2.Name = "button2"; + this.button2.Size = new System.Drawing.Size(75, 23); + this.button2.TabIndex = 2; + this.button2.Text = "button2"; + this.button2.UseVisualStyleBackColor = true; + // + // button1 + // + this.button1.Location = new System.Drawing.Point(10, 11); + this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "button1"; + this.button1.UseVisualStyleBackColor = true; + this.button1.Click += new System.EventHandler(this.button1_Click); + // + // comboBox1 + // + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(405, 14); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(121, 20); + this.comboBox1.TabIndex = 0; + this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged); + // + // splitContainer2 + // + this.splitContainer2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; + this.splitContainer2.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer2.Location = new System.Drawing.Point(0, 0); + this.splitContainer2.Name = "splitContainer2"; + // + // splitContainer2.Panel1 + // + this.splitContainer2.Panel1.Controls.Add(this.dataGridView1); + // + // splitContainer2.Panel2 + // + this.splitContainer2.Panel2.Controls.Add(this.textBox1); + this.splitContainer2.Size = new System.Drawing.Size(1250, 563); + this.splitContainer2.SplitterDistance = 973; + this.splitContainer2.TabIndex = 1; + // + // dataGridView1 + // + this.dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.ColumnHeader; + this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.dataGridView1.Location = new System.Drawing.Point(0, 0); + this.dataGridView1.Name = "dataGridView1"; + this.dataGridView1.RowTemplate.Height = 23; + this.dataGridView1.Size = new System.Drawing.Size(969, 559); + this.dataGridView1.TabIndex = 0; + // + // textBox1 + // + this.textBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.textBox1.Location = new System.Drawing.Point(0, 0); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox1.Size = new System.Drawing.Size(269, 559); + this.textBox1.TabIndex = 0; + // + // statusStrip1 + // + this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripStatusLabel1, + this.toolStripStatusLabel2, + this.toolStripStatusLabel3, + this.toolStripStatusLabel4, + this.toolStripStatusLabel5, + this.toolStripStatusLabel6, + this.toolStripStatusLabel7, + this.toolStripStatusLabel8}); + this.statusStrip1.Location = new System.Drawing.Point(0, 619); + this.statusStrip1.Name = "statusStrip1"; + this.statusStrip1.Size = new System.Drawing.Size(1250, 22); + this.statusStrip1.TabIndex = 1; + this.statusStrip1.Text = "statusStrip1"; + // + // toolStripStatusLabel1 + // + this.toolStripStatusLabel1.Name = "toolStripStatusLabel1"; + this.toolStripStatusLabel1.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel2 + // + this.toolStripStatusLabel2.Name = "toolStripStatusLabel2"; + this.toolStripStatusLabel2.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel3 + // + this.toolStripStatusLabel3.Name = "toolStripStatusLabel3"; + this.toolStripStatusLabel3.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel4 + // + this.toolStripStatusLabel4.Name = "toolStripStatusLabel4"; + this.toolStripStatusLabel4.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel5 + // + this.toolStripStatusLabel5.Name = "toolStripStatusLabel5"; + this.toolStripStatusLabel5.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel6 + // + this.toolStripStatusLabel6.Name = "toolStripStatusLabel6"; + this.toolStripStatusLabel6.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel7 + // + this.toolStripStatusLabel7.Name = "toolStripStatusLabel7"; + this.toolStripStatusLabel7.Size = new System.Drawing.Size(0, 17); + // + // toolStripStatusLabel8 + // + this.toolStripStatusLabel8.Name = "toolStripStatusLabel8"; + this.toolStripStatusLabel8.Size = new System.Drawing.Size(0, 17); + // + // timer1 + // + this.timer1.Interval = 999; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // timer2 + // + this.timer2.Tick += new System.EventHandler(this.timer2_Tick); + // + // timer3 + // + this.timer3.Enabled = true; + this.timer3.Interval = 1000; + this.timer3.Tick += new System.EventHandler(this.timer3_Tick); + // + // frmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1250, 641); + this.Controls.Add(this.statusStrip1); + this.Controls.Add(this.splitContainer1); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "frmMain"; + this.Text = "Form1"; + this.Activated += new System.EventHandler(this.frmMain_Activated); + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.frmMain_FormClosing); + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.frmMain_FormClosed); + this.Load += new System.EventHandler(this.frmMain_Load); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel1.PerformLayout(); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); + this.splitContainer2.Panel1.ResumeLayout(false); + this.splitContainer2.Panel2.ResumeLayout(false); + this.splitContainer2.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer2)).EndInit(); + this.splitContainer2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); + this.statusStrip1.ResumeLayout(false); + this.statusStrip1.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.SplitContainer splitContainer2; + private System.Windows.Forms.DataGridView dataGridView1; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.StatusStrip statusStrip1; + private System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel1; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel2; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel3; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel4; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel5; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel6; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel7; + private System.Windows.Forms.ToolStripStatusLabel toolStripStatusLabel8; + private System.Windows.Forms.Timer timer1; + private System.Windows.Forms.Timer timer2; + private System.Windows.Forms.Timer timer3; + private System.Windows.Forms.Button button1; + private System.Windows.Forms.Button button2; + private System.Windows.Forms.CheckBox checkBox1; + private System.Windows.Forms.Button button3; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox textBox2; + private System.Windows.Forms.Button button4; + } +} + diff --git a/GetData_PLC/frmMain.cs b/GetData_PLC/frmMain.cs new file mode 100644 index 0000000..35e9844 --- /dev/null +++ b/GetData_PLC/frmMain.cs @@ -0,0 +1,784 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.OracleClient; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace GetData_PLC +{ + public partial class frmMain : Form + { + [DllImport("Iphlpapi.dll")] + + + private static extern int SendARP(Int32 dest, Int32 host, ref Int64 mac, ref Int32 length); + //[DllImport("Ws2_32.dll")] + private static string strErr = ""; + + public static string strAppPath = Environment.CurrentDirectory ; //采集程序路径 + public static string strAPPDataPath = Environment.CurrentDirectory + @"\Data\"; //采集程序文件存储路径 + public static string strParPath = strAPPDataPath + @"par\"; //计量参数文件存储路径 + public static string strConfigPath = strAPPDataPath + @"Config\"; //采集程序参数保存路径 + public static string strDataPath = strAPPDataPath + @"RealTime\"; //实时数据存储路径 + + public static string strDataPath_JlData = strDataPath + @"JlData\"; //分站计量实时数据存储路径 + public static string strDataPath_ScData = strDataPath + @"ScData\"; //输差数据XML存储文件夹 + public static string strDataPath_DataTime = strDataPath + @"DateTime\"; //分站时间xml存储文件夹 + public static string strDataPath_Log = strDataPath + @"Log\"; //日志存储文件夹 + + + + //log 日志存放数据 + public static string strLogPath = strDataPath + @"log\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "_log.txt"; + public static string strLogPath_Data = strDataPath + @"log\" + DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString() + "_Datalog_"; + + + private DataTable dtZhan = new DataTable(); + static DataTable dtJld = new DataTable(); + //检查控制台程序,如果一分钟之内启动超过3次,则可能有错误,重启计算机。 + private static int StartConselTimes; + //控制台是否运行的标志 + private static bool ConselRunFlag; + // 程序启动的时间,用于主程序自动重启 + private static DateTime MainPragramStartTime; + + Boolean SaveHourFlag; //小时保存数据 + Boolean SaveSSFlag; //实时数据保存数据 + Boolean SaveDayFlag; //保存日报表标志 + Boolean SaveSCDayFlag; //保存日报表标志 + + Boolean UpdateFlag; //更新计量器具的标志 + + + private static int SaveDiff = 300;//实时数据存盘间隔 五分钟 + bool SaveEnable; + private static DateTime PragramStartTime;// 程序启动的时间,用于主程序自动重启 + private static DateTime LastSaveTime; + public frmMain() + { + InitializeComponent(); + } + private void frmMain_Load(object sender, EventArgs e) + { + //写入程序已经运行的标志 避免服务器程序重复启动 + System.IO.Directory.CreateDirectory(strAPPDataPath); //Data文件夹 + System.IO.Directory.CreateDirectory(strParPath); //Data\par文件夹 + System.IO.Directory.CreateDirectory(strDataPath); //Data\realtime文件夹 + System.IO.Directory.CreateDirectory(strConfigPath); //Data\realtime文件夹 + + System.IO.Directory.CreateDirectory(strDataPath_JlData); //分站xml存储文件夹 + System.IO.Directory.CreateDirectory(strDataPath_ScData); //输差数据XML存储文件夹 + System.IO.Directory.CreateDirectory(strDataPath_DataTime);//分站时间xml存储文件夹 + System.IO.Directory.CreateDirectory(strDataPath_Log); //日志存储文件夹 + + + // 备份数据库 + + DataSet dsBackUp = new DataSet(); + + DataTable dtBackUp = new DataTable(); + dtBackUp = OracleLink.ExecuteDataTable("select * from RV2_BASEINFO", "JLXT", ""); + dtBackUp.TableName = "FlowMeter"; + dsBackUp.Tables.Add(dtBackUp.Copy()); + + dtBackUp = new DataTable(); + dtBackUp = OracleLink.ExecuteDataTable("select * from RV2_TRANS_CONFIG", "JLXT", ""); + dtBackUp.TableName = "SCConfig"; + dsBackUp.Tables.Add(dtBackUp.Copy()); + + dtBackUp = new DataTable(); + dtBackUp = OracleLink.ExecuteDataTable("select * from SYS_ORGANISE", "JLXT", ""); + dtBackUp.TableName = "OrgConfig"; + dsBackUp.Tables.Add(dtBackUp.Copy()); + + + dsBackUp .WriteXml (strParPath + "dsConfig.xml", XmlWriteMode.WriteSchema); + + + + + + string strParPath1 = strParPath + "runstate.txt"; + if (File.Exists(strParPath)) + { + if (File.ReadAllText(strParPath1) == "true") + { + MessageBox.Show("已有一个采集进程在运行,退出 !", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Error); + Application.Exit(); + } + } + else + { + File.WriteAllText(strParPath1, "true"); + } + + System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; + toolStripStatusLabel1.Text = "天然气产销厂自动计量采集程序"; + toolStripStatusLabel2.Text = DateTime.Now.ToString(); + + Control.CheckForIllegalCrossThreadCalls = false;//跨线程操作 + string strFileName = ""; + + dtZhan = new DataTable(); + try + { + dtZhan = OracleLink.ExecuteDataTable(SQL_Strings.strSQLZhan, "JLXT", strErr); + } + catch (Exception) + { + strFileName = strDataPath + "dtZhan.xml"; + dtZhan.ReadXml(strFileName); + } + dtZhan.TableName = "集输站场"; + DataTable dtStationNew = dtZhan.Copy(); + try + { + for (int i = 0; i < dtZhan.Rows.Count; i++) + { + //柳屯配气站两台PLC 区分 + string[] tempIp = dtZhan.Rows[i]["IP"].ToString().Split(','); + string[] tempPORT = dtZhan.Rows[i]["PORT"].ToString().Split(','); + if (tempIp.Length > 1) + { + DataRow drTemp = dtStationNew.NewRow(); + drTemp.ItemArray = dtZhan.Rows[i].ItemArray; + dtStationNew.Rows[i]["org_id"] = dtZhan.Rows[i]["org_id"].ToString() + "_0"; + dtStationNew.Rows[i]["org_name"] = dtZhan.Rows[i]["org_name"].ToString() + "_0"; + dtStationNew.Rows[i]["IP"] = tempIp[0]; + dtStationNew.Rows[i]["PORT"] = tempPORT[0]; + for (int j = 1; j < tempIp.Length; j++) + { + drTemp["org_id"] = dtZhan.Rows[i]["org_id"].ToString() + "_" + j.ToString(); + drTemp["org_name"] = dtZhan.Rows[i]["org_name"].ToString() + "_" + j.ToString(); + drTemp["IP"] = tempIp[j]; + drTemp["PORT"] = tempPORT[j]; + dtStationNew.Rows.Add(drTemp); + } + } + } + comboBox1.DataSource = dtStationNew; + comboBox1.DisplayMember = dtZhan.Columns["ORG_NAME"].ToString(); + comboBox1.ValueMember = dtZhan.Columns["ORG_ID"].ToString(); + dtStationNew.WriteXml(strDataPath + "dtZhan.xml", XmlWriteMode.WriteSchema); + } + catch (Exception ex) + { + } + LastSaveTime = DateTime.Now; + PragramStartTime = DateTime.Now; + string name = Dns.GetHostName(); + IPAddress[] ipadrlist = Dns.GetHostAddresses(name); + for (int i = 0; i < ipadrlist.Length; i++) + { + if (ipadrlist[i].ToString() == "10.75.167.5" || ipadrlist[i].ToString() == "10.75.166.5") + { + checkBox1.Checked = true; + + } + } + } + + #region "启停采集控制台" + private void startConsel(string _filePath, string _ProcessesName) + { + + foreach (Process p in Process.GetProcesses()) + { + if (p.ProcessName == _ProcessesName) + { + try + { + p.Kill(); + } + catch + { + + } + } + } + //实例化一个进程类 + + //Thread.Sleep(5000); + + Process cmd = new Process(); + cmd.StartInfo.FileName = _filePath + "\\" + _ProcessesName + ".exe"; + //不显示命令行窗口界面true不显示 + cmd.StartInfo.CreateNoWindow = true; + cmd.StartInfo.WindowStyle = ProcessWindowStyle.Normal; + cmd.Start(); //启动进程 + textBox1.AppendText("采集程序启动---" + DateTime.Now + "\r\n"); + ConselRunFlag = true; + StartConselTimes = 0; + } + + + private void CloseConsel(string _ProcessesName) + { + foreach (Process p in Process.GetProcesses()) + { + + if (p.ProcessName == _ProcessesName) + { + try + { + p.Kill(); + } + catch + { + } + } + } + } + + private void timer3_Tick(object sender, EventArgs e) + { + //定时重启 2天重启一次 + TimeSpan stST = DateTime.Now - MainPragramStartTime; + DateTime SAVETIME = DateTime.Now; + DateTime oldTime = DateTime.Parse(toolStripStatusLabel2.Text); + TimeSpan strRuntime = SAVETIME - oldTime; + toolStripStatusLabel3.Text = "已运行【" + strRuntime.Days.ToString("0#") + "天" + strRuntime.Hours.ToString("0#") + "小时" + strRuntime.Minutes.ToString("0#") + "分钟" + strRuntime.Seconds.ToString("0#") + "秒 】"; + toolStripStatusLabel4.Text = DateTime.Now.ToString(); + + #region //启动停止更新计量器具控制台程序 + //try + //{ + // if (SAVETIME.Hour >= 2 && SAVETIME.Hour < 3 && UpdateFlag == false) //过了2点启动 + // { + // UpdateFlag = true; + // startConsel(strAppPath, "UpdateMeter"); + // try + // { + // File.Delete(strAppPath + @"\Data\UpdateMeter\updateFlag.xml"); + // } + // catch (Exception) + // { + + // } + // } + + + // if (UpdateFlag) //如果更新成功 则关闭控制台程序 + // { + // if (File.Exists(strAppPath + @"\Data\UpdateMeter\updateFlag.xml")) + // { + // CloseConsel("UpdateMeter"); + // } + // } + + + // if (SAVETIME.Hour < 2 || SAVETIME.Hour > 3) + // { + // UpdateFlag = false; + // try + // { + // File.Delete(strAppPath + @"\Data\UpdateMeter\updateFlag.xml"); + // } + // catch (Exception) + // { + + + // } + // } + //} + //catch (Exception ex) + //{ + + //} + #endregion + #region //客户端重启control + try + { + string strQuery = "select * from control"; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + string RestartFlag = ""; + DataTable ReadFlagTable = OracleLink.ExecuteDataTable(strQuery, "DTJK", ""); + RestartFlag = ReadFlagTable.Rows[0]["RESTART"].ToString(); + if (RestartFlag == "1") + { + strQuery = "update control set RESTART=0 where id=1 "; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + OracleLink.ExecuteNonQuery(strQuery, "DTJK", strErr); + startConsel(strAppPath, "ConsoleGetPLCData"); + } + + } + catch (SystemException err) + { + + } + + #endregion + try + { + if (stST.Minutes > 2880) + { + System.Diagnostics.Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location); + Application.Restart(); + } + toolStripStatusLabel5.Text = ""; + Int64 intPLCPageMemory = 0; + Int64 intPLCSystemMemory = 0; + ConselRunFlag = false; + foreach (Process p in Process.GetProcesses()) + { + if (p.ProcessName == "ConsoleGetPLCData") + { + string PLCMemory = "PLC采集程序【物理内存:" + (p.WorkingSet64 / 1024 / 1024).ToString() + " MB--" + "分页内存:" + (p.PagedMemorySize64 / 1024 / 1024).ToString() + " MB】"; + intPLCPageMemory = p.PagedMemorySize64 / 1024 / 1024; + intPLCSystemMemory = p.WorkingSet64 / 1024 / 1024; + toolStripStatusLabel5.Text = PLCMemory; + ConselRunFlag = true; + StartConselTimes = 0; + break; + } + } + + if (ConselRunFlag == false) + { + StartConselTimes = StartConselTimes + 1; + startConsel(strAppPath, "ConsoleGetPLCData"); + textBox1.AppendText("启动采集程序 " + "\r\n"); + + } + + bool Restart = false; + if ((System.Math.IEEERemainder(SAVETIME.Minute, 5) > 0 && System.Math.IEEERemainder(SAVETIME.Minute, 5) < 4) || (DateTime.Now.Hour == 23 && DateTime.Now.Minute >= 56)) + { + Restart = true; + } + if (intPLCPageMemory >= 250 && Restart) + { + CloseConsel("ConsoleGetPLCData"); + Thread.Sleep(2000); + startConsel(strAppPath, "ConsoleGetPLCData"); + toolStripStatusLabel7.Text = (int.Parse(toolStripStatusLabel7.Text) + 1).ToString(); + textBox1.AppendText("分页内存超过250MB,重启采集程序----" + DateTime.Now + "\r\n"); + } + + if (intPLCSystemMemory >= 150 && Restart) + { + CloseConsel("ConsoleGetPLCData"); + Thread.Sleep(2000); + startConsel(strAppPath, "ConsoleGetPLCData"); + toolStripStatusLabel7.Text = (int.Parse(toolStripStatusLabel7.Text) + 1).ToString(); + textBox1.AppendText("物理内存超过150MB,重启采集程序----" + DateTime.Now + "\r\n"); + } + timer1.Enabled = true; + + } + catch (Exception) + { + + } + } + #endregion + private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) + { + + } + + + private void timer1_Tick(object sender, EventArgs e) + { + try + { + string strFilePath = @"D:\GetPLCData\Data\RealTime\"; + DataTable dtStation = new DataTable(); + dtStation.ReadXml(strFilePath + "JlData\\" + comboBox1.SelectedValue.ToString() + ".xml"); + dataGridView1.DataSource = dtStation; + + DataSet SsDataDs = new DataSet();//数据集,用于存放全厂所有计量点实时数据 + DataTable dtScRealTime = new DataTable();//数据集,用于存放全厂站场输差、管管线输差和自定义输差的实时显示 + DataTable TotalTable = new DataTable(); + try + { + dtScRealTime.ReadXml(strDataPath + "ScData.xml"); + SsDataDs.ReadXml(strDataPath + "SsData.xml", XmlReadMode.ReadSchema); + TotalTable.ReadXml(strDataPath + "TotalData.xml"); + + } + catch (SystemException err) + { + if (err.Message != null) + { + //textBox1.AppendText("注意: 读取合并xml文件出错 " + err.Message + err.StackTrace.Substring(err.StackTrace.LastIndexOf("行号") - 1) + "\r\n"); + //textBox1.AppendText("注意: 读取合并xml文件出错 " + "\r\n"); + } + } + + try + { + CopyDirectory(strAppPath + "\\Data\\", textBox2 .Text ); + } + catch + + { + + } + + + + #region 保存到数据库 + if (checkBox1.Checked) + { + DateTime SAVETIME = DateTime.Now; + string strQuery = ""; + #region"保存实时数据"//------------------------------------------------------------------------ + //if (System.Math.Abs(DateDiff.TotalSeconds - SaveDiff) < 1) + if (System.Math.IEEERemainder(SAVETIME.Minute, 5) == 0 && SaveSSFlag == false) + { + strQuery = "select ID,DEPT_ID,STATION_ID,JLD_ID,RTIME,WD,YL,CY,SSL,JRL,JRSJ,YBZT,SSGKLL,CXFLAG from REALTIME_DATA where ID=0"; + DataTable SaveRealTimeData = OracleLink.ExecuteDataTable(strQuery, "DTJK", strErr); + for (int j = 0; j < TotalTable.Rows.Count; j++) + { + DataRow tempRow = SaveRealTimeData.NewRow(); + tempRow["ID"] = TotalTable.Rows[j]["ID"]; + tempRow["RTIME"] = SAVETIME; + tempRow["WD"] = TotalTable.Rows[j]["WD"]; + tempRow["YL"] = TotalTable.Rows[j]["YL"]; + tempRow["CY"] = TotalTable.Rows[j]["CY"]; + tempRow["SSL"] = TotalTable.Rows[j]["SSL"]; + tempRow["JRL"] = TotalTable.Rows[j]["JRL"]; + tempRow["JRSJ"] = TotalTable.Rows[j]["JRSJ"]; + tempRow["YBZT"] = TotalTable.Rows[j]["YBZT"]; + tempRow["SSGKLL"] = TotalTable.Rows[j]["SSGKLL"]; + tempRow["CXFLAG"] = TotalTable.Rows[j]["CXFLAG"]; + tempRow["DEPT_ID"] = TotalTable.Rows[j]["DEPT_ID"]; + tempRow["STATION_ID"] = TotalTable.Rows[j]["STATION_ID"]; + tempRow["JLD_ID"] = TotalTable.Rows[j]["JLD_ID"]; + SaveRealTimeData.Rows.Add(tempRow); + } + try + { + strQuery = "select ID,DEPT_ID,STATION_ID,JLD_ID,RTIME,WD,YL,CY,SSL,JRL,JRSJ,YBZT,SSGKLL,CXFLAG from REALTIME_DATA"; + + SaveRealTimeData.WriteXml ("d:\\ccc.xml",XmlWriteMode.WriteSchema); + OracleLink.SaveDataTable(strQuery, SaveRealTimeData, "DTJK", strErr); + strErr = "注意:" + DateTime.Now + "保存实时数据成功" + "\r\n"; + textBox1.AppendText(strErr); + } + catch (SystemException err) + { + if (err.Message != null) + { + strErr = "注意:" + DateTime.Now + "保存实时数据库时出错" + err.Message + "\r\n"; + textBox1.AppendText(strErr); + } + } + #endregion + #region"保存实时输差"//----------------------------------------------------- + strQuery = "select id, in_p,out_p,rtime, scname, ssintotal, ssouttotal, sssc, ssscbfs, jrlintotal, jrlouttotal, jrlsc, jrlscbfs, station_id, sctype, redept_name from SC_DATA where id=0 "; + try + { + DataTable ScTotalTable = new DataTable(); + ScTotalTable = OracleLink.ExecuteDataTable(strQuery, "DTJK", strErr); + ScTotalTable.Rows.Clear(); + for (int j = 0; j < dtScRealTime.Rows.Count; j++) + { + DataRow tempRow = ScTotalTable.NewRow(); + tempRow["RTIME"] = SAVETIME; + tempRow["ID"] = dtScRealTime.Rows[j]["SCID"]; + tempRow["IN_P"] = dtScRealTime.Rows[j]["IN_P"]; + tempRow["OUT_P"] = dtScRealTime.Rows[j]["OUT_P"]; + tempRow["scname"] = dtScRealTime.Rows[j]["SCNAME"]; + tempRow["ssintotal"] = dtScRealTime.Rows[j]["SsInTotal"]; + tempRow["ssouttotal"] = dtScRealTime.Rows[j]["SsOutTotal"]; + tempRow["sssc"] = dtScRealTime.Rows[j]["SsSc"]; + tempRow["ssscbfs"] = dtScRealTime.Rows[j]["SsPer"]; + tempRow["jrlintotal"] = dtScRealTime.Rows[j]["JrInTotal"]; + tempRow["jrlouttotal"] = dtScRealTime.Rows[j]["JrOutTotal"]; + tempRow["jrlsc"] = dtScRealTime.Rows[j]["JrSc"]; + tempRow["jrlscbfs"] = dtScRealTime.Rows[j]["JrPer"]; + tempRow["station_id"] = dtScRealTime.Rows[j]["station_id"]; + tempRow["redept_name"] = dtScRealTime.Rows[j]["RE_DEPT_ID"]; + tempRow["sctype"] = dtScRealTime.Rows[j]["SCTYPE"]; + ScTotalTable.Rows.Add(tempRow); + } + + strQuery = "select id, rtime,in_p,out_p, scname, ssintotal, ssouttotal, sssc, ssscbfs, jrlintotal, jrlouttotal, jrlsc, jrlscbfs, station_id, sctype, redept_name from SC_DATA "; + OracleLink.SaveDataTable(strQuery, ScTotalTable, "DTJK", strErr); + strErr = "注意:" + DateTime.Now + "保存实时输差数据成功" + "\r\n"; + textBox1.AppendText(strErr); + } + catch (SystemException err) + { + if (err.Message != null) + { + strErr = ("注意:" + DateTime.Now + "保存输差数据失败" + err.Message) + "\r\n"; + textBox1.AppendText(strErr); + } + } + + LastSaveTime = SAVETIME; + SaveSSFlag = true; + } + + if (System.Math.IEEERemainder(SAVETIME.Minute, 5) != 0) + { + SaveSSFlag = false; + } + #endregion + #region "存小时数据"//----------------------------------------------------------------- + if (SAVETIME.Minute == 59 && SAVETIME.Second > 40 && SaveHourFlag == false) //到小时整点,如果还没有存储过则开始存储 + { + strQuery = "select ID,RTIME,WD,YL,CY,SSL,JRL,JRSJ,YBZT,DEPT_ID,STATION_ID,JLD_ID from HOURREPORT where ID=0"; + DataTable SaveHourTable = OracleLink.ExecuteDataTable(strQuery, "DTJK", strErr); + for (int j = 0; j < TotalTable.Rows.Count; j++) + { + DataRow tempRow = SaveHourTable.NewRow(); + tempRow["ID"] = TotalTable.Rows[j]["ID"]; + tempRow["RTIME"] = SAVETIME; + tempRow["WD"] = TotalTable.Rows[j]["WD"]; + tempRow["YL"] = TotalTable.Rows[j]["YL"]; + tempRow["CY"] = TotalTable.Rows[j]["CY"]; + tempRow["SSL"] = TotalTable.Rows[j]["SSL"]; + tempRow["JRL"] = TotalTable.Rows[j]["JRL"]; + tempRow["JRSJ"] = TotalTable.Rows[j]["JRSJ"]; + tempRow["YBZT"] = TotalTable.Rows[j]["YBZT"]; + tempRow["DEPT_ID"] = TotalTable.Rows[j]["DEPT_ID"]; + tempRow["STATION_ID"] = TotalTable.Rows[j]["STATION_ID"]; + tempRow["JLD_ID"] = TotalTable.Rows[j]["JLD_ID"]; + SaveHourTable.Rows.Add(tempRow); + } + + strQuery = "select ID,RTIME,WD,YL,CY,SSL,JRL,JRSJ,YBZT,DEPT_ID,STATION_ID,JLD_ID from HOURREPORT"; + try + { + OracleLink.SaveDataTable(strQuery, SaveHourTable, "DTJK", strErr); + strErr = "注意:" + DateTime.Now + "保存小时数据成功" + "\r\n"; + textBox1.AppendText(strErr); + + SaveHourFlag = true; + SaveHourTable.Dispose(); + } + catch (SystemException err) + { + if (err.Message != null) + { + strErr = "注意:" + DateTime.Now + "保存小时数据出错" + "\r\n"; + textBox1.AppendText(strErr); + } + } + } + + if (SAVETIME.Minute != 59) //过了小时准点 存储标志设为否 + { + SaveHourFlag = false; + } + #endregion + #region "输差每日23:59:55 存盘一次 + if (SAVETIME.Hour == 23 && SAVETIME.Minute.ToString() == "59" && SAVETIME.Second.ToString() == "55" && SaveSCDayFlag == false) //过了零点十分则日报表 + { + strQuery = "select id, in_p,out_p,rtime, scname, ssintotal, ssouttotal, sssc, ssscbfs, jrlintotal, jrlouttotal, jrlsc, jrlscbfs, station_id, sctype, redept_name from SC_DAYDATA where id=0 "; + DataTable ScTotalTableH = new DataTable(); + ScTotalTableH = OracleLink.ExecuteDataTable(strQuery, "DTJK", strErr); + ScTotalTableH.Rows.Clear(); + try + { + for (int j = 0; j < dtScRealTime.Rows.Count; j++) + { + DataRow tempRow = ScTotalTableH.NewRow(); + tempRow["RTIME"] = SAVETIME; + tempRow["ID"] = dtScRealTime.Rows[j]["SCID"]; + tempRow["IN_P"] = dtScRealTime.Rows[j]["IN_P"]; + tempRow["OUT_P"] = dtScRealTime.Rows[j]["OUT_P"]; + tempRow["scname"] = dtScRealTime.Rows[j]["SCNAME"]; + tempRow["ssintotal"] = dtScRealTime.Rows[j]["SsInTotal"]; + tempRow["ssouttotal"] = dtScRealTime.Rows[j]["SsOutTotal"]; + tempRow["sssc"] = dtScRealTime.Rows[j]["SsSc"]; + tempRow["ssscbfs"] = dtScRealTime.Rows[j]["SsPer"]; + tempRow["jrlintotal"] = dtScRealTime.Rows[j]["JrInTotal"]; + tempRow["jrlouttotal"] = dtScRealTime.Rows[j]["JrOutTotal"]; + tempRow["jrlsc"] = dtScRealTime.Rows[j]["JrSc"]; + tempRow["jrlscbfs"] = dtScRealTime.Rows[j]["JrPer"]; + tempRow["station_id"] = dtScRealTime.Rows[j]["station_id"]; + tempRow["redept_name"] = dtScRealTime.Rows[j]["RE_DEPT_ID"]; + tempRow["sctype"] = dtScRealTime.Rows[j]["SCTYPE"]; + ScTotalTableH.Rows.Add(tempRow); + } + strQuery = "select id, rtime,in_p,out_p, scname, ssintotal, ssouttotal, sssc, ssscbfs, jrlintotal, jrlouttotal, jrlsc, jrlscbfs, station_id, sctype, redept_name from SC_DAYDATA "; + OracleLink.SaveDataTable(strQuery, ScTotalTableH, "DTJK", strErr); + strErr = "注意:" + DateTime.Now + "保存实时输差数据成功" + "\r\n"; + SaveSCDayFlag = true; + textBox1.AppendText(strErr); + } + catch (SystemException err) + { + if (err.Message != null) + { + strErr = ("注意:" + DateTime.Now + "保存输差数据失败" + err.Message) + "\r\n"; + textBox1.AppendText(strErr); + } + } + } + + if (SAVETIME.Hour != 23 && SAVETIME.Minute.ToString() != "59" && SAVETIME.Second.ToString() != "55") //过了小时准点 存储标志设为否 + { + SaveSCDayFlag = false; + } + #endregion + #region "存日报表"//----------------------------------------------------------- + + + if (SAVETIME.Hour == 0 && SAVETIME.Minute.ToString() == "10" && SaveDayFlag == false) //过了零点十分则日报表 + { + string Queryql = "select ID,RTIME,QL,DEPT_ID,STATION_ID,JLD_ID,JLSJ from DAYREPORT where ID=0"; + DataTable SaveDAYTable = OracleLink.ExecuteDataTable(Queryql, "DTJK", strErr); + DateTime _Date = DateTime.Now.AddDays(-1); + _Date = DateTime.Parse(_Date.ToString("yyyy-MM-dd")); + for (int j = 0; j < TotalTable.Rows.Count; j++) + { + DataRow tempRow = SaveDAYTable.NewRow(); + tempRow["ID"] = TotalTable.Rows[j]["ID"]; + tempRow["RTIME"] = _Date; + tempRow["QL"] = TotalTable.Rows[j]["ZRL"]; + tempRow["DEPT_ID"] = TotalTable.Rows[j]["DEPT_ID"]; + tempRow["STATION_ID"] = TotalTable.Rows[j]["STATION_ID"]; + tempRow["JLD_ID"] = TotalTable.Rows[j]["JLD_ID"]; + tempRow["JLSJ"] = TotalTable.Rows[j]["ZRSJ"]; + SaveDAYTable.Rows.Add(tempRow); + } + + Queryql = "select ID,RTIME,QL,DEPT_ID,STATION_ID,JLD_ID,JLSJ from DAYREPORT"; + try + { + OracleLink.SaveDataTable(Queryql, SaveDAYTable, "DTJK", strErr); + //SaveDAYTable.WriteXml(strDataPath + DateTime.Now.ToString() + "SaveTable.xml",XmlWriteMode.WriteSchema); + //File.Copy(strDataPath + "TotalData.xml", strDataPath + DateTime.Now.ToString() + "TotalData.xml"); + + strErr = "注意:" + DateTime.Now + "保存日报表成功" + "\r\n"; + textBox1.AppendText(strErr); + + SaveDayFlag = true; + SaveDAYTable.Dispose(); + } + catch (SystemException err) + { + if (err.Message != null) + { + strErr = "注意:" + DateTime.Now + "保存日报表数据出错" + strErr + "\r\n"; + textBox1.AppendText(strErr); + } + } + + + + } + + if (SAVETIME.Hour != 1 && SAVETIME.Minute.ToString() != "10") //过了小时准点 存储标志设为否 + { + SaveDayFlag = false; + } + #endregion + } + #endregion + } + catch { } + } + private void frmMain_Activated(object sender, EventArgs e) + { + + } + private void frmMain_FormClosed(object sender, FormClosedEventArgs e) + { + CloseConsel("ConsoleGetPLCData"); + + } + private void frmMain_FormClosing(object sender, FormClosingEventArgs e) + { + CloseConsel("ConsoleGetPLCData"); + File.WriteAllText(strParPath + "runstate.txt", "false"); + System.Environment.Exit(0);//彻底关闭线程 + + } + private void timer2_Tick(object sender, EventArgs e) + { + + } + + private void button3_Click(object sender, EventArgs e) + { + + string strQuery = "update control set ThreadRestartFlag='1',Thread_ZCID='" + comboBox1.SelectedValue.ToString() + "' where id=1 "; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + OracleLink.ExecuteNonQuery(strQuery, "DTJK", strErr); + + } + + private void button1_Click(object sender, EventArgs e) + { + string strQuery = "update control set ThreadRestartFlag='1',Thread_ZCID='" + comboBox1.SelectedValue.ToString() + "' where id=1 "; //从数据库中查询出所有站场的名称和站场ID//返回不带重复记录的站场ID表格 + OracleLink.ExecuteNonQuery(strQuery, "DTJK", strErr); + + } + + private void button4_Click(object sender, EventArgs e) + { + + FolderBrowserDialog fbd = new FolderBrowserDialog(); + fbd.SelectedPath = @"D:\"; + + if (fbd.ShowDialog() == DialogResult.OK) + { + this.textBox2.Text = fbd.SelectedPath; + } + + File.WriteAllText(strAppPath + "\\CopyPath.txt", textBox2.Text); + + } + + + + + + + public void CopyDirectory(string sourceDirName, string destDirName) + { + try + { + if (!Directory.Exists(destDirName)) + { + Directory.CreateDirectory(destDirName); + File.SetAttributes(destDirName, File.GetAttributes(sourceDirName)); + + } + + if (destDirName[destDirName.Length - 1] != Path.DirectorySeparatorChar) + destDirName = destDirName + Path.DirectorySeparatorChar; + + string[] files = Directory.GetFiles(sourceDirName); + foreach (string file in files) + { + + File.Copy(file, destDirName + Path.GetFileName(file), true); + File.SetAttributes(destDirName + Path.GetFileName(file), FileAttributes.Normal); + //total++; + } + + string[] dirs = Directory.GetDirectories(sourceDirName); + foreach (string dir in dirs) + { + CopyDirectory(dir, destDirName + Path.GetFileName(dir)); + } + } + catch (Exception ex) + { + StreamWriter sw = new StreamWriter(Application.StartupPath + "\\log.txt", true); + sw.Write(ex.Message + " " + DateTime.Now + "\r\n"); + sw.Close(); + } + } + + + } + + +} diff --git a/GetData_PLC/frmMain.resx b/GetData_PLC/frmMain.resx new file mode 100644 index 0000000..ba74c1c --- /dev/null +++ b/GetData_PLC/frmMain.resx @@ -0,0 +1,1667 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 138, 17 + + + 228, 17 + + + 318, 17 + + + + + AAABAAgAMDAQAAEABABoBgAAhgAAADAwAAABAAgAqA4AAO4GAAAgIAAAAQAIAKgIAACWFQAAEBAAAAEA + CABoBQAAPh4AAICAAAABACAAKAgBAKYjAAAwMAAAAQAgAKglAADOKwEAICAAAAEAIACoEAAAdlEBABAQ + AAABACAAaAQAAB5iAQAoAAAAMAAAAGAAAAABAAQAAAAAAIAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + gAAAgAAAAICAAIAAAACAAIAAgIAAAICAgADAwMAAAAD/AAD/AAAA//8A/wAAAP8A/wD//wAA////AAAA + AAAAAAAAAAAIh4eAAAAAAAAAAAAAAAAAAAAAAAAAAIh5iYmHcAAAAAAAAAAAAAAAAAAAAAAACHeIt3iY + mHAAAAAAAAAAAAAAAAAAAAAIh4uHd5g4e3dwAAAAAAAAAAAAAAAAAAiHuHh4iIt5d5iYcAAAAAAAAAAA + AAAACIe4h4i3mJd4mHeDdwAAAAAAAAAAAAAAiIiId5cRI3ERc3l3mDAAAAAAAAAAAAAAi4iJMXEAAAAA + Bzc4c3cAAAAAAAAAAAAIiItwAQAHeIcxAAARd5eAAAAAAAAAAAAIiIgQAAeHt5iIMAABd3OAAAAAAAAA + AAiIuIMAEHt4eImDhwAAOXl3gAAAAAAAAIi4iBAQB4eHh4uHmBAAB3c3mAAAAAAACIiIhxADB4iLiId4 + hzAAADeYc4AAAAAAiIi4gwAQF7iIiIi3mBABABhzmJgAAAAAiLgYhxB3iIiIiLiIi4hxAHNxc3cAAAAA + iPcYiweIiIj4j4iLd4iIMHiRd5gAAAAIi4MTiIiP+IiIiIiIeI+IiYMQN3OAAAAIiIcReIi/9jiIiIi4 + lH/4i3kxU5iAAAAIuIkxeIj/hkB4i4iHQGj7h4EQOHlwAAAIiLcRi/iPhgAI+IuAAGj4d5cReXewAAAI + iIcRiIiP9ndoiIiEd2+Ih4MBNzeAAAAAiIMRiIi//gdviIuGZI/4mDcQF3kAAAAAAJETiL+P+OeIiIiH + fo+It5cRGQAAAAAAAJEDiIiI//j4iLiIj4iDd3cQMQAAAAAACZERe3t4eIh4uIi3eIeXeXMREXAAAAAA + CRkRd5eXt3k3d5dxeXd5c3kBEZAAAAAACVkRl3EleRB3mDeTA3kwNTURERAAAAAAeZGRkRcBAABzc3d1 + AAABcRERGRAAAAAAeZkZGREAEANTeXk3EBAAERERERAAAAAACRlZEZGQABc5d5c5cQAREREZGRAAAAAA + CZmZlRkRkRFTlxNRERERERERERAAAAAACVkZmZkRERkREREREREREZGRkVAAAAAAB5mZmZWZmRERERER + ERERkZEREYAAAAAAAJlZlZmZWZmZGRkZkZGZGVGVkQAAAAAAAJmZmZmZmZWZWZkZWRlZGRkRFwAAAAAA + AAmVmZnZmY+IiHiIh5mRkZGRkAAAAAAAAAWZmdmZmfifj4+JiJkZlZGRcAAAAAAAAACZmZmZmImY//+J + n5WZGZGRAAAAAAAAAAB5mZmZnfiYiPiZj1mRlZGYAAAAAAAAAAAJnZmdl/+Z+X+d/5mZkZGQAAAAAAAA + AAAAmZmZmf+JmZmY/5GVmRkAAAAAAAAAAAAACZmZmY/5n4nf95mZGVAAAAAAAAAAAAAACJnZmZj4//iP + iZGVmQAAAAAAAAAAAAAAAImZmZnY//+JmZkZEAAAAAAAAAAAAAAAAACZnZmZmZmZkZWZAAAAAAAAAAAA + AAAAAAANmZmZmZmZWZlwAAAAAAAAAAAAAAAAAAAACJmZWZWZmXAAAAAAAAAAAAAAAAAAAAAAAACNmVl4 + AAAAAAAAAAAAAP//+B///wAA///AB///AAD//4AB//8AAP/+AAB//wAA//gAAB//AAD/4AAAD/8AAP/A + AAAH/wAA/8AAAAP/AAD/gAAAAf8AAP+AAAAB/wAA/gAAAAB/AAD8AAAAAD8AAPgAAAAAHwAA8AAAAAAP + AADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAPAA + AAAADwAA/AAAAAA/AAD8AAAAAD8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPAAAAAAHwAA8AAAAAAf + AAD4AAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPwAAAAAPwAA/AAAAAA/AAD+AAAAAH8AAP4A + AAAAfwAA/wAAAAD/AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/AAD/4AAAB/8AAP/gAAAP/wAA//AAAB// + AAD//AAAP/8AAP/+AAB//wAA//+AAf//AAD///AP//8AACgAAAAwAAAAYAAAAAEACAAAAAAAAAkAAAAA + AAAAAAAAAAEAAAABAAAAAAAAAAAIABUJAgAYEAAAAAQUACEMCAA5CAAAORgQACkgCAA5LBAAAAQhAAgQ + JgARGScAAQk2AAAQOQAQGDIAFiA1AFIKAABjDAAASighAEI8KQBSRRgAa1kYAHdbFABKQSkAWk05AAAT + RgAQHEoAAAhSAAAYVwAYJEQAGChaACEqQgAhMEIAISxSACQyVQAxPFoAAABqAAIYYwAAAncACBB7ABAU + cwACImcAFDBrABAwcwApOGMAMTxjACEwcwAxQVoAM0NlADVIdwBSSUoAWlFCAERVdwBaYWMAhF0QAIx5 + KQCUeSEAnIIpALWEJQC1ojkAvaZCAJiMdwDGtkIA1rZaANvFRwDex1IA59d7AAEAiAASGIkABQCaABgc + lAAhKIQAKTWJACEolAApOJQAMTyUAAgAqAAQCKUACAC4ABAEtQAYEL0AJianADk4tQApRYQANUuIADlR + iAAxQ5gAOVGUAEZZiQBEWJcASmWMAFJlhABadYwASmKcAFJomQBadZwARkG5AEpjpQBTa6YAWXOrAFp3 + tQBjeKsAe32tAGV8twAIAMYAEADMABAA2QAjFtoAMSjOACkg1gAUAOoAGAD9ACYS6QAxHOcAIgT/ACkS + /QAxGP8AOSTnADUk+wBCNtoAQir/AEg0/QBSPPcAWlXOAGt9xgB7dc4Ac3HeAFJH6wBWR/wAZ1X/AGth + 5wBzZ+cAdWb/AHtx/wCEfd4AhHvvAIh3/wBngqkAc4ipAHOSpQBphLkAdYu8AHuYugBrh8gAc4bGAHOO + xgBzgs4Ac47OAHuOzgBzkswAc4bWAHOM1gB7i9YAc5TWAHuW1gB7m9YAe5beAHud3gCtpowAtbKMAIyS + pQCEkr0AlJ69AJyipQCcpr0Axs+tANvLqgDG17UA79+tAOvbvQD3560A7+e9APfnvQCEnMoAhILWAJSO + 2gCMltYAhJ7eAIyb3gCclt4AhqrIAJSozgCEo9oAnKzWAJym3gCcqt4AjLbeAJS33gClos4ApbTOAKm2 + 2gC6vNgAiILvAISc5wCMnucAjIb/AJSI+wCclvcApZ7/AIyk5wCEqucAjKznAISi7wCMpO8AjKzvAJSs + 6wCMsucAlrfuAIyq9wCUrvcAjLL3AJa2+ACtqucAtarvALW+5wCppP8Ata7/AK2+9wC9tP0ArcXWAL3b + 1gCcxu8AnMT4AKrI7AC1z+8AvdPvAKbM+gC5yvkAq9b9ALbc/AC65v8A3tfGAMjJ2ADb2dsA59/OAO/n + zgD358YA9+/WAM7H5wDO1+cAzMT/AMbb/wDe3/8A2uPrAMbt/wDM+P8A7OrtAO3u/wD37/8A7/P/APf1 + 9wD/9/cA//v3APf2/wD///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAubGZlbG6AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA15mXmZmTk5OTfZEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAACzncLMzZh9jY19jY19jgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAs8PM + 0dLSwpiXk31oaH19ZmiOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALPIzc3R0tLT0tTNspBoaGh9 + fWhoaI4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADky9LU1NTU0t/UspaSjWVlaGhmaI19ZmhmAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAOTT1N/j38ibaGMiDA8yLgwMIl5jZmVoaGhmYwAAAAAAAAAAAAAAAAAAAAAA + AAAAANPU4+PjjS4uWQsEBAAEBAAEAAxZLi5fZmhlZmYAAAAAAAAAAAAAAAAAAAAAAAAA2tLj4+OKBAQE + BAQPWY6WnI5cDAQABAAENWRmZGO+AAAAAAAAAAAAAAAAAAAAAAAA0d/l5eMMBAQEBFuUlpaWlpaWsjUA + AAQAD2RjZl9nAAAAAAAAAAAAAAAAAAAAAOTO1OXl3zUEBAsLX5acwrLCnJaUlJw1AQAEAi5jX19fjrYA + AAAAAAAAAAAAAAAA4+Pf4+XlIAQECw8kssnQ0NDQzbKblJWyDAAABAAgX2RfZWiNAAAAAAAAAAAAAADj + 5eXj4+WLBAQLHgtk0N/f39/U1M+ylpSWMAAABAQANWhfZmVljgAAAAAAAAAAAPLj5ua74+VcBAsPCwuL + 3+Xl5eXm5d/KnJaWNQQEBAQEJI1jXmJkZb8AAAAAAAAAAOPl5rUs3+VdCwswj97Q5ef19efn5uXQspqW + nMpmDwQEMpBmHWJkZI0AAAAAAAAAAOPm5YoqsuO1C4zl3uDk5fX29vb15+ba056W4ubg1FkEaJpZHVpj + ZWUAAAAAAAAA5t/f32QaVt7jtefl+P2n3PX29vb15+bjz56hp/f049NolmgfGlZiY2W4AAAAAAAA4dTU + 02MaKpLj5+fj/fs7E77n5+fn5eXj0mcHO/705cqWkFUdGlViZWSuAAAAAAAA49TU014qKorj5+fl/ao3 + ERE24ePj49/cMxIGN+v347KWfVQqGlVjY2SRAAAAAAAA4dPT018dKpbl9efi/akWAgIIpufn49SgAwUC + F6r33p6WjlYdGlhlY2OUAAAAAAAA5uPf52AdKtDm5+fm/e04ND4VqOfn49+fCT40Ouz33p6WjVkaGlZk + ZWS6AAAAAAAAAOPl5lUdKuPl5+fj/f1CFDQ83efn5d+kOTQYQvv00J6UZF8OGi9iY2gAAAAAAAAAAAAA + bCgdLOPl5efj+v2rQT9D5+fm5d/PQD1CrfvwspCKZF8OGidSAAAAAAAAAAAAAAAAaygdK9/f4+Pj4/39 + 7qzh5ufm49/Tv6fo6u+PjWZkZF8OGidGAAAAAAAAAAAAAABsak8dG46NjY+SlrXc77aPu7u7u5yWio+l + o41mZGRjY14NHUZGUwAAAAAAAAAAAABqamtGJmNkZDWKZY1ojVsijY2NZY1lIF9kZmRiYzJeXlocJ0ZG + RgAAAAAAAAAAAABqampGUFJaXh4eWV9bIgQyZmZkZmRkIgQtVl4yDyJaWCklJUZGRgAAAAAAAAAAAIRq + ampQTU9OVy0EBAQKBARfY2NiY2JeVQQKBAQEBFVJJSUlREZGRgAAAAAAAAAAAIRqamtrTUZPRkcNBAoE + BCJeXl5eWlpaWR4EBAoEDSklJSVERkZGRgAAAAAAAAAAAABqa2tra09GT09EDQQEHlpaWFpaWFpYWlgP + BAQNJSUlJ0ZGRk5GRgAAAAAAAAAAAABqa2prb2trTUZQTUZGRUdKS0tMTElLSEUnJSclJSVETU5NRkZG + TgAAAAAAAAAAAABra29vb29vb29PRk1GRkZEREREREQnJycnJycnRk1QTU1ORkZGUgAAAAAAAAAAAACA + a29vb3Bwb29wcGpQRkZORkZERERERERETk9pUE9PT01NRk5GfgAAAAAAAAAAAAAAa29vcG9wcHBwc3Bw + cGtqaU9OTU9PT2ppT09QT09PT01NTkZGAAAAAAAAAAAAAAAAcm9vcHBwcHBwcHBwcHRva2tra2ppT1FP + ampqamlqT09NRkZhAAAAAAAAAAAAAAAAAG9vcHBwcHBwcHBwiOrA1bCHr7C9wOp8a2tramppT09PTU0A + AAAAAAAAAAAAAAAAAHJvcHBwcHBwcHB06sF09/f39/fvdLTva2trampqak9PTWEAAAAAAAAAAAAAAAAA + AABvcHBwcHBwcHCB9HVw2/f79/fFcHvqbmtqa2pqaU9pUAAAAAAAAAAAAAAAAAAAAACBcHBwcHBwcHCF + 98Vwhv7z+v6BcNb0eG9va2praWlPfwAAAAAAAAAAAAAAAAAAAAAAdHBwcHBwcHCF/fh0efp5gfhzev33 + eG9ra2pqamptAAAAAAAAAAAAAAAAAAAAAAAAAHBwcHBwcHB5/f3FcHl0c3pw2/33b2tra2pqamoAAAAA + AAAAAAAAAAAAAAAAAAAAAABwcHBwcHBw2f3+dHPx2XB6/f3Bb2trampqagAAAAAAAAAAAAAAAAAAAAAA + AAAAAACJcHBwcHBwdNv9x/H9/cfx/cZva29ra2pqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiXBwcHBw + cHOC8f39/f7bgW9va2tramsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0cHBwc3NwcHN0dHBvb29r + b2prbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgXNwc3BwcHBwb29wb2tvamuDAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCc3BwcHBvcG9va2tsgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACGe3dxcXaAiAAAAAAAAAAAAAAAAAAAAAAAAAAA///4H///AAD//8AH//8AAP// + gAH//wAA//4AAH//AAD/+AAAH/8AAP/gAAAP/wAA/8AAAAf/AAD/wAAAA/8AAP+AAAAB/wAA/4AAAAH/ + AAD+AAAAAH8AAPwAAAAAPwAA+AAAAAAfAADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADgAAAAAAcAAOAA + AAAABwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA8AAAAAAPAAD8AAAAAD8AAPwAAAAAPwAA+AAAAAAf + AAD4AAAAAB8AAPgAAAAAHwAA8AAAAAAfAADwAAAAAB8AAPgAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPgA + AAAAHwAA/AAAAAA/AAD8AAAAAD8AAP4AAAAAfwAA/gAAAAB/AAD/AAAAAP8AAP8AAAAA/wAA/4AAAAH/ + AAD/wAAAA/8AAP/gAAAH/wAA/+AAAA//AAD/8AAAH/8AAP/8AAA//wAA//4AAH//AAD//4AB//8AAP// + 8A///wAAKAAAACAAAABAAAAAAQAIAAAAAAAABAAAAAAAAAAAAAAAAQAAAAEAAAAAAAAAAAgAAAIQAAAI + EAAAAhgAAAgYAAgMGAA5CAAAOTAYAAAAIQAADCEAAAQpAAgMKQAIESEACBIpABAYKQAQGDEAEBg5ABgk + OQAhLDkAQggAAEIoIQBCPCEAQjQxAHNnOQACF0oAARlTABgiQgAYKEIAGChKAAghVgAYJloAISpCACEq + SgAhMEoAITRSACk0UgApOFIAKThaAAECaQABAnUACCBjABAsawApPGsAMTxjACE8ewAxQVIAOUljADFB + awA5SWsAOU17AFpRQgBjUVoAQlFrAEJRewB7dXsAlHkpAJh7NQCcjjkApZY5AK2SSgDOsnMAAwOHABQY + iAAFAJgAEAqcABgkiAAhKYkAKTScAAgAqQAQEKUACAC6ABAEuQAhHKUAKSitAClJjAA5R5gAOV2cAEJZ + hABKWYQAQlmMAEJVlwBSZYwAUmmMAFp1jABKYZQAQmGcAEpinABKaZwAUmmUAFJlnABSaZwAWnGcAGNx + nABSSb0ASmWlAFJpqABacaUAUnGtAFpzrQBjeaUAY3WtAGN5rQBje7UAa321AGN9vQBrfb0ACADGABAA + zAAQANoAKRjOACUY2gA2KNsAFADrABgA/QAhDOsAKRTnACMI/wAzGf8AOSjnADcj+gBCOM4AQiz3AEo4 + /wBaTd4AWlfWAGNZzgBracoAc23GAGt9xgBzbd4AWknvAFhG/wBjWe8AZ1f/AHNd/wB7be8AdWb9AIh7 + 7wBrgqUAc5KtAGeEuQBzhrUAe461AHOOvQB7nr0Aa4bGAGuKxgBzjMYAc4bOAHONzgB7is4Ac5LGAHuV + xgBzks4Ae57OAHuK1gBzit4Ac5bWAHuW1gB7mtYAe5TeAHue3gCElrUApa6tANayhADv24wA69mcAPfn + nADGw60Azte9AISGzgCEmsYAhJ7OAIyG3gCMltYAhKbOAJSmxgCUrs4AnK7OAISq1gCMqtYAhKbeAIyq + 3gCcqtYApb7OAK221gCtutYArbreALW63gC9ut4AhJvnAIye5wCUjP8AhKrnAIys5wCMpu8AjK7vAJSm + 5wCMsucAlLbnAJy+5wCUtu8AlLrvAJy+7wCMrvcAlK73AJSz9wCUuvcAnL73ALWy5wC1vOcArar3AKW+ + 9wC9uv8Axrz7ALXT3gCcxfcAtcPnALXP7wCt0+8Atd/vAKXH9wCtx/cApc33AKXH/wClzf8Arc//ALXP + 9wCt1PcApdP/AK3V/wCt3P8AtdP3ALXb9wC92/cAtdP/ALXd/wC14/8Aveb/AL3r/wDG284AzsfvAMrZ + 6wDe2+sAxsP/ANbL/wDe2/8A1uP3AMv4/wDr6e0A6+n7APfz9wD/+/cA9/f/AP///wAAAAAAAAAAAAAA + AAAA06+cl6+9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA06G/v5WBgWpqvAAAAAAAAAAAAAAAAAAAAAAA + AAAA2sDEzs6/oZZpaWpoaLsAAAAAAAAAAAAAAAAAAAAAAMbOzs7Q0LegkmdnZ2dqZ44AAAAAAAAAAAAA + AAAAAADN2eHHlGMhDSASDSFbZWdnZ2QAAAAAAAAAAAAAAAAA1dnhtQ8FDg0xUlMvBg0BD1llYbEAAAAA + AAAAAAAAAADO5+cvBQUkk5qalpaZEwEBJWFbXQAAAAAAAAAAAADj2eHoLgUMG6DDx8O2n5aYAwEBIltb + Z5kAAAAAAAAA7Ofm5pEFDBA2y+Dg3tHDmpogAQICTmNjY6wAAAAAAADl6FjgjAocVK3n7+/u6MyimmlP + DgVOZy1iYwAAAAAA6+XoHrTMNdzb8+35+fnv4MKf8+nDJpNYHmJjuAAAAADf0NAZLeDu5f89N/Dw7+jh + wzSl+tmiaSkZX2OZAAAAANHQxBoq4PDq/zkUF9jn4bkVBzn6zJppKR5iYmkAAAAA5NDlGkvn7+3/OjMW + 8fDmpAgzPPrJnmceGWNimQAAAAAA5Z0aTefu5/+mGDvd7uGyOBin+seUYR8ZTGYAAAAAAAAAbBpW2eDg + +P2nqu7u5sqpp/q7aWZhHxlAAAAAAAAAAHxsPitnaWmQsbOLsLCblFyjj2NjYGAfKECAAAAAAAAAbGxF + RlZQI1tcLCJmZmNjGzBVUBtWTCcoQEoAAAAAAABsbGxFRUQOBQkFMmBgWFcrBQUFEUMnJ0BARgAAAAAA + AGxtbGxFRT4LAh1RUVFRUVERBQsnJyhAQEBJAAAAAAAAcG1tcW1HRUVAPj9CQ0NCPygoJyhARUVARV4A + AAAAAACKbXFxcnFxbEVAQEA+Pj4+PkBFRUVFRUBAAAAAAAAAAABtcXJycnJycnJtbUdHR2trR0dsR0dF + RUEAAAAAAAAAAINycnJycnJyiK6CfX1/q35sbGxsR0VFfwAAAAAAAAAAAHFycnJycnbSdvr6+vJ2vm1t + bGxsRUgAAAAAAAAAAAAAiXFycnJyhPRy1Pv8wXb0cG1tbGxHAAAAAAAAAAAAAAAAdnJycnJ7/4mJhIeE + wfxvbW1sa3kAAAAAAAAAAAAAAAAAdXJycnX3+3WHhnb+9XFtbWxuAAAAAAAAAAAAAAAAAAAAdnJycnb2 + 9f//9dZ0bW1sbwAAAAAAAAAAAAAAAAAAAAAAdnJycnJ7h4Z6bW1tbXAAAAAAAAAAAAAAAAAAAAAAAAAA + iXVycnJycXJxbXOKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGdnNzd4UAAAAAAAAAAAAAAAAA//gf///g + B///gAH//wAA//4AAH/8AAA//AAAP/AAAA/gAAAH4AAAB8AAAAPAAAADwAAAA8AAAAPgAAAH8AAAD+AA + AAfgAAAH4AAAB+AAAAfgAAAH4AAAD/AAAA/wAAAP+AAAH/gAAD/8AAA//gAAf/8AAP//gAH//8AD///4 + H/8oAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAACAAABBgAAAgYAAAE + IQAIECkAQiwhAEo0IQAhLEoAISxSACEwUgApNFIAKThSACk0WgApOFoAEBBjAAAAewAQHHMAEBR7ACk4 + ewAxQWMAMUVjAClFewA5TXsAQllzAEJVewBKWXsArZ5rALWucwAICIQAAACMAAgAjAAQFIwACAiUAAgA + nAAhMJQACAClAAgArQAIALUACAC9ACEcrQAxRYQAMU2MADlJnABCVYwAQlmcAEpdnABKYYQAUmmMAFJl + lABSaZwASmWlAEptpQBabaUAUnGlAGN5pQBjda0AY321AGt9tQAQAMYAEADOABAA1gAQAN4AGATeABgI + 3gA5MMYAOTDOABAA5wAYAP8AIQzvACkQ5wAhDPcAKRD/ADEU/wBCOMYASjznAEI07wBSOP8AUjz/AFpN + 1gBSSd4AUkH/AFpF/wB7bfcAhHnnAIR17wBrgq0AY4K1AGOGvQBrhr0Ac4q9AHuOvQBzkr0Aa4LGAHOO + xgBzhs4Ac5LGAHOWzgB7ns4Ae47WAHOW1gB7ltYAxrqcAM7DnACUnsYAhJ7eAISi3gCEpt4AnKrWAIyy + 1gCUttYApa7OAK261gCtut4AnJL/AJyW/wCMqu8AlL7nAJy+7wCUsvcApbLnAKXD3gCtz94AnMP3ALXD + 7wC12+8ArcP3AK3L9wCtz/cApcv/AK3X/wC14/cAteP/ANbXzgDO09YA1tfWAO/v3gDOy/cAzs/3AM7L + /wDG2/cA3tf3AM7j/wDG7/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAHhjX2wAAAAA + AAAAAAAAfHR3aV05Om8AAAAAAAAAfnYZCg4MCBQ4aAAAAAAAjIEYBVdqZTcBCzJwAAAAjnVtBS+AgnZk + FAMyM3EAAIA2Ym6Heo+CW4ZgMxZaAAB7NFiEZwd9eQZmaiopOQAAACNhgogcg3YbhV4XEQAAAAAmKzFW + MFxZGjUsEx4AAABUPCYSBA0uLQkCDxAiAAAAAD5DPCUhICAdHyIkIgAAAABGRERES0JBSjs7JigAAAAA + AERESVONiVVAPCcAAAAAAABRREiLUlGJQDxPAAAAAAAAAE5ETnNzTD1QAAAAAAAAAAAAAE5HRUsAAAAA + AAD8PwAA8A8AAOAHAADAAwAAgAEAAIABAACAAQAAwAMAAMADAACAAwAAwAMAAMADAADgBwAA4AcAAPAP + AAD8PwAAKAAAAIAAAAAAAQAAAQAgAAAAAAAACAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAc4LOCHOCzkJzgs5zc4LOjHOCzqVzgs69c4LOxnOC + ztZzgsbOa4LGxmuCxrVrfcaUa4LGhGuCxmNrgsYpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzhs4Yc4LOe3OC + zs5zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OC + xv9rfcb3a33GnGt9xlIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAABzhs45c4bOrXOCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OC + zv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9rfcb/a33G/2t9ve9reb17a3m9CAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7is45c4bOvXOGzv9zhs7/c4LO/3OC + zv9zhtb/c4bW/3OC1v9zgtb/c4LO/3OGzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OC + zv9zgs7/c33O/3N9xv9rfcb/a329/2t5vf9reb33a3m9hGN5vQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAB7jtYhc4bOrXOGzv9zhs7/c4bO/3OGzv9zhtb/c4bW/3OK1v9zitb/e4rW/3uK1v97jtb/e4rW/3OK + 1v9zhs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/c4LO/3OCzv9zgs7/a33G/2t9xv9rfb3/a3m9/2t5 + vf9reb3/Y3m172N5tWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7ktYQe4rOnHuKzv9zitb/c4rW/3OK1v97itb/e47W/3uS + 3v97kt7/e5be/4Sa5/+Enuf/hJ7n/4Se5/97lt7/c4rO/2uGxv9rgsb/a33G/2t9xv9rfcb/a33G/2t9 + xv9rfcb/a33G/2t9xv9rfcb/a329/2t9vf9reb3/a3m9/2t5vf9reb3/Y3m1/2N1tedjdbVaAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEktYIe47WhHuK + zv97jtb/e5Le/3uW3v97lt7/e5be/4Sa3v+Enuf/hJ7n/4Si5/+Mpu//jKr3/4yu9/+Mqu//e5re/3OK + zv9rhsb/a4LG/2t9vf9rfb3/a329/2t9vf9rfb3/a329/2t9vf9rfb3/a329/2t9vf9rfb3/a329/2t9 + vf9reb3/a3m9/2t5vf9jebX/Y3W1/2N1tf9jdbXOY3W1SgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACEktYIe47OhHuOzveEktb/hJre/4Sa5/+Enuf/hKLn/4Si5/+Eou//jKbv/4ym + 7/+Mqu//jKr3/5Sy9/+Utv//lK73/4Se3v9zhsb/a4LG/2uCxv9rgsb/a329/2t9vf9rfb3/a329/2t9 + vf9rfb3/a329/2t9vf9rfb3/a329/2t9vf9rfb3/a329/2t9vf9rfb3/a3m9/2t5vf9jebX/Y3m1/2N1 + tf9jdbX/Y3W1xmN1tUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEktYQhI7OjHuKzveEjtb/hJbe/4Se + 5/+Eouf/jKLv/4ym7/+Mpu//jKbv/4yq9/+Mrvf/lK73/5Sy//+Utv//lLb//5Sy9/+Eouf/e5LW/3OG + zv9zhs7/a4bO/2uCxv9rgsb/a4LG/2uCxv9rfcb/a329/2t9vf9rfb3/Y329/2N9vf9jfb3/a329/2t9 + vf9rfb3/a329/2t9vf9rfb3/a329/2N5tf9jebX/Y3m1/2N5tf9jdbX/Y3W1/2N1rc5jda1KAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACEktYQhI7WjHuOzv+Ejtb/hJLe/4Sa3v+Mouf/jKbv/4ym7/+Mpu//jKrv/4yq9/+Mqvf/jK73/5Sy + //+Utv//nLb//5S2//+Usvf/jKbv/3uW3v97jt7/c4rW/3OK1v9zitb/c4bW/3OG1v9rgtb/a4LO/2uC + zv9rgs7/a4LG/2N9vf9jfb3/Y329/2N9vf9jfb3/a329/2uCvf9rgr3/a4K9/2t9vf9rfb3/a329/2t9 + vf9rebX/Y3m1/2N5tf9jebX/Y3W1/2N1tf9jca3OY3WtSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhI7We3uO1veEjtb/hJbW/4Sa3v+Mnuf/jKLn/4ym + 7/+Mpu//jKbv/4yq7/+Mqvf/jK73/5Su9/+Usv//lLb//5S2//+Utv//lK73/4ym7/+Enuf/e5bn/3uS + 3v97lt7/e5be/3uW3v97kt7/e5Le/3OO1v9zitb/c4bW/2uCzv9rgsb/a329/2N9tf9jebX/Y321/2N9 + tf9rfb3/a4K9/2uCvf9rgr3/a4K9/2t9vf9rfb3/a329/2t9vf9rfbX/Y3m1/2N5tf9jebX/Y3m1/2N1 + tf9jda3/WnGtxlpxrTEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhJLWSnuK + 1t6Ejtb/hJbe/4Sa3v+Mouf/jKbv/4ym7/+Mpu//jKbv/4ym7/+Mpu//jKr3/4yu9/+Urvf/lLL//5S2 + //+Usv//lLL3/4yq9/+Mqvf/jKrv/4ym7/+Mqu//jK7v/5Sy7/+Usu//lLLv/4yq5/+Mpuf/hKLn/4Se + 3v97ltb/c47O/2uCxv9jfb3/Y3m1/2N5tf9jfbX/Y321/2N9tf9rfb3/a329/2uCvf9rgr3/a329/2t9 + vf9rgr3/a4K9/2t9vf9rfb3/a321/2N5tf9jebX/Y3m1/2N1tf9jda3/WnGt/1pxpaVaca0QAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAhJbeCHuO1q17jtb/hJLe/4Sa3v+Mouf/jKrv/4yq7/+Mru//jK7v/4yq + 7/+Mqu//jKrv/4yq7/+Mqvf/lK73/5Su9/+Usv//lK73/5Su9/+Urvf/jKr3/4yq9/+Mqu//lLL3/5S2 + 9/+cvvf/nL73/5y+9/+Utu//lLLv/4ym5/+Eouf/hJ7e/3uW1v9zjs7/a4bG/2t9vf9jfbX/Y3m1/2N5 + tf9jebX/Y321/2N9tf9jfb3/a329/2t9vf9rfb3/a329/2uCvf9rgr3/a4K9/2t9vf9rfb3/Y321/2N9 + tf9jebX/Y3m1/2N5tf9jda3/WnGt/1pxpe9acaVKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISa5zF7jtbnhJLe/4SW + 5/+Enuf/jKbv/5Su7/+Usvf/lLL3/5Sy9/+Usvf/lLL3/5Su9/+Mrvf/lK73/5Sy9/+Usvf/lLL3/5Su + 9/+Urvf/lK73/5Su9/+Urvf/nLr//6XD//+ly///rc///63T//+tz///pcv3/5y+9/+Utu//jKrn/4Si + 5/+Ent7/e5LW/3OKxv9rgr3/a4K9/2OCvf9jfb3/Y321/2N5tf9jebX/Y321/2N9tf9jfbX/a329/2t9 + vf9rfb3/a329/2t9vf9rgr3/a4K9/2uCvf9rfb3/a321/2N9tf9jfbX/Y3m1/2N5tf9jda3/WnWt/1pt + pf9abaWcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACEludShJbn/4Sa5/+Enu//jKbv/4yu9/+Usvf/lLb3/5S29/+Uuvf/nLr3/5S6 + 9/+Utvf/lLb3/5S29/+Utvf/lLb//5Sy9/+Urvf/lK73/5Sy9/+Utvf/pcP//6XP//+t0///rdP//63P + //+ly///nMP3/5Su5/+Eot7/e5rW/3uW1v97ltb/e5LO/3OOzv9rgr3/a4K9/2uCvf9rgr3/a4K9/2uC + vf9rgr3/Y329/2N9vf9jfbX/Y3m1/2N9tf9jfbX/Y321/2N9tf9jfbX/Y321/2t9vf9rfb3/a4K9/2uC + vf9rfb3/a329/2N9tf9jfbX/Y3m1/2N5tf9jda3/WnGt/1ptpf9SaZzGWm2cEAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhJ7va4Sa7/+Enu//jKb3/4yu + 9/+Usvf/lLb3/5y69/+cuvf/nL73/5y+9/+cvvf/nL73/5y69/+Utvf/lLb3/5y2//+Utv//lLL3/5Sy + 9/+Usvf/nLr3/6XH//+tz///lLbv/3uW1v9jgr3/Umml/0pdlP9CVYz/QlmM/0pdlP9KZZz/Um2l/1Jt + pf9SZZz/SmGc/0pdlP9KXZT/SmGc/0phnP9KZZz/Umml/1pxrf9jfbX/a4K9/2N9vf9jfbX/Y3m1/2N5 + tf9jfbX/Y321/2N9tf9jfbX/Y321/2N9tf9rfb3/a329/2t9vf9rfb3/a329/2t9tf9jfbX/Y3m1/2N5 + tf9jda3/WnGl/1ptnP9SZZTeUmmcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAISe92OEnvf/hKL3/4ym9/+Urvf/lLb3/5y+9/+cvvf/nMP3/5zD9/+cw/f/nMP3/5zD + 9/+cvvf/nLr3/5S69/+Utvf/nLr//5y6//+Utv//lLb//5y2//+Uru//a4bG/0phnP9CXZT/Um2t/0ph + lP85SXP/KTxa/yk8Wv8xRWv/Sl2M/1pxrf9SbaX/Um2l/1Jtpf9acaX/Um2l/zlRe/8xPGP/KTha/zlF + a/9KWYz/Umml/0phnP9CWZT/UmWc/2N5tf9jfbX/Y3m1/2N5tf9jebX/Y3m1/2N5tf9jebX/Y321/2N9 + tf9jfbX/a321/2t9vf9rfb3/a329/2N9tf9jfbX/Y3m1/2N1rf9ada3/WnGl/1JpnP9SZZTeUmmcEAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEovdChJ73/4Si9/+Mqvf/lLL3/5S6 + 9/+cvvf/nMP3/5zH//+lx///pcf//6XH//+lx///pcf//5zD9/+cvvf/lLb3/4Sm5/97ltb/c5LO/3OK + xv9jfb3/QlmU/zlRjP9aca3/a4rO/0pZjP8QFCH/AAAI/wAACP8AAAj/AAAI/wAACP8AAAD/CAwY/zlJ + c/9acaX/Ummc/yEoQv8AAAj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAj/IShC/1JpnP9SZZz/OU2E/zlN + hP9SZZz/WnGt/2N1rf9jda3/Y3mt/2N5tf9jebX/Y3m1/2N9tf9jfbX/Y321/2N9tf9rfbX/a321/2N9 + tf9jfbX/Y3m1/2N1rf9acaX/Wm2l/1JpnP9SZZTGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAhKL3GISe9++Eovf/jKr3/5Sy9/+Uuvf/nL73/5zH//+lx///pcv//6XL//+ly///pcv//6XL + //+lx///nMP//4yu5/9rhr3/WnWt/1pxpf9abaX/Sl2U/yk8c/9KYZT/WnWt/2N5tf8YHDH/AAAI/wAA + EP8AABD/AAAQ/wAAEP8AABD/AAAI/wAACP8AAAj/AAAA/xggOf8ACBD/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAj/AAAI/wAACP8AAAj/AAAI/zlNc/9jebX/UmWc/zFFe/9KZZz/WnGl/1pxpf9aca3/WnWt/2N1 + rf9jda3/Y3m1/2N5tf9jfbX/Y321/2N9tf9jfbX/Y321/2N9tf9jebX/Y3Wt/1pxrf9acaX/Wm2c/1Jp + nP9SaZyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEnvethJ73/4ym9/+Usvf/nLr3/5zD + 9/+cw/f/pcv//6XL//+ly///pcv//6XL//+ly///pcv//6XL//+Ept7/WnWt/1pxpf9acaX/WnGl/1px + rf9acaX/Ummc/1JtnP9acaX/CBAY/wAAEP8AABD/AAQQ/wAAEP8ABBD/AAQQ/wAEEP8AABD/AAAI/wAA + CP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAA/zFF + Y/9ada3/SmGU/1ptpf9ada3/WnWt/1p1rf9ada3/Y3m1/1p1rf9ada3/Y3Wt/2N5tf9jebX/Y3m1/2N9 + tf9jfbX/Y321/2N5tf9jea3/WnWt/1pxpf9acaX/Wm2l/1JpnP9SaZwxAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAhKL3QoSe9/+Eovf/jK73/5S69/+cw/f/nMf3/6XL//+ly///pcv//6XL//+ly///pcv//6XL + //+ly///lLbn/0pdjP8hLEr/CBAh/wAEEP8ABBD/CBAh/yEwSv9KYZT/Y3mt/xggMf8AABD/AAAQ/wAE + EP8ABBD/AAQQ/wAEEP8ABBD/AAQY/wAEEP8AAAj/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAI/wAA + CP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAA/0pdjP9ada3/OUVr/xggMf8ACBD/AAAI/wAI + CP8QHCn/MUFj/1pxpf9acaX/WnWt/2N1rf9jea3/Y3m1/2N5tf9jebX/Y3m1/2N5rf9jda3/WnWt/1px + pf9acaX/Wm2l/1JpnM4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEnvfGhKL3/4yq9/+Utvf/nMP3/5zH + //+ly///pcv//6XP//+lz///pcv//6XL//+ly///pcv//5zH5/8hKDn/AAAI/wAAEP8AABD/AAQQ/wAE + EP8ABBD/AAAQ/wAACP8YIDn/AAAI/wAAEP8ABBD/AAQQ/wAEGP8ABBj/AAQY/wAEEP8ABBj/ISxC/0JN + a/9abYz/Y32l/3OSvf9zirX/Y32c/1JlhP85RVr/EBgh/wAAAP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAj/CBAY/wgMGP8AAAD/AAAI/wAACP8AAAj/AAAI/wAACP8AAAD/AAQI/zlJa/9acaX/WnGl/1p1 + rf9jda3/Y3Wt/2N5rf9jea3/Y3mt/2N1rf9ada3/WnWt/1pxpf9abaX/Ummc/1JpnEIAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAhKL3KYSe9/+Epvf/jLL3/5y+9/+cx///pcv//6XL//+lz///pc///6XP//+lz///pc///6XL + 9/+ly+//EBgp/wAAEP8ABBD/AAQQ/wAEEP8ABBD/AAQQ/wAAEP8AABD/AAQQ/wAAEP8ABBD/AAQQ/wAE + EP8ABBj/AAQQ/wAEEP8xPFr/Y3mt/3ue1v+Eot7/e5rW/3uazv97mtb/e5rW/4Se1v+Eotb/jKbe/5Sy + 5/+Uuu//jKrW/1ptjP8YJDH/AAAA/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAj/AAAI/wAACP8AAAj/AAAA/zE8Wv9acaX/WnGl/1p1rf9jda3/Y3Wt/2N1rf9jda3/Y3Wt/1p1 + rf9acaX/WnGl/1ptnP9SaZz/UmmctQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEnveMhKL3/4yq9/+Utvf/nMP3/6XL + //+lz///pc///6XT//+l0///pc///6XP//+lz///rdf//zFBUv8AABD/AAAQ/wAEEP8ABBD/AAQQ/wAE + EP8ABBD/AAQQ/wAEEP8ABBD/AAQQ/wAEEP8ABBj/AAQQ/wAIGP9CUXv/c5LO/3uW1v9zjs7/c47O/3OO + zv9zjs7/c47O/3OOzv9zjs7/c5LO/3OSzv9zls7/e5rW/3ua1v+Entb/jKre/5zD7/+Eosb/KTRC/wAA + AP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAA/0pd + jP9abaX/WnGl/1pxrf9ada3/WnWt/1p1rf9ada3/WnWt/1pxpf9abaX/Ummc/1JpnP9SaZz/UmmcCAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAISe79aEpvf/jK73/5y69/+lx///pc///6XT//+t0///rdP//63T//+t0///pc///6XP + //+Uut7/AAAI/wAEEP8ABBD/AAQQ/wAEGP8ABBj/AAQY/wAEGP8ABBj/AAQQ/wAEGP8ABBj/AAQY/wAA + EP8pOFr/c47O/3OOzv9zjs7/c47O/3OOzv9zjs7/c47O/3OOzv9zjs7/c47O/3OOzv9zjs7/c47O/3OO + zv9zjs7/c5LO/3OSzv97ltb/hJ7W/4yq3v+cw+//e5a1/xAUGP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/GCQx/1pxrf9acaX/WnGl/1pxrf9aca3/WnGl/1px + pf9acaX/Wm2l/1JpnP9SaZz/Ummc/1JpnP9SaZxaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACMqu8IhKLv/4yq9/+Utvf/nMP//6XL + //+l0///rdP//63X//+t1///rdP//63T//+lz///pc///2N5lP8AAAj/AAQQ/wAEEP8ABBj/AAgY/wAI + GP8ACBj/AAgY/wAIGP8ACBj/AAgY/wAEGP8ABBD/UmGU/3OS1v9zjs7/c47O/3OOzv9zjs7/c47O/3OO + zv9zks7/c5LO/3OSzv9zjs7/c47O/3OOzv9zjs7/c47O/3OOzv9zjs7/c47O/3OOzv9zks7/e5bW/4Se + 1v+Mqt7/lLrn/ykwQv8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAj/WnGl/1pxpf9acaX/WnGl/1pxpf9acaX/WnGl/1ptpf9SaZz/Ummc/1JllP9SZZT/Ummc/1Jp + nJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAhJ7nGISe51qMqu//lLL3/5y+9/+lx///pc///63T//+t1///rdf//63X//+t1///rdP//63T + //+ly/f/OUlr/wAAEP8ABBD/AAQY/wAEGP8ACBj/AAgh/wAIIf8ACCH/AAgh/wAIGP8ABBj/AAgQ/2N5 + rf9zks7/c47O/3OOzv9zjs7/c5LO/3OSzv9zktb/e5bW/3uW1v9zltb/e5bW/3OW1v9zks7/c5LO/3OS + zv9zjs7/c47O/3OOzv9zjs7/c47O/3OOzv9zks7/c5LO/3uW1v+Entb/lLrv/zlFWv8AAAj/AAAI/wAA + CP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAAAP9SaZz/Wm2l/1pxpf9acaX/WnGl/1pt + pf9abZz/Ummc/1JpnP9SZZT/UmWU/1JllP9SZZT/Ummczlp1rSlada0YAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUsu9KhKLnrXua3vd7kt7/e5rn/4yy9/+Uuvf/nMf//6XP + //+t0///rdP//63X//+t1///rdf//63T//+t1///lLLn/1pxpf8hLEr/AAQQ/wAEEP8ABBj/AAQY/wAI + If8ACCH/AAgh/wAIIf8ADCH/AAgh/wAEEP9jea3/c5LO/3OOzv9zks7/c5LO/3uW1v97ltb/e5rW/3ua + 1v97mtb/e57W/3ue1v97ntb/e5rW/3ua1v97mtb/e5bW/3OSzv9zks7/c47O/3OOzv9zjs7/c47O/3OO + zv9zjs7/c5LO/3OW1v97mtb/nL7v/yk4Sv8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAj/AAAA/0pdjP9acaX/Y3Wt/1pxpf9acaX/Wm2l/1JpnP9SZZT/UmWU/1JpnP9SZZT/UmWU/1Jl + lP9SaZz/Y3m1/2N9tf9jfb33Y329rWN9tUoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcvvchlLb3xpS2 + 9/+Uuvf/lLb3/4ym7/+Epuf/lLb3/5zD9/+ly///pc///63T//+t1///rdf//63X//+t1///td///1p1 + lP8IDBj/AAAI/wAAEP8ABBj/AAQY/wAEGP8ACBj/AAgh/wAMIf8ADCH/CBAp/wgQKf8ACBj/Sl2M/3ua + 3v9zks7/c5bW/3uW1v97mtb/e57W/4Se3v+Eot7/hKLe/4Sm3v+Ept7/hKbe/4Si3v+Eot7/hKLe/3ue + 3v97ntb/e5rW/3uW1v9zks7/c5LO/3OOzv9zjs7/c47O/3OOzv9zjs7/c5LO/3OW1v97ntb/nL7n/xAU + GP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAA/wAAAP8hKEL/WnGl/1px + pf9abaX/Ummc/1JllP9SZZT/Um2c/1JpnP9SZZT/UmWU/1JllP9aebX/Y321/2N9vf9jfbX/Y321/2N9 + tcZjfbUhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAnL73OZS6//ecuv//nL7//5zD//+cw///nL73/5Sy7/+cvvf/nMf3/6XP + //+t0///rdf//63X//+t1///rdf//7Xf//9KYXP/AAAI/wAEEP8ABBD/AAQY/wAEGP8ABBj/AAgY/wAI + If8ADCH/CBAp/wgUKf8QFDH/EBQp/xggOf+Mqu//e5rW/3ua1v97mtb/hJ7e/4Si3v+Ept7/hKrn/4yq + 5/+Mruf/jK7n/4yu5/+Mruf/jK7n/4yq5/+Mquf/hKbn/4Si3v+Ent7/e5rW/3uW1v9zks7/c5LO/3OO + zv9zjs7/c47O/3OOzv9zks7/c5LO/3OW1v+Ept7/c46t/wAAAP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8AAAD/AAAI/wAACP8AAAj/AAAI/wAACP8ICBD/UmWc/1ptpf9SaZz/UmWU/1JpnP9acaX/Wm2l/1Jp + lP9SZZT/UmWU/1p5tf9jfbX/Y321/2N9tf9jfbX/Y321/2N9tfdjfbU5AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJy+/0qcuv//nL7//5zH + //+ly///pc///6XL//+ly///lLr3/5zD9/+ly///pc///63T//+t1///rdf//63X//+12///a4KU/wAA + CP8ABBD/AAQQ/wAEEP8ABBj/AAgY/wAIGP8ACCH/CAwh/wgQKf8QGDH/EBw5/xAYMf8IDCH/Y321/4Si + 5/97nt7/hJ7e/4Si3v+Equf/jK7n/4yy5/+Utu//lLbv/5S27/+Utu//lLbv/5S27/+Usu//lLLv/4yu + 7/+Mruf/jKrn/4Sm3v+Eot7/hJ7e/3ua1v9zls7/c5LO/3OOzv9zjs7/c47O/3OOzv9zks7/c5LO/3ua + 1v+Utu//GCQx/wAACP8AAAj/AAAI/wAACP8AAAj/AAAA/wAAAP8AAAj/AAAI/wAACP8AAAj/AAAI/wAA + CP8IDBj/WnGl/1JpnP9SZZT/UmWU/1p1rf9ada3/Ummc/0pllP9KYZT/WnWt/2N9tf9jfbX/Y321/2N9 + tf9jfbX/Y321/2N9tf9jfbVKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcw/8xnL7//5zD//+ly///pdP//63X//+t2///rdP//6XP//+Uuvf/nMf3/6XP + //+t0///rdf//63X//+t1///rdf//5zH3v8ABAj/AAQQ/wAEEP8ABBj/AAQY/wAIGP8ACCH/AAwh/wgQ + Kf8IFDH/EBgx/xAcOf8QHDn/EBgx/xAUMf+Msvf/hKbn/4Sm3v+Mquf/jK7n/5Sy7/+Uuu//lLrv/5y6 + 7/+cvu//nLr3/5y+9/+Uuu//lLrv/5S67/+Uuu//lLbv/5Sy7/+Msu//jK7n/4Sq5/+Eot7/hJ7e/3ua + 1v97ls7/c5LO/3OOzv9zjs7/c47O/3OOzv9zks7/c5LO/3ue1v9acZT/AAAA/wAACP8AAAj/AAAI/wAA + AP8AAAD/AAAI/wAACP8AAAj/AAAI/wAACP8AAAj/AAAI/wAACP8hKEL/WnGl/0phlP9SZZT/Y3mt/2N9 + tf9acaX/UmWU/0phjP9acaX/Y321/2N9tf9jfbX/Y321/2N9tf9jfbX/Y321/2N9tf9jebUxAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnMP3GJy+/++cw///pcv3/6XT + 9/+t1///rdv//63b//+t2///pc///5y+9/+ly/f/pc///63T//+t1///rdf//63X//+13///OUla/wAE + EP8ABBj/AAQY/wAEGP8ACBj/AAgh/wAMIf8IECn/EBgx/xAcOf8QHDn/EBw5/xAcOf8IFCn/OUlr/4yy + 9/+Mquf/jK7n/5Sy7/+Utu//nL7v/5y+9/+cw/f/nMP3/5zD9/+cw/f/nMP3/5y+9/+cvvf/nL73/5y+ + 9/+cuvf/lLrv/5S27/+Usu//jK7n/4yq5/+Eot7/hJ7e/3ua1v9zls7/c5LO/3OOzv9zjs7/c47O/3OS + zv9zks7/c5bO/4Se1v8AAAD/AAAI/wAACP8AAAD/AAAA/wAACP8AAAj/AAAI/wAACP8AABD/AAAQ/wAA + EP8AAAj/AAAI/wAAAP9KXYz/SmGM/0phlP9jfbX/a4bG/1p1rf9SZZT/Sl2M/1pxpf9jfbX/Y321/2N9 + tf9jfbX/Y321/2N5tf9jebX/Y3m1/2N9te9jebUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcvve9nMP3/6XL9/+l0/f/rdf//63b//+t2///rdv//63b//+t0///nL73/6XL + //+lz///rdP//63X//+t1///rdf//63T9/8ABBD/AAQY/wAEGP8ABBj/AAgY/wAIIf8ADCH/CBAp/xAY + Mf8QHDn/ECA5/xAcOf8QHDn/EBQx/wAIGP9aeaX/jK7v/4yy7/+Utu//lLrv/5zD9/+cx/f/pcf3/6XH + 9/+ly/f/pcf3/6XH9/+cx/f/nMf3/5zD9/+cw/f/nMP3/5zD9/+cvvf/nL73/5S67/+Utu//jK7n/4yq + 5/+Eot7/e57e/3uW1v9zks7/c47O/3OOzv9zjs7/c5LO/3OSzv9zks7/hKLe/xAUGP8AAAj/AAAA/wAA + AP8AAAj/AAAI/wAACP8AABD/AAQQ/wAEEP8AABD/AAAQ/wAACP8AAAj/AAAI/yEsSv9KYZT/SmGM/2N9 + tf9risb/Y321/1JpnP9KYYz/Um2l/2N9tf9jfbX/Y321/1p5tf9aebX/Wnm1/1p5tf9jebX/Y3m1/2N9 + tb0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnL73Y5zD//+cx/f/pc/3/63X + //+t2///rdv//63b//+t2///rdv//63X//+cvvf/pcv3/6XT//+t0///rdf//63X//+t1///hKK1/wAA + CP8ABBj/AAQY/wAIGP8ACCH/AAwh/wgQKf8QGDH/EBw5/xAcOf8QHDn/EBgx/wgUKf8IDCH/AAQQ/3uW + zv+Usu//lLbv/5y+9/+cw/f/pcv3/6XP9/+lz///pc/3/6XP9/+lz/f/pc/3/6XL9/+ly/f/pcv3/6XL + 9/+ly/f/pcv3/6XH9/+cw/f/nL73/5S67/+Utu//jK7n/4yq5/+Eot7/e57W/3uW1v9zks7/c47O/3OO + zv9zks7/c5LO/3OSzv97mt7/ISxC/wAACP8AAAD/AAAI/wAACP8AAAj/AAQQ/wAEEP8ABBj/AAQY/wAE + EP8ABBD/AAAQ/wAAEP8AAAj/CBAY/1JllP9KXYz/Y3m1/2uKzv9jgr3/Um2l/0phjP9acaX/Y321/2N5 + tf9aca3/Um2t/1pxrf9ada3/WnWt/1p5rf9jebX/Y321/2N9tWMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJzD9wicvvfvnMf3/6XP9/+t1/f/rdv//63b//+t2///rdv//63b//+t2///rdv//5S6 + 9/+lx/f/pc///63T//+t1///rdf//63b//9jfZz/AAQQ/wAEGP8ABBj/AAgh/wAMIf8IECn/EBQx/xAY + Mf8QHDn/EBgx/wgUMf8IECn/AAwh/wAIIf8ABAj/hKbe/5S27/+cvvf/nMP3/6XL9/+tz/f/rdP//63X + //+t1///rdf//63X//+t0///rdP//63T//+t0///rdP//63T//+t0///pc/3/6XL9/+lx/f/nMP3/5S6 + 7/+Utu//jK7n/4Sm3v+Ent7/e5rW/3OSzv9zjs7/c47O/3OSzv9zks7/c5LO/3OW1v8pOFL/AAAA/wAA + CP8AAAj/AAAI/wAEEP8ABBj/AAgY/wAIGP8ACBj/AAQY/wAEEP8ABBD/AAQQ/wAEEP8ABBD/SmGM/0pd + jP9jfbX/c4rO/2uGxv9acaX/SmGU/1pxpf9jfbX/Um2t/0phpf9KZaX/Um2t/1pxrf9ada3/WnWt/1p5 + tf9jfbX/Y32172N5tQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnL73hJzD9/+ly/f/rdf//63b + //+t3///rd///63b//+t2///rdv//7Xj//97osb/jK7n/5zD9/+lz///rdP//63X//+t1///rdv//1p1 + lP8ABBj/AAQY/wAIGP8ACCH/CBAp/wgUMf8QGDH/EBgx/xAUMf8IECn/AAwh/wAIIf8ABBj/AAQQ/wAA + CP+Mruf/nLr3/5zD9/+ly/f/rdP//63X//+12///tdv//7Xb//+12///tdv//7Xb//+12///tdv//7Xb + //+12///tdv//63X//+t1///rdP//6XP9/+ly/f/nMP3/5S67/+Usu//jKrn/4Si3v97mtb/e5bW/3OS + zv9zjs7/c5LO/3OSzv9zks7/c5LW/yk4Uv8AAAD/AAAA/wAACP8AABD/AAQQ/wAEGP8ACBj/AAgY/wAI + GP8ACBj/AAQY/wAEEP8ABBD/AAQQ/wAAEP9KXYz/SmGM/2N9vf9zjs7/a4bG/1p1rf9SZZT/QlmU/1Jp + pf9KZaX/SmGl/1Jppf9Sba3/WnGt/1pxrf9ada3/WnWt/2N5tf9jfbX/Y321hAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAJzH9wicvvf3nMf3/6XT9/+t2///td///7Xj//+13///rd///63b//+14///KUF7/wAI + Of9rir3/nMP3/6XL9/+l0///rdP//63X//+t1///Y4Kc/wAEEP8ABBj/AAgh/wAMIf8IECn/EBQx/xAU + Mf8IECn/CBAp/wAEGP8ACCH/MUVS/2N9lP+Eqsb/jK7e/5S69/+cvvf/pcf3/6XP9/+t1///tdv//7Xf + //+14///teP//7Xj//+14///veP//7Xj//+14///teP//7Xf//+13///td///7Xf//+12///rdf//63T + 9/+ly/f/nMP3/5S27/+Mruf/hKbe/4Se1v97mtb/c5bW/3OSzv9zks7/c5LO/3OSzv9zjs7/Y4K1/2uG + vf9jfaX/QlFz/xAcKf8AAAj/AAQQ/wAEGP8ACBj/AAgY/wAIGP8ACBj/AAQY/wAEEP8ABBD/AAQQ/0pZ + jP9SaZz/a4bG/3OOzv9risb/Wnmt/1JtnP8IIFr/ABBK/zlRjP9KYaX/Ummt/1Jxrf9aca3/WnGt/1px + rf9ada3/Wnm1/2N9tf9jgr33Y321CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnL73c5zD9/+ly/f/rdf3/63b + //+13///td///63b//+t2///rdv//3uexv8AEEL/ABhK/0pppf+cvvf/nMf3/6XP9/+t0///rdP//63T + //97orX/AAQQ/wAEGP8ACCH/CBAp/wgUKf8IECn/CBAp/wAIGP8YIDH/c46t/63X9/+12/f/pc/3/5zD + 7/+Mqt7/lLbv/5zD9/+ly/f/rdP//7Xb//+14///vef//73r//+96///vev//73r//+96///vev//73n + //+95///veP//7Xj//+14///td///7Xf//+12///rdf//63T9/+lx/f/nL7v/5Sy5/+Mquf/hKLe/3ue + 1v97ltb/c5LW/3OS1v9zks7/c47O/2uOzv97ntb/lLbv/5S29/+Utv//nL7//4Si3v85TWv/AAQI/wAE + EP8ACBj/AAgY/wAIGP8ABBj/AAQY/wAEEP8IECH/Sl2M/1p1rf9risb/c47O/2uKxv9aea3/Um2c/wAc + Wv8AGFL/CBxS/1Jtrf9Sba3/Um2t/1Jxrf9aca3/WnGt/1pxrf9ada3/Y3m1/2OCvf9jgr1zAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcvvfWnMf3/6XT9/+t2/f/rd///7Xf//+t2///rd///63f//+15///QlWE/wAY + Sv8AHFL/GDBr/5zD9/+cw/f/pcv3/6XP9/+t0/f/rdP3/6XH5/8AABD/AAgY/wAMIf8IECn/CBAp/wgM + If8IECH/a4qc/7Xf//+t0/f/pc/v/6XL7/+cx+//lLbn/4Si3v+Mruf/nMP3/6XP9/+t1///teP//73r + ///G7///xvP//8bz///G8///xvP//8bz///G8///xu///8br//+96///vef//73j//+14///teP//7Xf + //+12///rdf//6XP9/+cw/f/lLbv/4yu5/+Epuf/hJ7e/3ua3v9zltb/c5bW/3OS1v9zks7/a4rG/5zH + 9/+lx/f/nMP3/5S69/+Usvf/jLL3/5S6//+Ept7/KTRS/wAACP8ACBj/AAgY/wAIGP8ABBj/AAQQ/xgk + Of9KYYz/a4K9/3OOzv9zjs7/a4rG/1p5rf9CXZT/ABha/wAYWv8AEEr/SmWl/1Jtrf9Sba3/UnGt/1Jx + rf9aca3/WnGt/1pxrf9aebX/Y329/2OCvdYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnMP3KZzD9/+cy/f/pdP3/63b + //+13///rdv//63b//+t2///rdv//73r//8hMGP/ABxS/wAcWv8AFFL/c5rO/5y+7/+lx/f/pc/3/6XT + 9/+l0/f/rdv//xgcMf8ACCH/AAwh/wgQKf8ACBj/OVFj/63b7/+13/f/rdf3/6XP7/+lx+//nL7v/5Sy + 5/+Ept7/e57e/3ue3v+lx/f/pc/3/7Xb//+95///xu///87z///O9///zvv//873///O9///zvf//873 + ///O9///xvP//8bv//+96///vef//73j//+94///teP//7Xf//+t1///rdP3/6XH9/+Uuu//jK7n/4Sq + 5/+Eouf/e57e/3ua1v9zltb/c5bW/3OS1v9zks7/rdf3/63T9/+tz/f/pcv3/5S69/+Usvf/lLL3/4yy + 9/+Uuv//a4K1/wgQIf8ABBj/AAgY/wAIGP8ABBD/MUFj/1JtnP9zktb/c5LW/3OS1v9risb/Y321/xgw + a/8AHGP/ABxa/wAQQv9CWZT/Um2t/1Jtrf9Sba3/UnGt/1Jxrf9aca3/WnGt/1p1rf9jfb3/Y4K9/2N9 + vSkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcw/d7nMP3/6XL9/+l0/f/rdf3/63b//+t2///rdf//63b//+t2///teP//xgo + Wv8AHFL/ACBj/wAcY/9CZZz/nL7v/5zD9/+ly/f/pc/3/6XP9/+t0/f/UmmE/wAEGP8ACCH/AAgY/3ua + rf+95///td/3/7Xf9/+t0/f/nMfv/5S25/+Epuf/jKrn/6W67/+9z+//3uP3/5zD9/+lz/f/tdv//73n + ///G8///zvf//877///O+///zvv//877///O+///zvv//877///O9///zvf//8bz//+96///vef//73j + //+14///td///7Xb//+t0///pcv3/5y+9/+Utu//jK7v/4Sm5/97nt7/e5re/3OW1v9zltb/c5LW/626 + 3v/e6/f/zt/v/73f9/+12/f/rdP3/6XL9/+cw/f/nL73/5S29/+Usvf/jK7v/yEsSv8ABBD/AAgY/wAE + EP9SaZz/c47O/3ua3v9zltb/c5LW/2uKxv9jea3/ABRK/wAcWv8AHFr/ABBK/zlRjP9Sca3/Ummt/1Jp + rf9Sba3/UnGt/1pxrf9aca3/WnWt/2N5tf9rgr3/Y4K9ewAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzD972cx/f/pcv3/6XP + 9/+l0/f/rdP//63X//+t0///pcv3/6XL9/+t2///ECRS/wAcWv8AIGP/ACBj/zlRjP+cvvf/nMPv/6XL + 9/+lz/f/pc/3/6XP9/+cx+f/AAAQ/wAIGP+Uus7/teP//7Xj//+14///rdv3/6XP9/+Msuf/pb7v/+/v + ////////////////////////xt///6XP9/+12///vef//8bv///O9///zvv//877///W+///zvv//9b7 + ///W+///zvv//877///O9///zvP//8bv//+95///vef//7Xj//+13///tdv//63T//+ly/f/nMP3/5S2 + 7/+Mru//hKbn/3ue3v97mt7/e5re/3uW1v9zktb/7+/3/+/v9//v6+//7+fn/+fn5//W3+f/veP3/7Xb + //+lz///nMP3/5Sy9/+Mrvf/lLb//zE8Wv8ABBD/IShK/2OCvf97nuf/e5re/3OS1v9zjs7/Y4K9/1px + pf8ACDH/ABBC/wAYUv8AFEr/MU2M/1Jxrf9Sba3/SmWl/1Jprf9Sca3/WnGt/1pxrf9aca3/WnWt/2OC + vf9jgr29AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAnMP395zD9/+cx/f/pcv3/6XL9/+ly/f/pcv3/6XL9/+ly/f/pcv3/63T + //8IIFL/ABxS/wAcWv8AGFL/GChK/4Sizv+cx/f/pcf3/6XL9/+ly/f/pc/3/7Xb//85TVr/e5at/7Xj + //+14///tef//7Xj//+t2/f/nMPv/5y65/////////////////////////////////+9omv/pcv3/63X + //+94///xu///873///O+///zvv//877///W+///zvv//877///O+///zvv//877///O9///xu///73r + //+95///td///7Xf//+t2///rdP//6XP9/+cw/f/lLbv/4yu7/+Eouf/e57e/3ue3v97mt7/e5be/4yK + jP/OtpT/9/f//+/v9//v6+//5+fn/97j5//e397/vef//63X//+lz///lLr3/4yu7/+Mqu//lLL3/xAc + Kf9zisb/e5re/3ua3v9zltb/c47O/2uGvf9jea3/OU2E/wAIKf8ACCn/ABBC/wAQQv8xSYT/WnG1/1Jt + rf9KZaX/Smml/1Jxrf9aca3/WnGt/1pxrf9aca3/Y329/2uCvfcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJy+9xicw/f/nMP3/5zH + 9/+cx/f/nMP3/5y69/+cuvf/nL73/5y+9/+cvvf/pcf//wgcUv8AHFL/ABxS/wAMMf8AFEr/AAxK/1p1 + pf+ly/f/pcfv/6XL7/+lz/f/rdP3/63T7/+14///teP//73r//+95///tef//63b9/+Utu//3uf3//// + ////////////////////////zrKE/72CCP+9omP/rdf//7Xb//+95///xvP//873///O+///zvv//877 + ///O9///zvf//873///O8///xvP//8bz///G7///vef//7Xj//+13///tdv//63X//+t0///pcv3/5zD + 9/+Uuu//jKrn/4Si5/97nt7/e57n/3ue3v+Motb/xoYQ/61tCP/n173/9/f//+/v9//n6+//5+Pn/97f + 5//O4+//td///6XP//+cvvf/jK7v/4Sq7/+Epuf/e5rW/4Se3v97ltb/c5LO/2uKxv9jgr3/WnWt/wgc + Wv8AEEr/ABRK/wAMMf8ADDH/ABBC/ylBe/9Saa3/Um2t/0plpf9KZaX/UnGt/1pxrf9aca3/WnGt/1px + rf9jfbX/a4K9/2OCvRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAlLr3SpzD9/+cw/f/nMP3/5zD9/+cuvf/lLL3/5Sy9/+Utvf/lLb3/5S2 + 9/+cw///CBxK/wAcUv8AFEr/ABhK/wAcWv8AIGP/ABRS/5S25/+cw+//pcfv/6XP9/+t1/f/td///7Xj + //+95///vev//73r//+15///rdf3/5S27////////////////////////////+/r3v+1dQj/zo4Y/4RZ + CP9acYT/rd///7Xb//+14///vev//8bz///O9///zvP//8bz///G8///xvP//8bz///G7///xuv//73n + //+94///td///7Xb//+t1///rdP//6XP//+ly///nMf3/5S69/+Mru//hKbn/4Si5/+Eouf/e5re/xgU + GP+tdRD/vYIQ/611If//+///9/f3/+/v7//n5+f/3t/n/9bf5/+14///rdP//5zD9/+Mru//hKbn/4Si + 3v97mt7/c5bW/3OOzv9rhsb/Y329/2N9tf8hPHv/ABRS/wAYUv8AGFL/ABRC/wAIKf8AEEL/KUF7/0ph + pf9KYaX/SmGl/0plpf9Sca3/WnGt/1pxrf9aca3/WnGt/2N5tf9rhr3/Y4K9SgAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUuveEnL73/5y+ + 9/+Uuvf/nL73/5S29/+Urvf/lLL3/5Sy9/+Utvf/lLb3/5y+9/8AGEr/ABhS/wAUQv8AHFL/ABxa/wAg + Y/8AHFr/UnGl/5zD7/+cx+//pc/3/63b9/+13///teP//73r//+96///vev//7Xj//+t1/f/nLbn//// + ////////////////////////xqJr/8aKEP+1ghj/CAAA/ykEAP9zaXP/rd///63X//+12///td///7Xj + //+14///teP//7Xj//+94///teP//7Xj//+14///td///7Xb//+t1///rdf//63T//+t0///pc///6XL + //+cw/f/lLr3/5Sy7/+Mru//jK7v/4Sa1v85GBj/GAQA/xgQAP/Oihj/tXkI/9bDpf//+///9/P3/+fr + 7//e4+f/3t/e/7Xj//+t0///nMP3/4yu7/+Epuf/hJ7e/3uW1v9zks7/a4rG/2OCvf9jfbX/Y321/wAc + Y/8AHGP/ABxj/wAcWv8AFEr/AAwx/wAQQv8pPHv/SmGl/0phpf9KYaX/SmWl/1Jxrf9aca3/WnGt/1px + rf9Sca3/Wnm1/2uGvf9rhsaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJS6962cw/f/lLr3/5S69/+Uvv//lLr3/4yu9/+Mrvf/jLL3/5Sy + 9/+Usu//nL73/wAYSv8AGEr/ABhK/wAcWv8AIGP/ACBr/wAgY/8xSYT/pcf3/5zH7/+lz/f/rdv//7Xj + //+95///vev//73r//+96///tef//6XP9/+lvuf////////////////////////7//+1fRD/1poY/0I0 + CP8pBAD/YwwA/3MIAP97NEL/pcfe/63b//+t1///rdf//63b//+t2///rdv//63b//+t2///rdv//63X + //+t1///rdf//63T//+t0///pdP//6XP//+ly///pcf3/5zD9/+cvvf/lLr3/5S+//+EdZT/cwwA/2MM + AP9CCAD/EAAA/3tVEP/Gihj/tYpC///////39/f/7+vv/+fj5//e397/td/3/6XT9/+cvvf/jKrn/4Si + 5/97mt7/c5bW/3OOzv9rhsb/Y4K9/2N9tf9ada3/ABha/wAga/8AHGP/ABxa/wAYUv8AEDn/ABBC/yE8 + e/9KYaX/Ql2c/0phpf9Sba3/UnGt/1pxrf9aca3/WnGt/1Jtrf9aebX/a4K9/2uGvaUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlLr3xpzH + 9/+Uuvf/lLb3/5y+//+cvv//lLb3/4yq7/+Eouf/jK7v/4yu7/+Msvf/ABhK/wAYSv8AHFL/ABxa/wAg + Y/8AJGv/ACBr/yE8c/+lx/f/nMfv/6XP9/+t2///teP//73n//+96///vev//73r//+15///pcv3/7XH + 5///////////////////////59e9/72GEP/WniH/CAQA/zkIAP9rDAD/cwwA/3MMAP9aCAD/Y2Vz/6XL + 7/+t1///rdP//63T//+t0///rdP//63T//+t0///rdP//6XT//+lz///pc///6XP//+lz///pcv//6XL + //+lx///nMP//5zL//9zkq3/Wigx/3MIAP9zDAD/cwwA/1IIAP8YBAD/KRwI/9aWGP+tdQj///v3//f7 + ///v7+//5+Pn/97f3v+12/f/pc/3/5y+7/+Epuf/e57e/3ua1v9zks7/a47G/2uGvf9jgr3/Y321/1Jt + pf8AGFr/ACBr/wAcY/8AHFr/ABhS/wAUSv8AFEr/KUF7/0plpf9KZaX/Ummt/1Jxrf9Sca3/WnGt/1px + rf9aca3/Um2t/1p5tf9jgr3/Y4K9xgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUuvfOnMf3/5S29/+Mrvf/lL7//5zD//+cw///lLr3/4Sm + 7/97nuf/e5rn/3ue5/8AGEr/ABhS/wAcWv8AHGP/ACBj/wAga/8AIGv/KTx7/6XH9/+cx/f/pdP3/7Xb + //+14///vev//73r//+96///vev//7Xj//+cx/f/vc/v///////////////////////Wvoz/zp4h/6WC + If8IAAD/OQgA/2MMAP9jDAD/YwwA/1IMAP8hBAD/AAAA/5SOY/+tw73/pc///6XP//+lz///pcv//6XL + //+ly///pcv//6XL//+ly///pcv//6XL//+lx///pcf//5zD///Gy6X/Y1kx/wgAAP9KCAD/YwwA/2MM + AP9jDAD/QggA/xgEAP8AAAD/xpIh/7V9CP/n28b///v//+/z9//n5+f/3t/e/7XX7/+ly/f/lLrv/4Si + 3v97nt7/c5bW/3OSzv9rjsb/a4bG/2uGvf9jfbX/UnGt/wAYWv8AHGv/ABxj/wAcWv8AGFL/ABRK/wAU + Sv8pQXv/Um2t/1Jtrf9Sba3/UnGt/1Jxrf9aca3/WnGt/1pxrf9Sba3/WnW1/2OCvf9jgr3OAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJS6 + 986ly/f/lLr3/4yq7/+Usvf/nL7//5zD//+cw///nL7//5S29/+Epu//jKrv/wAUSv8AGFL/ABxa/wAc + Y/8AIGP/ACBr/wAgY/85TYT/nMf3/6XH9/+t0/f/td///7Xj//+96///vev//73r//+95///teP//5zD + 9//G1+///////////////////////862a//esin/hG0Y/wAAAP8hBAD/SggA/1IIAP9CCAD/KQQA/xAE + AP8AAAD/c2EY/+e6Mf+cy///rd///7Xf//+t1///pc///6XL//+ly///pcv//6XH//+cx///nL73/4yy + 7/+Equf/jKLG//fHKf85NBD/CAQA/zEIAP9SDAD/SggA/zkIAP8hBAD/CAQA/wAAAP+1hiH/xooQ/9bH + pf//+///9/P3/+fn7//n4+f/tdfv/5zH9/+Utu//hKLe/3ua1v9zls7/c5LO/2uOxv9risb/a4a9/2OC + tf9jebX/ABRa/wAcY/8AHGP/ABxa/wAUSv8AFEr/ABRK/ylBe/9SaaX/Um2t/1Jtrf9Sca3/UnGt/1Jx + rf9Sca3/Um2t/1Jtrf9adbX/Y4K9/2OCvc4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlLr3vaXL9/+cw/f/jK7v/4yq7/+Usvf/lL7//5y+ + //+cw///lLb3/4Sm7/+t1/f/ABBC/wAYUv8AHFr/ABxj/wAgY/8AIGP/ABxj/1Jtpf+cw/f/pcv3/63X + //+13///teP//73r//+96///vev//73r//+14///nMP3/87b9///////////////////////zrZj/+/H + Of9zZSH/AAAA/wgEAP8YBAD/IQQA/xgEAP8QBAD/CAQA/wAAAP9jVRj/78Mx/6XP9/+13///vef//73r + //+96///vef//7Xf//+t1///pc///5zH9/+Uvvf/jLLv/4Sq5/+UprX/98cx/ykkCP8ABAD/EAQA/yEE + AP8hBAD/GAQA/wgEAP8ABAD/AAAA/62CIf/Olhj/1sOU///////38/f/5+fv/+fj5/+10+//nMf3/5S2 + 7/97nt7/e5rW/3OWzv9zks7/c47O/2uKxv9rhr3/Y4K1/2uCvf8AGFL/ABha/wAYWv8AGFL/ABRK/wAU + Sv8AFEr/KUV7/1pxrf9KZaX/Ummt/1Jtrf9Sca3/UnGt/1Jxrf9Sba3/Um2t/1p5tf9jfb3/Y4K9vQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACUuu+UnMf3/6XP9/+Utvf/hKbv/4Si7/+Mrvf/lLb3/4Sq7/+Eouf/pcv3/6XP9/8AEEL/ABhS/wAc + Wv8AHFr/ACBj/wAgY/8AFFr/e57O/5zD9/+lz/f/rdf//7Xf//+15///vev//73r//+96///vev//7Xj + //+cw/f/1uP3///////////////////////WumP/9885/3ttIf8AAAD/AAQA/wgIAP8YEAj/GBAI/xAI + CP8ABAD/AAAA/2tZGP/vwzH/pdP3/7Xf//+95///vev//73r//+15///td///63X//+lz///pcv//5zD + 9/+Utu//jKrn/5ymrf/vwyn/KSQI/wAEAP8IBAD/EAwI/xgQCP8YEAj/CAgA/wAEAP8AAAD/tY4p/9ai + If/Wx5T///////fz9//n5+//3uPn/7XP7/+cx/f/lLbv/3ue3v97mtb/c5bW/3OSzv9zjs7/a4rG/2uG + vf9jgrX/a4a9/xgkWv8AFEr/ABRK/wAUQv8AEEL/ABRK/wAUSv8pQXv/Y3m1/1Jtrf9SZaX/Ummt/1Jt + rf9Sca3/UnGt/1Jtrf9Sba3/Wnm1/2N9tf9jgr2UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJS691Kcw/f/pdP3/6XP9/+Utvf/hKbn/3ue + 5/+Eouf/jK7v/6XP9/+t1/f/rdf3/wAQQv8AGFL/ABxa/wAcWv8AIGP/ACBr/wAYWv+cw/f/nMf3/6XP + //+t2///teP//7Xn//+95///vev//73n//+95///teP//5zD9//W4/f//////////////////////9bD + c//3z0L/jIIp/wAAAP8QDAj/KSAQ/1I8Kf9SQSn/MSQQ/xAMCP8AAAD/e2kh/+/HMf+t1/f/teP//73n + //+96///vev//73n//+13///rdf//6XT//+lz///nMf3/5S69/+Mruf/nKKt/++6Kf9CNBD/AAQA/xgQ + CP85KBj/UkUp/0o4If8pHBD/CAgA/wAAAP/OqjH/1q4p/97Ppf//+///9/P3/+fn7//n4+f/tc/v/5zD + 9/+Msu//e57e/3ua1v9zltb/c5LO/3OOzv9risb/a4a9/2OCtf9jfbX/MUV7/wAMQv8AEEL/ABBC/wAQ + Qv8AFEr/ABRK/yk8c/9jfbX/Y3mt/1pxrf9SaaX/Ummt/1Jtrf9Sba3/Umml/1Jxrf9jebX/Y321/2N9 + tVIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAlLr3GJS+9/+ly/f/pdP3/6XP9/+cx/f/nMP3/6XH9/+t1/f/rd///8bv//+95+//AAxC/wAY + Uv8AHFr/ABxa/wAgY/8AJGv/GDBr/6XP//+ly/f/pdP//63b//+13///teP//73n//+96///vef//73n + //+13///nMP3/9bj9///////////////////////3s+U/+/POf+9sjn/AAQA/yEYCP9jTTH/zr6t/9bL + tf9zYUr/KRwQ/wAEAP+tnjH/78s5/63b9/+15///vev//73v//+96///vef//7Xf//+t1///pdP//6XP + //+cx/f/lL73/4yu5/+Uoq3/564h/2tVGP8IBAD/KSAQ/4RtUv/Wz73/xrac/1JBKf8YFAj/AAQA/+/L + Qv/Wrin/59/G///7///38/f/5+fv/+fj5/+1y+//nL7v/4yy7/97nt7/e5rW/3OW1v9zks7/c5LO/2uK + xv9rgr3/Y321/1p1rf9CXYz/AAg5/wAQQv8AEEL/ABBC/wAUSv8AFEr/ITRr/2N9tf9aebX/Wnmt/1p1 + rf9aca3/Umml/1Jppf9aca3/Wnm1/2N5tf9jfb3/Y329GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlLbv3pzD9/+t1/f/rdv3/63X + //+t1///rdf//7Xj///G8///zvv//63L3v8ADEL/ABhS/wAcWv8AHFr/ACBj/wAga/8xSYT/pcv//6XH + 9/+l0///rdv//7Xf//+14///tef//73n//+95///tef//7Xj//+cx/f/zt/3//////////////////// + ///n373/58cx//fjSv8ICAD/IRwQ/4x1Wv/36+f/9+/n/7WijP8xJBD/AAQA/+/XSv/vz0r/rdv//7Xn + //+96///vev//73v//+95///td///63X//+l0///pc///5zH9/+Uvvf/jLLv/4yivf/Wohj/rZIp/wgI + AP85KBD/vaqU//fv5//3697/hG1S/yEYCP9CNBD/99dK/9auMf//9/f///v//+/v9//n5+f/5+Pn/63H + 7/+cvu//jK7n/3ue3v97mtb/e5rW/3OWzv9zks7/a4rG/2N9tf9ada3/WnGc/1JpnP8ACDn/AAw5/wAQ + Qv8AEEL/ABRK/wAUSv8QJFr/Wm2t/1p1rf9aea3/Y3m1/1p5tf9aebX/Y3mt/2N5tf9jebX/Y321/2uG + vd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACUuu9zlLrv/63X9/+13///td///7Xf//+14///xvP//873//+96///e6LG/wAM + Qv8AGFL/ABxa/wAcWv8AIGP/ABxj/0JhnP+lx///pcv//6XT//+t2///td///7Xj//+14///tef//7Xn + //+15///td///6XL9//G1/f////////////////////////79//evjn//+dK/2tlIf8YEAj/Y005/97P + xv/n287/hHVa/yEUCP9aURj//+dS/+fTWv+t3///teP//73r//+96///vev//73n//+t3///rdf//6XT + //+lz///nMv//5zD9/+Msu//hKLW/86aGP/vvjn/GBgI/ykcEP+MeWP/59/W/9bLvf9aSTH/EAwI/62a + Of/vz0L/zrZS///////39/f/7+/v/+fn5//n4+f/pcPv/5S+7/+Mruf/hKLe/3ue3v97mtb/c5bW/3OO + xv9jgr3/WnWt/1ptnP9SbZz/WnGl/wAMOf8ADDn/ABBC/wAQQv8AFEr/ABRK/wgcUv9KYZz/SmWc/1px + rf9ada3/Wnmt/2N5tf9jebX/Y3m1/2N9tf9jgr3/Y4K9cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzD9wiUtu/nnMP3/6XT + 9/+12/f/td/3/7Xj//+95///teP//63T9/9SabX/ABRC/wAYUv8AHFL/ABxa/wAgY/8AHGP/UnGt/5zH + //+ly///pdP//63X//+t3///td///7Xj//+14///teP//7Xj//+14///pc///63H7/////////////// + /////////////97Hc//330r/59tK/xAUCP8hGBD/SkEp/1pJMf8pIBD/EAwA/97TSv/331L/zsuE/63f + //+14///vef//73r//+96///tef//63b//+l0///pdP//6XP//+ly///nMP3/5S27/+Epuf/vY4p/96y + Mf+tkjH/CAQA/ykgEP9aTTn/Sjwp/xgUCP85MBD//+NS/+/LOf/e06X///////f39//v7+//5+fn/+fj + 5/+Uuu//lLrv/4Sq5/+Eot7/e57e/3uW1v9zks7/a4a9/2N5rf9acaX/Um2c/1ptnP9jea3/AAw5/wAM + Of8AEEL/ABBC/wAUSv8AFEr/ABBK9yk4lN5KXZT/SmGc/1Jtpf9aca3/WnWt/1p1tf9aebX/Y3m1/2N9 + vecAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzD9ymUtu/vlLr3/5zD9/+cx/f/pc/3/63T9/+cvvf/Qk3n/wgI + pf8AGEr/ABhS/wAcUv8AHFr/ACBj/wAYWv9jgrX/nMP//6XL//+l0///rdf//63b//+t3///td///7Xj + //+14///teP//7Xj//+t1///jLLn////////////////////////////7+vW/+fLOf//40r/xrZC/xAM + AP8ICAD/CAgA/wgIAP+9qjn/9+NS//fXQv+1z8b/td///7Xj//+15///vef//73n//+14///rdv//6XT + //+lz///pc///6XL//+cw/f/lLb3/4Sq5/+cjnP/1qYp/+/PQv+EdSn/AAQA/wgIAP8ICAD/ISAI/+fX + Sv/320r/1rpC///79///+///9/f3/+/v7//n5+//3t/n/4y27/+Mtu//hKbn/3ui3v97mtb/c5LO/2uG + vf9jfbX/WnWl/1pxnP9acZz/WnGl/2N9rf8IEEL/AAw5/wAQQv8AEEL/ABRK/wAUSv8AFEr/AACc/xgg + lP9CWZT/SmGU/0phnP9SZaX/Umml/1ptrf9aca3vWnW1KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJS6 + 9xCUsu+ElLb3tZS297WUtveMMTzn7xAE3v8QAN7/CAyU/wAYSv8AGFL/ABxa/wAcWv8AIGP/ABha/2uK + vf+cw///pcv//6XT//+t1///rdf//63b//+t3///td///7Xj//+14///teP//7Xf//+Msu//5+v3//// + ////////////////////////3s+E//fbSv/331L/59tS/4yGMf+MgjH/59dK//fjUv/330r/1sdr/63f + //+14///teP//7Xn//+15///tef//7Xj//+t2///pdP//6XP//+lz///pcv//5zH9/+Uuvf/jK7n/4yq + 3v+9kiH/57o5//fbSv/Oukr/hHUx/5yWOf/341L/99tS/+/PQv/n373////////7///39/f/7/P3/+/r + 7/+9z+f/jLLv/4yu5/+Eot7/e5rW/3OOxv9rhrX/Y321/2N5rf9adaX/WnGl/1pxpf9acaX/Y3mt/wgU + Qv8ADDn/AAxC/wAQQv8AFEr/ABRK/wAYSv8IAJz/AACc/wAAnP8pNJylQlWUjEpZlLVKYZy1UmWlhFJt + rRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEpV5xAQANb/EADe/xAA + 3v8IDJT/ABhK/wAYUv8AHFL/ABxa/wAgY/8AGFr/a5LG/5zD//+ly///pc///63T//+t1///rdf//63b + //+t2///td///7Xf//+t3///rd///5zH9/+tx+//////////////////////////////////1sdr//fb + Sv/331L/999S//ffUv/331L/999K/97HUv/O4+//rd///7Xj//+14///tef//7Xn//+15///teP//63b + //+l0///pc///6XP//+ly///nMf3/5S+9/+Mru//hKLe/8bLzv/Gmin/58dK/+/TUv/321L/99tS//fb + Uv/vz0L/3s+U//////////////v///f39//v7+//5+fn/4yu5/+Eot7/e5rW/3OSzv9rir3/Y4K1/2N9 + tf9jea3/Wnmt/1p1rf9acaX/WnGl/1pxpf9ada3/CBRC/wAMOf8AEEL/ABBC/wAUQv8AFEr/ABhK/wAA + nP8AAJz/CACc/wgMnJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADWtRAA1v8QANb/EADe/wgMlP8AGEr/ABhS/wAcUv8AHFr/ACBj/wAY + Wv9rksb/nMP3/5zH9/+lz///pdP//63T//+t1///rdf//63X//+t2///rdf//63X//+t1///pdP//4yy + 7//v8///////////////////////////////////3tOM/97HQv/v10L/79dC/+fLOf/ey3v/9/P3/5zD + 7/+13///teP//7Xn//+15///tef//7Xn//+14///rdv//63T//+lz///pc///6XL//+cx/f/lLr3/4yy + 7/+Epuf/lK7e/+/n3v/GqlL/1rpC/+/PSv/nz0L/3sNK/+fftf////////v///f39//v7/f/5+fv/97f + 5/+1w9b/c5LO/3OOxv9rir3/a4K1/2N9tf9jfbX/Y32t/2N5rf9ada3/WnWt/1pxpf9acaX/Um2l/1p1 + rf8QGEr/AAw5/wAQQv8AEEL/ABRC/wAUSv8AFEr/AACc/wAAnP8AAJz/CACc/xAQnDEAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEY1kIQANb/EADW/xAA + 1v8QANb/CAit/wAYQv8AGFL/ABhS/wAcWv8AIGP/ABRS/3OSxv+cvvf/nMP3/5zH9/+ly/f/pc/3/6XP + 9/+l0///pdP//6XT//+lz/f/pc/3/6XP9/+l0/f/nMf3/5y65/////////////////////////////// + //////////v3/+/jxv/v473/9/fv//////+lvuf/pc/3/7Xf//+14///tef//7Xn//+95///tef//7Xj + //+t2///rdf//6XP//+ly///nMv//5zD9/+Uuvf/jLLv/4Sq5/+Eot7/vcvn/+/z9//n497/3tu9/+fj + zv/38/f/7+/3/+fn7//e4+f/3tve/9bT3v/Oy9b/xsfO/2uGvf9rhr3/a4K1/2OCtf9jfbX/Y3m1/2N5 + rf9jea3/WnWt/1p1rf9ada3/WnGl/1ptpf9abaX/WnWt/xAYSv8ADDn/ABBC/wAQQv8AFEL/ABRK/wAU + Uv8AAJz/AACc/wAAnP8AAJz/CACczgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADWxhAA1v8QANb/EADW/xAA1v8QANb/ABRC/wAYUv8AGFL/ABxS/wAc + Wv8AFEr/a47G/5S27/+Utuf/lLbn/5S23v+Uuuf/lLrn/5y+5/+cw+//nMPv/5zD7/+cw+//nMPv/5zH + 7/+cx/f/jLLv/6W+5/////////v////7////+/////v////7////+/////v////7////+///tcfn/4y2 + 5/+t1///rdv//7Xj//+14///tef//7Xn//+14///teP//63b//+l0///pc///5zH9/+cx/f/nL73/5S2 + 7/+Mru//hKrv/4Sm5/97nt7/vcPW/87P1v/Oz9b/zs/W/87L1v/Gx87/xsPO/72+xv+9usb/vbrG/726 + xv9rhrX/Y321/2N9tf9jebX/Y3mt/2N5rf9jea3/Wnmt/1p1rf9ada3/WnGt/1pxpf9abaX/Um2l/1Jt + pf9aca3/EBhK/wAMOf8AEEL/ABBC/wAUQv8AFEr/AAhz/wAAnP8AAJz/AACc/wAAnP8AAJz/CAScSgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAzjEQAM7/EADO/xAA + zv8QANb/EADW/xAA1v8IBIz/ABA5/wAYSv8AHFL/ABhS/wAUSv9aea3/e5rO/3uaxv97msb/e5rG/3ua + xv97msb/e57G/3uizv+Eos7/hKbO/4Smzv+Eqtb/jKrW/4yu1v+Mrt7/hKbe/4yq1v/W197/5+Pn/+fj + 7//n5+//7+vv/+/v9//38/f/9/f3/62+3v9zms7/lL7n/6XL7/+l0/f/rdf3/63b9/+12/f/rd/3/63b + 9/+t1/f/pdP3/6XL9/+cw/f/nL73/5S+9/+Utu//jK7n/4Sm3v97mtb/c5LO/3OOxv9rir3/paq9/726 + xv+1tsb/tbbG/7W2vf+1sr3/tbK9/722vf+lqr3/Y321/2N5tf9jea3/Y3mt/2N5rf9aea3/Wnmt/1p1 + rf9ada3/WnGt/1pxrf9abaX/Um2l/1Jtpf9SaaX/Umml/1Jtrf8IGEr/AAw5/wAQQv8AEEL/ABRK/wAU + Sv8AAJz/AACc/wAAnP8AAJz/AACc/wAAnP8AAJy9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADOnBAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA3v8ABHP/AAgx/wAQ + Qv8AFEL/AAQx/0pllP9rir3/a4a1/2uGtf9rhrX/a4K1/2uCtf9rgrX/a4a1/2uGtf9rhrX/a4a1/2uK + tf9rir3/c469/3OSvf9zkr3/c5K9/2uOvf+Mosb/tbrO/8bH1v/Oz9b/1tPW/73D1v97msb/a4a9/3OS + vf+Eos7/c46t/4yu1v+Mrs7/jLLW/5S21v+Uttb/lLbW/4yy1v+Mrtb/hKrW/4Sm1v+Eotb/hKLW/3ue + zv9zls7/a469/2N9tf9jfa3/Y321/2N9tf9jfbX/e461/6Wqvf+1sr3/tbK9/62uvf+Unr3/a4a1/1p1 + rf9jea3/Y3mt/2N5rf9aea3/WnWt/1p1rf9ada3/WnGt/1pxrf9abaX/Um2l/1Jppf9SaaX/Umml/1Jl + pf9KZaX/Umml/wgUSv8ADDn/AAxC/wAQQv8AFEr/AASM/wAAnP8AAJz/AACc/wAAnP8AAJz/AACc/wAA + nP8AAJwhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAM73EADO/xAA + zv8QAM7/EADO/xAAzv8QANb/EADO/xAA3v8YHJT/AAgp/wAIMf8ABCn/QlWE/2N5rf9jea3/Wnmt/1p1 + rf9aea3/Wnmt/2N5rf9jea3/Y321/2N9tf9jfbX/Y321/2OCtf9jgrX/a4K1/2OCtf9rgrX/a4a1/2uG + tf9rhrX/a4q1/2uKvf9rirX/a4q1/2uKtf9rirX/c5K9/0pde/85RWP/c469/3OOvf9zjr3/c5K9/3OO + vf9zjr3/c469/3OOvf9rjr3/a4q9/2uKvf9rir3/a4q9/2uGvf9rgrX/a4K9/xAYKf9jfbX/Y321/2N9 + tf9jfbX/Wnmt/1p5rf9aea3/WnWt/1p1rf9aea3/Wnmt/1p1rf9ada3/WnWt/1p1rf9aca3/WnGt/1px + pf9SbaX/Wm2t/1Jtpf9SaaX/UmWl/1Jlpf9KZaX/SmGc/0phnP9SZaX/CBRC/wAMOf8ACDn/EBxS/wgE + lP8AAJz/AACU/wAAlP8AAJz/AACc/wAAnP8AAJz/AACc/wAAnHsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADOQhAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADW/wgA + pf8QEIz/AAw5/wAEKf85SXv/WnGl/1ptpf9aca3/WnGt/1pxrf9aca3/WnGt/1p1rf85SXP/Y321/2N5 + rf9jfa3/Y321/2N9tf9jgrX/Y4K1/2OCtf9jgrX/Y4K1/2OCtf9rgrX/a4K1/2uGtf9rhrX/a4a1/2uK + vf85SWv/AAAA/1JllP9rhrX/a4a1/2uGtf9rhrX/a4a1/2uGtf9rhrX/a4a1/2uGtf9rgrX/Y4K1/2OC + tf9jgrX/Y321/2N9tf9rgr3/GCAx/wgUIf9acaX/Y3m1/2N5rf9jea3/Wnmt/1p5rf9ada3/WnWt/1p1 + rf9ada3/WnGt/1pxrf9aca3/WnGl/1Jtpf9SbaX/Umml/1Jlpf85SXv/Umml/0plpf9KYZz/SmGc/0ph + nP9KYZz/Sl2c/0plpf8AEDn/AAwx/wgQWv8ABHP/AABr/wAAnP8AAJz/AACc/wAAnP8AAJz/AACc/wAA + nP8AAJz/AACczgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAM6EEADO/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAMb/AACM/wAAlP8IAKX/CAhj/zFBc/9SaaX/Umml/1Jp + pf9SaaX/Umml/1Jtpf9SbaX/WnW1/wgQIf8xQWP/Y3m1/1p1rf9jea3/Y3mt/2N9rf9jfa3/Y321/2N9 + tf9jfbX/Y321/2N9tf9jgrX/Y4K1/2uCtf9rgrX/IShC/wAACP8AAAD/Y4K1/2OCtf9jgrX/Y4K1/2OC + tf9jgrX/Y321/2N9tf9jfbX/Y321/2N9tf9jfbX/Y3mt/2N5rf9jea3/Y3mt/2N5tf8pPFr/AAQQ/wAI + GP9CVYT/Y321/1p1rf9ada3/WnWt/1p1rf9aca3/WnGt/1pxrf9SbaX/Um2l/1Jtpf9SaaX/Umml/1Jp + pf9KYZz/CBAY/zFJc/9KYZz/SmGc/0phnP9KXZz/Sl2c/0pdnP9KXZz/SmGl/wAQQv8ACGv/AABr/wAA + a/8AAGv/AACM/wAAnP8AAJz/AACc/wAAnP8AAJz/AACc/wAAnP8AAJz/AACcCAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAzr0QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADW/xAA + tf8AAIz/AACc/wgApf8IAK3/EBSl/0pdnP9KZZz/SmGc/0plpf9SZaX/Umml/1Jppf9aca3/GCA5/wAE + EP8YKEL/WnWt/1p1rf9ada3/Wnmt/2N5rf9jea3/Y3mt/2N5rf9jfa3/Y3mt/2N9tf9rhr3/Sl2M/wgM + GP8AABD/AAQQ/xAYKf9rir3/Y321/2N9tf9jfbX/Y32t/2N5rf9jea3/Y3mt/2N5rf9jea3/Y3mt/2N5 + rf9aea3/WnWt/1p1rf9ada3/WnWt/0pdjP8ABBD/AAgY/wAAEP8hKEr/WnGl/1p1rf9acaX/Um2l/1Jt + pf9SbaX/Umml/1Jppf9SaaX/UmWl/1Jlpf9Saa3/OU17/wAIEP8ABBD/QlGM/0pdnP9KXZz/Sl2c/0pd + nP9CWZz/Qlmc/0phnP8pOIT/AABr/wAAa/8AAGv/AABr/wAAa/8AAHv/AACc/wAAnP8AAJz/AACc/wAA + nP8AAJz/AACc/wAAnP8AAJxCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADO9xAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QANb/CACt/wAAjP8IAJz/CACt/wgAvf8IAK3/AASl/zFB + nP9KZZz/SmGc/0phnP9KYZz/SmWc/1Jppf8pNFL/AAQQ/wAEEP8ICBj/OUlz/2N5tf9jebX/WnWt/1p1 + rf9aea3/Y3mt/2N9tf9jfbX/Sl2M/xAcOf8AABj/AAAY/wAEEP8AAAj/MUFj/2N9tf9jea3/Y3mt/2N5 + rf9jea3/Wnmt/1p1rf9ada3/WnWt/1p1rf9ada3/WnWt/1pxrf9aca3/WnGt/1pxrf9acaX/WnGt/wAI + GP8ABBj/AAQY/wAAGP8ABBj/KTRa/1Jppf9aca3/Umml/1Jppf9SZaX/SmWl/1Jlpf9SaaX/QlmU/xgg + Qv8ABBD/AAgY/wAEEP9KWZz/Qlmc/0JZnP9CWZz/Qlmc/0JZnP9CWZz/EBhz/wAAa/8AAGv/AABr/wAA + a/8AAGv/AABr/wAAe/8AAJz/AACc/wAAnP8AAJz/AACc/wAAnP8IAJz/CACc/wAAnHsAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAzggQAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA + 1v8IAL3/AACM/wgAnP8IALX/CAC9/wgAvf8IAK3/AACl/xgcnP9KXZz/Sl2c/0pdnP9KXZz/SmGc/zlN + e/8ABBD/AAgY/wAEGP8AABD/AAgY/yEwSv85TXv/Sl2M/0pdjP85TXP/ITBK/wAIIf8AABj/AAAh/wAA + If8AABj/AAQI/wAAAP9SbZz/WnWt/1p1rf9ada3/WnWt/1p1rf9ada3/WnGt/1pxrf9aca3/WnGt/1px + rf9acaX/Um2l/1Jtpf9SbaX/Um2l/1Jppf9Sba3/GChC/wAEGP8ABBj/AAQh/wAEIf8AACH/AAAY/xAY + Mf8pOFr/OUl7/0JRhP85TXv/KThj/xAYMf8ABBD/AAQY/wAIGP8ACBj/CBAh/0pdpf9CWZz/Qlmc/0JZ + nP9CWZz/MUGM/wAEa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AACM/wAAnP8AAJz/AACc/wAA + nP8AAJz/CACc/wgAnP8IAJz/CACclAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADOKRAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA1v8AAJT/AACU/wgArf8IAL3/CAC9/wgA + tf8IAK3/CACl/wgInP85RZz/Sl2c/0JZnP9KXZz/Sl2c/wAEEP8ACBj/AAQY/wAEGP8ABBj/AAQY/wAE + EP8ABBD/AAQQ/wAEEP8AABj/AAAh/wAAIf8AACH/AAAh/wAEEP8ABAj/EBgp/2N5tf9aca3/WnGt/1px + rf9aba3/Wm2t/1ptpf9SbaX/Um2l/1Jtpf9SbaX/Umml/1Jppf9SaaX/Umml/1Jlpf9SZaX/UmWl/0pl + pf9CUYT/AAQQ/wAEGP8ABBj/AAQY/wAAIf8AACH/AAAh/wAEGP8ABBD/AAQQ/wAEEP8ABBD/AAQY/wAE + GP8ABBj/AAQY/wAEGP8hLFL/Qlmc/0JVlP9CVZT/Qlmc/xgke/8AAGv/AABr/wAAa/8AAGv/AABr/wAA + a/8AAGv/AABr/wAAe/8IAJz/AACc/wAAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJy1AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAM45EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA + zv8QAM7/EADW/wgAvf8AAJT/CACl/wgAtf8IAL3/CAC9/wgAtf8IAK3/CACl/wAAnP8hKJz/Sl2c/0JZ + nP9KXaX/GCA5/wAIGP8ABBj/AAQY/wAAIf8ABBj/AAQY/wAEGP8ABBj/AAAh/wAAIf8AACH/AAAh/wAA + If8ABBD/AAQI/wAACP85SXP/Um2l/1Jppf9SaaX/Umml/1Jppf9SaaX/Umml/1Jppf9SaaX/UmWl/1Jl + pf9SZaX/SmWl/0plpf9KYZz/SmGc/0phnP9KYZz/SmGc/0plpf8IECH/AAgY/wAEGP8ABBj/AAAh/wAA + If8AACH/AAAh/wAEGP8ABBj/AAQY/wAEGP8ABBj/AAQY/wAEGP8ABBj/AAAQ/zlNjP9CVZT/Qlmc/zlF + lP8IDGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAHP/CACU/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA + zkoQAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA1v8QANb/EADe/wgArf8AAJT/CACl/wgA + rf8IALX/CAC1/wgAtf8IAK3/CACl/wAAnP8ICJz/MUWU/0JdlP85SYT/AAQQ/wAEGP8ABBj/AAAh/wAA + If8AACH/AAAh/wAAIf8AACH/AAAh/wAAIf8AACH/AAQQ/wAEEP8ABBD/CAwY/1Jprf9KZaX/SmWl/0pl + pf9KZaX/SmWl/0phpf9KYZz/SmGc/0phnP9KYZz/SmGc/0phnP9KYZz/Sl2c/0pdnP9KXZz/Sl2c/0pd + nP9KXZz/Qlmc/zFBc/8ABBD/AAgY/wAIGP8ABBj/AAAh/wAAIf8AACH/AAAh/wAAIf8AACH/AAAh/wAA + If8ABCH/AAQY/wAIGP8QFDH/Qlmc/0JVlP8YJHv/AABj/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAA + a/8AAGv/AABz/wgAjP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACczgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADOQhAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA + zv8QAM7/EADW/xAA1v8QANb/EADe/wgArf8AAJT/CACl/wgArf8IALX/CAC1/wgAtf8IAK3/CACt/wgA + pf8AAJz/GBiU/0JRnP8QIDn/AAQY/wAEGP8AACH/AAAh/wAAIf8AACH/AAAh/wAAIf8AACH/AAAY/wAE + EP8ABBD/AAQQ/wAACP8xRXP/Sl2c/0pdnP9KXZz/Sl2c/0pdnP9KXZz/Sl2c/0pdnP9KXZz/Sl2c/0pd + nP9KXZz/Sl2c/0JdnP9CWZz/Qlmc/0JZnP9CWZz/Qlmc/0JZnP9CWZz/Slmc/wgUKf8ACBj/AAgY/wAI + GP8ABBj/AAAh/wAAIf8AACH/AAAh/wAAIf8AACH/AAAh/wAEGP8ABBj/AAQQ/zlNhP8pOIT/AARr/wAA + a/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAc/8IAJT/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJzOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAQAM4xEADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA1v8QANb/EADW/xAA1v8QANb/EADe/wgA + tf8IAJT/CACc/wgApf8IAK3/CAC1/wgAtf8IALX/CACt/wgApf8IAJz/AACc/xAYlP8ACBj/AAgY/wAE + GP8AACH/AAAh/wAAIf8AACH/AAAh/wAEGP8ABBD/AAQQ/wAEEP8ABAj/ECA5/0phpf9CWZz/Qlmc/0JZ + nP9CWZz/Qlmc/0JZnP9CWZz/Qlmc/0JZnP9CWZz/Qlmc/0JZnP9CWZz/Qlmc/0JZnP9CWZz/QlWU/0JV + lP9CVZT/QlWU/0JVlP9CVZT/OU2M/wAEEP8ACBj/AAgY/wAIGP8ABBj/AAQY/wAEGP8ABBj/AAQh/wAE + If8ABBj/AAgY/wAIEP8IEEL/CAxz/wAAY/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAA + a/8AAHv/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nL0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAzhAQAM7/EADO/xAAzv8QAM7/EADO/xAA + 1v8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QANb/EADe/wgAvf8IAJT/AACU/wgApf8IAK3/CAC1/wgA + tf8IALX/CACt/wgApf8IAKX/CACc/wgEjP8ACBD/AAgY/wAEGP8ABBj/AAQY/wAEGP8ABBj/AAQQ/wAE + EP8ABBD/AAQI/wgQIf9CWZz/QlWU/0JZnP9CWZz/Qlmc/0JZnP9CWZz/Qlmc/0JZnP9CWZz/Qlmc/0JV + nP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZz/KThr/wAE + EP8ACBj/AAgY/wAIGP8ACBj/AAgY/wAIGP8ACBj/AAgY/wAIGP8ACBD/AAgx/wAAc/8AAGv/AABr/wAA + a/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/CACE/wgApf8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACcnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABAAzv8QAM7/EADO/xAAzv8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QANb/EADW/xAA + 3v8QAM7/EADn/xAAxv8IAJT/AACU/wgAnP8IAK3/CAC1/wgAtf8IALX/CAC1/wgArf8IAKX/CACc/wgE + lP8ACCH/AAgQ/wAIGP8ABBj/AAQQ/wAEEP8ABBD/AAQQ/wAACP8IECH/QlWc/0JVlP9CVZT/QlWU/0JV + lP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JV + lP9CVZT/QlWU/0JRlP9CUZT/QlGU/0JRlP9CVZz/KThr/wAEEP8ACBD/AAgY/wAIGP8ACBj/AAgY/wAI + GP8ACBD/AAgQ/wgIQv8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABz/wgA + lP8IAK3/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJyEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADO5xAAzv8QANb/EADW/xAA + 1v8QANb/EADW/xAA1v8QANb/EADW/xAA3v8QAN7/EADe/xAA3v8QAM7/EADn/xAA1v8IAJz/AACU/wgA + nP8IAKX/CACt/wgAtf8IALX/CAC1/wgArf8IAKX/CACc/wgApf8ICGv/AAgp/wAIEP8ABAj/AAQI/wAE + CP8IEBj/KTha/0JZnP9CUZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JV + lP9CVZT/QlWU/0JVlP9CVZT/QlGU/0JRlP9CUZT/QlGU/0JRlP9CUZT/QlGU/0JRlP9CUZT/QlGU/0JR + lP9CVZT/OU2M/xggOf8ACBD/AAgQ/wAIEP8ACBD/AAgY/wAIOf8ABGP/AABr/wAAa/8AAGv/AABr/wAA + a/8AAGv/AABr/wAAa/8AAGv/AABr/wAAe/8IAKX/CAC1/wgAnP8IAJz/CACl/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnGsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAQAM6lEADO/xAAzv8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QAN7/EADe/xAA + 3v8QAN7/EADe/xAA5/8QAM7/EADn/xAA5/8IALX/CACU/wgAlP8IAKX/CACt/wgAtf8IALX/CACt/wgA + rf8IAK3/CACl/wgAnP8IAKX/CASc/wgAjP8AAIT/CASM/wgInP8QHJT/ISiU/zE8lP85TZT/QlWU/0JZ + lP9CVZT/QlWU/0JVlP9CUZT/QlGU/0JRlP9CUZT/QlGU/0JRlP9CUZT/QlGU/0JRlP9CUZT/QlGU/0JR + lP9CUZT/QlGU/0JRlP9CVZT/QlWU/0JVlP85UZT/MUWM/ykwhP8YIHv/EBR7/wAEc/8AAGP/AABj/wAE + a/8AAHP/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAc/8IAJT/EAC1/wgA + tf8IAJz/CACc/wgApf8IAKX/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACcKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA1nMQAM7/EADW/xAA + 1v8QANb/EADW/xAA1v8QANb/EADe/xAA3v8QAN7/EADe/xAA3v8QAOf/EADn/xAA5/8QAM7/EADW/xAA + 7/8QANb/CACt/wgAlP8IAJT/CACl/wgArf8IAK3/CACt/wgArf8IAK3/CACt/wgApf8IAJz/AACU/wAA + lP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/CAyM/xAclP8hJJT/KTCU/zE8lP85RZT/OU2U/zlR + lP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JRlP85TZT/OUmU/zFBjP8pOIz/ISyM/xgghP8QFHv/AAR7/wAA + c/8AAHP/AABz/wAAc/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAA + a/8AAGv/AABr/wAAc/8IAIz/CAC1/wgAvf8IALX/CACl/wgApf8IAKX/CACl/wgApf8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADOKRAA1v8QANb/EADW/xAA1v8QANb/EADW/xAA3v8QAN7/EADe/xAA + 3v8QAOf/EADn/xAA5/8QAOf/EADn/xAA7/8QAM7/EADO/xAA7/8QAO//EADW/wgAtf8IAJz/AACU/wgA + nP8IAKX/CACt/wgArf8IAK3/CACt/wgApf8IAKX/CACc/wgAlP8AAJT/AACM/wAAjP8AAIz/AACM/wAA + jP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAhP8AAIT/AACE/wAAhP8AAIT/AACE/wAA + e/8AAHv/AAB7/wAAe/8AAHv/AAB7/wAAe/8AAHv/AAB7/wAAe/8AAHv/AABz/wAAc/8AAHP/AABz/wAA + c/8AAHP/AABz/wAAa/8AAGv/AABr/wAAa/8AAGv/AABr/wAAc/8IAIT/CACl/wgAtf8IALX/CACt/wgA + pf8IAKX/CACl/wgApf8IAKX/CACl/wgApf8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACctQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADW7xAA + 1v8QANb/EADW/xAA1v8QAN7/EADe/xAA3v8QAN7/EADn/xAA5/8QAOf/GADn/xgA7/8YAO//GADv/xgA + 7/8QAN7/EADO/xAA5/8QAPf/EADv/xAA3v8IAL3/CACc/wgAlP8IAJz/CACl/wgApf8IAKX/CACl/wgA + pf8IAKX/CACl/wgAnP8IAJT/AACU/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAA + jP8AAIz/AACE/wAAhP8AAIT/AACE/wAAhP8AAIT/AACE/wAAhP8AAHv/AAB7/wAAe/8AAHv/AAB7/wAA + e/8AAHv/AAB7/wAAe/8AAHv/AAB7/wAAe/8AAHP/AABz/wAAc/8AAHP/AABz/wAAc/8AAGv/AABr/wAA + c/8IAIz/CACt/xAAtf8IALX/CAC1/wgAtf8IAKX/CACt/wgArf8IAKX/CACl/wgApf8IAKX/CACl/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJxzAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQANacEADW/xAA1v8QANb/EADe/xAA3v8QAN7/EADe/xAA + 5/8QAOf/EADn/xgA5/8YAO//GADv/xgA7/8YAO//GADv/xgA9/8YAO//EADW/xAA3v8QAO//EAD3/xAA + 9/8QAOf/EADG/wgApf8IAJz/CACc/wgAnP8IAKX/CACl/wgApf8IAKX/CACl/wgApf8IAJz/CACc/wAA + lP8AAJT/AACU/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAA + jP8AAIT/AACE/wAAhP8AAIT/AACE/wAAhP8AAIT/AACE/wAAhP8AAIT/AACE/wAAe/8AAHv/AAB7/wAA + e/8AAHv/AABz/wAAc/8AAHP/AABz/wgAhP8IAJz/EAC9/xAAvf8IAL3/CAC9/wgAvf8IAK3/CACl/wgA + rf8IAK3/CACt/wgArf8IAKX/CACl/wgApf8IAKX/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA + 1koQANb/EADW/xAA1v8QAN7/EADe/xAA3v8QAOf/EADn/xAA5/8YAO//GADv/xgA7/8YAO//GAD3/xgA + 9/8YAPf/GAD3/xgA9/8YAPf/GADe/xgA3v8YAO//GAD3/xgA9/8YAP//EADv/xAAzv8IAK3/CACl/wgA + nP8IAJz/CACc/wgApf8IAKX/CACl/wgApf8IAKX/CACc/wgAnP8IAJz/CACc/wAAlP8AAJT/AACU/wAA + lP8AAJT/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAhP8AAIT/AACE/wAA + hP8AAIT/AACE/wAAhP8AAIT/AAB7/wAAe/8AAHv/AAB7/wAAe/8AAHv/CACM/wgAnP8QAL3/EADO/xAA + zv8IAL3/CAC9/wgAvf8IALX/CACt/wgArf8IALX/CACt/wgArf8IAK3/CACt/wgApf8IAKX/CACl/wgA + pf8IAKX/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJzWAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA1vcQANb/EADe/xAA3v8QAN7/EADn/xAA + 5/8QAOf/EADn/xgA7/8YAO//GADv/xgA9/8YAPf/GAD3/xgA9/8YAPf/GAD3/xgA9/8YAP//GADv/xgA + 3v8YAPf/GAD3/xgA//8YAP//GAD//xgA9/8QAOf/EADO/xAAtf8IAKX/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJT/AACU/wAAlP8AAJT/AACM/wAAjP8AAIz/AACM/wAA + jP8AAIz/AACM/wAAjP8AAIz/AACM/wAAhP8AAIT/AACE/wAAhP8AAIT/AACE/wAAhP8AAIT/AACE/wAA + hP8IAIz/CACl/xAAvf8QAM7/EADW/xAAzv8IAMb/CAC9/wgAvf8IALX/CACt/wgApf8IALX/CAC1/wgA + tf8IALX/CAC1/wgArf8IAK3/CACt/wgApf8IAKX/CACl/wgApf8IAJz/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnHsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAEADWnBAA1v8QAN7/EADe/xAA3v8QAOf/EADn/xAA5/8YAO//GADv/xgA7/8YAPf/GAD3/xgA + 9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA7/8YAO//IQD//yEA//8hAP//GAD//xgA + //8YAP//GAD3/xgA5/8QAM7/EAC1/wgApf8IAJz/CACU/wAAlP8AAJT/AACU/wAAlP8IAJT/CACU/wgA + lP8IAJT/AACU/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIz/AACM/wAAjP8AAIT/AACE/wAA + hP8AAIT/AACE/wAAjP8IAIz/CACU/wgAnP8IAK3/EAC9/xAAzv8QANb/EADW/wgAxv8IAMb/CADG/wgA + vf8IALX/CACt/wgApf8IALX/CAC9/wgAvf8IALX/CAC1/wgAtf8IALX/CACt/wgArf8IAK3/CACl/wgA + pf8IAKX/CACl/wgAnP8IAJz/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACcGAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQANY5EADW/xAA3v8QAN7/EADe/xAA + 5/8QAOf/EADn/xgA7/8YAO//GADv/xgA9/8YAPf/GAD3/xgA9/8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAO//GAD3/yEA//8hAP//IQD//yEA//8YAP//GAD//xgA//8YAP//GADv/xAA + 3v8QAMb/CAC1/wgApf8IAJz/CACc/wgAnP8IAJz/CACU/wgAlP8IAJT/AACM/wAAjP8AAIz/AACM/wAA + jP8AAIz/AACM/wAAjP8AAIz/AACM/wgAjP8IAJT/CACc/wgApf8IAKX/CACt/xAAvf8QAMb/EADO/xAA + 1v8QAM7/CADG/wgAxv8IAMb/CADG/wgAvf8IALX/CACt/wgApf8IALX/CAC9/wgAvf8IAL3/CAC9/wgA + vf8IAL3/CAC1/wgAtf8IALX/CACt/wgArf8IAK3/CACl/wgApf8IAKX/CACc/wgAnP8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAQAN7eEADe/xAA3v8QAN7/EADn/xgA5/8YAO//GADv/xgA7/8YAPf/GAD3/xgA + 9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GADv/xgA + 9/8hAP//IQD//yEA//8hAP//IQD//xgA//8YAP//GAD//xgA//8YAP//GAD3/xgA7/8YAOf/EADe/xAA + 1v8QAM7/EAC9/xAAtf8QALX/CACt/wgArf8IAKX/CACl/wgApf8IAK3/CACt/wgAtf8QAL3/EADG/xAA + zv8QANb/EADW/xAA1v8QANb/EADW/xAAzv8IAMb/CADG/wgAxv8IAL3/CAC9/wgAtf8IAK3/CACl/wgA + pf8IALX/CADG/wgAxv8QAMb/CADG/wgAvf8IAL3/CAC9/wgAvf8IAL3/CAC1/wgAtf8IAK3/CACt/wgA + rf8IAKX/CACl/wgApf8IAKX/CACc/wgAnP8IAJz/CACc/wgAnP8IAJz/CACcYwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA3msQAN7/EADe/xAA + 3v8QAOf/GADn/xgA7/8YAO//GADv/xgA9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA9/8YAPf/IQD//yEA//8hAP//IQD//yEA + //8hAP//IQD//yEA//8YAP//GAD//xgA//8YAPf/GAD3/xgA9/8YAPf/EAD3/xAA9/8QAPf/EADv/xAA + 7/8QAO//EADv/xAA7/8QAO//EADv/xAA5/8QAN7/EADW/xAA1v8IAM7/CADG/wgAxv8IAMb/CADG/wgA + xv8IAL3/CAC9/wgAtf8IAKX/CACl/wgArf8QAL3/EADG/xAAxv8QAMb/EADG/xAAxv8QAMb/EADG/wgA + xv8IAL3/CAC9/wgAvf8IALX/CAC1/wgAtf8IAK3/CACt/wgApf8IAKX/CACl/wgApf8IAJz/CACc/wgA + nP8IAJz/CACc/wgAnO8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADeCBAA3vcQAN7/EADn/xAA5/8YAOf/GADv/xgA7/8YAO//GAD3/xgA + 9/8YAPf/GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//yEA9/8hAP//IQD//yEA//8hAP//IQD//yEA//8YAPf/GADv/xgA + 5/8QAOf/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/CADO/wgA + zv8IAMb/CADG/wgAxv8IAMb/CADG/wgAxv8IAL3/CAC1/wgArf8IAK3/CAC1/xAAxv8QAM7/EADO/xAA + zv8QAM7/EADG/xAAxv8QAMb/EADG/xAAxv8QAMb/EADG/wgAxv8IAL3/CAC9/wgAvf8IALX/CAC1/wgA + rf8IAK3/CACt/wgApf8IAKX/CACl/wgApf8IAJz/CACc/wgAnP8IAJz/CACcjAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADelBAA + 3v8QAOf/EADn/xgA5/8YAO//GADv/xgA7/8YAPf/GAD3/xgA9/8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//IQD//xgA//8YAP//EAD//xgA9/8QAOf/EADe/xAA3v8QANb/EADW/xAA1v8QAM7/EADO/wgA + zv8IAM7/CADO/wgAzv8IAM7/CADO/xAAzv8IAMb/CADG/wgAxv8IAMb/CAC9/wAAtf8AAK3/AACt/wgA + rf8QAMb/EADW/xAA1v8QANb/EADW/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADG/xAA + xv8QAMb/EADG/wgAvf8IAL3/CAC9/wgAtf8IALX/CAC1/wgArf8IAK3/CACl/wgApf8IAKX/CACl/wgA + pf8IAJz/CACc/wgAnP8IAJwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAN4YEADe/xAA5/8QAOf/GADn/xgA7/8YAO//GADv/xgA + 9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YBP//xr7v/97b3v+lntb/e3Hn/0pJ + 5/8pIN7/EADW/wgA1v8IAM7/CADO/wgAzv8IAM7/CADO/wgAzv8IAMb/CADG/wgAxv8IAMb/CAC9/wAA + vf8AALX/EAy1/zEwtf9aXb3/hIK9/7261v/v6+f/UlG1/wgAxv8QAN7/EADW/xAA1v8QANb/EADW/xAA + 1v8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAAxv8QAMb/CADG/wgAvf8IAL3/CAC9/wgA + tf8IALX/CACt/wgArf8IAK3/CACl/wgApf8IAKX/CACl/wgApf8IAJz/CACcnAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAQAN6cEADn/xAA5/8YAOf/GADv/xgA7/8YAO//GAD3/xgA9/8YAPf/GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//EAD//7Wu7//n497/zs/O/87P1v/e29b/5+Pe/+/r3v/v6+f/1tfn/8a+5/+lnuf/jIbe/3tx + 1v9jYdb/WlnO/1pdzv9rac7/hHnW/5SO1v+tqtb/xsPW/9bT1v/e49b/5+PW/97b1v/W09b/xsfO/9bX + 3v/37+//OTit/xAA1v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAA + zv8QAM7/EADO/xAAxv8QAMb/CAC9/wgAvf8IAL3/CAC1/wgAtf8IALX/CACt/wgArf8IAK3/CACl/wgA + pf8IAKX/CACl/wgApf8IAKUhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA5xgQAOf/EADn/xgA5/8YAO//GADv/xgA + 7/8YAPf/GAD3/xgA9/8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//9jWff/7+vn/87P1v/Oz9b/1tfW/+fj + 3v/e2+f/xr7v/+fn5//n5+//5+fv/+fn7//v6+//7+/v/+/v7//38+//7/Pv/+/v7//v6+//5+fn/+fj + 5//e397/3tve/97f1v+lnt7/5+PW/9bX1v/Oz9b/zsvO/97b3v/W197/CACt/xAA5/8QAN7/EADe/xAA + 1v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADG/xAAxv8IAMb/CAC9/wgA + vf8IAL3/CAC1/wgAtf8IALX/CACt/wgArf8IAK3/CACl/wgApf8IAKX/CAClpQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABAA55QQAOf/GADn/xgA7/8YAO//GADv/xgA9/8YAPf/GAD3/xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//EAD//9bX7//e197/zs/O/9bT1v/v697/jIbv/xgI//9aUff/9/Pn/+/r7//n5+//7+vv/+/r + 7//v6+//7+vv/+/r7//n5+//5+fv/+/r7//n5+//5+fn/+fj5//e397/zsve/wgA//9CNO//xsPe/97f + 1v/Oz87/zs/O/+/r5/9aXb3/EADW/xAA5/8QAN7/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADO/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADG/xAAxv8IAMb/CAC9/wgAvf8IAL3/CAC1/wgAtf8IALX/CACt/wgA + rf8IAK3/CACt/wgApf8IAKUYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADnEBAA5/8QAOf/GADv/xgA + 7/8YAO//GAD3/xgA9/8YAPf/GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//9CPP//7+/n/9bT1v/e29b/zsfn/zko + //8YAP//IQD//yEI///37+f/7+vv/+/r7//v6+//7+vv/+/r7//v6+//7+vv/+/r7//v6+//7+vv/+/r + 7//v6+//5+fn/+fn5/+Uhu//EAD3/xgA9/8QAPf/c3Hn/97f1v/Oy87/3tve/8a+1v8IAL3/GADn/xAA + 5/8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAAzv8QAMb/EADG/wgA + xv8IAL3/CAC9/wgAvf8IALX/CAC1/wgAtf8IAK3/CACt/wgArf8IAK3/CACtlAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADnhBAA5/8YAO//GADv/xgA7/8YAPf/GAD3/xgA9/8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//5SG9//n4+f/1tfW/5ya5/8QAP//IQD//yEA//8hAP//EAD//8a+7//v6+//7+vv/+/r + 7//v6+//7+vv/+/r7//v6+//7+vv/+/r7//v6+//7+vv/+/r7//v6+//9/Pn/0pB9/8YAP//GAD3/xgA + 9/8QAPf/OSzv/87P1v/W09b/7+/n/xAMrf8YAOf/EADn/xAA3v8QAN7/EADe/xAA1v8QANb/EADW/xAA + 1v8QAM7/EADO/xAAzv8QAM7/EADO/xAAxv8QAMb/EADG/wgAxv8IAL3/CAC9/wgAvf8IALX/CAC1/wgA + tf8IALX/CACt/wgArfcIAK0QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAOcIEADn5xgA + 7/8YAO//GADv/xgA9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8QAP//xr7v/97b3v/e29b/jIbv/xgA + //8hAP//IQD//yEA//8YAP//hHX3//fz7//v6+//7+/v/+/v7//v7+//7+/v/+/v7//v7+//7+/v/+/v + 7//v7+//7+/v/+/r7//v7+//GAT//xgA//8YAP//GAD//xgA9/8hEPf/3tve/9bT1v/v7+f/QkG1/xAA + 3v8YAOf/EADn/xAA3v8QAN7/EADW/xAA1v8QANb/EADW/xAA1v8QAM7/EADO/xAAzv8QAM7/EADG/xAA + xv8QAMb/EADG/wgAvf8IAL3/CAC9/wgAvf8IALX/CAC1/wgAtf8IALX/CAC1cwAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAOdSGADv/xgA7/8YAO//GAD3/xgA9/8YAPf/GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xAA///v6+//3t/n/97b3v/v7+//IRD//yEA//8hAP//IQD//yEA//85KP//9/fv/+/v + 7//v7+//7+/3/+/v9//v7/f/7+/3/+/v9//38/f/7+/3/+/v9//v7+//7+/v/7Wu9/8QAP//GAD//xgA + //8YAP//EAD3/4R97//n497/1tfW/+fn5/9rab3/EADe/xAA5/8QAOf/EADe/xAA3v8QAN7/EADW/xAA + 1v8QANb/EADW/xAAzv8QAM7/EADO/xAAzv8QAMb/EADG/xAAxv8QAMb/CADG/wgAvf8IAL3/CAC9/wgA + vf8IALX/CAC1/wgAtd4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAYAO+9GADv/xgA7/8YAPf/GAD3/xgA9/8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//IQT///f37//n5+f/5+fn/+/v + 7/+Mhvf/GAD//xgA//8YAP//GAD//xAA///n4/f/9/P3//fz9//38/f/9/P3//fz9//38/f/9/P3//fz + 9//38/f/9/P3//fz9//39/f/c2n//xgA//8YAP//GAD//xgA//8YDP//5+fn/+fj5//e297/5+Pn/4yG + zv8IANb/EADn/xAA5/8QAN7/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAA + zv8QAMb/EADG/xAAxv8IAMb/CADG/wgAvf8IAL3/CAC9/wgAvf8IAL3/CAC1OQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA7xgYAO/3GADv/xgA9/8YAPf/GAD3/xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8hEP////vv/+/r7//v6+//7+/v//fv9/8YDP//GAD//xgA//8YAP//EAD//6WW + ///39/f/9/f3//f3///39/////v////7////+///9/f///f3///39///9/f/////9/8pGP//GAD//xgA + //8YAP//GAD//4R59//v7+f/5+fv/97f3v/n4+f/nJbO/wgA1v8QAOf/EADn/xAA3v8QAN7/EADe/xAA + 1v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAAxv8QAMb/EADG/xAAxv8IAMb/CADG/wgA + vf8IAL3/CAC9/wgAvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABgA72sYAO//GAD3/xgA9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//ykU////+/f/9/P3//fz + 9//38/f/9/f3/4SC//8YAP//GAD//xgA//8YAP//Uk3/////////+/////v////7////+///OTT//7Wq + //////////v////7////+///3tf//xAA//8YAP//GAD//xgA//8YCP//7+vv/+/v7//v7+//3t/e/+fj + 5/+lmtb/CADW/xgA5/8QAOf/EADe/xAA3v8QAN7/EADW/xAA1v8QANb/EADW/xAAzv8QAM7/EADO/xAA + zv8QAM7/EADO/xAAxv8QAMb/EADG/wgAxv8IAMb/CAC9/wgAvf8IAL3nCAC9CAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA770YAO//GAD3/xgA + 9/8YAPf/GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//KRT////7///39///9/f///f3///39///9+///xgI//8YAP//GAD//xgA + //8YCP////v//////////////////1pR//8YAP//EAT//9bL//////////////////+Uiv//GAD//xgA + //8YAP//GAD//3t1////+/f/9/f3//fz9//e397/5+Pn/5ya1v8IAN7/GADn/xAA5/8QAOf/EADe/xAA + 3v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAAxv8QAMb/EADG/wgA + xv8IAMb/CAC9/wgAvUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAGAD3GBgA7+8YAPf/GAD3/xgA9/8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YBP/////////7 + ////+/////v////7////////hHn//xgA//8YAP//GAD//xAA//+9tv////////////97df//EAD//xgA + //8YAP//IRD//+fb/////////////0I4//8YAP//GAD//xgA//8YCP//7+/////7////+///9/f//+fj + 5//n5+f/jIrW/xAA3v8YAOf/EADn/xAA3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QAM7/EADO/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADG/xAAxv8QAMb/CADG/wgAxv8IAMaUAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD3ShgA + 9/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xAA///v5//////////////////////////////37///GAj//xgA + //8YAP//GAD//3Nt////////pZ7//xAA//8YAP//GAD//xgA//8YAP//MST///fv///38///EAD//xgA + //8YAP//GAD//3t1////////////////////+///7+vn//fz7/9radb/GADn/xgA5/8QAOf/EADe/xAA + 3v8QAN7/EADW/xAA1v8QANb/EADW/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAMb/EADG/xAA + xv8QAMb/CADGzgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD3jBgA9/8YAPf/GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//EAD//62i + //////////////////////////////////+Eef//GAD//xgA//8YAP//MSD//8a+//8QAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//Sjj//7Wm//8QAP//GAD//xgA//8YCP//7+/////////////////////7 + ///v6+//9/f3/ykk1v8YAOf/GADn/xAA5/8QAN7/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADO/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAMb/EADG/xAAxvcIAMYhAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAGAD3xhgA9/8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//WlH///////////////////////////////////fz + //8YCP//GAD//xgA//8YAP//GAT//xgA//8YAP//GAD//0Iw//8YAP//GAD//xgA//8YAP//IQj//xgA + //8YAP//GAD//3t1//////////////////////////v//+/v7//W1+//CADe/xgA5/8QAOf/EADe/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA + xv8QAMb/EADGQgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAPcQGAD33hgA9/8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8QAP//59///////////////////////////////////4R9//8YAP//GAD//xgA//8YAP//GAD//xgA + //85LP//9/P//62m//8QAP//GAD//xgA//8YAP//GAD//xgA//8YCP//7+////////////////////// + ////+/////v//2Nh3v8QAOf/EADn/xAA5/8QAN7/EADe/xAA3v8QAN7/EADW/xAA1v8QANb/EADO/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADG/xAAxnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAYAPchGAD37xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//9aSf////////////////////////// + ////////9/P//xgM//8YAP//GAD//xgA//8YAP//MSj//+/r/////////////6We//8QAP//GAD//xgA + //8YAP//GAD//4R5///////////////////////////////7///W0/f/CADe/xAA5/8QAOf/EADn/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA + zv8QAM6cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP8xGAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xAA//+lmv//////////////////////////////////lIr//xgA//8hAP//GAD//ykk + ///v5////////////////////////5yW//8QAP//GAD//xgA//8YEP//9/P///////////////////// + ////////9/f//yko3v8YAOf/EADn/xAA5/8QAN7/EADe/xAA3v8QAN7/EADW/xAA1v8QANb/EADW/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADOtQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP9KGAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xAA//+9tv////////// + ////////////////////+///IRj//xgA//8pJP//7+f//////////////////////////////////5SO + //8QAP//EAD//5SO//////////////////////////////////9KPOf/EADn/xAA5/8QAOf/EADn/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADO/xAA + zs4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAYAP9SGAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xAA//+cmv////////////////////////////+tov//KSD//+fj + /////////////////////////////////////////////5SK//8pIP////////////////////////// + ///v5///OTTn/xAA5/8QAOf/EADn/xAA5/8QAN7/EADe/xAA3v8QAN7/EADW/xAA1v8QANb/EADW/xAA + zv8QAM7/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7OEADOCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP9SGAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xAA + //9jUf//7+v////////////////////////v5/////////////////////////////////////////// + /////////////+fj////////////////////////ta73/xgU5/8YAO//EADn/xAA5/8QAOf/EADe/xAA + 3v8QAN7/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADO/xAAzv8QAM7/EADO/xAAzv8QAM7/EADOzhAA + zggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAYAP9KGAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//IQD//xgA//8YCP//jIb///fz//////////////// + ////////////////////////////////////////////////////////////////////////zsf//0pF + 7/8IAO//GADv/xgA5/8QAOf/EADn/xAA5/8QAN7/EADe/xAA3v8QAN7/EADW/xAA1v8QANb/EADW/xAA + 1v8QANb/EADO/xAAzv8QAM7/EADO/xAAzsYQAM4IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP8xGAD/7xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//yEA + //8hAP//IQD//yEA//8YAP//GAj//3Np///Wy/////////////////////////////////////////// + ///////////////////38///pZr//0I47/8IAO//GADv/xgA7/8YAOf/GADn/xAA5/8QAOf/EADe/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QAM7/EADO/xAAzv8QAM6tAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP8hGAD/1hgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//yEA//8hAP//IQD//yEA//8hAP//IQD//yEA//8hAP//GAD//xAA + //8pFP//Ukn//3tx//+Mff//jIL//4yC//+Mgv//jH3//3t1//9aVf//OSz//xAA9/8QAPf/GAD3/xgA + 7/8YAO//GADn/xgA5/8QAOf/EADn/xAA3v8QAN7/EADe/xAA3v8QAN7/EADW/xAA1v8QANb/EADW/xAA + 1v8QANb/EADO/xAAzv8QAM7/EADOhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAYAP8IGAD/tRgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8hAP//IQD//yEA + //8hAP//IQD//yEA//8hAP//IQD//yEA//8hAP//IQD//yEA//8YAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA9/8YAPf/GAD3/xgA9/8YAO//GADv/xgA7/8YAOf/EADn/xAA5/8QAN7/EADe/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QAM7/EADO9xAAzkoAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD/axgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//IQD//yEA//8hAP//IQD//yEA//8hAP//IQD//yEA//8hAP//IQD//yEA + //8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA9/8YAPf/GAD3/xgA9/8YAO//GADv/xgA + 7/8YAO//GADn/xAA5/8QAOf/EADe/xAA3v8QAN7/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADW/xAA + 1v8QANb/EADW/xAAzs4QAM4hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAGAD/KRgA/84YAP//GAD//xgA//8YAP//GAD//yEA//8hAP//IQD//yEA + //8hAP//IQD//yEA//8hAP//IQD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + 9/8YAPf/GAD3/xgA9/8YAPf/GADv/xgA7/8YAO//GADv/xgA5/8QAOf/EADn/xAA5/8QAN7/EADe/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANb/EADW/xAA1v8QANZ7AAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA + /2sYAP/3GAD//xgA//8hAP//IQD//yEA//8hAP//IQD//yEA//8hAP//IQD//yEA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//xgA9/8YAPf/GAD3/xgA9/8YAPf/GAD3/xgA7/8YAO//GADv/xgA + 7/8YAOf/EADn/xAA5/8QAOf/EADe/xAA3v8QAN7/EADe/xAA3v8QANb/EADW/xAA1v8QANb/EADW/xAA + 1v8QANa9EADWIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA/xAYAP+UIQD//yEA//8hAP//IQD//yEA + //8hAP//IQD//yEA//8hAP//GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA9/8YAPf/GAD3/xgA + 9/8YAPf/GAD3/xgA7/8YAO//GADv/xgA7/8YAOf/GADn/xAA5/8QAOf/EADn/xAA3v8QAN7/EADe/xAA + 3v8QAN7/EADe/xAA1v8QANb/EADW/xAA1v8QANbeEADWUgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAYAP8YGAD/lCEA//chAP//IQD//yEA//8hAP//GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//8YAPf/GAD3/xgA9/8YAPf/GAD3/xgA7/8YAO//GADv/xgA7/8YAO//GADn/xAA + 5/8QAOf/EADn/xAA5/8QAN7/EADe/xAA3v8QAN7/EADe/xAA3v8QAN7/EADW/xAA1v8QANbOEADWWgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD/CBgA + /2MhAP/OIQD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8YAPf/GAD3/xgA9/8YAPf/GAD3/xgA + 9/8YAO//GADv/xgA7/8YAO//GADv/xgA5/8YAOf/EADn/xAA5/8QAOf/EADn/xAA3v8QAN7/EADe/xAA + 3v8QAN7/EADe/xAA3vcQANaUEADWMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP8hGAD/exgA/84YAP//GAD//xgA + //8YAP//GAD3/xgA9/8YAPf/GAD3/xgA9/8YAO//GADv/xgA7/8YAO//GADv/xgA7/8YAOf/GADn/xAA + 5/8QAOf/EADn/xAA5/8QAN7/EADe/xAA3v8QAN7/EADe9xAA3qUQAN5SAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA/xAYAP9aGAD/lBgA994YAPf/GAD3/xgA9/8YAPf/GADv/xgA + 7/8YAO//GADv/xgA7/8YAOf/GADn/xAA5/8QAOf/EADn/xAA5/8QAOf/EADe/xAA3vcQAN69EADeexAA + 3jkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAYAPc5GAD3YxgA94QYAO+cGADvtRgA784YAO/WGADn3hgA59YQAOfWEADnxhAA + 560QAOeUEADnexAA51IQAN4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAD/////////AAH/////////////////+AAAP////////////////+AAAAf///////////////+AAAAB + ///////////////+AAAAAP//////////////+AAAAAA//////////////+AAAAAAD/////////////+A + AAAAAAP////////////+AAAAAAAA////////////+AAAAAAAAD////////////AAAAAAAAAP//////// + ///AAAAAAAAAA///////////AAAAAAAAAAH//////////gAAAAAAAAAA//////////wAAAAAAAAAAD// + ///////4AAAAAAAAAAAf////////8AAAAAAAAAAAD////////+AAAAAAAAAAAA/////////AAAAAAAAA + AAAH////////wAAAAAAAAAAAA////////4AAAAAAAAAAAAP///////+AAAAAAAAAAAAB////////AAAA + AAAAAAAAAf///////wAAAAAAAAAAAAD///////8AAAAAAAAAAAAA///////+AAAAAAAAAAAAAP////// + /AAAAAAAAAAAAAA//////+AAAAAAAAAAAAAAB/////+AAAAAAAAAAAAAAAH/////AAAAAAAAAAAAAAAA + /////gAAAAAAAAAAAAAAAH////wAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAA + AAAAAB////AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAAB///4AAAAAAAAAAAAAAAAAf//8AAAAAA + AAAAAAAAAAAD///AAAAAAAAAAAAAAAAAA///wAAAAAAAAAAAAAAAAAP//4AAAAAAAAAAAAAAAAAB//+A + AAAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAH//4AAAAAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAA + AP//AAAAAAAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAA + AAAAAAD//wAAAAAAAAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//wAAAAAA + AAAAAAAAAAAA//8AAAAAAAAAAAAAAAAAAP//AAAAAAAAAAAAAAAAAAD//4AAAAAAAAAAAAAAAAAB//+A + AAAAAAAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAP//8AAAAAAAAAAAAAAAAAD///gAAAAAAAAAAAAAAAA + B////gAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAB////8AAAAAAAAAAAAAAAAf////AAAAAAAAAAA + AAAAAD////gAAAAAAAAAAAAAAAA////4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////AAAAAA + AAAAAAAAAAAf///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAP///g + AAAAAAAAAAAAAAAAD///4AAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAA + D///4AAAAAAAAAAAAAAAAA///+AAAAAAAAAAAAAAAAAP///gAAAAAAAAAAAAAAAAD///8AAAAAAAAAAA + AAAAAA////AAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAAAAAAD///8AAAAAAAAAAAAAAAAB////AAAAAA + AAAAAAAAAAAf///4AAAAAAAAAAAAAAAAH///+AAAAAAAAAAAAAAAAB////gAAAAAAAAAAAAAAAA////8 + AAAAAAAAAAAAAAAAP////AAAAAAAAAAAAAAAAD////wAAAAAAAAAAAAAAAB////+AAAAAAAAAAAAAAAA + f////gAAAAAAAAAAAAAAAP////4AAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAA/////wAAAAAAAAAA + AAAAAf////+AAAAAAAAAAAAAAAH/////gAAAAAAAAAAAAAAD/////8AAAAAAAAAAAAAAA//////AAAAA + AAAAAAAAAAf/////4AAAAAAAAAAAAAAH/////+AAAAAAAAAAAAAAD//////wAAAAAAAAAAAAAB////// + +AAAAAAAAAAAAAAf//////gAAAAAAAAAAAAAP//////8AAAAAAAAAAAAAD///////gAAAAAAAAAAAAB/ + //////4AAAAAAAAAAAAA////////AAAAAAAAAAAAAf///////4AAAAAAAAAAAAH////////AAAAAAAAA + AAAD////////wAAAAAAAAAAAB////////+AAAAAAAAAAAA/////////wAAAAAAAAAAAf////////+AAA + AAAAAAAAP/////////wAAAAAAAAAAD/////////+AAAAAAAAAAB//////////wAAAAAAAAAA//////// + //+AAAAAAAAAA///////////wAAAAAAAAAf//////////+AAAAAAAAAP///////////4AAAAAAAAH/// + /////////AAAAAAAAH////////////8AAAAAAAD/////////////gAAAAAAD/////////////+AAAAAA + D//////////////4AAAAAD///////////////wAAAAH////////////////gAAAP//////////////// + /wAA/////////ygAAAAwAAAAYAAAAAEAIAAAAAAAgCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAc4bOEHOCznNzgs61c4LO3nOCzu9zgs7nc4LO1muCxq1rfcZja3m9CAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHuO1hBzis6Mc4bO93OG1v97itb/e4rW/3OCzv9zgs7/c4LO/3OCzv9rfcb/a3m972N5 + tXNjdbUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACEktYIhJLWe3uS3u97lt7/hJrn/4yi7/+Mqu//c47W/2uCxv9rfb3/a329/2t9 + vf9rfb3/a329/2t5vf9jdbXeY3W1YwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAhJLWCISS1nuEktbvjJ7n/4ym7/+Mqvf/lLL//5Sy//+Enuf/c4rW/3OG + zv9rgs7/a4LG/2N9vf9jfb3/a329/2t9vf9jfbX/Y3m1/2N1td5jda1jAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEkt5ShJLe54yi5/+Mqu//jKrv/4yq9/+Usvf/lLL3/4yq + 9/+Uru//lLb3/4yq7/+Ent7/a4rG/2N9tf9jfbX/Y329/2t9vf9rfb3/a329/2N9tf9jebX/Y3Wt1lpx + pTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISa74yEou//lK73/5S29/+Uuvf/lLb3/5Sy + 9/+Usvf/nL7//5S27/+Eptb/c5bO/3OOxv9rgr3/WnW1/2N1tf9jfbX/Y321/2N9tf9jfbX/a329/2t9 + vf9jfbX/Y3m1/1pxrf9SaZxjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAhKL3jIyq9/+cuvf/nMP3/6XH + //+cw/f/jKbn/3uW1v9jfb3/Um2l/yEwUv8QGCn/GCAx/zlJc/8xQWP/EBwp/xAcKf8pNFL/SmWc/1Jp + pf9jda3/Y3m1/2N9tf9jfbX/Y321/2N5rf9abaX/UmmcWgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEovc5jKb3/5y+ + 9/+ly///pcv//6XL//9rhrX/MTxj/zFBY/9KWYz/CBAh/wAEEP8ABBD/AAAI/wAIEP8ABBD/AAAI/wAA + CP8AAAj/EBgp/0pZjP8xQWP/MUFj/1JplP9jea3/Y3m1/2N5tf9ada3/Wm2l91JpnBgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACEove1lLb3/6XL//+lz///pc///2uCpf8ABBD/AAQQ/wAAEP8ABBD/AAQQ/xgkOf9KXYz/a4a9/3uW + zv97ntb/c469/1JlhP8YHCn/AAAI/wAACP8AAAj/AAAI/wAEEP9CVYT/WnWt/2N1rf9ada3/Wm2l/1Jp + nIQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAIym7wiMqvf/nMf//63T//+t0///pc///xAYKf8ABBj/AAQY/wAEGP8ACBj/Sl2M/3OO + zv9zjs7/c5LO/3OOzv9zjs7/c47O/3OSzv+Eotb/Sllz/wAACP8AAAj/AAAI/wAACP8YIDH/WnGl/1px + pf9abaX/Ummc/1JpnNYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcuvchlLL3rYSi5+ecuvf/pc///63X//+cx+//QlVz/wAEGP8ACBj/AAwh/wgM + If9SaZz/c5LO/3ua1v+Ent7/hKLe/4Se3v97mtb/c5LO/3OOzv9zjs7/e5rW/0pdc/8AAAj/AAAI/wAA + CP8ICBD/MUVj/1ptpf9SaZz/Ummc/1JllP9jfbXnY321rWN9tSEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzD/zGcw//vpc///5zD9/+ly///rdP//63T//8hMEL/AAQQ/wAI + GP8IECn/EBgx/zE8Wv+Eot7/hKrn/5Sy7/+Utu//lLbv/5Sy7/+Mquf/hKLe/3uW1v9zjs7/c47O/3ue + 1v8QFCH/AAAI/wAAAP8AAAj/AAAI/yEsQv9SZZT/WnWt/1JllP9jebX/Y321/2N9te9jebUxAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnMP3EJzD9+et1///rdv//6XP9/+lz///rdf//3OO + pf8ABBj/AAgY/wgQKf8QHDn/EBgx/1ptnP+Usu//nMP3/6XH9/+cx/f/nMP3/5zD9/+cuvf/jLLn/4Si + 3v9zks7/c47O/3OSzv8xQVr/AAAA/wAACP8ABBD/AAAQ/wAACP9CUXv/Y321/1JpnP9aea3/Wnm1/1p5 + tf9jebXnY3m1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnMP3lKXT9/+t3///rdv//4y2 + 3v+ly/f/rdf//1JlhP8ACBj/CBAp/xAYMf8IECn/CBAh/3OKtf+cx/f/rdP//63X//+t1///rdf//63X + //+tz/f/nMP3/4yu5/97mtb/c5LO/3OSzv9CUXv/AAQI/wAEEP8ACBj/AAQY/wAEEP8xPFr/Y4K9/1px + pf9KZZz/SmWl/1pxrf9adbX/Y321lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcw/cYpcv3963b + //+t3///hKrO/xgwa/+cx/f/rdP//1p1jP8ACCH/CBAp/zFBWv97nrX/nL7n/5S27/+t0///vef//73r + ///G6///vef//73j//+13///rdP//5y67/+Ept7/c5bW/3OSzv97ntb/jK7n/2N5pf8YIDn/AAgY/wAE + GP85SWv/a4rO/1p1rf8AGFr/SmGl/1Jxrf9aca3/Y32192N9tRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACcw/djpc/3/63b//+t1///Y4Kt/wAcWv+Eotb/pc/3/4Sqxv8IECH/c5Kl/63b9/+cvu//rcPv/7XL + 9/+t2///xvP//877///O+///zvf//8bv//+94///tdv//6XH9/+Mru//e5re/3OW1v+90+//vdf3/6XH + 9/+Utvf/SlmE/wAIGP9jebX/c5LW/0JZjP8AGFr/QlmU/1Jtrf9aca3/Wnm1/2N9vWMAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcw/elnMf3/5zD9/+cw/f/UnWl/wAYUv85UYT/nMfv/6XT9/+Mqsb/tef//6XT + 9//n7////////97Hpf+tx9b/xu///877///O+///zvf//8bz//+94///rdv//6XL9/+Mru//e57e/4yS + pf/ey63/7+vv/9bj7/+lz///jK7v/2N9tf9zktb/Y321/xgoWv8AEDn/OVGM/0plpf9aca3/WnGt/2OC + vaUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcvvfWnL73/5Sy9/+Usvf/Um2l/wAYSv8AHGP/a47G/6XP + 9/+14///vev//6XP9/////////f3/7WCIf9KKCH/pbbO/7Xf//+94///veP//7Xf//+t2///rdP//6XL + 9/+Utvf/e32t/zkYEP+1hin/9/P3/97j5/+t0/f/jKrn/3OW1v9rhr3/MU2M/wAcWv8AEEL/MUmE/0ph + pf9aca3/WnGt/2OCvdYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcvvfvlLb3/5S6//+Mqu//Ql2c/wAc + Wv8AIGv/Y321/63T9/+95///vev//63P9///////79u9/3tZEP9SCAD/UgwA/1phY/+tz+f/pdP//6XP + //+ly///nMf//63D1v9SSUr/YwwA/zkIAP+EXRD/59/O/+fn5/+lz/f/hKLe/3OSzv9rhr3/KUWE/wAc + Y/8AFEr/OU2M/1Jtrf9Sca3/WnGt/2OCve8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcw/fejK7v/5Sy + 9/+Msvf/Um2c/wAcWv8AIGP/c5bO/63X//+95///vev//7XT9///////79+t/2tZGP8YCAD/GAwI/ykg + CP/Gz63/vef//7Xj//+lz///lLr3/7WyjP8YEAD/IQwI/xAIAP9zXRj/59u9/+fn7/+lx+//e57e/3OS + zv9rhr3/OVGM/wAUUv8AFEr/OVWM/1Jprf9Sba3/Um2t/2N9td4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AACcvvelpc/3/5zD9/+13///WnWc/wAcWv8AIGP/lLrv/63b//+15///vef//7XX9///////9+fG/4x5 + Kf9aUUL/lIpz/1JFGP/G17X/vev//7Xn//+l0///nMP3/62mjP85LBD/nI57/1pNOf+cgin/7+fO/+fn + 7/+cw+//e57e/3OSzv9rgr3/Sl2U/wAQQv8AFEr/OVGE/1p1rf9aca3/WnWt/2N9taUAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAACcvvc5pcv3/63b9/+13///MUmE/wAcWv8IKGv/pcf//63X//+14///teP//63P + 9/////////v3/97HSv9CPCn/WlFC/7WiOf+929b/vef//7Xj//+l0///nMf3/5yipf+UeSH/WlFC/0pB + Kf/ex1L/9/f3/+fn5/+Utu//e57e/3OOxv9adaX/UmWU/wAMOf8AFEr/GChz90plpf9aca3/Wnm1/2N5 + tTkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjKrvMXOO72MhHN7/CBB7/wAcUv8QMHP/pcv//63T + //+t2///td///6XT9//v8/////////fnrf/Ww0L/xrZC/+fXe/+13///tef//7Xf//+l0///nMf//4yu + 5//Wtlr/vaZC/97HSv/3573/9/f3/87X5/+Eot7/a47G/2N9rf9acaX/Ummc/wAMOf8AFEL/AAxz/xAQ + nOc5SZxaSmGlMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEY1nsQANb/CAyE/wAc + Uv8QMGv/nL73/5zH7/+ly/f/pc/3/6XL9/+ty/f///v////////379b/7+e9/7XP7/+13///tef//7Xf + //+lz///nMP3/4yu7/+tut7/1s+t/97Xxv/e297/zsvW/3uSvf9jgrX/Y3mt/1p1rf9acaX/Ummc/wAM + Of8AFEL/AAh7/wAAnP8QEJxSAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADOCBAA + zu8QAM7/CAC9/wAQUv8QHEr/c469/2uKvf9rir3/c469/3OSxv97lsb/hJ7G/7W+1v/Gy97/lKrO/3ua + vf+Utt7/lLre/5S23v+Mqtb/hKLW/3OSxv9jea3/hJK9/5ymvf+Unr3/a4K1/1p5rf9ada3/WnGt/1Jt + pf9SaaX/SmGc/wAMOf8AEFr/AACU/wAAnP8AAJzGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAEADOQhAAzv8QAM7/EADO/wgEnP8IEGP/Um2l/1Jtpf9aca3/QlF7/2N5rf9jfbX/Y321/2OC + tf9rgrX/SmWM/yk4Uv9rgrX/a4K1/2OCtf9jgrX/Y321/2N9tf8hKEL/UmWU/1p1rf9ada3/WnGt/1Jt + pf9SaaX/OUl7/0phnP9KXZz/QlWU/wAIUv8AAHP/AACc/wAAnP8AAJz/AACcGAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAACADOexAAzv8QAM7/EADO/wgAlP8IALX/ISSl/0pZnP9KYZz/GCRC/xgk + Qv9CWYT/Um2c/0pdjP8hLFL/AAQY/zlJa/9jea3/WnWt/1p1rf9ada3/WnGt/1pxpf8hMFL/AAgh/yk0 + Wv9CVYz/Sl2U/zFJc/8QGDH/ITBa/0JZnP85UZT/EBRz/wAAa/8AAGv/AACc/wAAnP8AAJz/AACcSgAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADOlBAAzv8QAM7/EADO/wgAtf8IAK3/CAC1/xAI + pf8xRZz/KThj/wAEGP8ABBj/AAQY/wAAIf8AABj/AAgQ/1JlnP9SaaX/Umml/1Jppf9SZaX/SmWl/0ph + nP85TYT/AAQY/wAAIf8AABj/AAQY/wAEGP8ABBj/MUV7/yk4hP8ABGv/AABr/wAAa/8AAIT/AACc/wgA + nP8IAJz/AACcYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADOlBAAzv8QAM7/EADW/xAA + 1v8IAK3/CACl/wgAtf8IAKX/GByU/wAIKf8AACH/AAAh/wAAGP8ABBD/ITBa/0pdnP9KXZz/Sl2c/0pd + nP9CWZz/Qlmc/0JZnP9CVZT/GCBC/wAIGP8ABBj/AAAh/wAEGP8IDDH/EBRz/wAAa/8AAGv/AABr/wgA + jP8IAJz/CACc/wgAnP8AAJz/AACcYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADOexAA + zv8QANb/EADW/xAA1v8QANb/CAC1/wgAnP8IALX/CACt/wgAlP8ABDn/AAQQ/wAEEP8YKEr/QlWU/0JV + lP9CVZT/QlWU/0JVlP9CVZT/QlWU/0JRlP9CUZT/OU2M/xAgOf8ACBD/AAgY/wAEMf8AAGP/AABr/wAA + a/8AAHP/CACc/wgAnP8IAJz/CACc/wgAnP8AAJz/AACcSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAEADOShAA1v8QANb/EADW/xAA3v8QAOf/EADe/xAAzv8IAK3/CACl/wgArf8IAKX/CACc/wAA + lP8QEIz/GByM/yEolP8pNJT/KTyU/zFBlP8xPJT/KTiM/ykwjP8hKIT/EByE/wgMc/8AAGv/AABr/wAA + a/8AAGv/AABr/wgAjP8IAK3/CACl/wgApf8IAJz/CACc/wgAnP8IAJz/CACcIQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAEADWEBAA1vcQANb/EADe/xAA5/8YAOf/GADv/xgA5/8QAOf/EADe/wgA + tf8IAKX/CACl/wgApf8IAJz/AACU/wAAjP8AAIz/AACM/wAAhP8AAIT/AACE/wAAe/8AAHv/AAB7/wAA + e/8AAHv/AABz/wAAe/8IAJT/CACt/wgAtf8IAK3/CACl/wgApf8IAJz/AACc/wgAnP8AAJzeAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA1rUQAN7/EADn/xgA5/8YAO//GAD3/xgA + 9/8YAPf/GADv/xgA9/8YAO//EADO/wgArf8IAJz/CACc/wgAnP8AAJT/AACU/wAAjP8AAIz/AACM/wAA + hP8AAIT/AACE/wAAjP8IAJz/CAC1/xAAxv8IALX/CAC1/wgAtf8IALX/CACt/wgApf8IAJz/CACc/wgA + nP8IAJyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA3lIQAN7/EADn/xgA + 7/8YAPf/GAD3/xgA//8YAP//GAD//xgA//8hAP//IQD//xgA//8YAPf/EADe/xAAzv8QAMb/CAC1/wgA + rf8IAK3/CAC1/wgAtf8IAL3/EADG/xAAxv8IAL3/CAC1/wgAtf8IAL3/CAC9/wgAvf8IALX/CACt/wgA + pf8IAKX/CACc/wgAnP8AAJwpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAQAN7nEADn/xgA7/8YAPf/GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA//8hAP//KRD//xAA + 7/8QAN7/EADW/xAA1v8QANb/EADO/wgAxv8IAL3/GBC9/wgAvf8QAMb/EADO/xAAzv8QAMb/EADG/wgA + xv8IAL3/CAC1/wgArf8IAKX/CACc/wgAnL0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAQAOdzEADn/xgA7/8YAPf/GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//xgA + //+Efe//1tPW/72+3v+tquf/lI7e/4R93v+Egtb/lI7W/6Wizv+9utb/1tPW/1pVzv8QAN7/EADW/xAA + 1v8QAM7/EADO/xAAxv8IAL3/CAC1/wgArf8IAKX/CACl/wgApUIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAOcIEADn5xgA7/8YAPf/GAD//xgA//8YAP//GAD//xgA + //8YAP//GAD//ykU///e297/jILv/ykY///v5+//7+vv/+/r7//v6+//5+fv/87H5/8pGPf/nJbe/8bH + 1v8QANb/EADe/xAA1v8QAM7/EADO/xAAzv8IAMb/CAC9/wgAtf8IAK3/CACtvQAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADnWhgA7/8YAPf/GAD//xgA + //8YAP//GAD//xgA//8YAP//GAD//1pN///e297/MRj//xgA//+9tvf/7+/v/+/v7//v7+//7+/v/5SK + 9/8YAP//Sjj3/97f3v8pINb/EADe/xAA1v8QANb/EADO/xAAzv8IAMb/CAC9/wgAvf8IALX/CAC1MQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA + 770YAPf/GAD//xgA//8YAP//GAD//xgA//8YAP//GAD//3Nl///v7+//jIb//xgA//97cf//9/f//97f + ///v7///9/f//1JF//8YAP//tarv/+fj5/9CONb/EADn/xAA3v8QANb/EADO/xAAzv8QAMb/CADG/wgA + vf8IAL2MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABgA7xgYAPfvGAD//xgA//8YAP//GAD//xgA//8YAP//GAD//3Nh////+///7+///ykU + //85KP//7+///0Io//9aTf//7+v//yEI//9KNP////v//+/r7/9CNN7/EADn/xAA3v8QANb/EADO/xAA + zv8QAM7/EADG/wgAxtYIAL0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAPdSGAD3/xgA//8YAP//GAD//xgA//8YAP//GAD//0Is + /////////////5SG//8YAP//QjD//ykQ//8hBP//SjT//xgA//+9sv///////+/r7/8YCN7/EADe/xAA + 3v8QANb/EADO/xAAzv8QAM7/EADG9wgAxikAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD3exgA//8YAP//GAD//xgA + //8YAP//GAD//xgA//+1rv////////fz//8pFP//KQz//87H//+tpv//GAT//0o0/////////////4SC + 7/8QAOf/EADe/xAA1v8QANb/EADO/xAAzv8QAM7/EADGSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA + /4wYAP//GAD//xgA//8YAP//GAD//xgA//8pDP//vbb///////+lnv//zsP/////////////paL//8bD + ////////nJb3/xgA5/8QAN7/EADe/xAA1v8QANb/EADO/xAAzv8QAM5jAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAYAP+EGAD//xgA//8YAP//GAD//xgA//8YAP//IQD//2NV///Ow///9/f///// + ////////9+///72y//9SQff/EADn/xAA5/8QAN7/EADW/xAA1v8QANb/EADO9xAAzloAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD/WhgA//cYAP//GAD//xgA//8hAP//IQD//yEA + //8YAP//IQz//ykQ//8pEP//GAj3/xgA7/8YAO//EADn/xAA3v8QAN7/EADW/xAA1v8QAM7nEADOOQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA/yEYAP+1GAD//xgA + //8hAP//GAD//xgA//8YAP//GAD//xgA9/8YAPf/GADv/xgA7/8QAOf/EADe/xAA3v8QANb/EADW/xAA + 1pwQANYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAGAD/QhgA/60YAP/3GAD//xgA//8YAPf/GAD3/xgA7/8YAO//GADn/xAA5/8QAN7/EADe/xAA + 3u8QANacEADWKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAP8QGAD/UhgA95QYAPfGGADv3hgA7+8YAOfvEADn3hAA + 570QAN6EEADeShAA3ggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//+AH//8AAP//gAH//wAA//4AAP//AAD/+AAAP/8AAP/w + AAAP/wAA/+AAAAf/AAD/wAAAA/8AAP+AAAAB/wAA/4AAAAH/AAD/AAAAAf8AAPwAAAAAPwAA+AAAAAAf + AADwAAAAAA8AAPAAAAAADwAA4AAAAAAHAADgAAAAAAcAAOAAAAAABwAA4AAAAAAHAADgAAAAAAcAAOAA + AAAABwAA4AAAAAAHAADgAAAAAAcAAPAAAAAADwAA+AAAAAAfAADwAAAAAB8AAPAAAAAADwAA8AAAAAAP + AADwAAAAAA8AAPAAAAAADwAA8AAAAAAPAADwAAAAAA8AAPAAAAAAHwAA+AAAAAAfAAD4AAAAAB8AAPwA + AAAAPwAA/AAAAAA/AAD8AAAAAH8AAP4AAAAAfwAA/wAAAAD/AAD/AAAAAP8AAP+AAAAB/wAA/8AAAAP/ + AAD/4AAAB/8AAP/wAAAP/wAA//gAAB//AAD//AAAP/8AAP//AAD//wAA///AA///AAAoAAAAIAAAAEAA + AAABACAAAAAAAIAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAc4bOIXOCzpRzgs7Wc4LO73OCzu9zgs7Oa33GhGt5vRgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAhJLWGHuS1pR7kt7/hJrn/4Sa5/9zhs7/a33G/2t9xv9rfb3/a3m992N1 + tYRjdbUQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAhJLWEISS1pSEmt73jKbv/5Su9/+Usvf/hJ7n/3uS3v9zis7/Y329/2N9 + vf9rfb3/a321/2N5tfdjda2EWnGtCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAISa7zmEnufvlLL3/5Sy9/+Usvf/lLL3/5S29/+Mqt7/e5rW/2uG + xv9jebX/Y321/2N9tf9jfbX/a329/2N5tf9aca3eWm2cKQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEovcpjKr395zD9/+lx///jLLn/3OKxv9aca3/IShK/wgQ + If8hKEL/GCQ5/wgQIf8hLEr/UmWc/2N1rf9jebX/Y321/2N5tf9abaXvUmmcGAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAISm972cw/f/pc///4yq1v8QGCn/AAQY/wgU + Kf8IECH/OUlr/1JljP9SaYz/OUlj/wgMGP8IFCH/AAQI/xAYKf9SaZT/Y3Wt/1pxpf9SaZycAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEou9ClLb3/63T//+t0///OUlj/wAE + GP8ACBj/KTRS/2uKxv9zks7/c5LO/3OOzv9zjs7/e5bG/yEsOf8AAAj/AAAI/yk4Uv9acaX/Ummc/1Jl + lO9ada05AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcvv8QnMP/1py+9/+ly///rdf//zFB + Uv8ABBj/CAwp/xgkQv97mtb/jKrn/4yy5/+Mruf/hKbe/3uW1v9zjs7/c5LG/wAIEP8AAAj/AAAI/yEw + Sv9SaZz/Ummc/2N9tf9jfbXWY3m1EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJzH98at1///pdP//6XP + //97nr3/AAQY/wgQKf8QGDH/QlF7/5S67/+ly/f/pcv3/6XH9/+cvvf/jKrn/3OSzv9zks7/ISxC/wAA + CP8ABBD/AAAQ/0JZhP9ada3/WnWt/1p1rf9jebXGAAAAAAAAAAAAAAAAAAAAAAAAAACcw/dKrdf3/63f + //9KaZz/pcv3/3OSrf8ADCH/GChC/1p1jP+Ens7/rdf//73n//+95///teP//63b//+cvu//e57e/3OS + zv9rhrX/SlmE/wgUKf8ABBj/QlmE/2N9tf8hPHv/Um2t/1p1rf9jfbVKAAAAAAAAAAAAAAAAAAAAAJzD + 96Wt0/f/rdf//wggWv+Eqtb/nL7n/0JRa/+t0+//tc/v/8bX7/+13///zvv//877///G8///veP//6XP + 9/+Equf/e5bW/87b5/+10/f/jK7n/yk4Wv9risb/SmWc/wgkWv9Sba3/WnGt/2N9taUAAAAAAAAAAAAA + AAAAAAAAnL733pS69/+Uuvf/ABhK/yE8e/+lz/f/teP//63X9///////zrJz/3t1e/+95///vev//73n + //+t2///pcv//4yu5/9jUVr/1rKE/+fn5/+cx/f/e57e/2uGvf8IIGP/CBxK/0plpf9aca3/Y3213gAA + AAAAAAAAAAAAAAAAAACUuvf3lLr3/4yu7/8AGFL/ECxr/6XP9/+95///tdv3//////+UeTH/QggA/0I0 + Mf+1097/rdf//6XL//+lvs7/Qigh/zkIAP+cfTn/7+/v/5y+7/9zks7/Y4K9/wAcWv8IIFL/Um2t/1Jx + rf9jebX3AAAAAAAAAAAAAAAAAAAAAJzH986Uuvf/rdP3/wAYUv8pSYz/rdP//73n//+12////////5yO + Of9aUUL/Qjwh/8bbzv+95///pc///6Wurf85MBj/WlFC/62SSv/v7+//lLbn/3OW1v9jgrX/CCBS/wgc + Uv9ada3/UnGt/2N5tc4AAAAAAAAAAAAAAAAAAAAAnMP3WqXP9+dzit7/ABhS/zldnP+t0///teP//63X + ////////79uM/3NlOf+lljn/td/v/7Xj//+lz///lK7O/5R5Kf9zaTn/79uc/+fr7/+Mruf/c47G/1px + pf8YKFr/ABRK/zFBnPdSbaXnY3m1WgAAAAAAAAAAAAAAAAAAAAAAAAAAOTzeORAAzv8AGFL/QmGc/5zH + 9/+lz/f/pc/3/9bj9///+/f/9+ec/87Xvf+14///teP//6XP//+Utu//xsOt/+fXnP/n4+f/rbbW/2uG + vf9jea3/WnGl/xgoWv8AFEr/AACc/yEknCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAM61EADO/wgI + hP8pPGv/Y4K1/2OCtf9rir3/c469/5Smxv+crs7/a4Kl/4Smzv+Eps7/e57O/3OOxv9acZz/hJa1/3uO + tf9ada3/WnGt/1Jppf9SZaX/GCRa/wAIc/8AAJz/AACclAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA + zvcQAM7/CACt/xAQpf9CWZz/QlmM/yE0Uv9SaZz/Um2c/zE8Y/8hMEr/Y3mt/2N5rf9ada3/WnGt/xgg + Qv8xQWv/SmGU/0JZjP8YJEL/Qlmc/zlJlP8IDGv/AAB7/wAAnP8AAJzWAAAAAAAAAAAAAAAAAAAAAAAA + AAAQAM4IEADO/xAAzv8IAMb/CACt/wgErf8pNJz/CBAp/wAAGP8AACH/AAAY/zlNe/9SZaX/UmWl/0ph + nP9KYZz/KTxr/wAEGP8AABj/AAAY/xAYOf8hLIT/AABr/wAAa/8IAJT/AACc/wgAnPcAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAQAM7/EADW/xAA1v8QAMb/CACl/wgArf8IBIT/AAQp/wAEEP8YKEr/QlWc/0JV + lP9CVZT/QlWU/0JVlP9CUZT/GCBC/wAIGP8ABCn/AABj/wAAa/8AAHP/CACU/wgAnP8IAJz/CACc5wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA1tYQANb/EADe/xAA5/8QANb/CAC9/wgApf8IAKX/CACU/wgM + jP8YGIz/GCSM/yEojP8hKIz/GCSE/xAYhP8ICHv/AABz/wAAa/8AAHP/CACU/wgArf8IAKX/CACc/wgA + nP8IAJy1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADWhBAA3v8QAOf/GADv/xgA9/8YAO//GADv/xAA + zv8IAK3/CACc/wAAlP8AAJT/AACM/wAAjP8AAIT/AACE/wAAhP8IAJT/CACt/wgAtf8IALX/CACt/wgA + pf8IAJz/CACc/wgAnGsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAN4pEADe/xgA7/8YAPf/GAD//xgA + //8YAP//GAD//xgA//8YAPf/EADe/xAAzv8IAL3/CAC9/wgAvf8IAMb/CADG/wgAvf8IAL3/EAC9/wgA + vf8IALX/CACt/wgApf8IAJz3CACcEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAOe1GADv/xgA + 9/8YAP//GAD//xgA//8YAP//GAD//3tt7/+Mht7/c23e/1pV1v9aWdb/a2nO/4SGzv9jWc7/EADW/xAA + zv8QAM7/EADG/wgAvf8IAK3/CACl/wgApZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAA + 5zEYAO//GAD3/xgA//8YAP//GAD//xgA//8xGP//tbLn/zEg///n4+//7+vv/+/r7//Ox+//OST3/726 + 3v8YBNb/EADW/xAAzv8QAM7/CADG/wgAtf8IAK33CACtGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAABgA75wYAPf/GAD//xgA//8YAP//GAD//1JB///e1+//IQj//62q9//v6/f/9/P3/5SK + //8xGP//3t/n/zEg3v8QAN7/EADW/xAAzv8IAMb/CAC9/wgAtXsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAGADvCBgA994YAP//GAD//xgA//8YAP//Sjj////7//97bf//c2H//1pF + //9zYf//WkX//5SO///38/f/KRze/xAA3v8QANb/EADO/xAAxv8IAMbGAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD3KRgA//cYAP//GAD//xgA//8hBP//3tv//+fn + //8hCP//c2X//1pN//8xGP//9/f//8a+9/8QAOf/EADe/xAA1v8QAM7/EADO5xAAxhgAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD/ORgA//cYAP//GAD//xgA + //85JP//1sv//8a6//////////v//8bD//+9uv//KRTn/xAA3v8QANb/EADO/xAAzu8QAM4pAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD/MRgA + /+cYAP//GAD//xgA//8YAP//Sjj//3Nd//9rXf//Qiz3/xAA5/8QAN7/EADe/xAA1v8QAM7WEADOIQAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAGAD/CBgA/5QYAP/3GAD//xgA//8YAP//GAD3/xgA7/8YAO//EADn/xAA3v8QANb3EADWhAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAABgA/xAYAP9jGAD/rRgA994YAO/3GADn9xAA59YQAN6lEADeWhAA + 1ggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/wD///wAP//wAA//4A + AH/8AAA//AAAP/gAAB/gAAAH4AAAB8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfgAAAH4AAAB8AA + AAfgAAAH4AAAB+AAAAfgAAAH8AAAD/AAAA/4AAAf+AAAP/wAAD/+AAB//wAA//+AA///4Af/KAAAABAA + AAAgAAAAAQAgAAAAAABABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa3W1KXuO + 1q1zitb3a33G72t5vaVSZZQhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABabaUIhJ7npYyq + 7/+Usvf/hJ7e/2uCxv9jfbX/Y321/2N1rZw5TXMIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjK73tZy+ + 7/9CVXv/ITBS/yk4Wv8pOFL/ISxK/zFBY/9jda3/Wm2lrQAAAAAAAAAAAAAAAAAAAAAAAAAAlLb3hKXL + //9CWXP/CBAp/2OCtf+Eot7/e5bW/2N5pf8AAAj/KTRS/1JpnP9jebWEAAAAAAAAAAAAAAAAnMf3hJS+ + 5/+Mstb/CBAp/0phhP+tz/f/rdf//5y+7/9zltb/MUVj/wAIGP9SaZz/SmWl/2N5tYQAAAAAAAAAAJzD + 995ScaX/e57O/5S21v/W19b/rc/e/8bv//+t1///e469/87T1v9zksb/SmWl/ylFe/9adbXeAAAAAAAA + AACcvvfvSm2l/2OGvf+14///zsOc/0o0If+12+//pcPe/0IsIf/Gupz/hKbe/zFNjP8xRYT/WnW17wAA + AAAAAAAAe5bvWiEwlP9zls7/rdf//+/v3v+1rnP/teP3/5y+7/+tnmv/1tfO/3OOxv85TXv/EBhz/0JZ + pVoAAAAAAAAAAAgAxmsIALX/OUmc/1JllP9rgq3/UmmM/3OSvf9rhr3/Sll7/1ptpf9CVYz/KTh7/wAA + jP8AAJRaAAAAAAAAAAAQAM6EEADO/wgAtf8QFHv/AAQh/yk0Wv9KXZz/Qlmc/yEsUv8ABBj/EBBj/wAA + e/8IAJz/AACccwAAAAAAAAAAEADGUhAA3v8QAOf/EADO/wgArf8ICJT/EBSM/xAUjP8ICIT/CACM/wgA + nP8IAKX/CACc/wAAlEIAAAAAAAAAAAgAjAgQAOfvGAD//xgA//8YAP//Sjzn/zkwzv85MMb/QjjG/xAA + xv8QAMb/CAC1/wgApecAAAAAAAAAAAAAAAAAAAAAEADncxgA//8YAP//MRT//3tt9//e1/f/zsv3/4R1 + 7/8YCN7/EADO/wgAvf8IAK1jAAAAAAAAAAAAAAAAAAAAAAAAAAAYAPe9GAD//ykQ///Oy///WkX//1JB + ///Oz/f/GATe/xAAzv8QAMa1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEADGCBgA/8YYAP//Ujz//5yW + //+ckv//QjTv/xAA1v8QAM61CACcCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAD/YxgA + /8YYAPf3GADv9xAA3sYQANZaAAAAAAAAAAAAAAAAAAAAAAAAAAD4HwAA4AcAAOAHAADAAwAAgAEAAIAB + AACAAQAAgAEAAIABAACAAQAAgAEAAIADAADAAwAA4AcAAOAHAAD4HwAA + + + \ No newline at end of file diff --git a/GetData_PLC/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/GetData_PLC/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..ebeb19c Binary files /dev/null and b/GetData_PLC/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/GetData_PLC/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/GetData_PLC/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..01eb2fc Binary files /dev/null and b/GetData_PLC/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/GetData_PLC/obj/Debug/GetData_PLC.Properties.Resources.resources b/GetData_PLC/obj/Debug/GetData_PLC.Properties.Resources.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/GetData_PLC/obj/Debug/GetData_PLC.Properties.Resources.resources differ diff --git a/GetData_PLC/obj/Debug/GetData_PLC.application b/GetData_PLC/obj/Debug/GetData_PLC.application new file mode 100644 index 0000000..4daa6cc --- /dev/null +++ b/GetData_PLC/obj/Debug/GetData_PLC.application @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + /98GKWwhOmh5/MvPNrQLRo+qqVs= + + + + \ No newline at end of file diff --git a/GetData_PLC/obj/Debug/GetData_PLC.csproj.FileListAbsolute.txt b/GetData_PLC/obj/Debug/GetData_PLC.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..8f142db --- /dev/null +++ b/GetData_PLC/obj/Debug/GetData_PLC.csproj.FileListAbsolute.txt @@ -0,0 +1,57 @@ +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Debug\GetData_PLC.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Debug\GetData_PLC.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Debug\GetData_PLC.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\GetData_PLC.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\GetData_PLC.exe.manifest +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\GetData_PLC.application +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\GetData_PLC.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\GetData_PLC.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.frmMain.resources +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.Properties.Resources.resources +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csproj.GenerateResource.Cache +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe.manifest +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.application +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csprojResolveAssemblyReference.cache +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.frmMain.resources +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.Properties.Resources.resources +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csproj.GenerateResource.Cache +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe.manifest +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.application +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.pdb +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.frmMain.resources +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.Properties.Resources.resources +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csproj.GenerateResource.Cache +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe.manifest +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.application +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.pdb +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.pdb +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.frmMain.resources +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.Properties.Resources.resources +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csproj.GenerateResource.Cache +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe.manifest +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.application +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.pdb +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csprojResolveAssemblyReference.cache +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.frmMain.resources +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.Properties.Resources.resources +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csproj.GenerateResource.Cache +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe.manifest +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC+三力超声波\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.application +D:\GetPLCData\GetData_PLC.exe.config +D:\GetPLCData\GetData_PLC.exe.manifest +D:\GetPLCData\GetData_PLC.application +D:\GetPLCData\GetData_PLC.exe +D:\GetPLCData\GetData_PLC.pdb +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.frmMain.resources +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.Properties.Resources.resources +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.csproj.GenerateResource.Cache +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe.manifest +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.application +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.exe +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\GetData_PLC\obj\Debug\GetData_PLC.pdb diff --git a/GetData_PLC/obj/Debug/GetData_PLC.csproj.GenerateResource.Cache b/GetData_PLC/obj/Debug/GetData_PLC.csproj.GenerateResource.Cache new file mode 100644 index 0000000..b5b8bdc Binary files /dev/null and b/GetData_PLC/obj/Debug/GetData_PLC.csproj.GenerateResource.Cache differ diff --git a/GetData_PLC/obj/Debug/GetData_PLC.exe b/GetData_PLC/obj/Debug/GetData_PLC.exe new file mode 100644 index 0000000..465d8ef Binary files /dev/null and b/GetData_PLC/obj/Debug/GetData_PLC.exe differ diff --git a/GetData_PLC/obj/Debug/GetData_PLC.exe.manifest b/GetData_PLC/obj/Debug/GetData_PLC.exe.manifest new file mode 100644 index 0000000..e37b68d --- /dev/null +++ b/GetData_PLC/obj/Debug/GetData_PLC.exe.manifest @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + e9iL5hYMgAegTkQAkal1B3YrHE4= + + + + + + + + + + 9qAuvVJinL/10w661sMdCpZV2TU= + + + + + + + + + N55XevUJHGJDRLBdhAY/WZd6pH4= + + + \ No newline at end of file diff --git a/GetData_PLC/obj/Debug/GetData_PLC.frmMain.resources b/GetData_PLC/obj/Debug/GetData_PLC.frmMain.resources new file mode 100644 index 0000000..a9a903b Binary files /dev/null and b/GetData_PLC/obj/Debug/GetData_PLC.frmMain.resources differ diff --git a/GetData_PLC/obj/Debug/GetData_PLC.pdb b/GetData_PLC/obj/Debug/GetData_PLC.pdb new file mode 100644 index 0000000..429bca6 Binary files /dev/null and b/GetData_PLC/obj/Debug/GetData_PLC.pdb differ diff --git a/GetData_PLC/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll b/GetData_PLC/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll new file mode 100644 index 0000000..6fdabf1 Binary files /dev/null and b/GetData_PLC/obj/Debug/TempPE/Properties.Resources.Designer.cs.dll differ diff --git a/GetData_PLC/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/GetData_PLC/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/GetData_PLC/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/GetData_PLC/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/GetData_PLC/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/GetData_PLC/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/GetData_PLC/obj/Release/GetData_PLC.Properties.Resources.resources b/GetData_PLC/obj/Release/GetData_PLC.Properties.Resources.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/GetData_PLC/obj/Release/GetData_PLC.Properties.Resources.resources differ diff --git a/GetData_PLC/obj/Release/GetData_PLC.application b/GetData_PLC/obj/Release/GetData_PLC.application new file mode 100644 index 0000000..523c4c9 --- /dev/null +++ b/GetData_PLC/obj/Release/GetData_PLC.application @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + gsYXw7AaTnDdt4jSKteFW0iOfUI= + + + + \ No newline at end of file diff --git a/GetData_PLC/obj/Release/GetData_PLC.csproj.FileListAbsolute.txt b/GetData_PLC/obj/Release/GetData_PLC.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..47b7bd2 --- /dev/null +++ b/GetData_PLC/obj/Release/GetData_PLC.csproj.FileListAbsolute.txt @@ -0,0 +1,13 @@ +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Release\GetData_PLC.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Release\GetData_PLC.exe.manifest +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Release\GetData_PLC.application +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Release\GetData_PLC.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\bin\Release\GetData_PLC.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.csprojResolveAssemblyReference.cache +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.frmMain.resources +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.Properties.Resources.resources +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.csproj.GenerateResource.Cache +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.exe.manifest +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.application +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetData_PLC\obj\Release\GetData_PLC.pdb diff --git a/GetData_PLC/obj/Release/GetData_PLC.csproj.GenerateResource.Cache b/GetData_PLC/obj/Release/GetData_PLC.csproj.GenerateResource.Cache new file mode 100644 index 0000000..36a6300 Binary files /dev/null and b/GetData_PLC/obj/Release/GetData_PLC.csproj.GenerateResource.Cache differ diff --git a/GetData_PLC/obj/Release/GetData_PLC.csprojResolveAssemblyReference.cache b/GetData_PLC/obj/Release/GetData_PLC.csprojResolveAssemblyReference.cache new file mode 100644 index 0000000..0401ec9 Binary files /dev/null and b/GetData_PLC/obj/Release/GetData_PLC.csprojResolveAssemblyReference.cache differ diff --git a/GetData_PLC/obj/Release/GetData_PLC.exe b/GetData_PLC/obj/Release/GetData_PLC.exe new file mode 100644 index 0000000..26aaf0b Binary files /dev/null and b/GetData_PLC/obj/Release/GetData_PLC.exe differ diff --git a/GetData_PLC/obj/Release/GetData_PLC.exe.manifest b/GetData_PLC/obj/Release/GetData_PLC.exe.manifest new file mode 100644 index 0000000..dd380b4 --- /dev/null +++ b/GetData_PLC/obj/Release/GetData_PLC.exe.manifest @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 43jSD4jmjgww0RXnhxmLOXSBso0= + + + + + + + + + + mRxWD7Tvc0gMvp8wlC1jcMSFaVc= + + + \ No newline at end of file diff --git a/GetData_PLC/obj/Release/GetData_PLC.frmMain.resources b/GetData_PLC/obj/Release/GetData_PLC.frmMain.resources new file mode 100644 index 0000000..6c05a97 Binary files /dev/null and b/GetData_PLC/obj/Release/GetData_PLC.frmMain.resources differ diff --git a/GetData_PLC/obj/Release/GetData_PLC.pdb b/GetData_PLC/obj/Release/GetData_PLC.pdb new file mode 100644 index 0000000..b6ff1e6 Binary files /dev/null and b/GetData_PLC/obj/Release/GetData_PLC.pdb differ diff --git a/GetData_PLC/strFileCaoZuo.cs b/GetData_PLC/strFileCaoZuo.cs new file mode 100644 index 0000000..974353e --- /dev/null +++ b/GetData_PLC/strFileCaoZuo.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace GetData_PLC +{ + class strFileCaoZuo + { + public static void strAppend(string strFilePath, string strMessage) + { + using (StreamWriter sw = File.AppendText(strFilePath)) + { + sw.WriteLine(strMessage); + sw.Flush(); + sw.Close(); + } + } + } +} diff --git a/GetData_PLC/strSQL.cs b/GetData_PLC/strSQL.cs new file mode 100644 index 0000000..2c5483a --- /dev/null +++ b/GetData_PLC/strSQL.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace GetData_PLC +{ + public class SQL_Strings + { + public static readonly string strSQLZhan = "select * from SYS_ORGANISE where STATE='启用' and PLC='1'"; + + //public static readonly string strSQLZhan = "select DWMC,DWID,ZCMC,ID,ISZDJL,IP,PORT,READTIMESPAN,NETTYPE,SBTYPE,xh,zcbh,TBTime from 集输站场 where iszdjl='1' order by DWID"; + public static readonly string strSQLJld = "select * from RV2_BASEINFO where STATION_NAME= '"; + //public static readonly string strSQLJld = "select GLDW,ZCHBZ,AZDD,计量点标识,ISPLC,JLD_ID,JLDNAME,MeterType,ZCID from 安装地点基础资料 where isplc='1'"; + public static readonly string strSQLScConfig = "select * from RV2_TRANS_CONFIG"; + //public static readonly string strSQLScConfig = "select ID,SCNAME,DEPT_ID,STATION_ID,SCTYPE,STATION_NAME,DEPT_NAME,IN_JLD_ID,OUT_JLD_ID,RE_DEPT_ID from 输差名称"; + public static readonly string strSQLSC_Zhan_Distinct = "select DISTINCT STATION_ID from 输差名称 where SCTYPE=''"; + public static readonly string strSQLSC_Xian_DIStinct = "select DISTINCT dept_id from 输差名称"; + public static readonly string strReadParFlag = "select * from RV2_BASEINFO where plc='1'"; + + public static readonly string strSaveParFlag = "select ZCID,计量点标识,ISPLC,JLD_ID,JLDNAME,MeterType,readparflag,xh from 安装地点基础资料 where isplc='1'"; + + public static readonly string strSQL_Read_Today_YesterDay_Flow = "select * from PGFLOW_TOTAL"; + + + + + + } +} diff --git a/UpdateMeter/App.config b/UpdateMeter/App.config new file mode 100644 index 0000000..74ade9d --- /dev/null +++ b/UpdateMeter/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/UpdateMeter/DataBaseTools.cs b/UpdateMeter/DataBaseTools.cs new file mode 100644 index 0000000..f9d2355 --- /dev/null +++ b/UpdateMeter/DataBaseTools.cs @@ -0,0 +1,433 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using System.Data.OracleClient; +using System.Configuration; + + +namespace OraDataBase +{ + public class OracleHelper + { + + static string condb = "Data Source=TRQCXC;user=jlxt;password=123456;"; + static string condbn = "Data Source=orcl;user=cwbase10_9999;password=123456;"; + public static DataSet DataAdapter(string sqlCmd, string tabName)//返回数据集 适配器 + { + OracleConnection con = new OracleConnection(condb); + OracleCommand cmd = new OracleCommand(); + cmd.Connection = con; + cmd.CommandText = sqlCmd; + OracleDataAdapter oda = new OracleDataAdapter(sqlCmd, con); + DataSet ds = new DataSet(); + oda.Fill(ds, tabName); + con.Close(); + return ds; + } + + public static DataSet DataAdapter100(string sqlCmd, string tabName)//返回数据集 适配器 + { + OracleConnection con = new OracleConnection(condbn); + OracleCommand cmd = new OracleCommand(); + cmd.Connection = con; + cmd.CommandText = sqlCmd; + OracleDataAdapter oda = new OracleDataAdapter(sqlCmd, con); + DataSet ds = new DataSet(); + oda.Fill(ds, tabName); + con.Close(); + return ds; + } + + public enum SDACmd { select, delete, update, insert } + public static DataSet DataAdapter(string sqlCmd, SDACmd command, string tabName, params OracleParameter[] paraList) + { + OracleConnection con = new OracleConnection(condb); + OracleCommand cmd = new OracleCommand(); + cmd.Connection = con; + cmd.CommandText = sqlCmd; + if (paraList != null) + { + cmd.CommandType = CommandType.Text; + foreach (OracleParameter para in paraList) + { cmd.Parameters.Add(para); } + + } + OracleDataAdapter oda = new OracleDataAdapter(); + switch (command) + { + case SDACmd.select: + oda.SelectCommand = cmd; + break; + case SDACmd.insert: + oda.InsertCommand = cmd; + break; + case SDACmd.update: + oda.UpdateCommand = cmd; + break; + case SDACmd.delete: + oda.DeleteCommand = cmd; + break; + } + DataSet ds = new DataSet(); + oda.Fill(ds, tabName); + + con.Close(); + return ds; + + + } + + public static OracleDataReader ExecReader(string sqlcmd, params OracleParameter[] paraList)// 逐条读取 返加 dataReader; 在程序中使用时记得关闭 odr.Close(); odr.Dispose(); + { + OracleConnection con = new OracleConnection(condb); + OracleCommand cmd = new OracleCommand(); + cmd.Connection = con; + cmd.CommandText = sqlcmd; + if (paraList != null) + { + cmd.CommandType = CommandType.Text; + foreach (OracleParameter para in paraList) + { cmd.Parameters.Add(para); } + } + con.Open(); + OracleDataReader odr = cmd.ExecuteReader(CommandBehavior.CloseConnection); + + return odr; + } + + public static void ExecNonQuery(string sqlcmd, params OracleParameter[] paraList) + { + + using (OracleConnection con = new OracleConnection(condb)) + { + OracleCommand cmd = new OracleCommand(); + cmd.CommandTimeout = 600; + cmd.Connection = con; + cmd.CommandText = sqlcmd; + if (paraList != null) + { + cmd.CommandType = CommandType.Text; + foreach (OracleParameter para in paraList) + { cmd.Parameters.Add(para); } + } + con.Open(); + cmd.ExecuteNonQuery(); + con.Close(); + + } + + } + public static void ExecNonQueryJu(string sqlcmd, params OracleParameter[] paraList) + { + + using (OracleConnection con = new OracleConnection(condbn)) + { + OracleCommand cmd = new OracleCommand(); + cmd.CommandTimeout = 600; + cmd.Connection = con; + cmd.CommandText = sqlcmd; + if (paraList != null) + { + cmd.CommandType = CommandType.Text; + foreach (OracleParameter para in paraList) + { cmd.Parameters.Add(para); } + } + con.Open(); + cmd.ExecuteNonQuery(); + con.Close(); + + } + + } + + public static int ExecNonQuery(string sqlcmd, bool ifis)//返回ID + { + + using (OracleConnection con = new OracleConnection(condb)) + { + int maxid; + OracleCommand cmd = new OracleCommand(); + cmd.Connection = con; + cmd.CommandText = sqlcmd; + con.Open(); + maxid = Convert.ToInt32(cmd.ExecuteScalar().ToString()); + con.Close(); + return maxid; + } + + } + + public static int ExecuteNonQuery(string sql) + { + using (OracleConnection con = new OracleConnection(condb)) + { + int Num; + con.Open(); + OracleCommand cmd = new OracleCommand(sql, con); + Num = cmd.ExecuteNonQuery(); + con.Close(); + return Num; + } + } + public static int ExecuteNonQuery100(string sql) + { + using (OracleConnection con = new OracleConnection(condbn)) + { + int Num; + con.Open(); + OracleCommand cmd = new OracleCommand(sql, con); + Num = cmd.ExecuteNonQuery(); + con.Close(); + return Num; + } + } + /**/ + /// + /// 执行存储过程 + /// + /// 存储过程名 + /// 存储过程参数 + /// os_Info执行信息 + public static string RunProcedure(string sprocName, IDataParameter[] parameters) + { + + using (OracleConnection con = new OracleConnection(condb)) + { + string infostr; + con.Open(); + + OracleCommand cmd = new OracleCommand(sprocName, con); + cmd.CommandType = CommandType.StoredProcedure; + if (parameters != null) + { + foreach (IDataParameter parameter in parameters) + { + cmd.Parameters.Add(parameter); + } + } + cmd.Parameters.Add("os_Info", OracleType.VarChar, 30); + cmd.Parameters["os_Info"].Direction = ParameterDirection.Output; + cmd.ExecuteNonQuery(); + //infostr = Convert.ToInt32(cmd.ExecuteScalar().ToString()); + infostr = cmd.Parameters["os_Info"].Value.ToString(); + con.Close(); + return infostr; + } + } + /**/ + /// + /// 执行存储过程 + /// + /// 存储过程名 + /// 表名 + /// 存储过程参数 + /// 返回记录集 + public static DataSet RunProcedureDataSet(string sprocName, IDataParameter[] parameters) + { + + using (OracleConnection con = new OracleConnection(condb)) + { + con.Open(); + + OracleCommand cmd = new OracleCommand(sprocName, con); + cmd.CommandType = CommandType.StoredProcedure; + if (parameters != null) + { + foreach (IDataParameter parameter in parameters) + { + cmd.Parameters.Add(parameter); + } + } + cmd.Parameters.Add("TZ_CURSOR", OracleType.Cursor); + cmd.Parameters["TZ_CURSOR"].Direction = ParameterDirection.Output; + cmd.Parameters.Add("HZ_CURSOR", OracleType.Cursor); + cmd.Parameters["HZ_CURSOR"].Direction = ParameterDirection.Output; + cmd.Parameters.Add("QJ_CURSOR", OracleType.Cursor); + cmd.Parameters["QJ_CURSOR"].Direction = ParameterDirection.Output; + cmd.Parameters.Add("AL_CURSOR", OracleType.Cursor); + cmd.Parameters["AL_CURSOR"].Direction = ParameterDirection.Output; + DataSet ds = new DataSet(); + OracleDataAdapter da = new OracleDataAdapter(cmd); + da.Fill(ds); + con.Close(); + return ds; + } + } + + public static DataSet RunProcedureDataSetfb(string sprocName, IDataParameter[] parameters) + { + + using (OracleConnection con = new OracleConnection(condb)) + { + con.Open(); + + OracleCommand cmd = new OracleCommand(sprocName, con); + cmd.CommandType = CommandType.StoredProcedure; + if (parameters != null) + { + foreach (IDataParameter parameter in parameters) + { + cmd.Parameters.Add(parameter); + } + } + cmd.Parameters.Add("TZ_CURSOR", OracleType.Cursor); + cmd.Parameters["TZ_CURSOR"].Direction = ParameterDirection.Output; + cmd.Parameters.Add("HZ_CURSOR", OracleType.Cursor); + cmd.Parameters["HZ_CURSOR"].Direction = ParameterDirection.Output; + DataSet ds = new DataSet(); + OracleDataAdapter da = new OracleDataAdapter(cmd); + da.Fill(ds); + con.Close(); + return ds; + } + } + + //Andy 20131008 + public static DataSet RunProcedureDataSetRY(string sprocName, IDataParameter[] parameters) + { + + using (OracleConnection con = new OracleConnection(condb)) + { + con.Open(); + + OracleCommand cmd = new OracleCommand(sprocName, con); + cmd.CommandType = CommandType.StoredProcedure; + if (parameters != null) + { + foreach (IDataParameter parameter in parameters) + { + cmd.Parameters.Add(parameter); + } + } + cmd.Parameters.Add("RY_CURSOR_ALL", OracleType.Cursor); + cmd.Parameters["RY_CURSOR_ALL"].Direction = ParameterDirection.Output; + cmd.Parameters.Add("RY_CURSOR_Dept", OracleType.Cursor); + cmd.Parameters["RY_CURSOR_Dept"].Direction = ParameterDirection.Output; + DataSet ds = new DataSet(); + OracleDataAdapter da = new OracleDataAdapter(cmd); + da.Fill(ds); + con.Close(); + return ds; + } + } + + //Andy 20130724 + public static DataSet RunProcedureDataSetColumnChart(string sprocName, IDataParameter[] parameters) + { + using (OracleConnection con = new OracleConnection(condb)) + { + con.Open(); + + OracleCommand cmd = new OracleCommand(sprocName, con); + cmd.CommandType = CommandType.StoredProcedure; + if (parameters != null) + { + foreach (IDataParameter parameter in parameters) + { + cmd.Parameters.Add(parameter); + } + } + cmd.Parameters.Add("TZ_CURSOR", OracleType.Cursor); + cmd.Parameters["TZ_CURSOR"].Direction = ParameterDirection.Output; + DataSet ds = new DataSet(); + OracleDataAdapter da = new OracleDataAdapter(cmd); + da.Fill(ds); + con.Close(); + return ds; + } + } + + public static string ExecuteProcedure(string sprocName, IDataParameter parameter) + { + string info; + using (OracleConnection con = new OracleConnection(condb)) + { + con.Open(); + OracleCommand cmd = new OracleCommand(sprocName, con); + cmd.CommandType = CommandType.StoredProcedure; + if (parameter != null) + { + cmd.Parameters.Add(parameter); + } + cmd.Parameters.Add("Info", OracleType.VarChar, 30); + cmd.Parameters["Info"].Direction = ParameterDirection.Output; + cmd.ExecuteNonQuery(); + info = cmd.Parameters["Info"].Value.ToString(); + con.Close(); + return info; + } + } + + public static int isExit(string sql) + { + using (OracleConnection con = new OracleConnection(condb)) + { + int Num; + con.Open(); + OracleCommand cmd = new OracleCommand(sql, con); + Num = Convert.ToInt32(cmd.ExecuteScalar()); + con.Close(); + return Num; + } + } + + + //201309 add + public static DataTable ExecuteDataTable(string sql) + { + // Create a new Oracle command + OracleCommand command = null; + + try + { + //Create a connection + using (OracleConnection connection = new OracleConnection(condb)) + { + command = new OracleCommand(sql, connection); + OracleDataAdapter adapter = new OracleDataAdapter(command); + DataSet ds = new DataSet(); + //System.Threading.Thread.Sleep(10); + adapter.Fill(ds); + + + //if(ds.Tables.Count<1) + // return; + DataTable dt = ds.Tables[0].Copy(); + ds.Dispose(); + return dt; + + } + } + catch (Exception ex) + { + //strError = " oracle查询返回表格错误!" + ex.Message; + return null; + } + } + public static void SaveDataTable(string sql, DataTable _TempTable) + { + // Create a new Oracle command + OracleCommand command = null; + try + { + //Create a connection + using (OracleConnection connection = new OracleConnection(condb)) + { + command = new OracleCommand(sql, connection); + OracleDataAdapter adapter = new OracleDataAdapter(command); + OracleCommandBuilder cb = new OracleCommandBuilder(adapter); + adapter.Update(_TempTable); + + } + } + catch (Exception ex) + { + + //strError = " oracle保存表格错误!" + ex.Message; + } + + } + } +} diff --git a/UpdateMeter/Program.cs b/UpdateMeter/Program.cs new file mode 100644 index 0000000..e2e02f7 --- /dev/null +++ b/UpdateMeter/Program.cs @@ -0,0 +1,687 @@ +using OraDataBase; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace UpdateMeter +{ + class UpdateMeter + { + bool T = true; + + DataTable dt = new DataTable(); + DataTable dtXML = new DataTable(); + DataSet ds = new DataSet(); + + string path = Environment.CurrentDirectory + @"\Data\UpdateMeter\"; + static void Main(string[] args) + { + Console.WriteLine("更新厂台帐到局系统台帐"); + + UpdateMeter objUpdate = new UpdateMeter(); + + + if (File.Exists(objUpdate.path + "updateFlag.xml")) + { + File.Delete(objUpdate.path + "updateFlag.xml"); + } + + + objUpdate.ToUpdate(objUpdate.TRQCXC(), objUpdate.TRQCXC_NoZY(), objUpdate.ZYYT(), objUpdate.GLDW(), objUpdate.EquipInfo(), objUpdate.ZQDDJ(), objUpdate.CLCS(), objUpdate.CLJZ(), objUpdate.JDDW()); + + + while (objUpdate.T) + { + Thread.Sleep(1); + } + Console.Read(); + + } + + + + + private DataTable TRQCXC_NoZY() + { + string sql = "select * from clsbtz where 状态 !='在用'"; + //string sql = "select * from clsbtz where 状态 ='在用' and 使用存放地点 is not null and 制造厂家 is not null and 测量设备名称 not in('InTouch组态软件','WebAccess组态软件','工业热电阻检定软件','孔板综合测量仪软件','硫氮测定仪嵌入式软件','三K值计算程序','天然气流量计算管理系统','PCM金属探测仪,'孔板综合测量仪'); + return dt = OraDataBase.OracleHelper.DataAdapter(sql, "DT").Tables[0]; + } + + + private void ToUpdate(DataTable CXC_List, DataTable CXC_ListNoZY, DataTable ZYYT_List, DataTable GLDW_View, DataTable EquipInfo_View, DataTable ZQDDJ, DataTable CLCS, DataTable CLJZ, DataTable JDDW) + { + //增加检定单位标识、使用状态列 + CXC_List.Columns.Add("检定单位标识", typeof(string)); + CXC_List.Columns.Add("使用状态", typeof(string)); + CXC_List.Columns.Add("启用日期1", typeof(string)); + CXC_List.Columns.Add("检定日期1", typeof(string)); + CXC_List.Columns.Add("有效日期1", typeof(string)); + CXC_List.Columns.Add("确认日期1", typeof(string)); + CXC_List.Columns.Add("填报日期1", typeof(string)); + + DataTable ErrorRecord = CXC_List.Clone(); + DataTable SuccessRecord = CXC_List.Clone(); + + + Console.WriteLine("开始更新!"); + + int jj = 0; + int mm = 0; + int nn = 0; + int mmm = 1; + + for (int nnn = 0; nnn < CXC_ListNoZY.Rows.Count; nnn++) + { + DataRow[] DelDatarow = ZYYT_List.Select("f_ejdw='EJ0010' and f_ccbh='" + CXC_ListNoZY.Rows[nnn]["出厂编号"] + "'"); + if (DelDatarow.Length > 0) + { + string sqlstr = "delete from JL_QJ_JLQJ where f_ccbh='" + CXC_ListNoZY.Rows[nnn]["出厂编号"] + "' and f_ejdw='EJ0010'"; + OraDataBase.OracleHelper.ExecNonQueryJu(sqlstr); + Console.WriteLine("删除!" + mmm.ToString ()+ "条记录!"); + mmm++; + } + } + + for (int i = 0; i < CXC_List.Rows.Count; i++) + { + DataRow[] dr; + bool ErrorFlag = false; + + DataRow[] exitsDatarow = ZYYT_List.Select("f_ejdw='EJ0010' and f_ccbh='" + CXC_List.Rows[i]["出厂编号"] + "'"); + + //更新管理信息 + CXC_List.Rows[i]["二级单位"] = "EJ0010"; + + try + { + dr = GLDW_View.Select("f_ejdwbh = 'EJ0010' and f_sjdwmc='" + CXC_List.Rows[i]["管理单位"] + "'"); + CXC_List.Rows[i]["管理单位"] = dr[0]["f_sjdwbh"]; + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = GLDW_View.Select("f_ejdwbh = 'EJ0010' and f_sjdwbh='" + CXC_List.Rows[i]["管理单位"] + "' and F_JCZDMC='" + CXC_List.Rows[i]["集输站场"] + "'"); + CXC_List.Rows[i]["集输站场"] = dr[0]["F_JCZDBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = GLDW_View.Select("f_ejdwbh = 'EJ0010' and f_sjdwbh='" + CXC_List.Rows[i]["管理单位"] + "' and F_JCZDBH='" + CXC_List.Rows[i]["集输站场"] + "' and F_CFDDMC='" + CXC_List.Rows[i]["使用存放地点"] + "'"); + CXC_List.Rows[i]["使用存放地点"] = dr[0]["F_CFDDBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + //更新器具信息 + try + { + dr = EquipInfo_View.Select("F_LBMC='" + CXC_List.Rows[i]["设备类别"] + "'"); + CXC_List.Rows[i]["设备类别"] = dr[0]["F_LBBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = EquipInfo_View.Select("F_LBBH='" + CXC_List.Rows[i]["设备类别"] + "' and F_QJMC='" + CXC_List.Rows[i]["测量设备名称"] + "'"); + CXC_List.Rows[i]["测量设备名称"] = dr[0]["F_QJMCBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = EquipInfo_View.Select("F_LBBH='" + CXC_List.Rows[i]["设备类别"] + "' and F_QJMCBH='" + CXC_List.Rows[i]["测量设备名称"] + "' and F_CJMC='" + CXC_List.Rows[i]["制造厂家"] + "'"); + CXC_List.Rows[i]["制造厂家"] = dr[0]["F_CJBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = EquipInfo_View.Select("F_LBBH='" + CXC_List.Rows[i]["设备类别"] + "' and F_QJMCBH='" + CXC_List.Rows[i]["测量设备名称"] + "' and F_CJBH='" + CXC_List.Rows[i]["制造厂家"] + "' and F_GGXHMC='" + CXC_List.Rows[i]["规格型号"] + "'"); + CXC_List.Rows[i]["规格型号"] = dr[0]["F_GGBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = EquipInfo_View.Select("F_LBBH='" + CXC_List.Rows[i]["设备类别"] + "' and F_QJMCBH='" + CXC_List.Rows[i]["测量设备名称"] + "' and F_CJBH='" + CXC_List.Rows[i]["制造厂家"] + "' and F_GGBH='" + CXC_List.Rows[i]["规格型号"] + "' and F_FW='" + CXC_List.Rows[i]["测量范围"] + "'"); + CXC_List.Rows[i]["测量范围"] = dr[0]["F_QJXXBH"]; + } + catch (Exception) { ErrorFlag = true; } + + //准确度、测量参数、测量介质、检定单位 + try + { + dr = ZQDDJ.Select("F_QJMC='" + CXC_List.Rows[i]["测量设备名称"] + "'"); + CXC_List.Rows[i]["准确度等级"] = dr[0]["F_ZQDDJBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = CLCS.Select("F_QJMC='" + CXC_List.Rows[i]["测量设备名称"] + "' and f_clcs='" + CXC_List.Rows[i]["测量参数"] + "'"); + CXC_List.Rows[i]["测量参数"] = dr[0]["F_CLCSBH"]; + + } + catch (Exception) { ErrorFlag = true; } + + try + { + dr = CLJZ.Select("F_QJMC='" + CXC_List.Rows[i]["测量设备名称"] + "' and f_cljzmc='" + CXC_List.Rows[i]["测量介质"] + "'"); + CXC_List.Rows[i]["测量介质"] = dr[0]["F_CLJZBH"]; + } + catch (Exception) { ErrorFlag = true; } + + //检定信息 + try + { + dr = JDDW.Select("F_JDDWMC='" + CXC_List.Rows[i]["检定单位"] + "'"); + CXC_List.Rows[i]["检定单位"] = dr[0]["F_JDDWBH"]; + CXC_List.Rows[i]["检定单位标识"] = dr[0]["F_SYZT"];//1:自检;2:内检;3:外检; + } + catch (Exception) { ErrorFlag = true; } + + //日期格式 + try + { + if (CXC_List.Rows[i]["启用日期"].ToString() != "") CXC_List.Rows[i]["启用日期1"] = Convert.ToDateTime(CXC_List.Rows[i]["启用日期"]).ToString("yyyyMMdd"); + if (CXC_List.Rows[i]["确认日期"].ToString() != "") CXC_List.Rows[i]["确认日期1"] = Convert.ToDateTime(CXC_List.Rows[i]["确认日期"]).ToString("yyyyMMdd"); + if (CXC_List.Rows[i]["填报日期"].ToString() != "") CXC_List.Rows[i]["填报日期1"] = Convert.ToDateTime(System.DateTime.Now).ToString("yyyyMMdd"); + + if (CXC_List.Rows[i]["检定日期"].ToString() != "") + { + CXC_List.Rows[i]["检定日期1"] = Convert.ToDateTime(CXC_List.Rows[i]["检定日期"]).ToString("yyyyMMdd"); + } + if (CXC_List.Rows[i]["有效日期"].ToString() != "") + { + if (Convert.ToDateTime(CXC_List.Rows[i]["有效日期"]) < System.DateTime.Now)//防止检定日期过期 + { + CXC_List.Rows[i]["检定日期1"] = Convert.ToDateTime(CXC_List.Rows[i]["检定日期"]).AddDays(150).ToString("yyyyMMdd"); + CXC_List.Rows[i]["有效日期1"] = Convert.ToDateTime(CXC_List.Rows[i]["有效日期"]).AddDays(150).ToString("yyyyMMdd"); + } + else + { + CXC_List.Rows[i]["有效日期1"] = Convert.ToDateTime(CXC_List.Rows[i]["有效日期"]).ToString("yyyyMMdd"); + } + } + } + catch (Exception) { ErrorFlag = true; } + + //其他信息 + try + { + if (CXC_List.Rows[i]["调休情况"].ToString() == "否") + { + CXC_List.Rows[i]["调休情况"] = "0"; + } + else if (CXC_List.Rows[i]["调休情况"].ToString() == "是") + { + CXC_List.Rows[i]["调休情况"] = "1"; + } + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["检定类别"].ToString() == "强检") + { + CXC_List.Rows[i]["检定类别"] = "1"; + } + else if (CXC_List.Rows[i]["检定类别"].ToString() == "非强检") + { + CXC_List.Rows[i]["检定类别"] = "2"; + } + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["管理类别"].ToString() == "A") + { + CXC_List.Rows[i]["管理类别"] = "1"; + } + else if (CXC_List.Rows[i]["管理类别"].ToString() == "B") + { + CXC_List.Rows[i]["管理类别"] = "2"; + } + else if (CXC_List.Rows[i]["管理类别"].ToString() == "C") + { + CXC_List.Rows[i]["管理类别"] = "3"; + } + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["检定结果"].ToString() == "合格") + { + CXC_List.Rows[i]["检定结果"] = "0"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "不合格") + { + CXC_List.Rows[i]["检定结果"] = "1"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "校准") + { + CXC_List.Rows[i]["检定结果"] = "2"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "测试") + { + CXC_List.Rows[i]["检定结果"] = "3"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "自校") + { + CXC_List.Rows[i]["检定结果"] = "4"; + } + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["具体耗能"].ToString() == "用能单元") + { + CXC_List.Rows[i]["具体耗能"] = "1"; + } + else if (CXC_List.Rows[i]["具体耗能"].ToString() == "用能设备") + { + CXC_List.Rows[i]["具体耗能"] = "2"; + } + else if (CXC_List.Rows[i]["具体耗能"].ToString() == "次级用能单位") + { + CXC_List.Rows[i]["具体耗能"] = "3"; + } + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["标准器"].ToString() == "是") + { + CXC_List.Rows[i]["标准器"] = "1"; + } + else if (CXC_List.Rows[i]["安全防护"].ToString() == "是") + { + CXC_List.Rows[i]["安全防护"] = "1"; + } + else if (CXC_List.Rows[i]["环境监测"].ToString() == "是") + { + CXC_List.Rows[i]["环境监测 "] = "1"; + } + else if (CXC_List.Rows[i]["贸易结算"].ToString() == "是") + { + CXC_List.Rows[i]["贸易结算"] = "1"; + } + else if (CXC_List.Rows[i]["质量检测"].ToString() == "是") + { + CXC_List.Rows[i]["质量检测"] = "1"; + } + else if (CXC_List.Rows[i]["耗能计量"].ToString() == "是") + { + CXC_List.Rows[i]["耗能计量"] = "1"; + } + else if (CXC_List.Rows[i]["产能计量"].ToString() == "是") + { + CXC_List.Rows[i]["产能计量"] = "1"; + } + else if (CXC_List.Rows[i]["医疗卫生"].ToString() == "是") + { + CXC_List.Rows[i]["医疗卫生"] = "1"; + } + else if (CXC_List.Rows[i]["工艺控制"].ToString() == "是") + { + CXC_List.Rows[i]["工艺控制"] = "1"; + } + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["状态"].ToString() == "在用") + { + CXC_List.Rows[i]["状态"] = "1"; + } + else if (CXC_List.Rows[i]["状态"].ToString() == "停用") + { + CXC_List.Rows[i]["状态"] = "2"; + } + else if (CXC_List.Rows[i]["状态"].ToString() == "待检") + { + CXC_List.Rows[i]["状态"] = "3"; + } + else if (CXC_List.Rows[i]["状态"].ToString() == "备用") + { + CXC_List.Rows[i]["状态"] = "4"; + } + else if (CXC_List.Rows[i]["状态"].ToString() == "报废") + { + CXC_List.Rows[i]["状态"] = "5"; + } + + CXC_List.Rows[i]["使用状态"] = "0"; + } + catch (Exception) { ErrorFlag = true; } + + try + { + if (CXC_List.Rows[i]["检定结果"].ToString() == "合格") + { + CXC_List.Rows[i]["检定结果"] = "0"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "不合格") + { + CXC_List.Rows[i]["检定结果"] = "1"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "校准") + { + CXC_List.Rows[i]["检定结果"] = "2"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "测试") + { + CXC_List.Rows[i]["检定结果"] = "3"; + } + else if (CXC_List.Rows[i]["检定结果"].ToString() == "自校") + { + CXC_List.Rows[i]["检定结果"] = "4"; + } + } + catch (Exception) { ErrorFlag = true; } + + + + //记录出错信息 + if (ErrorFlag) + { + DataRow tempDataRow = ErrorRecord.NewRow(); + tempDataRow.ItemArray = CXC_List.Rows[i].ItemArray; + ErrorRecord.Rows.Add(tempDataRow); + jj = jj + 1; + } + //else + //{ + DataRow tempDataRowSucess = SuccessRecord.NewRow(); + tempDataRowSucess.ItemArray = CXC_List.Rows[i].ItemArray; + + string sql = ""; + if (exitsDatarow.Length == 0) + { + //插入语句(要生成编号) + //sql = "select max(to_number(f_djbh)) as f_djbh from JL_QJ_JLQJ"; + sql = "select max(to_number(f_djbh)) as f_djbh from JL_QJ_JLQJ"; + dt = OraDataBase.OracleHelper.DataAdapter100(sql, "DT").Tables[0]; + int num = Convert.ToInt32(dt.Rows[0]["f_djbh"]) + 1; + string f_guid = Guid.NewGuid().ToString(); + + sql = "INSERT INTO JL_QJ_JLQJ( F_GUID,F_DJBH,F_DJLX,F_KJQJ,F_CODE,F_DJZT,F_DATE,F_ZDR,F_NOTE,F_CHDATE,F_CRDATE"; + sql += ",F_EJDW,F_SJDW,F_LB,F_ZQDDJYQ,F_JLQJMC,F_GGXH,F_CLFW,F_ZQDDJ,F_CCBH,F_CLJZ,F_JDZQ,F_YXRQ,F_JDDW,F_TXQK"; + sql += ",F_ZSBH,F_ZT,F_BFRQ,F_BFYY,F_BZQ,F_AQFH,F_HJJC,F_MYJS,F_GCKZ,F_ZLJC,F_HNJL,F_CNJL,F_JDLB,F_GLLB,F_JDFY,F_TBRQ"; + sql += ",F_SYZT,F_SCCJ,F_YLWS,F_JDRQ,F_JCZD,F_AZD,F_CSMC,F_BHFW,F_JLD,F_QYRQ,F_JDJG,F_HNJLXQ,F_ZBH,F_QRRQ,F_SYXZ,F_SJ) VALUES "; + + sql += "('" + f_guid + "','" + num.ToString() + "','201406','1','1','','','','','','','EJ0010','" + CXC_List.Rows[i]["管理单位"] + "','" + CXC_List.Rows[i]["设备类别"] + "'"; + sql += ",'" + CXC_List.Rows[i]["应配准确等要求"] + "','" + CXC_List.Rows[i]["测量设备名称"] + "','" + CXC_List.Rows[i]["规格型号"] + "','" + CXC_List.Rows[i]["测量范围"] + "'"; + sql += ",'" + CXC_List.Rows[i]["准确度等级"] + "','" + CXC_List.Rows[i]["出厂编号"] + "','" + CXC_List.Rows[i]["测量介质"] + "','" + CXC_List.Rows[i]["检定周期"] + "','" + CXC_List.Rows[i]["有效日期1"] + "'"; + sql += ",'" + CXC_List.Rows[i]["检定单位"] + "','" + CXC_List.Rows[i]["调休情况"] + "','" + CXC_List.Rows[i]["证书编号"] + "','" + CXC_List.Rows[i]["状态"] + "','',''"; + sql += ",'" + CXC_List.Rows[i]["标准器"] + "','" + CXC_List.Rows[i]["安全防护"] + "','" + CXC_List.Rows[i]["环境监测"] + "','" + CXC_List.Rows[i]["贸易结算"] + "','" + CXC_List.Rows[i]["工艺控制"] + "'"; + sql += ",'" + CXC_List.Rows[i]["质量检测"] + "','" + CXC_List.Rows[i]["耗能计量"] + "','" + CXC_List.Rows[i]["产能计量"] + "','" + CXC_List.Rows[i]["检定类别"] + "','" + CXC_List.Rows[i]["管理类别"] + "'"; + sql += ",'" + CXC_List.Rows[i]["检定费用"] + "','20140530','0','" + CXC_List.Rows[i]["制造厂家"] + "','','" + CXC_List.Rows[i]["检定日期1"] + "'"; + sql += ",'" + CXC_List.Rows[i]["集输站场"] + "','" + CXC_List.Rows[i]["使用存放地点"] + "','" + CXC_List.Rows[i]["测量参数"] + "','" + CXC_List.Rows[i]["变化范围"] + "','','" + CXC_List.Rows[i]["启用日期1"] + "'"; + sql += ",'" + CXC_List.Rows[i]["检定结果"] + "','" + CXC_List.Rows[i]["具体耗能"] + "','','" + CXC_List.Rows[i]["确认日期1"] + "','','0')"; + mm = mm + 1; + OracleHelper.ExecuteNonQuery100(sql); + SuccessRecord.Rows.Add(tempDataRowSucess); + Console.WriteLine("插入" + (mm).ToString() + "条记录"); + + } + else + { + DataRow tempDR = CXC_List.Rows[i]; + if (IsEqual(tempDR, ZYYT_List, CXC_List.Rows[i]["出厂编号"].ToString())) + { + + //更新语句 + sql += "UPDATE JL_QJ_JLQJ SET F_SJDW='" + CXC_List.Rows[i]["管理单位"] + "',F_LB='" + CXC_List.Rows[i]["设备类别"] + "',F_ZQDDJYQ='" + CXC_List.Rows[i]["应配准确等要求"] + "'"; + sql += ",F_JLQJMC='" + CXC_List.Rows[i]["测量设备名称"] + "',F_GGXH='" + CXC_List.Rows[i]["规格型号"] + "',F_CLFW='" + CXC_List.Rows[i]["测量范围"] + "',F_ZQDDJ='" + CXC_List.Rows[i]["准确度等级"] + "'"; + sql += ",F_CLJZ='" + CXC_List.Rows[i]["测量介质"] + "',F_JDZQ='" + CXC_List.Rows[i]["检定周期"] + "',F_YXRQ='" + CXC_List.Rows[i]["有效日期1"] + "',F_JDDW='" + CXC_List.Rows[i]["检定单位"] + "'"; + sql += ",F_TXQK='" + CXC_List.Rows[i]["调休情况"] + "',F_ZSBH='" + CXC_List.Rows[i]["证书编号"] + "',F_ZT='" + CXC_List.Rows[i]["状态"] + "',F_BZQ='" + CXC_List.Rows[i]["标准器"] + "'"; + sql += ",F_AQFH='" + CXC_List.Rows[i]["安全防护"] + "',F_HJJC='" + CXC_List.Rows[i]["环境监测"] + "',F_MYJS='" + CXC_List.Rows[i]["贸易结算"] + "',F_GCKZ='" + CXC_List.Rows[i]["工艺控制"] + "'"; + sql += ",F_ZLJC='" + CXC_List.Rows[i]["质量检测"] + "',F_HNJL='" + CXC_List.Rows[i]["耗能计量"] + "',F_CNJL='" + CXC_List.Rows[i]["产能计量"] + "',F_JDLB='" + CXC_List.Rows[i]["检定类别"] + "'"; + sql += ",F_GLLB='" + CXC_List.Rows[i]["管理类别"] + "',F_JDFY='" + CXC_List.Rows[i]["检定费用"] + "',F_SCCJ='" + CXC_List.Rows[i]["制造厂家"] + "',F_JDRQ='" + CXC_List.Rows[i]["检定日期1"] + "'"; + sql += ",F_JCZD='" + CXC_List.Rows[i]["集输站场"] + "',F_AZD='" + CXC_List.Rows[i]["使用存放地点"] + "',F_CSMC='" + CXC_List.Rows[i]["测量参数"] + "',F_BHFW='" + CXC_List.Rows[i]["变化范围"] + "'"; + sql += ",F_QYRQ='" + CXC_List.Rows[i]["启用日期1"] + "',F_JDJG='" + CXC_List.Rows[i]["检定结果"] + "',F_HNJLXQ='" + CXC_List.Rows[i]["具体耗能"] + "',F_QRRQ='" + CXC_List.Rows[i]["确认日期1"] + "'"; + sql += " WHERE F_CCBH='" + CXC_List.Rows[i]["出厂编号"] + "' and F_EJDW='EJ0010'"; + OracleHelper.ExecuteNonQuery100(sql); + nn = nn + 1; + Console.WriteLine("更新" + (nn).ToString() + "条记录"); + SuccessRecord.Rows.Add(tempDataRowSucess); + } + } + //} + Thread.Sleep(10); + } + + //写入xml + ErrorRecord.Columns.Remove("序号"); + ErrorRecord.Columns.Remove("管理编号"); + ErrorRecord.Columns.Remove("保管员"); + ErrorRecord.Columns.Remove("资产归属"); + ErrorRecord.Columns.Remove("测量过程类别"); + ErrorRecord.Columns.Remove("出厂日期"); + ErrorRecord.Columns.Remove("计量单位"); + ErrorRecord.Columns.Remove("分度值"); + ErrorRecord.Columns.Remove("仪表长度"); + ErrorRecord.Columns.Remove("检定状态"); + ErrorRecord.Columns.Remove("更换时间"); + ErrorRecord.Columns.Remove("更换原因"); + ErrorRecord.Columns.Remove("ZT1"); + ErrorRecord.Columns.Remove("维护时间"); + ErrorRecord.Columns.Remove("送检扫描日期"); + ErrorRecord.Columns.Remove("上传日期"); + ErrorRecord.Columns.Remove("启用日期"); + ErrorRecord.Columns.Remove("检定日期"); + ErrorRecord.Columns.Remove("有效日期"); + ErrorRecord.Columns.Remove("确认日期"); + + SuccessRecord.Columns.Remove("序号"); + SuccessRecord.Columns.Remove("管理编号"); + SuccessRecord.Columns.Remove("保管员"); + SuccessRecord.Columns.Remove("资产归属"); + SuccessRecord.Columns.Remove("测量过程类别"); + SuccessRecord.Columns.Remove("出厂日期"); + SuccessRecord.Columns.Remove("计量单位"); + SuccessRecord.Columns.Remove("分度值"); + SuccessRecord.Columns.Remove("仪表长度"); + SuccessRecord.Columns.Remove("检定状态"); + SuccessRecord.Columns.Remove("更换时间"); + SuccessRecord.Columns.Remove("更换原因"); + SuccessRecord.Columns.Remove("ZT1"); + SuccessRecord.Columns.Remove("维护时间"); + SuccessRecord.Columns.Remove("送检扫描日期"); + SuccessRecord.Columns.Remove("上传日期"); + SuccessRecord.Columns.Remove("启用日期"); + SuccessRecord.Columns.Remove("检定日期"); + SuccessRecord.Columns.Remove("有效日期"); + SuccessRecord.Columns.Remove("确认日期"); + + + + + + string name = path + "ErrorRecord.xml"; + ErrorRecord.WriteXml(name, XmlWriteMode.WriteSchema); + name = path + "SuccessRecord.xml"; + SuccessRecord.WriteXml(name, XmlWriteMode.WriteSchema); + + //对接日志 + dt = new DataTable("Record"); + dt.Columns.Add(new DataColumn("日期", typeof(string))); + dt.Columns.Add(new DataColumn("成功个数", typeof(string))); + dt.Columns.Add(new DataColumn("错误个数", typeof(string))); + DataRow tempDr = dt.NewRow(); + tempDr[0] = System.DateTime.Now; + tempDr[1] = SuccessRecord.Rows.Count; + tempDr[2] = ErrorRecord.Rows.Count; + dt.Rows.Add(tempDr); + name = path + "Log.xml"; + dt.WriteXml(name, XmlWriteMode.WriteSchema); + dt.WriteXml(path + "updateFlag.xml", XmlWriteMode.WriteSchema); + + Console.WriteLine("更新" + (nn).ToString() + "条记录" + "||||插入" + (mm).ToString() + "条记录" + "错误" + jj.ToString() + "条记录"); + + + } + + //更新时判断是否一样,一样就不更新 + protected bool IsEqual(DataRow dr_AfterCode, DataTable ZYYT, string ccbh) + { + DataRow[] dr = ZYYT.Select("F_CCBH='" + ccbh + "' and F_EJDW='EJ0010'"); + + if (!dr_AfterCode["管理单位"].ToString().Equals(dr[0]["F_SJDW"].ToString())) { return true; } + if (!dr_AfterCode["设备类别"].ToString().Equals(dr[0]["F_LB"].ToString())) { return true; } + if (!dr_AfterCode["应配准确等要求"].ToString().ToString().Equals(dr[0]["F_ZQDDJYQ"].ToString())) { return true; } + + if (!dr_AfterCode["测量设备名称"].ToString().ToString().Equals(dr[0]["F_JLQJMC"].ToString())) { return true; } + if (!dr_AfterCode["规格型号"].ToString().Equals(dr[0]["F_GGXH"].ToString())) { return true; } + if (!dr_AfterCode["测量范围"].ToString().Equals(dr[0]["F_CLFW"].ToString())) { return true; } + if (!dr_AfterCode["准确度等级"].ToString().Equals(dr[0]["F_ZQDDJ"].ToString())) { return true; } + + if (!dr_AfterCode["测量介质"].ToString().Equals(dr[0]["F_CLJZ"].ToString())) { return true; } + if (!dr_AfterCode["检定周期"].ToString().Equals(dr[0]["F_JDZQ"].ToString())) { return true; } + if (!dr_AfterCode["有效日期1"].ToString().Equals(dr[0]["F_YXRQ"].ToString())) { return true; } + if (!dr_AfterCode["检定单位"].ToString().Equals(dr[0]["F_JDDW"].ToString())) { return true; } + + if (!dr_AfterCode["调休情况"].ToString().Equals(dr[0]["F_TXQK"].ToString())) { return true; } + if (!dr_AfterCode["证书编号"].ToString().Equals(dr[0]["F_ZSBH"].ToString())) { return true; } + if (!dr_AfterCode["状态"].ToString().Equals(dr[0]["F_ZT"].ToString())) { return true; } + if (!dr_AfterCode["标准器"].ToString().Equals(dr[0]["F_BZQ"].ToString())) { return true; } + + if (!dr_AfterCode["安全防护"].ToString().Equals(dr[0]["F_AQFH"].ToString())) { return true; } + if (!dr_AfterCode["环境监测"].ToString().Equals(dr[0]["F_HJJC"].ToString())) { return true; } + if (!dr_AfterCode["贸易结算"].ToString().Equals(dr[0]["F_MYJS"].ToString())) { return true; } + if (!dr_AfterCode["工艺控制"].ToString().Equals(dr[0]["F_GCKZ"].ToString())) { return true; } + + if (!dr_AfterCode["质量检测"].ToString().Equals(dr[0]["F_ZLJC"].ToString())) { return true; } + if (!dr_AfterCode["耗能计量"].ToString().Equals(dr[0]["F_HNJL"].ToString())) { return true; } + if (!dr_AfterCode["产能计量"].ToString().Equals(dr[0]["F_CNJL"].ToString())) { return true; } + if (!dr_AfterCode["检定类别"].ToString().Equals(dr[0]["F_JDLB"].ToString())) { return true; } + + if (!dr_AfterCode["管理类别"].ToString().Equals(dr[0]["F_GLLB"].ToString())) { return true; } + if (!dr_AfterCode["检定费用"].ToString().Equals(dr[0]["F_JDFY"].ToString())) { return true; } + if (!dr_AfterCode["制造厂家"].ToString().Equals(dr[0]["F_SCCJ"].ToString())) { return true; } + if (!dr_AfterCode["检定日期1"].ToString().Equals(dr[0]["F_JDRQ"].ToString())) { return true; } + + if (!dr_AfterCode["集输站场"].ToString().Equals(dr[0]["F_JCZD"].ToString())) { return true; } + if (!dr_AfterCode["使用存放地点"].ToString().Equals(dr[0]["F_AZD"].ToString())) { return true; } + if (!dr_AfterCode["测量参数"].ToString().Equals(dr[0]["F_CSMC"].ToString())) { return true; } + if (!dr_AfterCode["变化范围"].ToString().Equals(dr[0]["F_BHFW"].ToString())) { return true; } + + if (!dr_AfterCode["启用日期1"].ToString().Equals(dr[0]["F_QYRQ"].ToString())) { return true; } + if (!dr_AfterCode["检定结果"].ToString().Equals(dr[0]["F_JDJG"].ToString())) { return true; } + if (!dr_AfterCode["具体耗能"].ToString().Equals(dr[0]["F_HNJLXQ"].ToString())) { return true; } + if (!dr_AfterCode["确认日期1"].ToString().Equals(dr[0]["F_QRRQ"].ToString())) { return true; } + + return false; + } + + + /// + /// 产销厂台帐,过滤不要的器具名称 + /// + /// + private DataTable TRQCXC() + { + string sql = "select * from clsbtz where 状态 ='在用' and 使用存放地点 is not null and 制造厂家 is not null and 测量设备名称 not in('InTouch组态软件','WebAccess组态软件','工业热电阻检定软件','孔板综合测量仪软件','硫氮测定仪嵌入式软件','三K值计算程序','天然气流量计算管理系统','PCM金属探测仪')"; + //string sql = "select * from clsbtz where 状态 ='在用' and 使用存放地点 is not null and 制造厂家 is not null and 测量设备名称 not in('InTouch组态软件','WebAccess组态软件','工业热电阻检定软件','孔板综合测量仪软件','硫氮测定仪嵌入式软件','三K值计算程序','天然气流量计算管理系统','PCM金属探测仪')"; + return dt = OraDataBase.OracleHelper.DataAdapter(sql, "DT").Tables[0]; + } + + /// + /// 局台帐 + /// + /// + private DataTable ZYYT() + { + //string sql = "select * from JL_QJ_JLQJ where f_ejdw = 'EJ0010'"; + string sql = "select * from JL_QJ_JLQJ where f_ejdw = 'EJ0010'"; + return dt = OracleHelper.DataAdapter100(sql, "DT").Tables[0]; + } + + /// + /// 局台帐基础表:管理单位视图 + /// + /// + private DataTable GLDW() + { + //二三四级单位 + string strCmd = "select * from VIEW_JL_DW1234 where f_ejdwbh = 'EJ0010'"; + return dt = OracleHelper.DataAdapter100(strCmd, "DT").Tables[0]; + } + + /// + /// 局台帐基础表:器具基础信息视图 + /// + /// + private DataTable EquipInfo() + { + //二三四级单位 + string strCmd = "select * from VIEW_JL_DIC_CJGG"; + return dt = OracleHelper.DataAdapter100(strCmd, "DT").Tables[0]; + } + + /// + /// 准确度等级 + /// + /// + private DataTable ZQDDJ() + { + string strCmd = "select * from jl_dic_zqddj"; + return dt = OracleHelper.DataAdapter100(strCmd, "DT").Tables[0]; + } + + /// + /// 测量参数 + /// + /// + private DataTable CLCS() + { + string strCmd = "select * from jl_dic_clcs"; + return dt = OracleHelper.DataAdapter100(strCmd, "DT").Tables[0]; + } + + /// + /// 测量介质 + /// + /// + private DataTable CLJZ() + { + string strCmd = "select * from jl_dic_cljz"; + return dt = OracleHelper.DataAdapter100(strCmd, "DT").Tables[0]; + } + + /// + /// 检定单位 + /// + /// + private DataTable JDDW() + { + string strCmd = "select * from jl_dic_jddw"; + return dt = OracleHelper.DataAdapter100(strCmd, "DT").Tables[0]; + } + + + + + + } +} diff --git a/UpdateMeter/Properties/AssemblyInfo.cs b/UpdateMeter/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..299e8a3 --- /dev/null +++ b/UpdateMeter/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("UpdateMeter")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("UpdateMeter")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2015")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("62c90320-fe5a-4120-9e06-5055266ba09c")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/UpdateMeter/UpdateMeter.csproj b/UpdateMeter/UpdateMeter.csproj new file mode 100644 index 0000000..3e69ff6 --- /dev/null +++ b/UpdateMeter/UpdateMeter.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {07D0B046-C0AD-49E9-BDA6-C6BB0252F26A} + Exe + Properties + UpdateMeter + UpdateMeter + v4.0 + 512 + + + + x86 + true + full + false + D:\GetPLCData\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/UpdateMeter/bin/Debug/UpdateMeter.exe b/UpdateMeter/bin/Debug/UpdateMeter.exe new file mode 100644 index 0000000..d3d26ce Binary files /dev/null and b/UpdateMeter/bin/Debug/UpdateMeter.exe differ diff --git a/UpdateMeter/bin/Debug/UpdateMeter.exe.config b/UpdateMeter/bin/Debug/UpdateMeter.exe.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/UpdateMeter/bin/Debug/UpdateMeter.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/UpdateMeter/bin/Debug/UpdateMeter.pdb b/UpdateMeter/bin/Debug/UpdateMeter.pdb new file mode 100644 index 0000000..a1b628f Binary files /dev/null and b/UpdateMeter/bin/Debug/UpdateMeter.pdb differ diff --git a/UpdateMeter/bin/Release/UpdateMeter.exe b/UpdateMeter/bin/Release/UpdateMeter.exe new file mode 100644 index 0000000..fa014e2 Binary files /dev/null and b/UpdateMeter/bin/Release/UpdateMeter.exe differ diff --git a/UpdateMeter/bin/Release/UpdateMeter.exe.config b/UpdateMeter/bin/Release/UpdateMeter.exe.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/UpdateMeter/bin/Release/UpdateMeter.exe.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/UpdateMeter/bin/Release/UpdateMeter.pdb b/UpdateMeter/bin/Release/UpdateMeter.pdb new file mode 100644 index 0000000..5d1ee4e Binary files /dev/null and b/UpdateMeter/bin/Release/UpdateMeter.pdb differ diff --git a/UpdateMeter/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/UpdateMeter/obj/Debug/DesignTimeResolveAssemblyReferences.cache new file mode 100644 index 0000000..01767b9 Binary files /dev/null and b/UpdateMeter/obj/Debug/DesignTimeResolveAssemblyReferences.cache differ diff --git a/UpdateMeter/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache b/UpdateMeter/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache new file mode 100644 index 0000000..c211faf Binary files /dev/null and b/UpdateMeter/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache differ diff --git a/UpdateMeter/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/UpdateMeter/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/UpdateMeter/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/UpdateMeter/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/UpdateMeter/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/UpdateMeter/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/UpdateMeter/obj/Debug/UpdateMeter.csproj.FileListAbsolute.txt b/UpdateMeter/obj/Debug/UpdateMeter.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..3195352 --- /dev/null +++ b/UpdateMeter/obj/Debug/UpdateMeter.csproj.FileListAbsolute.txt @@ -0,0 +1,23 @@ +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\bin\Debug\UpdateMeter.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\bin\Debug\UpdateMeter.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\bin\Debug\UpdateMeter.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\UpdateMeter.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\UpdateMeter.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\GetDataPLC_exe\UpdateMeter.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.csprojResolveAssemblyReference.cache +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.csprojResolveAssemblyReference.cache +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.exe +E:\自动接收\计量管理科(F0BF97D8CA14)\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.pdb +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.exe +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.pdb +C:\Users\cloud\Documents\Visual Studio 2012\Projects\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.csprojResolveAssemblyReference.cache +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.csprojResolveAssemblyReference.cache +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.exe +E:\ldy\Desktop\GetData_PLC+三力超声波\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.pdb +D:\GetPLCData\UpdateMeter.exe.config +D:\GetPLCData\UpdateMeter.exe +D:\GetPLCData\UpdateMeter.pdb +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.exe +E:\ldy\Documents\Visual Studio 2013\Projects\GetData_PLC_NEW\GetData_PLC\UpdateMeter\obj\Debug\UpdateMeter.pdb diff --git a/UpdateMeter/obj/Debug/UpdateMeter.exe b/UpdateMeter/obj/Debug/UpdateMeter.exe new file mode 100644 index 0000000..25d9601 Binary files /dev/null and b/UpdateMeter/obj/Debug/UpdateMeter.exe differ diff --git a/UpdateMeter/obj/Debug/UpdateMeter.pdb b/UpdateMeter/obj/Debug/UpdateMeter.pdb new file mode 100644 index 0000000..11c5f15 Binary files /dev/null and b/UpdateMeter/obj/Debug/UpdateMeter.pdb differ diff --git a/UpdateMeter/obj/Release/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs b/UpdateMeter/obj/Release/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs new file mode 100644 index 0000000..e69de29 diff --git a/UpdateMeter/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs b/UpdateMeter/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs new file mode 100644 index 0000000..e69de29 diff --git a/UpdateMeter/obj/Release/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs b/UpdateMeter/obj/Release/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs new file mode 100644 index 0000000..e69de29 diff --git a/UpdateMeter/obj/Release/UpdateMeter.csproj.FileListAbsolute.txt b/UpdateMeter/obj/Release/UpdateMeter.csproj.FileListAbsolute.txt new file mode 100644 index 0000000..9053a6e --- /dev/null +++ b/UpdateMeter/obj/Release/UpdateMeter.csproj.FileListAbsolute.txt @@ -0,0 +1,5 @@ +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\bin\Release\UpdateMeter.exe.config +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\bin\Release\UpdateMeter.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\bin\Release\UpdateMeter.pdb +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\obj\Release\UpdateMeter.exe +E:\我的文档\Documents\Visual Studio 2013\Projects\GetData_PLC\UpdateMeter\obj\Release\UpdateMeter.pdb diff --git a/UpdateMeter/obj/Release/UpdateMeter.exe b/UpdateMeter/obj/Release/UpdateMeter.exe new file mode 100644 index 0000000..fa014e2 Binary files /dev/null and b/UpdateMeter/obj/Release/UpdateMeter.exe differ diff --git a/UpdateMeter/obj/Release/UpdateMeter.pdb b/UpdateMeter/obj/Release/UpdateMeter.pdb new file mode 100644 index 0000000..5d1ee4e Binary files /dev/null and b/UpdateMeter/obj/Release/UpdateMeter.pdb differ