Powershell opc xml写入UInt32数组

问题描述

我已设法使用 Powershell 脚本读取 OPC XML 项

$wsdl=(Join-path $PSScriptRoot "OpcXmlDa1.00.wsdl")

$global:Proxy = New-WebserviceProxy $wsdl –Namespace X
$global:Options = New-Object X.RequestOptions
$Options.ReturnItemName = $true;
$Options.ReturnItemTime = $true;

$global:ItemList = New-Object X.ReadRequestItemList
$global:RItemList = New-Object X.ReplyItemList
$global:Errors = New-Object X.OPCError
$global:Item = New-Object X.ReadRequestItem 

# Read from OPC server
$Proxy.Url = "http://xxx.xx.xx.xxx:xxxx"
$Item.ItemName = "xxx/xxx/xxx"
$ItemList.Items = $Item
$Proxy.Read($Options,$ItemList,[ref]$RItemList,[ref]$Errors)

#Show result
$rTimeStamp = $RItemList.Items[0].Timestamp.ToString('yyyy-MM-dd HH:mm:ss')
$rItemName = $RItemList.Items[0].ItemName 
$rValue = $RItemList.Items[0].Value 
Write-Host ("{0}: {1}={2}" -f $rTimeStamp,$rItemName,$rValue)

在我上面的结果中,我在 $RItemList.Items[0]

中看到以下内容
DiagnosticInfo:$null
Value: [UInt32[32]]
Quality: [OPCQuality]
ValueTypeQualifier: $null
ItemPath: ""
ItemName: "xxx/xxx/xxx"
ClientItemHandle: $null
Timestamp: 2020-12 19 01:00:00
TimestampSpecified: $true
ResultID: $null

当我深入研究上面的 Value 时,我发现它按预期读取。到目前为止一切顺利...

现在是我的问题;我无法理解如何通过另一个脚本写入同一个项目。

这是我的尝试

$wsdl=(Join-path $PSScriptRoot "OpcXmlDa1.00.wsdl")

$Global:Proxy = New-WebserviceProxy $wsdl –Namespace X
$Global:Options = New-Object X.RequestOptions
$Options.ReturnItemName = $true;
$Options.ReturnItemTime = $true;
$Options.ReturnDiagnosticInfo = $true;

$Global:writeItemList = New-Object X.WriteRequestItemList
$Global:RItemList = New-Object X.ReplyItemList
$Global:Errors = New-Object X.OPCError
    
$Global:ItemSessionRequest = New-Object X.ItemValue
$ItemSessionRequest.ValueTypeQualifier = 'xsd:unsignedInt' #<- I believe that this might be the issue?
$ItemSessionRequest.ItemPath = ""
$ItemSessionRequest.ItemName = "xxx/xxx/xxx"
$ItemSessionRequest.Value = @($x;$y;$z) #<- I have what I want to write in $x,$y,$z

# Write to OPC server
$Proxy.Url = "http://xxx.xx.xx.xxx:xxxx"
$ReturnValuesOnReply = $true
$writeItemList.Items = $ItemSessionRequest
$Proxy.Write($Options,$writeItemList,$ReturnValuesOnReply,[ref]$Errors)

我收到两个错误(我通过 VSC 代码运行)。

错误 #1:

DiagnosticInfo     : This value to write cannot be NULL
Value              :
Quality            :
ValueTypeQualifier :
ItemPath           :
ItemName           : xxx/xxx/SessionRequest
ClientItemHandle   :
Timestamp          : 1970-01-01 00:59:59
TimestampSpecified : True
ResultID           : http://opcfoundation.org/webservices/XMLDA/1.0/:E_BADTYPE

我认为这与我对 $ItemSessionRequest.ValueTypeQualifier 的选择有关(我尝试了很多替代方法)。

错误 #2:如果我在同一个实例中第二次运行脚本,就会出现这个错误

Cannot convert argument "Options",with value: "X.RequestOptions",for "Write" to type "X.RequestOptions": "Cannot convert the "X.RequestOptions" value of type "X.RequestOptions" to type "X.Request
Options"."
At C:\bla.bla.ps1:79 char:1
+ $Proxy.Write($Options,[ref]$RI ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [],MethodException
    + FullyQualifiedErrorId : MethodArgumentConversionInvalidCastArgument

我猜这与 $Proxy 变量有关

我很感激你的帮助,如果我错过了一些相关的东西,我很抱歉,但我已经尽力了......

解决方法

在这种情况下,问题 1 通过以下方法解决

$ItemSessionRequest.Value = @($x;$y;$z)

解决问题 2 的方法是在脚本中使用新会话,请参阅 1