opcua-asyncio icon indicating copy to clipboard operation
opcua-asyncio copied to clipboard

issue: Custom Structures fail with import_xml

Open kozachynskyi opened this issue 3 years ago • 1 comments

Describe the bug
If user creates custom structures with structure104 and one of fields has dimensions, than it works as expected. However, if one exports XML and starts a new server that imports that custom structure, client cannot write lists and has following error:

File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 288, in list_to_binary
    pack = [to_binary(uatype, el) for el in val]
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 288, in <listcomp>
    pack = [to_binary(uatype, el) for el in val]
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 277, in to_binary
    return struct_to_binary(val)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 253, in struct_to_binary
    packet.append(to_binary(uatype, val))
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 271, in to_binary
    return pack_uatype(vtype, val)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 177, in pack_uatype
    return extensionobject_to_binary(value)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 457, in extensionobject_to_binary
    body = struct_to_binary(obj)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 253, in struct_to_binary
    packet.append(to_binary(uatype, val))
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 271, in to_binary
    return pack_uatype(vtype, val)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 181, in pack_uatype
    return variant_to_binary(value)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 372, in variant_to_binary
    b.append(pack_uatype(var.VariantType, var.Value))
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 177, in pack_uatype
    return extensionobject_to_binary(value)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 457, in extensionobject_to_binary
    body = struct_to_binary(obj)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 253, in struct_to_binary
    packet.append(to_binary(uatype, val))
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 264, in to_binary
    return getattr(Primitives, uatype.__name__).pack(val)
  File "/home/ukrman/.pyenv/versions/3.9.5/envs/optipal/lib/python3.9/site-packages/asyncua/ua/ua_binary.py", line 124, in pack
    return struct.pack(self.format, data)
struct.error: required argument is not an integer

Interestingly enough, on a server side this error happens:

WARNING:__name__:ua_binary.py > _Primitive1 > pack_array > data: 1 is not a instance of "list"!

To Reproduce
Use these files: https://gist.github.com/kozachynskyi/705504c9636788045c775cf037639866

  1. Start server_export.py. Let it run, connect with client_issue.py. Everything works
  2. Start server_import.py. Let it run, connect with client_issue.py. Fail

Version
Python-Version: 3.9.5
opcua-asyncio Version 0.9.90 (e.g. master branch, 0.9):

kozachynskyi avatar Jan 19 '22 21:01 kozachynskyi

Proposed change https://github.com/FreeOpcUa/opcua-asyncio/pull/775

kozachynskyi avatar Jan 19 '22 21:01 kozachynskyi