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

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

Автор Тема: Simple-Scada 2: как скриптом достучаться до шкалы?  (Прочитано 12792 раз)

valik84

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Проблема заключается в следующем, в Simple-Scada 2 (demo), нужно вывести 8 аналоговых сигналов, которые будут идти напрямую, без контроллера, прям от модбас-модуля аналоговых сигналов, через OPC-сервер на Simple-Scada 2 (demo). Для этого мне нужно сделать функцию масштабирования аналогового сигнала. В принципе она есть в OPC-сервере, но мне хочется что бы все преобразования происходили в Simple-Scada, мне кажется что таким образом работа с системой мониторинга будет более оперативнее. Для чего нужна функция масштабирования аналогового сигнала, допустим известно что от модуля аналоговых сигналов, информация приходит в диапазоне значений от 0 до 27648, где 0 это 4мА(0%), а 27648 это 20мА(100%), мне нужно значения модуля преобразовать в значения физической величины, допустим температуры, где 0 это будет 5°С, а 27648 это будет 50°С, для этого и применяется функция масштабирования. В Simple-Scada 2 (demo) эту функцию реализовать в принципе легко с помощью скриптов, но от шкалы многое что зависит, это и отображение цифрового значения и отображение трендов, а хотелось бы, что б поменял границу физической величины, сразу автоматом поменялось отображение числа и графика, то есть мне нужно границу физической величины привязать к шкале. Ведь может получиться так что я настрою шкалу +5..+50, а в дальнейшем нужно будет -50..+150, то все что будет выходить за диапазон +5..+50, в таком случае, отображаться не будет.
Вообщем вопрос такой можно в Simple-Scada 2 (demo), с помощью скриптов изменять минимум и максимум шкалы?
Данные функции масштабирования я оформил в виде таблички и написал скрипт для этой таблички, всё работает, но из-за шкалы система получается несовершенной.
Код
//Скрипт "D1_T_OnDataChange":
//D1_T - значение периферии;
//sD1_T - значение тока;
//fD1_T - значение физической величины;
//fD1_T_MAX - максимум физической величины;
//fD1_T_MIN - минимум физической величины;

begin
  sD1_T.Value := (D1_T.Value / 27648) * 16.0 + 4.0;
  fD1_T.Value := (D1_T.Value / 27648) * (fD1_T_MAX.Value - fD1_T_MIN.Value) + fD1_T_MIN.Value;
end.
« Изменён: 29 Мая 2016, 22:18:32 от valik84 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Обратите внимание, что Вам может быть полезна функция Scaling (она есть в скриптах), которая переводит значение из одной шкалы в другую. В неё передаются 5 параметров. Первые два - это максимум и минимум входной шкалы. Вторые два параметра - это максимум и минимум выходной шкалы. И последний параметр это входное значение, которое нужно привести к выходной шкале. Например:
Код
MyVariable.Value := Scaling(InMax, InMin, OutMax, OutMin, MyValue);
т.е. берется значение  "MyValue", в шкале от "InMin" до "InMax" и переводится в шкалу от "OutMin" до "OutMax".

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

valik84

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Небольшое уточнение, границы шкалы не влияют на отображение числа в ячейках таблицы (Прошу прощения за неточную информацию). Числа в ячейках таблицы корректно отображаються даже если диапазон переменной выйдет за границы диапазона шкалы. Числа в ячейках подрезаються те что по умолчанию, когда работаешь в Editor.exe, но на отображение реальных значений в Client.exe это никак не влияет. Границы шкалы влияют только на отображения трендов, на те что встраиваються в мнемосхемы и на те для которых есть специальное окно, где тренды формируются по группам. Если диапазон переменной тренда выйдет за границы диапазона шкалы, тренд будет обрезан по диапазону шкалы.

За функцию "Scaling" спаибо большое, не знал что такая есть, очень полезная вещь.
Мой скрипт с функцией "Scaling" приймет следующий вид:
Код
//Скрипт "D1_T_OnDataChange":
//D1_T - значение периферии;
//sD1_T - значение тока;
//fD1_T - значение физической величины;
//fD1_T_MAX - максимум физической величины;
//fD1_T_MIN - минимум физической величины;

begin
sD1_T.Value := Scaling(27648, 0, 20, 4, D1_T.Value);
fD1_T.Value := Scaling(27648, 0, fD1_T_MAX.Value, fD1_T_MIN.Value, D1_T.Value);
end.
« Изменён: 29 Мая 2016, 22:23:26 от valik84 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
valik84, как Вы правильно заметили границы влияют на отображение временных и постоянных трендов, на объект Шкала и шкалу объекта Уровень, а также не дают пользователю записать в переменную значение вне границ. При этом значения отображаемые в Полях никак не ограничиваются шкалой. Ведь многие пользователи хотят видеть в Полях реальные значения (без ограничений по шкале). Для примера: отображается уровень жидкости (0-100%) в сборнике. И этот уровень вышел на границу максимума на 5%. В этом случае пользователь увидит в поле значение 105 и будет понимать, что уровень превышен именно на 5 процентов, а не на 20 (просто пример). Если бы эти значения ограничивались шкалой, то пользователь постоянно видел бы значение 100 и не понял бы насколько уровень выше максимума, что снижает информативность.

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

