using CommunityToolkit.Mvvm.ComponentModel; using LibS7Adv; using System.Windows; using System.Windows.Controls; using CtrEditor.FuncionesBase; using System.ComponentModel; namespace CtrEditor.ObjetosSim { /// /// Interaction logic for ucTanque.xaml /// public partial class osTanque : osBase, IosBase { // Otros datos y métodos relevantes para la simulación public static string NombreClase() { return "Tanque"; } private string nombre = NombreClase(); [property: Category("Identificación")] [property: Description("Nombre identificativo del objeto")] [property: Name("Nombre")] public override string Nombre { get => nombre; set => SetProperty(ref nombre, value); } [ObservableProperty] [property: Category("Configuración")] [property: Description("Capacidad total del tanque en litros")] [property: Name("Capacidad (L)")] public float capacidad_Litros; [ObservableProperty] [property: Category("Simulación")] [property: Description("Estado de apertura del ingreso")] [property: Name("Ingreso Abierto")] public bool ingreso_Abierto; [ObservableProperty] [property: Category("Simulación")] [property: Description("Estado de apertura de la salida")] [property: Name("Salida Abierta")] public bool salida_Abierta; [ObservableProperty] [property: Category("Enlace PLC")] [property: Description("Tag PLC para nivel del tanque")] [property: Name("Tag Nivel")] public string tagNivel_Word; [ObservableProperty] [property: Category("Enlace PLC")] [property: Description("Tag PLC para control de ingreso")] [property: Name("Tag Ingreso")] public string tagIngresoAbierto_Bool; [ObservableProperty] [property: Category("Enlace PLC")] [property: Description("Tag PLC para control de salida")] [property: Name("Tag Salida")] public string tagSalidaAbierta_Bool; [ObservableProperty] [property: Category("Configuración")] [property: Description("Velocidad de llenado en L/min")] [property: Name("Velocidad Ingreso")] public float velocidad_Ingreso; [ObservableProperty] [property: Category("Configuración")] [property: Description("Velocidad de vaciado en L/min")] [property: Name("Velocidad Salida")] public float velocidad_Salida; [ObservableProperty] [property: Category("Enlace PLC")] [property: Description("Valor mínimo escalado para salida PLC")] [property: Name("Mínimo Escalado")] public float min_OUT_Scaled; [ObservableProperty] [property: Category("Enlace PLC")] [property: Description("Valor máximo escalado para salida PLC")] [property: Name("Máximo Escalado")] public float max_OUT_Scaled; [ObservableProperty] [property: Category("Simulación")] [property: Description("Nivel actual del tanque en porcentaje")] [property: Name("Nivel (%)")] public float level; public osTanque() { Ancho = 0.30f; Alto = 0.30f; Max_OUT_Scaled = 27648; Min_OUT_Scaled = 0; } public override void UpdatePLC(PLCViewModel plc, int elapsedMilliseconds) { EscribirWordTagScaled(TagNivel_Word, Level, 0, 100, Min_OUT_Scaled, Max_OUT_Scaled); Ingreso_Abierto = LeerBitTag(TagIngresoAbierto_Bool); Salida_Abierta = LeerBitTag(TagSalidaAbierta_Bool); } public override void UpdateControl(int elapsedMilliseconds) { if (Salida_Abierta && Level > 0) { var l_por_milisegundo = Velocidad_Salida / 60000.0f; Level -= l_por_milisegundo * elapsedMilliseconds; if (Level < 0) Level = 0; } if (Ingreso_Abierto && Level < 100) { var l_por_milisegundo = Velocidad_Ingreso / 60000.0f; Level += l_por_milisegundo * elapsedMilliseconds; if (Level > 100) Level = 100; } } public override void ucLoaded() { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion base.ucLoaded(); } } public partial class ucTanque : UserControl, IDataContainer { public osBase? Datos { get; set; } public int zIndex_fromFrames { get; set; } public ucTanque() { InitializeComponent(); this.Loaded += OnLoaded; this.Unloaded += OnUnloaded; } private void OnLoaded(object sender, RoutedEventArgs e) { Datos?.ucLoaded(); } private void OnUnloaded(object sender, RoutedEventArgs e) { Datos?.ucUnLoaded(); } public void Highlight(bool State) { } public ZIndexEnum ZIndex_Base() { return ZIndexEnum.Generadores; } } }