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; ///
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 ///