Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
opcua-asyncio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nikola Balog
opcua-asyncio
Commits
122b99da
Commit
122b99da
authored
Jul 30, 2018
by
Christian Bergmiller
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wip
parent
af2d044d
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
31 additions
and
29 deletions
+31
-29
opcua/client/client.py
opcua/client/client.py
+2
-0
opcua/common/node.py
opcua/common/node.py
+0
-1
opcua/common/structures.py
opcua/common/structures.py
+5
-5
opcua/common/ua_utils.py
opcua/common/ua_utils.py
+2
-2
opcua/common/xmlexporter.py
opcua/common/xmlexporter.py
+4
-4
opcua/server/server.py
opcua/server/server.py
+3
-2
opcua/tools.py
opcua/tools.py
+13
-13
test_external_server.py
test_external_server.py
+1
-1
tests/test_client.py
tests/test_client.py
+1
-1
No files found.
opcua/client/client.py
View file @
122b99da
...
...
@@ -515,6 +515,7 @@ class Client(object):
return
subscription
def
get_namespace_array
(
self
):
"""COROUTINE"""
ns_node
=
self
.
get_node
(
ua
.
NodeId
(
ua
.
ObjectIds
.
Server_NamespaceArray
))
return
ns_node
.
get_value
()
...
...
@@ -555,4 +556,5 @@ class Client(object):
return
len
(
uries
)
-
1
def
load_type_definitions
(
self
,
nodes
=
None
):
"""COROUTINE"""
return
load_type_definitions
(
self
,
nodes
)
opcua/common/node.py
View file @
122b99da
...
...
@@ -247,7 +247,6 @@ class Node:
attributeid is a member of ua.AttributeIds
datavalue is a ua.DataValue object
"""
_logger
.
info
(
'Node set_attribute %r %r %r'
,
self
,
attributeid
,
datavalue
)
attr
=
ua
.
WriteValue
()
attr
.
NodeId
=
self
.
nodeid
attr
.
AttributeId
=
attributeid
...
...
opcua/common/structures.py
View file @
122b99da
...
...
@@ -236,7 +236,7 @@ from opcua import ua
return
def
load_type_definitions
(
server
,
nodes
=
None
):
async
def
load_type_definitions
(
server
,
nodes
=
None
):
"""
Download xml from given variable node defining custom structures.
If no node is given, attemps to import variables from all nodes under
...
...
@@ -247,14 +247,14 @@ def load_type_definitions(server, nodes=None):
"""
if
nodes
is
None
:
nodes
=
[]
for
desc
in
server
.
nodes
.
opc_binary
.
get_children_descriptions
():
for
desc
in
await
server
.
nodes
.
opc_binary
.
get_children_descriptions
():
if
desc
.
BrowseName
!=
ua
.
QualifiedName
(
"Opc.Ua"
):
nodes
.
append
(
server
.
get_node
(
desc
.
NodeId
))
structs_dict
=
{}
generators
=
[]
for
node
in
nodes
:
xml
=
node
.
get_value
()
xml
=
await
node
.
get_value
()
xml
=
xml
.
decode
(
"utf-8"
)
generator
=
StructGenerator
()
generators
.
append
(
generator
)
...
...
@@ -270,9 +270,9 @@ def load_type_definitions(server, nodes=None):
# register classes
# every children of our node should represent a class
for
ndesc
in
node
.
get_children_descriptions
():
for
ndesc
in
await
node
.
get_children_descriptions
():
ndesc_node
=
server
.
get_node
(
ndesc
.
NodeId
)
ref_desc_list
=
ndesc_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasDescription
,
direction
=
ua
.
BrowseDirection
.
Inverse
)
ref_desc_list
=
await
ndesc_node
.
get_references
(
refs
=
ua
.
ObjectIds
.
HasDescription
,
direction
=
ua
.
BrowseDirection
.
Inverse
)
if
ref_desc_list
:
#some server put extra things here
name
=
_clean_name
(
ndesc
.
BrowseName
.
Name
)
if
not
name
in
structs_dict
:
...
...
opcua/common/ua_utils.py
View file @
122b99da
...
...
@@ -230,7 +230,7 @@ async def get_base_data_type(datatype):
raise
ua
.
UaError
(
"Datatype must be a subtype of builtin types {0!s}"
.
format
(
datatype
))
def
get_nodes_of_namespace
(
server
,
namespaces
=
None
):
async
def
get_nodes_of_namespace
(
server
,
namespaces
=
None
):
"""
Get the nodes of one or more namespaces .
Args:
...
...
@@ -241,7 +241,7 @@ def get_nodes_of_namespace(server, namespaces=None):
"""
if
namespaces
is
None
:
namespaces
=
[]
ns_available
=
server
.
get_namespace_array
()
ns_available
=
await
server
.
get_namespace_array
()
if
not
namespaces
:
namespaces
=
ns_available
[
1
:]
...
...
opcua/common/xmlexporter.py
View file @
122b99da
...
...
@@ -87,7 +87,7 @@ class XmlExporter(object):
addr_idx_to_xml_idx
[
addr_idx
]
=
xml_idx
+
1
return
addr_idx_to_xml_idx
def
_get_ns_idxs_of_nodes
(
self
,
nodes
):
async
def
_get_ns_idxs_of_nodes
(
self
,
nodes
):
"""
get a list of all indexes used or references by nodes
"""
...
...
@@ -95,7 +95,7 @@ class XmlExporter(object):
for
node
in
nodes
:
node_idxs
=
[
node
.
nodeid
.
NamespaceIndex
]
node_idxs
.
append
(
node
.
get_browse_name
().
NamespaceIndex
)
node_idxs
.
extend
(
ref
.
NodeId
.
NamespaceIndex
for
ref
in
node
.
get_references
())
node_idxs
.
extend
(
ref
.
NodeId
.
NamespaceIndex
for
ref
in
await
node
.
get_references
())
node_idxs
=
list
(
set
(
node_idxs
))
# remove duplicates
for
i
in
node_idxs
:
if
i
!=
0
and
i
not
in
idxs
:
...
...
@@ -329,8 +329,8 @@ class XmlExporter(object):
# insert behind the namespace element
self
.
etree
.
getroot
().
insert
(
1
,
aliases_el
)
def
_add_ref_els
(
self
,
parent_el
,
obj
):
refs
=
obj
.
get_references
()
async
def
_add_ref_els
(
self
,
parent_el
,
obj
):
refs
=
await
obj
.
get_references
()
refs_el
=
Et
.
SubElement
(
parent_el
,
'References'
)
for
ref
in
refs
:
...
...
opcua/server/server.py
View file @
122b99da
...
...
@@ -528,7 +528,7 @@ class Server:
exp
.
build_etree
(
nodes
)
return
exp
.
write_xml
(
path
)
def
export_xml_by_ns
(
self
,
path
,
namespaces
=
None
):
async
def
export_xml_by_ns
(
self
,
path
,
namespaces
=
None
):
"""
Export nodes of one or more namespaces to an XML file.
Namespaces used by nodes are always exported for consistency.
...
...
@@ -541,7 +541,7 @@ class Server:
"""
if
namespaces
is
None
:
namespaces
=
[]
nodes
=
get_nodes_of_namespace
(
self
,
namespaces
)
nodes
=
await
get_nodes_of_namespace
(
self
,
namespaces
)
self
.
export_xml
(
nodes
,
path
)
def
delete_nodes
(
self
,
nodes
,
recursive
=
False
):
...
...
@@ -618,4 +618,5 @@ class Server:
self
.
iserver
.
isession
.
add_method_callback
(
node
.
nodeid
,
callback
)
def
load_type_definitions
(
self
,
nodes
=
None
):
"""COROUTINE"""
return
load_type_definitions
(
self
,
nodes
)
opcua/tools.py
View file @
122b99da
...
...
@@ -257,7 +257,7 @@ def uawrite():
print
(
args
)
def
uals
():
async
def
uals
():
parser
=
argparse
.
ArgumentParser
(
description
=
"Browse OPC-UA node and print result"
)
add_common_args
(
parser
)
parser
.
add_argument
(
"-l"
,
...
...
@@ -277,46 +277,46 @@ def uals():
args
.
long_format
=
1
client
=
Client
(
args
.
url
,
timeout
=
args
.
timeout
)
client
.
set_security_string
(
args
.
security
)
client
.
connect
()
await
client
.
set_security_string
(
args
.
security
)
await
client
.
connect
()
try
:
node
=
get_node
(
client
,
args
)
print
(
"Browsing node {0} at {1}
\
n
"
.
format
(
node
,
args
.
url
))
if
args
.
long_format
==
0
:
_lsprint_0
(
node
,
args
.
depth
-
1
)
await
_lsprint_0
(
node
,
args
.
depth
-
1
)
elif
args
.
long_format
==
1
:
_lsprint_1
(
node
,
args
.
depth
-
1
)
await
_lsprint_1
(
node
,
args
.
depth
-
1
)
else
:
_lsprint_long
(
node
,
args
.
depth
-
1
)
finally
:
client
.
disconnect
()
await
client
.
disconnect
()
sys
.
exit
(
0
)
print
(
args
)
def
_lsprint_0
(
node
,
depth
,
indent
=
""
):
async
def
_lsprint_0
(
node
,
depth
,
indent
=
""
):
if
not
indent
:
print
(
"{0:30} {1:25}"
.
format
(
"DisplayName"
,
"NodeId"
))
print
(
""
)
for
desc
in
node
.
get_children_descriptions
():
for
desc
in
await
node
.
get_children_descriptions
():
print
(
"{0}{1:30} {2:25}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
()))
if
depth
:
_lsprint_0
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
await
_lsprint_0
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
def
_lsprint_1
(
node
,
depth
,
indent
=
""
):
async
def
_lsprint_1
(
node
,
depth
,
indent
=
""
):
if
not
indent
:
print
(
"{0:30} {1:25} {2:25} {3:25}"
.
format
(
"DisplayName"
,
"NodeId"
,
"BrowseName"
,
"Value"
))
print
(
""
)
for
desc
in
node
.
get_children_descriptions
():
for
desc
in
await
node
.
get_children_descriptions
():
if
desc
.
NodeClass
==
ua
.
NodeClass
.
Variable
:
val
=
Node
(
node
.
server
,
desc
.
NodeId
).
get_value
()
val
=
await
Node
(
node
.
server
,
desc
.
NodeId
).
get_value
()
print
(
"{0}{1:30} {2!s:25} {3!s:25}, {4!s:3}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
(),
desc
.
BrowseName
.
to_string
(),
val
))
else
:
print
(
"{0}{1:30} {2!s:25} {3!s:25}"
.
format
(
indent
,
desc
.
DisplayName
.
to_string
(),
desc
.
NodeId
.
to_string
(),
desc
.
BrowseName
.
to_string
()))
if
depth
:
_lsprint_1
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
await
_lsprint_1
(
Node
(
node
.
server
,
desc
.
NodeId
),
depth
-
1
,
indent
+
" "
)
def
_lsprint_long
(
pnode
,
depth
,
indent
=
""
):
...
...
test_external_server.py
View file @
122b99da
...
...
@@ -90,7 +90,7 @@ class Tests(unittest.TestCase):
@
connect
def
test_get_namespace_array
(
self
,
client
):
array
=
client
.
get_namespace_array
()
array
=
await
client
.
get_namespace_array
()
self
.
assertTrue
(
len
(
array
)
>
0
)
@
connect
...
...
tests/test_client.py
View file @
122b99da
...
...
@@ -119,7 +119,7 @@ async def test_enumstrings_getvalue(server, client):
async
def
test_custom_enum_struct
(
server
,
client
):
client
.
load_type_definitions
()
await
client
.
load_type_definitions
()
ns
=
await
client
.
get_namespace_index
(
'http://yourorganisation.org/struct_enum_example/'
)
myvar
=
client
.
get_node
(
ua
.
NodeId
(
6009
,
ns
))
val
=
await
myvar
.
get_value
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment