Первоначально опубликовано RW9UAO
есть у меня такой кусок скрипта:
'=======
Dim Chan0 As GwxPoint
Dim bit_pump As GwxPoint
Set Chan0 = ThisDisplay.GetPointObjectFromName("Fastwel.UniOpc.1\gate.DigiOut0xD1.Ch0")
Set bit_pump = ThisDisplay.GetPointObjectFromName("ICONICS.DataWorX32.8\buttom.bit_pump")
'=======
дык вот, если на текущей экранной форме есть "лампочки" к которым привязаны выше указанные тэги, то я получаю их значения и т.д. если же тэг не привязан к элементу экранной формы (ну, он просто виден в ОРС сервере), то получаю сообщение об ошибке "нет такого тэга".
чем заменить ThisDisplay.GetPointObjectFromName("...") чтобы не рисовать "лампочку" на каждый тэг?
--
73! |
Использую Genesis32 7.0
Решил такую проблему следующим образом (на истину в последней инстанции не претендую, просто как вариант, который имеет, правда, свои недостатки):
на невидимом слое разместил "параметр" (значок 686), в нем написал псевдоним <<bool_alias>>
в VBA-коде следующее:
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Option Explicit
....
' ВАЖНОЕ ЗАМЕЧАНИЕ: - возвращаемый тип логических локальных переменных - целый тип,
' например, для переменной ~~DVUxxxCheck~~, оператор сравнения будет
' выглядеть следующим образом:
' ... If (GetPointValue("~~DVUxxxCheck~~") = 1) Then ...
' - для логических регистров из DataWorX32 возвращаемый тип - булевый:
' ... If (GetPointValue(OPCTagName) = True) Then ...
' - для логических OPC-тегов в операторах While и Until необходимо использовать
' сравнение с False/True, а в операторах If - сравнение с 0/1
Function GetPointValue(PointName As String) As Variant
On Error GoTo ErrorLabel
Dim Point As GwxPoint
GetPointValue = 0
Set Point = ThisDisplay.GetPointObjectFromName(PointName)
GetPointValue = Point.Value
Set Point = Nothing
Exit Function
ErrorLabel:
GetPointValue = 0
End Function
Function GetDefPointValue(PointName As String, SleepTime As Integer) As Variant
GetDefPointValue = 0
If ThisDisplay.SetAliasDefinition("bool_alias", PointName) Then
If (SleepTime <> 0) Then Sleep (SleepTime)
GetDefPointValue = GetPointValue(PointName)
Else
MsgBox ("Ошибка: псевдонима " + AliasName + " не существует")
End If
End Function
теперь недостатки:
1. иногда требуется вводить задержку SleepTime (в милисекундах), иначе не возвращает значения;
2. если в одном и том же обработчике какого-либо события (например, нажатие на кнопку) использовать функцию GetDefPointValue более одного раза для одного и того же псевдонима, но разных тегов, то ничерта не получится (исправляется использованием более одного псевдонима).
и вообще этот алгоритм мне не нравится, но, правда, работает
может кто что еще подскажет?