Отправка команд через каналы

Стартовая страница Форумы Понять, как работает ПО Отправка команд через каналы

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Записи
  • #37987
    akofor@mail.ru
    Участник

    Не нашел внятной информации, как отправлять команды на устройства, используя каналы

    Через коммуникатор команду отправить можно, но хотелось бы чтобы было возможно сделать это через окно вебстанции (на схеме или в таблице)

    Создал драйвер чтобы поиграться, в коде прописал следующее:

    public override void SendCommand(TeleCommand cmd)
    {
    base.SendCommand(cmd);

    if (cmd.CmdCode == «Set» || cmd.CmdNum == 1) //command code set or 1
    {
    var value = cmd.CmdVal;
    Log.WriteLine($»Получено значение от команды: {value}»);
    DeviceData.Set(1, value);
    }

    FinishCommand();
    }

    Каким именно образом я могу настроить выходной канал, чтобы я мог из вебстанции отправлять команды на это «устройство» и ставить ему соответствующие значения?

    Со входными каналами понятно, там выбираешь устройство и соответствующий номер или код тега устройства, добавляешь канал в таблицу и значение отображается. Но что и куда писать при настройке выходных каналов, не понятно, чтобы, например, канал отправлял команду с кодом Set (или с номером 1) и значением 123 на устройство

    Заранее благодарю за разъяснение

    #37988
    akofor@mail.ru
    Участник

    https://docs.google.com/drawings/d/1_kupYFPO0VkACthA6b11b4GrqAlXQ9djuKzSGRrnQg0/edit?usp=sharing

    Вот для наглядности как это все выглядит. Первый тег — рандомно сгенерированные значения, второй тег — задается командой

    • Ответ изменён 1 год, 3 месяца назад пользователем akofor@mail.ru.
    #37990
    manjey73
    Участник

    Вам нужно отправлять по любому каналу драйвера? Вроде же у вас все отправилось.
    В логе — Команды всего/ошибок 1/0
    ну и в журнале указана последняя команда

    При выборе команды вы выбрали 1 и Set — сработает только Set, так как не является пустым.

    • Ответ изменён 1 год, 3 месяца назад пользователем manjey73.
    #37992
    akofor@mail.ru
    Участник

    Да, эту команду (Set) я отправлял через коммуникатор. Но меня интересует, как отправлять команды через выходные каналы (и, соответственно, через веб-станцию)

    #37993
    manjey73
    Участник
            public override void SendCommand(TeleCommand cmd)
            {
                base.SendCommand(cmd);
                Stopwatch stopwatch = Stopwatch.StartNew();
                LastRequestOK = true;
                cmdVal = cmd.CmdVal;
                cmdCode = cmd.CmdCode; // тут получение кода команды, так же можно вытянуть и номер команды cmd.CmdNum
    
                if (cmd.CmdData != null && cmd.CmdData.Length != 0)
                {
                    // Тут проверяем если у нас отправляется строка
                    // аналогично, разбирая строку или HEX строку если в таком виде делаем команду
                    cmdVal = BitConverter.ToDouble(cmd.CmdData, 0);
                }
    
                if (!double.IsNaN(cmdVal))
                {
    // тут проверяем что у нас цифровое значение
                }
                else
                {
    // здесь проверка если не строка и не число в команде
                }
    
                stopwatch.Stop();
                Log.WriteLine(Locale.IsRussian ?
                    "Получено за {0} мс" :
                    "Received in {0} ms", stopwatch.ElapsedMilliseconds);
                FinishCommand();
            }

    как-то так. То есть вы можете проверить что у вас за команда, какой тип команды — строка/число и так далее. И принимать те или иные решения в коде драйвера.
    Ну и чтобы команду отправлять из таблиц или мнемосхемы она должна быть Выходной в том числе.

    #37994
    manjey73
    Участник

    Так аналогично. создайте канал с типом Выходной, пропишите в ней Код Тега «Set», номер указывать не надо. И привяжите к устройству (ваш драйвер) и все.

    Формат команды — чиcло (D, D.D, D.DD) ну и другие числовые типы.

    • Ответ изменён 1 год, 3 месяца назад пользователем manjey73.
    #37996
    akofor@mail.ru
    Участник

    А если я хочу сделать канал вида «входной/выходной»? Как избежать конфликта между кодом тега устройства и кодом тега команды?

    #37997
    manjey73
    Участник

    Так это все в коде драйвера. На вход вы подаете из драйвера в методе Session, а команду посылаете в методе SendCommand

    А там вы уже творите черное 🙂 можете предварительно перечитать переменную, или сразу записать и так далее.

    #37998
    akofor@mail.ru
    Участник

    По итогу разобрался, видимо действительно, чтобы канал типа входной/выходной мог как отображать значения тега устройства, так и отправлять команды, нужно чтобы коды тега и коды команды (строковые) совпадали. Ну и в коде драйвера прописать что код команды равен коду тега, и там уже реализовать логику

    #37999
    manjey73
    Участник

    Да, в драйвере вы можете переопределять выполнение в зависимости от кода тега.
    Но есть нюанс, код тега можно и сменить в БД. тут либо жестко говорить, что для тех или иных команд код тега должен быть таким-то и таким-то.

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

    Добрый день!
    Для каналов типа Входной/выходной считаем что код тега и код команды совпадают. В общем-то, это логично.

    Когда команда подаётся через канал, Сервер на основе свойств канала формирует команду для Коммуникатора, то есть дописывает номер устройства, код команды и рассчитывает значение по выходной формуле.

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Для ответа в этой теме необходимо авторизоваться.