1、C#通过OPC连接PLC读写功能案例C#通过OPC连接PLC读写功能案例最简单、最有效的PLC连接程序,里面包含了各种类型的读写功能,绝对是拷贝过去,直接把地址替换就可以使用。功能简介:本程序主要是针对PLC发送请求信号,收到信号执行调用,例如:由PLC发送请求信号1,程序自动去调用,当调用完毕,信号恢复为0,直到下一次变为1,再次进展调用;1、手工下载一个Interop.OPCAutomation.dll2、手工创立一个类PublicOPC_PLC3、直接调用即可,调用方法:PublicOPC_PLC Plc = newPublicOPC_PLC(); Plc.InitConnect();
2、Plc.CH160CreateGroup(PLC地址);/此处的PLC地址必须为PLC中DB块对应的BOOL型的地址例如:C1.S7.DB35.DBX544.0using System;using System.Collections.Generic;using System.Linq;using System.Text;using OPCAutomation;using System.Net;using System.Threading;namespace OPCServicepublicclassPublicOPC_PLC #region私有变量/ OPCServer Object /pu
3、blicstaticOPCServer MyServer;/ OPCGroups Object /publicstaticOPCGroups MyGroups;/ OPCGroup Object /publicstaticOPCGroup MyGroupMA;publicstaticOPCGroup MyGroupMA2;/ OPCItems Object /OPCItems MyItemsMA;/ OPCItem Object /OPCItem MyItemMA;/主机IP /publicstaticstring strHostIP = ;/主机名称/publicstaticstring s
4、trHostName = ;/连接状态/publicstaticbool opc_connected = false;/客户端句柄/int itmHandleClient = 0;/效劳端句柄/int itmHandleServer = 0;publicOPCGroup GroupMA get return MyGroupMA; #endregion/初始化连接对应的状态,包括连接效劳器,需要读取的初始值/publicvoid InitConnect() /初始化OPC效劳配置 GetLocalServer(); ConnectRemoteServer();/连接OPC效劳器 MyGroups
5、 = MyServer.OPCGroups; /枚举本地OPC效劳器publicvoid GetLocalServer() /获取本地计算机IP,计算机名称 strHostName = Dns.GetHostName();/或者通过局域网计算机名称/获取本地计算机IP,计算机名称IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);if (IPHost.AddressList.Length 0) IPHostEntry ipHostEntry = Dns.GetHostByAddress(IPHost.AddressList0.To
6、String(); strHostName = ipHostEntry.HostName.ToString(); /获取本地计算机上的OPCServerName try MyServer = newOPCServer();object serverList = MyServer.GetOPCServers(strHostName);foreach (string server in (Array)serverList) /cmbServerName.Items.Add(turn); Console.WriteLine(本地OPC效劳器:0, server); catch (Exception
7、err) Console.WriteLine(枚举本地OPC效劳器出错:0, err.Message); /连接OPC效劳器/OPCServerIP/OPCServer名称publicbool ConnectRemoteServer() try string remoteServerIP = , remoteServerName = KEPware.KEPServerEx.V4; MyServer.Connect(remoteServerName, remoteServerIP);/连接本地效劳器:效劳器名+主机名或IP if (MyServer.ServerState = (int)OPCS
8、erverState.OPCRunning) /MessageBox.Show(已连接到:0, MyServer.ServerName);/WriteLog_Station(网络连接成功); else /这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档/MessageBox.Show(状态:0, MyServer.ServerState.ToString();/WriteLog_Station(网络连接失败); MyServer.ServerShutDown += ServerShutDown;/效劳器断开事件 catch (Exception err) /MessageB
9、ox.Show(连接远程效劳器出现错误:0 + err.Message);returnfalse; returntrue; publicvoid ServerShutDown(string Reason)/效劳器先行断开 /WriteLog_Station(效劳器已经先行断开!); MyServer.Disconnect(); publicvoid RemoveGroup(string Name) MyServer.OPCGroups.Remove(Name); void GroupAsyncWriteComplete(int TransactionID, int NumItems, refA
10、rray ClientHandles, refArray Errors) Console.WriteLine(%AsyncWriteComplete%);/*for (int i = 1; i = 1; i+) Console.WriteLine(Tran:0 ClientHandles:1 Error:2, TransactionID.ToString(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString(); */ void GroupAsyncReadComplete(int TransactionID,
11、 int NumItems, ref System.Array ClientHandles, ref System.Array ItemValues, ref System.Array Qualities, ref System.Array TimeStamps, ref System.Array Errors) Console.WriteLine(*GroupAsyncReadComplete*);for (int i = 1; i = 1; i+) /Console.WriteLine(Tran:0 ClientHandles:1 Error:2, TransactionID.ToStri
12、ng(), ClientHandles.GetValue(i).ToString(), Errors.GetValue(i).ToString(); Console.WriteLine(Vaule:0, Convert.ToString(ItemValues.GetValue(i); #region读取功能publicvoid AddGroupItems(string Address)/添加组 MyItemMA = newOPCItem1;int i = 0;/i用于标记Item中的索引/itmHandleServer; MyItemsMA = MyGroupMA.OPCItems;/MyIt
13、ems2 = MyGroup2.OPCItems; MyItemMA0 = MyItemsMA.AddItem(Address, i); /读取byte转ASCII值/publicstring ReadData(string Add) string result = ;try /初始化item数组/GetLocalServer(); AddGroupItems(Add);Thread.Sleep(200);/暂停线程以让DataChange反映,否那么下面的同步读可能读不到/以下同步读object ItemValues; object Qualities; object TimeStamps;
14、/同步读的临时变量:值、质量、时间戳 MyItemMA0.Read(1, out ItemValues, out Qualities, out TimeStamps);/同步读,第一个参数只能为1或2 /int q0 = Convert.ToInt32(ItemValues);/转换后获取item值Byte bytTemp = ItemValues asByte;/将byte数组转为字符串+ result = System.Text.ASCIIEncoding.ASCII.GetString(bytTemp);/OK/MessageBox.Show(result, 结果);return res
15、ult; catch (Exception ex) /异常处理return result; finally /读取boolean值,需要先创立group/publicBoolean ReadData_Boolean(string Add) Boolean result = false;try /初始化item数组/GetLocalServer(); AddGroupItems(Add);Thread.Sleep(200);/暂停线程以让DataChange反映,否那么下面的同步读可能读不到/以下同步读object ItemValues; object Qualities; object Tim
16、eStamps;/同步读的临时变量:值、质量、时间戳 MyItemMA0.Read(1, out ItemValues, out Qualities, out TimeStamps);/同步读,第一个参数只能为1或2 /int q0 = Convert.ToInt32(ItemValues);/转换后获取item值Boolean result1 = (Boolean)ItemValues; result = result1;return result; catch (Exception ex) /异常处理return result; finally /读取Object值,需要先创立group/
17、publicobject ReadData_Object(string Add) try CreateGroup(Add); catch (Exception ex) object result = null;try AddGroupItems(Add);Thread.Sleep(200);/暂停线程以让DataChange反映,否那么下面的同步读可能读不到/以下同步读object ItemValues; object Qualities; object TimeStamps;/同步读的临时变量:值、质量、时间戳 MyItemMA0.Read(1, out ItemValues, out Qu
18、alities, out TimeStamps);/同步读,第一个参数只能为1或2 /int q0 = 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
19、 = result.ToString().Replace(t, ); return result; catch (Exception ex) /异常处理 result = ;return result; finally /RemoveGroup(Add); publicbool CreateGroup(string Address) try MyGroupMA = MyServer.OPCGroups.Add(Address);/添加组/以下设置组属性 MyServer.OPCGroups.DefaultGroupIsActive = true;/激活组。 MyServer.OPCGroups
20、.DefaultGroupDeadband = 0;/ 死区值,设为0时,效劳器端该组任何数据变化都通知组。 MyServer.OPCGroups.DefaultGroupUpdateRate = 200;/默认组群的刷新频率为200ms MyGroupMA.UpdateRate = 100;/刷新频率为1秒。 MyGroupMA.IsSubscribed = true;/使用订阅功能,即可以异步,默认false /MyGroupMA.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(GroupDataChange_Heart);
21、 MyGroupMA.AsyncWriteComplete += newDIOPCGroupEvent_AsyncWriteCompleteEventHandler(GroupAsyncWriteComplete); MyGroupMA.AsyncReadComplete += newDIOPCGroupEvent_AsyncReadCompleteEventHandler(GroupAsyncReadComplete); catch (Exception err) /this.WriteLog_Station(过点创立组出现错误: + err.Message);returnfalse; re
22、turntrue; #endregion #region写入功能/写入方法ascII/publicvoid WriteFa(string Value) int temp; temp = newint 0, MyItemMA0.ServerHandle ;/机型string typecode = Value;byte arrValue = System.Text.Encoding.Default.GetBytes(typecode);/将string转为 byte Array serverHandles = (Array)temp;object valueTemp = newobject2 ,
23、arrValue ;/item数量为2Array values = (Array)valueTemp;Array Errors;int cancelID; MyGroupMA.AsyncWrite(1, ref serverHandles, ref values, out Errors, 1, out cancelID);/第一参数为item数量 /写入object/publicvoid WritecharFa(string Value) int temp = newint 0, MyItemMA0.ServerHandle ;/写入数据Item数量2Array serverHandles =
24、 (Array)temp;object valueTemp = newobject2 , Value ;/item数量为2Array values = (Array)valueTemp;Array Errors;int cancelID; MyGroupMA.AsyncWrite(1, ref serverHandles, ref values, out Errors, 1, out cancelID);/第一参数为item数量 privatevoid WriteByteFa(byte Value) int temp = newint 0, MyItemMA0.ServerHandle ;/写
25、入数据Item数量2Array serverHandles = (Array)temp;object valueTemp = newobject2 , Value ;/item数量为2Array values = (Array)valueTemp;Array Errors;int cancelID; MyGroupMA.AsyncWrite(1, ref serverHandles, ref values, out Errors, 1, out cancelID);/第一参数为item数量 #endregion #region CH160/创立组/OPCGroups MyGroupsStati
26、onCH160;/ 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;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1