Как редактировать luac скрипт

Информация Гайд Всё о Lua скриптинге для MoonLoader

Для лёгкой и удобной работы с кодом Lua скриптов вам понадобится настроить для себя среду разработки. Для работы с Lua достаточно любого текстового редактора, но какой-нибудь блокнот Windows для этого подходит совсем плохо, поэтому лучше использовать специализированные программы. На текущий момент полная поддержка MoonLoader есть в Atom и Notepad++, помимо этого есть пользовательские дополнения для Visual Studio Code и Sublime Text.

Проект по-умолчанию.
В меню File выбираем пункт Open Folder. и указываем путь до папки moonloader, после этого она откроется как проект.

Проект по-умолчанию.
Как и в Atom, здесь есть возможность показа меню проекта, а точнее «Папка как Проект». В меню «Файл» выбираем пункт «Открыть Папку как Проект» и указываем путь к папке «moonloader».

Кодировка по-умолчанию.
Над лентой выбираем пункт Опции и переходим в Настройки. В меню слева выбираем пункт Новый документ и в разделе кодировки ставим флажок на список, в котором выбираем кодировку Windows-1251

После установки среды разработки, изучения основ Lua и ознакомления с документацией MoonLoader, можно приступать от теории к практике. Давайте сначала рассмотрим самое основное, на всякий случай.

В этом примере показаны не все директивы, за полным списком обращайтесь к соответствующей странице на вики.

События и колбэки
Событиями, а точнее их обработчиками, в MoonLoader называются функции, вызывающиеся в скриптах автоматически при каком-либо действии в игре, требующим обработки. Обработчики событий могут иметь входящие и возвращаемые параметры: входящие передают какую-то информацию скрипту, а возвращаемые позволяют повлиять на дальнейшую обработку после совершения события.
Зарегистрировать обработчик события можно двумя способами: просто добавить в скрипт функцию с соответствующим именем, либо воспользоваться функцией addEventHandler. Учтите, что первым способом обработчик может быть зарегистрирован только один раз.
Скрипты с зарегистрированными событиями не завершаются самостоятельно.
Пример: onScriptTerminate вызывается при завершении какого-либо скрипта

С основными принципами разработки вы теперь знакомы и при этих знаниях сможете выполнить большинство задач, однако некоторые задачи требуют применения специальных техник. Давайте рассмотрим некоторые из них.

Создание модулей
Модули делятся на два типа: Lua и DLL. Lua-модули пишутся, как вы уже могли догадаться, на языке Lua и в результате представляют из себя привычные Lua-скрипты, только с некоторыми особенностями.
Давайте рассмотрим пример простого модуля, назовём его example:

Источник

Очень подробно разжёвано для чайников по LUA часть1!

Как редактировать luac скрипт. Смотреть фото Как редактировать luac скрипт. Смотреть картинку Как редактировать luac скрипт. Картинка про Как редактировать luac скрипт. Фото Как редактировать luac скрипт

Скрипты на языке Lua

Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.

Скрипт может быть как очень простым, состоящим всего из одной команды, так и весьма сложным, содержащим десятки, сотни и даже тысячи инструкций. Следующие друг за другом инструкции могут разделяться точкой с запятой (;). Однако это требование не является обязательным, поэтому весь приведённый ниже код является корректным с точки зрения синтаксиса:

Работа с переменными в Lua

Переменные используются для хранения значений в процессе выполнения скрипта.

Имена переменных в Lua

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

Язык Lua различает регистр символов, поэтому abc, Abc, ABC являются различными именами.

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

and break do else elseif

end false for function if

in local nil not or

repeat return then true until

Кроме того, все имена, начинающиеся с символа подчеркивания, за которым идут заглавные буквы (например, _VERSION) также являются зарезервированными.

Какие переменные бывают в Lua?

Переменные в Lua могут быть глобальными и локальными. Если переменная не объявлена явно как локальная, она считается глобальной.

Глобальные переменные Lua

Глобальная переменная появляется в момент присваивания ей первого значения. До присваивания первого значения обращение к глобальной переменной даёт nil.

Глобальная переменная существует до тех пор, пока существует среда исполнения скрипта и доступна любому Lua-коду, выполняемому в этой среде.

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

g = 1 — создаем глобальную переменную g со значением 1

g = nil — удаляем глобальную переменную g

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

Локальные переменные Lua

Любые локальные переменные должны быть объявлены явно с использованием ключевого слова local. Объявить локальную переменную можно в любом месте скрипта. Объявление может включать в себя присваивание переменной начального значения. Если значение не присвоено, переменная содержит nil.

local a — объявляем локальную переменную a

local b = 1 — объявляем локальную переменную b, присваиваем ей значение 1

local c, d = 2, 3 — объявляем локальные переменные c и d, присваиваем им значения 2 и 3

Область видимости локальной переменной начинается после объявления и продолжается до конца блока.

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

Под блоком понимается:

тело управляющей конструкции (if-then, else, for, while, repeat);

фрагмент кода, заключённый в ключевые слова do. end.

Если локальная переменная определена вне какого-либо блока, её область видимости распространяется до конца скрипта.

a = 5 — глобальная переменная a

local i = 1 — переменная i локальна в пределах скрипта

while i 1, 4, 9, 16, 25

local a — переменная а локальна внутри then

local a = 20 — переменная а локальна внутри do-end

Когда возможно, рекомендуется использовать локальные переменные вместо глобальных. Это позволит избежать «засорения» глобального пространства имён и обеспечит лучшую производительность (поскольку доступ к локальным переменным в Lua выполняется несколько быстрее, чем к глобальным).

Типы данных Lua

Какие типы данных поддерживает язык Lua?

Lua поддерживает следующие типы данных:

1. Nil (ничего). Соответствует отсутствию у переменной значения. Этот тип представлен единственным значением — nil.

2. Boolean (логический). К данному типу относятся значения false (ложь) и true (истина).

При выполнении логических операций значение nil рассматривается как false. Все остальные значения, включая число 0 и пустую строку, рассматриваются как true.

3. Number (числовой). Служит для представления числовых значений.

В числовых константах можно указывать необязательную дробную часть и необязательный десятичный порядок, задаваемый символами «e» или «E». Целочисленные числовые константы можно задавать в шестнадцатеричной системе, используя префикс 0x.

Примеры допустимых числовых констант: 3, 3.0, 3.1415926, 314.16e-2, 0xff.

4. String (строковый). Служит для представления строк.

Строковые значения задаются в виде последовательности символов, заключённой в одинарные или двойные кавычки:

b = ‘это вторая строка’

Строки, заключённые в двойные кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа «\» (обратный слэш):

\t (горизонтальная табуляция),

Символ в строке также может быть представлен своим кодом с помощью escape-последовательности:

где ddd — последовательность из не более чем трёх цифр.

Кроме кавычек для определения строки могут также использоваться двойные квадратные скобки:

local a = [[Компания «Кронос»]]

Определение строки с помощью двойных квадратных скобок позволяет игнорировать все escape-последовательности, т. е. строка создаётся полностью так, как описана:

При определении строки с помощью двойных квадратных скобок учитываются символы табуляции и переноса.

Двойные скобки могут быть вложенными. Для того чтобы их не перепутать, между скобками вставляется символ«равно» (=):

local a = [=[определение строки [[string]] в Lua]=]

— будет срока: «определение строки [[string]] в Lua»

5. Function (функция). Функции в Lua могут быть записаны в переменные, переданы как параметры в другие функции ивозвращены как результат выполнения функций.

6. Table (таблица). Таблица представляет собой набор пар «ключ» — «значение», которые называют полями илиэлементами таблицы. Как ключи, так и значения полей таблицы могут иметь любой тип, за исключением nil. Таблицы не имеют фиксированного размера: в любой момент времени в них можно добавить произвольное число элементов.

Подробнее — в статье «Создание таблиц в Lua»

7. Userdata (пользовательские данные). Является особым типом данных. Значения этого типа не могут быть созданы или изменены непосредственно в Lua-скрипте.

Userdata используется для представления новых типов, созданных в вызывающей скрипт программе или в библиотеках, написанных на языке С. Например, библиотеки расширений Lua для «CronosPRO» используют этот тип для представления таких объектов, как:

банки данных (класс Bank);

базы данных (класс Base);

записи (класс Record) и т. п.

8. Thread (поток). Соответствует потоку выполнения. Эти потоки никаким образом не связаны с операционной системой и поддерживаются исключительно средствами самого Lua.

Как в Lua задать тип переменной?

Lua не предусматривает явного задания типа переменной. Тип переменной устанавливается в момент присвоения переменной значения. Любой переменной может быть присвоено значение любого типа (вне зависимости от того, значение какого типа она содержала ранее).

a = 123 — переменная a имеет тип number

a = «123» — теперь переменная a имеет тип string

a = true — теперь переменная a имеет тип boolean

a = <> — теперь переменная a имеет тип table

Переменные типа table, function, thread и userdata не содержат самих данных, а хранят ссылки на соответствующие объекты. При присваивании, передачи в функцию в качестве аргумента и возвращении из функции в качестве результата копирования объектов не происходит, копируются только ссылки на них.

a = <> — создаем таблицу. В переменную a помещается ссылка на таблицу

b = a — переменная b ссылается на ту же таблицу, что и a

a[1] = 10 — элементу таблицы с индексом 1 присвоено значение 10

Остальные данные являются непосредственными значениями.

Как в Lua получить тип переменной?

Тип значения, сохранённого в переменной, можно выяснить при помощи стандартной функции type. Эта функция возвращает строку, содержащую название типа («nil», «number», «string», «boolean», «table», «function», «thread», «userdata»).

t = type («это строка») — t равно «string»

t = type (123) — t равно «number»

t = type (type) — t равно «function»

t = type (true) — t равно «boolean»

t = type (nil) — t равно «nil»

t = type (CroApp.GetBank()) — t равно «userdata»

Как в Lua преобразовать тип переменной?

Lua при необходимости автоматически преобразует числа в строки и наоборот. Например, если строковое значение является операндом в арифметической операции, оно преобразуется в число. Аналогично числовое значение, встретившееся в том месте, где ожидается строковое, будет преобразовано в строку.

a = «10» + 2 — a равно 12

a = «10» + 2 — a равно «10 + 2»

a = «строка» + 2 — Ошибка! Невозможно преобразовать «строка» в число

Значение любого типа можно явным образом преобразовать в строку с помощью стандартной функции tostring.

a = tostring (10) — a равно «10»

a = tostring (true) — a равно «true»

a = tostring (nil) — a равно «nil»

a = tostring (<[1] = «это поле 1»>) — a равно «table: 06DB1058»

Из предыдущего примера видно, что содержимое таблиц функцией tostring не преобразуется. Выполнить такое преобразование можно с помощью функции render.

a = render (10) — a равно «10»

a = render (true) — a равно «true»

a = render (nil) — a равно «nil»

Для явного преобразования значения в число можно использовать стандартную функцию tonumber. Если значение является строкой, которую можно преобразовать в число (или уже является числом), функция возвращает результат преобразования, в противном случае возвращает nil.

a = tonumber («10») — a равно «10»

a = tonumber («10»..».5″) — a равно 10.5

a = tonumber (true) — a равно «nil»

a = tonumber (nil) — a равно «nil»

Расстановка комментариев в Lua

Комментарий в Lua начинается двумя знаками «минус» (—) и продолжается до конца строки.

local a = 1 — однострочный комментарий

