Exemple #1
0
        public ResultSingleModel ReadSingleGroup(string hostip, Int32 port, string FC, string vargroup)
        {   //instance
            IedConnection con = new IedConnection();

            try
            {   //connection
                con.Connect(hostip, port);
                //exctract fc
                data_extract dataExtract  = new data_extract();
                var          FunctionCode = dataExtract.ExtractFC(FC);
                //read group
                MmsValue mmsresult = con.ReadValue(vargroup, FunctionCode);
                //con close
                con.Abort();

                //result list
                dynamic        ValueTuple = mmsresult;
                Read_Result    listresult = null;
                Int16          Quality;
                DateTimeOffset Timestamp;
                List <dynamic> valueArray = new List <dynamic>();

                if (mmsresult.GetType() == MmsType.MMS_STRUCTURE)
                {
                    if (mmsresult.Size() == 4)
                    {
                        ValueTuple = dataExtract.ExtractValue(mmsresult.GetElement(0));
                        Quality    = dataExtract.ExtractValue(mmsresult.GetElement(2));
                        Timestamp  = dataExtract.ExtractValue(mmsresult.GetElement(3));
                    }
                    else
                    {
                        ValueTuple = dataExtract.ExtractValue(mmsresult.GetElement(0));
                        Quality    = dataExtract.ExtractValue(mmsresult.GetElement(1));
                        Timestamp  = dataExtract.ExtractValue(mmsresult.GetElement(2));
                    }

                    listresult = new Read_Result
                    {
                        Address   = vargroup,
                        Value     = ValueTuple,
                        Quality   = Quality,
                        Timestamp = Timestamp
                    };
                }
                ResultSingleModel result = new ResultSingleModel()
                {
                    data         = listresult,
                    error        = false,
                    errormessage = null
                };
                //destroy instance
                con.Dispose();
                //result
                return(result);
            }
            catch (IedConnectionException e)
            {
                ResultSingleModel result = new ResultSingleModel()
                {
                    data         = null,
                    error        = true,
                    errormessage = e.Message.ToString()
                };
                //insert logs into db
                Submission dbinsert = new Submission
                {
                    CreatedAt = DateTime.Now,
                    Content   = e.Message.ToString()
                };
                _subSvc.Create(dbinsert);
                //destroy instance
                con.Dispose();
                //error result
                return(result);
            }
        }
Exemple #2
0
        public ResultMultipleModel ReadMultipleGroups(string hostip, Int32 port, string logicaldevicename, string[] vargroup)
        {   //instance
            IedConnection con = new IedConnection();

            try
            {   //connection
                con.Connect(hostip, port);
                //list variable group
                var variable_group = new List <string>();

                foreach (string address in vargroup)
                {
                    variable_group.Add(address);
                }
                //mms connecton
                MmsConnection mmsConnection = con.GetMmsConnection();
                //read data
                MmsValue mmsresult = mmsConnection.ReadMultipleVariables(logicaldevicename, variable_group);
                //connection close
                con.Abort();
                //result list
                data_extract   dataExtract = new data_extract();
                dynamic        ValueTuple  = null;
                Int16          Quality;
                DateTimeOffset Timestamp;
                Read_Result    listresult = null;

                List <Read_Result> Variableset = new List <Read_Result>();
                int i = 0;

                foreach (MmsValue address in mmsresult)
                {
                    if (address.Size() == 4)
                    {
                        ValueTuple = dataExtract.ExtractValue(address.GetElement(0));
                        Quality    = dataExtract.ExtractValue(address.GetElement(2));
                        Timestamp  = dataExtract.ExtractValue(address.GetElement(3));
                    }
                    else
                    {
                        ValueTuple = dataExtract.ExtractValue(address.GetElement(0));
                        Quality    = dataExtract.ExtractValue(address.GetElement(1));
                        Timestamp  = dataExtract.ExtractValue(address.GetElement(2));
                    }

                    listresult = new Read_Result
                    {
                        Address   = variable_group[i],
                        Value     = ValueTuple,
                        Quality   = Quality,
                        Timestamp = Timestamp
                    };
                    Variableset.Add(listresult);


                    i = i + 1;
                }

                ResultMultipleModel result = new ResultMultipleModel()
                {
                    data         = Variableset,
                    error        = false,
                    errormessage = null
                };
                //destroy instance
                con.Dispose();
                //result
                return(result);
            }
            catch (IedConnectionException e)
            {
                ResultMultipleModel result = new ResultMultipleModel()
                {
                    data         = null,
                    error        = true,
                    errormessage = e.Message.ToString()
                };

                //insert logs into db
                Submission dbinsert = new Submission
                {
                    CreatedAt = DateTime.Now,
                    Content   = e.Message.ToString()
                };
                _subSvc.Create(dbinsert);

                //destroy instance
                con.Dispose();
                //error result
                return(result);
            }
        }
        public Read_Result Read_Classic(string OPCURL, string UpdateInterval, string ItemIds)
        {
            try
            {
                Read_Result Read_Result = new Read_Result(); RegisteredTag NewRegisteredTag;
                if (ItemIds.IsNullOrWhiteSpace())
                {
                    return(Read_Result);
                }
                Opc.Da.Server ConnectedOPDAServer = ConnectToOPCServer(OPCURL);
                if (ConnectedOPDAServer == null)
                {
                    return new Read_Result()
                           {
                               success = false, result = null, error = "Fail to Connect to OPC Server '" + OPCURL + "'"
                           }
                }
                ;
                string[] ItemIdsSplit = ItemIds.Split(',');
                int      LastIndex    = ItemIdsSplit.Count() - 1;
                if (ItemIdsSplit[LastIndex].IsNullOrEmpty())
                {
                    ItemIdsSplit = ItemIdsSplit.RemoveAt(LastIndex);
                }
                if (ItemIdsSplit.Count() > 0)
                {
                    int UpdateIntervalInMS = UpdateInterval.ToInt(1000);
                    if (UpdateIntervalInMS < 250)
                    {
                        UpdateIntervalInMS = 250;
                    }
                    foreach (string ItemId in ItemIdsSplit)
                    {
                        //if (ItemId.IsNullOrWhiteSpace()) continue;
                        //Check if the Item has already been subscribed
                        if (this.RegisteredTags.TryGetValue(ItemId, out RegisteredTag FoundRegisteredTag))
                        {
                            //Straight forward case, simply obtain data
                            if (UpdateIntervalInMS >= FoundRegisteredTag.UpdateIntervalInMS)
                            {
                                FoundRegisteredTag.LastCalled = DateTime.Now;
                                Read_Result.result.Add(new DataValue(FoundRegisteredTag.Id, true, FoundRegisteredTag.TSUTC, FoundRegisteredTag.SourceTSUTC, FoundRegisteredTag.Value, FoundRegisteredTag.QualityOK));
                                continue;
                            }

                            //If the Update Interval is more Frequent we need to remove the tag and subscribe it to a group which has higher update rate
                            else
                            {
                                FoundRegisteredTag.UpdateIntervalInMS = UpdateIntervalInMS;
                                Subscription SubscriptionWhereTagIs = ConnectedOPDAServer.Subscriptions.FindSubcriptionThatHasItem(ItemId, out Item ItemFound);
                                if (SubscriptionWhereTagIs != null)
                                {
                                    SubscriptionWhereTagIs.RemoveItems(new ItemIdentifier[] { ItemFound });                                 //Remove From Subscription
                                }
                            }
                        }


                        //Tag WAS not found in Registered Tags Dictionary (or was removed due to update interval changed)
                        //Check if there are any subscriptions which have same Update Interval and has room for items
                        NewRegisteredTag = new RegisteredTag(ItemId, UpdateIntervalInMS);
                        ItemValueResult readResult;
                        Subscription    SuitableSubscription = ConnectedOPDAServer.Subscriptions.FindSubcription(S => S.State.UpdateRate == UpdateIntervalInMS && S.Items.Count() < this.OPCGroupSizeLimit);
                        if (SuitableSubscription != null)
                        {
                            //if a suitable subscription was found, Add item to this subscription
                            ItemResult[] IR = SuitableSubscription.AddItems(new Item[] { new Item()
                                                                                         {
                                                                                             ItemName = ItemId
                                                                                         } });
                            if (IR.Count() <= 0)
                            {
                                Read_Result.result.Add(new DataValue(ItemId, false, DateTime.UtcNow, DateTime.MinValue, "Failed to Add Item to OPC Group", false)); continue;
                            }
                            if (IR[0].ResultID == ResultID.S_OK)
                            {
                                readResult = SuitableSubscription.Read(new Item[] { IR[0] })[0];
                            }
                            else
                            {
                                Read_Result.result.Add(new DataValue(ItemId, false, DateTime.UtcNow, DateTime.MinValue, IR[0].ResultID.ToString(), false)); continue;
                            }
                        }
                        else
                        {
                            //If no Subscriptions found, create new Subscription
                            ISubscription NewSubscription = ConnectedOPDAServer.CreateSubscription(new SubscriptionState()
                            {
                                UpdateRate = UpdateIntervalInMS
                            });
                            NewSubscription.DataChanged -= new DataChangedEventHandler(this.OnOPCSubscriptionDataChanged);
                            NewSubscription.DataChanged += new DataChangedEventHandler(this.OnOPCSubscriptionDataChanged);
                            ItemResult[] IR = NewSubscription.AddItems(new Item[] { new Item()
                                                                                    {
                                                                                        ItemName = ItemId
                                                                                    } });
                            if (IR.Count() <= 0)
                            {
                                Read_Result.result.Add(new DataValue(ItemId, false, DateTime.UtcNow, DateTime.MinValue, "Failed to Add Item to new OPC Group", false)); continue;
                            }
                            if (IR[0].ResultID == ResultID.S_OK)
                            {
                                readResult = NewSubscription.Read(new Item[] { IR[0] })[0];
                            }
                            else
                            {
                                Read_Result.result.Add(new DataValue(ItemId, false, DateTime.UtcNow, DateTime.MinValue, IR[0].ResultID.ToString(), false)); continue;
                            }
                        }

                        NewRegisteredTag.TSUTC = DateTime.UtcNow;
                        if (readResult.TimestampSpecified)
                        {
                            NewRegisteredTag.SourceTSUTC = readResult.Timestamp;
                        }
                        else
                        {
                            NewRegisteredTag.SourceTSUTC = DateTime.UtcNow;
                        }
                        if (readResult.Quality == Quality.Good)
                        {
                            NewRegisteredTag.QualityOK = true;
                            if (readResult.Value is string || readResult.Value.IsNumericType())
                            {
                                NewRegisteredTag.Value = (IComparable)readResult.Value;
                            }
                        }
                        else
                        {
                            NewRegisteredTag.QualityOK = false;
                            NewRegisteredTag.Value     = null;
                        }
                        Read_Result.result.Add(new DataValue(NewRegisteredTag.Id, true, NewRegisteredTag.TSUTC, NewRegisteredTag.SourceTSUTC, NewRegisteredTag.Value, NewRegisteredTag.QualityOK));


                        //Add New Tag to the Registered Tags
                        NewRegisteredTag.LastCalled = DateTime.Now;
                        RegisteredTags.Add(ItemId, NewRegisteredTag);
                    }
                }
                return(Read_Result);
            }
            catch (Exception ex)
            {
                return(new Read_Result()
                {
                    success = false, error = ex.ToString()
                });
            }
        }