实例介绍
【实例简介】
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) 盖楼(回复)