Проблема заключается в следующем, в 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.
Обратите внимание, что Вам может быть полезна функция Scaling (она есть в скриптах), которая переводит значение из одной шкалы в другую. В неё передаются 5 параметров. Первые два - это максимум и минимум входной шкалы. Вторые два параметра - это максимум и минимум выходной шкалы. И последний параметр это входное значение, которое нужно привести к выходной шкале. Например:
MyVariable.Value := Scaling(InMax, InMin, OutMax, OutMin, MyValue);
т.е. берется значение "MyValue", в шкале от "InMin" до "InMax" и переводится в шкалу от "OutMin" до "OutMax".
По поводу изменения шкалы. Возможно мы сможем добавить такую возможность в ближайшее время. Завтра проверим насколько сложная это задача и напишем о результатах.
Небольшое уточнение, границы шкалы не влияют на отображение числа в ячейках таблицы (Прошу прощения за неточную информацию). Числа в ячейках таблицы корректно отображаються даже если диапазон переменной выйдет за границы диапазона шкалы. Числа в ячейках подрезаються те что по умолчанию, когда работаешь в 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.