Configurar el Webserver del S7 1200 para leer y escribir datos

El PLC de siemens S7 1200 me sorprende cada día mas por sus características y sus prestaciones a un precio más que razonable, aunque sí que es cierto que la mayoría de fabricantes de PLC cada día aportan más funciones y prestaciones a sus PLC, el 1200 tiene la ventaja de utilizar el TIA PORTAL como herramienta de trabajo, lo que le hace aún más interesante por su facilidad de uso y su facilidad de escalar a PLC de gama media o alta. En este post voy a explicar cómo utilizar el Webserver para leer o escribir en el PLC, esto nos puede ser muy útil cuando queramos una alternativa a una pantalla táctil, siempre y cuando solo queramos manipular una pequeña cantidad de datos del PLC y no tengamos que desarrollar una gran aplicación de monitoreo.

Configurar el Webserver del S7 1200 para leer y escribir datos

En primer lugar debemos de crear una página HTML donde pondremos una variable para leer y otra para escribir del PLC, puede ser tanto una variable de un DB, una marca o lo que queramos, la página se puede hacer con un editor de texto como el Notepad:

pagina-html-seb-server-s71200

Podemos observar que para leer del 1200 utilizamos los caracteres :=”variable”, y para escribir lo debemos de hacer mediante un formulario form y con algún objeto HTML de entrada de datos, por ejemplo en este caso un input.

Una vez creada la página la guardamos en un directorio de nuestro PC, recordamos la ubicación porque se lo debemos de indicar en el TiaPortal

Seguidamente tenemos que abrir la configuración del PLC y activar el webserver si no estaba activado:

configuracion-Web-server-s71200

En la pestaña de páginas de usuario seleccionamos la carpeta donde hemos guardado nuestra página de ejemplo, seguidamente le damos al botón generar DB:

PAGINAS-USUARIO-Web-server-s71200

En este punto nos ha generado 2 DB que usa el 1200 para generar las páginas HTML, siempre que queramos actualizar las páginas deberemos volver a generar estos DB y evidentemente transferir al PLC.

Para que nuestra página de ejemplo funcione tenemos que realizar una llamada cíclica, por ejemplo en el OB1 de la función www, aquí indicaremos nuestro número de DB generado:

www-Web-server-s71200

Antes de finalizar creamos un usuario nuevo y le damos permiso para visualizar páginas de usuario, al final transferimos al PLC todas las modificaciones.

Ahora solo queda probar, abrimos el navegador web y apuntamos a la dirección web del autómata, entraremos en la página del PLC y una vez que nos registraremos con el usuario que hemos añadido, dispondremos de un link con acceso a las páginas de usuario, podemos ver nuestra página leyendo y escribiendo las 2 variable que hemos creado en la página:

PAGINAS-USUARIO-LINK-Web-server-s71200

PAGE-Web-server-s71200

Conexión a SQLSERVER con WinCC professional

En este post voy a explicar cómo guardar datos desde Wincc Professional a una base de datos SQLSERVER.

Vamos a suponer que tenemos instalado el Wincc Profesional 7.2 y SQLSERVER 2008 en el mismo ordenador para hacer las pruebas de conexión y para guardar los datos en una tabla de la base de datos.

Conexión a SQLSERVER con WinCC professional

Creamos una base de datos de prueba

Para crear una base de datos con una tabla para realizar las pruebas lo haremos con la herramienta “SQL Server Management Studio” que viene instalada en el SQLSERVER 2008, con este programa crear bases de datos y sus correspondientes tablas es una tarea sumamente sencilla, incluso lleva un programa muy intuitivo para crear relaciones con las tablas.

El primer paso es abrir el “SQL Server Management Studio” y conectarnos con el servidor, en este caso el propio ordenador, seguidamente crearemos una base de datos para las pruebas con una tabla y algunos campos donde guardaremos los datos:

sql-server-management

Con esto ya tenemos creada la base de datos, ahora vamos a conectar a la base de datos desde Wincc y guardaremos el valor de temperatura leído previamente del PLC.

Conectar a la base de datos desde WinCC

Abrimos el WinCC explorer y abrimos el editor “VBS-Editor“,  nos vamos a la pestaña acciones y agregamos un nuevo script donde lo ejecutaremos de manera cíclica cada 1 minuto, es decir registraremos el valor de temperatura casa 1 minuto, la conexión la realizaremos mediante OLEDB, abrimos una conexión ADODB.Connection y insertamos mediante un insert en la base de datos prueba y en la tabla registro:

winccexplorer-vbs

winccexplorer-vbs-REGSQLSERVER

La variable del wincc que corresponde a un valor de temperatura del PLC en este ejemplo se llama “AEC“, leemos el valor real de la variable y la insertamos en la tabla registro, como es un valor real de coma flotante, antes debemos de cambiar las comas por puntos con un replace sino daría error al insertar el la tabla

Conclusiones

Una manera muy sencilla de realizar una Conexión a SQLSERVER con WinCC profesional, además la instalacion de Wincc 7.2 ya lleva incorporado una instalación de SQLSERVER 2008, lo qual lo pone aun mas fácil a la hora de decidir como registrar datos desde el Scada.

ArrayList y indexOf, encontramos objetos dentro de un array en vb.net

En este post voy a explicar cómo encontrar objetos dentro de un array o cadena de objetos en vb.net

Vamos a suponer que tenemos un grupo de alumnos que los introducimos en un array o un vector, y nos interesa buscar un alumno en concreto de esa lista, una manera seria haciendo un recorrido por todo el vector hasta que encontremos el alumno que busquemos, otra mucho más fácil es utilizar el método “indexOf” de la clase ArrayList, donde nos devolverá la posición exacta dentro del array del alumno que estamos buscando, de esta manera con ArrayList y indexOf, encontramos objetos dentro de un array en vb.net.

Definición de la clase alumno

Vamos a definir la clase alumno con sus propiedades habituales, nombre, apellidos, dirección, etc, dentro de la clase sobrescribimos el método “Equals” y dentro de este método devolveremos true o false si el objeto propio de la clase es igual al que recibimos del método, pudiendo realizar la comparación con los campos que nos interesen de la clase alumno, de la siguiente manera:

Public Class alumne
    Inherits persona
    Private IDALUMNE As Integer
    Public Sub New(ByVal sNom As String, ByVal sIDALUMNE As Integer)
        MyBase.New(sNom)
        IDALUMNE = sIDALUMNE
    End Sub
    Public Function getidAlumne() As Integer
        Return IDALUMNE
    End Function
    Overrides Function Equals(ByVal obj2 As Object) As Boolean      '         
        If Not obj2 Is Nothing Then
            If Not obj2 Is System.DBNull.Value Then
                Dim c As alumne = obj2
                If c.getidAlumne = getidAlumne() Then
                    Return True
                End If
            End If
        End If
        Return False
    End Function
End Class

Este método sobrescrito recibe como parámetro “obj2” de tipo object, este objeto con toda seguridad de tipo alumno es comparado con los campos de nuestra clase, aquí se puede ver que se compara con el idAlumne, pero se podría utilizar los otros campos del objeto, nombre, apellidos, etc, devuelve true si es el mismo objeto o false si no lo es.

Esta implementación la podemos utilizar como rutina habitual en la declaración de todas las clases de identidad de nuestro programa, luego se puede utilizar o no si es necesario.

Ejemplo ArrayList y indexOf, encontramos objetos dentro de un array en vb.net

Vamos a ver cómo podemos encontrar un alumno dentro de un arrayList después de haber sobrescrito el método “Equals”:

Dim a As alumne
Dim array As ArrayList = New ArrayList

a = New alumne("Jordi", 12) 'Vamos creando alumnos
array.Add(a)  'añadimos el alumno en el array
a = New alumne("Anna", 24)
array.Add(a)
a = New alumne("Joan", 32)
array.Add(a)
a = New alumne("Carme", 14)
array.Add(a)
a = New alumne("Josep", 31)
array.Add(a)
a = New alumne("Marc", 20)
array.Add(a)
a = New alumne("Mireia", 22)
array.Add(a)

Dim posicio As Integer
posicio = array.IndexOf(New alumne("", 31)) 'Busco el alumno con identificador 31 y me devuelve la posicion 4
posicio = array.IndexOf(New alumne("", 12)) 'Busco el alumno con identificador 12 y me devuelve la posicion 0

En el ejemplo hemos declarado 7 alumnos y los hemos añadido en un array, luego buscamos dentro del array con el método “indexOf”, el alumno con identificador 31 y nos devuelve la posición 4.

Conclusiones

Una manera muy fácil y rápida de encontrar objetos dentro de un array es sobrescribir el método “Equals” dentro de la clase, de esta manera encontrar objetos coincidentes dentro de un array con gran cantidad de datos se convierte en una tarea muy sencilla.