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

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

DikoSt

Цитата: lipvasko от 03 августа 2018, 11:57:56подскажите пожалуйста , как можно разобрать строку  и потом собрать её снова , но только без не нужных символов , т.е у меня есть строка - это тэг с плк в формате  дата и время DT  в скаду он передаётся как строка вида он такого  DT#2018-09-03-12:01:03.569   а мне нужно получить
2018-09-03-12:01:03  - заранее благодарен.
Думаю, что как-то так получится:
newString:=Copy(StringFromPLC; 2, 19 Integer);

всё время забываю с 0 начинают отсчитывать или с 1, поэтому 2 и 19 может придётся подправить.

midnight1979

Добрый день!

Возможно ли на уровне скриптов формировать GET/PUT http запросы????
Вариант с RunApplication не очень элегантный...

спасибо.

midnight1979

#797
Цитата: midnight1979 от 09 февраля 2019, 12:07:57Добрый день!

Возможно ли на уровне скриптов формировать GET/PUT http запросы????
Вариант с RunApplication не очень элегантный...

спасибо.

Отвечу пока сам себе - на каком решении на данный момент остановился и оно в принципе меня устраивает.
Суть вот в чем - наверняка многие знают про такую штуку как Blynk. Так вот - есть свой сервер Blynk и нужно было передавать значения переменных Simple Scada в проект Blynk'a.
Благо у последнего есть свой HTTP RESTful API. Присвоение и чтение переменных проекта Blynk осуществляется при помощи GET/POST запросов.
В итоге создал в проекте Simple Scada скрипт на изменение переменных, который отправляет значения этих переменных на сервер Blynk при помощи CURL.
Естественно чтобы запустить CURL - воспользовался методом RunApplication, но в моменты запуска (а переменные изменяются часто) появление черных (консольных) виндовых окошек, которые с завидной регулярностью появляются и пропадают - интерфейсно это ну просто НИКАК!!!

В итоге запускаю CURL, но при помощи VBS скрипта (передав в него в качестве параметров значения переменных Simple Scada) - в примере ниже - для двух таких переменных:
RunApplication(SS_SERVER_NAME, 'c:\curl\curl.vbs', FloatToStr(t1.Value, 0) + ' ' + FloatToStr(h1.Value, 0));

//-- сам скрипт --//
Set objArgs = WScript.Arguments
Set oShell = WScript.CreateObject("WScript.Shell")
oShell.Run "c:\curl\curl.exe ip-address:port/blynk_token/update/v0?value="+objArgs(0), 0, falseTRUE
oShell.Run "c:\curl\curl.exe ip-address:port/blynk_token/update/v1?value="+objArgs(1), 0, falseTRUE
//--добавлено
Set objArgs = Nothing
Set oShell = Nothing

PS. В скрипте изменены параметры shell.run c FALSE на TRUE и добавлено обнуление переменных (как заверяют мануалы - эти переменные и сами должны "убиться" по окончанию выполнения, но раз создал сам то и убей сам), иначе произойдут серьезные утечки в памяти...

Вот таким образом не появляется никаких черных окошек - всё работает в фоне.
Всем спасибо, может у кого нибудь есть и другие варианты решения этой задачи, но я пока остановился на вышеописанном.
Пример наипростейший - осуществляется опрос датчика температуры и влажности воздуха, эти данные попадают в Simple Scada с ArOPC-сервера, и скриптом уходят в мобильное приложение Blynk.

midnight1979

#798
Функция RunApplication вызывает переполнение памяти при многократном вызове!
Если запускать приложение из скрипта изменения переменной (а это раз в 1-2 секунды) то происходит постепенный рост занимаемой процессом server.exe памяти!
Причем в процессах видно, что запущенная через RunApplication программа отработала и завершилась.
Почему происходит утечка памяти?????????

По факту после запуска сервера Simple Scada - при текущей конфигурации проекта - процесс server.exe занимает в памяти порядка 96 мб, за последующий час работы сервера он уже занимает 117 мб. и так до максимально возможного объема оперативки.

Очень жду ответа разработчиков...

Simple-Scada

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

ЦитироватьВозможно ли на уровне скриптов формировать GET/PUT http запросы?
Нет, но в будущем появятся такие функции в скриптах.

ЦитироватьФункция RunApplication вызывает переполнение памяти при многократном вызове!
Почему происходит утечка памяти?
Скада для запуска приложений использует прямой вызов ShellExecuteExW из WinAPI, никаких доп. действий не выполняется. Если у Вас Windows 10, то возможно Вы столкнулись с ошибкой Windows, которая подробно описана здесь и здесь. Она была устранена в последних обновлениях Windows. По крайней мере у нас она не наблюдается в версии 1803 (сборка 17134.472).

midnight1979

#800
Версия 1803 (17134.523)

Simple-Scada

К сожалению в этом вопросе мы вряд ли сможем что-то изменить, т.к. для запуска приложений используется только код Windows. Видимо в сборке 17134.523 также присутствует проблема с ShellExecute (в этом случае можно рекомендовать только сменить версию или сборку ОС), либо утечка связана с чем-то другим. Если есть желание, отправьте нам на support@simple-scada.com текущую версию проекта. Мы можем проверить её на различных ПК, а также на наличие другие проблем (вдруг утечка памяти вызвана чем-то ещё?).

vyacheslav

#802
добрый день, подскажите правильность написание этого скрипта верна?

Код: pascal
begin
  RunApplication(GetClientName, GetProjectPath + 'Files\info_simplescada\Температурный график', '');
end.

Он не работает у меня в проекте

Simple_Scada

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

"Температурный график" - это файл изображения? Если да, то необходимо через RunApplication открыть приложение для просмотра изображений и в параметры передать путь к файлу. Например:

Код: pascal
begin    
  { запустить Paint на клиенте, который вызвал скрипт и открыть изображение }
  RunApplication(GetClientName, 'mspaint.exe', GetProjectPath + '"Files\info_simplescada\Температурный график.jpeg"');
end.

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

vyacheslav


Simple_Scada

Тогда нужно запускать проводник Windows(explorer.exe) и код будет таким:

Код: pascal
begin   
  { открыть папку в проводнике Windows }
  RunApplication(GetClientName, 'explorer.exe', GetProjectPath + 'Files\info_simplescada\Температурный график');
end.

Этот и другие примеры скриптов для RunApplication можно найти в руководстве по ссылке.

vyacheslav

#806
Подскажите возникли проблемы, как правильно исправить: этот код работает на сервере и этот файл лежит именно на сервере, но когда на клиенте выполняю эти действия он не находит этот файл так как локально его нет. как правильно прописать скрипт, чтоб он обращался к папке на сервере?

Simple_Scada

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

Код: pascal
begin   
  { открыть папку в проводнике Windows }
  RunApplication(GetClientName, 'explorer.exe', '\\192.168.1.10\info_simplescada\Температурный график');
end.

При этом, между сервером и клиентом должен быть настроен общий доступ к необходимой папке.


midnight1979

Цитата: Simple-Scada от 12 февраля 2019, 21:31:45К сожалению в этом вопросе мы вряд ли сможем что-то изменить, т.к. для запуска приложений используется только код Windows. Видимо в сборке 17134.523 также присутствует проблема с ShellExecute (в этом случае можно рекомендовать только сменить версию или сборку ОС), либо утечка связана с чем-то другим. Если есть желание, отправьте нам на support@simple-scada.com текущую версию проекта. Мы можем проверить её на различных ПК, а также на наличие другие проблем (вдруг утечка памяти вызвана чем-то ещё?).

Вероятно дело и версии, но решил все таки данную задачу пока со Скады снять. Во-первых - память утекает, во-вторых это не совсем задача для Скады таким способом через скрипты работать с API сторонних систем :)
Если бы были методы реализующие на языке скриптов запросы GET и PUT тогда возможно и на скаде бы оставил, а так написал собственного клиента OPC и сделал удобный интерфейс сопоставления тегов сервера с переменными проекта Blynk. - теперь каждый занимается своей задачей... :)

Но возможность работы с HTTP (а еще лучше через websockets) - очень ждем в Simple Scada...

Кумар

Здравствуйте.
Как можно отключить (завершить работу) Web-клиентов?
Используя процедуру CloseApplicationClient/CloseApplicationAll, скрипт срабатывает только для обычных клиентов и для web-клиентов, запущенных через созданную иконку на Android-устройстве.