Is there a way to change the value of the Node “serialnumber” in the Nodemap of the gevServer?
Can I get an excample for Python and C++, please.
Hi @ASchmitt
By default the GevServer does not have a “SerialNumber” feature. I assume you mean the “DeviceID” feature which is read only.
It is read only because we need unique IDs to identify the GevServer.
Multiple GevServer instances with the same ID would lead to errors in opening/managing the devices. So as with other GigE Vision devices you can’t change the DeviceID.
The format is:
S{dongle-number}:{IP address}
(The term in curly brackets is replaced by the value as a hexadecimal number.)
For example for a server on 192.168.1.128/CVB dongle number 999 the Device ID is: “S3E7:C0A80180”
If you want to change custom features you added to your GevServer Instance you can find Python Examplecode in this forum post:
Getting Started with CVBpy - Programming Questions / Python API - Common Vision Blox User Forum
Thanks for the answer and the link.
In the example link, if I see it correctly, the “NodeMap” is changed via a “vin_device”. But I am using a GevServer here. It also has classes for the NodeMap to create and add nodes. Like cvb.gev_server.nodemap
, like
cvb_server = cvb.Server.create_with_const_size(… )
cvb.gevserver.CategoryNode.create(…)
cvb_server.gev_server.node_map.add_node(…)
However, two questions arise from this.
How can I add nodes that are directly on the same level as “name”, “model_name”, “description”, “vendor_name” or “DriverType”?
I find the “nodes” that I created myself with cvb.gevserver.CategoryNode.create(...)
in the sub-item “nodes” in the object vim_device.node_maps
in the object inspector of a debugger, but not at the same level as the nodes “DeviceID”, “DriverType”, “AOI” etc…
The second question is, how can I display these self-created nodes in the GenIcam browser?
I have set the output of the nodes to “Guru” and expanded all the points, but could not find them anywhere.
Hi @ASchmitt
Yes, The example shows you the access of the NodeMap of a GigEVision Device which is in this case provided by the GevServer. This is only used on the client side.
Except the already existing Nodes in the GevServer Nodemap you can add new nodes via cvb.gevserver namespace on the server side.
As an example you can use the GevServer python tutorial which is included in our installation (QmlGevServer.py)
I modified/added the following last lines of the add_genicam_features function of this tutorial to show you how to add the enumaration_node WindowState to the DeviceControl Category:
# do not add to custom category
#cat_node.add(enumeration_node, gs.NodeList.Child)
# Add Node to DeviceControl Category
cat_node_devCont = BackEnd.server.node_map['DeviceControl']
cat_node_devCont.add(enumeration_node, gs.NodeList.Child)
Important fact:
As soon as you add any custom feature (or remove one from the default set) a unique string version/id has to be used. Otherwise, the client side might use a wrong XML which does not resemble the actual feature set. This can be done by changing either the server user version or the xml_file_version.
They distinguish between different GEV Server apps or versions.
Using CVB on the client side means that it does not override the already loaded XML file if the server user version or the XML file version is not changed. Then you do not see any changes in the CVB GenApi Grid view e.g. in the GenICam Browser.
As an alternative, you can delete the linked XML file manually via the Bindings Editor of the Management Console.
I deleted the XML file via the Bindings Editor but could still not see the nodes I added.
I added the node to the Nodemap on the server-side with the following code.
cat_node = gs.CategoryNode.create("Cust::CustomFeatures")
cat_node.display_name = 'Custom Features'
cat_node.tool_tip = 'Contains all application defined features'
BackEnd.gev_server.node_map.add_node(cat_node)
root_node = BackEnd.gev_server.node_map['DeviceControl']
root_node.add(cat_node, gs.NodeList.Child)
Also, why I have to perform BackEnd.gev_server.node_map.add_node(cat_node)
?
Should not root_node.add(cat_node, gs.NodeList.Child)
do the job?
With the following line you add the new node to the nodemap.
BackEnd.gev_server.node_map.add_node(cat_node)
Now it is available in the nodemap and you can get it from the nodemap. But it is not visible in most graphical user interfaces as they enumerate all nodes starting with the root node.
Now we have to add the new node as a child to root or to another node within the hierarchy of nodes already added to the root node.
With this code we add the node to the root node and the GUI can enumerate it.
root_node.add(cat_node, gs.NodeList.Child)
With your published code you only add the category node “Cust::CustomFeatures”
To add nodes to one of the categories, you need to add them to the nodemap same as with cat_node above and then add them to the category node you want.
e.g. from my previous post:
cat_node_devCont.add(enumeration_node, gs.NodeList.Child)
Great, this works for me now, thanks for all the Information.
But one thing wonders me, why is there a different node map in GevServer compare to the device nodemap. I get it that I can use the nodemap from the Gev without using a device, but what if I use a device and this already has a nodemap, will it be overwritten by the GevServer nodemap?
This would occur if, for example, I were to use the GevServer to split a camera image between several clients.
The GevServer provides the Device Nodemap for the Client which is the same as a physical GenICam compliant device provides a Device Nodemap.
We have different NodeMap Classes in our library.
CVB::GevServer::NodeMap
CVB::GenApi::NodeMap
They are different because for the GevServer we need a NodeMap Class which is able to create and Add Nodes. This is necessary for the GevServer to provide an individual NodeMap designed by the developer.
This is not and can’t be possible with the GenApi NodeMap which represents the NodeMap loaded from a GenICam compliant device by a client software.
Thank you for the explanation.
Would I then have to copy the nodes of the node map of the devices to the node map of the GevServer so that I can then see the nodes from the device at the client (GenICam Browser for example)?
Does the GevServer also notice when the client tries to change a node?
Can I somehow intercept or notice this at the Gevserver?
To simulate nodes from a real camera nodemap with the GevServer you need to create GevServer nodes with the same types and names in the GevServer Nodemap.
There is no easy way around it by copying the nodes from another device to the GevServer.
You need to program them by yourself.
Okay, thanks for the answer.
Is it possible that the GevServer notices when the frame grabber (i.e. the client side) tries to set something in the nodemap?
Hi @ASchmitt
To be able to react to client access on the nodes, callback functions (C interface)/events (.NET interface) inform about read and write access.
In these events the value may be modified if needed.
Depending on the cache mode and the GenApi library used in the client not every read operation might be visible in the server. Only access to the local register map will result in a read notification.
This is part of our GEV Server documentation in “Theory of Operation\GenICam Features” which can be found here:
https://help.commonvisionblox.com/NextGen/14.0/md_theory_of_operation_tools__g_e_v_server.html
In the GevServer CVBPy Tutorial an event is registered with:
self.event_cookie = self.window_state_reg_node.register_event_written_updated(self.on_window_size_changed)
Perfect, it all works for me now.
Thank you very much for the help
Hi @ASchmitt ,
as discussed, I went through this problem once again and found a way that you can use to change pretty much every node that is readonly, bevore creating the server and thus having an existing xml:
server->NodeMap()->Node<Cvb::GevServer::StringNode>("DeviceModelName")->SetValue("YouOweMeABeer");
Thanks to @c.hartmann this last step should now work for your application.
Cheers
Chris
Hi @ASchmitt,
one small addition. The properties (which describe the camera), should be set directly after creating the gevserver, but before server->Start().
I like that!
Have a nice day!
Thanks again all of you, for your great support and keep up the good vibes at Stemmer.
Cheers
Alex
I think this is going to come down to a case of beer soon.