CtrEditor/ObjetosSim/UserControls/ucGearEncoder.xaml.cs

155 lines
4.5 KiB
C#
Raw Normal View History

2024-05-23 14:56:14 -03:00
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
{
/// <summary>
/// Interaction logic for ucGearEncoder.xaml
/// </summary>
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;
}
}
}