Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

kedr

Я не разработчик, но думаю, что вряд ли. Написать отладчик очень сложно.
Рекомендую для отладки активно использовать функцию Log_Add.

Simple-Scada

#646
Цитата: EricFlat от 23 мая 2018, 15:06:56Здравствуйте. Отладчика скриптов нет и не планируется в системе? Вопрос для меня критичный, не хочется для проверки скриптов каждый раз перезапускать клиента
Здравствуйте. Внедрение отладчика для скриптов не планируется в ближайшем будущем. Планируется только добавить быстрый запуск проекта из редактора скады. К тому же и с отладчиком в большинстве случаев придется подключаться к проекту клиентом, например для отладки скрипта по событию OnClick кнопки. Придется сначала подключиться к проекту клиентом, найти эту кнопку на мнемосхеме и кликнуть её. Поэтому для событий, которые вызываются действиями пользователя внедрение отладчика не сильно упростит работу.

Цитата: EricFlat от 23 мая 2018, 15:06:56не хочется для проверки скриптов каждый раз перезапускать клиента
Перезапускать клиент не обязательно, достаточно перезапустить проект на сервере. Клиент сам подключится к проекту и подхватит изменения в проекте.

EricFlat

#647
Цитата: Simple-Scada от 24 мая 2018, 09:54:45Перезапускать клиент не обязательно, достаточно перезапустить проект на сервере. Клиент сам подключится к проекту и подхватит изменения в проекте.
А вот тут не работает. Изменения подхватывает только веб-клиент. И только при обновлении страницы. Скада клиент проект не обновляет, даже при перезапуске проекта на сервере.

Simple-Scada

#648
EricFlat, если Вы внесли изменения в проект, сохранили их и перезапустили проект на сервере (нажатием кнопки стоп с квадратной иконкой и затем кнопки пуск с треугольной иконкой), то обычные клиенты подключенные к серверу просто не смогут работать пока не подхватят изменения проекта, т.к. они не выполняют никаких функций кроме визуализации данных с сервера. Убедитесь что Ваш клиент подключен именно к тому серверу на котором Вы перезапускаете проект, а не к другому серверу (например локальному на том же компьютере, на котором запущен клиент) и именно к тому проекту, который вы перезапускаете. Может быть когда Вы подключаетесь к серверу из клиента, то оставляете адрес localhost? Тогда будет просто запущена локальная копия сервера скады и перезапуски проекта на удаленном сервере скады конечно ничего не дадут.

EricFlat

Цитата: kedr от 24 мая 2018, 08:34:32Я не разработчик, но думаю, что вряд ли. Написать отладчик очень сложно.
Рекомендую для отладки активно использовать функцию Log_Add.
Нашел эту функцию, прописал в скрипт выполняемый каждую секунду, но не могу найти этот лог. Есть Client-log.txt, там нет никаких записей.

Simple_Scada

Здравствуйте!

Процедура Log_Add добавляет сообщение в Log-файл сервера Simple-Scada(Server-log.txt) на ПК-сервере(ПК, на котором выполняется проект). Log-файл можно найти в папке "..\Simple-Scada 2\Logs".

atomix

#651
Будут ли реализованы глобальные переменные в скриптах, а также функции вызываемые при старте проекта и остановке (например подключился первый клиент то вызывается некая функция старта, а если отключился последний живой клиент, то вызывается функция стопа).

Те переменные (внутренние виртуальные) не подходят у них нет значения хранить как Variant Type.

Также не хватает функции VarType и IsObject.

Пока на этом у меня застопоролось перевод проектов на вашу платформу.

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

Simple-Scada

#652
Цитироватьфункции вызываемые при старте проекта и остановке
Такие события уже есть: "Полностью запущен" и "Остановка проекта". Также при подключении каждого клиента выполняется событие "Клиент подключен".

ЦитироватьБудут ли реализованы глобальные переменные в скриптах
Как Вы правильно отметили - виртуальные переменные в меню "Проект -> Переменные" это и есть глобальные переменные.

ЦитироватьТе переменные (внутренние виртуальные) не подходят у них нет значения хранить как Variant Type.
Любая глобальная переменная, независимо от типа, который Вы выбираете, на самом деле является Variant переменной. Поэтому свойство Value такой переменной имеет тип Variant. А выбранный при создании тип данных влияет только на формат отображения и на некоторые преобразования.

ЦитироватьТакже не хватает функции VarType и IsObject. Пока на этом у меня застопоролось перевод проектов на вашу платформу.
Можете подробно описать задачу которую нужно решить и для чего конкретно нужно применить эти функции? На данный момент мы не знаем реальных задач в которых нельзя было бы обойтись без этих функций.

ЦитироватьТакже при использовании скриптов в обработчике нажатия например от кнопки, возникает рядом с курсором мыши изображение колесика загрузки на доли секунды, может его не показывать если исполнение скрипта длится меньше секунды.
Скада сама никогда не меняет курсор, поэтому мы не сможем на это повлиять (кроме как принудительно вызывать смену курсора на обычный в "бесконечном" цикле). Скорее всего его меняет ОС. Какие именно действия выполняются в этом скрипте? Может быть работа с файлами? Можете привести пример скрипта? Либо курсор меняется при выполнении любого скрипта?

atomix

#653
Вставляем этот код в SimulationTimer и заводим глобальную переменную objTemp.

Вот так работает:
Код: pascal
function Test(param : variant) : Variant;
var
  WshNetwork  : Variant;
begin
  WshNetwork := CreateOleObject("WScript.Network");
  Field41.text :=  WshNetwork.ComputerName;
  //ShowMessageAll('Заголовок окна', WshNetwork.ComputerName, clNone);
end;

Вот так НЕ работает:
Код: pascal
function Test(param : variant) : Variant;
var
  WshNetwork  : Variant;
begin
  objTemp.Value := CreateOleObject("WScript.Network");
  Field41.text :=  objTemp.Value.ComputerName;
  //ShowMessageAll('Заголовок окна', objTemp.Value.ComputerName, clNone);
end;

VarType и IsObject нужны чтобы определить создался ли объект. может по другому как надо я не знаю подскажите.

Simple-Scada

Сервер перед присвоением выполняет проверку VarSameValue, которая вызывает исключение если значения нельзя сравнить (имеют разный тип). Поэтому присвоение прерывается. В ближайшем обновлении исключим эту проверку и присвоение objTemp.Value := CreateOleObject("WScript.Network"); будет работать, а значение objTemp.Value можно будет затем использовать в любом скрипте. Несмотря на это, мы рекомендовали бы работать с OLE объектами в пределах скрипта, чтобы правильно реализовать их по завершению скрипта, например:
Код: pascal
var
  WshNetwork  : Variant;
begin
  WshNetwork := CreateOleObject("WScript.Network");  // создаем объект
  Text1.Text :=  WshNetwork.ComputerName;
  WshNetwork := Unassigned;  // освобождаем объект
end.

При необходимости работы с объектом из другого скрипта лучше снова создать его, использовать и освободить:
Код: pascal
var
  WshNetwork  : Variant;
begin
  WshNetwork := CreateOleObject("WScript.Network");  // создаем объект
  Text2.Text := WshNetwork.EnumNetworkDrives.Count;
  WshNetwork := Unassigned;  // освобождаем объект
end.

ЦитироватьVarType и IsObject нужны чтобы определить создался ли объект.
Можете не проверять и сразу работать с объектом, как в примерах выше. Сервер всё равно будет делать такую проверку автоматически и в случае ошибки Вы увидите соответствующее сообщение в журнале сервера.

EricFlat

#655
Вопрос по процедурам Ping. Хочу использовать IP адрес в глобальной переменной G_IP типа string
Вот такая последовательность не работает.

На старте.
Код: pascal
begin
  G_IP.Value:='192.168.2.9';
end.
Код: pascal
begin
  StartPing(G_IP.AsStr, 5000);
end.
Каждую секунду.
Код: pascal
begin
  if GetPing(G_IP.AsStr) then
    begin
      G_ping.Value:=TRUE;
      G_sPing.Value:='ОК';
    end
  else
    begin
      G_ping.Value:=FALSE;
      G_sPing.Value:='-';
    end
end.
Если в процедуры передавать вместо G_IP явные указания IP в виде '192.168.2.9', то все работает.

Simple-Scada

Код работает. См. пример во вложении (для версии 2.2.9.2). Может быть у Вас переменная G_IP внешняя (с OPC-сервера)? Тогда присвоение "G_IP.Value:='192.168.2.9'" может выполниться не моментально и StartPing пройдёт для пустого IP-адреса. И почему у Вас два разных скрипта для старта? Если G_IP внутренняя переменная, то можно написать так:
Код: pascal
begin
  G_IP.Value:='192.168.2.9';
  StartPing(G_IP.AsStr, 5000);
end.

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

EricFlat

Цитата: Simple-Scada от 13 июня 2018, 12:14:37Тогда присвоение "G_IP.Value:='192.168.2.9'" может выполниться не моментально и StartPing пройдёт для пустого IP-адреса. И почему у Вас два разных скрипта для старта?
Да, это переменная скады. Я использую их, как глобальные константы и в отдельном скрипте на старте раздаю значения.  Запуск пинга тоже на старте, с еще пустой константой, отсюда и ошибка. Буду задавать константы IP в скрипте старта пинга.

beloleg86

есть много точек которые считывают информацию температуры в фаренгейтах, есть способ универсального скрипта перевода в цельсия? пока приходится каждой точке писать свой скрипт

Simple_Scada

Здравствуйте!

Можно обойтись без скриптов, используя функцию масштабирования значений переменной из одной шкалы в другую. Допустим, переменная в фаренгейтах принимает диапазон значений от -58 до 122. Создадим шкалу с этим диапазоном и назначим ее нашей переменной. Далее, перейдем на вкладку свойств переменной "Дополнительные", активируем режим масштабирования и укажем соответствующую шкалу в цельсиях(см. скриншот). Значению "-58" гр. фаренгейта соответствует "-50" гр. цельсия, значению "122" гр. фаренгейта соответствует "50" гр. цельсия. Т.е., нам необходимо указать визуальную шкалу от -50 до 50. Готово! Теперь, полученные с контроллера значения в фаренгейтах будут автоматически преобразовываться в градусы цельсия.