Программируемый компонент

Программируемый компонент — компонент. Предназначен для расширения возможностей компонентов и реализации несложных алгоритмов посредством использования языка программирования VBScript. В некоторых случаях позволяет минимизировать число используемых в проекте компонентов. Также позволяет вызывать методы функции компонентов. Например нажать с помощью скрипта на кнопку, выдать сообщение, поменять цвет или свойства компонента, т.е. реализовывать функции, которые не предусмотрены в системе.

Внешний вид компонента

Режим проектировщика Режим оператора
Программируемый компонент - Режим проектировщика Не имеет

Параметры:

Входные

  • Воздействие —предназначен для подключения к скрипту компонентов, воздействующих на него или данные с которых будут использоваться в программе.

Выходные

  • Связи — предназначен для подключения к скрипту компонентов, на которые он будет воздействовать.

Замечание:

Компонент не обязательно должен быть присоединен к другим компонентам. В основном, соединение показывает взаимосвязь между блоками.

Настраиваемые свойства:

Общие свойства (окружение)

Частные свойства (в скобках значение, установленное по умолчанию):

Не имеет.

Примечание:

При обновлении данных из каналов, фокус переносится на главное окно проекта.
Передача фокуса главному окну проекта происходит при нажатии кнопок через скрипт.

В Setup от 15.07.2016 г. входит доработанный компонент ZETView «Программируемый компонент».
Новая версия компонента является Unicode-версией, что привело к тому, что в существующих проектах ZETView, использующих этот компонент, требуется пересборка проекта в новом Setup. Для этого необходимо в каждом таком проекте для каждого элемента «Программируемый компонент» выполнить следующие действия:

  • с помощью клика правой кнопке мыши на компоненте вызвать контекстное меню;
  • в этом меню выбрать «Редактировать компонент», откроется окно для программирования;
  • в этом окне кликнуть по кнопке «Применить»;
  • сохранить проект;
  • при необходимости скомпилировать проект в *.exe.

Пример

Вопрос. В проекте программа не записывает данные в массив.

Программируемый компонент - Пример-Вопрос

Ответ.

1. На вход «Сброс» компонента «Формировщик массивов (число_массив)_3» лучше всего ставить компонент «Кнопка без фиксации», которая при нажатии подаст подряд импульс «1» и «0». Сброс произойдёт при получении импульса «1». Компонент «Тумблер» работает также как и компонент «Кнопка с фиксацией», он передаёт своё новое состояние в момент переключения. Для сброса массива с помощью него необходимо сначала его выключить, а потом снова включить.

2. «Программируемый компонент_1» будет выполнять свою работу только когда с компонента «Селектор 1» «inter» придёт новое число. Компонент «Переменная» «y» получает новое значение при работе «Программируемого компонента» при выполнении определённого условия. Когда компонент получит новое значение он его передаст на выход, это значение получит компонент «Формировщик массивов (число-массив)» «value1» и передаст его на график.

3. У компонента «График» есть свойство «xystate», которое отвечает за вид осей графика. В выбранном вами варианте «y(n)» графику безразличен массив на входном контакте «X» и он строит новый график по мере получения массивов по контакту «Y». Важно помнить, чтобы поле «m_sHelpString» было не пустым, так как по строке в этом поле задаётся имя графика в легенде, а нет имени — нет и графика. Чтобы показывать ось X в виде даты необходимо выбрать вариант «y(x) — реально».

4. Компонент «Формировщик массивов (дата-массив)_1» работает от таймера и постоянно заполняет себя значениями текущего времени. В это время компонент «Формировщик массивов (число-массив)» «value1» может и не заполняться вовсе. Таким образом их размеры будут практически всегда различны. Чтобы этого избежать необходимо импульс для заполнения массива согласовать с получением новых данных или изменением размера массива.

5. В проекте ошибка. Селекторы «к1» и «к2» имеют в названии русские буквы, в скрипте буквы в названии английские. Если давай английские названия, то давать всем и проверять «к» и «k», а также «с» и «c».

Окно редактора

При вызове контекстного меню компонента, необходимо выбрать Редактировать компонент, после чего откроется скриптовый редактор:

