Lectura y edición de atributos de iconos de bloque definidos por el usuario mediante VBA en WinCC Graphics Designer

Intentar leer atributos definidos por el usuario como 'TagNameDisplayed' utilizando 'objObject.TagNameDisplayed' en WinCC Graphics Designer VBA produce el error de tiempo de ejecución 438 ('El objeto no es compatible con esta propiedad o método') porque 'TagNameDisplayed' no es una propiedad COM nativa de 'HMIObject'. Para leer y modificar correctamente las propiedades dinámicas o definidas por el usuario en VBA, se debe acceder a la colección 'Properties' del objeto utilizando la sintaxis 'objObject.Properties("TagNameDisplayed").Value'. Esto permite realizar auditorías por lotes automatizadas y el cambio de nombre de las etiquetas de los iconos de bloque de APL en todos los despliegues de proceso.

Índice de contenidos

Resumen ejecutivo

Durante proyectos de puesta en marcha a gran escala en PCS 7 o de estandarización de planta, los ingenieros de automatización escriben frecuentemente macros en Visual Basic for Applications (VBA) dentro de WinCC Graphics Designer para automatizar tareas repetitivas, tales como el cambio de nombre de variables o la actualización de etiquetas de visualización en cientos de iconos de bloque. Sin embargo, los desarrolladores que intentan leer propiedades personalizadas de APL —como TagNameDisplayed— a menudo se encuentran con un obstáculo de programación: el descriptor de acceso de objetos VBA estándar genera el Error 438: El objeto no admite esta propiedad o método. Este artículo explica el modelo de objetos interno de WinCC Graphics Designer, contrasta las propiedades COM nativas con las colecciones de propiedades dinámicas y proporciona scripts de VBA listos para producción para editar por lotes los atributos de los iconos de bloque.

Mecánica arquitectónica y del sistema

Arquitectura del modelo de objetos de WinCC Graphics Designer:

  • Interfaz HMIObject: Representa cualquier elemento gráfico (rectángulo, círculo, icono de bloque personalizado, control OLE) ubicado en una pantalla de imagen .pdl.
  • Propiedades nativas frente a la colección de propiedades dinámicas:
  • Propiedades nativas: Se exponen directamente a través de los métodos de la interfaz COM (p. ej., objObject.ObjectName, objObject.Layer, objObject.Width, objObject.Height, objObject.Type).
  • Propiedades dinámicas / definidas por el usuario: Los atributos personalizados agregados a objetos agrupados o personalizados (como TagNameDisplayed, ServerName, Type, HighlightColor) NO existen como métodos COM directos. En su lugar, residen en la colección objObject.Properties.
  • Sintaxis de acceso correcta: objObject.Properties("TagNameDisplayed").Value.
  • Mecanismo del error 438: Llamar a objObject.TagNameDisplayed fuerza a VBA a consultar la tabla de distribución COM de vinculación anticipada de HMIObject, la cual carece de este miembro, generando el Error 438 de inmediato.

Procedimiento paso a paso de ingeniería e implementación

Paso 1: Abrir el editor de VBA en Graphics Designer

  1. Abra cualquier imagen de visualización de proceso en WinCC Graphics Designer.
  2. Presione Alt + F11 para iniciar el editor integrado de Microsoft Visual Basic for Applications (VBA).
  3. Inserte un nuevo módulo en VBA-Project (<PictureName>.pdl) -> 'Modules' -> 'Module1'.

Paso 2: Implementar la macro de lectura segura de atributos

Escriba una rutina de VBA que recorra en bucle todos los objetos de la pantalla, verifique la existencia de TagNameDisplayed y lea su valor:

Sub ReadAllTagNamesDisplayed()
    Dim objObject As HMIObject
    Dim objProp As HMIProperty
    Dim strTag As String

    For Each objObject In ActiveDocument.HMIObjects
        On Error Resume Next
        Set objProp = objObject.Properties("TagNameDisplayed")
        On Error GoTo 0

        If Not objProp Is Nothing Then
            strTag = objProp.Value
            Debug.Print "Object: " & objObject.ObjectName & " | TagNameDisplayed: " & strTag
            Set objProp = Nothing
        End If
    Next objObject
End Sub

Paso 3: Implementar el script de modificación de atributos por lotes

Para modificar por lotes los prefijos o eliminar los nombres de las tendencias en todos los iconos de la pantalla:

Sub BatchModifyTagNameDisplayed()
    Dim objObject As HMIObject
    Dim objProp As HMIProperty

    For Each objObject In ActiveDocument.HMIObjects
        On Error Resume Next
        Set objProp = objObject.Properties("TagNameDisplayed")
        On Error GoTo 0

        If Not objProp Is Nothing Then
            ' Example: Replace prefix "OLD_" with "NEW_"
            If InStr(objProp.Value, "OLD_") > 0 Then
                objProp.Value = Replace(objProp.Value, "OLD_", "NEW_")
            End If
            Set objProp = Nothing
        End If
    Next objObject
    ActiveDocument.Save
End Sub

Paso 4: Ejecutar la macro y revisar la salida

Ejecute la macro mediante F5 en el editor de VBA. Inspeccione la ventana Inmediata (Ctrl + G) para verificar todas las variables analizadas.

Verificación

Para verificar la ejecución de la macro:
1. Verifique la ventana Inmediata en el editor de VBA; confirme que todos los iconos de bloque informen sus cadenas de visualización personalizadas sin generar el Error 438.
2. Cambie a Graphics Designer; seleccione un icono de bloque modificado e inspeccione su ventana de Propiedades de Objeto en 'System' -> 'TagNameDisplayed'.
3. Confirme que el campo de texto refleje la cadena actualizada del script.
4. Guarde la imagen y verifique la apariencia de la visualización en WinCC Graphics Runtime.

Limitaciones y precauciones operativas

Precauciones operativas:
- Modificar TagNameDisplayed altera únicamente la etiqueta de texto que se muestra en pantalla; NO altera la variable de conexión de tiempo de ejecución subyacente (Tag), por lo que la comunicación de proceso no se ve afectada.
- Cree siempre una copia de seguridad del archivo de imagen .pdl antes de ejecutar macros de modificación por lotes.
- Volver a ejecutar 'Create/Update Block Icons' en SIMATIC Manager sobrescribirá los valores personalizados de TagNameDisplayed a menos que las reglas de los iconos de bloque en la jerarquía de la planta estén sincronizadas.

Preguntas frecuentes para ingenieros

Q: Why did objObject.TagNameDisplayed trigger Error 438?

A: Because TagNameDisplayed is a user-defined property stored within the Properties collection, not a direct COM method of HMIObject.

Q: Can this VBA script run in WinCC Runtime?

A: No. VBA macros execute inside Graphics Designer during engineering. For runtime actions, use C-Script or VBScript (using ScreenItems("Object").TagNameDisplayed).

Q: How do I check if an object possesses a specific property?

A: Use On Error Resume Next, attempt to set objProp = objObject.Properties("PropertyName"), and check If Not objProp Is Nothing.

Q: Can VBA edit properties across multiple .pdl files automatically?

A: Yes, by utilizing Documents.Open within a VBA loop over all files in the GraCS directory.

Q: Does changing this property modify CFC block comments?

A: No. VBA edits the WinCC graphic display properties only; controller CFC configurations are unchanged.

Referencias técnicas

Artículos relacionados

Etiquetas relacionadas

WinCC VBA, TagNameDisplayed, HMIObject, Error 438, Graphics Designer

20 respuestas