FreeOpcUa / python-opcua

LGPL Pure Python OPC-UA Client and Server
http://freeopcua.github.io/
GNU Lesser General Public License v3.0
1.37k stars 659 forks source link

No Extension class registered while loading PackML NodeSet #1166

Closed pbertoni89 closed 3 years ago

pbertoni89 commented 3 years ago

I need to implement a PackML server (with additional custom objects btw). So since it seems missing from FreeOpcUa repos, I'm referring to UA-Nodeset repo.

Within that context, I'd import inside the Modeler the following Opc.Ua.PackML.NodeSet2.xml, but it fails with

uamodeler.model_manager - INFO - Starting server on opc.tcp://0.0.0.0:48400/freeopcua/uamodeler/')
uamodeler.server_manager - INFO - Starting python-opcua server')
opcua.server.server - WARNING - Endpoints other than open requested but private key and certificate are not set.')
opcua.server.binary_server_asyncio - WARNING - Listening on 0.0.0.0:48400')
opcua.common.xmlimporter - WARNING - failure adding node NodeData(nodeid:NumericNodeId(ns=1;i=6018))')
uawidgets.utils - ERROR - ('Error no extension class registered ', 'PackMLVersionDataType', NumericNodeId(ns=1;i=13))')
Traceback (most recent call last):
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uawidgets/utils.py", line 21, in wrapper
    result = func(self, *args)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/uamodeler.py", line 249, in open
    self._model_mgr.open(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/model_manager.py", line 181, in open
    self.open_xml(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/model_manager.py", line 113, in open_xml
    self._open_xml(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/model_manager.py", line 119, in _open_xml
    path = self.import_xml(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/model_manager.py", line 102, in import_xml
    new_nodes = self.server_mgr.import_xml(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/server_manager.py", line 68, in import_xml
    return self._backend.import_xml(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/uamodeler/server_manager.py", line 112, in import_xml
    return self._server.import_xml(path)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/server/server.py", line 510, in import_xml
    return importer.import_xml(path, xmlstring)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/common/xmlimporter.py", line 67, in import_xml
    node = self._add_node_data(nodedata)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/common/xmlimporter.py", line 86, in _add_node_data
    node = self.add_variable(nodedata)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/common/xmlimporter.py", line 207, in add_variable
    attrs.Value = self._add_variable_value(obj,)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/common/xmlimporter.py", line 305, in _add_variable_value
    extobj = self._make_ext_obj(obj.value)
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/common/xmlimporter.py", line 238, in _make_ext_obj
    ext = self._get_ext_class(obj.objname)()
  File "/media/xnext/DATAEXT/opt/miniconda/envs/ml36/lib/python3.6/site-packages/opcua/common/xmlimporter.py", line 233, in _get_ext_class
    raise Exception("Error no extension class registered ", name, nodeid)
Exception: ('Error no extension class registered ', 'PackMLVersionDataType', NumericNodeId(ns=1;i=13))

Instead, the Opc.Ua.Di.NodeSet2.xml of the same repo seems to work well, just logging three lines:

opcua.common.xmlparser - WARNING - Parsing value of type 'QualifiedName' not implemented') uamodeler.model_manager - WARNING - Could not find struct TransferResultErrorDataType under i=22') uamodeler.model_manager - WARNING - Could not find struct TransferResultDataDataType under i=22')

Are extension classs strictly needed? I guess I cannot modify the PackML NodeSet while pretending to be compliant to that companion. What should I do in order to import PackML, being able to extend it afterwards?

zerox1212 commented 3 years ago

Maybe the import order is not correct or you need to import another node set before this one. If it were me, I would run modeler from an IDE and import small parts of the XML and try to troubleshoot why it isn't happy. Good luck, the XML stuff is a bit complicated.

swamper123 commented 3 years ago

There are known issues about the xml import, sometimes missing Nodes and References. Perhaps this is happening in your case as well. And like @zerox1212 said, it will need time to have a fix for that, but I try my best to get stuff running.

pbertoni89 commented 3 years ago

There are known issues about the xml import, sometimes missing Nodes and References. Perhaps this is happening in your case as well. And like @zerox1212 said, it will need time to have a fix for that, but I try my best to get stuff running.

Same problem found on asyncua v0.9.3. PackML Nodeset copied from v1.04 - 1abd22f. Since I'm quite new to OPCUA, I'd be grateful to get few hints on what could be done, in order to hack some workaround by myself.

What exactly is an "extension class" ? Why it's missing from that particular xml file ?

pbertoni89 commented 3 years ago

Issue solved with latest UA-Nodeset updates (perhaps 2afcf77)