using CtrEditor.Convertidores; using CtrEditor.Siemens; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using Newtonsoft.Json; using CommunityToolkit.Mvvm.ComponentModel; namespace CtrEditor.ObjetosSim.UserControls { /// /// Interaction logic for ucGearEncoder.xaml /// public partial class osGearEncoder : osBase, IosBase { private osBase _osMotor = null; // Otros datos y métodos relevantes para la simulación public static string NombreClase() { return "Ruota Fonica"; } private string nombre = NombreClase(); public override string Nombre { get => nombre; set => SetProperty(ref nombre, value); } [ObservableProperty] public string tag; [ObservableProperty] public bool pulso; [ObservableProperty] public float velocidadActual; [ObservableProperty] public float angulo; [ObservableProperty] public float dientes; [ObservableProperty] public float radio_Interno; [ObservableProperty] public float radio_Externo; [ObservableProperty] public float ancho_Dientes; [ObservableProperty] public float giros_segundo_a_50hz; [ObservableProperty] public string motor; partial void OnMotorChanged(string value) { _osMotor = ObtenerLink(Motor, typeof(osVMmotorSim)); } public osGearEncoder() { Ancho_Dientes = 0.5f; Dientes = 10; Radio_Interno = 0.5f; Radio_Externo = 0.6f; } public override void UpdateGeometryStart() { // Se llama antes de la simulacion } public override void UpdatePLC(PLCModel plc, int elapsedMilliseconds) { if (_osMotor != null) { if (_osMotor is osVMmotorSim motor) { VelocidadActual = motor.Velocidad; // Calcular la cantidad de giros por segundo double girosPorSegundo = (VelocidadActual / 50.0) * Giros_segundo_a_50hz; // Calcular la fracción del segundo que ha pasado double segundosTranscurridos = elapsedMilliseconds / 1000.0; // Calcular el incremento de ángulo double incrementoAngulo = (girosPorSegundo * 360.0) * segundosTranscurridos; // Actualizar el ángulo Angulo = (float)(Angulo + incrementoAngulo) % 360; // Calcular la duración de un pulso double duracionPulso = (360.0 / Dientes) / 2; // Generar pulsos cuadrados en función del ángulo Pulso = ((Angulo % (360.0 / Dientes)) < duracionPulso) ? true : false; EscribirBitTag(Tag,Pulso); } } else if (Motor.Length>0) _osMotor = ObtenerLink(Motor, typeof(osVMmotorSim)); } public override void UpdateControl(int elapsedMilliseconds) { // Calculamos la velocidad } public override void ucLoaded() { // El UserControl ya se ha cargado y podemos obtener las coordenadas para // crear el objeto de simulacion ActualizarLeftTop(); } } public partial class ucGearEncoder : UserControl, IDataContainer { public osBase? Datos { get; set; } public ucGearEncoder() { 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 Resize(float width, float height) { } public void Move(float LeftPixels, float TopPixels) { if (Datos != null) { Datos.Left = PixelToMeter.Instance.calc.PixelsToMeters(LeftPixels); Datos.Top = PixelToMeter.Instance.calc.PixelsToMeters(TopPixels); } } public void Rotate(float Angle) { } public void Highlight(bool State) { } public int ZIndex() { return 10; } } }