public ScadaTransactionActor(IReliableStateManager stateManager, ModelResourcesDesc modelResourceDesc, EnumDescs enumDescs) { this.baseLogString = $"{this.GetType()} [{this.GetHashCode()}] =>{Environment.NewLine}"; this.isCurrentGidToPointItemMapInitialized = false; this.isIncomingGidToPointItemMapInitialized = false; this.isCurrentAddressToGidMapInitialized = false; this.isIncomingAddressToGidMapInitialized = false; this.isInfoCacheInitialized = false; this.isModelChangesInitialized = false; this.isCommandDescriptionCacheInitialized = false; this.stateManager = stateManager; this.stateManager.StateManagerChanged += this.OnStateManagerChangedHandler; this.modelResourceDesc = modelResourceDesc; this.enumDescs = enumDescs; this.pointItemHelper = new ScadaModelPointItemHelper(); this.reliableDictionaryHelper = new ReliableDictionaryHelper(); }
public void ExportToXml(XmlTextWriter xmlWriter, EnumDescs enumDescs) { StringBuilder sb; xmlWriter.WriteStartElement("ResourceDescription"); xmlWriter.WriteStartElement("id"); xmlWriter.WriteStartAttribute("gid"); xmlWriter.WriteValue(String.Format("0x{0:X16}", this.Id)); xmlWriter.WriteStartAttribute("type"); xmlWriter.WriteValue(((DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(this.Id)).ToString()); xmlWriter.WriteEndElement(); // id xmlWriter.WriteStartElement("Properties"); for (int i = 0; i < this.Properties.Count; i++) { xmlWriter.WriteStartElement("Property"); xmlWriter.WriteStartAttribute("id"); xmlWriter.WriteValue(this.Properties[i].Id.ToString()); xmlWriter.WriteStartAttribute("value"); switch (Properties[i].Type) { case PropertyType.Float: xmlWriter.WriteValue(this.Properties[i].AsFloat()); break; case PropertyType.Bool: case PropertyType.Byte: case PropertyType.Int32: case PropertyType.Int64: case PropertyType.TimeSpan: case PropertyType.DateTime: if (this.Properties[i].Id == ModelCode.IDOBJ_GID) { xmlWriter.WriteValue(String.Format("0x{0:X16}", this.Properties[i].AsLong())); } else { xmlWriter.WriteValue(this.Properties[i].AsLong()); } break; case PropertyType.Enum: try { xmlWriter.WriteValue(enumDescs.GetStringFromEnum(this.Properties[i].Id, this.Properties[i].AsEnum())); } catch (Exception) { xmlWriter.WriteValue(this.Properties[i].AsEnum()); } break; case PropertyType.Reference: xmlWriter.WriteValue(String.Format("0x{0:X16}", this.Properties[i].AsReference())); break; case PropertyType.String: if (this.Properties[i].PropertyValue.StringValue == null) { this.Properties[i].PropertyValue.StringValue = String.Empty; } xmlWriter.WriteValue(this.Properties[i].AsString()); break; case PropertyType.Int64Vector: case PropertyType.ReferenceVector: if (this.Properties[i].AsLongs().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsLongs().Count; j++) { sb.Append(String.Format("0x{0:X16}", this.Properties[i].AsLongs()[j])).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty long/reference vector"); } break; case PropertyType.TimeSpanVector: if (this.Properties[i].AsLongs().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsLongs().Count; j++) { sb.Append(String.Format("0x{0:X16}", this.Properties[i].AsTimeSpans()[j])).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty long/reference vector"); } break; case PropertyType.Int32Vector: if (this.Properties[i].AsInts().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsInts().Count; j++) { sb.Append(String.Format("{0}", this.Properties[i].AsInts()[j])).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty int vector"); } break; case PropertyType.DateTimeVector: if (this.Properties[i].AsDateTimes().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsDateTimes().Count; j++) { sb.Append(String.Format("{0}", this.Properties[i].AsDateTimes()[j])).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty DateTime vector"); } break; case PropertyType.BoolVector: if (this.Properties[i].AsBools().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsBools().Count; j++) { sb.Append(String.Format("{0}", this.Properties[i].AsBools()[j])).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty int vector"); } break; case PropertyType.FloatVector: if (this.Properties[i].AsFloats().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsFloats().Count; j++) { sb.Append(this.Properties[i].AsFloats()[j]).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty float vector"); } break; case PropertyType.StringVector: if (this.Properties[i].AsStrings().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsStrings().Count; j++) { sb.Append(this.Properties[i].AsStrings()[j]).Append(", "); } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty string vector"); } break; case PropertyType.EnumVector: if (this.Properties[i].AsEnums().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < this.Properties[i].AsEnums().Count; j++) { try { sb.Append(String.Format("{0}", enumDescs.GetStringFromEnum(this.Properties[i].Id, this.Properties[i].AsEnums()[j]))).Append(", "); } catch (Exception) { sb.Append(String.Format("{0}", this.Properties[i].AsEnums()[j])).Append(", "); } } xmlWriter.WriteValue(sb.ToString(0, sb.Length - 2)); } else { xmlWriter.WriteValue("empty enum vector"); } break; default: throw new Exception("Failed to export Resource Description as XML. Invalid property type."); } xmlWriter.WriteEndElement(); // Property } xmlWriter.WriteEndElement(); // Properties xmlWriter.WriteEndElement(); // ResourceDescription }
public ModelLabsAppForm() { enumDescs = new EnumDescs(); InitializeComponent(); InitGUIElements(); }
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value == null) { return("wrong value"); } var prop = value as Property; switch (prop.Type) { case PropertyType.Float: return(prop.AsFloat()); case PropertyType.Bool: case PropertyType.Byte: case PropertyType.Int32: case PropertyType.Int64: case PropertyType.TimeSpan: case PropertyType.DateTime: if (prop.Id == ModelCode.IDOBJ) { return(String.Format("0x{0:x16}", prop.AsLong())); } else { return(prop.AsLong()); } case PropertyType.Enum: try { EnumDescs enumDescs = new EnumDescs(); return(enumDescs.GetStringFromEnum(prop.Id, prop.AsEnum())); } catch (Exception) { return(prop.AsEnum()); } case PropertyType.Reference: return(String.Format("0x{0:x16}", prop.AsReference())); case PropertyType.String: if (prop.PropertyValue.StringValue == null) { prop.PropertyValue.StringValue = String.Empty; } return(prop.AsString()); case PropertyType.Int64Vector: case PropertyType.ReferenceVector: if (prop.AsLongs().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsLongs().Count; j++) { sb.Append(String.Format("0x{0:x16}", prop.AsLongs()[j])).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty long/reference vector"); } case PropertyType.TimeSpanVector: if (prop.AsLongs().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsLongs().Count; j++) { sb.Append(String.Format("0x{0:x16}", prop.AsTimeSpans()[j])).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty long/reference vector"); } case PropertyType.Int32Vector: if (prop.AsInts().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsInts().Count; j++) { sb.Append(String.Format("{0}", prop.AsInts()[j])).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty int vector"); } case PropertyType.DateTimeVector: if (prop.AsDateTimes().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsDateTimes().Count; j++) { sb.Append(String.Format("{0}", prop.AsDateTimes()[j])).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty DateTime vector"); } case PropertyType.BoolVector: if (prop.AsBools().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsBools().Count; j++) { sb.Append(String.Format("{0}", prop.AsBools()[j])).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty int vector"); } case PropertyType.FloatVector: if (prop.AsFloats().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsFloats().Count; j++) { sb.Append(prop.AsFloats()[j]).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty float vector"); } case PropertyType.StringVector: if (prop.AsStrings().Count > 0) { var sb = new StringBuilder(100); for (int j = 0; j < prop.AsStrings().Count; j++) { sb.Append(prop.AsStrings()[j]).Append(", "); } return(sb.ToString(0, sb.Length - 2)); } else { return("empty string vector"); } case PropertyType.EnumVector: if (prop.AsEnums().Count > 0) { var sb = new StringBuilder(100); EnumDescs enumDescs = new EnumDescs(); for (int j = 0; j < prop.AsEnums().Count; j++) { try { sb.Append(String.Format("{0}", enumDescs.GetStringFromEnum(prop.Id, prop.AsEnums()[j]))).Append(", "); } catch (Exception) { sb.Append(String.Format("{0}", prop.AsEnums()[j])).Append(", "); } } return(sb.ToString(0, sb.Length - 2)); } else { return("empty enum vector"); } default: return("wrong value"); } }
public void ExportToXml(XmlTextWriter xmlWriter, EnumDescs enumDescs) { xmlWriter.WriteStartElement("delta"); xmlWriter.WriteStartAttribute("id"); xmlWriter.WriteValue(this.Id); xmlWriter.WriteStartElement("operations"); if (this.InsertOperations.Count > 0) { xmlWriter.WriteStartElement("operation"); xmlWriter.WriteStartAttribute("type"); xmlWriter.WriteValue("insert"); xmlWriter.WriteStartElement("ResourceDescriptions"); xmlWriter.WriteStartAttribute("count"); xmlWriter.WriteValue(this.InsertOperations.Count); for (int i = 0; i < this.InsertOperations.Count; i++) { this.InsertOperations[i].ExportToXml(xmlWriter, enumDescs); } xmlWriter.WriteEndElement(); // operation xmlWriter.WriteEndElement(); // ResourceDescriptions } if (this.UpdateOperations.Count > 0) { xmlWriter.WriteStartElement("operation"); xmlWriter.WriteStartAttribute("type"); xmlWriter.WriteValue("update"); xmlWriter.WriteStartElement("ResourceDescriptions"); xmlWriter.WriteStartAttribute("count"); xmlWriter.WriteValue(this.UpdateOperations.Count); for (int i = 0; i < this.UpdateOperations.Count; i++) { this.UpdateOperations[i].ExportToXml(xmlWriter, enumDescs); } xmlWriter.WriteEndElement(); // operation xmlWriter.WriteEndElement(); // ResourceDescriptions } if (this.DeleteOperations.Count > 0) { xmlWriter.WriteStartElement("operation"); xmlWriter.WriteStartAttribute("type"); xmlWriter.WriteValue("delete"); xmlWriter.WriteStartElement("ResourceDescriptions"); xmlWriter.WriteStartAttribute("count"); xmlWriter.WriteValue(this.DeleteOperations.Count); for (int i = 0; i < this.DeleteOperations.Count; i++) { this.DeleteOperations[i].ExportToXml(xmlWriter, enumDescs); } xmlWriter.WriteEndElement(); // operation xmlWriter.WriteEndElement(); // ResourceDescriptions } xmlWriter.WriteEndElement(); // operations xmlWriter.WriteEndElement(); // delta }
public void InitializeDiscretePointItem(DiscretePointItem pointItem, List <Property> props, ModelCode type, EnumDescs enumDescs) { InitializeScadaModelPointItem(pointItem as ScadaModelPointItem, props, type, enumDescs); foreach (var item in props) { switch (item.Id) { case ModelCode.DISCRETE_CURRENTOPEN: pointItem.CurrentValue = (ushort)((item.AsBool() == true) ? 1 : 0); break; case ModelCode.DISCRETE_MAXVALUE: pointItem.MaxValue = (ushort)item.AsInt(); break; case ModelCode.DISCRETE_MINVALUE: pointItem.MinValue = (ushort)item.AsInt(); break; case ModelCode.DISCRETE_NORMALVALUE: pointItem.NormalValue = (ushort)item.AsInt(); break; case ModelCode.DISCRETE_MEASUREMENTTYPE: pointItem.DiscreteType = (DiscreteMeasurementType)(enumDescs.GetEnumValueFromString(ModelCode.ANALOG_SIGNALTYPE, item.AsEnum().ToString())); break; default: break; } } pointItem.Initialized = true; }
public void InitializeScadaModelPointItem(ScadaModelPointItem pointItem, List <Property> props, ModelCode type, EnumDescs enumDescs) { foreach (var item in props) { switch (item.Id) { case ModelCode.IDOBJ_GID: pointItem.Gid = item.AsLong(); break; case ModelCode.IDOBJ_NAME: pointItem.Name = item.AsString(); break; case ModelCode.MEASUREMENT_ADDRESS: if (ushort.TryParse(item.AsString(), out ushort address)) { pointItem.Address = address; } else { string errorMessage = $"{baseLogString} InitializeScadaModelPointItem => Address ('{item.AsString()}') is either not defined or is invalid."; Logger.LogError(errorMessage); throw new ArgumentException(errorMessage); } break; case ModelCode.MEASUREMENT_ISINPUT: if (type == ModelCode.ANALOG) { pointItem.RegisterType = (item.AsBool() == true) ? PointType.ANALOG_INPUT : PointType.ANALOG_OUTPUT; } else if (type == ModelCode.DISCRETE) { pointItem.RegisterType = (item.AsBool() == true) ? PointType.DIGITAL_INPUT : PointType.DIGITAL_OUTPUT; } else { string errorMessage = $"{baseLogString} InitializeScadaModelPointItem => ModelCode type is neither ANALOG nor DISCRETE."; Logger.LogError(errorMessage); throw new ArgumentException(errorMessage); } break; default: break; } } }
public void InitializeAnalogPointItem(AnalogPointItem pointItem, List <Property> props, ModelCode type, EnumDescs enumDescs) { InitializeScadaModelPointItem(pointItem as ScadaModelPointItem, props, type, enumDescs); foreach (var item in props) { switch (item.Id) { case ModelCode.ANALOG_CURRENTVALUE: pointItem.CurrentEguValue = item.AsFloat(); break; case ModelCode.ANALOG_MAXVALUE: pointItem.EGU_Max = item.AsFloat(); break; case ModelCode.ANALOG_MINVALUE: pointItem.EGU_Min = item.AsFloat(); break; case ModelCode.ANALOG_NORMALVALUE: pointItem.NormalValue = item.AsFloat(); break; case ModelCode.ANALOG_SCALINGFACTOR: pointItem.ScalingFactor = item.AsFloat(); break; case ModelCode.ANALOG_DEVIATION: pointItem.Deviation = item.AsFloat(); break; case ModelCode.ANALOG_SIGNALTYPE: pointItem.AnalogType = (AnalogMeasurementType)(enumDescs.GetEnumValueFromString(ModelCode.ANALOG_SIGNALTYPE, item.AsEnum().ToString())); break; default: break; } } if (pointItem.ScalingFactor == 0) { string warnMessage = $"{baseLogString} InitializeAnalogPointItem => Analog measurement is of type: {pointItem.AnalogType} which is not supported for alarming. Gid: 0x{pointItem.Gid:X16}, Addres: {pointItem.Address}, Name: {pointItem.Name}, RegisterType: {pointItem.RegisterType}, Initialized: {pointItem.Initialized}"; Logger.LogWarning(warnMessage); pointItem.ScalingFactor = 1; } pointItem.Initialized = true; }
public ScadaModelImporter(IReliableStateManager stateManager, ModelResourcesDesc modelResourceDesc, EnumDescs enumDescs) { this.baseLogString = $"{this.GetType()} [{this.GetHashCode()}] =>{Environment.NewLine}"; this.isGidToPointItemMapInitialized = false; this.isAddressToGidMapInitialized = false; this.isInfoCacheInitialized = false; this.stateManager = stateManager; this.stateManager.StateManagerChanged += this.OnStateManagerChangedHandler; this.modelResourceDesc = modelResourceDesc; this.enumDescs = enumDescs; this.pointItemHelper = new ScadaModelPointItemHelper(); }
public string IspisUTextBox(ResourceDescription rd) { string tekst = string.Empty; StringBuilder sb; tekst += "GID: " + String.Format("0x{0:x16}", rd.Id) + "\n"; tekst += "Type: " + ((DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(rd.Id)).ToString() + "\n"; tekst += "Properties:\n"; for (int i = 0; i < rd.Properties.Count; i++) { tekst += "\tProperty id: "; tekst += rd.Properties[i].Id.ToString() + ", "; tekst += "value: "; switch (rd.Properties[i].Type) { case PropertyType.Float: tekst += rd.Properties[i].AsFloat() + "\n"; break; case PropertyType.Bool: case PropertyType.Byte: case PropertyType.Int32: case PropertyType.Int64: case PropertyType.TimeSpan: case PropertyType.DateTime: if (rd.Properties[i].Id == ModelCode.IDOBJ_GID) { tekst += String.Format("0x{0:x16}", rd.Properties[i].AsLong()) + "\n"; } else { tekst += rd.Properties[i].AsLong() + "\n"; } break; case PropertyType.Enum: try { EnumDescs enumDescs = new EnumDescs(); tekst += enumDescs.GetStringFromEnum(rd.Properties[i].Id, rd.Properties[i].AsEnum()) + "\n"; } catch (Exception) { tekst += rd.Properties[i].AsEnum() + "\n"; } break; case PropertyType.Reference: tekst += String.Format("0x{0:x16}", rd.Properties[i].AsReference()) + "\n"; break; case PropertyType.String: if (rd.Properties[i].PropertyValue.StringValue == null) { rd.Properties[i].PropertyValue.StringValue = String.Empty; } tekst += rd.Properties[i].AsString() + "\n"; break; case PropertyType.Int64Vector: case PropertyType.ReferenceVector: if (rd.Properties[i].AsLongs().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < rd.Properties[i].AsLongs().Count; j++) { sb.Append(String.Format("0x{0:x16}", rd.Properties[i].AsLongs()[j])).Append(", "); } tekst += sb.ToString(0, sb.Length - 2) + "\n"; } else { tekst += "Empty reference vector" + "\n"; } break; case PropertyType.TimeSpanVector: case PropertyType.Int32Vector: case PropertyType.DateTimeVector: case PropertyType.BoolVector: if (rd.Properties[i].AsBools().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < rd.Properties[i].AsBools().Count; j++) { sb.Append(String.Format("{0}", rd.Properties[i].AsBools()[j])).Append(", "); } tekst += sb.ToString(0, sb.Length - 2) + "\n"; } else { tekst += "Empty int vector" + "\n"; } break; case PropertyType.FloatVector: if (rd.Properties[i].AsFloats().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < rd.Properties[i].AsFloats().Count; j++) { sb.Append(rd.Properties[i].AsFloats()[j]).Append(", "); } tekst += sb.ToString(0, sb.Length - 2) + "\n"; } else { tekst += "Empty float vector" + "\n"; } break; case PropertyType.StringVector: if (rd.Properties[i].AsStrings().Count > 0) { sb = new StringBuilder(100); for (int j = 0; j < rd.Properties[i].AsStrings().Count; j++) { sb.Append(rd.Properties[i].AsStrings()[j]).Append(", "); } tekst += sb.ToString(0, sb.Length - 2) + "\n"; } else { tekst += "Empty string vector" + "\n"; } break; case PropertyType.EnumVector: if (rd.Properties[i].AsEnums().Count > 0) { sb = new StringBuilder(100); EnumDescs enumDescs = new EnumDescs(); for (int j = 0; j < rd.Properties[i].AsEnums().Count; j++) { try { sb.Append(String.Format("{0}", enumDescs.GetStringFromEnum(rd.Properties[i].Id, rd.Properties[i].AsEnums()[j]))).Append(", "); } catch (Exception) { sb.Append(String.Format("{0}", rd.Properties[i].AsEnums()[j])).Append(", "); } } tekst += sb.ToString(0, sb.Length - 2) + "\n"; } else { tekst += "Empty enum vector" + "\n"; } break; default: throw new Exception("Failed to export Resource Description as XML. Invalid property type."); } } tekst += "\n\n"; return(tekst); }