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 COM
- Reading, Writing, Subscriptions
- QuickOPC VBScript ASP example script not working, pt.3
QuickOPC VBScript ASP example script not working, pt.3
Regards
Please Log in or Create an account to join the conversation.
Regarding the variables and their data types: In the end, what matters is what the server reports to the client. And, the WireShark capture is a clear proof that the server did it wrong. It is a manifestable server bug and I suggest that you report it to the server vendor and demand fixing. The fact that it had reported a better data type to UaClient is interesting, but in the end, irrelevant (it could be, for example, timing-dependent). The fact that under some circumstances the server behaves correctly does not disprove the existence of the bug.
I also maintain that my statement "...Note: None of the Write arguments you have in your script passes in the 32-bit float. For it, you would have to do e.g. "CSng(123)"..." is fully correct. In VBScript, literal 0.123456789 is *not* a 32-bit float. It is a 64-bit float. Here is a VBScript that proves this (see e.g. www.w3schools.com/asp/func_vartype.asp for VarType return values):
wscript.echo VarType(0.123456789) ' returns 5 (vbDouble)
wscript.echo VarType(0.123) ' returns 5 (vbDouble)
wscript.echo VarType(123) ' returns 2 (vbInteger)
wscript.echo VarType(CSng(0.123456789)) ' returns 4 (vbSingle)
For setting UAWriteValueArguments.ValueTypeCode, use the numeric values from learn.microsoft.com/en-us/dotnet/api/system.typecode . For almost all variable data types you listed, the correspondence is fairly obvious. I think the enumeration will be Int32, but if that does not work, please come back to me and we will sort it out.
Regards
Please Log in or Create an account to join the conversation.
- Kyle.Oshima@caltrol.com
- Topic Author
- Offline
- Platinum Member
- Posts: 35
- Thank you received: 1
Granted, yes the highlighted "UM1" and "EM1" elements are different control modules, but the relevant variables on the parent control modules are the "PARAM1.CV" elements which are both float data type as discussed throughout this chain and shown by UaExpert (see screenshot below)
In order to provide you more test info at once, last test case in reply #13145 did write aforementioned PARAM1 float data type plus six added PARAM2-7 for six additional different data type variables that could be defined (QuickOPC documentation does note is more efficient to write multiple values at once with WriteMultipleValues() call rather than iteratively writing one value at time) -- was easier/faster to define the additional PARAMs on the EM1 module rather than the UM1 module; my apologies if that caused you confusion, assumed the inline comments in the code pasted and the screenshot of the seven PARAM1-7 {BadTypeMismatch} errors returned in reply #13145 would be understood.
Also, your statement "...Note: None of the Write arguments you have in your script passes in the 32-bit float. For it, you would have to do e.g. "CSng(123)"..." also is not accurate...
The first WriteValueArguments1 object does in fact write to "PARAM1" which as stated above is defined as float data type, and is trying to write 0.123456789 which you state in reply #13011 "...QuickOPC is supposed to do automatically..."
That said, if for whatever reason QuickOPC cannot write indefinite decimal values without explicitly passing appropriate target data type, in the long run that may not necessarily be show-stopper -- may be able to redesign ASP front-end to explicitly pass target data types, which if available on the ASP front-end may have separate benefit of facilitating added form entry validation otherwise difficult to accomplish.
Assuming so, what are the appropriate ValueTypeCode values needed for each of the ten possible different data type variables that could be defined noted in reply #13141 (PARAM1-7 data types outlined in reply #13145 plus three unsigned integer PARAM8-10 data type variables added) -- see screenshot below of data types shown by UaExpert
Attachments:
Please Log in or Create an account to join the conversation.
Thank you for the Wireshark capture and the script.
It is clear what is happening. We could have saved ourselves some work, but unfortunately you have mislead me. In your original report, and in the screenshots from UaExpert I asked you for, you indicated that you work with variables like 0:UM1/PARAM1.CV. And the server returns their data type as Float.
However, in reality, the "problem" happens with different variables. They are like 0:EM1/PARAM1.CV (notice the letter E instead of U). And, as apparent from the WireShark capture, the server returns their data type as BaseDataType (i=24); the screenshots of the decoded request/response for the data type are attached.
BaseDataType means "any type". But as we have seen, in reality, the server only accepts Floats for them. So the server is letting the clients to somehow magically guess the proper data type. Of course this is not something QuickOPC can do for you. And that's why, with these variable, you either need to 1) already pass in the value in the data type the server expects, or 2) explicitly specify the ValueType or ValueTypeCode.
Regards
Note: None of the Write arguments you have in your script passes in the 32-bit float. For it, you would have to do e.g. "CSng(123)".
Attachments:
Please Log in or Create an account to join the conversation.
- Kyle.Oshima@caltrol.com
- Topic Author
- Offline
- Platinum Member
- Posts: 35
- Thank you received: 1
<!--$$Header: $-->
<!-- Copyright (c) CODE Consulting and Development, s.r.o., Plzen. All rights reserved. -->
<!---->
<!--Find all latest examples here : opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .-->
<%@ LANGUAGE="VBSCRIPT" %>
<html><head><t-itle>ReadAndDisplayValue_VBScript.asp</title></head>
<body>
<%
' Create EasyOPC-DA component
<!-- Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.DataAccess.EasyDAClient")-->
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient")
Dim WriteValueArguments1: Set WriteValueArguments1 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments1.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments1.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM1.CV" 'float point datatype
WriteValueArguments1.Value = 0.123456789
Dim WriteValueArguments2: Set WriteValueArguments2 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments2.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments2.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM2.CV" 'boolean datatype
WriteValueArguments2.Value = 1
Dim WriteValueArguments3: Set WriteValueArguments3 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments3.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments3.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM3.CV" 'discrete datatype
WriteValueArguments3.Value = 255
Dim WriteValueArguments4: Set WriteValueArguments4 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments4.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments4.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM4.CV" '8-bit signed integer
WriteValueArguments4.Value = 1234567890
Dim WriteValueArguments5: Set WriteValueArguments5 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments5.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments5.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM5.CV" '16-bit signed integer
WriteValueArguments5.Value = 1234567890
Dim WriteValueArguments6: Set WriteValueArguments6 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments6.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments6.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM6.CV" '32-bit signed integer
WriteValueArguments6.Value = 12345678901234567890
Dim WriteValueArguments7: Set WriteValueArguments7 = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.UAWriteValueArguments")
WriteValueArguments7.EndpointDescriptor.UrlString = "opc.tcp://ILDDEV-PROPLUS:9409/DvOpcUaServer"
WriteValueArguments7.NodeDescriptor.NodeId.ExpandedText = "ns=2;s=0:EM1/PARAM7.CV" 'enumeration datatype
WriteValueArguments7.Value = 50
Dim arguments(6)
Set arguments(0) = WriteValueArguments1
Set arguments(1) = WriteValueArguments2
Set arguments(2) = WriteValueArguments3
Set arguments(3) = WriteValueArguments4
Set arguments(4) = WriteValueArguments5
Set arguments(5) = WriteValueArguments6
Set arguments(6) = WriteValueArguments7
' Modify values of nodes
Dim results: results = Client.WriteMultipleValues(arguments)
' Display results
Dim i: For i = LBound(results) To UBound(results)
Dim WriteResult: Set WriteResult = results(i)
If WriteResult.Succeeded Then
Response.Write "Result " & i & " success"
Else
Response.Write "Result " & i & ": " & WriteResult.Exception.GetBaseException().Message
End If
Next
%>
</body>
</html>
Attachments:
Please Log in or Create an account to join the conversation.
I did not need the Wireshark capture for the problem where you thought the precision was lost. It was pretty clear that the node's data type is Float and 6 decimal digits is the max you can get out of it.
But I needed the Wireshark capture for the problem where the Write would fail with BadTypeMismatch unless the type was explicitly set in the script. So if you want to further troubleshoot this, I still need the Wireshark capture of it.
Regards
Please Log in or Create an account to join the conversation.
- Kyle.Oshima@caltrol.com
- Topic Author
- Offline
- Platinum Member
- Posts: 35
- Thank you received: 1
re: question of decimal precision starting from reply #13010 based on DCS vendor feedback appears there is subtle difference in their interpretation of single-precision floating point format differing from IEEE Std 754 specification affecting display of floating points. Bottom line, WireShark analysis no longer appears to be needed.
That said, I believe there is still open question from reply #13000 as to "...although in some cases, there is a necessity to explicitly define the data type for writing. We need to figure it all out."
OPC UA target nodeID datatypes could be any of the following: 32-bit floating point; boolean (0 or 1); discrete (integer 0 to 255); 8-, 16-, or 32-bit signed or unsigned integer; enumeration (integer 0 to 255)
Please Log in or Create an account to join the conversation.
the WireShark capture you have sent is for a successful test with the revised code. That is not what I asked for. I asked for - quote: "... WireShark capture when the ASP script that exhibits the problem is run".
Regards
Please Log in or Create an account to join the conversation.
- Kyle.Oshima@caltrol.com
- Topic Author
- Offline
- Platinum Member
- Posts: 35
- Thank you received: 1
Attachments:
Please Log in or Create an account to join the conversation.
I think we can start with doing just WireShark capture when the ASP script that exhibits the problem is run. Can you please do that? Useful info:
- Analyzing OPC UA Communications with Wireshark: opcconnect.opcfoundation.org/2017/02/analyzing-opc-ua-communications-with-wireshark/
- OPC UA & Wireshark: www.prosysopc.com/blog/opc-ua-wireshark/
Regards
Please Log in or Create an account to join the conversation.
- Forum
- Discussions
- QuickOPC-UA in COM
- Reading, Writing, Subscriptions
- QuickOPC VBScript ASP example script not working, pt.3