Windows脚本宿主 - 带有COM对象的JScript和VBScript

时间:2017-02-10 09:34:42

标签: vbscript jscript wsh

在这里挣扎......

  

的VBScript

我加载了一个DLL,可以创建一个Object;

Set objServer = CreateObject("Matrikon.OPC.Automation.1")

然后我可以根据objServer的属性创建一个新的对象(我想我说对了吗?)

Set objGroups = objServer.OPCGroups
Set objGroup = objGroups.Add("Group001")

手册显示OPCGroupsProperty OPCServer。一旦我调用了这个属性,我就会得到一个类型为OPCGroups的新对象,然后我可以调用它的属性和方法。

Syntax  OPCGroups As OPCGroups

这很好用。然后我继续,并在调用此函数时卡住;

Syntax  AddItems (Count As Long, ItemIDs() As String, ClientHandles() As Long, ByRef  ServerHandles() As Long, ByRef Errors() As Long, Optional RequestedDataTypes As Variant, Optional AccessPaths As Variant)

它想要一个字符串数组。但是,在VBScript中,我总是最终得到一个Variants数组(VarType = 8204)。当我尝试传递我的数组时,我收到类型不匹配错误。我找不到强烈输入字符串数组的方法;我甚至不确定它是否可能。

转到JScript

  

的JScript

我执行与上面相同的第一步,但是当我创建OPCGroups对象时;

var objGroups = objServer.OPCGroups;

有些东西没用。它实际上并没有创建一个OPCGroups对象及其所有相关的属性/方法。当我尝试调用方法

var objGroup = objGroups.Add();

它表示'对象不支持此属性或方法'。就好像它只是创建了一个通用/空白对象;没有人输入OPCGroups个对象。

因此。我可以解决 这些问题吗?

2 个答案:

答案 0 :(得分:0)

自从我在Q& A部分看到自动化专家以来,已经有一段时间了。和Matrikon一起工作吧?我个人更喜欢autosol或kepware。无论如何,你的代码。您引用的手册是针对VBA而不是vbscript编写的,并提供“As xxxx”描述符,其中VBScript不需要这些描述符。在将其转换为.vbs文件之前,您应该打开excel,将COM对象附加到excel引用中,阅读下面的文章/代码并测试它。

Dim TestServer As OPCServer
Dim TestGroupCollection As OPCGroups
Dim WithEvents Group1 As OPCGroup
Dim ItemCollection1 As OPCItems

Dim OPCItemIDs() As String
Dim ClientHandles() As Long
Dim ReadWriteHandles() As Long

Dim ItemServerHandles() As Long
Dim ItemServerErrors() As Long
Dim RequestedDataTypes As Variant
Dim AccessPaths As Variant
Dim MaxItems As Integer

' Start monitoring the value
Private Sub StartBtn_Click()
  Dim ItemTag As String
  ItemTag = "D57PT201.AI_MEAS"

  Dim ItemValues() As Variant
  Dim ItemQualities As Variant
  Dim ItemTimeStamps As Variant
  Dim idx As Integer

  MaxItems = 1
  ReDim OPCItemIDs(MaxItems)
  ReDim ClientHandles(MaxItems)
  ReDim ReadWriteHandles(MaxItems)

  ' Create connection to the OPC server
  Set TestServer = CreateObject("Matrikon.OPC.Automation.1")

  TestServer.Connect "Matrikon.OPC.Simulation.1"

  ' Create a group to contain the tag
  Set TestGroupCollection = TestServer.OPCGroups
  Set Group1 = TestGroupCollection.Add("group1")
  Group1.ClientHandle = 100
  Group1.UpdateRate = 1000

  Set ItemCollection1 = Group1.OPCItems
  ItemCollection1.DefaultAccessPath = ""

  ' Add the tag
  For idx = 1 To MaxItems
    ClientHandles(idx) = idx
    OPCItemIDs(idx) = ItemTag
  Next idx

  ItemCollection1.AddItems MaxItems, OPCItemIDs, ClientHandles, ItemServerHandles, ItemServerErrors, RequestedDataTypes, AccessPaths
  MsgBox "Success"
End Sub

以下是使用Matrikon OPC Engine正确初始化轮询会话的示例:

AutomationException: 0x80070057 - One or more arguments are invalid

答案 1 :(得分:0)

只需清理一下。

我使用PowerShell-令人惊讶的是3年前我对PowerShell一无所知。使用更新的.NET OPC API,要简单得多;

加载DLL

$PSScriptRoot = Split-Path -Parent -Path $MyInvocation.MyCommand.Definition
# Namespaces Opc, Opc.Ae, Opc.Da, Opc.Hda
Add-Type -Path ($PSScriptRoot + "\OpcNetApi.dll")
# Namespaces OpcCom, OpcCom.Ae, OpcCom.Da, OpcCom.Hda, OpcCom.Da20 and OpcCom.Da.Wrapper - the same namespace as the original Interop.OPCAutomation.dll
Add-Type -Path ($PSScriptRoot + "\OpcNetApi.Com.dll")

将标签数组作为字符串,然后转换为Opc.Da.Items[]

# Convert array of strings into an Array of Opc.Da.Items[]
$masterItemsList = $tagList | ForEach {New-Object "Opc.DA.Item" ([String]$_)}

连接到OPC服务器

$opcFactory = New-Object "OpcCom.Factory"
# Constructor is Opc.Da.Server(OPC.Factory factory, Opc.URL url). Leave URL $null - apply it in the connect method
$opcServer = New-Object "Opc.DA.Server" ($opcFactory, $null)

$opcURL = New-Object "Opc.URL" ("opcda://" + $serverName + "/" + $progID)
# Method is void Connect(Opc.URL url, new Opc.ConnectData(new System.Net.NetworkCredential())). connectData can supply Windows Credentials
$opcServer.Connect($opcURL, $null)

无需创建OPC组;它是自动完成的。

$opcResults = $opcServer.Read([Opc.Da.ItemValueResult[]]$masterItemsList)

这并不能真正解决VBS / JScript问题,但我希望有人会觉得有用。