Ejemplo n.º 1
0
        public void AsyncRead()
        {
            Array Errors;
            int   cancelID;

            try
            {
                KepGroup.AsyncRead(KeyItemServerHandles.Length, ref KeyItemServerHandles, out Errors, 2009, out cancelID);
            }
            catch (Exception exp1)
            {
            }
        }
Ejemplo n.º 2
0
 public void ReadValue(string tagName, bool wtf)
 {
     try
     {
         OPCItem bItem         = _kepItems.GetOPCItem(_opcItemDic[tagName]);
         int[]   temp          = { 0, bItem.ServerHandle };
         Array   serverHandles = temp;
         KepGroup.AsyncRead(1, ref serverHandles, out Array errors, 2009, out int cancel);
         GC.Collect();
     }
     catch (Exception)
     {
         throw;
     }
 }
Ejemplo n.º 3
0
        void Read(string u1, int u2)                                            //读方法
        {
            _kepItem         = _kepItems.AddItem(u1, u2);
            _itmHandleServer = _kepItem.ServerHandle;
            //OPCItem bItem = _kepItems.GetOPCItem(_itmHandleServer);
            var bItem = _kepItems.GetOPCItem(_itmHandleServer);
            var temp  = new[] { 0, bItem.ServerHandle };
            //Array serverHandles = (Array)temp;
            var   serverHandles = (Array)temp;
            Array errors;
            int   cancelId;

            _kepGroup.AsyncRead(1, ref serverHandles, out errors, 2009, out cancelId);
            GC.Collect();
        }
Ejemplo n.º 4
0
        public static void ReadValue(string tagName, bool wtf)
        {
            GetTagValue(tagName);
            int     aa    = itmHandleServer;
            OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;
            Array Errors;
            int   cancel;

            KepGroup.AsyncRead(1, ref serverHandles, out Errors, 2009, out cancel);
            GC.Collect();
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 第一次加载分支根据句柄读取数据
        /// </summary>
        /// <param name="handle">分支句柄</param>
        /// <param name="opcItems"></param>
        /// <param name="opcGroup"></param>
        /// <param name="bindingData"></param>
        /// <param name="serviceDic"></param>
        private void ReadOpcValue(int handle, OPCItems opcItems, OPCGroup opcGroup, List <OpcData> bindingData, Dictionary <int, string> serviceDic)
        {
            OPCItem bItem = opcItems.GetOPCItem(handle);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;
            Array Errors;
            int   cancelID;

            opcGroup.AsyncRead(1, ref serverHandles, out Errors, 2009, out cancelID);
            //OpcData data = bindingData.FirstOrDefault(x => x.OpcName == serviceDic[handle]);
            //data.OpcValue = bItem.Value.ToString();
            //data.OpcTime = DateTime.Now.ToString();
        }
Ejemplo n.º 6
0
        private void ReadOPCValue(int handle)
        {
            OPCItem bItem = _opcItems.GetOPCItem(handle);

            int[] temp = new int[2] {
                0, bItem.ServerHandle
            };
            Array serverHandles = (Array)temp;
            Array Errors;
            int   cancelID;

            _opcGroup.AsyncRead(1, ref serverHandles, out Errors, 2009, out cancelID);
            OpcData data = _bindingData.FirstOrDefault(x => x.OpcName == _serviceDic[handle]);

            data.OpcValue = bItem.Value.ToString();
            data.OpcTime  = DateTime.Now.ToString();
            Log.Info($"ReadOPCValue读取数据。。。{data.OpcName}-{data.OpcValue}-{ data.OpcTime}");
        }
Ejemplo n.º 7
0
 public void AsyncRead(string[] sItemsID, string sGroupName, int iTransactionID, out Array Result)
 {
     try
     {
         int   iNumItem       = sItemsID.Length;
         int[] iServerHandler = GetServerHandles(sItemsID);
         Array aServerHandler = (Array)iServerHandler;
         Array aError;
         //int iTransactionID = 299;
         int iCanceID;
         KepGroup = KepGroups.GetOPCGroup(sGroupName);
         KepGroup.AsyncRead(iNumItem, aServerHandler, out aError, iTransactionID, out iCanceID);
         Result = aError;
     }
     catch
     {
         //Console.WriteLine("************** " + "AsyncRead Error" + " **************");
         Result = null;
     }
 }
Ejemplo n.º 8
0
        public string AsyncReadTagValue(string tag)
        {
            try
            {
                Array Errors;
                if (itmHandleClientReadData != 0)
                {
                    OPCItem bItem = KepItemsRead.GetOPCItem(itmHandleServerReadData);
                    //注:OPC中以1为数组的基数
                    int[] temp = new int[2] {
                        0, bItem.ServerHandle
                    };
                    Array serverHandle = (Array)temp;
                    //移除上一次选择的项
                    KepItemsRead.Remove(KepItemsRead.Count, ref serverHandle, out Errors);
                }
                itmHandleClientReadData = Array.IndexOf(tagList, tag) + 1;
                KepItemRead             = KepItemsRead.AddItem(tag, itmHandleClientReadData);
                itmHandleServerReadData = KepItemRead.ServerHandle;

                OPCItem bItem_ = KepItemsRead.GetOPCItem(itmHandleServerReadData);
                int[]   temp_  = new int[2] {
                    0, bItem_.ServerHandle
                };
                Array serverHandles = (Array)temp_;
                int   cancelID;
                //KepGroupReadData.AsyncWrite(1, ref serverHandles, ref values, out Errors, 2009, out cancelID);
                KepGroupReadData.AsyncRead(1, ref serverHandles, out Errors, 2018, out cancelID);
                GC.Collect();
                return("OK");
            }
            catch (Exception err)
            {
                return(err.Message);
            }
        }
Ejemplo n.º 9
0
        private void GetSeqences(Plc plc)
        {
            Array ItemIDs  = Array.CreateInstance(typeof(string), 61);
            Array ClntHndl = Array.CreateInstance(typeof(int), 61);

            Array  SvrHndl;
            Array  SvrErr;
            Array  Values;
            object qual = new object();
            object TS   = new object();
            string tag  = "";

            try
            {
                for (int i = 1; i <= 30; i++)
                {
                    switch (type)
                    {
                    case OPCType.Kepware:

                        tag = $"{plc.Tag}.ZZSEQ[{(i).ToString()}].SA";
                        ItemIDs.SetValue(tag, i);
                        tag = $"{plc.Tag}.ZZSEQ[{(i).ToString()}].DESC.DATA/8";
                        ItemIDs.SetValue(tag, i + 30);
                        break;

                    case OPCType.Matrikon:
                        tag = $"{plc.Tag}:PLC:SCADA_CONFIG:ZZSEQ[{(i).ToString()}].SEQ.VALUE";
                        ItemIDs.SetValue(tag, i);
                        //"A3_01_R01_S01: PLC: SCADA_CONFIG: ZZMISSEQ[1].DESC.VALUE"
                        tag = $"{plc.Tag}:PLC:SCADA_CONFIG:ZZSEQ[{(i).ToString()}].DESC.VALUE";
                        ItemIDs.SetValue(tag, i + 30);
                        break;
                    }

                    ClntHndl.SetValue(i, i);
                    ClntHndl.SetValue(i + 30, i + 30);
                }

                oGroup.OPCItems.AddItems(60, ref ItemIDs, ref ClntHndl, out SvrHndl, out SvrErr);
                if (this.Sync)
                {
                    oGroup.SyncRead((short)OPCAutomation.OPCDataSource.OPCDevice, 60, ref SvrHndl, out Values, out SvrErr, out qual, out TS);

                    string zone = "ZONE" + plc.ID.ToString("00");

                    for (int j = 1; j <= 30; j++)
                    {
                        double ms   = double.Parse(Values.GetValue(j).ToString());
                        string desc = Values.GetValue(j + 30).ToString();
                        if (ms > 0)
                        {
                            Sequence s = plc.AddSequence(j, zone, ms, desc);
                            NewSeq?.Invoke(plc, s);
                        }
                    }

                    oGroup.OPCItems.Remove(60, ref SvrHndl, out SvrErr);
                }
                else
                {
                    int ic;
                    oGroup.AsyncRead(60, ref SvrHndl, out SvrErr, plc.ID, out ic);
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.ToString()); }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 异步读取多个Item
        /// </summary>
        /// <param name="itemName"></param>
        public void AsyncReadItems(List <string> ItemName)
        {
            try
            {
                if (itmHandleClientList.Count > 0)
                {
                    TagValueList.Clear();
                    QualitiesList.Clear();
                    TimeStampsList.Clear();

                    Array          Errors;
                    List <OPCItem> bItem = new List <OPCItem>();
                    foreach (int itmHandleServer in itmHandleServerList)
                    {
                        bItem.Add(KepItems.GetOPCItem(itmHandleServer));
                    }
                    //注:OPC中以1为数组的基数
                    int[] temp = new int[bItem.Count + 1];
                    temp[0] = 0;
                    for (int i = 1; i < temp.Length; i++)
                    {
                        temp[i] = bItem[i - 1].ServerHandle;
                    }
                    Array serverHandle = (Array)temp;
                    //移除上一次选择的项
                    KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);
                    itmHandleClientList.Clear();
                    itmHandleServerList.Clear();
                }
                for (int i = 0; i < ItemName.Count; i++)
                {
                    itmHandleClientList.Add(1234 + i);
                    KepItem = KepItems.AddItem(ItemName[i], 1234 + i);
                    if (KepItem != null)
                    {
                        itmHandleServerList.Add(KepItem.ServerHandle);
                        QueryTime     = DateTime.Now;
                        QueryTimeBool = true;
                    }
                }
                int[] temp1 = new int[itmHandleServerList.Count + 1];
                temp1[0] = 0;
                for (int i = 1; i < temp1.Length; i++)
                {
                    temp1[i] = itmHandleServerList[i - 1];
                }
                Array serverHandles = (Array)temp1;
                Array _Errors;
                int   cancelID;
                KepGroup.AsyncRead(itmHandleClientList.Count, ref serverHandles, out _Errors, 1, out cancelID);//第一参数为item数量
            }
            catch (Exception)
            {
                //没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。
                itmHandleClient = 0;
                TagValue        = "Error ox";
                Qualities       = "Error ox";
                TimeStamps      = "Error ox";
                //MessageBox.Show("保留项2错误!\n" + err);
            }
        }
        //测试用工作方法
        public void work()
        {
            //初始化item数组
            MyItem  = new OPCItem[4];
            MyItem2 = new OPCItem[4];

            GetLocalServer();
            //ConnectRemoteServer("TX1", "KEPware.KEPServerEx.V4");//用计算机名的局域网
            //ConnectRemoteServer("192.168.1.35", "KEPware.KEPServerEx.V4");//用IP的局域网
            if (ConnectRemoteServer("", "KEPware.KEPServerEx.V4"))//本机
            {
                if (CreateGroup())
                {
                    Thread.Sleep(500);              //暂停线程以让DataChange反映,否则下面的同步读可能读不到
                    //以下同步写
                    MyItem[3].Write("I love you!"); //同步写
                    MyItem[2].Write(true);          //同步写
                    MyItem[1].Write(-100);          //同步写
                    MyItem[0].Write(120);           //同步写

                    //以下同步读
                    object ItemValues;  object Qualities; object TimeStamps;          //同步读的临时变量:值、质量、时间戳
                    MyItem[0].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2
                    int q0 = Convert.ToInt32(ItemValues);                             //转换后获取item值
                    MyItem[1].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2
                    int q1 = Convert.ToInt32(ItemValues);                             //转换后获取item值
                    MyItem[2].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2
                    bool q2 = Convert.ToBoolean(ItemValues);                          //转换后获取item值
                    MyItem[3].Read(1, out ItemValues, out Qualities, out TimeStamps); //同步读,第一个参数只能为1或2
                    string q3 = Convert.ToString(ItemValues);                         //转换后获取item值,为防止读到的值为空,不用ItemValues.ToString()

                    Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
                    Console.WriteLine("0-{0},1-{1},2-{2},3-{3}", q0, q1, q2, q3);

                    //以下为异步写
                    //异步写时,Array数组从下标1开始而非0!
                    int[]    temp          = new int[] { 0, MyItem[0].ServerHandle, MyItem[1].ServerHandle, MyItem[2].ServerHandle, MyItem[3].ServerHandle };
                    Array    serverHandles = (Array)temp;
                    object[] valueTemp     = new object[5] {
                        "", 255, 520, true, "Love"
                    };
                    Array values = (Array)valueTemp;
                    Array Errors;
                    int   cancelID;
                    MyGroup.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);//第一参数为item数量
                    //由于MyGroup2没有订阅,所以以下这句运行时将会出错!
                    //MyGroup2.AsyncWrite(4, ref serverHandles, ref values, out Errors, 1, out cancelID);

                    //以下异步读
                    MyGroup.AsyncRead(4, ref serverHandles, out Errors, 1, out cancelID);//第一参数为item数量


                    /*MyItem[0] = MyItems.AddItem("BPJ.Db1.dbb96", 0);//byte
                    *  MyItem[1] = MyItems.AddItem("BPJ.Db1.dbw10", 1);//short
                    *  MyItem[2] = MyItems.AddItem("BPJ.Db16.dbx0", 2);//bool
                    *  MyItem[3] = MyItems.AddItem("BPJ.Db11.S0", 3);//string*/



                    Console.WriteLine("************************************** hit <return> to Disconnect...");
                    Console.ReadLine();
                    //释放所有组资源
                    MyServer.OPCGroups.RemoveAll();
                    //断开服务器
                    MyServer.Disconnect();
                }
            }


            //END
            Console.WriteLine("************************************** hit <return> to close...");
            Console.ReadLine();
        }