栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

OPCautomation异步读取数据时返回的值顺序错乱!解决

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OPCautomation异步读取数据时返回的值顺序错乱!解决

测试代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OPCAutomation;
using System.Net;
using System.Runtime.CompilerServices;
using System.Threading;

namespace OPCtest
{
    class Program
    {

        static void Main(string[] args)
        {
            OPCServer opcServer;
            OPCGroup opcGroup;
            OPCGroups opcGroups;
            OPCItems opcItems;
            OPCBrowser opcBrowser;
            List HostNameList = new List();
            Thread thread = new Thread(() =>
            {
                IPHostEntry iPHostEntry = Dns.GetHostEntry(Environment.MachineName);
                foreach (var item in iPHostEntry.AddressList)
                {
                    string str = Dns.GetHostEntry(item.ToString()).HostName;
                    if (!HostNameList.Contains(str))
                    {
                        HostNameList.Add(str);
                    }
                }
               // Console.WriteLine("[Get the HostName success]");
            });
            thread.Start();




            //=========================================初始化opcserver 得到本地服务器名字
            //initialize server
            opcServer = new OPCServer();
            Console.WriteLine("1.Initialize server success");
            //get the Servers array
            object ServerArray = opcServer.GetOPCServers("DESKTOP-RPEHIEB");
            Console.WriteLine("2.Get serverArray success r");
            //connect server
            foreach (string item in (Array)ServerArray)
            {
                Console.WriteLine(item);
            }


            //===========================================连接kepserver服务器
            opcServer.Connect("Kepware.KEPServerEX.V5", "DESKTOP-RPEHIEB");
            Console.WriteLine("Server connect success");

            //===========================================OPCgroups赋值
            opcGroups = opcServer.OPCGroups;
            opcGroups.DefaultGroupDeadband = 0;//死区 设为0时,服务器端该组内任何数据变化都通知组
            opcGroups.DefaultGroupIsActive = true;

            opcGroup = opcGroups.Add("1");
            opcGroup.IsActive = true;
            opcGroup.IsSubscribed = true;
            opcGroup.UpdateRate = 250;
            opcGroup.AsyncReadComplete += AsyncReadHandler;

            opcBrowser = opcServer.CreateBrowser();
            opcBrowser.ShowBranches();
            opcBrowser.ShowLeafs(true);

            //==========================================================

            opcItems = opcGroup.OPCItems;

            int num = 3;
            Array itemsIDs;
            Array clientHandles;
            Array outServerHandles;
            Array outErrors;

            List clientHandlesList = new List();
            clientHandlesList.Add(0);
            clientHandlesList.Add(1001);
            clientHandlesList.Add(1002);
            clientHandlesList.Add(1003);
            clientHandles = clientHandlesList.ToArray();

            List itemsIDsList = new List();
            itemsIDsList.Add(" ");
            itemsIDsList.Add("Modbus.Device1.k");
            itemsIDsList.Add("Modbus.Device1.k1");
            itemsIDsList.Add("Modbus.Device1.k2");
            itemsIDs = itemsIDsList.ToArray();
            opcItems.AddItems(num, ref itemsIDs, ref clientHandles, out outServerHandles, out outErrors);//get handles

            List ServerHandlesList = new List();
            ServerHandlesList.Add(0);
            foreach (object item in outServerHandles)//返回的句柄
            {
                ServerHandlesList.Add(Convert.ToInt32(item));
                Console.WriteLine("handles:"+Convert.ToInt32(item));
            }
            Array errors;
            int transactionID = 666;
            int outCancelID;
            opcGroup.AsyncRead(num,ref outServerHandles,out errors,transactionID,out outCancelID);
        }

        private static void AsyncReadHandler(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps, ref Array Errors)
        {
            Console.WriteLine("num:" + NumItems);
            Console.WriteLine("rHandles:");
            foreach (object item in ClientHandles)
            {
                Console.Write(Convert.ToInt32(item) + "     ");
            }
            Console.WriteLine("");
            Console.WriteLine("Values:");
            foreach (object item in ItemValues)
            {
                Console.Write(item.ToString() + "    ");
            }
            Console.WriteLine("");
            Console.WriteLine("Times:");
            foreach (object item in TimeStamps)
            {
                Console.Write(((DateTime)item) + "     ");
            }
        }
    }
}

返回的代码:

对比可以发现,每个数据的值都是跟我们发送请求数据的句柄相捆绑的,所以要加一些判断对号入座,整理返回的数据;这就ok了!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/955015.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号