Передача выбранных значений перечисления

Стартовая страница Форумы Вопросы без категории Передача выбранных значений перечисления

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Сообщения
  • #24756
    manjey73
    Участник

    На данный момент перечисления выглядят так

    Выкл; Вкл; Авто; Ручн и будет переданы значения 0, 1, 2, 3 в зависимости что мы выберем.
    Насколько сложно реализовать в системе такую комбинацию

    Выкл = 256; Вкл = 512; Авто = 100; Ручн = 200 и в случае если мы передаем число 150, чтобы оно проскочило как есть ?

    числа это только пример.

    #24757
    a80808
    Участник

    А если в дорасчетном канале поделить это на 100 с округлением и уже анализировать что получилось?

    #24758
    manjey73
    Участник

    Цифры абсолютный пример, например надо такие комбинации передавать

    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-й версии даже не прошу 🙂

    • Этот ответ был изменен 1 год, 7 месяцев назад от manjey73.
    • Этот ответ был изменен 1 год, 7 месяцев назад от manjey73.
    #24775
    Mikhail
    Модератор

    Понадобится формула в таблице Формулы.
    Сделать блок if на значения от 0 до 3, возвращая нужный результат, а остальные значения команд передавать как есть без изменения.

    #24776
    Mikhail
    Модератор

    Или сделать 2 канала управления — один с формулой, а другой как есть.

    #24786
    manjey73
    Участник

    Хотелось бы комбинацию из коробки 🙂
    Вариант с if несколько не проходит, по той простой причине, что 3 это не 3 вовсе, точнее эта 3 должна проскочить в обход перечисления, так как в перечислении

    пер1 = 0; пер2 = 1; пер3 = 2; пер4 = 4; пер5 = 8

    Если сюда попадет 3 то в обычном понимании 3 это что? таки 3 или пер4 ?

    Второй канал выход, но больше как колхоз выглядит

    #24787
    manjey73
    Участник

    Смысл дополнительного функционала перечисления получить аналогию

            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 как отдельные числа.

    Опять же, это все примеры, уже не раз сталкиваюсь с необходимостью использовать подобные комбинации, где значения кнопок должны быть одни, при этом отправлять промежуточные значения…

    #24797
    JurasskPark
    Участник

    А почему нельзя перечислить и написать unknown или rezerv?
    пер1 = 0; пер2 = 1; пер3 = 2; unknown = 3; пер4 = 4; unknown = 5; unknown = 6, unknown = 7, пер5 = 8

    #24798
    manjey73
    Участник

    Вы не представляете сколько там бывает комбинаций.
    Перечисление в Scada дают только один вариант 0, 1, 2, 3, 4 и далее последовательно.
    Можно пропустить пару кнопок сделав пустые ;;;per3;per4 тогда в окне команд не будет 0,2,3 Но пропуски в приборах бывают куда значительнее.
    Ну и как в данном варианте можно еще суммировать значения, комбинируя штатными значениями…

    #24803
    manjey73
    Участник

    Михаил, можно ссылку на место кода, где сервер смотрит перечисление ?

    #24805
    a80808
    Участник

    Но пропуски в приборах бывают куда значительнее.
    я делал перечисления по направлению ветра — от стольки то гадусов до стольки то — север, от стольки то до стольки — северо-запад и т.п.
    Написал формулу со структурой case и в зависимости от «попадания» в диапазон она возвращала от нуля до семи. Ну и перечисления соответствующие написал…

    #24809
    manjey73
    Участник

    А пример можно? Тут просто одно дело когда мы посылаем число это чуть северо-западнее, чем северо-запад может и прокатит, но для устройства, под которое делается драйвер это может оказаться критической ошибкой.

    #24810
    a80808
    Участник

    Вот формула (склероз, оказывается банальный 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;
    }

    А это размерности (котороткая и длинная — не помню уже зачем так было):
    ————————————————————————
    ! Наименование ! Обозначение
    ———————————————————————-
    !Направл.ветра ! (!!!); (С); (СВ); (В); (ЮВ); (Ю); (ЮЗ); (З); (СЗ)
    ———————————————————————-
    ветер направление ! Северный; Северо-восточный; Восточный; Юго-восточный; Южный; Юго-западный; Западный; Северо-западный
    ветер направление

    #24811
    a80808
    Участник

    Таблица:

    ————————————————————————————————————————
    ! Наименование ! Обозначение
    ———————————————————————————————————————
    !Направл.ветра ! (!!!); (С); (СВ); (В); (ЮВ); (Ю); (ЮЗ); (З); (СЗ)
    ———————————————————————————————————————
    !ветер направление ! Северный; Северо-восточный; Восточный; Юго-восточный; Южный; Юго-западный; Западный; Северо-западный

    #24826
    manjey73
    Участник

    Это немного не то, мы все так же при передаче команд получим некоторые индексы.
    Это больше для приема.

    Идея в другом. Вполне устроит чуть более усовершенствованный вариант для команд.

    Выкл = 5; Вкл = 12; Авто = 27; Ручн = 38

    То есть Scada при открытии окна команд отправит в зависимости от нажатой кнопки строго типизированное значение без необходимости накладывать еще и формулы поверх обычного перечисления 0, 1, 2, 3. Тогда дополнительным каналом Output можно будет туда же отправлять произвольные значения.

    А зная это перечисление драйвер пропустит произвольное значение и обработает его.

    Хотя надо попробовать с формулой в канале + дополнительный канал управления…
    Просто в варианте где мы можем присваивать значения потом меньше телодвижений…
    А если еще и в Web будет форма окна «Кнопки» + ввод так вообще упростит задачу…

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Вы должны авторизироваться для ответа в этой теме.