Archive for the ‘ Herramientas de programación ’ Category

Lavadora web 2.0. Interface HMI en Vb.net

Bueno, os dejo el video de la aplicación en vb.net funcionando.

Lavadora web 2.0

He modificado la clase encargada de comunicar con el plc. En este caso llamaremos a las variables por su nombre. Esta el la clase:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
Imports TwinCAT.Ads
Public Class ClassAds
    Private adsClient As TcAdsClient
    Dim Conectado As AdsState
    Enum AdsState
        Desconectado
        ErrorConect
        ConectadoOk
    End Enum
 
#Region "PLC ADS"
    Public Function Conectar() As String
        Try
            adsClient = New TcAdsClient
            adsClient.Connect("192.168.255.2.1.1", 801)
            adsClient.Timeout = 5000
 
            If adsClient.ReadState.AdsState.ToString = "Run" Then
                Conectado = AdsState.ConectadoOk
            Else
                Conectado = AdsState.ErrorConect
            End If
            Return adsClient.ReadState.AdsState.ToString
        Catch err As Exception
            Conectado = AdsState.ErrorConect
            Return "Error"
        End Try
 
    End Function
 
    Public Function ValorIntPorNombre(ByVal Name As String)
 
        Dim dataStream As AdsStream
        Dim Read As AdsBinaryReader
 
        Try
            'Recuperar Numero Var
            Dim Var As Integer
            Var = adsClient.CreateVariableHandle(Name)
 
            dataStream = New AdsStream(2)
            adsClient.Read(Var, dataStream)
            Read = New AdsBinaryReader(dataStream)
            Return Read.ReadInt16
        Catch err As Exception
 
            Conectado = AdsState.ErrorConect
            Return 0
        End Try
    End Function
    Public Function txtPorNombre(ByVal Name As String)
 
        Dim dataStream As AdsStream
        Dim Read As AdsBinaryReader
        Dim txt As String
        Dim length As Integer
 
        Try
            'Recuperar Numero Var
            Dim Var As Integer
            Var = adsClient.CreateVariableHandle(Name)
 
            dataStream = New AdsStream(31)
            length = adsClient.Read(Var, dataStream)
 
 
            Read = New AdsBinaryReader(dataStream)
            'txt = Read.ReadString
            txt = New String(Read.ReadChars(length))
            'txt = txt.Substring(0, txt.IndexOf("\0"))
            Return txt
        Catch err As Exception
 
            Conectado = AdsState.ErrorConect
            Return 0
        End Try
 
    End Function
    Public Sub EscribirBoolPorNombre(ByVal Name As String, ByVal Valor As Boolean)
 
        Dim dataStream As AdsStream
        Dim Escribir As AdsBinaryWriter
 
        Try
            'Recuperar Numero Var
            Dim Var As Integer
            Var = adsClient.CreateVariableHandle(Name)
            dataStream = New AdsStream(1)
            Escribir = New AdsBinaryWriter(dataStream)
            Escribir.Write(Valor)
 
            adsClient.Write(Var, dataStream)
        Catch err As Exception
            Conectado = AdsState.ErrorConect
        End Try
    End Sub
 
    Public Sub Desconectar()
        If Conectado = AdsState.ConectadoOk Then adsClient.Dispose()
        Conectado = AdsState.Desconectado
    End Sub
    Public Function StateAds() As String
        If Conectado = AdsState.ConectadoOk Then
            Return 1
        Else
            Return 0
        End If
    End Function
#End Region
End Class

Para poder leer las variables por su nombre, lo que hacemos es recuperar el Valor que identifica esta variable. Esto lo realizamos con la siguiente función:
Var = adsClient.CreateVariableHandle(Name)
Name es el nombre de la variable. Para las variables globales las llamaremos por .NombreDeLaVariable y para el resto NombrePrograma.NombreVariable.

He creado una enumeración para definir los estados de la comunicación. Y una nueva función para recuperar texto del plc. En concreto me interesa la variable MAIN.txtAviso, esta variable nos informa del estado actual de la secuencia.

Este es el código del form principal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
Public Class Form1
    Dim Plc1 As New ClassAds
 
 
 
    Private Sub buConectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buConectar.Click
        Plc1.Conectar()
        Timer1.Enabled = True
    End Sub
 
    Private Sub buDesconectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buDesconectar.Click
        If Plc1.StateAds = 1 Then Plc1.Desconectar()
 
    End Sub
 
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Timer1.Enabled = False
 
        If Plc1.StateAds <> 1 Then
            MessageBox.Show("Error Ads")
            Exit Sub
        End If
 
        laTemp.Text = "Temperatura = " & Plc1.ValorIntPorNombre(".Temperatura") & "ºC"
        laNivelAgua.Text = "Nivel de Agua  = " & Plc1.ValorIntPorNombre(".NivelAgua")
        laEstado.Text = Plc1.txtPorNombre("MAIN.txtAviso")
 
        pbM1.Visible = Plc1.ValorIntPorNombre(".M1")
        pbBombo.Visible = pbM1.Visible
        pbM2.Visible = Plc1.ValorIntPorNombre(".M2")
        pbY1.Visible = Plc1.ValorIntPorNombre(".Y1")
        pbY2.Visible = Plc1.ValorIntPorNombre(".Y2")
 
        pbX1.Visible = Plc1.ValorIntPorNombre(".X1")
        ImgFondo(Plc1.ValorIntPorNombre(".CajonCerrado"))
 
        Timer1.Enabled = True
    End Sub
    Private Sub ImgFondo(ByVal Estado As Integer)
        If Estado Then
            pbFondo.ImageLocation = "../../Resources/LavPreparada.png"
        Else
            pbFondo.ImageLocation = "../../Resources/TodoParado.png"
        End If
    End Sub
 
    Private Sub buMarcha_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buMarcha.Click
        If Plc1.StateAds <> 1 Then Exit Sub
        Plc1.EscribirBoolPorNombre(".InicioLavado", True)
    End Sub
 
    Private Sub buCerrarCajon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buCerrarCajon.Click
        If Plc1.StateAds <> 1 Then Exit Sub
        Plc1.EscribirBoolPorNombre(".CajonCerrado", True)
        Plc1.EscribirBoolPorNombre(".PuertaCerrada", True)
    End Sub
    Private Sub buAbrirCajon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buAbrirCajon.Click
        If Plc1.StateAds <> 1 Then Exit Sub
        Plc1.EscribirBoolPorNombre(".CajonCerrado", False)
        Plc1.EscribirBoolPorNombre(".PuertaCerrada", False)
    End Sub
    Private Sub Form1_Disposed(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Disposed
        If Plc1.StateAds = 1 Then Plc1.Desconectar()
    End Sub
End Class

Este codigo no tiene mucha historia. Se trata de establecer la conexión. Mediante un timer, leer el estado de los motores y valvulas, para mostrar o no los pictureBox. La imagen de fondo la cambiamos mediante la funcion ImgFondo, en función del estado, mostrando una u otra imagen. El resto de codigo son los eventos de los Buttons para abrir/cerrar o poner en marcha la lavadora.
Aquí, dejo tanto el programa del plc como la aplicación en vb.net. Recordaros que deberéis cambiar la dirección AMS en ClassAds. Para seguir adelante con nuestro proyecto deberemos poner en marcha el servidor web y crear las funciones (vb.net) para grabar en la base de datos.

Servidor Web y MySql

Hoy empezaré una serie de post dedicados a al registro de datos y mostrar estos datos en paginas web. Para ello voy a utilizar xammp. Xammp es un servidor web muy fácil de instalar que incluye MySql. En la red podéis encontrar infinidad de información sobre este software. La idea es generar aplicaciones en vb.net que se comuniquen con el plc y registren los datos en la bd MySql. Luego haremos script en php para recoger estos datos y mostrarlos vía web. Todo esto implica cierto conocimientos de php, Sql, html, etc pero realmente no es tan fiero el lobo como lo pintan.

Para empezar debemos instalar xammp en nuestro pc. Es sencillo y sólo estará activo mientras queramos utilizarlo. De esta manera evitaremos cargar el pc con tareas innecesarias, y desinstalarlo sera tan fácil como borrar una carpeta. No hay excusa para no probarlo.

Lo primero es descargar xammp desde aquí.

Una vez descargado lo ejecutamos. Lo que hace es descomprimir el archivo en C:\ por defecto. Una vez terminado el proceso se ejecuta setup_xammp.bat y nos muestra la siguiente ventana:

¿Quieres crear una acceso directo en el menú inicio?. Yo le digo que no.

Esto es para configurar las rutas relativas y absolutas. Le decimos que sí (y) y pa lante:

Esta opción es para utilizar xammp desde una unidad portatil (o eso creo, jijiji). La opción por defecto (n) y seguimos:

Pues ya hemos terminado. Ponemos x, enter y listo. Mi consejo es arrancar y poner en marcha xammp desde estos accesos de la siguiente manera:

Nos vamos a  C:\Xammp

Tal y como muestra la imagen, para poner en marcha nuestro servidor web y mysql solo tenemos que hacer doble click sobre xammp_start y xammp_stop para parar.
Bien, haz doble click sobre xammp_start, abre el navegador y pon esta dirección http://localhost

Si hemos hecho todo correctamente debería aparecer el logo de xammp, pulsa sobre Español y se termino por hoy. Puedes probar a entrar desde otro ordenador de la red donde estés, simplemente poniendo la ip de tu ordenador en el navegador.

En la próxima entrada  entraremos un poco en la base de datos y haremos  el típico “Hola mundo”.

Fb PID y simulador

He preparado un simulador con el que poder probar el bloque de función PID y comparar con una función termostato. Ademas he añadido la posibilidad de utilizar el PID mediante una Fb Pwm (Modulación en ancho de pulsos). Esto nos llevará algunos post para explicar como funciona   pero creo que es mejor poder ir haciendo pruebas desde el primer momento. Es importante destacar que muchos de los Fb utilizados en este programa estan extraídos de la libreria libre Oscat. Veamos un vídeo y seguimos con los detalles. 

   

Pantalla de visualización.

El gráfico nos muestra la evolución de la temperatura y lo que he llamado “valor equipo” que sería, en una aplicación real, la potencia suministrada por los equipos de frío y calor. 

  

 

Simulador cámara.

K camara es una constante utilizada para simular el los cambios de temperatura dentro de la cámara. Los valores positivos serán entradas de calor a la cámara, y los negativos cesión de calor por la cámara. Pot equipo se utiliza para simular la potencia del equipo frigorífico o la fuente de calor (resistencias, bomba de calor, etc). Intervalo, mediante este parámetro podemos modificar las condiciones de inercia de la cámara, el valor es en mseg. 

Parametros Pid.

Kp o constante proporcional, TN o tiempo integral y TV o tiempo derivativo. 

Selectores.

Mediante los tres botones podemos activar cualquiera de las posibilidades, Pid directo, termostato o Pid a traves de PWM. Si existen mas de dos botones activados solo se tiene en cuenta el primero en orden de Izq a Drcha. 

Para ponerlo en marcha solo hay que conectar al PLC, poner a RUN. Para que cambia K cámara por ejemplo con 3.0 y activa una de las funciones, PID, termostato o PWM. 

(A) RUN (B) STOP (C) Conectarse a PLC (D) Desconectar de PLC.

 

 Desde aquí podeis descargar el archivo. Y aquí hay teoria del Pid.