valik84

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Нет, не делайте такую опцию (это будет лишним). Вы правы насчет того что границы шкалы снижают информативность.

valik84

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Simple-Scada 2.0.1.2. Вопрос по теме шкал и масштабирования. В контролерах Siemens S7-300 есть тип данных TIME это 32-х битное число, элементарное значение этого числа одна миллисекунда.
Минимальное значение числа TIME: -2 147 483 648 мс (TIME#-24d20h31m23s647ms).
Максимальное значение числа TIME: +2 147 483 647 мс (TIME#24d20h31m23s647ms).
Если выводить это число без преобразований в Simple-Scada 2, то получается следующая картина, для числа TIME#10s, Simple-Scada 2 покажет число 10 000 мс. В основном я всегда работаю с секундами, с миллисекундами еще не приходилось работать, разве что когда надо было определить время исполнения программы, но это единичные случаи, по этому лишние нули в представлении числа мне не нужны. В Simple-Scada 2 есть возможность убрать лишние нули через меню: Переменные=> Редактировать=> Изменить переменную=> Дополнительные=> Смещение запятой. Я поставил здесь -3 и представление чисел TIME изменилось, так как мне нужно, на секунды, а не миллисекунды. Но если я, вовремя мониторинга, пытаюсь ввести в поле ввода/вывода, число допустим 2 секунды, то в контроллер вносится значение TIME#100ms (Без разницы что ввожу 2, что ввожу 2.0). Можно ввести 0.1; 0.01; 0.001, но больше 0.1 ввести нельзя. То есть на данный момент получается что Simple-Scada 2.0.1.2 имеет одностороннее преобразование чисел со смещением запятой, Simple-Scada 2.0.1.2 может отображать числа со смещением запятой, но не может передать обратно в контроллер число со смещенной запятой.
И скорей всего дело здесь не в преобразованиях со смещением запятой. Я попробовал задать смещение запятой 0 и 1. Получается та же самая картина больше 100 мс. задать не возможно, можно задать 50 мс., 10 мс. но больше 100 мс. задать не возможно. Пробовал давать переменной в Simple-Scada 2 определение типа данных как Single и Integer, ничего не менялось.
Ну и вопрос будет следующим, хотелось бы что б в Simple-Scada 2 была возможность не только мониторить числа формата TIME с преобразованием смещения запятой, но хочется что б Simple-Scada 2 имела возможность отсылать обратно в контроллер числа формата TIME с преобразованием смещения запятой. Если я что то не правильно делаю подскажите?
Все выше сказанное я опробовал на реальном контроллере: VIPA313-6CF03.
В качестве OPC-сервера: VIPA OPC-server v.6.
« Изменён: 28 Июля 2016, 11:26:35 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
valik84, Simple-Scada 2 использует стандартный способ работы со смещением запятой и масштабированием значений. Например есть переменная со смещением запятой равным -3. Это значит, что когда c OPC-сервера в скаду придет значение 3000, оно отобразится как 3. И наоборот, когда Вы введете в скаде значение 3, на OPC-сервер уйдёт 3000. Т.е. преобразование делается в обе стороны, что логично.

Цитировать
Но если я, вовремя мониторинга, пытаюсь ввести в поле ввода/вывода, число допустим 2 секунды, то в контроллер вносится значение TIME#100ms
Шкала переменной может ограничивать это значение. Может быть у Вас просто не выбрана шкала для переменной? Если она не выбрана, то будет взята шкала по умолчанию 0-100 и скада не позволит записать в переменную значение больше 100. Или у Вас выбрана слишком маленькая шкала. Вам ведь известно, что минимальное значение у переменной -2147483648, а максимальное 2147483647. Откройте редактор переменных и создайте новую шкалу с такими параметрами. Затем эту шкалу выставьте у переменной о которой Вы говорите. После этого значение не будет ограничиваться шкалой и все преобразования со смещением запятой должны работать как Вам нужно.
« Изменён: 28 Июля 2016, 11:28:55 от Simple-Scada »

valik84

  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Да действительно, для переменных TIME у меня стояла стандартная моя шкала "Рівень(0_100)", когда я поменял шкалу на "TIME(0_2147483647)", всё заработало. И отображаются числа TIME, и вводятся теперь корректно, даже со смещением запятой. Спасибо большое, не доглядел.
« Изменён: 28 Июля 2016, 11:52:52 от valik84 »