using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using System.Globalization; using System.Collections; using System.IO; using System.Runtime.Serialization.Formatters.Binary; using System.Timers; using RemoteObjects; using CommService; namespace ClientTest { /* *结构名称:struIPPort *创建人:韩荣伟 *创建时间:2010-10-30 *功能描述:ip port结构 */ [Serializable] struct struIPPort { public string sIP; public int nPort; }; /* *类名称:FrmMain *创建人:韩荣伟 *创建时间:2010-10-30 *功能描述:主窗口类 */ public partial class FrmMain : Form { private ReqHandler remoteobj = null; private Hashtable htTerminalIPPort = new Hashtable(); private Hashtable htRemotingIPPort = new Hashtable(); private string sFileTerminalIPPort; private string sFileRemotingIPPort; private Hashtable htTerminals; private Hashtable htTerminalParams = null; private string sSelectedTID; private string sSelectedMID; private ImageList myImageList = null; private System.Timers.Timer aTimer = null; private Hashtable htOldTerminals = null; delegate void UpdateTreeViewCallback(object userData); private bool bStartTimer = false; /* *方法名称:FrmMain *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:void *返回描述:void *功能描述:构造函数,初始化 */ public FrmMain() { InitializeComponent(); //remoting通道注册 ChannelServices.RegisterChannel(new TcpClientChannel(), false); sFileTerminalIPPort = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "TerminalIPPort.dat"; sFileRemotingIPPort = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "RemotingIPPort.dat"; LoadTerminalIPPort(); myImageList = new ImageList(); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "集中器1.bmp")); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "电表.bmp")); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "电表-selected.bmp")); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "变压器.bmp")); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "Home.ico")); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "集中器1_gray.bmp")); myImageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "电表_gray.bmp")); Common.frmMain = this; Common.btRefresh = btnRefresh; } /* *方法名称:UpdTreeViewInfo *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object userData 按钮实例 *返回描述:void *功能描述:触发更新按钮 */ public static void UpdTreeViewInfo(object userData) { Button bt = (Button)userData; if (bt.InvokeRequired) { UpdateTreeViewCallback d = new UpdateTreeViewCallback(UpdTreeViewInfo); Common.frmMain.Invoke(d, new object[] { userData}); } else { bt.PerformClick(); } } /* *方法名称:LoadTerminalIPPort *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:void *返回描述:void *功能描述:加载上次的设置IP与端口 */ private void LoadTerminalIPPort() { Common.configReader.Load(System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "\\config.xml"); if (File.Exists(sFileTerminalIPPort)) { htTerminalIPPort.Clear(); FileStream fs = new FileStream(sFileTerminalIPPort, FileMode.OpenOrCreate); BinaryFormatter bf = new BinaryFormatter(); htTerminalIPPort = (Hashtable)bf.Deserialize(fs); fs.Close(); } if (File.Exists(sFileRemotingIPPort)) { htRemotingIPPort.Clear(); FileStream fs = new FileStream(sFileRemotingIPPort, FileMode.OpenOrCreate); BinaryFormatter bf = new BinaryFormatter(); htRemotingIPPort = (Hashtable)bf.Deserialize(fs); textBox1.Text = (string)htRemotingIPPort["RemotingIP"]; textBox2.Text = (string)htRemotingIPPort["RemotingPort"]; fs.Close(); } } /* *方法名称:SaveTerminalIPPort *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:void *返回描述:void *功能描述:保存上次的集中器设置IP与端口 */ private void SaveTerminalIPPort() { FileStream fs = new FileStream(sFileTerminalIPPort, FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, htRemotingIPPort); fs.Close(); } /* *方法名称:SaveRemotingIPPort *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:void *返回描述:void *功能描述:保存上次的remoting设置IP与端口 */ private void SaveRemotingIPPort() // { htTerminalIPPort["RemotingIP"] = textBox1.Text.Trim(); htTerminalIPPort["RemotingPort"] = textBox2.Text.Trim(); FileStream fs = new FileStream(sFileRemotingIPPort, FileMode.Create); BinaryFormatter bf = new BinaryFormatter(); bf.Serialize(fs, htTerminalIPPort); fs.Close(); } /* *方法名称:ExitToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 菜单命令发出者, EventArgs e 菜单命令事件参数 *返回描述:void *功能描述:系统退出 */ private void ExitToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } /* *方法名称:WriteTextBoxInfo *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:string text *返回描述:void *功能描述:信息输出 */ private void WriteTextBoxInfo(string text) { DateTime dtNow = DateTime.Now; string log = dtNow.ToString("yyyy-MM-dd HH:mm:ss ", CultureInfo.InvariantCulture); log += text + "\r\n"; richTBInfo.Text += log; richTBInfo.Refresh(); } /* *方法名称:ReadTTimeToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 菜单命令发起者, EventArgs e 菜单命令事件 *返回描述:void *功能描述:读集中器时间 */ private void ReadTTimeToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } string strTerminalTime = ""; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读时间..."); try { bool res = remoteobj.GetTime(sSelectedTID, ref strTerminalTime); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读时间 结果返回:" + res.ToString() + (res == true ? ",时间为:" + strTerminalTime : strTerminalTime)); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } /* *方法名称:TimingToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 菜单命令发起者, EventArgs e 菜单命令事件 *返回描述:void *功能描述:给集中器校时 */ private void TimingToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始校时..."); try { WriteTextBoxInfo(tbCurrentTerminal.Text + " 校时 结果返回:" + remoteobj.SetTime(sSelectedTID).ToString()); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } /* *方法名称:ReadSteamDataToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 菜单命令发起者, EventArgs e 菜单命令事件 *返回描述:void *功能描述:招唤蒸汽数据 */ private void ReadSteamDataToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "" || sSelectedMID =="") { MessageBox.Show("请选择当前仪表"); return; } List lstParams; Hashtable hsTable = null; S_CallDataForm inputDialog = new S_CallDataForm(); inputDialog.sMID = sSelectedMID; // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { //string sMID = sSelectedMID; // Read the contents of testDialog's TextBox. //this.txtResult.Text = testDialog.TextBox1.Text; lstParams = inputDialog.lstOBJID; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始招唤数据..."); string sComment = ""; try { bool res = remoteobj.GetData(sSelectedTID, sSelectedMID, lstParams, ref hsTable); sComment += sSelectedTID + " " + sSelectedMID + " 招唤数据 结果返回:" + res + "\r\n"; if (res == true) { //int key = 0; //foreach (DictionaryEntry de in hsTable) { //key = (int)de.Key; if (hsTable.ContainsKey((uint)0x8030)) { sComment += "\t\t\t\t终端时间:" + hsTable[(uint)0x8030] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B07)) { sComment += "\t\t\t\t蒸汽仪表累积热量:" + hsTable[(uint)0x9B07] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B06)) { sComment += "\t\t\t\t蒸汽仪表瞬时热量:" + hsTable[(uint)0x9B06] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B05)) { sComment += "\t\t\t\t蒸汽仪表累积流量值:" + hsTable[(uint)0x9B05] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B03)) { sComment += "\t\t\t\t蒸汽仪表瞬时流量值:" + hsTable[(uint)0x9B03] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B01)) { sComment += "\t\t\t\t蒸汽仪表温度值:" + hsTable[(uint)0x9B01] + "\r\n"; } //温度为负值情况 if (hsTable.ContainsKey((uint)0x9B11)) { sComment += "\t\t\t\t蒸汽仪表温度值:" + hsTable[(uint)0x9B11] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B1F)) { sComment += "\t\t\t\t蒸汽仪表压力值:" + hsTable[(uint)0x9B1F] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B00)) { sComment += "\t\t\t\t蒸汽仪表压力值:" + hsTable[(uint)0x9B00] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B02)) { sComment += "\t\t\t\t蒸汽仪表频率:" + hsTable[(uint)0x9B02] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B0E)) { sComment += "\t\t\t\t蒸汽仪表密度:" + hsTable[(uint)0x9B0E] + "\r\n"; } if (hsTable.ContainsKey((uint)0x9B0F)) { sComment += "\t\t\t\t蒸汽仪表差压:" + hsTable[(uint)0x9B0F] + "\r\n"; } } } WriteTextBoxInfo(sComment); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } } /* *方法名称:btnRefresh_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 点击事件参数 *返回描述:void *功能描述:刷新集中器列表 */ private void btnRefresh_Click(object sender, EventArgs e) { int nTHDeviceCount = 0; int nElecDeviceCount = 0; int nSteamDeviceCount = 0; //List lstTerminal = new List(); Hashtable htTerminals = new Hashtable(); bool res = false; try { res = remoteobj.GetTerminalList(ref htTerminals); } catch (Exception e1) { WriteTextBoxInfo("不能取终端列表,未注册 或 服务可能未启动"); } if (res == true) { TerminalParamParsing(htTerminals); tvTerminalList.ImageList = myImageList; tvTerminalList.Nodes.Clear(); //int nSeq = 0; tvTerminalList.BeginUpdate(); tvTerminalList.Nodes.Add("NormalROOT", "采集终端与仪表", 4, 4);//struNodeOfTree tvTerminalList.Nodes.Add("TestROOT", "测试", 4, 4);//struNodeOfTree int nTestSeq = 0; foreach (DictionaryEntry de in htTerminalParams) { //测试 if (de.Key.ToString().StartsWith("测试")) { //添加集中器 tvTerminalList.Nodes[1].Nodes.Add(de.Key.ToString(), de.Key.ToString(), 0); struTerminal Terminal = (struTerminal)de.Value; //nElecDeviceCount++; //添加仪表 foreach (DictionaryEntry de2 in Terminal.htMeters) { tvTerminalList.Nodes[1].Nodes[nTestSeq].Nodes.Add(de2.Key.ToString(), de2.Key.ToString(), 1, 2); } nTestSeq++; } else { struTerminal Terminal = (struTerminal)de.Value; if (Terminal.bOn == true) { //treeView1.Nodes[0].Nodes.Add(de.Key.ToString(), de.Key.ToString(), 0); //int index=de.Key.ToString().IndexOf("-"); //string id = de.Key.ToString().Substring(index+1); //if (id.StartsWith("S")) //{ TreeNode tn = tvTerminalList.Nodes[0].Nodes.Insert(0, de.Key.ToString(), de.Key.ToString(), 0); //添加仪表 foreach (DictionaryEntry de2 in Terminal.htMeters) { //treeView1.Nodes[0].Nodes[nSeq].Nodes.Add(de2.Key.ToString(), de2.Key.ToString(), 1, 2); tn.Nodes.Add(de2.Key.ToString(), de2.Key.ToString(), 1, 2); } if (Terminal.sTID.StartsWith("E")) { nElecDeviceCount++; } else if (Terminal.sTID.StartsWith("T")) { nTHDeviceCount++; } if (Terminal.sTID.StartsWith("S")) { nSteamDeviceCount++; } //} } else { TreeNode tn = tvTerminalList.Nodes[0].Nodes.Add(de.Key.ToString(), de.Key.ToString(), 5, 5); //添加仪表 foreach (DictionaryEntry de2 in Terminal.htMeters) { tn.Nodes.Add(de2.Key.ToString(), de2.Key.ToString(), 6, 6); } } } } tvTerminalList.Nodes[0].Expand(); tvTerminalList.Nodes[1].Expand(); tvTerminalList.EndUpdate(); } lblStreamDeviceCount.Text = "" + nSteamDeviceCount; lblTHDeviceCount.Text = "" + nTHDeviceCount; lblElectronicDeviceCount.Text = "" + nElecDeviceCount; return; } /* *方法名称:TerminalParamParsing *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:Hashtable htTerminals 集中器哈希表 *返回描述:void *功能描述:集中器列表参数解析 */ private void TerminalParamParsing(Hashtable htTerminals) { htTerminalParams = new Hashtable(); string sTName, sTID, sMName, sMID; foreach (DictionaryEntry de in htTerminals) { sTName = ""; sTID = ""; sMName = ""; sMID = ""; string s = de.Key.ToString(); ParamParsing(ref s, ref sMID, ref sMName); s = de.Value.ToString(); ParamParsing(ref s, ref sTID, ref sTName);// OnLine OffLine struTerminal Terminal; bool bTerminalOn = sTName.EndsWith("1");//0 1 sTName = sTName.Remove(sTName.Length-2,2);// if (htTerminalParams[sTName + "-" + sTID] == null) { Terminal = new struTerminal(); Terminal.sTID = sTID; Terminal.htMeters = new Hashtable(); Terminal.bOn = bTerminalOn; htTerminalParams[sTName + "-" + sTID] = Terminal; } else { Terminal = (struTerminal)htTerminalParams[sTName + "-" + sTID]; } Terminal.htMeters.Add(sMName +"-" +sMID, sMID); } return; } /* *方法名称:ParamParsing *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:ref string sOri 组合字符串, ref string s1 字符串1, ref string s2 字符串2 *返回描述:void *功能描述:集中器列表参数解析 */ private void ParamParsing(ref string sOri, ref string s1, ref string s2) { int nIndex = sOri.IndexOf('\n'); if (nIndex != -1) { s1 = sOri.Substring(0, nIndex); s2 = sOri.Substring(nIndex + 1, sOri.Length - nIndex - 1); } } /* *方法名称:richTBInfo_TextChanged *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:输出信息更新处理,滚动到末尾,字节数控制 */ private void richTBInfo_TextChanged(object sender, EventArgs e) { //若内容长度过大,清空 if (richTBInfo.TextLength >= 65536) { richTBInfo.Clear(); return; } richTBInfo.SelectionStart = richTBInfo.TextLength; richTBInfo.ScrollToCaret(); } /* *方法名称:SetTerminalIPToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:设置终端IP Port */ private void SetTerminalIPToolStripMenuItem_Click(object sender, EventArgs e) { bool res = false; if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } IPPortInputForm inputDialog = new IPPortInputForm(); struIPPort struSavedIPPort; if (htTerminalIPPort.ContainsKey(tbCurrentTerminal.Text)) { struSavedIPPort = (struIPPort)htTerminalIPPort[tbCurrentTerminal.Text]; inputDialog.LoadIPPort(struSavedIPPort.sIP, struSavedIPPort.nPort); } else { struSavedIPPort = new struIPPort(); } // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { struSavedIPPort.sIP = inputDialog.sIP; struSavedIPPort.nPort = inputDialog.nPort; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始写IP和Port..."); try { res = remoteobj.SetIPPort(sSelectedTID, struSavedIPPort.sIP, struSavedIPPort.nPort); WriteTextBoxInfo(tbCurrentTerminal.Text+ " 写IP和Port 结果返回:" + res.ToString()); if (res == true) { htTerminalIPPort[sSelectedTID] = struSavedIPPort; SaveTerminalIPPort(); } } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:MainForm_Load *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:主窗口加载,初始化 */ private void MainForm_Load(object sender, EventArgs e) { btnRefresh.Enabled = false; } /* *方法名称:SetHeartBeatIntervalToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:设置心跳间隔 */ private void SetHeartBeatIntervalToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } int nInterval; HeartBeatIntervalForm inputDialog = new HeartBeatIntervalForm(); // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { // Read the contents of testDialog's TextBox. //this.txtResult.Text = testDialog.TextBox1.Text; nInterval = inputDialog.nInterval*Common.MULTIPLE; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始写心跳间隔..."); try { WriteTextBoxInfo(tbCurrentTerminal.Text + " 写心跳间隔 结果返回:" + remoteobj.SetHeartBeatInterval(sSelectedTID, nInterval).ToString()); } catch (Exception e1) { Console.WriteLine("写心跳间隔 exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:SetAutoSendIntervalToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:设置主动上传间隔 */ private void SetAutoSendIntervalToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } int nInterval; AutoSendIntervalForm inputDialog = new AutoSendIntervalForm(); // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { // Read the contents of testDialog's TextBox. //this.txtResult.Text = testDialog.TextBox1.Text; nInterval = inputDialog.nInterval*Common.MULTIPLE; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始写主动上传间隔..."); try { WriteTextBoxInfo(tbCurrentTerminal.Text + " 写主动上传间隔 结果返回:" + remoteobj.SetAutoSendInterval(sSelectedTID, nInterval).ToString()); } catch (Exception e1) { Console.WriteLine("写主动上传间隔 exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:GetHeartIntervalToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:获取心跳间隔 */ private void GetHeartIntervalToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } string sInterval = ""; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读心跳间隔..."); try { bool res = remoteobj.GetHeartBeatInterval(sSelectedTID, ref sInterval); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读心跳间隔 结果返回:" + res.ToString() + (res == true ? ",心跳间隔为:" + (Convert.ToInt32(sInterval)/Common.MULTIPLE) : "")); } catch (Exception e1) { // Console.WriteLine("exeption: " + e1.ToString()); } } /* *方法名称:GetAutoSendIntervalToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:获取主动上传间隔 */ private void GetAutoSendIntervalToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } string sInterval = ""; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读主动上传间隔..."); try { bool res = remoteobj.GetAutoSendInterval(sSelectedTID, ref sInterval); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读主动上传间隔 结果返回:" + res.ToString() + (res == true ? ",主动上传间隔为:" + Convert.ToInt32(sInterval)/Common.MULTIPLE : "")); } catch (Exception e1) { // Console.WriteLine("exeption: " + e1.ToString()); } } /* *方法名称:SetTerminalIDToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:设置终端编号 */ private void SetTerminalIDToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } string sNewName; NewTerminalNameForm inputDialog = new NewTerminalNameForm(); inputDialog.SetTerminalName(sSelectedTID); // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { // Read the contents of testDialog's TextBox. //this.txtResult.Text = testDialog.TextBox1.Text; sNewName = inputDialog.sNewName; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始设置采集终端编号..."); try { WriteTextBoxInfo(tbCurrentTerminal.Text + " 设置采集终端编号:" + remoteobj.SetTerminalName(sSelectedTID, sNewName).ToString()); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:SetMeterIDAndEnableToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:设置仪表地址和置位 */ private void SetMeterIDAndEnableToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } //string sNewName; MeterAddrForm inputDialog = new MeterAddrForm(); WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读取仪表地址..."); byte[] arr = null; bool res = remoteobj.GetMeterAddr(sSelectedTID, ref arr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读取仪表地址 结果:" + res); if (res == false || arr.Length != 16) { return; } for (int i = 0; i < 16; i++) { inputDialog.arrTextBox[i].Text = arr[i].ToString("X2"); //inputDialog.arrTextBox[i].Text = arr[i].ToString("D2"); } res = remoteobj.GetMeterAble(sSelectedTID, ref arr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读取仪表置位 结果:" + res); if (res == false || arr.Length != 16) { return; } for (int i = 0; i < 16; i++) { if (arr[i] > 0) { inputDialog.checkedListBox.SetItemChecked(i, true);// arrTextBox[0].Text = arr[i].ToString("D3"); } else { inputDialog.checkedListBox.SetItemChecked(i, false);// arrTextBox[0].Text = arr[i].ToString("D3"); } } // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { Console.WriteLine("inputDialog.ShowDialog(this) == DialogResult.OK"); res = false; byte[] arrAddr = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始设置仪表地址..."); try { arrAddr = new byte[16]; for (int i = 0; i < 16; i++) { arrAddr[i] = Convert.ToByte(inputDialog.arrTextBox[i].Text, 16); //arrAddr[i] = Convert.ToByte(inputDialog.arrTextBox[i].Text); } res = remoteobj.SetMeterAddr(sSelectedTID, ref arrAddr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 设置仪表地址:" + res); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } if (res == false) { return; } WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始设置仪表置位..."); try { for (int i = 0; i < 16; i++) { arrAddr[i] = Convert.ToByte(inputDialog.checkedListBox.GetItemChecked(i) == true ? 1 : 0); } res = remoteobj.SetMeterAble(sSelectedTID, ref arrAddr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 设置设置仪表置位:" + res); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:btnRegister_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:remoting 注册 */ private void btnRegister_Click(object sender, EventArgs e) { SaveRemotingIPPort(); try { remoteobj = (ReqHandler)Activator.GetObject(typeof(ReqHandler), "tcp://" + textBox1.Text.Trim() + ":" + textBox2.Text.Trim() + "/RemoteObject"); btnRefresh.Enabled = true; StartTimer(); } catch (Exception e1) { MessageBox.Show("注册失败"); } } /* *方法名称:S_AlarmSettingToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:蒸汽告警参数设置 */ private void S_AlarmSettingToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "" || sSelectedMID == "") { MessageBox.Show("请选择当前仪表"); return; } //string sNewName; AlarmSettingForm inputDialog = new AlarmSettingForm(); inputDialog.sMID = sSelectedMID; bool res = false; string[] arr = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读取蒸汽仪表上下限..."); res = remoteobj.GetStreamThreshold(sSelectedTID, sSelectedMID, ref arr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读取蒸汽仪表上下限 结果:" + res); if (res == false || arr.Length != 16) { return; } for (int i = 0; i < 16; i++) { inputDialog.arrTextBox[i].Text = arr[i]; } // Show testDialog as a modal dialog and determine if DialogResult = OK. inputDialog.Height = 419; if (inputDialog.ShowDialog(this) == DialogResult.OK) { res = false; string[] arrThreshold = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始设置蒸汽仪表上下限..."); try { arrThreshold = new string[16]; for (int i = 0; i < 16; i++) { arrThreshold[i] = inputDialog.arrTextBox[i].Text; } res = remoteobj.SetStreamThreshold(sSelectedTID, sSelectedMID, ref arrThreshold); WriteTextBoxInfo(tbCurrentTerminal.Text + " 蒸汽仪表上下限:" + res); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:tvTerminalList_AfterSelect *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:集中器树点击处理,记录终端ID和仪表ID */ private void tvTerminalList_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Action == TreeViewAction.ByKeyboard || e.Action == TreeViewAction.ByMouse) { struTerminal termianl; if (e.Node.Level == 1) { termianl = (struTerminal)htTerminalParams[e.Node.Text]; if (termianl.bOn) { tbCurrentTerminal.Text = e.Node.Text; sSelectedTID = termianl.sTID; sSelectedMID = ""; } else { tbCurrentTerminal.Text = ""; sSelectedTID = ""; sSelectedMID = ""; } } else if (e.Node.Level == 2) { termianl = (struTerminal)htTerminalParams[e.Node.Parent.Text]; if (termianl.bOn) { tbCurrentTerminal.Text = e.Node.Parent.Text; sSelectedTID = termianl.sTID; sSelectedMID = (string)termianl.htMeters[e.Node.Text]; } else { tbCurrentTerminal.Text = ""; sSelectedTID = ""; sSelectedMID = ""; } } } } /* *方法名称:E_AlarmSettingToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:电表告警参数设置 */ private void E_AlarmSettingToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "" || sSelectedMID == "") { MessageBox.Show("请选择当前仪表"); return; } E_AlarmSettingForm inputDialog = new E_AlarmSettingForm(); bool res = false; string[] arr = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 开始读取电表上下限..."); res = remoteobj.GetElectricThreshold(sSelectedTID, sSelectedMID, ref arr); WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 读取电表上下限 结果:" + res); if (res == false || arr.Length != 8) { return; } for (int i = 0; i < 8; i++) { inputDialog.arrTextBox[i].Text = arr[i]; } // Show testDialog as a modal dialog and determine if DialogResult = OK. inputDialog.sMID = sSelectedMID; if (inputDialog.ShowDialog(this) == DialogResult.OK) { res = false; string[] arrThreshold = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 开始设置电表上下限..."); try { arrThreshold = new string[8]; for (int i = 0; i < 8; i++) { arrThreshold[i] = inputDialog.arrTextBox[i].Text; } res = remoteobj.SetElectricThreshold(sSelectedTID, sSelectedMID, ref arrThreshold); WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 电表上下限:" + res); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } /* *方法名称:E_CallDataToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:电表招唤数据 */ private void E_CallDataToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "" || sSelectedMID == "") { MessageBox.Show("请选择当前仪表"); return; } List lstParams; Hashtable hsTable = null; E_CallDataForm inputDialog = new E_CallDataForm(); inputDialog.sMID = sSelectedMID; // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { //string sMID = sSelectedMID; // Read the contents of testDialog's TextBox. //this.txtResult.Text = testDialog.TextBox1.Text; lstParams = inputDialog.lstOBJID; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始招唤数据..."); string sComment = ""; try { bool res = remoteobj.GetData(sSelectedTID, sSelectedMID, lstParams, ref hsTable); sComment += sSelectedTID + " " + sSelectedMID + " 招唤数据 结果返回:" + res + "\r\n"; if (res == true) { //int key = 0; //foreach (DictionaryEntry de in hsTable) { //key = (int)de.Key; if (hsTable.ContainsKey(EMS_COMM_PARAMS.AU)) { sComment += "\t\t\t\ta相电压:" + hsTable[EMS_COMM_PARAMS.AU] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.BU)) { sComment += "\t\t\t\tb相电压:" + hsTable[EMS_COMM_PARAMS.BU] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.CU)) { sComment += "\t\t\t\tc相电压:" + hsTable[EMS_COMM_PARAMS.CU] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.AI)) { sComment += "\t\t\t\ta相电流:" + hsTable[EMS_COMM_PARAMS.AI] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.BI)) { sComment += "\t\t\t\tb相电流:" + hsTable[EMS_COMM_PARAMS.BI] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.CI)) { sComment += "\t\t\t\tc相电流:" + hsTable[EMS_COMM_PARAMS.CI] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.GLYS)) { sComment += "\t\t\t\t总功率因数:" + hsTable[EMS_COMM_PARAMS.GLYS] + "\r\n"; } if (hsTable.ContainsKey(EMS_COMM_PARAMS.ZXYGZ)) { sComment += "\t\t\t\t正向有功总电能:" + hsTable[EMS_COMM_PARAMS.ZXYGZ] + "\r\n"; } } } WriteTextBoxInfo(sComment); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } } /* *方法名称:GetTerminalInfoToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:获取终端信息 */ private void GetTerminalInfoToolStripMenuItem_Click(object sender, EventArgs e) { bool res = false; string sInfo = ""; if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始获取终端基本信息..."); res = remoteobj.GetInfo(sSelectedTID, ref sInfo); WriteTextBoxInfo(tbCurrentTerminal.Text + " 获取终端基本信息 结果:" + res + (res == true ? sInfo : "")); } /* *方法名称:GetAllTerminalInfoToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:object sender 事件发起者, EventArgs e 事件参数 *返回描述:void *功能描述:获取全部终端信息 */ private void GetAllTerminalInfoToolStripMenuItem_Click(object sender, EventArgs e) { if (tvTerminalList.Nodes.Count == 0) { return; } else if (tvTerminalList.Nodes[0].Nodes.Count == 0) { return; } TreeNodeCollection myNodeCollection = tvTerminalList.Nodes[0].Nodes; int myCount = myNodeCollection.Count; // Create an Object array. Object[] myArray = new Object[myCount]; // Copy the collection into an array. myNodeCollection.CopyTo(myArray,0); for(int i=0; i lstParams; Hashtable hsTable = null; T_CallDataForm inputDialog = new T_CallDataForm(); inputDialog.sMID = sSelectedMID; // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { lstParams = inputDialog.lstOBJID; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始招唤数据..."); string sComment = ""; try { bool res = remoteobj.GetData(sSelectedTID, sSelectedMID, lstParams, ref hsTable); sComment += sSelectedTID + " " + sSelectedMID + " 招唤数据 结果返回:" + res + "\r\n"; if (res == true) { //int key = 0; //foreach (DictionaryEntry de in hsTable) { //key = (int)de.Key; if (hsTable.ContainsKey(THS_COMM_PARAMS.TEMP)) { sComment += "\t\t\t\t温度:" + hsTable[THS_COMM_PARAMS.TEMP] + "\r\n"; } if (hsTable.ContainsKey(THS_COMM_PARAMS.HUMI)) { sComment += "\t\t\t\t相对湿度:" + hsTable[THS_COMM_PARAMS.HUMI] + "\r\n"; } } } WriteTextBoxInfo(sComment); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } } /* *方法名称:setAlarmThToolStripMenuItem_Click *创建人:韩荣伟 *创建时间:2010-10-30 *参数描述:void *返回描述:void *功能描述:设置温湿度告警参数 */ private void setAlarmThToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "" || sSelectedMID == "") { MessageBox.Show("请选择当前仪表"); return; } T_AlarmSettingForm inputDialog = new T_AlarmSettingForm(); bool res = false; string[] arr = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读取温湿度上下限..."); res = remoteobj.GetTempHumiThreshold(sSelectedTID, sSelectedMID, ref arr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读取温湿度上下限 结果:" + res); if (res == false || arr.Length != 8) { return; } for (int i = 0; i < 8; i++) { inputDialog.arrTextBox[i].Text = arr[i]; } // Show testDialog as a modal dialog and determine if DialogResult = OK. inputDialog.sMID = sSelectedMID; if (inputDialog.ShowDialog(this) == DialogResult.OK) { res = false; string[] arrThreshold = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 开始设置温湿度上下限..."); try { arrThreshold = new string[8]; for (int i = 0; i < 8; i++) { arrThreshold[i] = inputDialog.arrTextBox[i].Text; } res = remoteobj.SetTempHumiThreshold(sSelectedTID, sSelectedMID, ref arrThreshold); WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 温湿度上下限:" + res); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } private void 设置PTToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "" || sSelectedMID == "") { MessageBox.Show("请选择当前仪表"); return; } E_CTPTSettingForm inputDialog = new E_CTPTSettingForm(); bool res = false; string[] arr = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始读电表PT CT..."); res = remoteobj.GetElecPTCT(sSelectedTID, sSelectedMID, ref arr); WriteTextBoxInfo(tbCurrentTerminal.Text + " 读电表PT CT 结果:"+(res==true?"[PT]" + arr[0] + ",[CT]" + arr[1] : res.ToString())); if (res == false || arr.Length != 2) { return; } for (int i = 0; i < 2; i++) { inputDialog.arrTextBox[i].Text = arr[i]; } // Show testDialog as a modal dialog and determine if DialogResult = OK. inputDialog.sMID = sSelectedMID; if (inputDialog.ShowDialog(this) == DialogResult.OK) { res = false; string[] arrThreshold = null; WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 开始设置电表PT CT..."); try { arrThreshold = new string[2]; for (int i = 0; i < 2; i++) { arrThreshold[i] = inputDialog.arrTextBox[i].Text; } res = remoteobj.SetElecPTCT(sSelectedTID, sSelectedMID, ref arrThreshold); WriteTextBoxInfo(tbCurrentTerminal.Text + " " + sSelectedMID + " 电表PT CT:" + res); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } inputDialog.Dispose(); } private void 设置上传数据失败间隔ToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } int nInterval; HeartBeatIntervalForm inputDialog = new HeartBeatIntervalForm(); inputDialog.Text = "采集失败时间间隔"; inputDialog.label2.Text = "时间间隔"; // Show testDialog as a modal dialog and determine if DialogResult = OK. if (inputDialog.ShowDialog(this) == DialogResult.OK) { // Read the contents of testDialog's TextBox. //this.txtResult.Text = testDialog.TextBox1.Text; nInterval = inputDialog.nInterval * Common.MULTIPLE; WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始写采集数据失败间隔..."); try { WriteTextBoxInfo(tbCurrentTerminal.Text + " 写采集数据失败间隔 结果返回:" + remoteobj.SetSteamFailInterval(sSelectedTID, nInterval).ToString()); } catch (Exception e1) { Console.WriteLine("写采集数据失败间隔 exeption: " + e1.ToString()); } } inputDialog.Dispose(); } private void 校时ToolStripMenuItem_Click(object sender, EventArgs e) { if (tbCurrentTerminal.Text == "") { MessageBox.Show("请选择终端编号"); return; } WriteTextBoxInfo(tbCurrentTerminal.Text + " 开始校时..."); try { WriteTextBoxInfo(tbCurrentTerminal.Text + " 校时 结果返回:" + remoteobj.SetTime(sSelectedTID).ToString()); } catch (Exception e1) { Console.WriteLine("exeption: " + e1.ToString()); } } } /* *结构名称:struTerminal *创建人:韩荣伟 *创建时间:2010-10-30 *功能描述:终端信息结构 */ struct struTerminal { public string sTID; public Hashtable htMeters; public bool bOn; } } namespace CommService { /* *结构名称:EMS_COMM_PARAMS *创建人:韩荣伟 *创建时间:2010-10-30 *功能描述:电力对象编码 */ struct EMS_COMM_PARAMS { //电类型 public const uint AI = 0x8E21; public const uint BI = 0x8E22; public const uint CI = 0x8E23; public const uint AU = 0x8E11; public const uint BU = 0x8E12; public const uint CU = 0x8E13; public const uint GLYS = 0xB650; public const uint ZXYGZ = 0x9010; } /* *结构名称:THS_COMM_PARAMS *创建人:韩荣伟 *创建时间:2010-10-30 *功能描述:温湿度对象编码 */ struct THS_COMM_PARAMS { //温湿度类型 public const uint TEMP = 0xB400; public const uint HUMI = 0xB401; } }