C#通过OPC连接PLC读写功能分析案例.docx
《C#通过OPC连接PLC读写功能分析案例.docx》由会员分享,可在线阅读,更多相关《C#通过OPC连接PLC读写功能分析案例.docx(17页珍藏版)》请在冰豆网上搜索。
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
///<