¿Cómo pasar una variable en el filtro de uaArchiveSetFilter en PCS 7 WinCC?

Para usar una variable en el filtro de User Archive en PCS 7, se debe construir una cadena de texto dinámica usando sprintf en scripts C para formatear correctamente la sentencia SQL.

¿Cómo pasar una variable en el filtro de uaArchiveSetFilter en PCS 7 WinCC?

Category: PCS 7 / User Archives | Technology: Siemens PCS 7, WinCC Runtime, C-Script, SQL Filter | Article Type: Guía de Configuración / Resolución de Problemas | Code: C135

También útil: User Archive | C-Script | WinCC Runtime | SQL Filter | PCS 7 V6.0

Contexto: Uso de scripts ANSI-C en Siemens WinCC y PCS 7 para manipular bases de datos relacionales mediante la API de User Archives utilizando filtros dinámicos.

¿Por qué falla el filtro de uaArchiveSetFilter cuando se introduce el nombre de una variable directamente en el argumento de texto?
La función uaArchiveSetFilter requiere una cadena de texto de tipo char que contenga una instrucción SQL válida; si se escribe el nombre de la variable de script directamente dentro de las comillas, el motor de base de datos busca literalmente el texto del nombre en lugar de su valor.*

Tabla de Contenidos

Primeros Chequeos Antes de Modificar el Script C

Nota de producción: Antes de compilar o descargar cambios de scripts en un sistema PCS 7 en ejecución, confirme que cuenta con un respaldo del proyecto. Las modificaciones en scripts C que interactúan con User Archives pueden afectar la velocidad de respuesta del runtime si se ejecutan de manera cíclica o incorrecta.

  • Compruebe el tipo de datos de la columna en la configuración de User Archive (campos numéricos vs. campos de texto).
  • Identifique el tag de WinCC (Internal Tag o Process Tag) que almacenará el criterio de filtrado dinámico.
  • Asegúrese de conocer la longitud máxima esperada del valor de la variable para evitar desbordamientos de búfer en C.

Contexto Técnico y Comportamiento de la API

La función nativa uaArchiveSetFilter actúa enviando una cláusula de filtrado de tipo WHERE basada en el estándar SQL hacia el motor de base de datos subyacente de WinCC Runtime.

Cuando se ejecuta el código directamente como:

C

uaArchiveSetFilter(hArchive, "ContractNB = toto");

El sistema interpreta el texto "toto" como el nombre de una columna inexistente o como un valor de texto fijo de SQL, rompiendo la lógica del script. Para solucionarlo, el entorno ANSI-C requiere la reserva de un búfer de memoria dinámica en el script local, la lectura del tag mediante las funciones GetTag de WinCC, y la combinación del texto usando funciones estándar de manipulación de cadenas como sprintf.

Procedimiento de Configuración: Construcción Dinámica del Filtro

Siga estos pasos estructurados para implementar un filtrado basado en variables internas o de proceso en el entorno de desarrollo de WinCC / PCS 7:

  1. Defina un búfer de texto local en su script: Reserve espacio en memoria suficiente para almacenar toda la sentencia SQL resultante utilizando un arreglo de caracteres (char).
  2. Determine el tipo de variable a leer: Use GetTagChar si el tag de WinCC contiene texto, o GetTagDWord / GetTagWord si el criterio es numérico.
  3. Formatee la cadena de filtrado dinámicamente: Utilice la función sprintf para inyectar el valor real de la variable dentro del formato del texto de filtro SQL.
  4. Aplique el filtro procesado: Invoque la función de la API de User Archives pasando la variable del búfer formateado como argumento.
  5. Ejecute la lectura del archivo: Recuerde llamar a uaArchiveReopen o uaArchiveMoveFirst para actualizar el set de datos visible en el control de pantalla tras aplicar el nuevo filtro.

Ejemplo de Código para Variables de Texto (String)

Si el campo ContractNB se define como texto, SQL requiere comillas simples (') rodeando el valor:

C

char szFilter[128] = "";
char* pszValue = NULL;

pszValue = GetTagChar("toto"); // Lee el Tag de WinCC llamado "toto"

if (pszValue != NULL) {
    // Formatea: ContractNB = 'ValorDelTag'
    sprintf(szFilter, "ContractNB = '%s'", pszValue);
    uaArchiveSetFilter(hArchive, szFilter);
}

Ejemplo de Código para Variables Numéricas (Integer/DWord)

Si ContractNB está configurado en la base de datos como un número entero:

C

char szFilter[128] = "";
DWORD dwValue = 0;

dwValue = GetTagDWord("toto"); // Lee el Tag numérico de WinCC

// Formatea sin comillas simples para valores numéricos SQL
sprintf(szFilter, "ContractNB = %d", dwValue);
uaArchiveSetFilter(hArchive, szFilter);

Errores Comunes en la Sintaxis de C y SQL

  • Ausencia de comillas en campos de texto: Omitir las comillas simples (' '%s' ') al formatear strings para SQL generará fallas silenciosas en la base de datos y el filtro no devolverá ningún registro.
  • Desbordamiento de arreglos (Buffer Overflow): Definir tamaños de texto pequeños como char filter[20] provoca caídas críticas del proceso del runtime (Global Script o Graphics Designer) si el contenido final supera ese límite de caracteres.
  • Comparaciones directas sin formatear: Intentar concatenar cadenas de caracteres en lenguaje C utilizando el operador + ("Filtro" + variable) en lugar de sprintf.

Verificación en Runtime

Para corroborar la correcta funcionalidad del script en la estación de operador, valide los siguientes puntos de control:

Monitoreo del filtro aplicado: ¿El objeto en runtime muestra los registros correctos tras cambiar el valor del Tag?

☐ Sí ☐ No ☐ Requiere Revisión

Verificación de Diagnóstico en WinCC: ¿El archivo de logs de diagnóstico APLOGON.log o la ventana de Application Diagnostics está libre de errores de sintaxis SQL?

☐ Sí ☐ No ☐ Requiere Revisión

FAQ

¿Se puede usar código en VBS (Visual Basic Script) para filtrar User Archives en PCS 7? Sí, en versiones compatibles con VBScript, se puede acceder al objeto a través del modelo COM de WinCC. La ventaja de VBS es que la concatenación de variables y textos dinámicos es más sencilla mediante el uso del operador & sin necesidad de gestionar búfers de memoria ni punteros manuales como en ANSI-C.

¿Por qué no cambia la vista en la pantalla de operación después de llamar a uaArchiveSetFilter? La función uaArchiveSetFilter únicamente define la condición lógica en la memoria del manejador (hArchive). Para forzar que el control de visualización o las funciones de lectura carguen los datos modificados del SQL, se debe invocar inmediatamente después la función de actualización o reapertura del archivo de datos.

Próximos Pasos / Artículos Relacionados

Related Linked Tags

Siemens PCS 7 | WinCC | C-Script | User Archive | SQL | Global Script

Contact / Support

¿Necesita soporte técnico especializado para el desarrollo de proyectos y configuraciones avanzadas en entornos PCS 7 y bases de datos industriales?

Comuníquese con nuestro equipo de ingenieros de soporte a través de: [email protected]

Technical Classification

Category: PCS 7 / Control System Connectivity

Technology: Siemens PCS 7, WinCC Runtime, ANSI-C Scripting, User Archive API

Object Type: WinCC Script Editor / User Archive Database

Use Case: Filtrado dinámico de recetas y bases de datos mediante variables del operador en runtime.

Article Type: Configuration Guide / Troubleshooting

Primary Search Intent: ¿Cómo usar una variable como filtro en la función uaArchiveSetFilter de WinCC C-Script?

Related Search Phrases: