Ejemplo n.º 1
0
 public void  SyncRead(string[] sItemsID, string sGroupName, out Array Value, out object Qualities, out object TimeStamps, out Array Result)
 {
     try
     {
         int    iNumItem       = sItemsID.Length;
         int[]  iServerHandler = GetServerHandles(sItemsID);
         Array  aServerHandler = (Array)iServerHandler;
         Array  aValue;
         Array  aError;
         object oQualities;
         object oTimeStamps;
         KepGroup = KepGroups.GetOPCGroup(sGroupName);
         KepGroup.SyncRead(1, iNumItem, aServerHandler, out aValue, out aError, out oQualities, out oTimeStamps);
         //Console.WriteLine($"lKepItem:{ sItemsID[0]},{(int)aValue.GetValue(0)},{Qualities},{ TimeStamps}");
         //Console.WriteLine($"lKepItem:{(int)aValue.GetValue(0)}");
         Value      = aValue;
         Qualities  = oQualities;
         TimeStamps = oTimeStamps;
         Result     = aError;
     }
     catch
     {
         // Console.WriteLine("************** " + "SyncRead Error" + " **************");
         Value      = null;
         Qualities  = null;
         TimeStamps = null;
         Result     = null;
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// 读取数据,成功返回值,失败返回null
        /// </summary>
        public Array ReadData(int[] handle)
        {
            try
            {
                int   count = handle.Length;
                int[] temp  = new int[count + 1];
                temp[0] = 0;
                for (int i = 1; i < temp.Length; i++)
                {
                    temp[i] = handle[i - 1];
                }
                Array  serverHandles = (Array)temp;
                Array  values;
                Array  Errors;
                object Qualities;
                object TimeStamps;
                //OPCAutomation.OPCDataSource.OPCCache;
                //这两种在断开的情况下,都不会引发异常,但是Qualities会将为0,如果正常读取下会是192等非0情况。
                s7Group.SyncRead(1, count, ref serverHandles, out values, out Errors, out Qualities, out TimeStamps);
                //object ItemValues = null;
                //s7Group.OPCItems.GetOPCItem(handle[0]).Read(1, out ItemValues, out Qualities, out TimeStamps);

                return(values);
            }
            catch (Exception err)
            {
                return(null);
            }
        }
Ejemplo n.º 3
0
        public Array kep_read()
        {
            kepvalue = new Array[KepItems.Count];
            keperr   = new Array[KepItems.Count];
            Array handle2 = (Array)Item_serverhandle1_To_PC;

            KepGroup.SyncRead(1, KepItems.Count, ref handle2, out kepvalue, out keperr, out kepqua, out kepstamp);
            return(kepvalue);
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 读取数据,成功返回值,失败返回null
 /// 按照 OPC 规范,数组始终以索引 1 开始。
 /// </summary>
 public BllResult ReadData(int[] handle, List <EquipmentProp> equipmentProps)
 {
     try
     {
         int   count = handle.Length;
         int[] temp  = new int[count + 1];
         temp[0] = 0;
         for (int i = 1; i < temp.Length; i++)
         {
             temp[i] = handle[i - 1];
         }
         Array  serverHandles = (Array)temp;
         Array  values;
         Array  Errors;
         object Qualities;
         object TimeStamps;
         //OPCAutomation.OPCDataSource.OPCCache;
         s7Group.SyncRead(1, count, ref serverHandles, out values, out Errors, out Qualities, out TimeStamps);
         var a = (Array)Qualities;
         for (int i = 1; i < serverHandles.Length; i++)
         {
             var prop = equipmentProps.Find(t => t.ServerHandle == (int)serverHandles.GetValue(i));
             if ((Int16)a.GetValue(i) == 0)
             {
                 //读取失败,获取默认值
                 prop.Value = GetDefaultValue(prop);
             }
             else
             {
                 //读取成功
                 if (!Enum.TryParse(prop.EquipmentTypeTemplate.DataType, out PLCDataType dataType))
                 {
                     return(BllResultFactory.Error($"未识别的数据类型:{prop.EquipmentTypeTemplate.DataType}"));
                 }
                 else
                 {
                     var result = TransforAddressDataToWCSData(dataType, values.GetValue(i));
                     if (!result.Success)
                     {
                         return(BllResultFactory.Error(null, $"读取PLC地址时:属性{prop.EquipmentTypeTemplate};错误消息:{result.Msg}"));
                     }
                     prop.Value = result.Data;
                 }
             }
         }
         return(BllResultFactory.Sucess());
     }
     catch (Exception err)
     {
         return(BllResultFactory.Error(err.Message));
     }
 }
Ejemplo n.º 5
0
        private void btnWriteDb_Click(object sender, EventArgs e)
        {
            if (listboxAlias.SelectedIndex < 0)
            {
                MessageBox.Show("未选中变量!", "提示信息");
            }
            else
            {
                try
                {
                    //注意array在函数内部做参数时,数据下标是从1开始的所以要考虑将第0位空出来,n个Item,就要定义n+1列数组,添加一个0,但在函数使用时,又是从左开始读取的。(针对opc)
                    //否则会报错
                    OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);
                    int[]   temp  = new int[2] {
                        0, bItem.ServerHandle
                    };
                    Array  serverHandles = (Array)temp;
                    Array  values;
                    Array  Errors;
                    object qualities;
                    object timeStamps;
                    KepGroup.SyncRead(1, 1, ref serverHandles, out values, out Errors, out qualities, out timeStamps);

                    bool   result   = (Errors.GetValue(1).ToString() == "0") ? true : false;
                    object tagValue = values.GetValue(1);

                    if (result)
                    {
                        int addResult = TagDataOper.Add(new TagData()
                        {
                            ServerName = txtServerName.Text,
                            AliasName  = listboxAlias.SelectedItem.ToString(),
                            TagValue   = tagValue.ToString()
                        });
                        if (addResult == 1)
                        {
                            MessageBox.Show("入库成功!", "提示信息");
                        }
                        else
                        {
                            MessageBox.Show("入库失败!", "提示信息");
                        }
                    }
                    GC.Collect();
                }
                catch (Exception err)
                {
                }
            }
        }
Ejemplo n.º 6
0
        public string SyncReadTagValue(string tag, out Array outValues, out object qualities, out object timeStamps)
        {
            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_;

                short src = (short)OPCDataSource.OPCDevice;
                KepGroupReadData.SyncRead(src, 1, ref serverHandles, out outValues, out Errors, out qualities, out timeStamps);
                return("OK");
            }
            catch (Exception err)
            {
                outValues  = null;
                qualities  = null;
                timeStamps = null;
                return(err.Message);
            }
        }
Ejemplo n.º 7
0
        public HashSet <TagItem> getTagsValues()
        {
            object oObject1, oObject2;

            oHashSetTagsValues.Clear();
            bool bError = false;

            try {
                if ((this.bConnect) && (this.nOPCItemsCount > 0))
                {
                    oOpcGroupNames.SyncRead((short)OPCAutomation.OPCDataSource.OPCDevice, this.nOPCItemsCount, ref oItemServerHandles, out oItemServerValues, out oItemServerErrors, out oObject1, out oObject2);

                    for (int i = 1; ((i <= this.nOPCItemsCount) && (!bError)); i++)
                    {
                        if (((int)oItemServerErrors.GetValue(i)) != 0)
                        {
                            bError = true;
                        }
                    }

                    if (!bError)
                    {
                        for (int i = 1; i <= this.nOPCItemsCount; i++)
                        {
                            TagItem oTagItem = new TagItem((string)oOPCItemIDs.GetValue(i));
                            oTagItem.setValue(oItemServerValues.GetValue(i).ToString());

                            oHashSetTagsValues.Add(oTagItem);
                        }
                    }
                }
            } catch (Exception) {
                oHashSetTagsValues.Clear();
            }

            return(oHashSetTagsValues);
        }
Ejemplo n.º 8
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.º 9
0
        public void TestOPCGroupSyncRead()
        {
            string    progID     = "Insat";
            int       errorCount = 0;
            OPCServer server     = OPCServer.FindServerByProgID(progID, "localhost");

            server.Connect();
            List <OPCItem> items       = server.GetItems();
            var            opcBranches = from item in items
                                         where item.ItemType == OPCItemType.BRANCH
                                         let leaves = from elem in items
                                                      where elem.ItemType == OPCItemType.LEAF
                                                      where elem.Parent != null && elem.Parent.ItemName == item.ItemName
                                                      select elem
                                                      where leaves.Count() > 0
                                                      where !item.ItemName.Contains("МВ110")
                                                      select item;

            foreach (OPCItem branch in opcBranches)
            {
                string groupName = branch.ItemID;
                var    opcItems  = from item in items
                                   where item.ItemType == OPCItemType.LEAF
                                   where item.Parent != null
                                   where item.Parent.ItemName == branch.ItemName
                                   select item;
                List <OPCItem> list      = new List <OPCItem>(opcItems);
                uint           udateRate = 100;
                OPCGroup       group     = new OPCGroup(name: groupName, items: list)
                {
                    UpdateRate = udateRate
                };
                Assert.AreEqual(groupName, group.Name);
                Assert.AreSame(list, group.Items);
                Assert.AreEqual(udateRate, group.UpdateRate);
                group.RegInServer(server);
                try
                {
                    group.SyncRead();
                }
                catch (ServerException ex)
                {
                    string msg;
                    //Запрашиваем у сервера текст ошибки, соответствующий текущему HRESULT
                    server.Server.GetErrorString(ex.HResult, 2, out msg);
                    //Показываем сообщение ошибки
                    Console.Out.WriteLine(msg, "Ошибка");
                }
                List <string> results1 = new List <string>(group.Items.Select(i => i.TimeStamp ?? "1"));
                System.Threading.Thread.Sleep(1000);
                try
                {
                    group.SyncRead();
                }
                catch (ServerException ex)
                {
                    string msg;
                    //Запрашиваем у сервера текст ошибки, соответствующий текущему HRESULT
                    server.Server.GetErrorString(ex.HResult, 2, out msg);
                    //Показываем сообщение ошибки
                    Console.Out.WriteLine(msg, "Ошибка");
                }
                List <string> results2 = new List <string>(group.Items.Select(i => i.TimeStamp ?? "2"));
                Assert.AreEqual(results1.Count, results2.Count);
                Assert.AreNotEqual(results1[1], results2[1]);
                group.RemoveFromServer();
                try
                {
                    group.SyncRead();
                }
                catch (ServerException ex)
                {
                    errorCount++;
                    string msg;
                    //Запрашиваем у сервера текст ошибки, соответствующий текущему HRESULT
                    server.Server.GetErrorString(ex.HResult, 2, out msg);
                    //Показываем сообщение ошибки
                    Console.Out.WriteLine(msg, "Ошибка");
                }
            }
            Assert.AreEqual(errorCount, opcBranches.Count());
            server.Disconnect();
        }
Ejemplo n.º 10
0
        // 枚举 OPC 服务器中所有标签
        private void BuildGroupsAndTags()
        {
            _client.OPCGroups.DefaultGroupIsActive   = true;
            _client.OPCGroups.DefaultGroupDeadband   = _defaultGroupDeadband;
            _client.OPCGroups.DefaultGroupUpdateRate = _updateRate;

            // 准备批量创建节点
            List <string> listItemIds       = new List <string>();
            List <int>    listClientHandles = new List <int>();
            int           itemHandle        = 1;
            int           itemCount         = 0;

            // 批量创建时, 数组标号从 1 开始, 0 位无用
            listItemIds.Add("");
            listClientHandles.Add(0);

            // 枚举节点
            OPCBrowser opcBrowser = _client.CreateBrowser();

            opcBrowser.ShowBranches();
            opcBrowser.ShowLeafs(true);
            foreach (object turn in opcBrowser)
            {
                string name = turn.ToString();
                if (string.IsNullOrEmpty(name))
                {
                    continue;
                }

                // 过滤系统变量
                if (name.StartsWith("_") || name.IndexOf("._") > 0)
                {
                    continue;
                }

                listItemIds.Add(name);
                listClientHandles.Add(itemHandle++);
                itemCount++;
            }

            // 创建组和节点
            _group = _client.OPCGroups.Add("RootGroup");
            Array itemIds       = listItemIds.ToArray();
            Array clientHandles = listClientHandles.ToArray();

            _group.OPCItems.AddItems(itemCount, ref itemIds, ref clientHandles, out Array serverHandles, out Array errors);

            // 创建标签
            for (int i = 1; i < itemCount + 1; i++)
            {
                string itemName     = Convert.ToString(itemIds.GetValue(i));
                int    clientHandle = Convert.ToInt32(clientHandles.GetValue(i));
                int    serverHandle = Convert.ToInt32(serverHandles.GetValue(i));

                OpcTag opcTag = new OpcTag(itemName, clientHandle, serverHandle);

                lock (_tagNamedIndex)
                    _tagNamedIndex[itemName] = opcTag;

                lock (_tagClientHandleIndex)
                    _tagClientHandleIndex[clientHandle] = opcTag;

                lock (_tagServerHandleIndex)
                    _tagServerHandleIndex[serverHandle] = opcTag;
            }

            // 启用订阅
            _group.IsSubscribed = true;
            _group.DataChange  += OnDataChange;

            // 从客户端缓存读取一次, 获取初始值
            itemCount = _group.OPCItems.Count;
            _group.SyncRead((short)OPCDataSource.OPCCache, itemCount, ref serverHandles, out Array values, out errors, out object qualities, out object timeStamps);
            for (int i = 1; i < itemCount + 1; i++)
            {
                int    serverHandle = Convert.ToInt32(serverHandles.GetValue(i));
                OpcTag opcTag       = null;

                lock (_tagServerHandleIndex)
                    _tagServerHandleIndex.TryGetValue(serverHandle, out opcTag);
                if (opcTag == null)
                {
                    continue;
                }

                object   value     = values.GetValue(i);
                int      quality   = Convert.ToInt32(((Array)qualities).GetValue(i));
                DateTime timeStamp = Convert.ToDateTime(((Array)timeStamps).GetValue(i));

                opcTag.Set(value, quality, timeStamp);
            }

            // 从设备异步读取一次
            _group.AsyncRefresh((short)OPCDataSource.OPCDevice, 1001, out int cancelId);
        }
Ejemplo n.º 11
0
        /// <summary>Tags list from OPC.</summary>
        public IList <O2SOPCTag> ReadData()
        {
            try
            {
                // Checking OPC connection

                if (!Connected)
                {
                    Connected = InitOPC();
                }
                if (!Connected)
                {
                    return(null);
                }

                // Reading tags

                int    count    = _OPCGroup.OPCItems.Count;
                int[]  arH      = new int[1 + count];
                Array  arValues = new object[1 + count];
                Array  arHandles;
                Array  arErrors;
                object Qualities;
                object Timestamps;

                int i = 0;
                foreach (OPCItem item in _OPCGroup.OPCItems)
                {
                    arH[++i] = item.ServerHandle;
                }
                arHandles = (Array)arH;

                _OPCGroup.SyncRead(
                    (short)OPCDataSource.OPCDevice,
                    count,
                    ref arHandles,
                    out arValues,
                    out arErrors,
                    out Qualities,
                    out Timestamps);

                Logger.Info("-----------------------------------");
                Logger.Info("Чтение OPC тэгов");

                float _value;
                int   _error;
                int   _quality;
                int   h;
                //string ss;
                DateTime  _timestamp;
                O2SOPCTag _tag;
                for (i = 1; i <= count; i++)
                {
                    _value = Convert.ToSingle(arValues.GetValue(i));
                    //ss = arValues.GetValue(i).ToString();
                    _error     = Convert.ToInt32(arErrors.GetValue(i));
                    _quality   = Convert.ToInt32((Qualities as Array).GetValue(i));
                    _timestamp = Convert.ToDateTime((Timestamps as Array).GetValue(i));
                    h          = TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).Hours;
                    _timestamp = _timestamp.AddHours(h);

                    _tag           = Tags[i - 1];
                    _tag.Value     = _value;
                    _tag.ReadError = _error;
                    _tag.Quality   = _quality;
                    _tag.Timestamp = _timestamp;
                    Tags[i - 1]    = _tag;

                    string s = "------ " + _tag.Name;
                    Logger.Info(s);
                    Logger.Info("timestamp = " + _timestamp);
                    Logger.Info("value     = " + _value);
                    //Logger.Info("string    = " + ss);
                    Logger.Info("error     = " + _error);
                    Logger.Info("quality   = " + _quality);
                }
            }
            catch (Exception er)
            {
                Connected = false;
                Logger.Error(er);
            }

            //return Tags.Select(item => (O2SOPCTag)item.Clone());
            return(new List <O2SOPCTag>(Tags));
        }
Ejemplo n.º 12
0
        void ReadItems(OPCGroup ObjOPCGroup)
        {
            //READ ITEMS
            object qualities;
            object timestamp;

            try
            {
                if (CurrentPLCOutput == null)
                {
                    CurrentPLCOutput = new PLCOutput();
                }

                while (!stopThreads)
                {
                    //DA SE NAJDE DOBAR NACIN ZA CITANJE NA TAGOVITE SO SERVER HANDLES
                    ObjOPCGroup.SyncRead((short)OPCAutomation.OPCDataSource.OPCDevice,
                                         tagIndexReader - 1,
                                         ref readerItemServerHandles,
                                         out ItemServerReadValues,
                                         out readerItemServerErrors,
                                         out qualities,
                                         out timestamp);
                    string message = "";
                    for (int i = 1; i <= Globals.GetTotalNumberOfOutputTags(); i++)
                    {
                        int index = Globals.OUTPUT_TAGS.FirstOrDefault(x => x.Name == "iPLC_STATUS").Index;
                        if (index == i)
                        {
                            CurrentPLCOutput.iPlc_Status = (int)ItemServerReadValues.GetValue(i);
                        }

                        //vaka i za drugite nadolu, nemoj so switch

                        //switch (i)
                        //{
                        //    case CurrentPLCOutput.indexes.IndexOf("iPLC_STATUS"):
                        //        CurrentPLCOutput.iPlc_Status = (int)ItemServerReadValues.GetValue(i);
                        //        break;
                        //    //case 2:
                        //    //    CurrentTestOutput.output_bool = (bool)ItemServerReadValues.GetValue(i);
                        //    //    break;
                        //    //case 4:
                        //    //    CurrentTestOutput.output_int = (int)ItemServerReadValues.GetValue(i);
                        //    //    break;
                        //    //case 5:
                        //    //    CurrentTestOutput.output_random = (int)ItemServerReadValues.GetValue(i);
                        //    //    break;
                        //    default:
                        //        break;
                        //}
                        Workflow.plcOutputs.Add(CurrentPLCOutput);
                        message = message + i.ToString() + ": " + ItemServerReadValues.GetValue(i).ToString() + "\t";
                    }

                    //message = message + " " + ((Array)timestamp).GetValue(1).ToString() + " " + ((Array)timestamp).GetValue(2).ToString() + " " + ((Array)timestamp).GetValue(3).ToString();
                    Console.WriteLine(message);
                    //Workflow.LogMessage(message);
                    //UPDATE WORKFLOW.VENDORS.ROBOT.ORDER.STATUS with OPC STATUSES!!! np tests
                    //}

                    /*
                     * foreach (Vendor vendor in Workflow.vendors)
                     * {
                     *  vendor.robot.test1 = ItemServerReadValues.GetValue(1).ToString();
                     *  vendor.robot.test2 = ItemServerReadValues.GetValue(2).ToString();
                     *  vendor.robot.test3 = ItemServerReadValues.GetValue(3).ToString();
                     * }
                     */


                    System.Threading.Thread.Sleep(500);
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                throw;
            }
        }
Ejemplo n.º 13
0
        public override void RunOnce()
        {
            _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : RunOnce вход");

            //Создадим соединение
            if (!Connect())
            {
                throw new Exception("[" + this._name + "] : Ошибка подключения! ");
            }

            //Синхронный режим прямой вызов
            //--Тестовая секция--
            lock (lockThis)
            {
                _opcgrp.SyncRead((short)OPCDataSource.OPCDevice, _opcgrp.OPCItems.Count, _serverhandles, out _vals, out _errs, out _quality, out _dstmp);
            }
            for (int i = 0; i < _maps.GetLength(0); i++)
            {
                Tag tag = _server.GetTag(_maps[i, 0]);
                try
                {
                    if (_vals.GetValue(i) is byte[])
                    {
                        _vals.SetValue(ByteArrayToString((byte[])_vals.GetValue(i)), i);
                    }
                    else
                    {
                        tag.Value = _vals.GetValue(i);
                    }
                    tag.Timestamp = (DateTime)_dstmp;
                    tag.Quality   = (QualityType)Convert.ToInt32(_quality);
                    _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : " + _maps[i, 1] + "=" + tag.Value);
                }
                catch (Exception e)
                {
                    tag.Quality = QualityType.BAD;
                    _server.LogWrite(LogType.ERROR, "[" + this._name + "] : tag=" + _maps[i, 0] + ", opctag=" + _maps[i, 1] + ", ошибка: " + e.Message);
                }
                _server.SetTag(tag);
            }
            //--Тестовая секция--

            //--Рабочая секция--
            //for (int i = 0; i < _maps.GetLength(0); i++)
            //{

            //    Tag tag = _server.GetTag(_maps[i, 0]);
            //    try
            //    {
            //        lock (lockThis)
            //        {
            //            _opcitms[i].Read((short)OPCDataSource.OPCDevice, out _val, out _quality, out _dstmp);
            //        }
            //        if (_val is byte[])
            //            _val = ByteArrayToString((byte[])_val);
            //        else
            //            tag.Value = _val;
            //        tag.Timestamp = (DateTime)_dstmp;
            //        tag.Quality = (QualityType)Convert.ToInt32(_quality);
            //        _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : " + _maps[i, 1] + "=" + tag.Value);
            //    }
            //    catch (Exception e)
            //    {
            //        tag.Quality = QualityType.BAD;
            //        _server.LogWrite(LogType.ERROR, "[" + this._name + "] : tag=" + _maps[i, 0] + ", opctag=" + _maps[i, 1] + ", ошибка: " + e.Message);
            //    }
            //    _server.SetTag(tag);
            //}
            //--Рабочая секция--

            //Отключим соединение если не требуется хранить его
            Disconnect();
            _server.LogWrite(LogType.DEBUG, "[" + this._name + "] : RunOnce выход");
        }
Ejemplo n.º 14
0
 public Boolean GetData()
 {
     try
     {
         Transacting     = true;
         TransactionFlag = true;
         //for (; IntData.readingOPC; ) Thread.Sleep(10);
         if (IntData.IsOPCConnected)
         {
             object timestamps = new object(); //store the timestamp of the read
             object qualities  = new object();
             IntData.IsOPCConnected = true;
             opcgrp_server          = new OPCServer();
             opcgrp_server.Connect(ServerName);
             opcgrp_group    = opcgrp_server.OPCGroups.Add(GroupName);
             TotalItemNumber = opcgrp_arrayPaths.Length - 1;
             opcgrp_group.OPCItems.DefaultIsActive = true;
             opcgrp_group.OPCItems.AddItems(TotalItemNumber, opcgrp_arrayPaths, opcgrp_arrayHandles, out opcgrp_arraySHandles, out opcgrp_arrayErrors);
             opcgrp_group.SyncRead((short)OPCAutomation.OPCDataSource.OPCDevice, TotalItemNumber, ref opcgrp_arraySHandles, out opcgrp_arrayValues, out opcgrp_arrayErrors, out qualities, out timestamps);
             var qualitiesList = new List <int>();
             var errorsList    = new List <int>();
             foreach (var quality in (Array)qualities)
             {
                 qualitiesList.Add(Convert.ToInt32(quality));
             }
             foreach (var error in opcgrp_arrayErrors)
             {
                 errorsList.Add(Convert.ToInt32(error));
             }
             for (int i = 1; i <= TotalItemNumber; i++)
             {
                 OPCItems opcitem = new OPCItems();
                 opcitem         = (OPCItems)opcgrp_itemVar.GetValue(i);
                 opcitem.Quality = qualitiesList[i - 1];
                 //opcitem.Error = errorsList[i - 1];
                 if (opcgrp_arrayValues.GetValue(i) is System.Int32)
                 {
                     opcitem.Value = (int)opcgrp_arrayValues.GetValue(i);
                 }
                 else if (opcgrp_arrayValues.GetValue(i) is System.Double)
                 {
                     opcitem.Value = (double)opcgrp_arrayValues.GetValue(i);
                 }
                 else
                 {
                     opcitem.Value = opcgrp_arrayValues.GetValue(i).ToString();
                 }
                 if (opcitem.Quality == 0)
                 {
                     IntData.IsOPCConnected = false;
                     Quality = "Bad";
                 }
                 opcgrp_itemVar.SetValue(opcitem, i);
             }
             if (!IntData.IsOPCConnected)
             {
                 throw new Exception("The PLC connection is broken!");
             }
         }
         opcgrp_server.Disconnect();
         Transacting = false;
         //log.Success();
         return(true);
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex.Message);
         return(false);
     }
 }