Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Вопросы по скриптам в Simple-Scada 2  (Прочитано 314367 раз)

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #555 : 19 Декабря 2017, 12:25:27 »
Здравствуйте.
Ребята, сегодня добавил вот такой запрос в проект.
Код: (delphi)
var
{Заполняем таблицу tblSpisok_TH03 "Перечень компонентов ручного ввода"}
  aQuery:string;
begin
  aQuery :=    'SELECT    AR.AR_ARTICLE_ID              AS AR_ARTICLE_ID '+
                         ',AR.AR_NAME                   AS AR_NAME'+
                         ',SUM(TMP.TDB_DOSINGWEIGHT)    AS TDB_DOSINGWEIGHT'+
                         ',CASE TMP.TDB_ACTIVE WHEN 1 THEN ''Добавлен'' ELSE '''' end  AS ACTIVE '+
               'FROM TMP_DOSINGBATCHES TMP '+
               'INNER JOIN CFG_BATCHES BD ON BD.BD_PLC_BATCHNUMBER = TMP.TDB_PLC_BATCHNUMBER '+
               'INNER JOIN CFG_RAWMATERIAL RM ON RM.RM_RAWMAT_ID = TMP.TDB_RAWMAT_ID '+
               'INNER JOIN CFG_ARTICLE AR ON AR.AR_ARTICLE_ID = RM.RM_RAWMAT_ID '+
               'WHERE   BD_BATCHNUMBER = (SELECT MAX(BD_BATCHNUMBER) '+
               'FROM CFG_BATCHES '+
               'INNER JOIN TMP_DOSINGBATCHES ON TDB_PLC_BATCHNUMBER = BD_PLC_BATCHNUMBER '+
               'INNER JOIN CFG_WEIGHER ON WG_WEIGHER_ID = TDB_WEIGHER_ID '+
               'INNER JOIN CFG_UNITS ON UN_BATCHNUMBER = BD_BATCHNUMBER '+
               'INNER JOIN CFG_UNIT_DEVICES ON UN_UNIT_ID = UDS_UNIT_ID AND WG_DEVICE_ID = UDS_DEVICE_ID '+
               'AND UN_BATCHNUMBER > 1 '+
               'AND TDB_WEIGHER_ID = 6) '+
               'AND TMP.TDB_WEIGHER_ID = 6 '+
               'AND TMP.TDB_MODIFYTYPE <> ''D'' '+
               'GROUP BY TMP.TDB_PLC_BATCHNUMBER'+
               ',RTRIM(AR.AR_ARTICLECODE)'+
               ',AR.AR_NAME '+
               ',AR.AR_ARTICLE_ID '+
               ',TMP.TDB_WEIGHER_ID '+
               ',TMP.TDB_ACTIVE '+
               'ORDER BY TMP.TDB_PLC_BATCHNUMBER, MIN(TDB_SEQUENCENUMBER) ';

  tblSpisok_TH03.RunSQL(aQuery, tsSaveFixRow);
end.
   

Получается таблица похожая на эту:
+-------------------+---------------------+--------------------------+------------------+                   
|  AR_ARTICLE_ID |       AR_NAME       |  TDB_DOSINGWEIGHT |       ACTIVE       |
+-------------------+---------------------+--------------------------+------------------+
|           32           |  Магния оксид      |                 24.2232      |   Добавлен       |
+-------------------+---------------------+--------------------------+------------------+

Но есть одно Но. Когда запрос выполняется в SQL, все проходит гладко и происходит подстановка
в колонку ACTIVE значения вместо 1 - 'Добавлен', а вместо 0 - пустую строку с помощью  CASE.
Но если тот же запрос выполнять через клиент с автозаполнением таблицы, то в колонке ACTIVE всегда записывается 'Добавлен'
« Изменён: 26 Мая 2018, 10:16:00 от Simple-Scada »

deldemo

  • Старожил
  • ****
  • Сообщений: 308
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #556 : 19 Декабря 2017, 14:10:24 »
Все вопрос снят.
Вообщем ситуация следующая. Если в таблицу с автозаполнением вписать статичный текст а при запросе к SQL будет возвращаться пустая строка, то выше указанный статичный текст будет множится на все пустые строки.
(статичный текст вписывал для проб и настройки шрифтов)

Romz_ru

  • Новичок
  • *
  • Сообщений: 1
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #557 : 20 Декабря 2017, 00:28:28 »
Подскажите пожалуйста, как в редакторе скриптов отменить изменения в коде (обычный Ctrl+Z не работает).

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #558 : 20 Декабря 2017, 09:01:30 »
Расскажите пожалуйста более подробно, как (последовательно/параллельно) исполняются скрипты. Какие есть приоритеты исполнения, последовательность и т.п.
Вот, например, у меня есть скрипт, который при изменении переменной делает в цикле несколько однотипных SQL-запросов (инсертов) с разными данными.
Пока работает все норм., но хотелось бы понять саму "механику" работы. Как идут эти запросы в базу? Просто перемещаются в какую-то очередь и исполняются один за другим с ожиданим подтверждения/ошибки исполнения от предидущего или посылаются в базу без ожидания ответа (который просто обрабатывается в другом скрипте по событию).
Может ли быть ситуация, когда один из этих запросов не обработается по причине занятости СУБД обработкой предидущего запроса?
Когда возникает событие "выполнен SQL-запрос" в этой ситуации? Если после выполнения каждого, тода получается, что это событие может прерывать выполнение цикла в текущем скрипте, что врядли. Или же это событие будет наступать только после отправки последнего запроса из цикла и завершения выполнения текущего скрипта.
Вот такого плана информация интересует.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #559 : 20 Декабря 2017, 22:00:31 »
Подскажите пожалуйста, как в редакторе скриптов отменить изменения в коде (обычный Ctrl+Z не работает).
Комбинация Ctrl+Z отвечает за отмену действия. Может быть Вы используете старую версию скады? (отмена действий доступна с версии 2.2.2.0 и выше).
В ином случае убедитесь, что во время нажатия комбинации Ctrl+Z курсор установлен в редактор кода. Используйте комбинацию несколько раз, т.к. перемещения курсора тоже могут считаться за действие.

Расскажите пожалуйста более подробно, как (последовательно/параллельно) исполняются скрипты.
Скрипты выполняются последовательно в том порядке, в котором были вызваны. Запросы к БД ставятся в очередь, а затем выполняются в отдельных потоках параллельно. После выполнения любого из запросов вызываются скрипты с типом "Выполнен SQL-запрос". При возникновении ошибки во время выполнения SQL-запроса вызываются скрипты с типом "Ошибка SQL-запроса".

Цитировать
Может ли быть ситуация, когда один из этих запросов не обработается по причине занятости СУБД обработкой предидущего запроса?
Нет, иначе работа с СУБД была бы крайне ненадежной.

Цитировать
Когда возникает событие "выполнен SQL-запрос" в этой ситуации? Если после выполнения каждого, тода получается, что это событие может прерывать выполнение цикла в текущем скрипте, что врядли. Или же это событие будет наступать только после отправки последнего запроса из цикла и завершения выполнения текущего скрипта.
В этом случае сначала пройдет весь цикл, запросы добавятся в очередь и скрипт завершится (это займёт миллисекунды). Далее скада будет брать сразу несколько запросов и выполнять их в отдельных потоках параллельно. Тот, который выполнится первым вызовет событие "выполнен SQL-запрос" первым. Выполнится вторым, вызовет "выполнен SQL-запрос" вторым и т.д.
« Изменён: 20 Декабря 2017, 22:02:22 от Simple-Scada »

AndreiKov

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #560 : 20 Декабря 2017, 22:47:43 »
Добрый день.
Возможно ли в скрипте получить текущее количество неподтвержденных или активных сообщений?

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #561 : 21 Декабря 2017, 08:58:22 »
А есть какая-нибудь команда для открытия(показа) окна?
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
« Изменён: 21 Декабря 2017, 12:58:41 от Victor_P. »

AndreiKov

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #562 : 21 Декабря 2017, 11:16:41 »
А есть какая-нибудь команда для открытия(показа) окна?
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
https://simple-scada.com/help/script/tmwindow.html

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #563 : 21 Декабря 2017, 11:26:16 »
Здравствуйте!

Цитировать
Возможно ли в скрипте получить текущее количество неподтвержденных или активных сообщений?
Нет. Пожалуйста опишите для чего это может потребоваться?

Цитировать
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
Victor_P., для этой цели лучше подойдут процедуры ShowMessageClient и ShowMessageAll.
« Изменён: 21 Декабря 2017, 11:31:06 от Simple_Scada »

AndreiKov

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #564 : 21 Декабря 2017, 12:13:17 »
Нет. Пожалуйста опишите для чего это может потребоваться?
После подтверждения сообщения оператор может забыть(или не передать по смене), что событие ещё активно.
Нужно отображать предупреждение, если есть активные сообщения(неустранённые аварии).
« Изменён: 21 Декабря 2017, 12:15:09 от AndreiKov »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1165
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #565 : 21 Декабря 2017, 12:22:19 »
Для этого можно использовать компонент "Список сообщений", выбрав в свойстве "Группа" пункт "Активные сообщения", тогда в списке будут отображаться только активные сообщения.

AndreiKov

  • Новичок
  • *
  • Сообщений: 44
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #566 : 21 Декабря 2017, 12:52:13 »
Для этого можно использовать компонент "Список сообщений", выбрав в свойстве "Группа" пункт "Активные сообщения", тогда в списке будут отображаться только активные сообщения.
Это понятно. Но хочется сделать как на картинке, компактную кнопку, появляющуюся, если есть активные сообщения.
Список сообщений занимает много лишнего места и отображает пустоту, когда активных сообщений нет.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 2996
    • Просмотр профиля
    • Simple-Scada
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #567 : 21 Декабря 2017, 13:09:10 »
AndreiKov в ближайшем обновлении добавим функцию которая позволит реализовать описанное.

Victor_P.

  • Пользователь
  • **
  • Сообщений: 69
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #568 : 19 Января 2018, 16:28:47 »
Подскажите, как сделать переключатель.
Например, у меня есть 5 кнопок (bt0 .. bt4) и переменная Val типа byte. Кнопки привязаны к переменной, каждая к своему биту (0 .. 4) и в их свойствах прописаны тиги (0 .. 4).
На обработчик события OnClick каждой кнопки повешен скрипт:
Код
if not GetBit(Val.AsInt, Sender.Tag) then Val.Value := 0;
Все работает,- при нажатии на каждую кнопку, лбая другая нажатая отжимается, но...! Если я нажимаю на нажатую кнопку, то она тоже отжимается.
Как сделать, чтобы нажимались только отжатые кнопки, а при нажатии на нажатую она не реагировала? Т.е. как сделать переключатель, в котором одна кнопка обязательно должна быть нажата?

pan2000

  • Постоялец
  • ***
  • Сообщений: 170
    • Просмотр профиля
Re: Вопросы по скриптам в Simple-Scada 2
« Ответ #569 : 19 Января 2018, 17:55:30 »
Victor_P., эги  кнопок по значениям битов: 1, 2, 4, 8, 16. Обработчик событий OnClick и OnMouseUp:
Код: (delphi)
Val.Value := Sender.Tag;
Первый изменяет вид кнопки при нажатии, а второй - фиксирует нажатую кнопку.
Пример во вложении. Обратите внимание на возможность любой исходной комбинации включенных кнопок (!).
« Изменён: 26 Мая 2018, 10:15:00 от Simple-Scada »