160 lines
5.1 KiB
C#
160 lines
5.1 KiB
C#
// EncoderMotorViewModel.cs
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using System.Windows.Media;
|
|
using System.ComponentModel;
|
|
using LibS7Adv;
|
|
using System.Diagnostics;
|
|
using Xceed.Wpf.Toolkit.PropertyGrid.Attributes;
|
|
using CtrEditor.FuncionesBase;
|
|
using System.Windows;
|
|
using System.Windows.Controls;
|
|
|
|
namespace CtrEditor.ObjetosSim
|
|
{
|
|
public partial class osEncoderMotor : osBase, IosBase
|
|
{
|
|
private osBase Motor = null;
|
|
private Stopwatch Stopwatch = new Stopwatch();
|
|
private double stopwatch_last = 0;
|
|
|
|
public static string NombreClase()
|
|
{
|
|
return "Encoder Motor";
|
|
}
|
|
|
|
private string nombre = NombreClase();
|
|
public override string Nombre
|
|
{
|
|
get => nombre;
|
|
set => SetProperty(ref nombre, value);
|
|
}
|
|
|
|
[ObservableProperty]
|
|
private Brush color_oculto;
|
|
|
|
[ObservableProperty]
|
|
public float velocidadActual;
|
|
|
|
[ObservableProperty]
|
|
[property: Description("Pulsos por vuelta del encoder")]
|
|
[property: Category("Encoder Config:")]
|
|
public float pulsos_Por_Vuelta;
|
|
|
|
[ObservableProperty]
|
|
[property: Description("Ratio de giros por 50Hz")]
|
|
[property: Category("Encoder Config:")]
|
|
public float ratio_Giros_50hz;
|
|
|
|
[ObservableProperty]
|
|
[property: Description("Valor actual del encoder")]
|
|
[property: Category("Encoder Status:")]
|
|
public float valor_Actual;
|
|
|
|
[ObservableProperty]
|
|
[property: Description("Link to Motor")]
|
|
[property: Category("PLC link:")]
|
|
[property: ItemsSource(typeof(osBaseItemsSource<osVMmotorSim>))]
|
|
string id_Motor;
|
|
|
|
[ObservableProperty]
|
|
[property: Description("Tag para escribir el valor del encoder")]
|
|
[property: Category("PLC link:")]
|
|
string tag_Valor;
|
|
|
|
partial void OnId_MotorChanged(string value)
|
|
{
|
|
if (Motor != null)
|
|
Motor.PropertyChanged -= OnMotorPropertyChanged;
|
|
if (_mainViewModel != null && value != null && value.Length > 0)
|
|
{
|
|
Motor = (osVMmotorSim)_mainViewModel.ObjetosSimulables.FirstOrDefault(s => (s is osVMmotorSim && s.Nombre == value), null);
|
|
if (Motor != null)
|
|
Motor.PropertyChanged += OnMotorPropertyChanged;
|
|
}
|
|
}
|
|
|
|
private void OnMotorPropertyChanged(object sender, PropertyChangedEventArgs e)
|
|
{
|
|
if (e.PropertyName == nameof(osVMmotorSim.Nombre))
|
|
{
|
|
Id_Motor = ((osVMmotorSim)sender).Nombre;
|
|
}
|
|
}
|
|
|
|
public osEncoderMotor()
|
|
{
|
|
Pulsos_Por_Vuelta = 360; // Por defecto, un pulso por grado
|
|
Ratio_Giros_50hz = 1; // Por defecto, 1 giro por cada 50Hz
|
|
Color_oculto = Brushes.Gray;
|
|
Stopwatch.Start();
|
|
}
|
|
|
|
public override void UpdatePLC(PLCViewModel plc, int elapsedMilliseconds)
|
|
{
|
|
if (Motor != null && Motor is osVMmotorSim motor)
|
|
{
|
|
VelocidadActual = motor.Velocidad;
|
|
|
|
// Calcular giros por segundo basado en la velocidad actual
|
|
// velocidad * ratio_giros_50hz / 100 nos da los giros por segundo a esa velocidad
|
|
float girosPorSegundo = (VelocidadActual * Ratio_Giros_50hz) / 100f;
|
|
|
|
// Considerar el sentido de giro
|
|
if (motor.Sentido_contrario)
|
|
girosPorSegundo = -girosPorSegundo;
|
|
|
|
// Calcular incremento de pulsos para este ciclo
|
|
float segundosTranscurridos = elapsedMilliseconds / 1000f;
|
|
float incrementoPulsos = girosPorSegundo * Pulsos_Por_Vuelta * segundosTranscurridos;
|
|
|
|
// Actualizar valor del encoder
|
|
Valor_Actual = (Valor_Actual + incrementoPulsos) % Pulsos_Por_Vuelta;
|
|
if (Valor_Actual < 0) Valor_Actual += Pulsos_Por_Vuelta;
|
|
|
|
// Actualizar color basado en si está girando
|
|
Color_oculto = Math.Abs(girosPorSegundo) > 0.01f ? Brushes.LightGreen : Brushes.Gray;
|
|
|
|
// Escribir valor al PLC si hay tag configurado
|
|
if (!string.IsNullOrEmpty(Tag_Valor))
|
|
{
|
|
EscribirWordTagScaled(Tag_Valor, Valor_Actual, 0, Pulsos_Por_Vuelta, 0, 27648);
|
|
}
|
|
}
|
|
}
|
|
|
|
public override void ucLoaded()
|
|
{
|
|
base.ucLoaded();
|
|
OnId_MotorChanged(Id_Motor);
|
|
}
|
|
}
|
|
|
|
public partial class ucEncoderMotor : UserControl, IDataContainer
|
|
{
|
|
public osBase? Datos { get; set; }
|
|
|
|
public ucEncoderMotor()
|
|
{
|
|
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()
|
|
{
|
|
return ZIndexEnum.Estaticos;
|
|
}
|
|
}
|
|
} |