Передача данных из Lua-скрипта в другую программу через файл
В скрипте lua происходит выгрузка данных в файл:
f=io.open(getScriptPath()..»\\Sr\\»..»Treids.txt»,»w»)
f:write(«sell»)
f:close()
При обращении внешнего приложения на Delphi возникает ошибка — «файл занят другим процессом».
Вопрос — есть у кого-нибудь мысли по поводу того почему так происходит?
Проблема тут в том, что файл в Lua в данном случае открывается эксклюзивно на запись. Поэтому если в другом процессе читать файл «обычным образом», то файл, в который идет запись, будет недоступен, «занят другим процессом».
В частности, в данном случае автор вопроса пытался из Delphi читать файл следующим образом:
list:=TStringList.Create; appdir:= ExtractFileDir(ParamStr(0)); str:=(appdir+'\Files\Rts\Stop.txt'); list.LoadFromFile(str); //операции с данными list.free;
Беда методе list.LoadFromFile(). Если посмотреть его исходники, то видно, что файл открывается просто на чтение, без указания доп. опций «чтения с общим доступом».
2 Ответ от swerg 2014-08-24 10:45:19 (2014-08-24 13:55:52 отредактировано swerg)
Re: Передача данных из Lua-скрипта в другую программу через файл
Для экспериментов сделал такой Lua-файл:
function OnInit() out_file = io.open(getScriptPath().."\\".."ex_file.txt","w") is_run = (out_file ~= nil) end function main() local i = 0 while is_run do out_file:write("i=" .. tostring(i) .. "\n") out_file:flush() sleep(500) i = i + 1 end out_file:close() end function OnStop() is_run = false end
Создает в иректории со скриптом файл ex_file.txt и пишет в него строки вида
i=0 i=1 i=2
3 Ответ от swerg 2014-08-24 10:49:43 (2014-08-26 11:05:11 отредактировано swerg)
Re: Передача данных из Lua-скрипта в другую программу через файл
Как сделать чтение такого файла при работающем Lua-скрипте.
Delphi
Для чтения файла будем использовать объект класса TFileStream, в методе Create которого последним параметром можно указать тип доступа к файлу. В нашем случае надо указать два модификатора: fmOpenRead и fmShareDenyNone
Ниже приведен фрагмент кода, функционально аналогичный тому, что дан в первом посте. Здесь загружается файл в объект типа TStringList:
const FILE_NAME = 'D:\QUIK\Lua\ex_file.txt'; var List: TStringList; Stream: TStream; begin if FileExists(FILE_NAME) then begin List := TStringList.Create; try Stream := TFileStream.Create(FILE_NAME, fmOpenRead or fmShareDenyNone); try List.LoadFromStream(Stream); finally Stream.Free; end; // // . здесь обработка строк из файла, которые находятся в List . // Memo1.Lines.Assign(List); finally List.Free; end; end; end;
В общем архиве со всеми примерами (ссылка в следующем сообщении) приведен пример чтения файла и отображение его содержимого в TMemo в окне программы. Содержимое TMemo постоянно обновляется (используется таймер).
Т.к. TMemo имеет готовое свойство Lines типа TStrings, то отдельный экземпляр TStringList не создается, чтение происходит непосредственно в строки TMemo.
C#
Чтобы иметь возможность указать параметры доступа к файлу, можно использовать один из двух вариантов:
using (Stream fs = new System.IO.FileStream(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (Stream fs = System.IO.File.Open(fullFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
После чего используя открытый поток можно читать наш файл.
Для построчного чтения текстового можно, например, воспользоваться таким вариантом:
using (StreamReader sr = new StreamReader(fs)) < while (!sr.EndOfStream) < // очередная строка доступна через sr.ReadLine() >>
В приложенном архиве с примерами (см. следующее сообщение) сделана аналогичная с Delphi программа: периодически по таймеру перечитывается файл и его содержимое отображается в ListBox.
Команда для выгрузки LUA скрипта
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.
Статус В этой теме нельзя размещать новые ответы.
killz124
Новичок
Автор темы
Ищу такую команду, при котором можно выгрузить LUA скрипт на кнопку (Например на F10)
OJLG

Lua — ScriptRender | Загрузка и выгрузка Lua
Описание: Данный скрипт позволяет Вам контролировать ваши скрипты, в каком плане? Вы сможете их загружать и выгружать. Есть большая проблемка, будет крашить, если Ваш скрипт имеет интерфейс ImGui. И ещё, данный скрипт способен загружать и выгружать только .lua, .luac скрипты.
![]()
www.blast.hk
Lua скрипты
![]()
Lua скрипты могут быть встроенными в ПО ТМИУС (ТМ-сервер) и добавленными пользователями.
На роутерах iRZ R2 встроенные скрипты располагаются в папках
/usr/share/tm_cpps/luascript
Скрипты пользователя располагаются по пути
/opt/storage/files/tm_cpps/luauser/
В Windows версии скрипты располагаются в каталогах корневой папки ТМ-сервера
\luascript \luauser
Логика работы lua-скрипта
Описание и и примеры работы lua скриптов описана в файлах ниже:
TmsREADME.lua — краткая справка описания работы LUA скриптов
TmsParsToDB.lua — скрипт сохраняет сигналы (числа) и Rawdata (строки) в БД sqlite
TmsParsToJson.lua — cкрипт сохраняет сигналы (числа) и Rawdata (строки) в файл формата json
Порядок работы с Lua скриптами
Создание
- Разместить пустой или готовый Lua скрипт в папке пользовательских скриптов, добавить скрипту права 666
- В разделе передачи добавить папку для более удобной организации работы со скриптами
- Добавить во вновь созданной папке «lua источник», указать имя источника.
- На lua источнике нажать ПКМ (правой кнопкой мыши) и выбрать Редактор lua. Произвести редактирование файла и сохранить под необходимым наименованием.
- Добавить в папку lua скрипт и выбрать в имени источника вновь созданный файл в качестве источника указать «имя источника» из п.3
Редактирование
- Отредактировать текст в текстовом редакторе, перезапустить ТМ-сервер из консоли или через Веб-интерфейс.
- На lua источнике нажать ПКМ (правой кнопкой мыши) и выбрать Редактор lua
- Произвести необходимые правки, нажать Сохранить, нажать Применить.
Отладка
- В поле конфигурирования lua скрипта Выбрать Лог → Да,Лог-уровень → выбрать необходимый. Применить конфигурацию.
- На lua скрипте нажать ПКМ (правой кнопкой мыши) и выбрать Смотреть лог файл
Примеры реализаций протоколов на базе Lua
| Протокол | Описание | Файл |
|---|---|---|
| Modbus RTU | Прием данных по протоколу Modbus RTU | Conf.xml |
| СЭТ4 | Счетчики СЭТ4 | Conf.xml |
| Протокол Энергомера, Нева (IEC 61107) | Универсальный протокол для счетчиков Энергомера, Нева и многих других | Conf.xml |
| SNMP (клиент) | Возможность отправки данных по протоколу SNMP | lua, conf.xml |
Скрипты
Данная статья актуальна для версий АСУД.SCADA 1.5.6 (и выше).
ПО АСУД.SCADA позволяет расширить функционал путем написания специальных программный модулей (скриптов) на языке Lua. Скрипты выполняются на стороне рабочей программы SCADA.
Для написания простых скриптов (реализации несложной логики) вы можете воспользоваться приведенными примерами. Для реализации более сложного функционала потребуется знание основ программирования, в этом случае, для помощи в написании скриптов, вы можете обратиться к специалистам компании Текон-Автоматика.
В настоящее время отсутствует встроенная в программное обеспечение возможность отладки/компиляции скрипта.
Скрипты находятся в папке Tekon \ ASUD Scada \ Scada \ scripts \ lvm. Каталог имеет следующую структуру и содержание:
- lvm_entry.lua — общий загрузчик скриптов — изменять не следует.
- built-in \ — папка со скриптами и вспомогательными модулями, разработанными специалистами Текон-Автоматика. Изменять и/или редактировать файлы не следует.
- custom \ — папка для скриптов пользователя
- .. \ entry.lua — загрузчик скриптов пользователя
Скрипты в папке built-in \ могут изменяться при обновлении программного обеспечения АСУД.SCADA.
Папка custom \ — не обновляется при обновлении ПО.
Для создания / редактирования скриптов можно использовать:
- простой Блокнот,
- программу Notepad ++
- специальную среду разработки, например, wxLua.
Скрипты следует создавать только в папке \ scripts \ lvm \ custom \
Вы моежете создать скрипт в отдельном текстовом файле с раширением lua и подключить этот файл, добавив в \ scripts \ lvm \ custom \entry.lua запись
dofile2 ("имя_файла.lua")Или записать текст скрипта (если он небольшой) непосредственно в файле \ scripts\lvm\custom\entry.lua
Файл скрипта следует сохранять в кодировке ANSI (Windows charset).
Внимание! Любые изменения в скриптах вступают в силу после перезапуска АСУД.SCADA.
Во время отладки скриптов удобно запускать SCADA в специальном режиме (без отображения заставки). Для этого следует выполнить файл scada-no-splash.bat или, если данный файл отсутствует запустить scada.exe c ключом
scada.exe --no-splash
В противном случае, если скрипт содержит ошибку, вы не увидите ее, т.к. она будет скрыта за картинкой заставки.
В зависимости от логики скрипт может быть:
- связан с примитивом типа Текстовое поле, Изображение и т.п.
- или работать без связки с примитивами (в фоновом режиме).
Скрипты, связываемые с Текстовым полем условно делятся на две группы:
- скрипты функции — позволяют выполнить простое преобразование данных перед их визуализаций на ситуационном плане АСУД.SCADA (подобную логику вы можете реализовать и с помощью Text-функция)
- скрипты LVM-объекты — позволяют реализовать более сложную логику работы, создавать новые окна и т.п.
Внимание!
Скрипты могут быть использованы, например, для преобразования числового значения получаемого от OPC-сервера в строку. При этом следует обратить внимание на особенности представления дискретных сигналов Tekon OPC DA сервером.Для дискретного датчика, следует проверить настройку Уровень безопасности, в общем случае должно быть значение Обычный (если отображение сигнала происходит только в текстовом поле, без связки с примитивами типа дискретный датчик (дверь, лифт и т.п.), т.к. в противном случае не будет происходить снятия возникшей аварии).
Т.е. если тэг Item типа дискретный сигнал будет связан:
- только с Текстовым полем — уровень безопасности следует установить только в «Обычный»
- с Текстовым полем + Примитивом типа Дискретный датчик — уровень безопасности может быть любым: «Охрана» или «Обычный».
Рассмотрим несколько вариантов применения скриптов в АСУД.SCADA
Преобразовать число в строку
Необходимо задать соответствие числовому значению (Тэга1) OPC-сервера некоторое строковое значение (Str1), и отобразить его в АСУД.SCADA.
Например, соответствие следующего вида:
- 0 = насос выключен.
- 1 = насос включен.
(данная задача также может быть решена с применением Text-функции)
Сначала опишем скрипт выполняющий соответствующее отображение.
В Блокноте создаем файл pumppwr.lua следующего содержания:
function Pump (val,qual) local PumpToStr = < [0] = "Насос включен", [1] = "Насос выключен" >if qual ~= opc.da.tekon.ItemData.QUALITY_GOOD then return "---" end -- проверяем значение Тега только на 0 или 1 return PumpToStr [hasbit_ex(val.Integer,1)] end
Вначале описывается функция Pump с двумя входными параметрами
- val — значение переменной OPC-сервера (тип: Variant)
- qual — значение качества переменной OPC-сервера (тип: Integer)
Для val допустимы следующие преобразования
.Integer - в целое число .Number - в вещественное число .String - в строку .Date - в переменную типа DateTime .Guid - в guid
Переменная качества qual может принимать одно из следующих константных значений
opc.da.tekon.ItemData.OPC_QUALITY_BAD opc.da.tekon.ItemData.OPC_QUALITY_UNCERTAIN opc.da.tekon.ItemData.OPC_QUALITY_GOOD opc.da.tekon.ItemData.OPC_QUALITY_CONFIG_ERROR opc.da.tekon.ItemData.OPC_QUALITY_NOT_CONNECTED opc.da.tekon.ItemData.OPC_QUALITY_DEVICE_FAILURE opc.da.tekon.ItemData.OPC_QUALITY_SENSOR_FAILURE opc.da.tekon.ItemData.OPC_QUALITY_LAST_KNOWN opc.da.tekon.ItemData.OPC_QUALITY_COMM_FAILURE opc.da.tekon.ItemData.OPC_QUALITY_OUT_OF_SERVICE opc.da.tekon.ItemData.OPC_QUALITY_WAITING_FOR_INITIAL_DATA opc.da.tekon.ItemData.OPC_QUALITY_LAST_USABLE opc.da.tekon.ItemData.OPC_QUALITY_SENSOR_CAL opc.da.tekon.ItemData.OPC_QUALITY_EGU_EXCEEDED opc.da.tekon.ItemData.OPC_QUALITY_SUB_NORMAL opc.da.tekon.ItemData.OPC_QUALITY_LOCAL_OVERRIDE
Обычно достаточно просто проверить qual со значением opc.da.tekon.ItemData.QUALITY_GOOD.
Таблица PumpToStr определяет взаимное соответствие значения переменной строке.
Проверка значения только первого бита (биты байта 8. 2,1) переменной (val.Integer), а не значения val.Integer в целом, связана опять же с представлением дискретного сигнала в Tekon OPC DA сервере.
Далее, сохраняем файл в папке scripts \ lvm \ custom
Открываем в Блокноте файл scripts \ lvm \ custom \ entry.lua и добавляем в первой строке запись
- dofile2(«pumppwr.lua»)
dofile2("pumppwr.lua") function main_custom() endДалее запускаем программу АСУД.SCDA.
Размещаем примитив «Текстовое поле». Задаем его свойства:
- Тэг — Тэг1.
- Скрипт \ OnDataChanged — Pump
Сохраняем настройки АСУД.SCADA
После этого должны увидеть, что в Текстовом поле отображается строковое значение, в соответствии с логикой скрипта.
Если необходимо не только отобразить в текстовом поле соответствующее строковое значение, но и сохранить функционал оповещения диспетчера об аварийной ситуации, следует добавить на карту примитив типа дискретный датчик и привязать его также к Тэгу1.
Рассмотренный пример можно загрузить здесь
Преобразовать число
Необходимо преобразовать числовое значение (Тэга1) OPC-сервера в соответствии с некоторой формулой, и отобразить его в АСУД.SCADA.
Например, пусть в Тэге1 хранится значение теплосчетчика в кВт*ч, а необходимо отобразить его в АСУД.SCADA в ГКал
Известно, что 1 кВт*ч = 0.000860 ГКал
Сначала опишем скрипт выполняющий соответствующее преобразование:
function VT2GKAL (val,qual) if qual ~= opc.da.tekon.ItemData.QUALITY_GOOD then return "---" end local GKal = val.Number * 0.000860 return (math_round(GKal, 3)) .. " ГКал" end
Скрипт выводит значение в ГКал с точностью до 3-его знака после запятой.
Далее, сохраняем файл в папке scripts \ lvm \ custom как VT2GKAL.lua
Аналогично примеру 1 Открываем в Блокноте файл scripts \ lvm \ custom \ entry.lua и добавляем в первой строке запись
dofile2("VT2GKAL.lua")Далее запускаем программу АСУД.SCDA.
Размещаем примитив «Текстовое поле». Задаем его свойства:
- Тэг — Тэг1.
- Скрипт \ OnDataChanged — VT2GKAL
Сохраняем настройки АСУД.SCADA
После этого должны увидеть, что в Текстовом поле отображается строковое значение, в соответствии с логикой скрипта.
Запуск внешнего приложения из Scada
Для создания объектов данного типа вы также можете воспользоваться утилитой SCRIPT MAKER.EXE
Также вы моежете воспользоваться функционалом примитива Кнопка.
Дать возможность диспетчеру периодически запускать из SCADA программы Блокнот, Калькулятор, Интернет-Браузер
Для реализации заданного функционала необходимо подключить файл . Scada/scripts/lvm/build-in/open_link.lua
Открыть в блокноте файл . Scada/scripts/lvm/custom/entry.lua и отредактировать его
dofile2("..\\build-in\\open_link.lua") tlink = topc_link ("www.ya.ru") tlinkNotepad = topc_link ("notepad.exe") tlinkCalc = topc_link ("calc.exe") function main_custom() endБудут созданы три объекта:
- tlink — открывающий Интернет-браузер на странице www.ya.ru
- tlinkNotepad — открывающий приложение Блокнот
- tlinkCalc — открывающий приложение Калькулятор
Закрыть файл, подтвердив его сохранение.
Запускаем SCADA и отображаем, например, на главном виде три примитива Текстовое поле.
Запуск внешнего приложения
Далее последовательно в свойствах каждого примитива указываем соответствующий LVM-объект обработки двойного нажатия мыши.
Для текстового поля «Браузер» указываем tlink
Запуск внешнего приложения
Для текстового поля «Блокнот» — tlinkNotepad, для поля «Калькулятор» — tlinkCalc
Сохраняем изменения, переходим в рабочий режим.
Теперь при при двойном нажатии на примитив будет запускаться соответствующая внешняя программа.
Запись значения введенного пользователем на Сервер
Для создания объектов данного типа вы можете воспользоваться утилитой SCRIPT MAKER.EXE
Помимо задачи примера 1, следует иметь возможность записи в OPC-сервер значения указанного пользователем.
Данная задача может быть актуальна, например, при диспетчеризации и управлении сторонним оборудованием, подключаемым по протоколу Modbus.
При этом отображение текущего значения должно происходить в примитиве Текстовое поле, а при двойном нажатии на примитив открываться окно, в котором пользователю предлагается ввести новое значение, которое затем должно быть записано в ОРС-сервер.
Для решения подобных задач разработаны базовые «класса», реализующие следующие возможности:
- чтение числового значения из Сервера
- преобразование прочитанного значения перед отображением в SCADA
- запись числового значения введенного пользователем в Сервер
Пользователю доступно три варианта окна отображения и ввода новых данных:
- topc_string — окно с текстовым полем. Удобно при необходимости простого изменения числового значения
- topc_string_min_max — окно с текстовым полем, аналог topc_string с проверкой граничных значений
- topc_сombo — окно с выпадающим списком. Удобно при изменении значения перечисляемого типа (число = значение), например: 0 — Включить, 1 — Выключить. Перечисление должно идти непрерывно с 0 или 1.
- topc_сombo_ex (с версии 2.3.2) — окно с выпадающим списком. Удобно при изменении значения перечисляемого типа (число = значение), например: 1024 — Включить, 2983 — Выключить. Перечисление в отличие от topc_сombo может идти как угодно.

Окно с текстовым полем topc_string
Окно с текстовым полем и границами topc_string_min_max

Окно с выпадающим списком topc_сombo или topc_сombo_ex
Функционал базовых «классов» представлен в файлах:
- \build-in\gui_basic.lua — отрисовка окон
- \build-in\prim_basic.lua — поведение объектов
Данные файлы снабжены подробными комментариями.
Для создания объекта «класса» и использовании его в SCADA следует в Блокноте следует открыть (создать) файл scripts \ lvm \ custom \ gui_object.lua следующего содержания:
topc_object0 = topc_string(" [Комментарий]") topc_object2 = topc_string_min_max (" Комментарий",0,100) local combo1 = < [0] = "Выкл", [1] = "Вкл" >topc_object1 = topc_combo (" [Комментарий]", combo1) local combo_ex1 = < [10] = "Выкл", [20] = "Вкл" >topc_object_ex1 = topc_combo_ex (" [Комментарий]", combo_ex1)В данном случае создаются объекты:
- topc_object0 — окно с текстовым полем
- topc_object1 — окно с выпадающим меню (элементы меню перечислены в combo1)
- topc_object_ex1 — окно с выпадающим меню (элементы меню перечислены в combo_ex1)
- topc_object2 — окно с текстовым полем с проверкой нового значения, введенного пользователем, с граничными 0..100.
Пример поведения topc_object_ex1
- если с сервера придет значение 10, в текстовом поле отобразится Выкл
- если выбрать в текстовом поле Вкл, в сервер запишется число 20.
По необходимости создать собственные объекты по аналогии.
Далее открываем и редактируем в Блокноте файл scripts \ lvm \ custom \ entry.lua
dofile2 ("..\\built-in\\prim_basic.lua") dofile2("gui_object.lua") function main_custom() endДалее запускаем программу АСУД.SCADA.
Размещаем примитив «Текстовое поле 1». Задаем его свойства:
- Тэг — Тэг1.
- Скрипт \ LVM объект — topc_object0
Размещаем еще один примитив «Текстовое поле 2». Задаем его свойства:
- Тэг — Тэг2.
- Скрипт \ LVM объект — topc_object1
Аналогично добавляется topc_object2
Следует иметь ввиду, что созданные нами LVM-объекты topc_objectX могут быть использованы в настройках нескольких примитивов Текстовое поле (в том числе и с разными Тэгами).
Сохраняем настройки АСУД.SCADA
В случае необходимости создания собственно окна поведения объекта, вы можете воспользоваться для примера файлами, реализующие функционал работы с устройством ОВЕН ПЧВ:
- built-in \ qui_owen_pchv.lua
- built-in \ prim_owen_pchv.lua

Окно ОВЕН ПЧВ
Замечание:
Eсли скрипт связан с примитивом Текстовое поле, то в случае, если OPC-Item имеет плохой статус (нет связи с устройством) в текстовом поле вы увидите прочерки «—«, и созданное вами окно в рабочем режиме открываться не будет.Отображение Min, Max, Avg для цифрового параметра
Для создания объектов данного типа вы можете воспользоваться утилитой SCRIPT MAKER.EXE
Для цифрового значения, получаемого от OPC-сервера отобразить min, max, avg
Для решения задачи в файле \\built-in\\prim_basic.lua реализован «класс» topc_minmaxavg.
Объект класса не умеет записывать данные на сервер и выполняет только анализ и отображение данных в Текстовое поле.
Для создания объекта «класса» и использовании его в SCADA следует в Блокноте следует открыть файл scripts \ lvm \ custom \ entry.lua и указать в нем:
dofile2 ("..\\built-in\\prim_basic.lua") topc_minmax = topc_minmaxavg ("1",1,1,1) function main_custom() endПараметры конструктора topc_minmaxavg (primname,digit,navg,show_time) определяют вид отображения данных:
- primname — просто текстовое имя (резерв)
- digit — число знаков после запятой: 1, 2, .
- navg = 0 не отображать Avg, 1 — отображать
- show_time = 0 не отображать Время, 1 — отображать
Далее запускаем программу АСУД.SCADA.
Размещаем примитив «Текстовое поле 1». Задаем его свойства:
- Тэг — Тэг1.
- Скрипт \ LVM объект — topc_minmax
- Скрыть линию — Да
- Заливка — белая
Созданный нами LVM-объект topc_minmax может быть использован в настройках нескольких примитивов Текстовое поле. Однако следует иметь ввиду, что Среднее будет работать некорректно, если связать объект с двумя примитивами с одним и тем же тэгом.
Рассмотрим различные варианты отображения данных в зависимости от параметров конструктора объекта topc_minmaxavg
Пример отображения данных
- topc_minmax0 = topc_minmaxavg («1»,1,0,0)
- topc_minmax1 = topc_minmaxavg («1»,1,0,1)
- topc_minmax2 = topc_minmaxavg («1»,1,1,0)
- topc_minmax3 = topc_minmaxavg («1»,1,1,1)
Анализ изменений сигнала (автомат управления)
Реализовать выключение канала управления при срабатывании дискретного датчика.
Внимание! Начиная с версии АСУД.SCADA 1.5.8 данный функционал может быть настроен непосредственно в программе, подробнее смотри Автоматическое управление устройствами
Рассмотрим пример простого скрипта, реализующего выключение канала управления КУП-RS подключенного к концентратору Мини-КУН номер 210, при срабатывании дискретного входа номер 4 на концентраторе Мини-КУН номер 202.
Предполагаем, что уже существует настройка OPC-сервера, для концентраторов 210 и 202
Создадим текстовый файл с именем avtomat.lua в блокноте следующего содержания:
-- описываем карту связи Датчик - Канал управления -- тэги просто копируем из свойства Тэг примитива АСУД.SCADA descret_autocall_task_map = < ["DA.[localhost].USB Пульт.202 Мини-КУН.Авария 1"] = "DA.[localhost].USB Пульт.210 Мини-КУН.КУП Канал 1.Остановка" > -- в эту функцию будет приходить любые события связанные с изменением состояния датчиков function LocalAvto_OnDataChange(topc_item, topc_itemdata) -- проверка данных на валидность if topc_item~= nil and topc_itemdata~=nil then if topc_itemdata.Quality ~= opc.da.tekon.ItemData.QUALITY_GOOD or topc_itemdata.Data ==nil then return end -- запрос значения датчика local int = topc_itemdata.Data.Integer -- запрос типа датчика local prop = topc_item:GetProperty(opc.da.tekon.Item.ITEM_TYPE) -- проверка того, что датчик дискретный if prop ~= nil and prop.Data.Integer == opc.da.tekon.Item.SENSOR then if descret_autocall_task_map[topc_item.ItemID] ~= nil then -- запрос указателя на канал управления связанный с дискретным датчиком local itemCtrl, bRes = opc.da.tekon.GetItem(descret_autocall_task_map[topc_item.ItemID]) if (itemCtrl~= nil) and bRes then -- если дискретный датчик активен, выключить канал управления if hasbit_ex (int,1) == 1 then local newData = base.Variant(0); itemCtrl:AsyncWrite(newData) end end end end end end -- функция инициализации скрипта function InitAvtomat() -- подписаться на событие (изменение состояния любого датчика) opc.da.tekon.RegisterEventHandler( "OPC::DA::TEKON::OnDataChange", "LocalAvto_OnDataChange") -- подписаться на событие чтение состояния датчика opc.da.tekon.RegisterEventHandler( "OPC::DA::TEKON::OnReadComplete", "LocalAvto_OnDataChange") end
Функция LocalAvto_OnDataChange вызывается
- один раз при старте АСУД.SCADA при первоначальном получении значений тэгов (событие OPC::DA::TEKON::OnReadComplete)
- всякий раз при изменении значения любого тэга Tekon OPC DA сервера (событие OPC::DA::TEKON::OnDataChange).
Команды каналу управления могут быть следующие:
0 - выключить канал управления; 1 - включить канал управления.
Сохраните файл avtomat.lua
Откройте в блокноте файл ..scripts\lvm\custom\entry.lua и внесите следующие изменения:
dofile2("avtomat.lua") function main_custom() InitAvtomat() endСохраните файл, запустите АСУД.SCADA, логика созданного автомата управления должна работать.
Рассмотренный пример можно загрузить здесь
Анализ изменений сигнала (вариант 2)
Реализовать возможность записи числового значения в ведомый Item, в зависимости от числового значения Главного Item OPC-сервера. Оба Item имеют тип — Числовое значение.
Следует скопировать файл masterslaveitems.lua из папки \ script \ built-in \ в папку \ script \ custom \ и отредактировать его (если файл отсутствует вы можете загрузить его по ссылке)
-- СЕКЦИЯ НАСТРОЕК -- Следует указать Теги сопоставление Главный сигнал и Ведомый сигнал в exclib__mapDependency -- Например: Temperature01 - главный сигнал, OutSignal1 - ведомый local exclib__mapDependency = < ["DA.[localhost].КУН-IP8 - 0.Temperature01"] = "DA.[localhost].DAServerInfo.OutSignal1" > -- Следует указать сопоставление значений Главного сигнала и Ведомого local value_map = < [0] = 0, [1] = 1 >--[[ [0] = 0, - при 0 записать 0 [1] = 1 - при 1 записать 1 Дополнительные примеры [0] = 0, - при 0 записать 0 [1] = 2 - при 1 записать 2 [0] = nil - при 0 ничего не делать [1] = 1 - при 1 записать 1 ]] -- Следует указать, что записать в Ведомый, если пропала связь с Главным (плохой ОРС-статус) local NC_WriteToSlave = 0; -- или nil если ничего не надо записывать -- КОНЕЦ СЕКЦИИ НАСТРОЕК
Следует внести изменения в секцию Настроек:
- в таблице exclib__mapDependency указать соответствие Ведущий — Ведомый
- в таблице value_map указать, что записать в Ведомый при достижении значения Ведущим
- в NC_WriteToSlave указать, что записать в Ведомый при потере связи с Ведущим
Откройте в блокноте файл ..scripts\lvm\custom\entry.lua и внесите следующие изменения:
dofile2("masterslaveitems.lua") function main_custom() Library_Init () endСохраните файл, запустите АСУД.SCADA, логика созданного автомата должна работать.
Канал управления без подключения обратной связи
Реализовать следующую логику работы примитива канал управления:
- включение
- отображение состояния «включаюсь»
- перевод примитива в исходное состояние (выключен).
Внимание! Начиная с версии АСУД.SCADA 1.5.8 данный функционал может быть настроен непосредственно в программе, подробнее смотри Автоматическое управление устройствами
Для решения задачи воспользуемся модифицированным скриптом из примера 3.
Создадим текстовый файл с именем ..scripts\lvm\custom\domofone.lua в блокноте следующего содержания:
-- Ниже необходимо указать тэги всех каналов управления, подключенных -- без обратной связи (например, к блоку сопряжения с Домофоном) -- нумерация 1,2,3 просто сквозная и не имеет никакого значения. task_map = < ["DA.[localhost].КУН - 102.Канал управления 1"] = 1, ["DA.[localhost].КУН - 102.Канал управления 2"] = 2, ["DA.[localhost].КУН - 212.Канал управления 1"] = 3 > -- Функция вызывается при изменения состояния любого датчика function Local_OnDataChange(topc_item, topc_itemdata) -- проверка данных на валидность if topc_item~= nil and topc_itemdata~=nil then if topc_itemdata.Quality ~= opc.da.tekon.ItemData.QUALITY_GOOD or topc_itemdata.Data ==nil then return end end -- запрос типа датчика local prop = topc_item:GetProperty(opc.da.tekon.Item.ITEM_TYPE) -- проверка того, что это канал управления if prop ~= nil and prop.Data.Integer == opc.da.tekon.Item.CONTROL_CHANNEL then -- проверка что канал управления описан task_map if task_map[topc_item.ItemID] ~= nil then -- Значение = 1 ? Канал, находится в состоянии включаюсь ? if topc_itemdata.Data.Integer == 1 then -- подождать 1 секунду и сбросить значение в 0 wx.wxSleep(1) local newData = base.Variant(0) topc_item:AsyncWrite(newData) end end end end -- функция инициализации скрипта function InitDomofone() -- подписаться на событие изменение состояния датчика opc.da.tekon.RegisterEventHandler( "OPC::DA::TEKON::OnDataChange", "Local_OnDataChange") -- подписаться на событие чтение состояния датчика opc.da.tekon.RegisterEventHandler( "OPC::DA::TEKON::OnReadComplete", "Local_OnDataChange") end
Основные изменения, которые необходимо произвести — лишь прописать тэги каналов управления, подключенные к блоку домофона в task_map
task_map = < ["DA.[localhost].КУН - 102.Канал управления 1"] = 1, ["DA.[localhost].КУН - 102.Канал управления 2"] = 2, ["DA.[localhost].КУН - 212.Канал управления 1"] = 3 >
Откройте в блокноте файл ..scripts\lvm\custom\entry.lua и внесите следующие изменения:
dofile2("domofone.lua") function main_custom() InitDomofone() endСохраните файл, запустите АСУД.SCADA, логика созданного автомата управления должна работать.
Рассмотренный пример можно загрузить здесь
Вспомогательные файлы *.cpp (пространство opc.da.tekon, базовые типы) можно загрузить здесь
—Alex 12:21, 5 июля 2013 (UTC)
- Pages with syntax highlighting errors
- SCADA