OPC学习

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//using System.Windows.Forms;
using System.Net;
using System.Threading;
using OPCAutomation;
using System.Net.Sockets;
using OPCAutomation;
using System.Collections;


namespace MyOPC
{
    class Program
    {
        static List<OpcItem2> opcList = new List<OpcItem2>();
        static void Main(string[] args)
        {


            IPHostEntry IPhost = Dns.GetHostEntry(Dns.GetHostName());

            foreach (var item in IPhost.AddressList) //IPhost.AddressList包含了主机中网卡的地址
            {
                if (item.AddressFamily == AddressFamily.InterNetwork) //判断是否为ip4
                {
                    //Console.WriteLine(Dns.GetHostEntry(item).HostName);
                }
            }


            //定义OPC服务器;
            OPCServer kepServer;
            //定义OPC服务器Groups;
            OPCGroups kepGroups;
            OPCGroup kepGroup;
            OPCItems kepItems;
            OPCBrowser kepBrowser;
            //定义OPC变量集合
            
            List<int> serverHandles = new List<int>();
            List<int> clientHandles = new List<int>();
            List<string> tempIDList = new List<string>();
            List<string> listItems = new List<string>();
            

            //定义返回的OPC标签错误码
            Array iErrors;
            //定义要添加的OPC标签的标识符
            Array strTempIDs;
            Array strClientHandles;
            Array strServerHandles;
            Array readServerHandles;
            Array writeServerHandles;
            Array writeArrayHandles;
            Array readError;
            Array writeError;
            int readTransID=1;
            int writeTransID=1;
            int readCancelID;
            int writeCancelID;
            bool connectstate;

            kepServer = new OPCServer();

            //获取kep服务器名称
            object serverList = kepServer.GetOPCServers(Dns.GetHostName());

            Array arr1 = serverList as Array;

            List<string> arr2 = new List<string>();

            ArrayList arr3 = new ArrayList();

            foreach (string item in arr1)
            {
                arr3.Add(item);
                arr2.Add(item);
                //Console.WriteLine(item);
            }

            try
            {
                kepServer.Connect(arr2[1], Dns.GetHostName());
            }
            catch (Exception ex)
            {

                Console.WriteLine(ex.Message,"连接失败");
            }

            kepGroups = kepServer.OPCGroups;
            kepGroups.DefaultGroupDeadband = 0;//Group的默认死区,变化量超过死区后将会触发DataChange事件
            kepGroups.DefaultGroupIsActive = true; //以后添加的Group是否默认激活
            kepGroup = kepGroups.Add("Group1");
            kepGroup.IsActive = true;
            kepGroup.IsSubscribed = true; //订阅模式
            kepGroup.UpdateRate = 250; //刷新率

            kepGroup.AsyncReadComplete += KepGroup_AsyncReadComplete;


            //获取服务器的所有变量
            kepBrowser = kepServer.CreateBrowser();
            kepBrowser.ShowBranches();
            kepBrowser.ShowLeafs(true);

            //添加OPC服务器中的所有变量到listItems中
            listItems.Clear();
            foreach (var item in kepBrowser)
            {
                listItems.Add(item.ToString());
            }

            tempIDList.Clear();
            clientHandles.Clear();
            tempIDList.Add("0");
            clientHandles.Add(0);

            //foreach (string item in listItems)
            //{
            //    Console.WriteLine(item);
            //}

            string strSelect = "MDbus.Modbus.K4";

            opcList.Add(new OpcItem2
            {
                Tag = strSelect
            });
            int count = opcList.Count;

            for (int i = 0; i < count; i++)
            {
                tempIDList.Add(opcList[i].Tag);
                clientHandles.Add(i + 1);
            }

            strTempIDs = (Array)tempIDList.ToArray();
            strClientHandles = (Array)clientHandles.ToArray();
            kepItems = kepGroup.OPCItems;

            //kepGroup中的KepItems添加标签
            //strTempID就是opcList[i]中的Tag属性,clientHandles从1开始,
            kepItems.AddItems(opcList.Count, ref strTempIDs, ref strClientHandles, out strServerHandles, out iErrors);
            serverHandles.Clear();
            serverHandles.Add(0);
            for (int i = 0; i < count; i++)
            {
                serverHandles.Add(Convert.ToInt32(strServerHandles.GetValue(i + 1)));//读取的strServerHandles+1
            }
            readServerHandles = (Array)serverHandles.ToArray();

            //执行后,Value才有数值
            if (opcList.Count > 0)
            {
                if (kepServer != null)
                {
                    kepGroup.AsyncRead(opcList.Count, ref readServerHandles, out readError, readTransID, out readCancelID);
                }

            }


            //判断OPC是否正在运行
            if (kepServer.ServerState==(int)OPCServerState.OPCRunning)
            {
                connectstate = true;
            }
            
            //解析读取的OPC值
            int v1 = Convert.ToInt32(opcList[0].Value);
            string v0;
            v0 = opcList[0].Value;
            Console.WriteLine(v0);
            Console.ReadKey();
            //try
            //{
            //    v0 = opcList[0].Value;
            //}
            //catch (Exception ex)
            //{
            //    Console.WriteLine("赋值失败", ex);
            //    Console.ReadKey();
            //}



            int index = 0;
            int[] serverHandle = new int[] { 0, Convert.ToInt32(strServerHandles.GetValue(index + 1)) };
            writeServerHandles = (Array)serverHandle;

            object[] values = new object[2];
            values[0] = null;
            values[1] = "1111";//1为异步
            writeArrayHandles = (Array)values;

            kepGroup.AsyncWrite(1, writeServerHandles, writeArrayHandles,out writeError, writeTransID, out writeCancelID);
            //kepGroup.SyncWrite(1, ref writeServerHandles, ref writeArrayHandles, out writeError);
        }

        //使用委托, 并向opcList中赋值
        private static void KepGroup_AsyncReadComplete(
            int TransactionID, int NumItems, ref Array ClientHandles, 
            ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors)
        {
            for (int i = 1; i <=NumItems; i++)
            {
                object Value = ItemValues.GetValue(i);
                if (Value!=null)
                {
                    opcList[i - 1].Value = Value.ToString();
                    opcList[i - 1].Time = Convert.ToDateTime(TimeStamps.GetValue(i));
                }
            }
        }
    }
}

上一篇:OPC协议


下一篇:工业物联网之设备云控2 OPC中间件程序