Если непосредственно после символов «—» идут две открывающие квадратные скобки ([[), комментарий являетсямногострочным и продолжается до двух закрывающих квадратных скобок (]]).

local a = 1 — [[ многострочный

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

local a = [[Компания «Кронос»]] — [=[

local a = [[Компания «Кронос»]]

Количество символов «=» определяет вложенность:

local a = [=[определение некоторой строки [[string]] в языке Lua]=]

Операции, применяемые в Lua

В выражениях, написанных на Lua, могут применяться следующие виды операций:

1. Арифметические операции.

Lua поддерживает следующие арифметические операции:

^ (возведение в степень);

% (остаток от деления).

Арифметические операции применимы как к числам, так и к строкам, которые в этом случае преобразуются в числа.

2. Операции сравнения.

В Lua допустимы следующие операции сравнения величин:

Операции сравнения всегда возвращают логическое значение true или false.

Правила преобразования чисел в строки (и наоборот) при сравнениях не работают, т. е. выражение «0» == 0 даёт в результате false.

3. Логические операции.

К логическим операциям относятся:

Операция and возвращает свой первый операнд, если он имеет значение false или nil. В противном случае, операция возвращает второй операнд (причём этот операнд может быть произвольного типа).

a = (nil and 5) — a равно nil

a == (false and 5) — a равно false

a == (4 and 5) — a равно 5

Операция or возвращает первый операнд, если он не false и не nil, иначе он возвращает второй операнд.

a == (4 or 5) — a равно 4

a == (false or 5) — a равно 5

Логические операции and и or могут возвращать значения любых типов.

Логические операции and и or вычисляют значение второго операнда только в том случае, если его нужно вернуть. Если этого не требуется, второй операнд не вычисляется. Например:

a == (4 or f()) — вызова функции f() не произойдет

Операция not всегда возвращает true или false.

4. Операция конкатенации.

Для конкатенации (объединения) строк служит операция… (две точки).

a = «Кронос»..»-«..«Информ» — переменная a получит значение «Кронос-Информ»

Если один или оба операнда являются числами, выполняется их преобразование в строки.

a = 0..1 — переменная a получит значение «01»

5. Операция получения длины.

В Lua определена операция длины #, которую можно использовать для получения длины строки.

len = #a — len равно 6

len = #«ещё строка» — len равно 10

Приоритет операций в Lua

В языке Lua выполнение операций осуществляется в соответствии со следующим приоритетом (в порядке убывания):

Вызов скриптов из форм

С каждой формой (включая вложенные формы) связан отдельный скрипт, который обычно содержит функции, выполняющие обработку событий формы и её элементов.

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

Необходимо отметить, что скрипт формы, хотя и не содержит вызова функции module, фактически является модулем. Это означает, что переменные, объявленные в скрипте формы без ключевого слова local, не выносятся в глобальное окружение и доступны только внутри этого скрипта. Если необходимо сделать какое-либо значение доступным для скриптов других форм, его следует явным образом определить в глобальной таблице _G:

Другой скрипт форм сможет прочитать это значение следующим образом:

Блоки операторов (инструкций)

К основным операторам Lua относятся:

операторы для организации циклов.

Группа операторов может быть объединена в блок (составной оператор) при помощи конструкции do… end.

Блок открывает новую область видимости, в которой можно определять локальные переменные.

a = 5 — глобальная переменная a

local a = 20 — внутри do-end определяется локальная переменная а

Оператор присваивания в Lua

Присваивание изменяет значение переменной или поля таблицы. В простейшем виде присваивание может выглядеть так:

a = 1 — переменной a присвоено значение 1

a = b + c — переменной a присвоена сумма значений переменных b и с

a = f(x) — переменной a присвоено значение, возвращённое функцией f(x)

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

a, b = 1, 5*c — a равно 1; b равно 5*c

Если переменных больше чем значений, «лишним» переменным присваивается nil.

a, b, c = 1, 2 — a равно 1; b равно 2; c равно nil

Если значений больше чем переменных, «лишние» значения игнорируются.

a, b = 1, 2, 3 — a равно 1; b равно 2; значение 3 не использовано

Множественное присваивание можно использовать для обмена значениями между переменными:

a = 10; b = 20 — a равно 10, b равно 20

a, b = b, a — теперь a равно 20, b равно 10

Условный оператор (if) в Lua

Оператор if проверяет истинность заданного условия. Если условие является истинным, выполняется часть кода, следующая за ключевым словом then (секция then). В противном случае, выполняется код, следующий за ключевым словом else (секция else).

return a — если a больше b, вернуть a

return b — в противном случае — вернуть b

Секция else является необязательной.

Перед каждой итерацией цикла проверяется условие :

если условие ложно, цикл завершается и управление передаётся первому оператору, следующему за оператором while;

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

while i > 0 do — цикл от 10 до 1

Для выхода из цикла до его завершения можно использовать оператор break.

while i > 0 do — ищем в массиве отрицательное значение

MsgBox («Индекс отрицательного значения: »..i)

MsgBox («Массив не содержит отрицательных значений»)

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»

Цикл с постусловием (repeat) в Lua

Оператор repeat предназначен для организации циклов с постусловием и имеет следующий вид:

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

— суммируем значения массива a, пока сумма не превысит 10

MsgBox («Сложено »..i..» элементов. Сумма равна «..sum)

Для выхода из цикла до его завершения можно использовать оператор break.

Подробнее об особенностях использования оператора break — в статье «Операторы break и return»

Циклы с оператором for в Lua

Оператор for предназначен для организации циклов и допускает две формы записи:

простую (числовой for);

расширенную (универсальный for).

Простая форма оператора for

Простая форма оператора for имеет следующий вид:

for var = exp1, exp2, exp3 do

Тело цикла выполняется для каждого значения переменной цикла (счётчика) var в интервале от exp1 до exp2, с шагом exp3.

Шаг может не задаваться. В этом случае он принимается равным 1.

for i = 1, 10 do — цикл от 1 до 10 с шагом 1

Выражения exp1, exp2 и exp3 вычисляются всего один раз, перед началом цикла. Так, в примере ниже, функция f(x) будет вызвана для вычисления верхнего предела цикла только один раз:

for i = 1, f(x) do — цикл от 1 до значения, возвращенного функцией f()

Переменная цикла является локальной для оператора цикла и по его окончании не определена.

for i = 1, 10 do — цикл от 1 до значения, возвращенного функцией f()

MsgBox («После выхода из цикла i равно »..i) — Неверно! i равно nil

Значение переменной цикла нельзя изменять внутри цикла: последствия такого изменения непредсказуемы.

Для выхода из цикла до его завершения используется оператор break.

for i = 1,#a do — ищем в массиве отрицательное значение

Источник

Информация Гайд Всё о Lua скриптинге для MoonLoader

Для лёгкой и удобной работы с кодом Lua скриптов вам понадобится настроить для себя среду разработки. Для работы с Lua достаточно любого текстового редактора, но какой-нибудь блокнот Windows для этого подходит совсем плохо, поэтому лучше использовать специализированные программы. На текущий момент полная поддержка MoonLoader есть в Atom и Notepad++, помимо этого есть пользовательские дополнения для Visual Studio Code и Sublime Text.

Проект по-умолчанию.
В меню File выбираем пункт Open Folder. и указываем путь до папки moonloader, после этого она откроется как проект.

Проект по-умолчанию.
Как и в Atom, здесь есть возможность показа меню проекта, а точнее «Папка как Проект». В меню «Файл» выбираем пункт «Открыть Папку как Проект» и указываем путь к папке «moonloader».

Кодировка по-умолчанию.
Над лентой выбираем пункт Опции и переходим в Настройки. В меню слева выбираем пункт Новый документ и в разделе кодировки ставим флажок на список, в котором выбираем кодировку Windows-1251

После установки среды разработки, изучения основ Lua и ознакомления с документацией MoonLoader, можно приступать от теории к практике. Давайте сначала рассмотрим самое основное, на всякий случай.

В этом примере показаны не все директивы, за полным списком обращайтесь к соответствующей странице на вики.

События и колбэки
Событиями, а точнее их обработчиками, в MoonLoader называются функции, вызывающиеся в скриптах автоматически при каком-либо действии в игре, требующим обработки. Обработчики событий могут иметь входящие и возвращаемые параметры: входящие передают какую-то информацию скрипту, а возвращаемые позволяют повлиять на дальнейшую обработку после совершения события.
Зарегистрировать обработчик события можно двумя способами: просто добавить в скрипт функцию с соответствующим именем, либо воспользоваться функцией addEventHandler. Учтите, что первым способом обработчик может быть зарегистрирован только один раз.
Скрипты с зарегистрированными событиями не завершаются самостоятельно.
Пример: onScriptTerminate вызывается при завершении какого-либо скрипта

С основными принципами разработки вы теперь знакомы и при этих знаниях сможете выполнить большинство задач, однако некоторые задачи требуют применения специальных техник. Давайте рассмотрим некоторые из них.

Создание модулей
Модули делятся на два типа: Lua и DLL. Lua-модули пишутся, как вы уже могли догадаться, на языке Lua и в результате представляют из себя привычные Lua-скрипты, только с некоторыми особенностями.
Давайте рассмотрим пример простого модуля, назовём его example:

Источник

Руководство по скриптам Lua

Одной из отличительных особенностей всех продуктов комплекса НЕЙРОСС и, в частности, IP-контроллеров БОРЕЙ, ЯРС и других является возможность модификации и расширения алгоритмов работы продукта посредством скриптов автоматизации. С помощью скрипта возможно, например, изменить или полностью заменить алгоритм доступа в контроллере БОРЕЙ. Или реализовать логику сопряжения со внешней информационной системой по протоколу HTTP. Или управлять исполнительными устройствами по заданному алгоритму.

В данном документе приведены общие сведения о скриптах автоматизации, их возможностях и руководство программиста по написанию таких скриптов.

Скрипт автоматизации может существенно изменить «заводскую» логику работы продукта. Потому разработку скрипта рекомендуется проводить только опытному пользователю. Производитель продукта не несёт ответственности за несоответствие реальных и заявленных свойств продукта в случае, если такое расхождение возникло вследствие внесения изменений в скрипт автоматизации.

Оглавление

Общие сведения

Скрипт автоматизации — текстовый сценарий, выполнение которого осуществляется программными средствами продукта.

Данный сценарий всегда один. Он может быть пустым — в таком случае скрипт не делает ничего. В скрипте могут быть команды управления — они выполняются по мере выполнения скрипта.

Скрипт автоматизации должен быть написан на языке Lua (версия 5.1). Разработчику доступны стандартные средства языка (операторы, структуры данных и др.), часть функций стандартной библиотеки (см. далее), а также наборы констант и функций, определённых в прикладных Lua-модулях продукта. Прикладные Lua-модули специально разработаны для упрощения написания скриптов и двустороннего взаимодействия с программными средствами продукта — чтобы можно было из скрипта вызывать какие-либо функции продукта или, наоборот, передавать управление в скрипт в процессе функционирования продукта.

В разных продуктах могут быть доступны разные прикладные модули. Так, модуль управления доступом pacs.lua недоступен (не работает) в ИГНИС и, наоборот, функции ИГНИС в модуле ignis.lua не работают в контроллере БОРЕЙ.

Скрипт автоматизации выполняется в «песочнице» — защищённом окружении. Если в ходе работы скрипта возникает ошибка, то выполнение скрипта просто прерывается — нарушается работа функций, так или иначе связанных со скриптами (например, алгоритмов доступа), НО общая работоспособность продукта сохраняется, на стабильность работы программных средств поведение скрипта не влияет.

В случае IP-контроллеров (БОРЕЙ, ИГНИС и пр.) скрипт автоматизации является изменяемыми данными также, как любые другие конфигурационные данные продукта (как, например, настройки сетевых интерфейсов или параметры доступа). Потому после внесения изменений в скрипт, успешной отладки и апробации сценария ОБЯЗАТЕЛЬНО создавайте резервную копию. Резервная копия будет содержать скрипт автоматизации, и в случае, если файловая система на SD-карте вдруг будет повреждена, скрипт будет восстановлен вместе с остальными конфигурационными данными из резервной копии.

Как редактировать скрипт

При сохранении скрипта автоматизации полностью перезапускается вся виртуальная Lua-машина, в следствие чего перезапускаются и системные Lua-скрипты — такие, например, как алгоритмы управления доступом и другие.

Скриншот редактора скриптов приведён на изображении ниже.

Как редактировать luac скрипт. Смотреть фото Как редактировать luac скрипт. Смотреть картинку Как редактировать luac скрипт. Картинка про Как редактировать luac скрипт. Фото Как редактировать luac скрипт

Как отлаживать скрипт

Сообщения об ошибках в Lua-скрипте, а также отладочные сообщения, выводимые из скрипта с помощью модуля log.lua, записываются в журнал аудита. Просмотр этих сообщений в реальном времени возможен при помощи веб-приложения «Журнал аудита», доступного с веб-страницы Рабочий стол.

Руководство разработчика

Общие сведения о Lua

Скрипт автоматизации должен быть написан на языке Lua версии 5.1.

Официальный сайт языка Lua (на английском языке) — http://www.lua.org/

Официальная документация по языку Lua версии 5.1 — http://www.lua.org/manual/5.1/ (английский язык)

Перевод документации по языку Lua версии 5.1 на русский язык: http://www.lua.ru/doc/

Ограничения стандартной библиотеки

В скриптах автоматизации доступны следующие разделы стандартной библиотеки:

Следующие разделы недоступны (не могут быть использованы) в скрипте автоматизации:

Прикладные Lua-модули

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

БОРЕЙ
ЯРСМодуль интеграции с подсистемой охранно-тревожной сигнализации контроллера.Все продуктыМодуль общесистемных функций. Получение системных даты / времени, генерация UUID-ов и так далее.

Модуль взаимодействия с периферией на контроллерах БОРЕЙ и ЯРС.

Модуль поддержки HTTP-протокола; модуль позволяет:

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

Модуль интеграции с подсистемой доступа в контроллерах БОРЕЙ, ЯРС.

Модуль позволяет реализовать свой алгоритм доступа вместо предустановленного или внести изменения в стандартные алгоритмы, переопределив отдельные части алгоритма.

Все продуктыМодуль для долговременного сохранения настроек / параметров скрипта автоматизации в форме ключ=значение

Асинхронное выполнение отложенных по времени или периодических действий.

Для данного модуля отсутствует lua-файл, соответствующий код недоступен для просмотра в веб-редакторе скрипта автоматизации.

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

Подключение прикладного Lua-модуля осуществляется функцией require. Рекомендуемая форма использования:

Вызвать функцию Lua-модуля в таком случае можно следующим образом, например:

alarm.lua

Описание временно недоступно.

common.lua

Данный модуль предоставляет общесистемные функции. Перечень функций приведён в таблице ниже.

Возвращает число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)

Генерирует уникальный идентификатор по стандарту ISO. Возвращает строковое представление идентификатора, например:

Для переданного числа возвращает структуру данных с полями для года, месяца, дня и так далее.

В аргументе передать число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд).

Для переданного числа (формат см. common.now()) возвращает строку представления даты и времени в формате ISO8601.

В аргументе передать число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд).

ФункцияАргументыРезультатОписание
now()нетчисло с плавающей точкой
mktime(tm)таблица LuaчислоПринимает на вход структуру tm (POSIX; см. https://linux.die.net/man/3/localtime_r ) в форме Lua-таблицы и возвращает число с плавающей точкой, равное количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)
iso8601_print(t)числострока
iso8601_parse(s)строкачислоПринимает на вход строку в формате ISO8601 и возвращает соответствующее данной строке число с плавающей точкой, равное количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)

deviceio.lua

Описание временно недоступно.

fec.lua

Данный модуль позволяет управлять выходами (на плате контроллера БОРЕЙ, ЯРС, а также на модулях расширения АМ-06) и световой / звуковой индикацией подключенных к контроллеру считывателей.

В этом примере выполняется включение первого реле на плате контроллера.

Нумерация выходов начинается с 1. Адрес выхода на модуле расширения определяется его адресом на шине.

http.lua

Модуль позволяет отправлять HTTP-запросы прямо из Lua-скрипта, а также асинхронно обрабатывать ответы на отправленные ранее запросы.

Для отправки запроса и обработки ответа необходимо:

Ниже приведён пример использования модуля HTTP для отправки GET-запроса на IP-адрес веб-сайта http://example.com.

В параметрах запроса можно указать следующие данные:

Заголовки HTTP-запроса

Можно указать произвольные заголовки HTTP-запроса в форме Lua-таблицы со строковыми парами типа «ключ = значение». При этом «ключ» будет выступать в роли имени HTTP-заголовка, а «значение» — в роли значения HTTP-заголовка.

Тело HTTP-запроса

Модуль позволяет отправлять в HTTP-запросах (PUT или POST) данные в форме текста или JSON.

Для передачи запроса с телом в форме текста достаточно присвоить параметру запроса body соответствующее строковое значение. Например:

Модуль также позволяет передавать запрос с телом в форме JSON-документа, который автоматически формируется из Lua-таблицы. Например:

При отправке запроса с такими параметрами HTTP-заголовок Content-Type будет автоматически установлен в application/json, а тело запроса будет содержать следующий JSON-документ:

При преобразовании Lua-таблицы в JSON поддерживаются все типы данных КРОМЕ массивов (таблиц с числовыми ключами).

Обработка ответа

При поступлении ответа или сбое при отправке запроса асинхронно вызывается метод on_http_response(response_data) на объекте-обработчике. Параметр метода — это Lua-таблица, содержащая следующие данные:

Тело ответа в зависимости от Content-Type может быть либо Lua-таблицей (если Content-Type ответа равен application/json — тело автоматически преобразуется в Lua-таблицу), либо текстом / строкой (в остальных случаях).

ignis.lua

Описание временно недоступно.

log.lua

Модуль позволяет выводить текстовые сообщения в журнал аудита.

Для вывода сообщений разработчику необходимо:

Пример приведён ниже:

longate.lua

Описание временно недоступно.

loninput.lua

Модуль предоставляет API для мониторинга состояния входов (зон) на модулях расширения ЯРС.

loninput.lua позволяет «подписаться» на изменения состояния входов. Для управления «подписчиками» в модуле доступны следующие функции:

Функция принимает следующие параметры:

Данная функция будет вызвана:

В функцию on_loninput_input_state_changed передаются следующие параметры:

ПараметрТип данныхОписание
device_addressЧислоАдрес устройства, к которому относится вход (зона)
input_indexЧислоИндекс входа (зоны), которому соответствует состояние
raw_stateЧислоТехнический код состояния входа (зоны), полученный от модуля; возможные коды перечислены в таблице RAW_INPUT_STATE
logical_stateЧислоЛогическое состояние входа значения из перечисления LOGICAL_INPUT_STATE

Логическое состояние входа может быть следующим:

lonpacs.lua

Модуль предоставляет API для интеграции с подсистемой доступа модулей расширения ЯРС, таких как МДС и М2. Модуль позволяет модифицировать стандартные алгоритмы доступа.

Каждая точка доступа в списке — это либо точка доступа модуля расширения МДС, либо одна из точек доступа М2.

Управление точкой доступа
ПараметрТипОписание
tokenСтрокаИдентификатор (токен) точки доступа, которой необходимо управлять
statusЧислоКоманда управления (требуемый статус точки доступа); значение из перечисления lonpacs.AP_COMMAND (см. ниже)

Для управления точкам доступа доступны следующие команды (значения параметра status ):

КомандаЗначениеОписание
STATUS_QUERY-1Запрос состояния точки доступа
RESTORE12Переключиться в дежурный режим работы
OPEN_BLOCKED21Разблокировать точку доступа
CLOSE_BLOCKED22Заблокировать точку доступа
DISABLE13
INITIATE_PASS18Инициировать проход
Состояние точки доступа

Модуль lonpacs.lua позволяет «подписаться» на события изменения состояния точек доступа, мониторинга связи с точками доступа, изменения состояния прохода (фазы алгоритма прохода). Для управления «подписчиками» в модуле доступны следующие функции:

Функция принимает следующие параметры:

Каждый объект-подписчик должен быть представлен Lua-таблицей со следующими функциями:

В функцию передаются следующие параметры:

В функцию передаются следующие параметры:

В функцию передаются следующие параметры:

Параметр ap_status может принимать одно из следующих значений:

ФункцияНазначениеКомментарии
lonpacs_on_ap_status_changed(token, ap_status)Получение и обработка изменений состояния точки доступа

Завершение транзакции прохода:

Точка доступа в состоянии «за блокирована».

Старт транзакции прохода пользователя (при получении разрешения на доступ).

Точка доступа переходит в состояние ожидания открытия двери.

Точка доступа в состоянии » открыта и заблокирована»:

Текущая транзакция пользователя обрывается.

Точка доступа в состоянии » закрыта и заблокирована»:

Текущая транзакция пользователя обрывается.

Точка доступа в состоянии «закрыта и заблокирована постановкой под охрану связанной группы зон»:

Текущая транзакция пользователя обрывается.

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

Функция parse_ap_status возвращает Lua-таблицу следующего вида:

где значение полей таблицы следующее:

Возможные значения определены в lonpacs.AP_DOOR_PHYSICAL_STATE :

Возможные значения определены в lonpacs.AP_LOCK_STATE :

Возможные значения определены в lonpacs.AP_MODE :

Возможные значения определены в lonpacs.AP_ALARM_STATE :

Значение кода состояния алгоритма прохода (фазы прохода) status, полученного в функции lonpacs_on_pass_status_changed(token, status, notify_key), может принимать одно из следующих значений:

Состояние точки доступаЗначениеОписание
USER_QUERY0Точка доступа в состоянии ожидания транзакции
FORCE_OPEN1Взлом двери
EPB2Старт транзакции прохода по кнопке выхода
HOLD_OPEN5Дверь удержана открытой (удержание двери)
DENIAL6
LOCK_ACTUATOR_ERROR32Неисправное состояние замка (не является состоянием точки доступа)
BLOCKED_HOLD_OPEN53Удержание двери точки доступа в состоянии «закрыта и заблокирована»
BLOCKED_FORCE_OPEN54Взлом двери точки доступа в состоянии «закрыта и заблокирована»
ARMED_CLOSE_BLOCKED105
Код (условный)Принимаемое значениеОписание
ACS_DENIED42Доступ запрещен
NO_PASS3Проход не совершен
PASS4Проход совершен
ACS_ID_PRESENT95Предъявлен идентификатор СКУД (запрос пользователя СКУД в базе ЯРС)
ARM_ID_PRESENT107Предъявлен идентификатор для управления постановкой на охрану связанной группы зон
DISARM_ID_PRESENT108Предъявлен идентификатор для управления снятием с охраны связанной группы зон
REPEATED_PRESENT59Повторное предъявление идентификатора в ходе транзакции СКУД

pacs.lua

Модуль предоставляет API для интеграции с подсистемой доступа (только для контроллеров БОРЕЙ и ЯРС). Модуль позволяет либо модифицировать стандартные алгоритмы доступа, либо реализовать собственный алгоритм.

Общие сведения

Подсистема доступа в контроллерах БОРЕЙ, ЯРС поддерживает две точки доступа (поддержка дополнительных точек доступа на модулях расширения ЯРС осуществляется в Lua-модуле lonpacs.lua). Соответственно, первый считыватель относится к первой точке доступа, а второй — ко второй. У каждой точки доступа есть строковой уникальный идентификатор, называемый токеном.

Соответственно, для перебора точек доступа (например, чтобы для каждой точки доступа проинциализировать свой алгоритм) удобно использовать следующий код:

В контроллере БОРЕЙ точек доступа всегда ровно две, с номерами 0 и 1. Точка доступа с номером 0 (у которой значение свойства pacs.ap[«токен»][«#»] равно 0 — это первая точка доступа), точка доступа с номером 1 — вторая.

В настройках доступа у контроллера можно выбрать «Режим работы» — «Две односторонние», «Одна двусторонняя», «Пользовательский». В стандартных режимах работы «Две односторонние» и «Одна двусторонняя» программные средства самостоятельно реализуют алгоритм доступа, таблицы параметров ( pacs.ap[«токен»] ) содержат параметры, которые пользователь может изменить через веб-приложение. В режиме «Пользовательский» таблицы параметров по умолчанию обычно пусты.

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

Управление состоянием точки доступа, а также режимом её работы (начало транзакции доступа, завершение транзакции и так далее) осуществляется из Lua-скрипта. Соответствующие функции описаны в разделе «Управление точкой доступа».

В каждый момент времени состояние точки доступа описывается N-мерным вектором:

Состояние двериНеизвестно (Unknown)
Открыто (Open)
Закрыто (Closed)
Неисправность (Fault)Определяется из Lua-скрипта.Состояние замкаНеизвестно (Unknown)
Открыт (Unlocked)
Закрыт (Locked)
Неисправность (Fault)Определяется из Lua-скрипта.Тревожный статусНорма (Normal)
Взлом двери (DoorForcedOpen)
Удержание двери (DoorOpenTooLong)Определяется из Lua-скрипта.Статус тампераНеизвестно (Unknown)
Корпус закрыт (NotInTamper)
Вскрытие корпуса (TamperDetected)

Автоматически определяется программными средствами по факту вскрытия / закрытия корпуса контроллера.

Не следует управлять этой осью состояния из Lua-скрипта.

Точки доступа поддерживают внешние команды управления блокировки, разблокировки, восстановления режима, включения / отключения, разрешения и подтверждения доступа. При обработке таких команд программные средства передают управление в Lua-скрипт. Также при предъявлении идентификатора, изменении состояния периферии (входов), выполенении внешних команд над точками доступа и т.д. подсистема доступа передаёт управление в Lua-скрипт. Пользователь может запрограммировать реакцию на соответствующие события с помощью функций-обработчиков (см. раздел «Функции-обработчики»).

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

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

Изменение системных параметров

Ниже приведены основные системные параметры, которые можно / нужно настраивать:

Позволяет определить требуемый режим идентификации — какие идентификаторы посетителя ожидаются на вход + как они будут проверяться.

ВНИМАНИЕ: этот параметр необходимо задать, если из Lua-скрипта будет вызвана функция pacs_authenticate с передачей идентификаторов посетителя; в противном случае идентификаторы не будут верифицированы по базе данных контроллера, доступ безусловно будет запрещён.

auto — автоматический выбор формата; для Wiegand формат выбирается исходя из количества переданных бит (26 — Wiegand-26, 37 — Wiegand-37), для 1-Wire всегда Wiegand-26

Raw-64 — используются все 64 бита карты (отсутствующие биты дополняются 0) в форме одного 64-битного числа; код предприятия при этом равен 0.

Raw-VL — используются только переданные от считывателя биты, в форме одного 64-битного числа; код предприятия при этом равен 0.

Маска (номера карты)other.card_maskFFFFFFFFFFFFFFFF64 бита маски в формате HEX-строки из 16 символовНабор параметров блока «Контроль повторного прохода»Описание временно недоступно.Набор параметров блока «Проход под принуждением»

Только в режиме идентификации «Карта и пинкод»

Описание временно недоступно.

Набор параметров блока «Проход с подтвержденеим»Описание временно недоступно.Набор параметров блока «Доступ по правилу N-лиц»Описание временно недоступно.
Функции-обработчики

Модуль позволяет разработчику определить глобальные Lua-функции с заданными именами. Такие функции-обработчики будут вызваны программными средствами контроллера по мере выполнения функций доступа.

В данном случае это должны быть именно «глобальные функции», определённые, например, следующим образом:

Локальные функции с таким же именем не будут вызваны:

Ниже приведён список доступных для определения функций-обработчиков:

Вызывается тогда, когда к считывателю контроллера предъявлен идентификатор.

В первом аргументе token передаётся токен точки доступа, на которой предъявлен идентификатор; во втором аргументе передаётся Lua-таблица с идентификаторами:

Если идентификатор отсутствует (например, не вводился пинкод), то соответствующее поле таблицы также отсутствует.

Обычно в коде данной функции выполняется вызов pacs.authenticate для начала транзакции доступа.

Первый аргумент token — токен точки доступа.

Второй аргумент event — один из retry (требуется повторный ввод пинкода), card (считана карта, требуется ввод пинкода), timeout (истекло время ожидания ввода пинкода).

Первый аргумент token — токен точки доступа.

Первый аргумент token — токен точки доступа.

Первый аргумент token — токен точки доступа.

Параметры port и device всегда константны, значения не имеют.

Параметр type_ определяет тип элемента периферии, чьё состояние изменилось. Значение из перечисления fec.TYPE (модуль fec.lua).

Параметр id определяет идентификатор элемента периферии, чьё состояние изменилось. Например, для входов на плате БОРЕЙ это значения от 1 до 8.

Параметр raw содержит «сырое» значение состояния элемента периферии. Способ приведения «сырого» значения к логическому описан ниже в разделе «Изменение состояние периферии).

ФункцияНазначениеКомментарии
pacs_reader_input(token, data)К считывателю предъявлен идентификатор
pacs_accessed(token, args)Получена внешняя команда на инициацию транзакции доступа.

Первый аргумент token — токен точки доступа.

Второй аргумент args — параметры разрешения доступа:

Подробную спецификацию команды инициации транзакции доступа смотри в спецификациях Onvif.

pacs_granted(token)Доступ разрешён (в результате проверки идентификатора)

Первый аргумент token — токен точки доступа.

Первый аргумент token — токен точки доступа.

pacs_enabled(token)Точка доступа включена (по внешней команде)Первый аргумент token — токен точки доступа.
pacs_disabled (token)Точка доступа отключена (по внешней команде)Первый аргумент token — токен точки доступа.
pacs_identification (token, event)Изменилось состояние ожидания ввода данных в режиме «Карта и пинкод»
pacs_external_locked (token) → booleanДолжен быть восстановлен режим работы точки доступа (обычный режим работы)
pacs_external_unlocked (token) → booleanТочка доступа должна быть разблокирована
pacs_external_blocked (token) → booleanТочка доступа должна быть заблокирована
pacs_external_authorization (token, decision)Разрешение доступа по внешней командеПервый аргумент token — токен точки доступа.
pacs_input(port, device, type_, id, raw)Изменение состояния элемента периферии
pacs_cancel_transaction (token)Получена внешняя команда на прерывание транзакции доступаПервый аргумент token — токен точки доступа.

При использовании стандартных алгоритмов «Две односторонних точки доступа», «Одна двусторонняя точка доступа» перечисленные в таблице функции-обработчики уже определены, в них выполняется логика стандартных алгоритмов доступа. Пользователь может переопределить эти обработчики в своём скрипте. Таким образом, переопределив ВСЕ функции пользователь реализует полностью свою логику доступа, НО при этом получит доступ ко всем параметрам, задаваемым для стандартных алгоритмов через веб-интерфейс — через поле pacs.ap (см. раздел «Модель данных» выше).

Изменение состояния периферии
Управление точкой доступа

Для управления точкой доступа / транзакцией доступа по выбранной точке доступа предназначены следующие функции:

Первый аргумент — токен точки доступа. Второй аргумент — Lua-таблица с идентификаторами (такая же, какая получена в функции-обработчике pacs_reader_input ):

В результате проверки будет вызвана функция обработчик pacs_granted (если доступ разрешён; при этом будет начата транзакция доступа, см. pacs_begin ) или pacs_denied (если доступ запрещён).

Если передан transaction_uuid, то соответствующее значение будет использоваться в роли идентификатора транзакции и будет подставлено во все отправляемые извещения. Если значение не будет указано, то будет сгенерирован уникальный UUID транзакции.

Первый аргумент — токен точки доступа.

ВАЖНО: текущая транзакция прекращается, все связанные с транзакцией данные (пропуска и пр.) очищаются. Данную функцию обязательно надо вызвать при завершении транзакции доступа.

Первый аргумент — токен точки доступа.

Транзакция доступа не прерывается. Обычно используется при переходе в состояния типа «Взлом двери» или «Удержание двери».

Обычно применяется для начала транзакции по кнопке выхода.

Поведение отличается от pacs.authenticate + pacs_begin тем, что извещения о событиях доступа будут содержать тему «анонимного доступа».

Первый аргумент — токен точки доступа.

Второй аргумент — Lua-таблица со значением состояния по различным «осям»:

Во втором аргументе можно отправлять только те «оси» состояния, которые необходимы. Доступные значения состояния см. в разделе «Общие сведения».

Поиск в базе данных

Описание временно недоступно.

storage.lua

Модуль предоставляет функции для перманентного сохранения и последующего чтения конфигурационных параметров или параметров скрипта автоматизации.

Модуль позволяет сохранять в персистентное хранилище Lua-таблицы с данными под заданным именем, а впоследствии извлекать их из хранилища по имени. Таблица с данными может содержать только пары «ключ = значение», где «ключ» это всегда строка, а «значение» может быть строкового, числового или булевого типа.

Пример использования модуля приведён ниже:

tenso.lua

Описание временно недоступно.

timer.lua

set_timeout

Запланировать вызов указанной Lua-функции спустя заданное количество миллисекунд.

При вызове set_timeout возвращает уникальный идентификатор созданного задания на отложенное выполнение. Это значение можно использовать в последующем вызове clear_timeout для отмены запланированного ранее задания.

clear_timeout
set_interval

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

clear_interval

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

ФункцияНазначениеКомментарии
pacs.authenticate(token, <. >)Выполнить проверку переданных идентификаторов и начать транзакцию доступа
pacs_block (token)Перевести точку доступа в состояние «Заблокировано»Первый аргумент — токен точки доступа.
pacs_unlock (token)Перевести точку доступа в состояние «Разблокировано»Первый аргумент — токен точки доступа.
pacs_pause (token)Прекратить приём идентификаторов на точке доступа
pacs_grant (token)Разрешить анонимный доступ и начать анонимную транзакцию доступа
pacs_notify (token)Отправить извещение с заданным кодомДоступный список кодов см. в документации на HTTP-API контроллера в части СКУД.
pacs_update_door_state(token, state)Изменить состояние точки доступа