Sonstiges WinCC OA Para + OPC UA: Eigene Struktur verwenden?

bbm1995

Level-2
Beiträge
53
Reaktionspunkte
4
Hallo miteinander,

Ich nutze auf der Automationsebene eine WAGO 750-8212/025-001 mit OPC UA Server und auf der Managementebene die WinCC OA 3.16.

Da der Kunde eine vordefinierte Para Datenpunkttyp Struktur verwendet (.val, .raw, .con, .dis, .wip),
möchte ich diese auch in der SPS als eine eigene Struct weiterverwenden und die gesamte Struktur über OPC senden.
Das hier ist die Funktionsweise und Ablauf der Datenstruktur.

Leider bringe ich es nicht hin, in WinCC OA Para irgendwie die Struktur zu lesen/aufzuspalten. Ich dachte ich könnte darauf zugreifen indem ich die Variable .eState beim Item anhänge, aber ich bekomme keine Werte und auch keine Meldung im Log Viewer.
UaExpert zeigt mir die Struktur als "ExtensionObject" an, WinCC zeigt es mir als "Undefined 256" an, welche ich weiter nicht öffnen kann.

Die Frage aller Fragen: Ist es überhaupt möglich, dass WinCC OA eine Struktur/ExtensionObject von OPC UA verarbeiten kann? Wenn ja, wie?
Wenn nein, dann wüsste ich nicht wie ich das hinkriegen soll ohne eine unübersichtliche Menge an Variablen zu erstellen...

Hier unten ist das Programm innerhalb der SPS:
Code:
{attribute 'qualified_only'}
{attribute 'strict'}

/// DP means Datapoint

TYPE eFAR_Signal :
    (
    debug            := -1,    // DP Custom Status: Debug Mode

    unknown            := 0,    // DP Status: Unknown
    disabled        := 1,    // DP Status: Datapoint disabled
    normal            := 2,    // DP Status: Normal (Off / No Error)
    txt_nolog        := 3,    // DP Status: Informative Lo
    txt_log            := 4,    // DP Status: Informative Hi
    active            := 6,    // DP Status: Active (On / No Error)
    wip_active        := 15,    // DP Status: Work in Progress (Signal active, No Error)
    wip_warning        := 16,    // DP Status: Work in Progress (Warning active)
    wip_alert        := 17,    // DP Status: Work in Progress (Alert active)
    warn_Infra        := 20,    // DP Status: Warning (Infrastructure)
    warn_SMC        := 21,    // DP Status: Warning (SMC)
    warn_General    := 22,    // DP Status: Warning (General)
    alrt_Infra        := 23,    // DP Status: Alert (Infrastructure)
    alrt_SMC        := 24,    // DP Status: Alert (SMC)
    alrt_General    := 25    // DP Status: Alert (General)
    ) INT;
END_TYPE
Code:
TYPE typeOPC :
    STRUCT
    (**)
        eState:        INT;            // (normally eFAR_Signal instead of INT)

        xCON:        BOOL;            // OPC Connection Status
        xDIS:        BOOL;            // Variable (in)active (blocks alerts completely)
        xWIP:        BOOL;            // Work in Progress (blocks alert sms)

    END_STRUCT
END_TYPE
Code:
FUNCTION_BLOCK fbFAR_State
VAR_IN_OUT
    DP:    typeOPC;    // OPC Datapoint Structure
END_VAR
VAR_INPUT
    xVAL:        BOOL := FALSE;    // Active/Normal
    xCON:        BOOL := FALSE;    // Connection
    xWIP:        BOOL := FALSE;    // Work in Progress / WIP_Warn / WIP_Alert
    xLog:        BOOL := FALSE;    // Informative Hi Signal
    xNoLog:        BOOL := FALSE;    // Informative Lo Signal

    xWarn:        BOOL := FALSE;    // Warning
    eWarn:        eFAR_Signal := eFAR_Signal.warn_General;    // Warning Priority

    xAlert:        BOOL := FALSE;    // Alert
    eAlert:        eFAR_Signal := eFAR_Signal.alrt_General;    // Alert Priority

    xDebug:        BOOL := FALSE;    // Debug Mode
    eDebug:        eFAR_Signal := eFAR_Signal.debug;            // Debug State
END_VAR

;=============================================================================
;=============================================================================

(* State Debugging *)
    IF xDebug THEN
        DP.eState := eDebug;                        RETURN;
    END_IF

(* Signal alive? *)
    IF xCON THEN

    (* Signal disabled? *)
        IF DP.xDIS THEN
            DP.eState := eFAR_Signal.disabled;        RETURN;
        END_IF

    (* Alert *)
        IF xWIP
            AND xAlert THEN
            DP.eState := eFAR_Signal.wip_alert;        RETURN;
        ELSIF xAlert THEN
            DP.eState := eAlert;                    RETURN;
        END_IF

    (* Warning *)
        IF xWIP
            AND xWarn THEN
            DP.eState := eFAR_Signal.wip_warning;    RETURN;
        ELSIF xWarn THEN
            DP.eState := eWarn;                        RETURN;
        END_IF

    (* Input *)
        IF xWIP
            AND xVAL THEN
            DP.eState := eFAR_Signal.wip_active;    RETURN;
        ELSIF xVAL THEN
            DP.eState := eFAR_Signal.active;        RETURN;
        END_IF

    (* Logging *)
        IF xLog THEN
            DP.eState := eFAR_Signal.txt_log;        RETURN;
        ELSIF xNoLog THEN
            DP.eState := eFAR_Signal.txt_nolog;        RETURN;
        END_IF

    (* No special status *)
        DP.eState := eFAR_Signal.normal;
    ELSE
    (* Status unknown *)
        DP.eState := eFAR_Signal.unknown;
    END_IF
 
Zurück
Oben