Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Results 1 to 1 of 1

Thread: TwinCat 3 PLCOpen Opc-UA - Structure Problem

  1. #1
    Join Date
    23.03.2020
    Posts
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo ich bin sowohl hier im Forum, als auch in der Programmierung von SPSen neu. Ich hoffe ihr helft mir trotzdem.

    Ich nutze die PLCOpen Funktionsbausteine um Daten via OPC-UA zu empfangen. Diese Daten liegen als Structur vor. Das Struct besteht aus verschiedenen Datentypen wie Int, Real, Bool, ... außerdem sind Arrays vorhanden. Soweit funktioniert das ganze auch super. Sobald jedoch in dem Struct ein String ist, kann ich den entsprechenden Knoten nicht mehr auslesen. Ich erhalten dann folgend Fehlermeldung (aus Zustand iState = 50):
    0x745 1861 ADSERR_CLIENT_SYNCTIMEOUT Timeout ist aufgetreten
    Im UAExpert kommen die Daten alle (auch der problematische String) an. Mit Hilfe des virtuellen OPC-Geräts in TwinCat kann ich die Daten auch empfangen, das möchte ich aber nicht.

    Ich habe sowohl TwinCat als auch das TF6100 OPC-UA Paket auf die neuste Version geupdatet.

    Meinen Code findet ihr hier:

    Code:
    {attribute 'pack_mode' := '1'}
    {attribute 'OPC.UA.DA.StructuredType' := '1'}
    TYPE ST_Values :
    STRUCT
      test:    ARRAY [1..10] OF ST_2;
      
      // Hier ist der problematische String
      //{attribute 'TcEncoding' := 'UTF-8'}
      //test_name : STRING(80);
      
      name: INT;
      
      Sensor : REAL;
      
      Sensorsatz2 : ST_2;
    END_STRUCT
    END_TYPE
    Code:
    {attribute 'pack_mode' := '1'}
    {attribute 'OPC.UA.DA.StructuredType' := '1'}
    TYPE ST_2:
    STRUCT
        Sensor1 : REAL;
    END_STRUCT
    END_TYPE
    Code:
    PROGRAM MAIN
    VAR
        x : INT;
        {attribute 'OPC.UA.DA' := '1'}
        st_Values : ST_Values;
    END_VAR
    Code:
    x := x +1;
    st_Values.test[1].Sensor1 := 0.5 * x;
    st_Values.test[7].Sensor1 := 3 * x;
    st_Values.Sensor := x;
    OPC_via_PLCopen();
    Code:
    PROGRAM OPC_via_PLCopen
    VAR
        iState : INT := 0;
        iStatePrevious : INT := 0;
        bStart : BOOL := FALSE;
        bError : BOOL := FALSE;
        
        {attribute 'displaymode':='hex'}
        nErrorID : DWORD;
        
        (* Declarations for UA_Connect *)
        fb_UA_Connect : UA_Connect;
        sOpcUaServerUrl : STRING(MAX_STRING_LENGTH) := 'opc.tcp://localhost:4840';
        
        stUASessionConnectInfo : ST_UASessionConnectInfo := (    eSecurityMode:= eUASecurityMsgMode_None,
                                                                eSecurityPolicyUri:= eUASecurityPolicy_None,
                                                                eTransportProfileUri:= eUATransportProfileUri_UATcp,
                                                                sApplicationName:= '',
                                                                tConnectTimeout:= T#1M,
                                                                tSessionTimeout:= T#1M);
        
        nConnectionHdl : DWORD;
        
        (* Declarations for UA_GetNamespaceIndex *)
        fbUA_GetNamespaceIndex : UA_GetNamespaceIndex;
        nNamespaceIndex : UINT;
        
        // Für die Siemens anpassen! Im UAExpert: Server/NameSpaceArray hier unter Value/Value die Uri auswählen
        sNamespaceUri : STRING(MAX_STRING_LENGTH) := 'urn:BeckhoffAutomation:Ua:PLC1';
        
        (* Declarations for UA_NodeGetHandle *)
        fbUA_NodeGetHandle : UA_NodeGetHandle;
        
        // IdentifierType und Identifier anpassen! Im UAExpert: Objects/PLC1/... (Signal suchen), dann unter NodeID
        sNodeIdentifier : STRING(Max_STRING_LENGTH) := 'MAIN.st_Values';
        NodeID : ST_UANodeID := (    eIdentifierType := eUAIdentifierType_String,
                                    nNamespaceIndex := nNamespaceIndex,
                                    sIdentifier := sNodeIdentifier);
        nNodeHdl : DWORD;
        
        (* Declarations for UA_Read *)
        fbUA_Read : UA_Read;
        stIndexRange : ARRAY [1..nMaxIndexRange] OF ST_UAIndexRange;
        nIndexRangeCount : UINT;
        stNodeAddInfo : ST_UANodeAdditionalInfo;
        
        {attribute 'pack_mode' := '1'}
        {attribute 'OPC.UA.DA.StructuredType' := '1'}
        nReadData : ST_Values;
        cbDataRead : UDINT;
        
        (* Declarations for UA_NodeReleaseHandle *)
        fbUA_NodeReleaseHandle : UA_NodeReleaseHandle;
        
        (* Declarations for UA_Disconnect *)
        fbUA_Disconnect : UA_Disconnect;
        bDisconnect : BOOL := FALSE;
        
        bClearError : BOOL := FALSE;
    END_VAR
    Code:
    CASE iState OF 
    
    0: (* Idle *)
    IF bStart THEN // Waiting for Rising Edge in bStart
        bStart := FALSE;
        bError := FALSE;
        nErrorID := 0;
        
        iStatePrevious := iState;
        iState := 10; // Open UA sessrion
    END_IF
    
    10: (* Open UA session *)
    fb_UA_Connect(    Execute := TRUE,
                    ServerURL := sOpcUaServerUrl,
                    SessionConnectInfo := stUASessionConnectInfo,
                    Timeout := T#5S,
                    ConnectionHdl => nConnectionHdl);
    
    IF NOT fb_UA_Connect.Busy THEN
        fb_UA_Connect(Execute := FALSE);
        iStatePrevious := iState;
        IF NOT fb_UA_Connect.Error THEN
            iState := 20; // Get Nampe-Space-Index
        ELSE
            bError := TRUE;
            nErrorID := fb_UA_Connect.ErrorID;
            nConnectionHdl := 0;
            iState := 100; // Error State
        END_IF
    END_IF
    
    20: (* Get Nampe-Space-Index *)
    fbUA_GetNamespaceIndex(    Execute := TRUE,
                            ConnectionHdl := nConnectionHdl,
                            NamespaceUri := sNamespaceUri,
                            NamespaceIndex => nNamespaceIndex);
                            
    IF NOT fbUA_GetNamespaceIndex.Busy THEN
        fbUA_GetNamespaceIndex(Execute := FALSE);
        iStatePrevious := iState;
        IF NOT fbUA_GetNamespaceIndex.Error THEN
            iState := 30; // Get Node-Handle
        ELSE
            bError := TRUE;
            nErrorID := fbUA_GetNamespaceIndex.ErrorID;
            iState := 100; // Error State
        END_IF
    END_IF
    
    30: (* Get Node-Handle *)
    NodeID.nNamespaceIndex := nNamespaceIndex; // update NameSpaceIndex
    
    fbUA_NodeGetHandle(    Execute := TRUE,
                        ConnectionHdl := nConnectionHdl,
                        NodeID := NodeID,
                        NodeHdl => nNodeHdl);
                        
    IF NOT fbUA_NodeGetHandle.Busy THEN
        fbUA_NodeGetHandle(Execute := FALSE);
        iStatePrevious := iState;
        IF NOT fbUA_NodeGetHandle.Error THEN
            iState := 40; // Read Data
        ELSE
            bError := TRUE;
            nErrorID := fbUA_NodeGetHandle.ErrorID;
            iState := 100; // Error State
        END_IF
    END_IF
    
    40: (* Read Data *)
    fbUA_Read(    Execute := TRUE,
                ConnectionHdl := nConnectionHdl,
                NodeHdl := nNodeHdl,
                cbData := SIZEOF(nReadData),
                stNodeAddInfo := stNodeAddInfo,
                pVariable := ADR(nReadData));
    
    IF NOT fbUA_Read.Busy THEN
        fbUA_Read( Execute := FALSE, cbData_R => cbDataRead);
        iStatePrevious := iState;
        IF (NOT fbUA_Read.Error) AND (NOT bDisconnect) THEN
            iState := 40; // Read Data
        ELSIF (NOT fbUA_Read.Error) AND bDisconnect THEN
            bDisconnect := FALSE;
            iState := 50; // Release Node Handle
        ELSE
            bError := TRUE;
            nErrorID := fbUA_Read.ErrorID;
            iState := 100; // Error State
        END_IF
    END_IF
    
    50: (* Release Node Handle *)
    fbUA_NodeReleaseHandle(    Execute := TRUE,
                            ConnectionHdl := nConnectionHdl,
                            NodeHdl := nNodeHdl);
    IF NOT fbUA_NodeReleaseHandle.Busy THEN
        fbUA_NodeReleaseHandle(Execute := FALSE);
        iStatePrevious := iState;
        IF NOT fbUA_NodeReleaseHandle.Error THEN
            iState := 60; // Disconnect UA Session
        ELSE
            bError := TRUE;
            nErrorID := fbUA_NodeReleaseHandle.ErrorID;
            iState := 100; // Error State
        END_IF
    END_IF
    
    60: (* Disconnect UA Session *)
    fbUA_Disconnect(    Execute := TRUE,
                        ConnectionHdl   := nConnectionHdl);
    
    IF NOT fbUA_Disconnect.Busy THEN
        fbUA_Disconnect(Execute := FALSE);
        iStatePrevious := iState;
        IF NOT fbUA_Disconnect.Error THEN
            iState := 0; // Idle
        ELSE
            bError := TRUE;
            nErrorID := fbUA_Disconnect.ErrorID;
            iState := 100; // Error State
            nConnectionHdl := 0;
        END_IF
    END_IF
    
    100: (* Error State *)
    IF bClearError THEN
        bClearError := FALSE;
        bError := FALSE;
        nErrorID := 0;
        iState := 0; // Idle
    END_IF
    
    END_CASE
    Last edited by nik385; 24.03.2020 at 10:49.
    Reply With Quote Reply With Quote TwinCat 3 PLCOpen Opc-UA - Structure Problem  

Similar Threads

  1. Step 7 Safety IO : does not match the channel structure
    By orosz@gmx.com in forum Simatic
    Replies: 3
    Last Post: 03.06.2015, 14:35
  2. PLCopen XML
    By JohannF in forum Sonstige Steuerungen
    Replies: 2
    Last Post: 26.07.2011, 11:10
  3. OPC Problem routen problem
    By kpeter in forum Hochsprachen - OPC
    Replies: 1
    Last Post: 25.08.2010, 19:54
  4. Replies: 4
    Last Post: 03.11.2009, 14:05
  5. Replies: 0
    Last Post: 27.11.2007, 13:50

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •