在这里挣扎......
的VBScript
我加载了一个DLL,可以创建一个Object;
Set objServer = CreateObject("Matrikon.OPC.Automation.1")
然后我可以根据objServer的属性创建一个新的对象(我想我说对了吗?)
Set objGroups = objServer.OPCGroups
Set objGroup = objGroups.Add("Group001")
手册显示OPCGroups
是Property
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
个对象。
因此。我可以解决 这些问题吗?
答案 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问题,但我希望有人会觉得有用。