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

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

Genrosol

Здравствуйте, уважаемые разработчики!
Некоторое время назад обсуждался такой вопрос:
ЦитироватьМожет в базе данных SQL стоит создать дополнительную таблицу, состоящую из двух или трех столбцов (ID переменной, имя переменной в Simple-Scada, описание переменной в Simple-Scada)? Таким образом SQL-клиент смог бы выдать пользователю список переменных с именами и описанием для дальнейшей работы с архивами.
Где вы ответили:
ЦитироватьМожем реализовать такую таблицу, нот только после решения более популярных задач.
Это кстати помогло бы в решении проблемы, озвученной kedr'ом:
ЦитироватьМожно ли в скрипте пробежаться по всем переменным проекта, группы или тем, у которых имя начинается с определённой строки?

Simple-Scada

Здравствуйте.
Цитата: Genrosol от 12 мая 2018, 14:36:03Это кстати помогло бы в решении проблемы, озвученной kedr'ом:
ID переменных не подходят для перечисления в цикле, т.к. ID не упорядочиваются и могут содержать пропуски любого размера, соответственно поиск переменной по ID будет именно поиском (т.е. относительно "тяжелой" операцией), а не извлечением элемента по прямой ссылке. Для корректного перечисления переменных в цикле может подойти только глобальная переменная-массив со списком переменных.

Genrosol

Если я правильно понял, задача kedr'а изначально заключалась в поиске переменных, у которых имя начинается с определённой строки, а уже потом появилось предложение реализовать поиск по ID. Соответственно, имею в БД таблицу со списком всех переменных, через SQL-запросы можно получать список переменных в любом необходимом виде.

Simple-Scada

#633
Да, но это будет список имён переменных и их ID. Судя по всему с ними нужно как-то работать после получения списка, а чтобы работать с самими переменными нужно получить объекты TM_Variable.

Genrosol

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

kedr

Подскажите, пожалуйста, логику работы StartPing / GetPing.
У меня в проекте несколько устройств часто "отваливаются" на время ATimeOut в StartPing.

Обычно принято считать связь утерянной после нескольких потерянных пингов подряд.
Но для StartPing нельзя задать кол-во пингов.

Неужели GetPing выдает False после первого же утерянного пинга?

Simple-Scada

Цитата: Genrosol от 14 мая 2018, 16:38:50Имеете ввиду, что придется пробежаться по каждому элементу полученного списка, используя при этом функцию GetVariableByName, и вся эта процедура отнимет много ресурсов ПК?
Нагрузка на ПК будет зависеть от его конфигурации. Это будет просто плохой подход, вместо прямого перебора будет поиск переменной по имени / ID.

Цитата: kedr от 14 мая 2018, 17:36:11Неужели GetPing выдает False после первого же утерянного пинга?
Функция GetPing не учитывает кол-во попыток или предыдущие попытки. Она возвращает False, если последняя попытка пинга не удалась, т.е. устройство не ответило за отведённое ему время. Возвращает True в ином случае.

kedr

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

Simple-Scada

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

kedr

#639
Да, создал переменные vNumPing1, vNumPing2... в отдельной группе.
Суть не сильно отличается от использования массива, хотя более ресурсоемко.

По поводу события для пинга.
Это хорошо, но придётся в любом случае от IP-адреса как-то переходить к объекту. Напрашивается глобальный хэшированный массив. Или объект типа TCollection с поиском по ключу.
Ну, или можно в TM_Control добавить текстовое поле Key и реализовать глобальную функцию типа GetControlByKey.

kedr

Подскажите плз, можно ли обратиться с SQL-запросом к чужой (не своей) базе данных?

pan2000

#641
ЦитироватьПодскажите плз, можно ли обратиться с SQL-запросом к чужой (не своей) базе данных?
Для БД MySQL (при наличии прав доступа) удаётся обратиться с запросом к системной (чужой?) БД при условии,
что имя таблицы полное и не заключено в кавычки ``.

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

Скрипт типа "Полностью запущен" заполняет таблицу информацией о всех таблицах БД, выбранной в проекте.
Код: pascal
begin
  Table1.Title := 'Таблицы БД    ' + GetDatabaseName;
  Table1.RunSQL('SELECT `TABLE_NAME`, `TABLE_ROWS`, `TABLE_COMMENT` FROM '
    + 'INFORMATION_SCHEMA.TABLES'              // полное имя таблицы не заключено в кавычки  ` `
    + ' WHERE `TABLE_SCHEMA` = ''' + GetDatabaseName + ''';', tsAll);
end.

Полностью пример (с отключенной БД) в приложении.

kedr

Речь идет о БД другой системы, не Simple-Scada, на другом компьютере.

Simple-Scada

#643
Подключиться к сторонней БД и получить из неё данные можно только в отчеты, используя систему отчетов (Reports.exe). Работать напрямую из проекта со сторонней БД сейчас нельзя.

EricFlat

Здравствуйте. Отладчика скриптов нет и не планируется в системе? Вопрос для меня критичный, не хочется для проверки скриптов каждый раз перезапускать клиента