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; ///
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写入功能 ///
///
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数量
}
///
///
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
} }
正在阅读:
C#通过OPC连接PLC读写功能案例04-09
说话的艺术,给员工加薪02-18
配电室安全管理规范06-26
邮政公司面试技巧11-17
煤气系统年终工作总结12-19
牛头刨床压力角优化设计02-28
临床康复考试重点01-19
张姓婴儿起名字06-13
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- C#
- 读写
- 案例
- 连接
- 通过
- 功能
- OPC
- PLC
- 生产运营管理第五章
- 五下Project 1 Around our city第1课时最新教案
- 2017年江苏省无锡市江阴市南菁高中自主招生物理模拟试卷
- 专项题库+高考领航2016届高考物理大一轮复习 热点集训(二) 受
- WCDMA试题两套(含答案)
- 中国刻章行业市场前景分析预测报告(目录) - 图文
- 未来之光系列节能灯策划 - 图文
- 一年级上册格林童话格林童话
- 2012年高考英语(北京卷)解析
- 香港证券及期货从业资格考试-温习手册整理版-HK
- 金刚般若研习报告1-8集
- 公司外汇业务从业人员资格考试题库
- 语文学科高一试题质量评价及分析报告
- 最新最全2018年全国执业药师继续教育考试答案
- 蜂巢芯模施工方案 - 图文
- Linux复习题
- 浮式海洋结构物研究现状及发展趋势
- 哈尔滨市2014年高考申请享受照顾政策名单 - 图文
- 2012年秋期小学语文第九册教学计划
- 热力学重点第3章 - secret