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

Windows脚本主机-带有COM对象的JScript和VBScript,vbscript,jscript,wsh,Vbscript,Jscript,Wsh,挣扎在这里 VBScript 我有一个DLL加载,可以创建一个对象 Set objServer = CreateObject("Matrikon.OPC.Automation.1") 然后,我可以基于objServer的属性创建一个新对象(我想我是这么说的吧?) 手册显示OPCGroups是OPCServer的属性。一旦我调用了这个属性,我就剩下一个OPCGroups类型的新对象,然后我可以调用它的属性和方法 Syntax OPCGroups As OPCGroups 这个很好用。然后我继

挣扎在这里

VBScript

我有一个DLL加载,可以创建一个对象

Set objServer = CreateObject("Matrikon.OPC.Automation.1")
然后,我可以基于objServer的属性创建一个新对象(我想我是这么说的吧?)

手册显示
OPCGroups
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中,我总是得到一系列变体(VarType=8204)。当我尝试传递数组时,会出现类型不匹配错误。我找不到一种将其强键入字符串数组的方法;我甚至不确定这是否可能

转到JScript

JScript

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

var objGroups = objServer.OPCGroups;
有些东西不起作用。它实际上并没有创建一个带有所有相关属性/方法的
OPCGroups
对象。当我尝试调用一个方法时

var objGroup = objGroups.Add();
它表示“对象不支持此属性或方法”。就好像它刚刚创建了一个通用/空白对象;没有一个被键入为
OPCGroups
对象


所以。我可以解决这两个问题中的任何一个吗

在这个问答部分,我已经有一段时间没有见到一位自动化专家同事了。和Matrikon一起工作?我个人更喜欢autosol或kepware。不管怎样,在你的代码上。您参考的手册是为VBA而不是vbscript编写的,并提供了“As xxxx”描述符,其中As 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引擎正确初始化轮询会话的示例:

只是清理一下

我使用了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问题,但我希望有人会觉得它有帮助。

在vbscript版本中,您是否尝试过使用cstr函数将数组的每个项强制为字符串?当然可以<代码>直到objTextFile.AtEndOfStream Redim保存arrFileLines(i)arrFileLines(i)=CStr(objTextFile.Readline)i=i+1循环为止
此处的一些信息:不是Matrikon本身;但是他们的OPCDAAuto.dll。是的,我已经让它在Excel的VBA中运行,我希望它只在脚本文件中运行,而不需要编译。Powershell是一种选择,但我对Powershell一无所知。OPC也有一个.NET的DLL实现,但我对.NET一无所知,他们只向公司成员发布规范。
$opcResults = $opcServer.Read([Opc.Da.ItemValueResult[]]$masterItemsList)