En la entrada anterior expliqué cómo dibujar una gráfica en HMI con los datos almacenados en un bloque de datos (DB) en un PLC. Ahora voy a centrarme en la captura de datos en el propio PLC y para ello he desarrollado una función de bloque que recoge todo el proceso de captura.
Realizar la captura de datos de un proceso puede resultar un tema complejo ya que debemos tener en cuenta todos los factores en juego, tales como la velocidad de adquisición o la capacidad de almacenamiento disponible. La forma óptima y con la que obtendremos el mejor rendimiento es usar bloques de organización (OB) de interrupción por tiempo "Cyclic interrupt", en los que a intervalos regulares se leen las señales a analizar. En los nuevos PLC de la gama 1500 de Siemens he visto que se pueden programar OB de interrupción por tiempo con periodos de 500 μs en adelante.
En los veteranos S7-300 estos OB tienen un periodo de interrupción más largo, pueden empezar, según modelo, en el rango de 100 o 200 ms en adelante.
Sin embargo esta no es la estrategia que voy a seguir en este ejemplo, ya que el FB que he programado se llamará en el ciclo principal del PLC. Por tanto lo primero de lo que debemos asegurarnos es que el tiempo de ciclo de nuestro programa es suficiente para registrar los datos del sistema. Por ejemplo si tenemos una señal analógica proveniente de una célula de carga cuyo conversor analógico/digital tiene un tiempo de actualización de 100 ms y el tiempo de ciclo de nuestro PLC es de unos 15 ms, entonces no habrá problemas con la captura de datos.
NOTA: es importante señalar que el tiempo de ciclo de un PLC no es un valor constante y depende de la carga de programa en cada ciclo. Por lo general será suficiente asegurarse de que, mientras esté la captura de datos en marcha, no se requieran tareas pesadas al PLC tales como bucles FOR o WHILE largos.
Otro elemento a tener en cuenta es la cantidad máxima de datos a almacenar. Mi objetivo es la representación de los datos en una gráfica en un panel de Siemens y el número máximo de elementos que puede tener una tabla para ser enlazada desde el panel al PLC es de 1600 valores. Si se toma un dato en cada ciclo de scan del PLC las tablas de datos se llenan en pocos segundos, así que es necesario discriminar los datos a guardar cada cierto intervalo o el máximo valor de cada intervalo, por ejemplo.
Teniendo todo esto en cuenta he preparado un FB que utilizo cuando tengo que hacer un registro de datos. Una llamada a dicho FB tiene el siguiente aspecto:
El funcionamiento es el siguiente: cuando la señal de habilitación está activa y la Señal X se encuentra entre el Valor mínimo (X) y Valor máximo (X) se procede a la captura de datos, indicado con la salida Capturando. Cada vez que la Señal X se incremente en un Paso mínimo (X) se almacenará un nuevo dato en la tabla, salvo que esté activada la opción Guardar máximos (Y), en cuyo caso el valor que se guardará será el máximo para la Señal Y dentro del intervalo definido por el Paso mínimo (X). Una vez finalizada la captura de datos, bien porque la Señal X haya salido de la ventana de valores mínimo y máximo o porque haya caído la señal de habilitación, se activará la salida Listo durante el tiempo especificado en Tiempo pulso fin lectura. El número de puntos almacenados en las tablas lo tenemos en la salida Puntos y si se alcanza el límite de datos posible se activa la señal Desbordamiento. Para repetir una captura de datos será necesario dar un pulso a la señal de Reinicialización antes de volver a habilitar la captura.
Los datos se almacenan en tablas que deberemos crear en un bloque de datos (DB) aparte y deberán tener el formato Array[0..1599] of Real. Se pasan al FB como parámetros InOut, y al ser un tipo de datos estructurado se pasan como puntero, con lo que no se desperdicia memoria duplicando las tablas, tal y como viene explicado en la documentación: