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

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

Автор Тема: Скрипт для дискретных входов  (Прочитано 1978 раз)

SeraX

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Скрипт для дискретных входов
« : 05 Марта 2024, 12:14:59 »
Доброго времени суток!
Имеется проект диспетчеризации (на скрине), там при подаче 1 на di 1 на выходе появляется 1, на di 2 - 2, на di 3 - 4, на di 4 - 8, на di 5 - 16, на di 6 - 32,....на di 16 - 32768. В проекте Scada сделал скрипты на каждую переменную (на скрине пример на di 16), по отдельности, когда сигнал подается на только на 1 вход, работает без нареканий, а когда подается сразу на несколько входов, то, естественно, ничего не работает, т.к. все числа суммируются.
Можете подсказать какой-нибудь скрипт для решения этой задачи, или предложить какой-нибудь другой вариант?
Заранее спасибо!
« Изменён: 05 Марта 2024, 12:50:04 от Simple_Scada »

AlexejKa38

  • Новичок
  • *
  • Сообщений: 21
    • Просмотр профиля
Re: Скрипт для дискретных входов
« Ответ #1 : 05 Марта 2024, 12:26:47 »
Можно использовать функцию GetBit.

https://simple-scada.com/help/script/getbit.html?q=getbit

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Скрипт для дискретных входов
« Ответ #2 : 05 Марта 2024, 12:46:24 »
Здравствуйте.

Цитировать
В проекте Scada сделал скрипты на каждую переменную
Вместо множества однотипных скриптов нужно использовать один универсальный скрипт. Примеры скриптов можно найти по ссылке. Пример универсального скрипта работы с битами можно найти по ссылке. Также, целочисленные внешние переменные можно разбить на биты и работать с каждым битом отдельно - подробнее см. по ссылке. Если не разберетесь, то пришлите текущую версию проекта на почту support@simple-scada.com и опишите, что именно требуется сделать.

teplocom

  • Новичок
  • *
  • Сообщений: 47
  • с чувством уверенности в завтрашнем дне
    • Просмотр профиля
Re: Скрипт для дискретных входов
« Ответ #3 : 05 Марта 2024, 15:43:28 »
https://simple-scada.com/help/manual/extvarbits.html
А для OPC-UA данный способ разбития на битовые переменные работает? Пробовал, не получалось.

SeraX

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Скрипт для дискретных входов
« Ответ #4 : 05 Марта 2024, 15:45:58 »
У меня OPC DA. Всего одна сетевая переменная, которая работает на 16 входов по числу, по одному входу включается норм, но два и более не работает, т.к. числа суммируются по входам...
Проще на проекте показать, чем объяснить...проект во вложении...
« Изменён: 05 Марта 2024, 16:19:52 от Simple_Scada »

pan2000

  • Постоялец
  • ***
  • Сообщений: 210
    • Просмотр профиля
Re: Скрипт для дискретных входов
« Ответ #5 : 06 Марта 2024, 04:39:50 »
  Здравствуйте.

Переменная Work_and_alarm состоит из набора отдельных битов, логическая функция GetBit возвращает значение отдельно бита из переменной по его номеру.
Всё множество скриптов проекта можно заменить на один универсальный, параметром которого будет свойство Tag объекта, которое должно быть номером бита конкретного объекта.
Далее выбрать все объекты, к которым применяется скрипт, и связать его с событием OnDataChange. А вот свойство Tag прийдется править для каждой группы (в проекте по два объекта) индивидуально.
Код: (delphi)
begin
  if Sender is TM_Object then         // проверяем, что Sender это объект
    with Sender as TM_Object do       // приводим Sender к типу "TM_Object"
      Visible := GetBit(AsInt, Tag);  // показать/скрыть объект
end.

Проект с исправлениями во вложении.

SeraX

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Скрипт для дискретных входов
« Ответ #6 : 06 Марта 2024, 08:38:54 »
Спасибо огромное!!!