Архитектура JScript
JScript предоставляет полноценную среду выполнения JavaScript с интеграцией в систему uniset.
Базовые возможности
- Загрузка и выполнение JS-скриптов
- Интеграция с uniset
- Поддержка модульной системы с поиском по указанным путям
- готовые модули для типовых задач
Работа с датчиками uniset
JScript автоматически создает глобальные переменные для работы с датчиками:
uniset_inputs = [
{ name: "Sensor1", sensor: "real_sensor_name" },
{ name: "Sensor2" }
];
uniset_outputs = [
{ name: "Output1" },
{ name: "Output2" }
];
function uniset_on_step() {
let value = in_Sensor1;
out_Output1 = value + 10;
}
Если хочется чтобы переменная в коде отличалась от реального названия датчика, то можно вписать реальное название датчика (в конфиге) при помощи поля sensor: "real_sensor_name", тогда name будет использован в коде, а привязка будет осуществлена по названию указаному в sensor.
А так же создаются переменные с именем датчика, содержащие ID датчика
console.log("Sensor1 id=", Sensor1)
Система событий
JScript предоставляет набор callback-функций для реакции на системные события:
function uniset_on_start() {
mylog.info("System started");
}
function uniset_on_stop() {
mylog.info("System stopped");
}
function uniset_on_step() {
out_Output1 = in_Sensor1 * 2;
}
function uniset_on_sensor(id, value, name) {
mylog.info("Sensor " + id + " changed to " + value);
if( id == Sensor1 )
{
...
}
}
Система таймеров
Модуль uniset2-timers.js предоставляет расширенные возможности работы с таймерами:
function uniset_on_start() {
askTimer("single", 5000, 1, function(id, count) {
mylog.info("Single timer executed");
});
askTimer("repeat", 1000, 3, function(id, count) {
mylog.info("Repeating timer: " + count);
});
askTimer("infinite", 2000, -1, function(id, count) {
mylog.info("Heartbeat: " + count);
});
}
function uniset_on_stop() {
clearAllTimers();
}
Система логирования
Модуль uniset2-log.js предоставляет логирование в стиле uniset
mylog = uniset_log_create("MyModule", true, true, true, true);
mylog.level("info", "warn", "crit", "level5");
mylog.info("Information message");
mylog.warn("Warning message");
mylog.crit("Critical message");
mylog.log5("Debug message level 5");
Глобальный объект ui
JScript предоставляет глобальный объект ui для прямого взаимодействия с системой uniset:
ui.askSensor(sensor, command) - Подписка/отписка на получение значений датчика
ui.getValue(sensor) - Чтение текущего значения датчика
ui.setValue(sensor, value) - Запись значения в датчик
- Заметки
- Причём в качестве sensor можно использовать идентификатор или имя датчика
Доступные константы для команды подписки:
- UIONotify - получать все значения
- UIODontNotify - не получать значения (отписка)
- UIONotifyChange - получать значения только при изменении
- UIONotifyFirstNotNull - получать только первое ненулевое значение
Пример использования
function uniset_on_step() {
let currentValue = ui.getValue(Sensor1);
if (currentValue > 100) {
out_Output1 = 1;
}
let temp = ui.getValue(12345);
mylog.info("Temperature: " + temp);
}
Расширенные возможности
Модульная система
Поддерживается загрузка модулей через функцию load() с поиском по указанным путям:
load("uniset2-timers.js");
load("uniset2-log.js");
load("my_custom_module.js");
load("utils/helpers.js");
Доступные uniset-модули
Базовый шаблон для написания свой программы main.js
Конфигурация
XML-конфигурация
<JSProxy name="JSProxy1">
<modules>
<module path="/usr/share/uniset2/js"/>
<module path="/custom/js/modules"/>
</modules>
</JSProxy>
Параметры командной строки
- --js-name <name> - имя объекта в конфигурации
- --js-logfile <file> - файл для сохранения логов
- --js-sleep-msec <msec> - пауза между вызовами uniset_on_step (по умолчанию 150 msec)