Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Подстановка значения в переменную
- В этой теме 58 ответов, 5 участников, последнее обновление 1 год, 1 месяц назад сделано
fergus2022.
-
АвторСообщения
-
11.10.2022 в 09:15 #25367
fergus2022
Участник» Если значение нужно установить в 105 канал, тогда SetVal(105, Сmd). » — поменял, всё равно в переменную 105 «Znach» ничего не приходит. Я правильно вообще по каналам то сделал ?
>скриншот раз<
>скриншот два<11.10.2022 в 09:54 #25368fergus2022
Участник105 заменил на 201 в формуле, все равно не работает
11.10.2022 в 10:18 #25369Romiros
УчастникКакое значение нужно получить в канале 201 от переключателя? Возможно нужно написать в формуле cmd+1. Лучше делайте каналы в которые нужно отправить значение и каналы управления с одинаковыми номерами, тогда можно использовать CnlNum в формуле.
11.10.2022 в 11:00 #25370manjey73
Участник@fergus2022 во входном канале необходимо указывать, какой канал выходной
11.10.2022 в 11:05 #25371fergus2022
УчастникЕсть допустим 3 канала входных. И сегодня:
1 канал — датчик температуры (значение с него)
2 канал — датчик давления
3 канал — датчик расхода.
Завтра приборы переподключат к примеру и станет вот так:
1 канал — датчик давления
2 канал — датчик температуры.
Соответственно в скаде нужно поменять отображение данных, чтобы если на 1-ом канале стоит датчик температуры, то и в скаде в графе «температура» отбражались данные с 1-го канала. Как это реализовать ?По скольку выпадающего меню в схемах нет (очень жаль), то как можно сделать выбор ? Пробовал с помощью переключателя, но это некрасиво и не работает..
11.10.2022 в 11:15 #25372fergus2022
УчастникКакое значение нужно получить в канале 201 от переключателя?
Переключатель должен подставлять цифры от » 101 TEG1 или от 102 TEG2 или от 103 TEG3 » в виртуальную переменную 201 «znach» и эта переменная будет отображаться в скаде. Для каждого тега свой переключатель.
Выше я описал всю задачу. Можно и не переключателем. Было бы удобнее раскрывающийся список сделать как здесь: >скриншот<-
Этот ответ был изменен 1 год, 1 месяц назад от
fergus2022.
11.10.2022 в 11:22 #25374manjey73
УчастникВы можете в расчетном канале сделать перечисление
Температура; Давление; Расход — это будут значения 0, 1 и 2
Соответственно использовать данное перечисление и для командыВ другом дорасчетном канале использовать формулу, если 0, то вытянуть Температуру, если 1 то давление, если 2 то Расход
Правда вам придется отключить в этом канале единицы измерения.
11.10.2022 в 11:24 #25375fergus2022
УчастникВы можете в расчетном канале сделать перечисление
Температура; Давление; Расход — это будут значения 0, 1 и 2
Соответственно использовать данное перечисление и для командыкак это делается ? Я пока вообще не понимаю что тут зачем и куда в этой скаде..
-
Этот ответ был изменен 1 год, 1 месяц назад от
fergus2022.
11.10.2022 в 11:51 #25379fergus2022
УчастникselectCnlNum105 — так правильно ? (из формулы на первой странице этой темы)
или надо вот так selectCnl105 ?11.10.2022 в 12:05 #25381fergus2022
Участниккогда в справочник «формулы» добавляю
public double MyTemp(int selectCnl105) { int n = (int)Val(selectCnl105); if (n == 0) return Val(101); else if (n == 1) return Val(102); else if (n == 2) return Val(103); }
то сервер и коммуникатор сваливаются в ошибку какую то. Если формулу удалить — всё в норме становится
11.10.2022 в 12:26 #25382manjey73
Участникint selectCnl105 — это просто ИМЯ переменной, можете обозвать как угодно и это имя использовать внутри формулы…
например SelectParameter — переменная номера канала, в котором у вас находится параметр Температуры, Давления или Расхода
Сваливается из-за некорректности формулы видимо ? Скорее всего что return запихнуты в if, или скорее всего, что вы значение канала превращаете в int в переменной n…
public double MyTemp(int selectCnl) { if (Val(selectCnl) == 0) return Val(101); else if (Val(selectCnl) == 1) return Val(102); else if (Val(selectCnl) == 2) return Val(103); }
Если с return не прокатит, смотрите какую ошибку пишет в логах.. То сделать промежуточную double переменную.
public double MyTemp(int selectCnl) { double val; if (Val(selectCnl) == 0) val = Val(101); else if (Val(selectCnl) == 1) val = Val(102); else if (Val(selectCnl) == 2) val = Val(103); return val; }
11.10.2022 в 12:28 #25383manjey73
УчастникВыпадающие списки были бы прикольной штукой иногда. Но тут то 3 параметра можно было и в столбик на каждом объекте сделать. Не тот случай вроде, чтобы извращаться…
11.10.2022 в 12:55 #25384fergus2022
Участникимена переменных «perech» — для значений 0,1,2.
znach — тут должны цифры с датчика выводиться с нужного канала (0,1 или 2 что выберет оператор ).public double MyTemp(int selectznach) { if (Val(selectperech) == 0) val = Val(101); else if (Val(selectperech) == 1) val = Val(102); else if (Val(selectperech) == 2) val = Val(103); return val; }
сервер и коммуникатор в ошибке при такой формуле.
public double MyTemp(int selectznach) { double val; if (Val(selectperech) == 0) val = Val(101); else if (Val(selectperech) == 1) val = Val(102); else if (Val(selectperech) == 2) val = Val(103); return val; }
тоже самое всё в ошибке.
из лога:
2022-10-11 14:54:52 <ASUTP3><СИСТЕМА><ERR> Ошибка при компилировании исходного кода формул: Строка 517, колонка 11: error CS0103: Имя "selectznach" отсутствует в текущем контексте Строка 519, колонка 16: error CS0103: Имя "selectznach" отсутствует в текущем контексте Строка 521, колонка 16: error CS0103: Имя "selectznach" отсутствует в текущем контексте Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs 2022-10-11 14:54:52 <ASUTP3><СИСТЕМА><ERR> Нормальная работа программы невозможна
-
Этот ответ был изменен 1 год, 1 месяц назад от
fergus2022.
11.10.2022 в 13:00 #25386fergus2022
УчастникВыпадающие списки были бы прикольной штукой иногда. Но тут то 3 параметра можно было и в столбик на каждом объекте сделать. Не тот случай вроде, чтобы извращаться…
нужна компактность для отображения на смартфоне
11.10.2022 в 13:14 #25387fergus2022
УчастникПри таком коде:
public double MyTemp(int selectperech) { int n = (int)Val(selectperech); if (n == 0) return Val(101); else if (n == 1) return Val(102); else if (n == 2) return Val(103); }
в логе ошибка:
2022-10-11 15:12:21 <ASUTP3><СИСТЕМА><ACT> Формулы считаны из базы конфигурации 2022-10-11 15:12:21 <ASUTP3><СИСТЕМА><ERR> Ошибка при компилировании исходного кода формул: Строка 514, колонка 15: error CS0161: "Scada.Server.Engine.CalcEngine.MyTemp(int)": не все ветви кода возвращают значение Для ознакомления с исходным кодом см. файл C:\SCADA\ScadaServer\Log\CalcEngine.cs
Что не так опять ?
-
Этот ответ был изменен 1 год, 1 месяц назад от
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.