Инструменты пользователя

Инструменты сайта


script

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
script [2025/09/18 06:05]
root [Пример использования скриптов ПЛК]
script [2025/09/18 12:38] (текущий)
root [Пример вызова функции скрипта ПЛК из скрипта интерфейса]
Строка 123: Строка 123:
  
 <wrap ks> <wrap ks>
-Для примера, создадим скрипт, который ежесекундно выводит в журнал сообщение.+Для примера, создадим скрипт, который ежесекундно выводит в журнал сообщение с текущим временем.
 </wrap> </wrap>
  
-====== Взаимодействие скриптов интерфейса и ПЛК ======+<code javascript> 
 +async function init() { 
 +    while (true) { 
 +        log('Current date:', new Date()); 
 +        await ds.sleep(1000); 
 +    } 
 +
 +</code> 
 <wrap ks> <wrap ks>
-Скрипты интерфейса могут вызывать функции скриптов ПЛК посредством вызова функции callPlc. При этом скрипты ПЛК не могут напрямую обращаться к функциям скриптов интерфейса. Это связано с тем, что контекстов исполнения скриптов интерфейса может быть несколько, или не быть ни одногоа контекст выполнения скриптов ПЛК всегда существует, и он всегда один. В связи с этим реализация доступа из скриптов ПЛК к функциям скриптов интерфейса не была реализована, чтобы не усложнять работу системы дополнительными проверками их доступности и синхронизациейЕсли же необходимо из скриптов ПЛК влиять на работу скриптов интерфейса, то это можно легко реализовать, используя общие переменные устройства "Память".+Код скрипта разместим в функции **init**, которая будет вызываться при запуске проекта. После запуска проекта увидим сообщения в системном журнале, которые будут выводиться вне зависимости от того, какой экран проекта в данный момент открытСкрипт прекратит свое выполнение лишь после завершения выполнения проекта.
 </wrap> </wrap>
  
 +{{ ::script11.png?nolink&400 |}}
  
-====== Дальше все херня, переделываю... ====== +====== Взаимодействие скриптов интерфейса и ПЛК ======
-====== Раздел проекта "Скрипты" ======+
 <wrap ks> <wrap ks>
-Все скрипты проекта запускаются на исполнение при запуске среды исполнения. Сами по себе скрипты подключаются к проекту в виде JavaScript модулейпоэтому для доступа к элементам скрипта их необходимо явно экспортировать, те функции и переменные скриптов имеют свою область видимости только в пределах своего скрипта и по умолчанию не видны из других. Для доступа к элементам скрипта извне используется ключевое слово //export//.+Скрипты интерфейса могут вызывать функции скриптов ПЛК посредством вызова функции **callPlc**. При этом скрипты ПЛК не могут напрямую обращаться к функциям скриптов интерфейса. Это связано с тем, что контекстов исполнения скриптов интерфейса может быть несколько, или не быть ни одного, а контекст выполнения скриптов ПЛК всегда существуети он всегда один. В связи с этим реализация доступа из скриптов ПЛК к функциям скриптов интерфейса не была реализована, чтобы не усложнять работу системы дополнительными проверками их доступности и синхронизацией. Если же необходимо из скриптов ПЛК влиять на работу скриптов интерфейса, то это можно легко реализовать, используя общие переменные устройства "Память".
 </wrap> </wrap>
 +
 +====== Пример вызова функции скрипта ПЛК из скрипта интерфейса ======
 +
 <wrap ks> <wrap ks>
-При создании нового скрипта автоматически создается шаблон кода функции инициализации скрипта:+Создадим в скаде код логики работы некоего устройства. К примеру сделаем таймер на 3 секунды, который будет выводить сообщение в журнал. Так же создадим функцию, которая будет управлять состоянием видимости сообщения. Так как этот код должен работать постоянно при работе проекта, его необходимо создать в скрипте ПЛК. Для этого создадим скрипт следующего вида:
 </wrap> </wrap>
 +
 <code javascript> <code javascript>
-export async function init() { +let isActive = true;
-     +
-+
-</code> +
-Эта функция вызывается ядром системы при каждом старте среды исполнения. Если скрипту не требуется инициализация при старте, эту функцию можно удалить.\\ +
-Экспортируемые элементы скриптов можно в дальнейшем использовать в других скриптах. К примеру создадим скрипт с именем //script1// и содержимым:\\ +
-\\ +
-**script1** +
-<code javascript> +
-export function f1() { +
-    alert('Функция f1 скрипта 1'); +
-}+
  
-function f2() { +async function init() { 
-    alert('Функция f2 скрипта 1'); +    while (true{ 
-+        if (isActivelog('hi'); 
-</code> +        await ds.sleep(3000); 
-Здесь функция f1 будет доступной из сторонних скриптов, при этом функция f2 доступна только внутри текущего скрипта. Теперь можно создать скрипт с именем //script2//, в котором можно вызвать функцию f1 первого скрипта. Все загруженные модули доступны в глобальном объекте системы с именем //dsSript//, соответственно чтобы вызвать функцию из первого модуля необходимо написать следующий код:\\ +    }
-\\ +
-**script2** +
-<code javascript> +
-export async function init() +
- dsScript.script1.f1(); +
-+
-</code> +
-При запуске проекта на исполнение мы увидим сообщение:\\ +
-{{ :script1.png?nolink&400 |}}\\ +
-Если мы попытаемся вызвать функцию //f2//, мы получим ошибку, тк она нам не доступна.\\ +
-\\ +
-**script2** +
-<code javascript> +
-export async function init() { +
- dsScript.script1.f2(); +
-} +
-</code> +
-{{ ::script2.png?nolink&400 |}}\\ +
-При этом функцию //f2// мы без проблем можем использовать внутри первого скрипта:\\ +
-\\ +
-**script1** +
-<code javascript> +
-export function f1() { +
- f2();+
 } }
  
-function f2() { +function setActive(state) { 
- alert('Функция f2 скрипта 1');+    log('Set state:', state)
 +    isActive = state;
 } }
 </code> </code>
-\\ + 
-**script2**+<wrap ks> 
 +Должен получиться проект следующего вида: 
 +</wrap> 
 + 
 +{{ ::script12.png?nolink&400 |}} 
 + 
 +<wrap ks> 
 +Далее создадим на экране две кнопки для включения и отключения статуса отображения сообщения посредством вызова функции [[ds.plccall|ds.plcCall]], которая вызывает функцию из скрипта ПЛК. Создадим в кнопках скрипты следующего содержания: 
 +</wrap> 
 <code javascript> <code javascript>
-export async function init() { +async function main(val) { 
- dsScript.script1.f1();+    await ds.plcCall('script_plc0.setActive', [ true ]);
 } }
 </code> </code>
-{{ ::script3.png?nolink&400 |}}\\ 
  
-====== Скрипты элементов визуализации ====== +<wrap ks> 
-Скрипты так же можно использовать как действие на событие элементов визуализации (на данный момент доступно только событие "Нажатие" элемента "Кнопка"). Для примера создадим скрипт с именем //script1// и следующим содержимым:\\ +и 
-\\ +</wrap> 
-**script1**+
 <code javascript> <code javascript>
-export function f1() { +async function main(val) { 
- alert('hi');+    await ds.plcCall('script_plc0.setActive', [ false ]);
 } }
 </code> </code>
-Чтобы использовать код скрипта проекта в своем коде, его необходимо подключить функцией //include//.\\ 
-Далее добавляем на экран кнопку, выбираем на событие "Нажатие" тип "Скрипт" и нажимаем справа кнопку редактирования, чтобы вписать код скрипта.\\ 
-{{ ::script4.png?nolink&400 |}}\\ 
-Пропишем следующий код скрипта:\\ 
-<code javascript> 
-const script1 = ds.include('script1'); 
-script1.f1(); 
-</code> 
-Теперь при запуске проекта и нажатии кнопки будет вызываться функция скрипта:\\ 
-{{ ::script5.png?nolink&400 |}}\\ 
  
-====== Глобальные переменные ====== +<wrap ks> 
-В любых скриптах из любого места доступен объект //ds.global// внутри которого можно хранить любые пользовательские данные. При этом надо иметь в виду что данные хранятся только во время работы среды исполнения, при ее перезапуске данные теряются. Для долговременного хранения данных необходимо использовать устройство "База данных" (в разработке).\\ +Запустим проект и понажимаем кнопкив журнале будет видно как вызывается функция ПЛК **setActive**, изменяющая содержимое переменной **isActive**и, соответственно, влияющая на работу таймера, выводящего сообщение. 
-Для примера создадим две кнопки, первая из которых будет записывать в переменную //x// текущую дату, а вторая выводить ее содержимое:\\ +</wrap> 
-{{ ::script6.png?nolink&400 |}}\\ + 
-После чего пропишем следующий код:\\ +{{ ::script13.png?nolink&300 |}}
-\\ +
-**Кнопка "Сохранить дату"** +
-<code javascript> +
-ds.global.x = Date(); +
-</code> +
-\\ +
-**Кнопка "Показать дату"** +
-<code javascript> +
-alert(ds.global.x); +
-</code> +
-При нажатии кнопки "Сохранить дату" текущая метка времени будет записываться в переменную //x//, а при нажатии кнопки "Показать дату" будет выводиться сохраненная в переменную дата.\\+
  
-====== Функции ядра ====== 
-Скада система помимо стандартных функций языка JavaScript предоставляет дополнительные инструменты для работы с ядром системы. Системные функции находятся в объекте //ds//, доступном из всех скриптов. Большинство функций являются асинхронными, что обязательно необходимо учитывать при их использовании.\\ 
-На данный момент доступны следующие функции:\\ 
-\\ 
-[[ds.sleep|sleep]] - задержка выполнения кода на указанное количество миллисекунд;\\ 
-[[ds.goto|goto]] - переход на указанный экран;\\ 
-[[ds.getDev |getDev]] - получить значение переменной устройства;\\ 
-[[ds.setDev |setDev]] - записать значение переменной устройства;\\ 
-[[ds.getProp |getProp]] - получить значение свойства графического элемента;\\ 
-[[ds.setProp |setProp]] - установить значение свойства графического элемента.\\ 
  
  
  
script.1758164738.txt.gz · Последнее изменение: 2025/09/18 06:05 — root