在好例子网,分享、交流、成长!
您当前所在位置:首页Others 开发实例一般编程问题 → C#访问OpcServer实现读写PLC

C#访问OpcServer实现读写PLC

一般编程问题

下载此实例
  • 开发语言:Others
  • 实例大小:3.26M
  • 下载次数:93
  • 浏览次数:1307
  • 发布时间:2019-10-17
  • 实例类别:一般编程问题
  • 发 布 人:robot666
  • 文件格式:.rar
  • 所需积分:2
 相关标签:

实例介绍

【实例简介】1、开放全部源代码,包括OpcDaNet库的源代码。 2、无需依赖任何其他类库。 3、基于KEPServerEXV5.14进行测试 4、按抽象设备进行了统一封装。 OPC PLC

【实例截图】

from clipboard

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//using Mesnac.Equip.OMRON.HostLink.COM;
//using Mesnac.Equip.Mitsubishi.MXComponent.Default;
//using Mesnac.Equip.Siemens.S7_300.Net;
//using Mesnac.Equip.Siemens.S7_1500.Ethernet;
using Mesnac.Equip.OPC.OpcDaNet.OPC;

namespace TestWinApp
{
    public partial class Form1 : Form
    {
        private Equip thisEquip = new Equip();

        private OPCDA.NET.OpcServer opcServer = new OPCDA.NET.OpcServer();
        private OPCDA.NET.DataChangeEventHandler dch;
        private OPCDA.NET.RefreshGroup refreshGroup = null;
        private OPCDA.NET.SyncIOGroup readWriteGroup = null;
        private Dictionary<string, object> lastData = new Dictionary<string,object>();

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.thisEquip.Main.ReadHz = 1000;

                this.thisEquip.Group.Clear();

                Mesnac.Equips.BaseInfo.Group group4 = new Mesnac.Equips.BaseInfo.Group();
                group4.Name = "DB4";
                group4.Block = "4";
                group4.Start = 0;
                group4.Len = 110;

                this.thisEquip.Group.Add(group4.Name, group4);

                Mesnac.Equips.BaseInfo.Group group5 = new Mesnac.Equips.BaseInfo.Group();
                group5.Name = "DB5";
                group5.Block = "5";
                group5.Start = 0;
                group5.Len = 122;

                Mesnac.Equips.BaseInfo.Data DB5DBW64 = new Mesnac.Equips.BaseInfo.Data();
                DB5DBW64.Name = "DB5DBW64";
                DB5DBW64.Start = 32;
                DB5DBW64.Len = 1;

                group5.Data.Add("DB5DBW64", DB5DBW64);

                this.thisEquip.Group.Add(group5.Name, group5);



                this.thisEquip.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            try
            {
                string block = this.textBox1.Text;
                int start = 0;
                int.TryParse(this.textBox2.Text,out start);
                int len = 0;
                int.TryParse(this.textBox3.Text,out len);
                object[] buff = new object[len];
                bool result = this.thisEquip.Read(block, start, len, out buff);
                if (result)
                {
                    StringBuilder sb = new StringBuilder();
                    foreach(object obj in buff)
                    {
                        sb.Append(obj.ToString()).Append(",");
                    }
                    this.textBox5.Text = sb.ToString();
                    MessageBox.Show("读取成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                int block = 0;
                int.TryParse(this.textBox1.Text, out block);
                int start = 0;
                int.TryParse(this.textBox2.Text, out start);
                int len = 0;
                int.TryParse(this.textBox3.Text, out len);
                object[] buff = new object[len];
                for (int i = 0; i < len; i  )
                {
                    buff[i] = Convert.ToInt32(this.textBox4.Text);
                }
                bool result = this.thisEquip.Write(block, start,buff);
                if (result)
                {
                    MessageBox.Show("写入成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                this.thisEquip.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                string block = this.textBox1.Text;
                int start = 0;
                int.TryParse(this.textBox6.Text, out start);
                int len = 2;
                object[] buff = new object[len];
                bool result = this.thisEquip.Read(block, start, len, out buff);
                if (result)
                {
                    string s1 = System.Convert.ToString(Convert.ToInt32(buff[0]), 2).PadLeft(16, '0');
                    string s2 = System.Convert.ToString(Convert.ToInt32(buff[1]), 2).PadLeft(16, '0');
                    string s3 = s1   s2;
                    string s41 = s3.Substring(0, 8);
                    string s42 = s3.Substring(8, 8);
                    string s43 = s3.Substring(16, 8);
                    string s44 = s3.Substring(24, 8);
                    Console.WriteLine(s44   s43   s42   s41);
                    List<byte> lv = new List<byte>();
                    lv.Add(System.Convert.ToByte(s44, 2));
                    lv.Add(System.Convert.ToByte(s43, 2));
                    lv.Add(System.Convert.ToByte(s42, 2));
                    lv.Add(System.Convert.ToByte(s41, 2));
                    float f = BitConverter.ToSingle(lv.ToArray<byte>(), 0);
                    this.lblResult.Text = f.ToString();
                    MessageBox.Show("读取成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            float f = 0.0f;
            if (float.TryParse(this.textBox7.Text, out f))
            {
                byte[] byteValues = BitConverter.GetBytes(f);
                object[] intValues = new object[2];
                intValues[0] = System.Convert.ToInt32(System.Convert.ToString(byteValues[3], 2).PadLeft(8, '0')   System.Convert.ToString(byteValues[2], 2).PadLeft(8, '0'), 2);
                intValues[1] = System.Convert.ToInt32(System.Convert.ToString(byteValues[1], 2).PadLeft(8, '0')   System.Convert.ToString(byteValues[0], 2).PadLeft(8, '0'), 2);

                try
                {
                    int block = 0;
                    int.TryParse(this.textBox1.Text, out block);
                    int start = 0;
                    int.TryParse(this.textBox6.Text, out start);
                    bool result = this.thisEquip.Write(block, start, intValues);
                    if (result)
                    {
                        MessageBox.Show("写入成功!");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    MessageBox.Show(ex.StackTrace);
                }
            }
        }

        private void button7_Click(object sender, EventArgs e)
        {
            try
            {
                int block = 0;
                int.TryParse(this.textBox1.Text, out block);
                int start = 0;
                int.TryParse(this.textBox2.Text, out start);
                int value = 0;
                int.TryParse(this.textBox8.Text, out value);
                Int16[] intValues = WriteData_Int32(value, 2);
                object[] objValues = new object[intValues.Length];
                Array.Copy(intValues, objValues, intValues.Length);
                bool result = this.thisEquip.Write(block, start, objValues);
                if (result)
                {
                    MessageBox.Show("写入成功!");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                MessageBox.Show(ex.StackTrace);
            }
        }

        /// <summary>
        /// 对Int32类型的PLC写入项进行数据处理,此处要注意不同类型PLC的处理方式
        /// </summary>
        /// <returns></returns>
        private Int16[] WriteData_Int32(int SetValue, int ValueLen)
        {
            Int16[] buff = new Int16[ValueLen];
            for (int i = 0; i < buff.Length; i  )
            {
                buff[i] = 0;
            }
            Int32 ivalue = 0;
            if (ValueLen / 2 == 1)
            {
                if (SetValue != null && Int32.TryParse(SetValue.ToString(), out ivalue))
                {
                    byte[] byteValues = BitConverter.GetBytes(ivalue);
                    Int16[] intValues = new Int16[2];
                    intValues[0] = System.Convert.ToInt16(System.Convert.ToString(byteValues[3], 2).PadLeft(8, '0')   System.Convert.ToString(byteValues[2], 2).PadLeft(8, '0'), 2);
                    intValues[1] = System.Convert.ToInt16(System.Convert.ToString(byteValues[1], 2).PadLeft(8, '0')   System.Convert.ToString(byteValues[0], 2).PadLeft(8, '0'), 2);
                    buff[0] = intValues[0];
                    buff[1] = intValues[1];
                }
            }
            else
            {
                //if (SetValue is Int32[])
                //{
                //    Int32[] setValues = (Int32[])SetValue;
                //    for (int i = 0; i < setValues.Length; i  )
                //    {
                //        if (i * 2 >= ValueLen)
                //        {
                //            break;
                //        }
                //        byte[] byteValues = BitConverter.GetBytes(setValues[i]);
                //        Int16[] intValues = new Int16[2];
                //        intValues[0] = System.Convert.ToInt16(System.Convert.ToString(byteValues[3], 2).PadLeft(8, '0')   System.Convert.ToString(byteValues[2], 2).PadLeft(8, '0'), 2);
                //        intValues[1] = System.Convert.ToInt16(System.Convert.ToString(byteValues[1], 2).PadLeft(8, '0')   System.Convert.ToString(byteValues[0], 2).PadLeft(8, '0'), 2);
                //        buff[i] = intValues[0];
                //        buff[i   1] = intValues[1];
                //    }
                //}
            }
            return buff;
        }

        private void button8_Click(object sender, EventArgs e)
        {
            OPC.Common.Host host = new OPC.Common.Host("192.168.1.105");
            OPC.OpcServerBrowser browser = new OPC.OpcServerBrowser(host);
            string[] serverList = null;
            browser.GetServerList(out serverList);
            foreach (string server in serverList)
            {
                Console.WriteLine(server);
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            
            int connectResult = opcServer.Connect("192.168.1.105", "Kepware.KEPServerEX.V5");
            if (connectResult == 0)
            {
                Console.WriteLine("Connect success!");
                this.dch = new OPCDA.NET.DataChangeEventHandler(this.DataChangeHandler);
                this.refreshGroup = new OPCDA.NET.RefreshGroup(opcServer, this.dch, 6000);
                this.refreshGroup.Add("chnlSiemens.S7-300.DB4.0-100");
                this.refreshGroup.Add("chnlSiemens.S7-300.DB5.0-100");
                this.refreshGroup.Add("chnlSiemens.S7-300.DB5.DB5DBW64");

                this.readWriteGroup = new OPCDA.NET.SyncIOGroup(this.opcServer);

                this.readWriteGroup.Add("chnlSiemens.S7-300.DB4.0-100");
                this.readWriteGroup.Add("chnlSiemens.S7-300.DB5.0-100");
                this.readWriteGroup.Add("chnlSiemens.S7-300.DB5.DB5DBW64");

            }
            else
            {
                Console.WriteLine("Connect error!");
                return;
            }
        }

        private void DataChangeHandler(object sender, OPCDA.NET.DataChangeEventArgs e)
        {
            Console.WriteLine("sender = "   sender);
            Console.WriteLine("DataChangeHandler_PLC值发生变化..."   e.sts.Count());
            OPCDA.NET.OPCItemState[] itemStates = e.sts;
            foreach (OPCDA.NET.OPCItemState itemState in itemStates)
            {
                OPCDA.NET.ItemDef itemDef = this.refreshGroup.FindClientHandle(itemState.HandleClient);
                if (itemDef != null)
                {
                    this.lastData[itemDef.OpcIDef.ItemID] = itemState.DataValue;
                }
            }
        }

        private void button10_Click(object sender, EventArgs e)
        {
            Random r = new Random();
            r.Next(100);

            OPCDA.NET.ItemValue[] values = opcServer.Read(new string[] { "chnlSiemens.S7-300.DB4.DB40-100", "chnlSiemens.S7-300.DB5.DB50-100", "chnlSiemens.S7-300.DB5.DB5DBW64" }, 1000);
            foreach (OPCDA.NET.ItemValue value in values)
            {
                Console.Write(value.ItemID   " = "   value.Value   " , "   value.MaxAge   " , "   value.Timestamp);
                if (value.Value is Array)
                {
                    Int16[] itemValues = value.Value as Int16[];
                    Console.WriteLine("Length = "   itemValues.Length);
                    
                    itemValues[10] = (short)r.Next(100);
                    itemValues[11] = (short)r.Next(100);

                    value.Value = itemValues;

                    //this.readWriteGroup.Write(this.readWriteGroup.Item(value.ItemID), value.Value);
                }
                else
                {
                    value.Value = (short)r.Next(100);
                    Console.WriteLine("写入值:"   value.Value);
                    //opcServer.Write(new OPCDA.NET.ItemValue[] { value });


                    this.readWriteGroup.Write(this.readWriteGroup.Item(value.ItemID), value.Value);
                    
                    Console.WriteLine("写入完毕!");
                }
            }
            Console.WriteLine();
        }

        private void button11_Click(object sender, EventArgs e)
        {
            //foreach (string itemID in this.lastData.Keys)
            //{
            //    if (this.lastData[itemID] is Array)
            //    {
            //        short[] dataArr = this.lastData[itemID] as short[];
            //        foreach (short s in dataArr)
            //        {
            //            Console.Write(s   ",");
            //        }
            //        Console.WriteLine();
            //    }
            //    else
            //    {
            //        Console.WriteLine(itemID   " = "   this.lastData[itemID]);
            //    }
            //}

            
        }
    }
}

标签:

实例下载地址

C#访问OpcServer实现读写PLC

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

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

网友评论

发表评论

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

查看所有0条评论>>

小贴士

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

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

关于好例子网

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

;
报警