elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Timer desde Una Clase
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Timer desde Una Clase  (Leído 381 veces)
01munrra

Desconectado Desconectado

Mensajes: 281



Ver Perfil
Timer desde Una Clase
« en: 6 Agosto 2019, 16:02 »

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
  1. Imports System.Timers
  2. Imports System.Threading
  3.  
  4. Public Class Class_Modulos_Sensores
  5.  
  6.    Public Shared SerialPort As New IO.Ports.SerialPort
  7.    Public Shared cadena_sensores As String
  8.  
  9.    Public Shared Sub CommPortSetup()
  10.        SerialPort.PortName = "COM7"
  11.        SerialPort.BaudRate = "9600"
  12.        SerialPort.DataBits = "8"
  13.        SerialPort.StopBits = "1"
  14.        SerialPort.Open()
  15.    End Sub
  16.  
  17.    Public Shared Sub main()
  18.        Dim Timer_Sensores As New System.Timers.Timer()
  19.        AddHandler Timer_Sensores.Elapsed, New ElapsedEventHandler(AddressOf OnTimer)
  20.        Timer_Sensores.Interval = 100
  21.        Timer_Sensores.Enabled = True
  22.        Timer_Sensores.AutoReset = False
  23.    End Sub
  24.  
  25.    Public Shared Sub OnTimer(ByVal source As [Object], ByVal e As ElapsedEventArgs)
  26.        SerialPort.Write("#03A" & vbCr)
  27.        SerialPort.DiscardInBuffer()
  28.        cadena_sensores = SerialPort.ReadTo(vbCr)
  29.        Dim theTimer As System.Timers.Timer = DirectCast(source, System.Timers.Timer)
  30.        theTimer.Interval += 1000
  31.        theTimer.Enabled = True
  32.    End Sub
  33.  
  34. End Class
  35.  

y en el formulario hice lo siguiente:

Código
  1. Public Class Form1
  2.  
  3.    Dim canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String
  4.  
  5.    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  6.  
  7.        Class_Modulos_Sensores.CommPortSetup()
  8.        Class_Modulos_Sensores.main()
  9.  
  10.        canal0_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 4, 5)
  11.        canal1_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 11, 5)
  12.        canal2_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 18, 5)
  13.        canal3_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 25, 5)
  14.        canal4_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 32, 5)
  15.        canal5_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 39, 5)
  16.        canal6_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 46, 5)
  17.        canal7_nd03 = Mid(Class_Modulos_Sensores.cadena_sensores, 53, 5)
  18.  
  19.        'MOSTRAR DATOS
  20.        Label2.Text = canal0_nd03 & " ºC"
  21.        Label6.Text = canal1_nd03 & " ºC"
  22.        Label10.Text = canal2_nd03 & " ºC"
  23.        Label7.Text = canal3_nd03 & " ºC"
  24.        Label14.Text = canal4_nd03 & " ºC"
  25.        Label11.Text = canal5_nd03 & " ºC"
  26.        Label18.Text = canal6_nd03 & " ºC"
  27.        Label15.Text = canal7_nd03 & " ºC"
  28.  
  29.  
  30.    End Sub
  31.  
  32. End Class
  33.  

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


