gopcua / opcua

Native Go OPC-UA library
MIT License
859 stars 263 forks source link

StatusBadTimeout when browsing large node (1000 objcts) #742

Closed UpBlueio closed 1 month ago

UpBlueio commented 1 month ago

Hi. I found this public OPC UA server for testing; opc.tcp://milo.digitalpetri.com:62541/milo

In this server there is a node with 1000 objects (ns=2;s=Mass/B)

When browsing this node, i immediately get "StatusBadTimeout".

Debug log:

debug: uacp: connecting to opc.tcp://milo.digitalpetri.com:62541/milo debug: uacp 2: start HEL/ACK handshake debug: uacp 2: sent HELF with 74 bytes debug: uacp 2: recv ACKF with 28 bytes debug: uacp 2: recv &uacp.Acknowledge{Version:0x0, ReceiveBufSize:0xffff, SendBufSize:0xffff, MaxMessageSize:0x200000, MaxChunkCount:0x40} debug: uasc 2/1: send ua.OpenSecureChannelRequest with 132 bytes debug: uacp 2: recv OPNF with 135 bytes debug: uasc 2/1: recv OPNF with 135 bytes debug: uasc 2/1: recv ua.OpenSecureChannelResponse debug: uasc 2/1: sending *ua.OpenSecureChannelResponse to handler debug: uasc 2: received security token. channelID=21678600 tokenID=30083994 createdAt=2024-09-06T06:49:47Z lifetime=1h0m0s debug: uasc 2: security token expires at 2024-09-06T08:04:47Z. channelID=21678600 tokenID=30083994 debug: uasc 2: security token is refreshed at 2024-09-06T07:34:42Z (45m0s). channelID=21678600 tokenID=30083994

Code:

opc, err := connecto(config) if err != nil { return err } nodeID, err := ua.ParseNodeID("ns=2;s=Mass/B") if err != nil { return fmt.Errorf("invalid node id: %s", err) } refs, err := opc.client.Node(nodeID).References(opc.ctx, id.HierarchicalReferences, ua.BrowseDirectionForward, ua.NodeClassAll, true) if err != nil { return fmt.Errorf("error browsing : %v", err) } for _, rn := range refs { fmt.Println(rn.NodeID.String()) } return nil

UpBlueio commented 1 month ago

I found the issue. Setting the RequestTimeout to 5 sec solves the problem.