基本信息
源码名称:C# OPC通信客户端(S7-1200 Control)
源码大小:0.16M
文件格式:.rar
开发语言:C#
更新时间:2018-02-10
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 3 元×
微信扫码支付:3 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
OPC客户端实现与服务器的通信,收发数据,同步异步通信,S7-1200 Control with OPC
OPC客户端实现与服务器的通信,收发数据,同步异步通信,S7-1200 Control with OPC
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using OPCAutomation;
namespace S7_1200_Control_with_OPC
{
public partial class Form1 : Form
{
//public enum MyOPCType : ushort
//{
// _byte = 0,
// _short = 1,
// _bool = 2,
// _string = 3,
// _string2 = 4,
//};
//OPCType mytype;
public struct aItem
{
public string NameForOPC;
//public MyOPCType opc_type;
public object Value;
public bool Writeable;
public string Descrip;
public string Timestamps;
public string Quality;
public int itmHandleClient;
public int itmHandleServer;
}
aItem[] Data_Array;
aItem[] Data_Array2;
public Form1()
{
InitializeComponent();
}
#region 私有变量
OPCServer MyServer;
OPCGroups MyGroups;
OPCGroup MyGroup;
OPCGroup MyGroup2;
OPCItems MyItems;
OPCItems MyItems2;
OPCItem[] MyItem;
OPCItem[] MyItem2;
#endregion
string strHostIP = "";
string strHostName = "";
private void Form1_Load(object sender, EventArgs e)
{
GetLocalServer();
Data_Array = new aItem[5];
Data_Array[0].NameForOPC = "A0000";
Data_Array[0].Value = 0;
//Data_Array[0].opc_type = MyOPCType._byte;
Data_Array[0].itmHandleClient = 0;
Data_Array[0].Writeable = false;
Data_Array[1].NameForOPC = "A0001";
Data_Array[1].Value = 0;
//Data_Array[1].opc_type = MyOPCType._short;
Data_Array[1].itmHandleClient = 1;
Data_Array[1].Writeable = false;
Data_Array[2].NameForOPC = "A0002";
Data_Array[2].Value = false;
//Data_Array[2].opc_type = MyOPCType._bool;
Data_Array[2].itmHandleClient = 2;
Data_Array[2].Writeable = false;
Data_Array[3].NameForOPC = "B001";
Data_Array[3].Value = "";
//Data_Array[3].opc_type = MyOPCType._string;
Data_Array[3].itmHandleClient = 3;
Data_Array[3].Writeable = false;
Data_Array[4].NameForOPC = "B002";
Data_Array[4].Value = "";
//Data_Array[4].opc_type = MyOPCType._string2;
Data_Array[4].itmHandleClient = 4;
Data_Array[4].Writeable = false;
Data_Array2 = new aItem[4];
Data_Array2[0].NameForOPC = "B001";
Data_Array2[0].Value = "";
//Data_Array2[0].opc_type = MyOPCType._string;
Data_Array2[0].itmHandleClient = 3;
Data_Array2[0].Writeable = false;
Data_Array2[1].NameForOPC = "B002";
Data_Array2[1].Value = "";
//Data_Array2[1].opc_type = MyOPCType._string;
Data_Array2[1].itmHandleClient = 0;
Data_Array2[1].Writeable = false;
Data_Array2[2].NameForOPC = "W01";
Data_Array2[2].Value = "";
//Data_Array2[2].opc_type = MyOPCType._string;
Data_Array2[2].itmHandleClient = 1;
Data_Array2[2].Writeable = true;
Data_Array2[3].NameForOPC = "W02";
Data_Array2[3].Value = "";
//Data_Array2[3].opc_type = MyOPCType._string;
Data_Array2[3].itmHandleClient = 2;
Data_Array2[3].Writeable = true;
}
private void GetLocalServer()
{
strHostName = System.Net.Dns.GetHostName();
System.Net.IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName);
for (int i = 0; i < ipEntry.AddressList.Length; i )
{
if (ipEntry.AddressList[i].AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
strHostIP = ipEntry.AddressList[i].ToString();
break;
}
}
try
{
MyServer = new OPCServer();
object serverList = MyServer.GetOPCServers(strHostName);
foreach (string alist in (Array)serverList)
{
comboBox_ServerNames.Items.Add(alist);
}
if (comboBox_ServerNames.Items.Count >= 1)
{
comboBox_ServerNames.SelectedIndex = 0;
}
textBox_IP.Text = strHostIP;
}
catch (Exception err)
{
throw new Exception("GetLoaclServer :" err.Message);
}
}
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
//MyServer.Connect(comboBox_ServerNames.SelectedItem.ToString(), strHostIP);
MyServer.Connect(comboBox_ServerNames.SelectedItem.ToString(), ""); //连接本机,后面的IP就不需要了
if (MyServer.ServerState == (int)OPCServerState.OPCRunning) //判断是否连接上了
{
CreateGroup();
}
else
{
throw new Exception("ServerState: " MyServer.ServerState);
}
MyServer.ServerShutDown = ServerShutDown;//服务器断开事件,没有发现他在哪里用的。
}
catch (Exception err)
{
MessageBox.Show("ConnectServer:" err.Message);
}
}
private bool CreateGroup()
{
try
{
MyGroups = MyServer.OPCGroups;
MyGroup = MyServer.OPCGroups.Add("Group1");
MyGroup2 = MyServer.OPCGroups.Add("Group2");
OPCGroup Mygroup3 = MyGroups.Add("Test3"); //待删除的组
//以下设置属性
{
MyGroups.DefaultGroupIsActive = true; //激活组
MyGroups.DefaultGroupDeadband = 0; //死区值,设为0时,服务器端该组内任何数据变化都通知组
MyGroups.DefaultGroupUpdateRate = 200; //默认组群的刷新频率为200ms
MyGroup.UpdateRate = 100; //刷新频率为1秒
MyGroup.IsSubscribed = true; //使用订阅功能,即可以异步,默认为false。
//如果没有订阅,则该组的DataChange回调事件不会发生
MyGroup2.UpdateRate = 100;
MyGroup2.IsSubscribed = true;
}
MyGroup.DataChange = new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);
MyGroup2.DataChange = new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange2);
MyGroup2.AsyncWriteComplete = new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);
MyGroup2.AsyncReadComplete = new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);
MyServer.OPCGroups.Remove("Test3");//移除组
//添加Item
AddGroupItems(); //设置组内的Items
}
catch (Exception err)
{
throw new Exception("CreateGroup:" err.Message);
}
return true;
}
private void AddGroupItems()
{
#region Important clue
//没有搞懂以下的意义。经测试,感觉不是这样的,如果有好几个string,clienthandle都是3的话,那订阅的
//DataChange事件在触发的时候clienthandle都是一样的,这样不知道如何分辨是哪一个Item的值了。所以我用的
//都是比3要大的值。
//MyItem2[0] = MyItems2.AddItem("BPJ.Db1.dbb96", 0);//byte
//MyItem2[1] = MyItems2.AddItem("BPJ.Db1.dbw10", 1);//short
//MyItem2[2] = MyItems2.AddItem("BPJ.Db16.dbx0", 2);//bool
//MyItem2[3] = MyItems2.AddItem("BPJ.Db11.S0", 3);//string
#endregion
MyItems = MyGroup.OPCItems;
MyItems2 = MyGroup2.OPCItems;
MyItem = new OPCItem[Data_Array.Length];
MyItem2 = new OPCItem[Data_Array2.Length];
for (int i = 0; i < Data_Array.Length; i )
{
//MyItem[i] = MyItems.AddItem(Data_Array[i].NameForOPC, (int)(Data_Array[i].opc_type));
MyItem[i] = MyItems.AddItem(Data_Array[i].NameForOPC, Data_Array[i].itmHandleClient);
}
for (int i = 0; i < Data_Array2.Length; i )
{
//MyItem2[i] = MyItems2.AddItem(Data_Array2[i].NameForOPC, (int)(Data_Array2[i].opc_type));
MyItem2[i] = MyItems2.AddItem(Data_Array2[i].NameForOPC, Data_Array2[i].itmHandleClient);
}
//移除组内Item的方法
//Array Errors;
//int[] temp = new int[] { 0, MyItem[3].ServerHandle };
//Array serverHandle = (Array)temp;
//MyItems.Remove(1, ref serverHandle, out Errors);
//MyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string
}
public void ServerShutDown(string Reason)//服务器先行断开
{
MyServer.OPCGroups.RemoveAll();
MyServer.Disconnect();
}
void GroupDataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
bool UpdateFlg = false;
int UpdateNum = -1;
for (int i = 1; i <= NumItems; i )
{
for (int j = 0; j < Data_Array.Length; j )
{
//if (Data_Array[j].itmHandleClient == Convert.ToInt32(ClientHandles.GetValue(i)))
if (Data_Array[j].itmHandleClient == Convert.ToInt32(ClientHandles.GetValue(i)))
{
Data_Array[j].Value = ItemValues.GetValue(i).ToString();
Data_Array[j].Quality = Qualities.GetValue(i).ToString();
Data_Array[j].Timestamps = TimeStamps.GetValue(i).ToString();
UpdateFlg = true;
UpdateNum = j;
break;
}
}
if (UpdateFlg == true)
{
switch (UpdateNum)
{
case 0:
this.textBoxA0.Text = Data_Array[0].Value.ToString();
break;
case 1:
this.textBoxA1.Text = Data_Array[1].Value.ToString();
break;
case 2:
this.textBoxA2.Text = Data_Array[2].Value.ToString();
break;
case 3:
this.textBoxB1.Text = Data_Array[3].Value.ToString();
break;
case 4:
this.textBoxB2.Text = Data_Array[4].Value.ToString();
break;
}
UpdateFlg = false;
}
}
}
void GroupDataChange2(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
for (int i = 1; i <= NumItems; i )
{
for (int j = 0; j < Data_Array2.Length; j )
{
if (Data_Array2[j].itmHandleClient == Convert.ToInt32(ClientHandles.GetValue(i)))
{
Data_Array2[j].Value = ItemValues.GetValue(i).ToString();
Data_Array2[j].Quality = Qualities.GetValue(i).ToString();
Data_Array2[j].Timestamps = TimeStamps.GetValue(i).ToString();
break;
}
}
}
}
void GroupAsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
{
labelSysWrite.Text = "异步写完成。NumItems:" NumItems.ToString() "\r\n时间:" DateTime.Now.ToString();
}
void GroupAsyncReadComplete(int TransactionID, int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors)
{
bool UpdateFlg = false;
int UpdateNum = -1;
for (int i = 1; i <= NumItems; i )
{
for (int j = 0; j < Data_Array2.Length; j )
{
if (Data_Array2[j].itmHandleClient == Convert.ToInt32(ClientHandles.GetValue(i)))
{
Data_Array2[j].Value = ItemValues.GetValue(i).ToString();
Data_Array2[j].Quality = Qualities.GetValue(i).ToString();
Data_Array2[j].Timestamps = TimeStamps.GetValue(i).ToString();
UpdateFlg = true;
UpdateNum = j;
break;
}
}
if (UpdateFlg)
{
switch (UpdateNum)
{
case 0:
this.textBoxB1_2.Text = ItemValues.GetValue(i).ToString();
break;
case 1:
this.textBoxB2_2.Text = ItemValues.GetValue(i).ToString();
break;
default:
break;
}
UpdateFlg = false;
}
}
labelSysRead.Text = "异步读完成。NumItems:" NumItems.ToString() "\r\n时间:" DateTime.Now.ToString();
}
private void btnSysRead_Click(object sender, EventArgs e)
{
//同步读
object ItemValues, Qualities, TimeStamps;
MyItem2[0].Read(1, out ItemValues, out Qualities, out TimeStamps);
this.textBoxB1_2.Text = Convert.ToString(ItemValues);
MyItem2[1].Read(1, out ItemValues, out Qualities, out TimeStamps);
this.textBoxB2_2.Text = Convert.ToString(ItemValues);
}
private void btnASysRead_Click(object sender, EventArgs e)
{
//异步读,会在事件中给出读的值
int[] tmp = new int[] { 0, MyItem2[0].ServerHandle, MyItem2[1].ServerHandle };
Array serverHandles = (Array)tmp;
Array Errors;
int cancelID;
MyGroup2.AsyncRead(2, ref serverHandles, out Errors, 1, out cancelID);
//经测试,也可以读出数据。有的时候会有些延迟
//this.textBoxB1_2.Text = MyItem2[0].Value;
//this.textBoxB2_2.Text = MyItem2[1].Value;
}
private void btnSysWrite_Click(object sender, EventArgs e)
{
//同步写
MyItem2[2].Write(textBoxW1_2.Text);
MyItem2[3].Write(textBoxW2_2.Text);
this.textBoxW1_2.Text = "";
this.textBoxW2_2.Text = "";
}
private void btnASysWrite_Click(object sender, EventArgs e)
{
//异步写
//异步写时,Array数组从下标1开始而非0!
int[] tmp = new int[] { 0, MyItem2[2].ServerHandle, MyItem2[3].ServerHandle };
Array serverHandles = (Array)tmp;
object[] valueTemp = new object[3] { "", textBoxW1_2.Text, textBoxW2_2.Text };
Array values = (Array)valueTemp;
Array Errors;
int cancelID;
MyGroup2.AsyncWrite(2, ref serverHandles, ref values, out Errors, 1, out cancelID);
this.textBoxW1_2.Text = "";
this.textBoxW2_2.Text = "";
}
private void btnSysRead2_Click(object sender, EventArgs e)
{
//同步读
object ItemValues, Qualities, TimeStamps;
MyItem2[2].Read(1, out ItemValues, out Qualities, out TimeStamps);
this.textBoxW1_2.Text = Convert.ToString(ItemValues);
MyItem2[3].Read(1, out ItemValues, out Qualities, out TimeStamps);
this.textBoxW2_2.Text = Convert.ToString(ItemValues);
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//善后,关闭之前的工作。
if (MyGroup != null)
{
MyGroup.DataChange = new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange);
}
if (MyGroup2 != null)
{
MyGroup2.DataChange = new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange2);
MyGroup2.AsyncWriteComplete = new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);
MyGroup2.AsyncReadComplete = new DIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);
}
if (MyServer != null)
{
//MyServer.OPCGroups.RemoveAll();
MyServer.Disconnect();
}
}
}
}