Online Forums
Technical support is provided through Support Forums below. Anybody can view them; you need to Register/Login to our site (see links in upper right corner) in order to Post questions. You do not have to be a licensed user of our product.
Please read Rules for forum posts before reporting your issue or asking a question. OPC Labs team is actively monitoring the forums, and replies as soon as possible. Various technical information can also be found in our Knowledge Base. For your convenience, we have also assembled a Frequently Asked Questions page.
Do not use the Contact page for technical issues.
- Forum
- Discussions
- QuickOPC-UA in .NET
- Reading, Writing, Subscriptions
- OPC UA .NET C# Reading to Array, License Problem
OPC UA .NET C# Reading to Array, License Problem
The Cam_Array is one-dimensional array of custom structures. In order to write to it, you will need the Complex Data feature.
But, from the expanded tree picture from the Connectivity Explorer, I can also see that (most likely) the same information that is available in single node (Cam_Array) is accessible through individual nodes. And, there are nodes for elements, such as Cam_Array[0] (these nodes will be structures), and nodes for individual fields of the structures (such as the dA node under Cam_Array[0] ). So, your second option might be without Complex Data types: Simply do multiple "simple" Write-s, with the individual node IDs, and individual field values.
For efficiency, this should be done with WriteMultipleValues method, and not with looping and writing each node individually.
Best regards
Please Log in or Create an account to join the conversation.
Attachments:
Please Log in or Create an account to join the conversation.
It looks like that the server does not support subscriptions to attributes other than the Value attribute, so you have resolved it perfectly by using the Read instead.
Unfortunately the "Value" column is too narrow to show the full DataType. Can you please make it wider so that the DataType can be seen in its entirety?
But I can already see two possible problems:
- The ValueRank indicates that the node is one-dimensional array (and, it has 101 elements, according to the ArrayDimensions attribute). But you are trying to write a 2-dimensional array to it. Note that instead of 2-dimensional array of Byte-s, there can also be an array of arrays (so-called jagged array) - which, on the first level, is a one-dimensional array. It would probably be represented as "Byte[][]" instead of "Byte[,]" in .NET. However, there is second issue, so this is probably not the case anyway:
- Although I could not see the full DataType, I can already see it is some custom data type (the namespace, indicated by the "nsu=", shows that the data type is not in namespace 0, which contains the types defined by the OPC Foundation). So, unless that type is based on Byte (which is unlikely - and we can verify that after you send the full DataType), you have an incorrect element type - it will not be Byte, but something else - probably a custom structure - for which you will need the Complex Data feature.
Regards
Please Log in or Create an account to join the conversation.
Attachments:
Please Log in or Create an account to join the conversation.
judging from "byte[,] byteArray ", you are trying to write a 2-dimensional array of Byte-s, correct? We need to verify that the variable has this data type in the server. Can you please obtain the DataType, ValueRank and ArrayDimensions attribute values of the Cam_Array node? Either using some short code, or from an interactive OPC client. ConnectivityExplorer can be used, too: Select the node, then switch to the Inspect tab, select the AttributeId you want, and press "Add Row" then.
Regards
Please Log in or Create an account to join the conversation.
public void WriteCamArrayToPAC()
{
List<CamItem> camItems = RmgSegmentDataConverter.ToCamItems(SegmentList);
byte[,] byteArray = CamArrayConverter.ConvertCamListToByteArray(camItems);
OpcClient opcClient = OpcClient.Get();
opcClient.WriteToTag(Tags.GenV_Cam_Array, byteArray);
byte[] camRefByteArray = (byte[]) opcClient.ReadTag(Tags.GenV_Cam_Ref);
CamRef camRef = CamArrayConverter.ConvertByteArrayToCamRef(camRefByteArray);
camRef.nElements = (short) camItems.Count;
camRef.xStart = camItems.Count > 0 ? camItems[0].dX : 0;
camRef.xEnd = camItems.Count > 0 ? camItems[camItems.Count - 1].dX : 0;
camRefByteArray = CamArrayConverter.ConvertCamRefToByteArray(camRef, camRefByteArray);
opcClient.WriteToTag(Tags.GenV_Cam_Ref, camRefByteArray);
}
// OPC UA Write function within OpcClient Class
public void WriteToTag(string nodeId, object value)
{
int attempts = 0;
while (IsInitialized && attempts++ < MAX_RETRY_ATEMPTS)
{
try
{
easyUAClient1.WriteValue(Tags.ENDPOINT_DESCRIPTOR, nodeId, value);
attempts = MAX_RETRY_ATEMPTS;
}
catch (UAException e)
{
Log.E(TAG, e.ToString());
}
}
}
// OPC UA Read function within OpcClient Class
public object ReadTag(string nodeId)
{
object ret = null;
if(IsInitialized)
{
int attempts = 0;
UAException uaException = null;
while (attempts++ < MAX_RETRY_ATEMPTS)
{
try
{
ret = easyUAClient1.ReadValue(Tags.ENDPOINT_DESCRIPTOR, nodeId);
attempts = MAX_RETRY_ATEMPTS;
}
catch (UAException e)
{
uaException = e;
Log.E(TAG, e.ToString());
}
}
if (ret == null)
{
throw uaException;
}
}
return ret;
}
This is the code that I am trying to get to run. It worked perfectly fine with the OPC DA functions but not for the OPC UA. As I was converting my program from DA TO UA this is the only part that breaks. I also attached a photo of Cam_Ref for DA
Attachments:
Please Log in or Create an account to join the conversation.
For Cam_Ref, show me that some other OPC UA client can read or write it (its Value attribute). I do not think this is the case. I have explained that it is an Object, and UA Objects do not have values. You are asking for something that is not possible.
Regards
Please Log in or Create an account to join the conversation.
2. Cam_Ref I want to write and read to it.
Sorry for the confusion, I should have stated more properly.
Please Log in or Create an account to join the conversation.
However, in your last post, you have provided a code snippet that calls ReadValue.
Please clarify.
Also, Cam_Ref is an OPC UA Object, so that explains why it does not have a Value attribute and you cannot read from it.
Regards
Please Log in or Create an account to join the conversation.
easyUAClient1.ReadValue(opc.tcp://192.168.10.50:4840/, nsu=CODESYSSPV3/3S/IecVarAccess ;ns=4;s=|var|B-Nimis MC-Pi Prime S01.Application.GenV.Cam_Ref);
UAStatusCodeException: Status is not good: {BadAttributeIdInvalid}. The attribute is not supported for the specified Node.
+ The attribute Id used was 'Value'.
+ The node descriptor used was: NodeId="nsu=CODESYSSPV3/3S/IecVarAccess ;ns=4;s=|var|B-Nimis MC-Pi Prime S01.Application.GenV.Cam_Ref".
+ The client method called (or event/callback invoked) was 'ReadMultiple[1]'.
Attachments:
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-UA in .NET
- Reading, Writing, Subscriptions
- OPC UA .NET C# Reading to Array, License Problem