Стартовая страница › Форумы › Понять, как работает ПО › Отправка команд через каналы
- В этой теме 10 ответов, 3 участника, последнее обновление 1 год, 3 месяца назад сделано
Mikhail.
-
АвторЗаписи
-
08.04.2025 в 00:06 #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 на устройство
Заранее благодарю за разъяснение
08.04.2025 в 00:10 #37988akofor@mail.ru
Участникhttps://docs.google.com/drawings/d/1_kupYFPO0VkACthA6b11b4GrqAlXQ9djuKzSGRrnQg0/edit?usp=sharing
Вот для наглядности как это все выглядит. Первый тег — рандомно сгенерированные значения, второй тег — задается командой
-
Ответ изменён 1 год, 3 месяца назад пользователем
akofor@mail.ru.
08.04.2025 в 09:03 #37990
manjey73УчастникВам нужно отправлять по любому каналу драйвера? Вроде же у вас все отправилось.
В логе — Команды всего/ошибок 1/0
ну и в журнале указана последняя командаПри выборе команды вы выбрали 1 и Set — сработает только Set, так как не является пустым.
-
Ответ изменён 1 год, 3 месяца назад пользователем
manjey73.
08.04.2025 в 09:09 #37992akofor@mail.ru
УчастникДа, эту команду (Set) я отправлял через коммуникатор. Но меня интересует, как отправлять команды через выходные каналы (и, соответственно, через веб-станцию)
08.04.2025 в 09:11 #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(); }как-то так. То есть вы можете проверить что у вас за команда, какой тип команды — строка/число и так далее. И принимать те или иные решения в коде драйвера.
Ну и чтобы команду отправлять из таблиц или мнемосхемы она должна быть Выходной в том числе.08.04.2025 в 09:13 #37994
manjey73УчастникТак аналогично. создайте канал с типом Выходной, пропишите в ней Код Тега «Set», номер указывать не надо. И привяжите к устройству (ваш драйвер) и все.
Формат команды — чиcло (D, D.D, D.DD) ну и другие числовые типы.
-
Ответ изменён 1 год, 3 месяца назад пользователем
manjey73.
08.04.2025 в 10:47 #37996akofor@mail.ru
УчастникА если я хочу сделать канал вида «входной/выходной»? Как избежать конфликта между кодом тега устройства и кодом тега команды?
08.04.2025 в 11:36 #37997
manjey73УчастникТак это все в коде драйвера. На вход вы подаете из драйвера в методе Session, а команду посылаете в методе SendCommand
А там вы уже творите
черное🙂 можете предварительно перечитать переменную, или сразу записать и так далее.08.04.2025 в 12:02 #37998akofor@mail.ru
УчастникПо итогу разобрался, видимо действительно, чтобы канал типа входной/выходной мог как отображать значения тега устройства, так и отправлять команды, нужно чтобы коды тега и коды команды (строковые) совпадали. Ну и в коде драйвера прописать что код команды равен коду тега, и там уже реализовать логику
08.04.2025 в 12:29 #37999
manjey73УчастникДа, в драйвере вы можете переопределять выполнение в зависимости от кода тега.
Но есть нюанс, код тега можно и сменить в БД. тут либо жестко говорить, что для тех или иных команд код тега должен быть таким-то и таким-то.08.04.2025 в 13:04 #38000
MikhailМодераторДобрый день!
Для каналов типа Входной/выходной считаем что код тега и код команды совпадают. В общем-то, это логично.Когда команда подаётся через канал, Сервер на основе свойств канала формирует команду для Коммуникатора, то есть дописывает номер устройства, код команды и рассчитывает значение по выходной формуле.
-
Ответ изменён 1 год, 3 месяца назад пользователем
-
АвторЗаписи
- Для ответа в этой теме необходимо авторизоваться.