« Última modificación: 9 Agosto 2019, 13:07 por Eleкtro » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Timer desde Una Clase
« Respuesta #1 en: 9 Agosto 2019, 13:46 »

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
  1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  2. ...

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
  1. Imports System.IO.Ports
  2. Imports System.Timers
  3.  
  4. Public NotInheritable Class SensorClass : Implements IDisposable
  5.  
  6. #Region "Properties"
  7.  
  8.    Public ReadOnly Property SerialPort As SerialPort
  9.        Get
  10.            Return Me.serialPort_
  11.        End Get
  12.    End Property
  13.    Private serialPort_ As SerialPort
  14.  
  15.    Public ReadOnly Property Output As String
  16.        Get
  17.            Return Me.output_
  18.        End Get
  19.    End Property
  20.    Private output_ As String
  21.  
  22. #End Region
  23.  
  24. #Region "Private Fields"
  25.  
  26.    Private WithEvents TimerSensores As Timer
  27.  
  28. #End Region
  29.  
  30. #Region "Constructors"
  31.  
  32.    <DebuggerStepThrough>
  33.    Public Sub New()
  34.        Me.CommPortSetup()
  35.  
  36.        Me.TimerSensores = New Timer() With {
  37.            .AutoReset = True,
  38.            .Interval = 100,
  39.            .Enabled = True
  40.        }
  41.    End Sub
  42.  
  43. #End Region
  44.  
  45. #Region "Private Methods"
  46.  
  47.    <DebuggerStepThrough>
  48.    Private Sub CommPortSetup()
  49.        Me.serialPort_ = New SerialPort With {
  50.            .PortName = "COM7",
  51.            .BaudRate = 9600,
  52.            .DataBits = 8,
  53.            .StopBits = StopBits.One
  54.        }
  55.  
  56.        Me.serialPort_.Open()
  57.    End Sub
  58.  
  59. #End Region
  60.  
  61. #Region "Event-Handlers"
  62.  
  63.    <DebuggerStepperBoundary>
  64.    Private Sub TimerSensores_Elapsed(sender As Object, e As ElapsedEventArgs) Handles TimerSensores.Elapsed
  65.        Me.SerialPort.Write("#03A" & ControlChars.Cr)
  66.        Me.SerialPort.DiscardInBuffer()
  67.  
  68.        Me.output_ = Me.SerialPort.ReadTo(ControlChars.Cr)
  69.  
  70.        DirectCast(sender, Timer).Interval += 1000
  71.    End Sub
  72.  
  73. #End Region
  74.  
  75. #Region "IDisposable Implementation"
  76.  
  77.    Private disposedValue As Boolean ' Flag to detect redundant calls
  78.  
  79.    <DebuggerStepThrough>
  80.    Public Sub Dispose() Implements IDisposable.Dispose
  81.        Me.Dispose(disposing:=True)
  82.    End Sub
  83.  
  84.    <DebuggerStepThrough>
  85.    Private Sub Dispose(disposing As Boolean)
  86.        If Not (Me.disposedValue) AndAlso (disposing) Then
  87.            Me.TimerSensores?.Dispose()
  88.            Me.serialPort_?.Dispose()
  89.        End If
  90.  
  91.        Me.disposedValue = True
  92.    End Sub
  93.  
  94. #End Region
  95.  
  96. End Class

Form1.vb
Código
  1. Public Class Form1
  2.  
  3.    Private sensorClass As SensorClass
  4.    Private canal0_nd03, canal1_nd03, canal2_nd03, canal3_nd03, canal4_nd03, canal5_nd03, canal6_nd03, canal7_nd03 As String
  5.  
  6.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  7.        Me.sensorClass = New SensorClass()
  8.  
  9.        With Me.Timer1
  10.            .Interval = 100
  11.            .Enabled = True
  12.            .Start()
  13.        End With
  14.    End Sub
  15.  
  16.    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  17.  
  18.        Dim output As String = SensorClass.Output
  19.        Me.canal0_nd03 = output.Substring(3, 4)
  20.        Me.canal1_nd03 = output.Substring(10, 4)
  21.        Me.canal2_nd03 = output.Substring(17, 4)
  22.        Me.canal3_nd03 = output.Substring(24, 4)
  23.        Me.canal4_nd03 = output.Substring(31, 4)
  24.        Me.canal5_nd03 = output.Substring(38, 4)
  25.        Me.canal6_nd03 = output.Substring(44, 4)
  26.        Me.canal7_nd03 = output.Substring(52, 4)
  27.  
  28.        'MOSTRAR DATOS
  29.        Me.Label2.Text = $"{Me.canal0_nd03} ºC"
  30.        Me.Label6.Text = $"{Me.canal1_nd03} ºC"
  31.        Me.Label10.Text = $"{Me.canal2_nd03} ºC"
  32.        Me.Label7.Text = $"{Me.canal3_nd03} ºC"
  33.        Me.Label14.Text = $"{Me.canal4_nd03} ºC"
  34.        Me.Label11.Text = $"{Me.canal5_nd03} ºC"
  35.        Me.Label18.Text = $"{Me.canal6_nd03} ºC"
  36.        Me.Label15.Text = $"{Me.canal7_nd03} ºC"
  37.  
  38.        '' Si tienes problemas para actualizar el texto de los Labels,
  39.        '' desactiva alguna de las siguientes lineas comentadas para invocar el método de dibujado.
  40.        '
  41.        ' Me.Invalidate(invalidateChildren:=True)
  42.        ' Me.Refresh()
  43.  
  44.    End Sub
  45.  
  46. 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.


« Última modificación: 9 Agosto 2019, 13:57 por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines