Стартовая страница › Форумы › Вопросы без категории › Передача выбранных значений перечисления
- В этой теме 19 ответов, 4 участника, последнее обновление 1 год, 7 месяцев назад сделано Mikhail.
-
АвторСообщения
-
04.09.2022 в 18:18 #24756manjey73Участник
На данный момент перечисления выглядят так
Выкл; Вкл; Авто; Ручн и будет переданы значения 0, 1, 2, 3 в зависимости что мы выберем.
Насколько сложно реализовать в системе такую комбинациюВыкл = 256; Вкл = 512; Авто = 100; Ручн = 200 и в случае если мы передаем число 150, чтобы оно проскочило как есть ?
числа это только пример.
04.09.2022 в 20:48 #24757a80808УчастникА если в дорасчетном канале поделить это на 100 с округлением и уже анализировать что получилось?
04.09.2022 в 21:31 #24758manjey73УчастникЦифры абсолютный пример, например надо такие комбинации передавать
0x02 — Aux Heat (Turbo), 0x00 — norm, 0x01 — ECO Mode (sleep), 0x04 — SWING, 0x88 VENT
А в этом случае допускаются суммы этих чисел
Sum of: 0x01 — 15min, 0x02 — 30min, 0x04 — 1h, 0x08 — 2h, 0x10 — 4h, 0x20 — 8h, 0x40 — 16h 0x80 — invalidНе знаю, как реализовано сейчас в Scada, если парсингом строки, то чтобы не переделывать существующее сделать новое и добавить например префикс, скажем решетку
# per1 = 0x20; per2 = 0x30
# Выкл = 0; Вкл = 10; Авто = 3Что-то типа этого, но при этом с возможностью передавать промежуточные числа, если это требуется.
Промежуточные значения можно было бы отправлять через дорасчетный канал с формулой SetVal(Канал управления, Cmd) — Канал управления здесь Output канал, в котором указана команда перечисления.з.ы. для 5-й версии даже не прошу 🙂
05.09.2022 в 09:52 #24775MikhailМодераторПонадобится формула в таблице Формулы.
Сделать блок if на значения от 0 до 3, возвращая нужный результат, а остальные значения команд передавать как есть без изменения.05.09.2022 в 09:53 #24776MikhailМодераторИли сделать 2 канала управления — один с формулой, а другой как есть.
05.09.2022 в 10:24 #24786manjey73УчастникХотелось бы комбинацию из коробки 🙂
Вариант с if несколько не проходит, по той простой причине, что 3 это не 3 вовсе, точнее эта 3 должна проскочить в обход перечисления, так как в перечислениипер1 = 0; пер2 = 1; пер3 = 2; пер4 = 4; пер5 = 8
Если сюда попадет 3 то в обычном понимании 3 это что? таки 3 или пер4 ?
Второй канал выход, но больше как колхоз выглядит
05.09.2022 в 10:31 #24787manjey73УчастникСмысл дополнительного функционала перечисления получить аналогию
public enum Timers { m15 = 0x01, m30 = 0x02, h1 = 0x04, h2 = 0x08, h4 = 0x10, h8 = 0x20, h16 = 0x40, invalid = 0x80 } public byte timers(int timer) { byte _timer = (byte)timer; switch (timer) { case 0: _timer = 0x00; break; case 1: _timer = 0x01; break; case 2: _timer = 0x02; break; case 3: _timer = 0x04; break; . . . . . . . . . . . case 7: _timer = 0x80; break; } return _timer; }
В качестве окна команды гибрид — Кнопки + окно ввода числа. Что тут на IF сравнивать ? 7 это не 7 вовсе, а 0x80 (при чем передавать его даже не требуется 🙂 а надо передать 7, 5, 3 как отдельные числа.
Опять же, это все примеры, уже не раз сталкиваюсь с необходимостью использовать подобные комбинации, где значения кнопок должны быть одни, при этом отправлять промежуточные значения…
05.09.2022 в 13:31 #24797JurasskParkУчастникА почему нельзя перечислить и написать unknown или rezerv?
пер1 = 0; пер2 = 1; пер3 = 2; unknown = 3; пер4 = 4; unknown = 5; unknown = 6, unknown = 7, пер5 = 805.09.2022 в 17:57 #24798manjey73УчастникВы не представляете сколько там бывает комбинаций.
Перечисление в Scada дают только один вариант 0, 1, 2, 3, 4 и далее последовательно.
Можно пропустить пару кнопок сделав пустые ;;;per3;per4 тогда в окне команд не будет 0,2,3 Но пропуски в приборах бывают куда значительнее.
Ну и как в данном варианте можно еще суммировать значения, комбинируя штатными значениями…05.09.2022 в 18:09 #24803manjey73УчастникМихаил, можно ссылку на место кода, где сервер смотрит перечисление ?
05.09.2022 в 19:00 #24805a80808УчастникНо пропуски в приборах бывают куда значительнее.
я делал перечисления по направлению ветра — от стольки то гадусов до стольки то — север, от стольки то до стольки — северо-запад и т.п.
Написал формулу со структурой case и в зависимости от «попадания» в диапазон она возвращала от нуля до семи. Ну и перечисления соответствующие написал…05.09.2022 в 19:46 #24809manjey73УчастникА пример можно? Тут просто одно дело когда мы посылаем число это чуть северо-западнее, чем северо-запад может и прокатит, но для устройства, под которое делается драйвер это может оказаться критической ошибкой.
05.09.2022 в 21:40 #24810a80808УчастникВот формула (склероз, оказывается банальный if 🙂
double WindDirect(double direct)
{
double index = 0;
if (direct < 20 || direct >= 340)
{
index = 1;
}
if (direct < 65 && direct >= 20)
{
index = 2;
}
if (direct < 115 && direct >= 65)
{
index = 3;
}
if (direct < 160 && direct >= 115)
{
index = 4;
}
if (direct < 200 && direct >= 160)
{
index = 5;
}
if (direct < 245 && direct >= 200)
{
index = 6;
}
if (direct < 295 && direct >= 245)
{
index = 7;
}
if (direct < 340 && direct >= 295)
{
index = 8;
}
return index;
}
А это размерности (котороткая и длинная — не помню уже зачем так было):
————————————————————————
! Наименование ! Обозначение
———————————————————————-
!Направл.ветра ! (!!!); (С); (СВ); (В); (ЮВ); (Ю); (ЮЗ); (З); (СЗ)
———————————————————————-
ветер направление ! Северный; Северо-восточный; Восточный; Юго-восточный; Южный; Юго-западный; Западный; Северо-западный
ветер направление05.09.2022 в 21:43 #24811a80808УчастникТаблица:
————————————————————————————————————————
! Наименование ! Обозначение
———————————————————————————————————————
!Направл.ветра ! (!!!); (С); (СВ); (В); (ЮВ); (Ю); (ЮЗ); (З); (СЗ)
———————————————————————————————————————
!ветер направление ! Северный; Северо-восточный; Восточный; Юго-восточный; Южный; Юго-западный; Западный; Северо-западный06.09.2022 в 11:14 #24826manjey73УчастникЭто немного не то, мы все так же при передаче команд получим некоторые индексы.
Это больше для приема.Идея в другом. Вполне устроит чуть более усовершенствованный вариант для команд.
Выкл = 5; Вкл = 12; Авто = 27; Ручн = 38
То есть Scada при открытии окна команд отправит в зависимости от нажатой кнопки строго типизированное значение без необходимости накладывать еще и формулы поверх обычного перечисления 0, 1, 2, 3. Тогда дополнительным каналом Output можно будет туда же отправлять произвольные значения.
А зная это перечисление драйвер пропустит произвольное значение и обработает его.
Хотя надо попробовать с формулой в канале + дополнительный канал управления…
Просто в варианте где мы можем присваивать значения потом меньше телодвижений…
А если еще и в Web будет форма окна «Кнопки» + ввод так вообще упростит задачу… -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.