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:
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