12 de abril de 2010

Modificar datos en recetas a través de scripts en WinCC Flexible

En los paneles de operador de Siemens (si exceptuamos los paneles más sencillos) tenemos la posibilidad de programar nuestras propias funciones en Visual Basic Script. Esto nos permite una gran flexibilidad a la hora de plantear nuestras aplicaciones, incluso permitiendo liberar al PLC de ciertas operaciones complejas usando el panel como apoyo de cálculo.

Desde un script tenemos acceso a la tabla de variables, a los objetos, a las funciones pre programadas e incluso a otros scripts. La programación es muy cómoda ya que el editor del WinCC Flexible es muy completo, con sintaxis coloreada, asistente de funciones y plantillas de código. Tal y como viene explicado en la ayuda:

Para crear scripts pulse <Ctrl><Espacio> y compruebe la amplia variedad de funciones. Escriba scripts utilizando funciones del sistema o el modelo de objetos. El objeto HMI Runtime permite acceder fácilmente al sistema. Para seleccionar una referencia de objetos pulse <Alt><Flecha derecha>. Puede crear scripts complejos con elementos del lenguaje de programación VBScript y acceder directamente a las variables a través de los nombres, p.ej. variable = 5.

En mi caso se me planteó la siguiente situación: en una máquina existe una receta donde se almacenan diferentes cotas para situar un eje durante el montaje de una pieza. Estas cotas son diferentes para cada referencia de trabajo (piezas diferentes) y están referidas al punto de apoyo de la pieza en la máquina. El cliente ha estado usando la máquina durante un tiempo y llevaba creadas más de 50 referencias. Por imperativo de diseño es necesario variar el punto de apoyo de todas las piezas, con lo que todas las cotas almacenadas deben ser modificadas en una cantidad fija. Además se prevé que en un futuro el punto de apoyo pueda volver a cambiar. Modificar las cotas para todas las referencias a mano sería una posibilidad, pero para hacerlo más fácil podemos echar mano de un script.

Para ello, lo primero será introducir el valor de cota a sumar a todas las referencias con un campo de entrada y un botón para ejecutar el script, así como un campo de texto que nos indicará qué está haciendo el script.


A continuación será necesario declarar algunas variables en la tabla de variables del proyecto. Cota_a_sumar será el valor en el que se modificarán las cotas (asociado al campo de entrada), Mensaje es una cadena de caracteres para visualizar mensajes y Estado es una variable que indica qué están haciendo las funciones que leen y escriben registros de la receta, es importante declararla aquí, ya que si lo hacemos internamente en el script no funcionará. El resto de variables son las que están asociadas a la receta.


Ya estamos listos para empezar a programar, el editor de scripts en WinCC Flexible tiene este aspecto:


El código del script es el que va a continuación:

Dim Contador 'Contador de registros modificados
Dim Indice 'Índice para recorrer los registros

Indice = 1 'Índice del primer registro a modificar
Contador = 0

Do While Indice <= 100 'Índice del último registro a modificar

'Se carga el registro
Call LoadDataRecord(1,Indice,Estado)

'Se espera a que se cargue (2 significa que está cargando)
Do While Estado = 2
Mensaje = "Leyendo registro índice " & Indice & "..."
Loop

If Estado = 4 Then 'El registro se ha leído correctamente

'Se calculan las cotas nuevas
Cota_inicial = Cota_inicial + Cota_a_sumar
Cota_montaje = Cota_montaje + Cota_a_sumar
Cota_final = Cota_final + Cota_a_sumar

'Se guardan los datos en el mismo registro
Call SaveDataRecord(1,Indice,hmiOverwriteAlways,hmiOn,Estado)

'Se espera a que termine de escribir
Do While Estado = 2
Mensaje = "Guardando registro índice " & Indice & "..."
Loop

If Estado = 4 Then 'Registro guardado correctamente
Mensaje = "Registro índice " & Indice & " guardado."
Contador = Contador + 1
Else 'Error en la operación de guardar el registro
Mensaje = "Error al guardar el registro índice " & Indice
End If

Else 'Error al leer el registro (seguramente porque no existe)
Mensaje = "No existe o error al leer el registro índice " & Indice
End If

Indice = Indice + 1 'Vamos al registro siguiente

Loop

Mensaje = "Modificados correctamente " & Contador & " registros."

Lo que hace el script es recorrer desde el registro número 1 hasta el 100 de la receta, los lee, si no hay error (el registro existe) le suma el valor y lo guarda esperando a que acabe. Se lleva un contador de registros modificados que se muestra en el mensaje final.

Ahora en el panel, si introducimos un valor en el campo COTA A SUMAR y pulsamos sobre el botón MODIFICAR COTA EN REFERENCIAS todas las referencias serán actualizadas automáticamente.



Y listo, así ya podemos actualizar todas las cotas de todas las referencias simplemente pulsando un botón. Cualquier comentario, como siempre, será bienvenido.

2 comentarios:

  1. Hola, la entrada es un poco vieja, pero quería aprovechar parar preguntarte por un dilema que tengo. Estoy programando script en wincc flexible y estoy teniendo problemas a la hora de intentar manipular la "visibilidad" en un bloque de imagen. ¿podrías ayudarme?.
    Un saludo

    ResponderEliminar
  2. Si especificas un poco más tu problema quizás pueda ayudarte. Escríbeme mejor al correo del blog: notasdeautomatizacion@gmail.com

    Un saludo.

    ResponderEliminar

Por favor, no pidas copias de programas comerciales, licencias o números de serie.