среда, 13 июня 2012 г.

Импульсные кнопки в WinCC

Одним из методов реализации управления объектом с помощью SCADA-систем является выдача в контроллер импульсных команд.
Для обеспечения реакции на команду во многих случаях будет вполне достаточно импульса длиной в один скан ПЛК. Если используемый контроллер обновляет значения внешних переменных (получаемых через коммуникационные интерфейсы или I/O) между сканами, то для того, чтобы выдать импульс длительностью по крайней мере в один скан, необходимо:
  1. установить значение выходного тега в 1;
  2. убедиться, что это значение попало в контроллер;
  3. установить значение выходного тега в 0. Теперь мы можем быть уверены, что нулевое значение тега будет прочтено контроллером в следующем или еще более позднем скане.
Первые два пункта выполняются в WinCC с помощью функций синхронной записи тега.


Функция синхронного обмена (как записи, так и чтения):
  • выдает команду на запись/чтение значения тега из контроллера;
  • ожидает ответа от ПЛК об успешном выполнении команды (или истечения таймаута ожидания ответа);
  • возвращает управление скрипту, из которого она была вызвана.
При выполнении же асинхронных функций обмена значение тега устанавливается/читается из внутреннего массива тегов WinCC и управление немедленно передается вызывавшему скрипту. Реальные команды чтения/записи в контроллер в этом случае выполняются коммуникационной подсистемой WinCC позднее. Поэтому при последовательном вызове двух асинхронных функций записи для одного и того же тега велика вероятность, что значение записанное при первом вызове будет переписано при втором вызове до передачи его в контроллер.
Необходимо помнить, что при использовании синхронных команд обмена выполнение локальных скриптов приостанавливается на время ожидания ответа контроллера. Поэтому, в случае возникновения проблем со связью, элементы управления на экране не будут реагировать на действия оператора до тех пор, пока не истечет таймаут ожидания ответа.

C-скрипт

Имя синхронной функции в C-скрипте содержит слово Wait  в конце:

void ShortPulse(char* tagName)
{
    SetTagBitWait(tagName, 1);
    SetTagBit(tagName, 0);
}

Вызов из обработчика нажатия на кнопку:

#include "apdefap.h"
void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
    #define tagName "_tag1"
// WINCC:TAGNAME_SECTION_END
    ShortPulse(tagName);
}

VBS

В VB-скрипте, чтобы функция Write выполнялась синхронно, необходимо вызывать её со вторым опциональным аргументом равным единице:

Sub ShortPulse(Byval tagName)
    Dim tagObj
    Set tagObj = HMIRuntime.Tags(tagName)
    tagObj.Write 1, 1
    tagObj.Write 0
End Sub

Вызов из обработчика:

Sub OnClick(Byval Item) 
' WINCC:TAGNAME_SECTION_START
    Const tagName = "_tag1"
' WINCC:TAGNAME_SECTION_END
    ShortPulse(tagName)
End Sub


Продолжение...

WinCC V7.0+SP3

Комментариев нет:

Отправить комментарий