在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → OPC通讯实例(C#通过OPC连接PLC读写数据)

OPC通讯实例(C#通过OPC连接PLC读写数据)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:1.74M
  • 下载次数:652
  • 浏览次数:14836
  • 发布时间:2018-10-31
  • 实例类别:C#语言基础
  • 发 布 人:mxfjanus
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 实例 通讯 PLC opc

实例介绍

【实例简介】C#通过OPC连接PLC读写数据

【实例截图】

【核心代码】

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OPCAutomation;
using System.Diagnostics;

namespace OPC_Client
{
    public partial class Form1 : Form
    {
        OPCServer objServer;
        OPCGroups objGroups;
        OPCGroup objGroup;
        OPCItems objItems;
        Array strItemIDs;
        Array lClientHandles;
        Array lserverhandles;
        Array lErrors;
      //  int ltransID_Rd = 1;
       // int lCancelID_Rd;
       object RequestedDataTypes = null;
        object AccessPaths = null;
     //   Array lerrors_Rd;
        Array lErrors_Wt;
        int lTransID_Wt = 2;
        int lCancelID_Wt;
        public Form1()
        {
            InitializeComponent();
        }


        //连接opc server
        private void button1_Click(object sender, EventArgs e)
        {
            //(1)创建opc server对象
            objServer = new OPCServer();
            //连接opc server
            objServer.Connect("KEPware.KEPServerEx.V4", null);
            //(2)建立一个opc组集合
            objGroups = objServer.OPCGroups;
            //(3)建立一个opc组
            objGroup = objGroups.Add(null); //Group组名字可有可无
            //(4)添加opc标签
            objGroup.IsActive = true; //设置该组为活动状态,连接PLC时,设置为非活动状态也一样
            objGroup.IsSubscribed = true; //设置异步通知
            objGroup.UpdateRate = 250;
            objServer.OPCGroups.DefaultGroupDeadband = 0;
            objGroup.DataChange  = new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);
           // objGroup.AsyncReadComplete  = new DIOPCGroupEvent_AsyncReadCompleteEventHandler(AsyncReadComplete);
            objGroup.AsyncWriteComplete  = new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(AsyncWriteComplete);
            objItems = objGroup.OPCItems; //建立opc标签集合
            string[] tmpIDs = new string[7];
            int[] tmpCHandles = new int[7];
            for (int i = 1; i < 7; i  )
            {
                tmpCHandles[i] = i;
            }
            tmpIDs[1] = "西门子S7-300.PLC.系统启动开关";
            tmpIDs[2] = "西门子S7-300.PLC.机械手启动开关";
            tmpIDs[3] = "西门子S7-300.PLC.M1电动机";
            tmpIDs[4] = "西门子S7-300.PLC.机械手";
            tmpIDs[5] = "西门子S7-300.PLC.温度";
            tmpIDs[6] = "西门子S7-300.PLC.湿度";
            strItemIDs = (Array)tmpIDs;//必须转成Array型,否则不能调用AddItems方法
            lClientHandles = (Array)tmpCHandles;
            // 添加opc标签
            objItems.AddItems(6, ref strItemIDs, ref lClientHandles, out lserverhandles, out lErrors, RequestedDataTypes, AccessPaths);
        }


        //结束并断开opc server
        private void button4_Click(object sender, EventArgs e)
        {
            objServer.Disconnect();
            //关闭kepserver进程,这个跟OPC操作无关
            /*
            foreach ( Process oneProcess in Process.GetProcesses())
            {
            if (oneProcess.ProcessName == "ServerMain")
            oneProcess.Kill();
            }
            */
        }

        //每当项数据有变化时执行的事件,采用订阅方式


        void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
        {
            //为了测试,所以加了控制台的输出,来查看事物ID号
            //Console.WriteLine("********" TransactionID.ToString() "*********");

            for (int i = 0; i < NumItems; i  )
            {


                if (Convert.ToInt32(ClientHandles.GetValue(i   1)) == 1)
                {
                    if (ItemValues.GetValue(i   1) != null)
                    {
                        this.Data1.Text = ItemValues.GetValue(i   1).ToString();
                    }
                }
                if (Convert.ToInt32(ClientHandles.GetValue(i   1)) == 2)
                {
                    if (ItemValues.GetValue(i   1) != null)
                    {
                        this.Data2.Text = ItemValues.GetValue(i   1).ToString();
                    }
                }
                if (Convert.ToInt32(ClientHandles.GetValue(i   1)) == 3)
                {
                    if (ItemValues.GetValue(i   1) != null)
                    {
                        this.Data3.Text = ItemValues.GetValue(i   1).ToString();
                    }
                }
                if (Convert.ToInt32(ClientHandles.GetValue(i   1)) == 4)
                {
                    if (ItemValues.GetValue(i   1) != null)
                    {
                        this.Data4.Text = ItemValues.GetValue(i   1).ToString();
                    }
                }
                if (Convert.ToInt32(ClientHandles.GetValue(i   1)) == 5)
                {
                    if (ItemValues.GetValue(i   1) != null)
                    {
                        this.Data5.Text = ItemValues.GetValue(i   1).ToString();
                    }
                }
                if (Convert.ToInt32(ClientHandles.GetValue(i   1)) == 6)
                {
                    if (ItemValues.GetValue(i   1) != null)
                    {
                        this.Data6.Text = ItemValues.GetValue(i   1).ToString();
                    }
                }
            }


        }

       

           
         
        //发送异步写数据指令
        private void button3_Click(object sender, EventArgs e)
        {
            Array AsyncValue_Wt;
            Array SerHandles;
            object[] tmpWtData = new object[3];//写入的数据必须是object型的,否则会报错
            int[] tmpSerHdles = new int[3];
            //将输入数据赋给数组,然后再转成Array型送给AsyncValue_Wt
            tmpWtData[1] = (object)textBox1.Text;
            tmpWtData[2] = (object)textBox2.Text;
            AsyncValue_Wt = (Array)tmpWtData;
            //将输入数据送给的Item对应服务器句柄赋给数组,然后再转成Array型送给SerHandles
            tmpSerHdles[1] = Convert.ToInt32(lserverhandles.GetValue(1));
            tmpSerHdles[2] = Convert.ToInt32(lserverhandles.GetValue(2));
            SerHandles = (Array)tmpSerHdles;
            objGroup.AsyncWrite(2, ref SerHandles, ref AsyncValue_Wt, out lErrors_Wt, lTransID_Wt, out lCancelID_Wt);

        }
        //异步写入成功
        private void AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors)
        {
            MessageBox.Show("数据写入成功!");
        }
    }
}

标签: 实例 通讯 PLC opc

实例下载地址

OPC通讯实例(C#通过OPC连接PLC读写数据)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警