实例介绍
【实例简介】
OPC服务端源码
【实例截图】
【核心代码】
using System.Collections.Generic; using System; using System.Linq; using System.Drawing; using System.Diagnostics; using System.Data; using System.Xml.Linq; using Microsoft.VisualBasic; using System.Collections; using System.Management; using System.Windows.Forms; using Microsoft.VisualBasic.CompilerServices; namespace OPC_Server_Net { public partial class frmMain { public frmMain() { InitializeComponent(); if (defaultInstance == null) defaultInstance = this; } #region Default Instance private static frmMain defaultInstance; public static frmMain Default { get { if (defaultInstance == null) { defaultInstance = new frmMain(); defaultInstance.FormClosed = new FormClosedEventHandler(defaultInstance_FormClosed); } return defaultInstance; } set { defaultInstance = value; } } static void defaultInstance_FormClosed(object sender, FormClosedEventArgs e) { defaultInstance = null; } #endregion const int FrmHeight = 416; const int FrmWidth = 664; const string AppName = "EasyOPCSDK_ModbusDemo"; const string FrmName = "EasyOPCSDK_ModbusDemo"; string GUID; string ExePath; string VendorInfo; UInt64 RunSaveTime; short FrmClsCmd; short RestoreCnt; public void butToTray_Click(System.Object sender, System.EventArgs e) { this.Hide(); //下面的代码可以用来实现以文件d:dragon.ico 作为在托盘中显示的图标 //NotifyIcon1.Icon = New System.Drawing.Icon(Application.StartupPath & "\ICO1.ico") //下面直接采用窗体的图标,既保持一 致性,又不必担心磁盘上的图标文件被删除。 NotifyIcon1.Icon = this.Icon; NotifyIcon1.Visible = true; NotifyIcon1.Text = this.Text; } public void RestoreToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { //恢复显示窗体 timRestore.Enabled = true; } public void timRestore_Tick(System.Object sender, System.EventArgs e) { Frm_Load(); RestoreCnt ; if (RestoreCnt >= 2) { timRestore.Enabled = false; RestoreCnt = (short) 0; } } public void ExitToolStripMenuItem_Click(System.Object sender, System.EventArgs e) { //关闭窗体,退出程序 MsgBoxResult re; if (Module1.SysRun) { re = Interaction.MsgBox("OPC服务器运行中,是否停止服务后退出?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "关闭退出"); if (re == MsgBoxResult.No) { return; } if (re == MsgBoxResult.Yes) { StopServer(); } } FrmClsCmd = (short) 1; this.Close(); } public void Frm_Load() { this.Height = FrmHeight; this.Width = FrmWidth; this.Text = FrmName; this.CenterToScreen(); FrmClsCmd = (short) 0; this.WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; this.Show(); this.Activate(); // panData.Top = 0; panData.Left = 0; //panData.Height = 368 panData.Width = FrmWidth; panData.Visible = true; // panPara.Top = 0; panPara.Left = 0; //panPara.Height = 368 panPara.Width = FrmWidth; panPara.Visible = false; } public void frmMain_Load(System.Object sender, System.EventArgs e) { Process[] pProcess = Process.GetProcesses(); if ((Process.GetProcessesByName(AppName).Length - 1) > 0) { Interaction.MsgBox(AppName "软件已经运行!", MsgBoxStyle.Information, AppName); this.Dispose(); ProjectData.EndApp(); } Frm_Load(); // Module1.StrReadWrite[0] = "只读"; Module1.StrReadWrite[1] = "读写"; // short i = 0; Module1.StrMemory[0] = "DR"; Module1.StrMemory[1] = "HR"; cmbReadArea.Items.Clear(); cmbWriteArea.Items.Clear(); for (i = 0; i <= 1; i ) { if (Module1.StrMemory[i] != "") { cmbReadArea.Items.Add(Module1.StrMemory[i] " Area"); } if (Module1.StrMemory[i] != "") { cmbWriteArea.Items.Add(Module1.StrMemory[i] " Area"); } } cmbReadArea.Items.Add("其它..."); cmbWriteArea.Items.Add("其它..."); cmbReadArea.SelectedIndex = 0; cmbWriteArea.SelectedIndex = 0; Module1.StrDataType[0] = "16位整数有符号"; Module1.StrDataType[1] = "16位整数无符号"; Module1.StrDataType[2] = "32位整数有符号"; Module1.StrDataType[3] = "32位浮点有符号"; Module1.StrDataT[0] = "INT16"; Module1.StrDataT[1] = "UINT16"; Module1.StrDataT[2] = "DINT32"; Module1.StrDataT[3] = "REAL32"; frmAddItem.Default.cmbDataType.Items.Clear(); for (i = 0; i <= (Module1.StrDataType.Length - 1); i ) { frmAddItem.Default.cmbDataType.Items.Add(Module1.StrDataType[i]); } for (i = 0; i <= 7; i ) { Module1.MyPlc[i].WordLimit = (short) 200; } if (!System.IO.File.Exists(Application.StartupPath "\\ParaSet.psf")) { System.IO.File.Create(Application.StartupPath "\\ParaSet.psf"); } if (!System.IO.File.Exists(Application.StartupPath "\\TagConfig.tcf")) { System.IO.File.Create(Application.StartupPath "\\TagConfig.tcf"); } timLoad.Enabled = true; } public void timLoad_Tick(System.Object sender, System.EventArgs e) { int reint; timLoad.Enabled = false; tolRunTime.Text = ""; RestoreToolStripMenuItem.Text = "打开软件"; ExitToolStripMenuItem.Text = "关闭退出"; Para_Load(); Para_Disp(); Config_Load(); Fill_GrdData(); GUID = "{ABCDEF01-6712-4e71-9d46-89313ee25ec6}"; ExePath = Application.ExecutablePath "\\EasyOPCSDK_ModbusDemo.exe"; VendorInfo = "LFL"; reint = Module1.MyOPC.RegServer(GUID, AppName, ExePath, VendorInfo, "DEMO"); if (reint == 0) { Module1.SysReg = true; } else { Interaction.MsgBox("OPC服务器注册失败:" reint.ToString(), MsgBoxStyle.Exclamation, "服务器注册"); } StartServer(); Timer1.Enabled = true; } public void frmMain_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e) { int reint; MsgBoxResult re; if (FrmClsCmd == 0) { e.Cancel = true; butToTray_Click(null, null); return; } if (Module1.MyOPC.OpcClientCount != 0) { re = Interaction.MsgBox("OPC服务器有客户端连接未断开,是否关闭退出?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "关闭退出"); if (re == MsgBoxResult.No) { e.Cancel = true; butToTray_Click(null, null); return; } } reint = Module1.MyOPC.UnregServer(); Para_Save(); Module1.SysReg = false; } public void frmMain_FormClosed(object sender, System.Windows.Forms.FormClosedEventArgs e) { NotifyIcon1.Visible = false; ProjectData.EndApp(); } public void StartServer() { short i = 0; short j = 0; int reint; bool rebol = false; ushort tnum = 0; ushort tmod = 0; System.Threading.Thread[] mythr = null; if (Module1.SysRun) { return; } if (!Module1.SysReg) { Interaction.MsgBox("OPC服务器未注册!", MsgBoxStyle.Exclamation, "Start Comm."); return; } if (!Module1.CheckIP(Module1.LocalIP)) { Interaction.MsgBox("电脑的IP地址设置错误:" Module1.LocalIP, MsgBoxStyle.Exclamation, "Start Comm."); return; } // rebol = Tag_AddNew(); if (!rebol) { return; } // Para_Save(); Config_Save(); CalWordCount(); for (i = 0; i <= Module1.MaxPlcIndex; i ) { Module1.MyPlc[i].CommError = (short) 0; if (Module1.MyPlc[i].Protolcol == 0) { Module1.MyPlc[i].CommRdLen = 96; Module1.MyPlc[i].CommWtLen = 96; } else if (Module1.MyPlc[i].Protolcol == 1) { Module1.MyPlc[i].CommRdLen = 30; Module1.MyPlc[i].CommWtLen = 30; } // tnum = Convert.ToUInt16( Module1.MyPlc[i].ReadCount / Module1.MyPlc[i].CommRdLen); tmod = Convert.ToUInt16( Module1.MyPlc[i].ReadCount % Module1.MyPlc[i].CommRdLen); if (tnum == 0) { Module1.MyPlc[i].CommRdNum = 1; Module1.MyPlc[i].CommRdLen = Convert.ToUInt16( Module1.MyPlc[i].ReadCount); } else { if (tmod > 0) { Module1.MyPlc[i].CommRdNum = Convert.ToUInt16( tnum 1); } } Module1.MyPlc[i].PDR = new List<object>(); for (j = 0; j <= tnum * Module1.MyPlc[i].CommRdLen tmod - 1; j ) { Module1.MyPlc[i].PDR.Add(0); } tnum = Convert.ToUInt16( Module1.MyPlc[i].WriteCount / Module1.MyPlc[i].CommWtLen); tmod = Convert.ToUInt16( Module1.MyPlc[i].WriteCount % Module1.MyPlc[i].CommWtLen); if (tnum == 0) { Module1.MyPlc[i].CommWtNum = 1; Module1.MyPlc[i].CommWtLen =Convert.ToUInt16( Module1.MyPlc[i].WriteCount); } else { if (tmod > 0) { Module1.MyPlc[i].CommWtNum = Convert.ToUInt16( tnum 1); } } Module1.MyPlc[i].PDW = new List<object>(); for (j = 0; j <= tnum * Module1.MyPlc[i].CommWtLen tmod - 1; j ) { Module1.MyPlc[i].PDW.Add(0); } } if ((Module1.MaxPlcIndex >= 0) && ((Module1.MyPlc[0].ReadCount > 0) || (Module1.MyPlc[0].WriteCount > 0))) { mythr = new System.Threading.Thread[Module1.MaxPlcIndex 1]; Module1.SysRun = true; for (i = 0; i <= Module1.MaxPlcIndex; i ) { if (Module1.MyPlc[i].Protolcol == 0) { mythr[i] = new System.Threading.Thread(Module1.PlcComm); } else { mythr[i] = new System.Threading.Thread(Module1.DtuComm); } mythr[i].IsBackground = true; mythr[i].Start(i); } // reint = Module1.MyOPC.StartOpcServer(); Module1.MyOPC.OpcClientWriteValue = new EasyOPC_DA.Server.OpcClientWriteValueEventHandler(Module1.MyOPC_OpcClientWriteValue); if (Module1.NetServerRun != 0) { Module1.MyOPC.OpenNetServer(Module1.ServerIP, Convert.ToUInt32( Module1.ServerPort)); Module1.MyOPC.NetClientWriteValue = new EasyOPC_DA.Server.NetClientWriteValueEventHandler(Module1.MyOPC_NetClientWriteValue); } tolPlcCount.Text = Convert.ToString( Module1.MaxPlcIndex 1); tolTagCount.Text = System.Convert.ToString(Module1.MaxGrdIndex 1); Module1.timUpTag.Elapsed = new System.Timers.ElapsedEventHandler(Module1.timUpTag_Elapsed); Module1.timUpTag.Start(); Module1.StrStatus = "OPC启动成功."; } } public void CalWordCount() { UInt16 i = 0; ushort m = 0; for (i = 0; i <= (Module1.MyPlc.Length - 1); i ) { Module1.MyPlc[i].ReadCount = (short) (-1); Module1.MyPlc[i].WriteCount = (short) (-1); } for (i = 0; i <= Module1.MaxGrdIndex; i ) { m = Module1.MyTag[i].PlcIndex; if (Module1.MyTag[i].ReadWrite == 0) { if (Module1.MyTag[i].AddIndex > Module1.MyPlc[m].ReadCount) { Module1.MyPlc[m].ReadCount = Convert.ToInt16( Module1.MyTag[i].AddIndex); } } if (Module1.MyTag[i].ReadWrite == 1) { if (Module1.MyTag[i].AddIndex > Module1.MyPlc[m].WriteCount) { Module1.MyPlc[m].WriteCount = Convert.ToInt16( Module1.MyTag[i].AddIndex); } } } for (i = 0; i <= (Module1.MyPlc.Length - 1); i ) { if (Module1.MyPlc[i].ReadCount >= 0) { Module1.MyPlc[i].ReadCount = (short) 2; } else { Module1.MyPlc[i].ReadCount = (short) 0; } if (Module1.MyPlc[i].WriteCount >= 0) { Module1.MyPlc[i].WriteCount = (short) 2; } else { Module1.MyPlc[i].WriteCount = (short) 0; } } } public void butRunOpera_Click(System.Object sender, System.EventArgs e) { if (Module1.SysRun) { if (Interaction.MsgBox("确定停止OPC服务器?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "停止服务") != MsgBoxResult.Yes) { return; } StopServer(); } else { StartServer(); } } public void StopServer() { short i = 0; int reint; Module1.MyOPC.CloseNetServer(); Module1.SysRun = false; Module1.timUpTag.Stop(); Module1.IniWtVal = false; grpPara.Enabled = true; for (i = 0; i <= Module1.MaxPlcIndex; i ) { Module1.MyPlc[i].CommError = (short) 0; Module1.MyPlc[i].PlcLink = false; Module1.MyPlc[i].PDR.Clear(); Module1.MyPlc[i].PDW.Clear(); } reint = Module1.MyOPC.StopOpcServer(); System.Threading.Thread.Sleep(200); reint = Module1.MyOPC.TagClear(); Module1.StrStatus = "停止......"; } private bool Tag_AddNew() { short i = 0; bool wen = false; if (Module1.MaxGrdIndex <= 0) { return false; } if (Module1.MaxGrdIndex >= 400) { return false; } // for (i = 0; i <= Module1.MaxGrdIndex; i ) { Module1.MyTag[i].Name = Strings.Trim(System.Convert.ToString(grdData.Rows[i].Cells[1].Value)); if (Module1.MyTag[i].ReadWrite > 0) { wen = true; } else { wen = false; } if (Module1.MyTag[i].DataType == 3) { Module1.MyTag[i].Value = 0.0; } else { Module1.MyTag[i].Value = 0; } Module1.MyOPC.TagAddNew(Module1.MyTag[i].Name, Module1.MyTag[i].Value, wen, ref Module1.MyTag[i].Handle); } Module1.MyTag[Module1.MaxGrdIndex 1].Name = "ServerStatus"; Module1.MyTag[Module1.MaxGrdIndex 1].Value = 0; Module1.MyOPC.TagAddNew(System.Convert.ToString(Module1.MyTag[Module1.MaxGrdIndex 1].Name), Module1.MyTag[Module1.MaxGrdIndex 1].Value, false, ref Module1.MyTag[Module1.MaxGrdIndex 1].Handle); return true; } private bool Update_GrdData() { if (!Module1.SysRun) { return false; } short row = (short) (grdData.Rows.Count - 1); for (var i = 0; i <= row; i ) { grdData.Rows[i].Cells[5].Value = Conversion.Val(Module1.MyTag[(int) i].Value); } return true; } public void butParaSave_Click(System.Object sender, System.EventArgs e) { MsgBoxResult re; if (Module1.SysRun) { re = Interaction.MsgBox("OPC服务器运行中,是否停止运行保存参数?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "参数保存"); if (re == MsgBoxResult.No) { return; } if (re == MsgBoxResult.Yes) { StopServer(); } } Para_Save(); } public bool Para_Save() { string setpara = ""; short i = 0; short j = 0; short m = 0; // Module1.LocalIP = txtLocalIP.Text.Trim(); Module1.LocalPort = (int) (Conversion.Val(txtLocalPort.Text)); Module1.ServerIP = txtServerIP.Text.Trim(); Module1.ServerPort = (int) (Conversion.Val(txtServerPort.Text)); if (chkNetOption.Checked) { Module1.NetServerRun = (short) 1; } else { Module1.NetServerRun = (short) 0; } Module1.MaxPlcIndex =Convert.ToUInt16( cmbMaxPlcIndex.SelectedIndex); // m = (short) cmbCurrPlc.SelectedIndex; Module1.MyPlc[m].Protolcol = Convert.ToUInt16( cmbProtocol.SelectedIndex); Module1.MyPlc[m].IpAddress = txtRemoteIP.Text.Trim(); Module1.MyPlc[m].NetPort = Convert.ToUInt16( Conversion.Val(txtRemotePort.Text)); Module1.MyPlc[m].Station = Convert.ToUInt16( Conversion.Val(txtStation.Text)); Module1.MyPlc[m].ReadArea = Convert.ToUInt16( cmbReadArea.SelectedIndex); Module1.MyPlc[m].ReadAdd =Convert.ToUInt16( Conversion.Val(txtReadAdd.Text)); Module1.MyPlc[m].WriteArea = Convert.ToUInt16( cmbWriteArea.SelectedIndex); Module1.MyPlc[m].WriteAdd = Convert.ToUInt16( Conversion.Val(txtWriteAdd.Text)); Module1.MyPlc[m].ReadExByte =Convert.ToUInt16( cmbRdExByte.SelectedIndex); Module1.MyPlc[m].ReadExWord = Convert.ToUInt16( cmbRdExWord.SelectedIndex); Module1.MyPlc[m].WriteExByte = Convert.ToUInt16( cmbWtExByte.SelectedIndex); Module1.MyPlc[m].WriteExWord = Convert.ToUInt16( cmbWtExWord.SelectedIndex); // //ip address check for (i = 0; i <= (Module1.MyPlc.Length - 1); i ) { if (i > Module1.MaxPlcIndex) { break; } for (j = 0; j <= (Module1.MyPlc.Length - 1); j ) { if (j > Module1.MaxPlcIndex) { break; } if (j == i) { continue; } if ((Module1.MyPlc[i].IpAddress == Module1.MyPlc[j].IpAddress) && (Strings.Trim(Module1.MyPlc[i].IpAddress) != "")) { Interaction.MsgBox("PLC" System.Convert.ToString(i 1) "与PLC" System.Convert.ToString(j 1) "的IP地址重复!", MsgBoxStyle.Exclamation, "参数保存"); return false; } } } setpara = setpara "LOCAL" "," Module1.LocalIP "," System.Convert.ToString(Module1.LocalPort) "," System.Convert.ToString(Module1.NetServerRun) "," System.Convert.ToString(Module1.MaxPlcIndex) "," Module1.ServerIP "," System.Convert.ToString(Module1.ServerPort) "," "\r\n"; for (i = 0; i <= Module1.MaxPlcIndex; i ) { setpara = setpara "PLC" System.Convert.ToString(i) "," System.Convert.ToString(Module1.MyPlc[i].Protolcol) "," Module1.MyPlc[i].IpAddress "," System.Convert.ToString(Module1.MyPlc[i].NetPort) "," System.Convert.ToString(Module1.MyPlc[m].Station) "," System.Convert.ToString(Module1.MyPlc[i].ReadArea) "," System.Convert.ToString(Module1.MyPlc[i].ReadAdd) "," System.Convert.ToString(Module1.MyPlc[i].WriteArea) "," System.Convert.ToString(Module1.MyPlc[i].WriteAdd) "," System.Convert.ToString(Module1.MyPlc[i].ReadExByte) "," System.Convert.ToString(Module1.MyPlc[i].ReadExWord) "," System.Convert.ToString(Module1.MyPlc[i].WriteExByte) "," System.Convert.ToString(Module1.MyPlc[i].WriteExWord) "," "\r\n"; } //save set. para System.IO.File.WriteAllText(Application.StartupPath "\\ParaSet.psf", setpara); Fill_GrdData(); Module1.StrStatus = "参数保存成功."; return true; } public bool Para_Load() { short i = 0; short n = 0; short row = 0; string[] lines = null; string[] temp = null; if (!System.IO.File.Exists(Application.StartupPath "\\ParaSet.psf")) { System.IO.File.Create(Application.StartupPath "\\ParaSet.psf"); return false; } lines = new string[32768]; System.IO.StreamReader sr = new System.IO.StreamReader(Application.StartupPath "\\ParaSet.psf", System.Text.ASCIIEncoding.Default); while (sr.Peek() > 0) { lines[i] = sr.ReadLine(); i ; } sr.Close(); sr.Dispose(); row = (short) (i - 1); for (i = 0; i <= row; i ) { temp = (lines[i]).Split(','); if (temp[0].Trim() == "LOCAL") { Module1.LocalIP = temp[1].Trim(); Module1.LocalPort = (int) (Conversion.Val(temp[2])); Module1.NetServerRun = (short) (Conversion.Val(temp[3])); Module1.MaxPlcIndex = Convert.ToUInt16( Conversion.Val(temp[4])); Module1.ServerIP = temp[5].Trim(); Module1.ServerPort = (int) (Conversion.Val(temp[6])); } if (temp[0].Trim().Substring(0, 3) == "PLC") { n = (short) (Conversion.Val(temp[0].Trim().Substring(3, 1))); Module1.MyPlc[n].Protolcol =Convert.ToUInt16( Conversion.Val(temp[1])); Module1.MyPlc[n].IpAddress = temp[2].Trim(); Module1.MyPlc[n].NetPort = Convert.ToUInt16( Conversion.Val(temp[3])); Module1.MyPlc[n].Station = Convert.ToUInt16( Conversion.Val(temp[4])); Module1.MyPlc[n].ReadArea = Convert.ToUInt16( Conversion.Val(temp[5])); Module1.MyPlc[n].ReadAdd =Convert.ToUInt16( Conversion.Val(temp[6])); Module1.MyPlc[n].WriteArea =Convert.ToUInt16( Conversion.Val(temp[7])); Module1.MyPlc[n].WriteAdd = Convert.ToUInt16( Conversion.Val(temp[8])); Module1.MyPlc[n].ReadExByte = Convert.ToUInt16( Conversion.Val(temp[9])); Module1.MyPlc[n].ReadExWord = Convert.ToUInt16( Conversion.Val(temp[10])); Module1.MyPlc[n].WriteExByte = Convert.ToUInt16( Conversion.Val(temp[11])); Module1.MyPlc[n].WriteExWord = Convert.ToUInt16( Conversion.Val(temp[12])); } } Module1.StrStatus = "参数加载成功."; return true; } public bool Para_Disp() { //On Error Resume Next VBConversions Warning: On Error Resume Next not supported in C# short m = 0; short i = 0; txtLocalIP.Text = Module1.LocalIP.ToString(); txtLocalPort.Text = Module1.LocalPort.ToString(); txtServerIP.Text = Module1.ServerIP; txtServerPort.Text = Module1.ServerPort.ToString(); if (Module1.NetServerRun != 0) { chkNetOption.Checked = true; } else { chkNetOption.Checked = false; } cmbMaxPlcIndex.SelectedIndex = Module1.MaxPlcIndex; cmbCurrPlc.Items.Clear(); for (i = 0; i <= cmbMaxPlcIndex.SelectedIndex; i ) { cmbCurrPlc.Items.Add("PLC" System.Convert.ToString(i 1)); } cmbCurrPlc.SelectedIndex = 0; // m = (short) cmbCurrPlc.SelectedIndex; UpPara(Convert.ToUInt16( m)); // return true; } public void UpPara(UInt16 plcnum) { ushort m = 0; m = plcnum; cmbProtocol.SelectedIndex = Module1.MyPlc[m].Protolcol; txtRemoteIP.Text = Module1.MyPlc[m].IpAddress; txtRemotePort.Text = Module1.MyPlc[m].NetPort.ToString(); txtStation.Text = Module1.MyPlc[m].Station.ToString(); cmbReadArea.SelectedIndex = Module1.MyPlc[m].ReadArea; txtReadAdd.Text = Module1.MyPlc[m].ReadAdd.ToString(); cmbWriteArea.SelectedIndex = Module1.MyPlc[m].WriteArea; txtWriteAdd.Text = Module1.MyPlc[m].WriteAdd.ToString(); cmbRdExByte.SelectedIndex = Module1.MyPlc[m].ReadExByte; cmbRdExWord.SelectedIndex = Module1.MyPlc[m].ReadExWord; cmbWtExByte.SelectedIndex = Module1.MyPlc[m].WriteExByte; cmbWtExWord.SelectedIndex = Module1.MyPlc[m].WriteExWord; } public void Timer1_Tick(System.Object sender, System.EventArgs e) { UInt64 ttime = 0; UInt64 tv1 = 0; short m = 0; short tsht = (short) 9999; string tstr = ""; UInt16 i = 0; Update_GrdData(); tolStrStatus.Text = Module1.StrStatus; tolOpcCount.Text = Module1.MyOPC.OpcClientCount.ToString(); tolNetCount.Text = Module1.MyOPC.NetClientCount.ToString(); m = (short) cmbCurrPlc.SelectedIndex; // labRdCnt.Text = Convert.ToString( Module1.MyPlc[m].ReadCount); labWtCnt.Text = Convert.ToString( Module1.MyPlc[m].WriteCount); if (Module1.SysRun) { butRunOpera.Text = "停止运行"; labPeriod.Text = System.Convert.ToString(Module1.MyPlc[m].PeriodTime); for (i = 0; i <= Module1.MaxPlcIndex; i ) { if (Module1.MyPlc[i].CommError < tsht) { tsht = Module1.MyPlc[i].CommError; } } RunSaveTime ; ttime = RunSaveTime / 10; tstr = ""; if (ttime > 0) { tv1 = ttime / 86400; if (tv1 > 0) { tstr = tstr System.Convert.ToString(tv1) "d"; ttime -= tv1 * 86400; } tv1 = ttime / 3600; if (tv1 > 0) { tstr = tstr System.Convert.ToString(tv1) "h"; ttime -= tv1 * 3600; } tv1 = ttime / 60; if (tv1 > 0) { tstr = tstr System.Convert.ToString(tv1) "m"; ttime -= tv1 * 60; } tv1 = ttime / 1; if (tv1 > 0) { tstr = tstr System.Convert.ToString(tv1) "s"; } tolRunTime.Text = tstr; } butAddItem.Enabled = false; butDelItem.Enabled = false; } else { butRunOpera.Text = "系统启动"; butAddItem.Enabled = true; butDelItem.Enabled = true; Module1.StrStatus = "停止."; } } public void butPageEx_Click(System.Object sender, System.EventArgs e) { panPara.Visible = true; panData.Visible = false; } public void butDataDisp_Click(System.Object sender, System.EventArgs e) { panPara.Visible = false; panData.Visible = true; } public void butAddItem_Click(System.Object sender, System.EventArgs e) { if (cmbReadArea.SelectedIndex < 0) { Interaction.MsgBox("PLC内存选择错误!", MsgBoxStyle.Exclamation, "添加标签"); return; } if (Conversion.Val(txtReadAdd.Text) < 0) { Interaction.MsgBox("读起始地址设置错误", MsgBoxStyle.Exclamation, "添加标签"); return; } frmAddItem.Default.ShowDialog(); } public void butDelItem_Click(System.Object sender, System.EventArgs e) { UInt16 i = 0; short ind = (short) grdData.CurrentCell.RowIndex; if (ind < 0) { return; } if (Module1.MaxGrdIndex < 0) { return; } MsgBoxResult re = Interaction.MsgBox("确认删除" Module1.MyTag[ind].Name "?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "删除标签"); if (re != MsgBoxResult.Yes) { return; } for (i = Convert.ToUInt16( ind); i <= Module1.MaxGrdIndex; i ) { Module1.MyTag[ind].Handle = 0; Module1.MyTag[i] = Module1.MyTag[i 1]; } Module1.MaxGrdIndex--; Fill_GrdData(); Config_Save(); } public bool Fill_GrdData() { ushort m = 0; grdData.Rows.Clear(); if (Module1.MaxGrdIndex < 0) { return false; } for (var i = 0; i <= Module1.MaxGrdIndex; i ) { m = Module1.MyTag[(int) i].PlcIndex; grdData.Rows.Add(1); grdData.Rows[i].Cells[0].Value = i 1; grdData.Rows[i].Cells[1].Value = Module1.MyTag[(int) i].Name; grdData.Rows[i].Cells[2].Value = "PLC" (m 1).ToString(); if (Module1.MyTag[(int) i].ReadWrite == 0) { grdData.Rows[i].Cells[3].Value = Module1.StrMemory[Module1.MyPlc[m].ReadArea] System.Convert.ToString(Module1.MyPlc[m].ReadAdd Module1.MyTag[(int) i].AddIndex); } else { grdData.Rows[i].Cells[3].Value = Module1.StrMemory[Module1.MyPlc[m].WriteArea] System.Convert.ToString(Module1.MyPlc[m].WriteAdd Module1.MyTag[(int) i].AddIndex); } grdData.Rows[i].Cells[4].Value = Module1.StrDataT[Module1.MyTag[(int) i].DataType]; grdData.Rows[i].Cells[6].Value = Module1.StrReadWrite[Module1.MyTag[(int) i].ReadWrite]; grdData.Rows[i].Cells[5].Value = ""; grdData.Rows[i].Cells[5].ReadOnly = true; // if (i % 2 != 0) { grdData.Rows[i].DefaultCellStyle.BackColor = Color.WhiteSmoke; // 浅灰 } else { grdData.Rows[i].DefaultCellStyle.BackColor = Color.FromArgb(200, 255, 255); // 兰色 } } return true; } public bool Config_Save() { string tstr = ""; UInt16 i = 0; if (Module1.MaxGrdIndex > 0) { tstr = "CONFIG" "," System.Convert.ToString(Module1.MaxGrdIndex) "," "-" "," "-" "," System.Convert.ToString(DateTime.Now) "\r\n"; for (i = 0; i <= grdData.Rows.Count - 1; i ) { tstr = tstr (i 1) ","; tstr = tstr Module1.MyTag[i].Name ","; tstr = tstr System.Convert.ToString(Module1.MyTag[i].PlcIndex) ","; tstr = tstr System.Convert.ToString(Module1.MyTag[i].AddIndex) ","; tstr = tstr System.Convert.ToString(Module1.MyTag[i].DataType) ","; tstr = tstr System.Convert.ToString(Module1.MyTag[i].ReadWrite) "\r\n"; } } System.IO.File.WriteAllText(Application.StartupPath "\\TagConfig.tcf", tstr); return true; } public bool Config_Load() { short i = 0; short row = 0; short cnt = 0; string[] lines = null; string[] temp = null; if (!System.IO.File.Exists(Application.StartupPath "\\TagConfig.tcf")) { Module1.MaxGrdIndex = (short) (cnt - 1); return false; } lines = new string[32768]; System.IO.StreamReader sr = new System.IO.StreamReader(Application.StartupPath "\\TagConfig.tcf", System.Text.ASCIIEncoding.Default); while (sr.Peek() > 0) { lines[i] = sr.ReadLine(); i ; } sr.Close(); sr.Dispose(); row = (short) (i - 1); for (i = 0; i <= row; i ) { temp = (lines[i]).Split(','); if ((temp.Length - 1) >= 4) { if (temp[0].Trim().ToUpper() == "CONFIG") { Module1.MaxGrdIndex = (short) (Conversion.Val(temp[1])); } else { if (Module1.MyOPC.IsTextGB(temp[1].Trim())) { Interaction.MsgBox("标签名称暂不支持中文字符!", MsgBoxStyle.Exclamation, "添加标签"); continue; } Module1.MyTag[cnt].Name = temp[1].Trim(); Module1.MyTag[cnt].PlcIndex = Convert.ToUInt16( Conversion.Val(temp[2])); Module1.MyTag[cnt].AddIndex =Convert.ToUInt16( Conversion.Val(temp[3])); Module1.MyTag[cnt].DataType = Convert.ToUInt16( Conversion.Val(temp[4])); Module1.MyTag[cnt].ReadWrite =Convert.ToUInt16( Conversion.Val(temp[5])); cnt ; } } } Module1.MaxGrdIndex = (short) (cnt - 1); return true; } public void cmbMaxPlcIndex_SelectedIndexChanged(System.Object sender, System.EventArgs e) { if (cmbMaxPlcIndex.SelectedIndex >= 8) { cmbMaxPlcIndex.SelectedIndex = 7; frmAbort.Default.ShowDialog(); return; } short i = 0; cmbCurrPlc.Items.Clear(); for (i = 0; i <= cmbMaxPlcIndex.SelectedIndex; i ) { cmbCurrPlc.Items.Add("PLC" System.Convert.ToString(i 1)); } cmbCurrPlc.SelectedIndex = 0; } public void cmbCurrPlc_SelectedIndexChanged(System.Object sender, System.EventArgs e) { short m = 0; m = (short) cmbCurrPlc.SelectedIndex; UpPara(Convert.ToUInt16( m)); } public void cmbDataArea_SelectedIndexChanged(System.Object sender, System.EventArgs e) { if (cmbReadArea.SelectedIndex >= 2) { cmbReadArea.SelectedIndex = 1; frmAbort.Default.ShowDialog(); return; } MsgBoxResult re; if (Module1.MaxGrdIndex > 0) { re = Interaction.MsgBox("已配置有TAG,变更数据区域后其它区域的TAG不能正常通讯!" "\r\n" "是否删除该PLC之前配置的TAG?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "数据区域"); if (re == MsgBoxResult.Yes) { } } } public void cmbWriteArea_SelectedIndexChanged(System.Object sender, System.EventArgs e) { if (cmbWriteArea.SelectedIndex >= 2) { cmbWriteArea.SelectedIndex = 1; frmAbort.Default.ShowDialog(); return; } MsgBoxResult re; if (Module1.MaxGrdIndex > 0) { re = Interaction.MsgBox("已配置有TAG,变更数据区域后其它区域的TAG不能正常通讯!" "\r\n" "是否删除该PLC之前配置的TAG?", (int) MsgBoxStyle.Question MsgBoxStyle.YesNo, "数据区域"); if (re == MsgBoxResult.Yes) { } } } public void butManual_Click(System.Object sender, System.EventArgs e) { frmAbort.Default.Show(); } public void butMainHelp_Click(System.Object sender, System.EventArgs e) { frmAbort.Default.Show(); } public void butTagEdit_Click(System.Object sender, System.EventArgs e) { if (grdData.Rows.Count < 1) { return; } short num = (short) grdData.CurrentRow.Index; if ((num < 0) || (num > Module1.MaxGrdIndex)) { return; } Module1.EditTagIndex = num; frmTagEdit.Default.Show(); } public void grdData_CellClick(System.Object sender, System.Windows.Forms.DataGridViewCellEventArgs e) { if (grdData.RowCount < 1) { return; } short num = (short) grdData.CurrentRow.Index; if ((num < 0) || (num > Module1.MaxGrdIndex)) { return; } if (Module1.EditShow) { Module1.EditTagIndex = num; frmTagEdit.Default.EditUp(Module1.EditTagIndex); } } public void grdData_CellDoubleClick(System.Object sender, System.Windows.Forms.DataGridViewCellEventArgs e) { if (grdData.RowCount < 1) { return; } short num = (short) grdData.CurrentRow.Index; if ((num < 0) || (num > Module1.MaxGrdIndex)) { return; } if (!Module1.EditShow) { butTagEdit_Click(null, null); } } public void cmbProtolcol_SelectedIndexChanged(System.Object sender, System.EventArgs e) { if (cmbProtocol.SelectedIndex >= 2) { cmbProtocol.SelectedIndex = 1; frmAbort.Default.ShowDialog(); return; } if (cmbProtocol.SelectedIndex == 0) { txtStation.Enabled = false; } else { txtStation.Enabled = true; } } } }
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)