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); } }
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() }); } }