Программируемый компонент - Окно редактора

Окно редактора программы функционально разделено на три части: текстовый редактор (слева); перечень доступных скрипту объектов ZETView (справа); таблица обнаруженных синтаксических ошибок (снизу).

При создании текста программы по умолчанию создается следующий код:

1 Sub Initialization(param)
         ‘ написать здесь свой код
EndSub
Данная функция вызывается при старте проекта а так же, по нажатию на кнопку Запустить проект (верхний левый угол страницы)

Предназначена для инициализации начальных параметров объектов ZETView, например, управлением состояния управляющих компонентов (кнопок, элементов выбора и т.д).

2 Sub NeighborCall(pType, helpString, param)
          ‘ написать здесь свой код

EndSub

Вызывается при воздействии на скрипт соседнего компонента, подключенного ко входному контакту.

pType — тип передаваемого параметра:

  • 0 — целые числа
  • 1 — числа с плавающей запятой
  • 4 — строка (текст)

helpString — параметр, предназначенный для идентификации источника сообщения (в случае, если на входной контакт подключены более одного компонента). Данный параметр задается в строке идентификатора.

param — информативный параметр. Для корректной обработки данного параметра необходимо знать значение параметра pType.

  • Если работаем с целыми или с булевыми величинами и pType =» 0, можно считать param в одну из ваших переменных напрямую.
  • Если работаем с переменными с плавающей запятой, тогда для присвоения переменной значения param вызывается следующая функция: This.mLtoF param,3 (где 3 — точность).
3 Sub NeighborCallArr(arrSize, helpString, ByRef arrVector)
           ImaxUBound(arrVector)    ‘максимальный индекс
          If IsArray(arrVector) Then
‘msgbox arrVector(Imax) ‘пример обращению к элементу массива
           Else
msgbox No array detected
           EndIf
EndSub
Функция, вызываемая по приходу Event от подключенной к Unit программы.
size — размер массива данных.
data_0 — массив данных.
param — дополнительные информативные параметры.
4 Function onClose(param)
            ‘тект вашей программы
EndFunction
Функция, вызываемая при закрытии программы, а так же при остановке ее выполнения.

Синтаксис языка VBScript, описание функций, а так же, доступ к стандартным объектам Windows и прочие детали приведены на официальном сайте Microsoft:

Программирование

При использовании компонента в сценарии и программируемом компоненте (скрипте) необходимо учитывать диапазоны значений подаваемых на входные ножки компонента, диапазоны значений свойств компонента, а также диапазоны значений параметров методов компонента.

Параметры:

Входные

  • Воздействие — предназначен для подключения к скрипту компонентов, воздействующих на него или данные с которых будут использоваться в программе (любой тип).

Настраиваемые свойства:

Общие свойства (окружение)

Частные свойства (в скобках значение, установленное по умолчанию):

  • BSTR ScriptText — установка и чтение ScriptText «Сценарий действий» (любой текст). Это частное свойство не видимое в интерфейсе проектирования ZETView.

Методы:

  • LONG FillNaibList(LONG naibHWND, BSTR name, IDispatch* naibDisp) — заполняет список компонентов проекта.
  • LONG RefreshData(OLE_HANDLE sourceWHND, LONG pinNum, LPCTSTR helpString, LONG parametr, LONG parametrType) — обновляет данные (описание находится в Примере компонента Рисунок).
  • LONG scriptReady(LONG isReady) — проверяет готовность компонента Скрипт к работе.
  • LONG Sleep(LONG time) — устанавливает временную задержку, мс (число).
  • void UnitSetParamString(LONG param, BSTR str) — посылает команду SetParam Юниту.
  • void RefreshNeighbor(BSTR NeighborName, BSTR helpString, DOUBLE parametr, LONG parametrType) — подает команду на обновление соседнему компоненту (Имя соседнего компонента, Строка подсказки, Параметр, Тип параметра).
  • LONG GetHandle(void) — запрашивает хэндл своего окна (число).
  • LONG GetHandleNeighbor(BSTR NeighborName) — запрашивает хэндл окна соседнего компонента (Имя компонента).
  • FLOAT mLtoF(LONG val, LONG accuracy) — конвертирует формат данных из FLOAT в LONG.
  • LONG mFtoL(FLOAT val) — конвертирует формат данных из LONG во FLOAT.
  • void Send(LPCTSTR helpString, FLOAT parametr, LONG parametrType) — посылает сообщение компоненту подключенному по соединительной линии.
  • void PutValueToArray(FLOAT value, LONG index) — добавляет значение в массив, который потом можно послать на другие компоненты функцией SendArray.
  • void defNaibCall(void) — вызывает функцию прихода данных скрипта.
  • void ShellExecute(BSTR progName, BSTR param) — запускает программу по имени.
  • void ShellKill(BSTR progName) — останавливает программу по имени.
  • void ShowConsole(void) — выводит результаты на консоль.
  • void HideConsole(void) — скрывает консоль.
  • void PrintConsole(BSTR string) — печатает результаты с консоли.
  • void SendArray(LPCTSTR helpString, FLOAT* pA, LONG uBound) — посылает массив на компонент, который подключен к соединительной линии. Массив необходимо предварительно заполнить с помощью функции PutValueToArray.
  • void SendDouble(BSTR helpString, DOUBLE parameter, LONG parameterType) — поддержка передачи данных на ножки типа Double.
  • IDispatch* component(BSTR name) — обращение к компоненту по имени. Метод позволяет осуществлять обращение к компонентам по имени в рантайме.
  • void DebugOut(BSTR debugString) — функция This.DebugOut — осуществляет вывод строки через OutputDebugString. Вывод дебажной строки.

Пример 1

Проект в SCADA ZETView

Программируемый компонент - Пример
В этой схеме компонент Программируемый компонент служит для инициализации цветов в компонентах Кнопка без фиксации и Световой индикатор. В данном случае была упрощена реализация задания цветов для блоков с помощью Программируемый компонент. При нажатии на Кнопку без фиксации появляется диалоговое окно, в котором сообщается какое значение параметра было передано Световому индикатору с компонента Кнопка без фиксации. Данный компонент используется для создания различных проектов, в том числе таких как системы измерительных приборов.

‘******************** точка входа в программу *******************
‘вызывается по сообщению при старте основной программы
‘CallMessageName — комментарий к передаваемому параметру
Sub Initialization(param)
                         кнопка.OnBackColor = &H808000
                         кнопка.OffBackColor = &HCD5C5C
                         световой_индикатор.onColor = &H90EE90
                         световой_индикатор.offColor = &H800000

End Sub
‘***************************************************************
‘вызывается по сообщению подключенного компонента
Sub NeighborCall(pType, helpString, param)
msgbox param

End Sub
Sub NeighborCallArr(arrSize, helpString, ByRef arrVector)
       Imax = UBound(arrVector)            ‘максимальный индекс
       If IsArray(arrVector) Then
                         ‘msgbox arrVector(Imax) ‘пример обращению к элементу массива
       Else
msgbox No array detected
       End If
End Sub

‘действия Скрипта при удалении компонента
‘или иной команде, завершающей работу скрипта
Function onClose(param)
        ‘тект вашей программы
End Function

Результат работы проекта

Программируемый компонент - Результат работы проекта 1
Программируемый компонент - Результат работы проекта 2

Пример 2

Вопрос.
При работе c использованием программируемого компонента возникает следующая проблема: т.к. его процедуры и функции написаны на VBScript, то при окончании скрипта значения всех его глобальных переменных теряются. Другими словами, если в скрипте используется процедура, которой нужны данные, полученные в результате предыдущего вызова скрипта, лежащие в глобальных переменных, то она их не получит. Нет эффективного способа сохранять значения глобальных переменных скрипта между итерациями. Как решить эту задачу?
Ответ. В ниже указанном примере указано, как нужно работать с глобальными переменными.

Примечание.
1) К компонентам в VBScript можно обращаться не только по HelpString, но и по Caption, заменив пробелы символами подчеркивания «_».
2) Написать свой компонент для ZETView, который можно добавить в список Перечень компонентов виртуальных приборов, нельзя.