Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Архив
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

ThisDisplay.GetPointObjectFromName

 Ответить Ответить
Автор
Сообщение
RW9UAO Смотреть выпадающим
Новичок
Новичок


Присоединился: 22 Август 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - RW9UAO Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: ThisDisplay.GetPointObjectFromName
    Опубликовано: 30 Август 2005 10:17
есть у меня такой кусок скрипта:
'=======
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!
Наверх
RW9UAO Смотреть выпадающим
Новичок
Новичок


Присоединился: 22 Август 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - RW9UAO Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 01 Сентябрь 2005 10:02
с DataWorX вопрос решился внимательным вкуриванием "DataWorX32 VB Samples" и раздела "OLE Automation in DataWorX32". короче,
=====
Option Explicit
Dim dwx As AutoDwxRuntimeLib.DwxRuntime

Private Sub AxTimer1_Timer()
    
'create the DataWorX32 runtime module
'it will start with the active configuration (made active in the DataWorX32 Configurator earlier)
    Set dwx = New DwxRuntime
    dwx.Runtime = True

Dim ves_max_adc As AutoDwxRuntimeLib.IRegister
Set ves_max_adc_bit = dwx.GetRegister("bitum.vesmaxadc_bit")

[skip]

End Sub
=====

дык вот, не будет утечки памяти при постоянном Set dwx = New DwxRuntime, или я что-то опять не вкурил?
73!
Наверх
sermon Смотреть выпадающим
Новичок
Новичок


Присоединился: 07 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 35
Свойства публикации Свойства публикации   Ответить, цитируя автора - sermon Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 08 Сентябрь 2005 15:31
Первоначально опубликовано 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 более одного раза для одного и того же псевдонима, но разных тегов, то ничерта не получится (исправляется использованием более одного псевдонима).

и вообще этот алгоритм мне не нравится, но, правда, работает

может кто что еще подскажет?
Наверх
RW9UAO Смотреть выпадающим
Новичок
Новичок


Присоединился: 22 Август 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 11
Свойства публикации Свойства публикации   Ответить, цитируя автора - RW9UAO Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Сентябрь 2005 06:02
>sermon
>на невидимом слое разместил "параметр" (значок 686), в нем написал псевдоним <<bool_alias>>

если тэги/регистры размещены на невидимом слое, то их можно забирать через ThisDisplay.GetPointObjectFromName(" и не морщиться. С регистрами датаворХ вопрос-то решился, а вот тэги так и рисую на невидимом слое.
--
73!
Наверх
sermon Смотреть выпадающим
Новичок
Новичок


Присоединился: 07 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 35
Свойства публикации Свойства публикации   Ответить, цитируя автора - sermon Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Сентябрь 2005 09:07
Первоначально опубликовано RW9UAO

если тэги/регистры размещены на невидимом слое, то их можно забирать через ThisDisplay.GetPointObjectFromName(" и не морщиться. С регистрами датаворХ вопрос-то решился, а вот тэги так и рисую на невидимом слое.
--
73!

так смысл в том, что вместо десятков (а то и сотен) однотипных параметров, будет использоваться только один с псевдонимом, останется только в VBA-коде подставлять нужное название тега, кстати, таким образом можно уменьшить количество используемых точек в серверах OPC (если, конечно, такое ограничение Genesis'а актуально)
Наверх
sermon Смотреть выпадающим
Новичок
Новичок


Присоединился: 07 Сентябрь 2005
Категория: Russian Federation
Online Status: Offline
Публикации: 35
Свойства публикации Свойства публикации   Ответить, цитируя автора - sermon Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 09 Сентябрь 2005 09:18
забыл написать какие библиотеки должны быть подключенны в MS VB (Tools -> References...), чтобы программа откомпилировалась:

- Visual Basic For Applications
- OLE Automation
- Gwx32
- ICONICS SwxExtender 6.0

хотя может последняя и не нужна (уже не помню)
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz