C#通过OPC连接PLC读写功能案例

更新时间:2024-04-09 23:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C#通过OPC连接PLC读写功能案例

最简单、最有效的PLC连接程序,里面包含了各种类型的读写功能,绝对是拷贝过去,直接把地址替换就可以使用。 功能简介:

本程序主要是针对PLC发送请求信号,收到信号执行调用,例如:由PLC发送请求信号1,程序自动去调用,当调用结束,信号恢复为0,直到下一次变为1,再次进行调用;

1、手工下载一个Interop.OPCAutomation.dll 2、手工创建一个类PublicOPC_PLC 3、直接调用即可, 调用方法:

PublicOPC_PLC Plc = newPublicOPC_PLC(); Plc.InitConnect();

Plc.CH160CreateGroup(\地址\);

//此处的PLC地址必须为PLC中DB块对应的BOOL型的地址例如:C1.[S7].DB35.DBX544.0

using System;

usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingOPCAutomation; using System.Net;

usingSystem.Threading;

namespaceOPCService {

publicclassPublicOPC_PLC {

#region私有变量 ///

///OPCServer Object ///

publicstaticOPCServerMyServer; ///

///OPCGroups Object ///

publicstaticOPCGroupsMyGroups; ///

///OPCGroup Object ///

publicstaticOPCGroupMyGroupMA; publicstaticOPCGroup MyGroupMA2; ///

///OPCItems Object ///

OPCItemsMyItemsMA; ///

///OPCItem Object ///

OPCItem[] MyItemMA; ///

///主机IP ///

publicstaticstringstrHostIP = \; ///

///主机名称 ///

publicstaticstringstrHostName = \; ///

///连接状态 ///

publicstaticboolopc_connected = false; ///

///客户端句柄 ///

intitmHandleClient = 0; ///

///服务端句柄 ///

intitmHandleServer = 0; publicOPCGroupGroupMA {

get { returnMyGroupMA; } }

#endregion

///

///初始化连接对应的状态,包括连接服务器,需要读取的初始值 ///

publicvoidInitConnect() {

//初始化OPC服务配置 GetLocalServer();

ConnectRemoteServer();//连接OPC服务器 MyGroups = MyServer.OPCGroups;

}

//枚举本地OPC服务器

publicvoidGetLocalServer() {

//获取本地计算机IP,计算机名称 strHostName = Dns.GetHostName(); //或者通过局域网内计算机名称 //获取本地计算机IP,计算机名称

IPHostEntryIPHost = Dns.Resolve(Environment.MachineName);

if (IPHost.AddressList.Length> 0) {

IPHostEntryipHostEntry = Dns.GetHostByAddress(IPHost.AddressList[0].ToString()); strHostName = ipHostEntry.HostName.ToString(); }

//获取本地计算机上的OPCServerName try

{

MyServer = newOPCServer();

objectserverList = MyServer.GetOPCServers(strHostName);

foreach (string server in (Array)serverList) {

//cmbServerName.Items.Add(turn);

Console.WriteLine(\本地OPC服务器:{0}\, server); } }

catch (Exception err) {

Console.WriteLine(\枚举本地OPC服务器出错:{0}\, err.Message); } }

//连接OPC服务器

///

/// publicboolConnectRemoteServer() { try

{

stringremoteServerIP = \, remoteServerName = \;

MyServer.Connect(remoteServerName, remoteServerIP);//连接本地服务器:服务器名+主机名或IP

if (MyServer.ServerState == (int)OPCServerState.OPCRunning) {

////MessageBox.Show(\已连接到:{0}\ //WriteLog_Station(\网络连接成功\ }

else

{

//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档 ////MessageBox.Show(\状态:{0}\ //WriteLog_Station(\网络连接失败\ }

MyServer.ServerShutDown += ServerShutDown;//服务器断开事件 }

catch (Exception err) {

//MessageBox.Show(\连接远程服务器出现错误:{0}\ returnfalse; } returntrue; }

publicvoidServerShutDown(string Reason)//服务器先行断开 {

//WriteLog_Station(\服务器已经先行断开!\

MyServer.Disconnect(); }

publicvoidRemoveGroup(string Name) {

MyServer.OPCGroups.Remove(Name); }

voidGroupAsyncWriteComplete(intTransactionID, intNumItems, refArrayClientHandles, refArray Errors) {

Console.WriteLine(\); /*for (inti = 1; i<= 1; i++) {

Console.WriteLine(\:{0} ClientHandles:{1} Error:{2}\ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString()); }*/ }

voidGroupAsyncReadComplete(intTransactionID, intNumItems, refSystem.ArrayClientHandles, refSystem.ArrayItemValues, refSystem.Array Qualities, refSystem.ArrayTimeStamps, refSystem.Array Errors) {

Console.WriteLine(\); for (inti = 1; i<= 1; i++) {

//Console.WriteLine(\:{0} ClientHandles:{1} Error:{2}\TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString()); Console.WriteLine(\:{0}\, Convert.ToString(ItemValues.GetValue(i))); } }

#region读取功能

publicvoidAddGroupItems(string Address)//添加组 {

MyItemMA = newOPCItem[1];

inti = 0;//i用于标记Item中的索引 //itmHandleServer;

MyItemsMA = MyGroupMA.OPCItems; //MyItems2 = MyGroup2.OPCItems;

MyItemMA[0] = MyItemsMA.AddItem(Address, i);

} ///

///读取byte转ASCII值 ///

publicstringReadData(string Add) {

string result = \; try

{ //初始化item数组 //GetLocalServer();

AddGroupItems(Add);

Thread.Sleep(200);//暂停线程以让DataChange反映,否则下面的同步读可能读不到

////以下同步读

objectItemValues; object Qualities; objectTimeStamps;//同步读的临时变量:值、质量、时间戳

MyItemMA[0].Read(1, outItemValues, out Qualities, outTimeStamps);//同步读,第一个参数只能为1或2

//int q0 = Convert.ToInt32(ItemValues);//转换后获取item值 Byte[] bytTemp = ItemValuesasByte[]; //将byte数组转为字符串+

result = System.Text.ASCIIEncoding.ASCII.GetString(bytTemp);//OK ////MessageBox.Show(result, \结果\

return result; }

catch (Exception ex) { //异常处理 return result; } finally

{

} } ///

///读取boolean值,需要先创建group ///

///

publicBooleanReadData_Boolean(string Add) {

Boolean result = false; try

{ //初始化item数组 //GetLocalServer();

AddGroupItems(Add);

Thread.Sleep(200);//暂停线程以让DataChange反映,否则下面的同步读可能读不到

////以下同步读

objectItemValues; object Qualities; objectTimeStamps;//同步读的临时变量:值、质量、时间戳

MyItemMA[0].Read(1, outItemValues, out Qualities, outTimeStamps);//同步读,第一个参数只能为1或2

//int q0 = Convert.ToInt32(ItemValues);//转换后获取item值 Boolean result1 = (Boolean)ItemValues;

result = result1; return result; }

catch (Exception ex) { //异常处理 return result; } finally

{

} } ///

///读取Object值,需要先创建group ///

///

publicobjectReadData_Object(string Add) { try

{ CreateGroup(Add); }

catch (Exception ex) {

}

object result = null;

try

{

AddGroupItems(Add);

Thread.Sleep(200);//暂停线程以让DataChange反映,否则下面的同步读可能读不到

////以下同步读

objectItemValues; object Qualities; objectTimeStamps;//同步读的临时变量:值、质量、时间戳

MyItemMA[0].Read(1, outItemValues, out Qualities, outTimeStamps);//同步读,第一个参数只能为1或2

//int q0 = Convert.ToInt32(ItemValues);//转换后获取item值

result = ItemValues; if (result != null) {

if (result.ToString() == \) { return\;

} else

{

result = result.ToString().Replace(\, \); result = result.ToString().Replace(\, \); result = result.ToString().Replace(\, \); result = result.ToString().Replace(\, \); } }

return result; }

catch (Exception ex) { //异常处理 result = \; return result; } finally

{

//RemoveGroup(Add); } }

publicboolCreateGroup(string Address) { try

{

MyGroupMA = MyServer.OPCGroups.Add(Address);//添加组 //以下设置组属性 {

MyServer.OPCGroups.DefaultGroupIsActive = true;//激活组。

MyServer.OPCGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化

都通知组。

MyServer.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms MyGroupMA.UpdateRate = 100;//刷新频率为1秒。

MyGroupMA.IsSubscribed = true;//使用订阅功能,即可以异步,默认false }

//MyGroupMA.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange_Heart); MyGroupMA.AsyncWriteComplete +=

newDIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete); MyGroupMA.AsyncReadComplete +=

newDIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);

}

catch (Exception err) {

//this.WriteLog_Station(\过点创建组出现错误:\ returnfalse; } returntrue; }

#endregion

#region写入功能 ///

///写入方法ascII ///

///

temp = newint[] { 0, MyItemMA[0].ServerHandle };//机型 stringtypecode = Value;

byte[] arrValue = System.Text.Encoding.Default.GetBytes(typecode);//将string转为 byte[] ArrayserverHandles = (Array)temp;

object[] valueTemp = newobject[2] { \, arrValue };//item数量为2 Array values = (Array)valueTemp; Array Errors; intcancelID;

MyGroupMA.AsyncWrite(1, refserverHandles, ref values, out Errors, 1, outcancelID);//第一参数为item数量

}

///

///写入object ///

///

int[] temp = newint[] { 0, MyItemMA[0].ServerHandle };//写入数据Item数量2

ArrayserverHandles = (Array)temp;

object[] valueTemp = newobject[2] { \, Value };//item数量为2 Array values = (Array)valueTemp; Array Errors; intcancelID;

MyGroupMA.AsyncWrite(1, refserverHandles, ref values, out Errors, 1, outcancelID);//第一参数为item数量

}

privatevoidWriteByteFa(byte[] Value) {

int[] temp = newint[] { 0, MyItemMA[0].ServerHandle };//写入数据Item数量2

ArrayserverHandles = (Array)temp;

object[] valueTemp = newobject[2] { \, Value };//item数量为2 Array values = (Array)valueTemp; Array Errors; intcancelID;

MyGroupMA.AsyncWrite(1, refserverHandles, ref values, out Errors, 1, outcancelID);//第一参数为item数量

}

#endregion

#region CH160 ///

///创建组

///

///

OPCGroups MyGroupsStationCH160; ///

///OPCGroup Object ///

OPCGroup MyGroupStationCH160; ///

///OPCItems Object ///

OPCItems MyItemsStationCH160; ///

///OPCItem Object ///

OPCItem[] MyItemStationCH160; publicOPCGroup GroupStationCH160 {

get { return MyGroupStationCH160; } }

publicbool CH160CreateGroup(string Address) { try

{

MyGroupStationCH160 = MyServer.OPCGroups.Add(Address);//添加组 //以下设置组属性 {

MyServer.OPCGroups.DefaultGroupIsActive = true;//激活组。

MyServer.OPCGroups.DefaultGroupDeadband = 0;// 死区值,设为0时,服务器端该组内任何数据变化都通知组。

MyServer.OPCGroups.DefaultGroupUpdateRate = 200;//默认组群的刷新频率为200ms MyGroupStationCH160.UpdateRate = 100;//刷新频率为1秒。

MyGroupStationCH160.IsSubscribed = true;//使用订阅功能,即可以异步,默认false

}

MyGroupStationCH160.DataChange +=

newDIOPCGroupEvent_DataChangeEventHandler(GroupDataChange_CH160Heart); MyGroupStationCH160.AsyncWriteComplete +=

newDIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete); MyGroupStationCH160.AsyncReadComplete +=

newDIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete); AddGroupItemsCH160(Address); }

catch (Exception err) {

returnfalse; } returntrue; }

void GroupDataChange_CH160Heart(intTransactionID, intNumItems, refArrayClientHandles, refArrayItemValues, refArray Qualities, refArrayTimeStamps) { try

{

for (inti = 1; i<= 1; i++) {

if (ItemValues.GetValue(i) != null) {

object bb = ItemValues.GetValue(i); string s = bb.ToString(); stringEngineNo = \; if (s == \)

{

string Finish = \;//反馈读取结束标记

// \对应的地址,例如:M1.[S7].DB10,STRING12,50\

EngineNo = this.ReadData_Object(\).ToString(); //读取数据

} }

} }

catch (Exception ex) {

}

}

publicvoid AddGroupItemsCH160(string Address)//添加组 {

MyItemStationCH160 = newOPCItem[1]; inti = 0;//i用于标记Item中的索引 //itmHandleServer;

MyItemsStationCH160 = MyGroupStationCH160.OPCItems; //MyItems2 = MyGroup2.OPCItems;

MyItemStationCH160[0] = MyItemsStationCH160.AddItem(Address, i); }

#endregion

} }

} }

catch (Exception ex) {

}

}

publicvoid AddGroupItemsCH160(string Address)//添加组 {

MyItemStationCH160 = newOPCItem[1]; inti = 0;//i用于标记Item中的索引 //itmHandleServer;

MyItemsStationCH160 = MyGroupStationCH160.OPCItems; //MyItems2 = MyGroup2.OPCItems;

MyItemStationCH160[0] = MyItemsStationCH160.AddItem(Address, i); }

#endregion

} }

本文来源:https://www.bwwdw.com/article/9b6r.html

Top