Commit 64122868 authored by Marcel's avatar Marcel Committed by ORD

Add datatype to create_variable (#235)

* Add datatype to create_variable

* Add datatype to create_variable, code cleanup
parent 6d2c46e4
......@@ -80,12 +80,15 @@ def create_property(parent, *args):
def create_variable(parent, *args):
"""
create a child node variable
args are nodeid, browsename, value, [variant type]
or idx, name, value, [variant type]
args are nodeid, browsename, value, [variant type], [data type]
or idx, name, value, [variant type], [data type]
"""
nodeid, qname = _parse_add_args(*args[:2])
val = _to_variant(*args[2:])
return node.Node(parent.server, _create_variable(parent.server, parent.nodeid, nodeid, qname, val, isproperty=False))
val, datatype = _to_variant_with_datatype(*args[2:])
if datatype and not isinstance(datatype, ua.NodeId):
raise RuntimeError()
return node.Node(parent.server, _create_variable(parent.server, parent.nodeid, nodeid, qname, val, datatype, isproperty=False))
def create_method(parent, *args):
......@@ -156,13 +159,17 @@ def _create_object(server, parentnodeid, nodeid, qname, objecttype):
def _to_variant(val, vtype=None):
return _to_variant_with_datatype(val, vtype, datatype=None )[0]
def _to_variant_with_datatype(val, vtype=None, datatype=None):
if isinstance(val, ua.Variant):
return val
if vtype:
datatype = vtype
return val, datatype
else:
return ua.Variant(val, vtype)
return ua.Variant(val, vtype), datatype
def _create_variable(server, parentnodeid, nodeid, qname, val, isproperty=False):
def _create_variable(server, parentnodeid, nodeid, qname, val, datatype=None, isproperty=False):
addnode = ua.AddNodesItem()
addnode.RequestedNewNodeId = nodeid
addnode.BrowseName = qname
......@@ -177,7 +184,11 @@ def _create_variable(server, parentnodeid, nodeid, qname, val, isproperty=False)
attrs = ua.VariableAttributes()
attrs.Description = ua.LocalizedText(qname.Name)
attrs.DisplayName = ua.LocalizedText(qname.Name)
attrs.DataType = _guess_uatype(val)
if datatype:
attrs.DataType = datatype
else:
attrs.DataType = _guess_uatype(val)
attrs.Value = val
if isinstance(val, list) or isinstance(val, tuple):
attrs.ValueRank = ua.ValueRank.OneDimension
......
......@@ -325,6 +325,16 @@ class TestServer(unittest.TestCase, CommonTests, SubscriptionTests):
self.assertEqual(evgen.event.PropertyNum, None)
self.assertEqual(evgen.event.PropertyString, None)
def test_add_variable_with_datatype(self):
o = self.opc.get_objects_node()
v1 = o.add_variable(3, 'VariableEnumType1', ua.ApplicationType.ClientAndServer, None, ua.NodeId(ua.ObjectIds.ApplicationType))
tp1 = v1.get_data_type()
self.assertEqual( ua.NodeId(ua.ObjectIds.ApplicationType), tp1)
v2 = o.add_variable(3, 'VariableEnumType2', ua.ApplicationType.ClientAndServer, None, ua.NodeId(ua.ObjectIds.ApplicationType) )
tp2 = v2.get_data_type()
self.assertEqual( ua.NodeId(ua.ObjectIds.ApplicationType), tp2)
def check_eventgenerator_SourceServer(test, evgen):
server = test.opc.get_server_node()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment