<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Библиотеки функций > Библиотека SERVER > Функции работы с тегами |
server.GetAttributeTagByNumber
server.GetAttributeTagByRelativeName
server.WriteCurrentTagToDevice
server.WriteTagByNumberToDevice
server.WriteTagByRelativeNameToDevice
server.WriteTagByRelativeNameToHda
При возникновении фатальных ошибок в функциях работы с тегами взводится флаг ошибки скрипта, и этот скрипт дальше выполняться не будет.
Понятия номера, полного и относительного имени тега даны в разделе Иерархия объектов в дереве .
Аналог server.GetAttributeTag , возвращает таблицу параметров текущего тега.
Пример
local err,t;
err,t = server.GetAttributeCurrentTag( );
Возвращает атрибуты (свойства) произвольного тега по его полному имени. Аргумент функции – полный путь к тегу.
Функция возвращает:
флаг ошибки: true – ошибка получения тега (тег не существует), false – ошибки нет;
таблицу атрибутов. Таблица состоит из 11 элементов, описывающие свойства тега:
1.короткое имя тега (например "Тег1");
2.полное имя тега (включая узел, устройства, подустройства, группы – например, "Узел3.Устройство1.Тег1");
3.комментарий к тегу;
4.регион тега (например, "Holding_Registers", "Input_Registers", "Server_Only");
5.номер регистра для чтения (у "Server_Only" – всегда ноль);
6.номер регистра для записи. Если запись в отдельный регистр не включена, то совпадает с регистром чтения. У "Server_Only" – всегда ноль;
7.тип данных в устройстве (например, "int16", "int32"). У "Server_Only" значение всегда равно "none";
8.тип данных в сервере (например "float", "int32");
9.тип доступа (например, "ReadOnly", "WriteOnly", "ReadWrite");
10.включен в работу (true – включен, false – выключен);
11.HDA-доступ (true – тег является тегом HDA, false – тег является тегом DA).
Пример
local err,Tab=server.GetAttributeTag("Узел2.Устройство1.Тег1");
-- переменная err содержит флаг ошибки, Tab – таблица со всеми атрибутами тега
server.GetAttributeTagByNumber
Возвращает атрибуты (свойства) произвольного тега по его номеру. Функция может возвращать параметры тегов текущего узла, устройства или подустройства (в зависимости от того где она вызывается), а также может возвращать параметры конкретного узла или устройства к которым указан путь.
Функция имеет два входных аргумента:
номер тега (нумерация с нуля);
путь к узлу или устройству. Данный атрибут не обязательный, если его не указать - то используется узел или устройство, в котором располагается вызываемый скрипт.
Функция возвращает:
флаг ошибки: true – ошибка получения тега (тег не существует), false – ошибки нет;
таблицу атрибутов. Структура таблицы идентична таблице функции server.GetAttributeTag .
Пример
local err,Tab=server.GetAttributeTagByNumber(1); --атрибуты тега №1 текущего узла или устройства
local err,Tab=server.GetAttributeTagByNumber(1,"Node1"); --атрибуты тега №1 узла "Node1"
-- переменная err содержит флаг ошибки, Tab – таблица со всеми атрибутами тега
server.GetAttributeTagByRelativeName
Возвращает атрибуты (свойства) произвольного тега по его относительному имени. Аргумент функции – относительный путь к тегу.
Функция возвращает:
флаг ошибки: true – ошибка получения тега (тег не существует), false – ошибки нет;
таблицу атрибутов. Структура таблицы идентична таблице функции server.GetAttributeTag .
Пример
local err,Tab=server.GetAttributeTagByRelativeName("Тег1");
--переменная err содержит флаг ошибки, Tab – таблица со всеми атрибутами тега
Возвращает общее количество тегов узла, устройства или подустройства (в зависимости от уровня расположения скрипта).
Также можно передать в функцию путь к узлу или устройству - в этом случае будет возвращено количество тегов данного узла/устройства.
Пример
CT = server.GetCountTags(); --количество тегов текущего узла или устройства
CtNode = server.GetCountTags("Node1"); --количество тегов узла Node1
В скрипте тега возвращает 1.
Возвращает true, если запись в тег была произведена из скрипта, и false – если была произведена из OPC-клиента.
Пример
FromScript=server.IsWriteFromScript( );
Возвращает значение, качество и время текущего тега.
Пример
TV,TQ,TS = server.ReadCurrentTag();
Возвращает значение, качество и время произвольного тега по его имени.
Пример
TV,TQ,TS = server.ReadTag("Node.Device.Group.Tag");
В данной функции, как и в функции server.WriteTag , могут использоваться следующие псевдо-имена для текущего узла, устройства или подустройства:
$(N) – текущий узел;
$(D) – текущее устройство;
$(S) – текущее подустройство.
Примеры
Ниже приведены примеры функций в том случае, если дерево объектов имеет следующий вид:
NODE1
DEVICE1
SUBDEVICE1
TEG1
SUBDEVICE2
TEG1
TEG1
--cкрипт устройства DEVICE1, суммирует 2 тега
--и записывает результат в тег NODE1.DEVICE1.TEG1
t1,q1,ts1 = server.ReadTag("$(N).$(D).SUBDEVICE1.TEG1");
t2,q2,ts2 = server.ReadTag("$(N).$(D).SUBDEVICE2.TEG1");
server.WriteTag("$(N).$(D).TEG1",t1+t2,192);
--cкрипт подустройства SUBDEVICE1,
--читает тег NODE1.DEVICE1.TEG1
t1,q1,ts1 = server.ReadTag("$(N).$(D).TEG1");
--cкрипт тега SUBDEVICE1.TEG1,
--читает тег NODE1.DEVICE1.TEG1
t1,q1,ts1 = server.ReadTag("$(N).$(D).TEG1");
Возвращает значение, качество и время тега с указанным номером.
Пример
TV,TQ,TS = server.ReadTagByNumber(1);
В скрипте тега возвращает значение текущего тега вне зависимости от номера.
Возвращает таблицу содержащую архив HDA тега. Основное предназначение данной функции - считывание архивов, для последующего формирования SQL запроса и передачи данных в различные СУБД с использование функций раздела ODBC.
Аргументы функции:
Имя тега - полное имя тега с HDA архивом.
Метка времени в локальном формате с которой производится выборка из архива (не включая значение с этой меткой времени). Если передано nil - возвращается весь HDA архив.
Тип времени возвращаемого архива - в локальном или UTC. Если значение False, то все записи архива возвращаются с локальной меткой времени, если True - с меткой времени в формате UTC.
Возвращаемые значения:
Количество прочитанных HDA записей.
Таблица строк считанных из HDA записей (подробнее ниже).
Метка времени последнего HDA значения в формате TimeStamp.
Основным возвращаемым параметром является таблица со считанными HDA строками. Таблица представляет собой три вложенных таблицы:
Таблица "значения" - значения переменной. Для удобства формирования SQL запроса, значение возвращается в формате строки - то есть делать дополнительных преобразований не требуется.
Таблица "признаки качества" - признаки качества считанной переменной. Признак качества возвращается в формате строки. Примеры строки:
0x000000C0 - GOOD
0x00000040 - Uncertain
0x00000000 - Bad
Таблица "метки времени" - метка времени переменной. Для удобства формирования SQL запроса, метка времени также возвращается в формате строки.
Пример
TimeStart=nil; --инициализируем nil
-- handling
function OnBeforeReading()
Num,Archive,TimeLast=server.ReadHDAFromTag("Simulator.script.Saw",TimeStart,false); --читаем значения их архива HDA переменной
if Num==0 then return; end; --данных нет - выходим
Values=Archive[1]; --получаем таблицу значений
Qual=Archive[2]; --получаем таблицу признаков качества
Times=Archive[3]; --получаем таблицу меток времени
for i=1,table.maxn(Values),1 do --перебираем таблицы и выводим данные
server.Message("table. Values=",Values[i]," Qual=",Qual[i]," Times=",Times[i]);
end;
TimeStart=TimeLast; --сохраняем последнюю метку времени, чтобы потом начать читать с нее
end
Также пример работы данной функции для записи в базу данных в разделе Работа с ODBC.
Возвращает значение, качество и время тега по его относительному имени.
Пример
t, q, ts = server.ReadTagByRelativeName("TagName");
При ошибке значение равно nil, качество равно 0, в ts записывается текст ошибки.
Данная функция аналгична server.SetDeviceToOnOff , позволяет останавливать/запускать исполнение тега.
Данная функция позволяет пропустить N следующих циклов опроса тега (N – значение аргумента). Данная функция полезна, если после записи в устройство первый цикл возвращает некорректное значение (характерно для ОВЕН ТРМ2XX).
Пример
server.SkipNextCycles(2)
Отменяет изменение значения текущего тега (восстанавливает предыдущее значение).
Пример
Если в теге задан скрипт, приведенный ниже, то после перевода сервера в режим исполнения и присвоения тегу значения 101 значение тега вновь станет равным 10, а качество – OPC_QUALITY_GOOD.
function OnInit()
server.WriteCurrentTag(10, OPC_QUALITY_UNCERTAIN);
end
function OnClose()
end
function OnRead()
if server.ReadCurrentTag( ) > 100 then
server.UndoCurrentTag( );
end
end
Возвращаемых значений нет.
Записывает значение, качество в текущий тег. Также третьим параметром можно передавать метку времени в формате TimeStamp
Пример
server.WriteCurrentTag(TV,TQ,TS);
Возвращаемых значений нет.
server.WriteCurrentTagToDevice
Записывает значение и качество в текущий тег с обращением к устройству. Также третьим параметром можно передавать метку времени в формате TimeStamp
Пример
server.WriteCurrentTagToDevice(TV,TQ,TS);
Возвращаемых значений нет.
Записывает в архив HDA текущего тега заданные значение, качество и, опционально, метку времени (метка времени задается как 8-байтовый массив – см. time.StringToTimeStamp и time.TimeToTimeStamp ). Для тега должен быть установлен флаг записи в архив HDA (HDA доступ=ИСТИНА – см. Диалог параметров тега ).
Примеры
Запись 120 с качеством OPC_QUALITY_GOOD и текущим временем ОС:
res=server.WriteCurrentTagToHda(120,192);
Запись 120 с качеством OPC_QUALITY_GOOD и заданной меткой времени:
ts = time.StringToTimeStamp("2010-05-03 12:34:45.100");
res= server.WriteCurrentTagToHda(120,192,ts);
Запись 120 с качеством OPC_QUALITY_COMM_FAILURE и заданной меткой времени:
timesec = os.time{year=2010,month=05,day=03,hour=12,min=34,sec=45};
timemsec=200;
ts = time.TimeToTimeStamp(timesec,timemsec);
server.WriteCurrentTagToHda(120,OPC_QUALITY_COMM_FAILURE,ts)
Записывает значение и качество в тег с указанным полным именем. Также четвертым параметром можно передавать метку времени в формате TimeStamp
Пример
server.WriteTag("Node.Device.Group.Tag",TV,TQ);
Возвращаемых значений нет.
В данной функции, как и в функции server.ReadTag , могут использоваться псевдо-имена для текущего узла, устройства или подустройства.
Записывает значение и качество в тег с указанным номером. Также четвертым параметром можно передавать метку времени в формате TimeStamp
Пример
server.WriteTagByNumber(1,TV,TQ,TS);
Возвращаемых значений нет. В скрипте тега записывает значение в текущий тег.
server.WriteTagByNumberToDevice
Аналог server.WriteTagByNumber с обращением к устройству.
Записывает в архив HDA тега с указанным номером заданные значение, качество и, опционально, метку времени (метка времени задается как 8-байтовый массив – см. time.StringToTimeStamp и time.TimeToTimeStamp ). Для тега должен быть установлен флаг записи в архив HDA (HDA доступ=ИСТИНА – см. Диалог параметров тега ).
Примеры
Запись 5 с качеством OPC_QUALITY_BAD и текущим временем ОС в архив тега с номером 2:
res=server.WriteTagByNumberToHda(2, 5, OPC_QUALITY_BAD);
Запись 5 с качеством OPC_QUALITY_BAD и заданным временем в архив тега с номером 2:
ts = time.StringToTimeStamp("2010-05-03 12:34:45.100");
res=server.WriteTagByNumberToHda(2, 5, OPC_QUALITY_BAD,ts);
Записывает значение и качество в тег по его относительному имени. Также четвертым параметром можно передавать метку времени в формате TimeStamp
Пример
res = server.WriteTagByRelativeName("TagName", t, q);
В случае успешного выполнения возвращает true, при ошибке – false.
server.WriteTagByRelativeNameToDevice
Записывает значение и качество в тег по его относительному имени и инициирует запись в устройство.
Пример
res = server.WriteTagByRelativeNameToDevice("TagName", t, q);
В случае успешного выполнения возвращает true, при ошибке – false.
server.WriteTagByRelativeNameToHda
Записывает в архив HDA тега с указанным относительным именем заданные значение, качество и, опционально, метку времени (метка времени задается как 8-байтовый массив – см. time.StringToTimeStamp и time.TimeToTimeStamp ). Для тега должен быть установлен флаг записи в архив HDA (HDA доступ=ИСТИНА – см. Диалог параметров тега ).
Примеры
Запись 5 с качеством OPC_QUALITY_BAD и текущим временем ОС в архив HDA тега Тег1 из скрипта узла Узел1, в который входит устройство Устройство1:
res=server.WriteTagByRelativeNameToHda("Устройство1.Тег1", 5, OPC_QUALITY_BAD);
Запись 5 с качеством OPC_QUALITY_BAD и заданным временем в архив HDA тега Тег1 из скрипта устройства Устройство1 или из скрипта тега устройства Устройство1:
ts = time.StringToTimeStamp("2010-05-03 12:34:45.100");
res=server.WriteTagByRelativeNameToHda("Тег1", 5, OPC_QUALITY_BAD,ts);
Записывает значение и качество в тег по его полному имени c обращением к устройству.
Пример
server.WriteTagToDevice("Node.Device.Group.Tag",TV,TQ);
Возвращаемых значений нет.
Записывает в архив HDA тега с указанным полным именем заданные значение, качество и, опционально, метку времени (метка времени задается как 8-байтовый массив – см. time.StringToTimeStamp и time.TimeToTimeStamp ). Для тега должен быть установлен флаг записи в архив HDA (HDA доступ=ИСТИНА – см. Диалог параметров тега ).
Примеры
Запись 5 с качеством OPC_QUALITY_BAD и текущим временем ОС:
res=server.WriteTagToHda("Узел1.Устройство1.Тег1", 5, OPC_QUALITY_BAD);
Запись 5 с качеством OPC_QUALITY_BAD и заданным временем:
ts = time.StringToTimeStamp("2010-05-03 12:34:45.100");
res=server.WriteTagToHda("Узел1.Устройство1.Тег1", 5, OPC_QUALITY_BAD,ts);
Считывает набор тегов, имена которых определены во входной таблице функции. Данную функцию следует применять, при считывании большого объема тегов (несколько сотен и выше) - в этом случае существенно ускоряется обработка значений.
Входные аргументы:
Таблица с именами тегов;
Префикс, который добавляется к имени каждого тега (например путь к устройству, в котором расположены теги). Следует помнить, что если указывается путь к узлу/устройству, то необходимо добавить в конце префикса точку - "SCRIPT.script."
Выходные аргументы:
Таблица результатов считывания. Каждый элемент таблицы содержит другую таблицу со следующими полями:
Полный путь к тегу. Если у тега задан префикс, то он удаляется из имени тега.
Значение тега;
Качество тега;
Метка времени тега.
В случае ошибки ошибки возвращает nil.
Примеры
--name tags
local TagNames={"SCRIPT.script.Tag1","SCRIPT.script.Tag2","SCRIPT.script.Tag3"};
local TagsValues=server.ReadTagsByTable(TagNames,""); --read tags
if TagsValues==nil then --check read
server.Message("Error read tags");
return;
end;
--iterating tags
for i=1,table.maxn(TagsValues),1 do
local TagValue=TagsValues[i];
--write values to log
server.Message("Name=",TagValue[1]," Value=",TagValue[2]," Quality=",TagValue[3]," Time=",time.TimeStampToString(TagValue[4]));
end
В примере теги заранее записаны в таблицу TagNames, если необходимо собрать определенные теги узла, то воспользуйтесь функцией server.GetAttributeTagByNumber.
Записывает таблицу (массив) значений в теги. Данную функцию следует применять, при записи большого объема тегов (несколько сотен и выше) - в этом случае существенно ускоряется запись значений в теги.
Входные аргументы:
Таблица со следующими полями:
Полный путь к тегу;
Значение тега;
Качество тега;
Метка времени тега - не обязательный параметр, если не указать, то запишется с текущим временем.
Префикс, который добавляется к имени каждого тега (например путь к устройству, в котором расположены теги). Следует помнить, что если указывается путь к узлу/устройству, то необходимо добавить в конце префикса точку - "SCRIPT.script."
Примеры
--name tags
local TagNames={"SCRIPT.script.Tag1","SCRIPT.script.Tag2","SCRIPT.script.Tag3"};
local TagsValues={};
for i=1,table.maxn(TagNames),1 do
local TagValue={};
TagValue[1]=TagNames[i]; --full name tag
TagValue[2]=math.random(0,100 ); --random value tag
TagValue[3]=OPC_QUALITY_GOOD; --quality
TagValue[4]=time.TimeStampNow( ); --timestamp
table.insert(TagsValues,TagValue); --add to table
end
server.WriteTagsByTable(TagsValues,""); --write to tags
В примере теги заранее записаны в таблицу TagNames, если необходимо собрать определенные теги узла, то воспользуйтесь функцией server.GetAttributeTagByNumber.