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.
Authors: David