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

上传人:b****3 文档编号:13059378 上传时间:2023-04-22 格式:DOCX 页数:19 大小:19.08KB
下载 相关 举报
C#通过OPC连接PLC读写功能案例.docx_第1页
第1页 / 共19页
C#通过OPC连接PLC读写功能案例.docx_第2页
第2页 / 共19页
C#通过OPC连接PLC读写功能案例.docx_第3页
第3页 / 共19页
C#通过OPC连接PLC读写功能案例.docx_第4页
第4页 / 共19页
C#通过OPC连接PLC读写功能案例.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

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

《C#通过OPC连接PLC读写功能案例.docx》由会员分享,可在线阅读,更多相关《C#通过OPC连接PLC读写功能案例.docx(19页珍藏版)》请在冰豆网上搜索。

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

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

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

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

功能简介:

本程序主要是针对PLC发送请求信号,收到信号执行调用,例如:

由PLC发送请求信号1,程序自动去调用,当调用完毕,信号恢复为0,直到下一次变为1,再次进展调用;

1、手工下载一个Interop.OPCAutomation.dll

2、手工创立一个类PublicOPC_PLC

3、直接调用即可,

调用方法:

PublicOPC_PLCPlc=newPublicOPC_PLC();

Plc.InitConnect();

Plc.CH160CreateGroup("PLC地址");

//此处的PLC地址必须为PLC中DB块对应的BOOL型的地址例如:

C1.[S7].DB35.DBX544.0

 

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingOPCAutomation;

usingSystem.Net;

usingSystem.Threading;

namespaceOPCService

{

publicclassPublicOPC_PLC

{

#region私有变量

///

///OPCServerObject

///

publicstaticOPCServerMyServer;

///

///OPCGroupsObject

///

publicstaticOPCGroupsMyGroups;

///

///OPCGroupObject

///

publicstaticOPCGroupMyGroupMA;

publicstaticOPCGroupMyGroupMA2;

///

///OPCItemsObject

///

OPCItemsMyItemsMA;

///

///OPCItemObject

///

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(stringserverin(Array)serverList)

{

//cmbServerName.Items.Add(turn);

Console.WriteLine("本地OPC效劳器:

{0}",server);

}

}

catch(Exceptionerr)

{

Console.WriteLine("枚举本地OPC效劳器出错:

{0}",err.Message);

}

}

//连接OPC效劳器

///OPCServerIP

///OPCServer名称

publicboolConnectRemoteServer()

{

try

{

stringremoteServerIP="",remoteServerName="KEPware.KEPServerEx.V4";

MyServer.Connect(remoteServerName,remoteServerIP);//连接本地效劳器:

效劳器名+主机名或IP

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

{

////MessageBox.Show("已连接到:

{0}",MyServer.ServerName);

//WriteLog_Station("网络连接成功");

}

else

{

//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档

////MessageBox.Show("状态:

{0}",MyServer.ServerState.ToString());

//WriteLog_Station("网络连接失败");

}

MyServer.ServerShutDown+=ServerShutDown;//效劳器断开事件

}

catch(Exceptionerr)

{

//MessageBox.Show("连接远程效劳器出现错误:

{0}"+err.Message);

returnfalse;

}

returntrue;

}

publicvoidServerShutDown(stringReason)//效劳器先行断开

{

//WriteLog_Station("效劳器已经先行断开!

");

MyServer.Disconnect();

}

publicvoidRemoveGroup(stringName)

{

MyServer.OPCGroups.Remove(Name);

}

voidGroupAsyncWriteComplete(intTransactionID,intNumItems,refArrayClientHandles,refArrayErrors)

{

Console.WriteLine("%%%%%%%%%%%%%%%%AsyncWriteComplete%%%%%%%%%%%%%%%%%%%");

/*for(inti=1;i<=1;i++)

{

Console.WriteLine("Tran:

{0}ClientHandles:

{1}Error:

{2}",TransactionID.ToString(),ClientHandles.GetValue(i).ToString(),Errors.GetValue(i).ToString());

}*/

}

voidGroupAsyncReadComplete(intTransactionID,intNumItems,refSystem.ArrayClientHandles,refSystem.ArrayItemValues,refSystem.ArrayQualities,refSystem.ArrayTimeStamps,refSystem.ArrayErrors)

{

Console.WriteLine("****************GroupAsyncReadComplete*******************");

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

{

//Console.WriteLine("Tran:

{0}ClientHandles:

{1}Error:

{2}",TransactionID.ToString(),ClientHandles.GetValue(i).ToString(),Errors.GetValue(i).ToString());

Console.WriteLine("Vaule:

{0}",Convert.ToString(ItemValues.GetValue(i)));

}

}

#region读取功能

publicvoidAddGroupItems(stringAddress)//添加组

{

MyItemMA=newOPCItem[1];

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

//itmHandleServer;

MyItemsMA=MyGroupMA.OPCItems;

//MyItems2=MyGroup2.OPCItems;

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

 

}

///

///读取byte转ASCII值

///

publicstringReadData(stringAdd)

{

stringresult="";

try

{

//初始化item数组

//GetLocalServer();

 

AddGroupItems(Add);

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

 

////以下同步读

objectItemValues;objectQualities;objectTimeStamps;//同步读的临时变量:

值、质量、时间戳

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

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

Byte[]bytTemp=ItemValuesasByte[];

//将byte数组转为字符串+

result=System.Text.ASCIIEncoding.ASCII.GetString(bytTemp);//OK

////MessageBox.Show(result,"结果");

returnresult;

}

catch(Exceptionex)

{

//异常处理

returnresult;

}

finally

{

}

}

///

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

///

///

///

publicBooleanReadData_Boolean(stringAdd)

{

Booleanresult=false;

try

{

//初始化item数组

//GetLocalServer();

 

AddGroupItems(Add);

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

 

////以下同步读

objectItemValues;objectQualities;objectTimeStamps;//同步读的临时变量:

值、质量、时间戳

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

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

Booleanresult1=(Boolean)ItemValues;

result=result1;

returnresult;

}

catch(Exceptionex)

{

//异常处理

returnresult;

}

finally

{

}

}

///

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

///

///

///

publicobjectReadData_Object(stringAdd)

{

try

{

CreateGroup(Add);

}

catch(Exceptionex)

{

}

objectresult=null;

try

{

AddGroupItems(Add);

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

 

////以下同步读

objectItemValues;objectQualities;objectTimeStamps;//同步读的临时变量:

值、质量、时间戳

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

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

result=ItemValues;

if(result!

=null)

{

if(result.ToString()=="")

{

return"";

}

else

{

result=result.ToString().Replace("\0","");

result=result.ToString().Replace("\n","");

result=result.ToString().Replace("\r","");

result=result.ToString().Replace("\t","");

}

}

returnresult;

}

catch(Exceptionex)

{

//异常处理

result="";

returnresult;

}

finally

{

//RemoveGroup(Add);

}

}

publicboolCreateGroup(stringAddress)

{

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+=newDIOPCGroupEvent_DataChangeEventHandler(GroupDataChange_Heart);

MyGroupMA.AsyncWriteComplete+=newDIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete);

MyGroupMA.AsyncReadComplete+=newDIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete);

}

catch(Exceptionerr)

{

//this.WriteLog_Station("过点创立组出现错误:

"+err.Message);

returnfalse;

}

returntrue;

}

#endregion

#region写入功能

///

///写入方法ascII

///

///

publicvoidWriteFa(stringValue)

{

int[]temp;

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

Arrayvalues=(Array)valueTemp;

ArrayErrors;

intcancelID;

MyGroupMA.AsyncWrite(1,refserverHandles,refvalues,outErrors,1,outcancelID);//第一参数为item数量

}

///

///写入object

///

///

publicvoidWritecharFa(stringValue)

{

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

ArrayserverHandles=(Array)temp;

object[]valueTemp=newobject[2]{"",Value};//item数量为2

Arrayvalues=(Array)valueTemp;

ArrayErrors;

intcancelID;

MyGroupMA.AsyncWrite(1,refserverHandles,refvalues,outErrors,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

Arrayvalues=(Array)valueTemp;

ArrayErrors;

intcancelID;

MyGroupMA.AsyncWrite(1,refserverHandles,refvalues,outErrors,1,outcancelID);//第一参数为item数量

}

#endregion

#regionCH160

///

///创立组

///

///

///

///

OPCGroupsMyGroupsStationCH160;

///

///OPCGroupObject

///

OPCGroupMyGroupStationCH160;

///

///OPCItemsObject

///

OPCItemsMyItemsStationCH160;

///

///OPCItemObject

///

OPCItem[]MyItemStationCH160;

publicOPCGroupGroupStationCH160

{

get{returnMyGroupStationCH160;}

}

publicboolCH160CreateGroup(stringAddress)

{

try

{

MyGroupStationCH160=MyServer.OPCGroups.Add(Address);//添加组

//以下设置组属性

{

MyServer.OPCGroups.DefaultGroupIsActive=true;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1