Timer desde Una Clase

Iniciado por 01munrra, 6 Agosto 2019, 16:02 PM

0 Miembros y 1 Visitante están viendo este tema.

01munrra

Saludos compañeros, les comento lo que esto haciendo, tengo un modulo con 8 sensores de termocupla, estoy obteniendo los datos de cada sensor via serial, ya que necesito que los datos sean de tiempo real, decidi afregarlo en un timer, hice la siguiente clase:

Código (vbnet) [Seleccionar]

Imports System.Timers
Imports System.Threading

Public Class Class_Modulos_Sensores

   Public Shared SerialPort As New IO.Ports.SerialPort
   Public Shared cadena_sensores As String

   Public Shared Sub CommPortSetup()
       SerialPort.PortName = "COM7"
       SerialPort.BaudRate = "9600"
       SerialPort.DataBits = "8"
       SerialPort.StopBits = "1"
       SerialPort.Open()
   End Sub

   Public Shared Sub main()
       Dim Timer_Sensores As New System.Timers.Timer()
       AddHandler Timer_Sensores.Elapsed, New ElapsedEventHandler(AddressOf OnTimer)
       Timer_Sensores.Interval = 100
       Timer_Sensores.Enabled = True
       Timer_Sensores.AutoReset = False
   End Sub

   Public Shared Sub OnTimer(ByVal source As [Object], ByVal e As ElapsedEventArgs)
       SerialPort.Write("#03A" & vbCr)
       SerialPort.DiscardInBuffer()
       cadena_sensores = SerialPort.ReadTo(vbCr)
       Dim theTimer As System.Timers.Timer = DirectCast(source, System.Timers.Timer)
       theTimer.Interval += 1000
       theTimer.Enabled = True
   End Sub

End Class


y en el formulario hice lo siguiente:

Código (vbnet) [Seleccionar]

Public Class Form1

   Dim canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       Class_Modulos_Sensores.CommPortSetup()
       Class_Modulos_Sensores.main()

       canal0_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 4, 5)
       canal1_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 11, 5)
       canal2_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 18, 5)
       canal3_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 25, 5)
       canal4_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 32, 5)
       canal5_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 39, 5)
       canal6_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 46, 5)
       canal7_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 53, 5)

       'MOSTRAR DATOS
       Label2.Text = canal0_nd03 & " ºC"
       Label6.Text = canal1_nd03 & " ºC"
       Label10.Text = canal2_nd03 & " ºC"
       Label7.Text = canal3_nd03 & " ºC"
       Label14.Text = canal4_nd03 & " ºC"
       Label11.Text = canal5_nd03 & " ºC"
       Label18.Text = canal6_nd03 & " ºC"
       Label15.Text = canal7_nd03 & " ºC"


   End Sub

End Class


quisiera que se estuviera actualizando los valores en el formulario, pero esto no lo esta haciendo, no refresca los valores mostrados, que debo hacer?

Eleкtro

#1
Cita de: 01munrra en  6 Agosto 2019, 16:02 PM
quisiera que se estuviera actualizando los valores en el formulario, pero esto no lo esta haciendo, no refresca los valores mostrados

¿Como esperas que eso ocurra, cuando solamente estás "actualizando" los valores una única vez al finalizar la creación de la ventana del Form en este controlador de evento?:

Citar
Código (vbnet) [Seleccionar]
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
...

Solucion: añade un Timer (pero del tipo System.Windows.Forms.Timer) a ese Form para actualizar los valores de los controles periodicamente...




Le hice algunos cambios al código en general. Prueba así:

SensorClass.vb
Código (vbnet) [Seleccionar]

Imports System.IO.Ports
Imports System.Timers

Public NotInheritable Class SensorClass : Implements IDisposable

#Region "Properties"

   Public ReadOnly Property SerialPort As SerialPort
       Get
           Return Me.serialPort_
       End Get
   End Property
   Private serialPort_ As SerialPort

   Public ReadOnly Property Output As String
       Get
           Return Me.output_
       End Get
   End Property
   Private output_ As String

#End Region

#Region "Private Fields"

   Private WithEvents TimerSensores As Timer

#End Region

#Region "Constructors"

   <DebuggerStepThrough>
   Public Sub New()
       Me.CommPortSetup()

       Me.TimerSensores = New Timer() With {
           .AutoReset = True,
           .Interval = 100,
           .Enabled = True
       }
   End Sub

#End Region

#Region "Private Methods"

   <DebuggerStepThrough>
   Private Sub CommPortSetup()
       Me.serialPort_ = New SerialPort With {
           .PortName = "COM7",
           .BaudRate = 9600,
           .DataBits = 8,
           .StopBits = StopBits.One
       }

       Me.serialPort_.Open()
   End Sub

#End Region

#Region "Event-Handlers"

   <DebuggerStepperBoundary>
   Private Sub TimerSensores_Elapsed(sender As Object, e As ElapsedEventArgs) Handles TimerSensores.Elapsed
       Me.SerialPort.Write("#03A" & ControlChars.Cr)
       Me.SerialPort.DiscardInBuffer()

       Me.output_ = Me.SerialPort.ReadTo(ControlChars.Cr)

       DirectCast(sender, Timer).Interval += 1000
   End Sub

#End Region

#Region "IDisposable Implementation"

   Private disposedValue As Boolean ' Flag to detect redundant calls

   <DebuggerStepThrough>
   Public Sub Dispose() Implements IDisposable.Dispose
       Me.Dispose(disposing:=True)
   End Sub

   <DebuggerStepThrough>
   Private Sub Dispose(disposing As Boolean)
       If Not (Me.disposedValue) AndAlso (disposing) Then
           Me.TimerSensores?.Dispose()
           Me.serialPort_?.Dispose()
       End If

       Me.disposedValue = True
   End Sub

#End Region

End Class


Form1.vb
Código (vbnet) [Seleccionar]
Public Class Form1

   Private sensorClass As SensorClass
   Private canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Me.sensorClass = New SensorClass()
     
       With Me.Timer1
           .Interval = 100
           .Enabled = True
           .Start()
       End With
   End Sub

   Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

       Dim output As String = SensorClass.Output
       Me.canal0_nd03 = output.Substring(3, 4)
       Me.canal1_nd03 = output.Substring(10, 4)
       Me.canal2_nd03 = output.Substring(17, 4)
       Me.canal3_nd03 = output.Substring(24, 4)
       Me.canal4_nd03 = output.Substring(31, 4)
       Me.canal5_nd03 = output.Substring(38, 4)
       Me.canal6_nd03 = output.Substring(44, 4)
       Me.canal7_nd03 = output.Substring(52, 4)

       'MOSTRAR DATOS
       Me.Label2.Text = $"{Me.canal0_nd03} ºC"
       Me.Label6.Text = $"{Me.canal1_nd03} ºC"
       Me.Label10.Text = $"{Me.canal2_nd03} ºC"
       Me.Label7.Text = $"{Me.canal3_nd03} ºC"
       Me.Label14.Text = $"{Me.canal4_nd03} ºC"
       Me.Label11.Text = $"{Me.canal5_nd03} ºC"
       Me.Label18.Text = $"{Me.canal6_nd03} ºC"
       Me.Label15.Text = $"{Me.canal7_nd03} ºC"

        '' Si tienes problemas para actualizar el texto de los Labels,
        '' desactiva alguna de las siguientes lineas comentadas para invocar el método de dibujado.
        '
       ' Me.Invalidate(invalidateChildren:=True)
       ' Me.Refresh()

   End Sub

End Class


PD: No puedo comprobar si el código funciona como debería fucnionar, ya que carezco de ese dispositivo que estás utilizando, pero en teoría debería funcionar correctamente. Aparte, no entiendo muy bien por que en el método OnTimer incrementas el intervalo del timer en 1 segundo cada vez que hace tick, pero lo he dejado tal cual en el método TimerSensores_Elapsed.

Saludos.