Стартовая страница › Форумы › Взаимодействие с устройствами › Команда записи младшего или старшего байта.
- В этой теме 43 ответа, 3 участника, последнее обновление 1 год, 7 месяцев назад сделано Yakov_4e.
-
АвторСообщения
-
12.08.2022 в 12:50 #24366Yakov_4eУчастник
Добрый день.
Добавляю в скаду контроллер Syberia v5 (GTC). Некоторые Holding регистры содержат информацию отдельно по битам, некоторые — по байтам. С помощью формул GetBit и GetByte я получаю корректные значения от устройства согласно листу переменных (например аварийные состояния (Bit) или дата/время (Byte)). С созданием каналов управления и отправки значения для записи отдельного бита проблем не возникло. Для этого использую формулу «double CmdBit(int cnlNum, int bitNum)
{
if (Cmd > 0)
{
return (ushort)Val(cnlNum) | (1<<bitNum);
}
else
{
return (ushort)Val(cnlNum) & (~(1<<bitNum));
}
}».
Сейчас осталась проблема с отправкой значения на запись одного из байтов (старшего или младшего). Поиск необходимой формулы не дал результатов.
Может кто сталкивался с такой задачей и готов поделится формулой?
Заранее спасибо.12.08.2022 в 16:40 #24373manjey73УчастникВы хотите ввести полное число а записаться должен старший или младший байт ?
и соответственно сделать два раза запись на разных каналах одним числом ?Cmd/256 и Cmd%256 в таком случае может помочь
12.08.2022 в 16:46 #24374manjey73УчастникИ наверное сперва надо примести Cmd к UInt16
12.08.2022 в 17:01 #24375Yakov_4eУчастникК примеру: в одном регистре время, часы и минуты — 0x172C (hex), или 23:44 (dec). Для этого регистра я добавил два входных канала для младшего и старшего байтов. В понедельник проверю указанные Вами команды. Спасибо.
12.08.2022 в 17:36 #24376manjey73УчастникВы хотите записать время ? Если текущее, не лучше ли сделать канал который при вводе хоть 0, хоть 1 возьмет DateTime.Now или DateTime.UtcNow и преобразует в нужное число, а команду настроить сразу на запись двух регистров ?
То есть множественная команда и формат Uint32 а полученное текущее время преобразовать в нужное число ?
12.08.2022 в 17:43 #24379Yakov_4eУчастникЭтот регистр в качестве примера. Также есть регистры недельного расписания на каждый день, реализованных аналогично. Регистры скоростей вентиляторов, и т.д. Для CMD/256 и CMD%256 необходимо добавлять формулу?
12.08.2022 в 19:31 #24380manjey73УчастникНе обязательно, возможно просто в самом канале прописать что-то типа
Convert.ToUInt16(Cmd/256) или Convert.ToUInt16(Cmd%256) — % это по идее младший байт, так как остаток.
Возможно вот так потребуется (byte)Convert.ToUInt16(Cmd/256)
12.08.2022 в 19:32 #24381manjey73Участник(byte)(Convert.ToUInt16(Cmd)/256) или так…
Для команд не тестировал именно такое, надо будет попробовать…
12.08.2022 в 19:37 #24382manjey73Участникпоследний вариант ошибки не вызывает при передачи проекта, но вот что передавать будет не знаю, не на чем проверить
15.08.2022 в 08:28 #24396Yakov_4eУчастникДобрый день.
С последними тремя формулами, при попытке отправки команды — «Команда отклонена сервером».
С формулами Cmd/256 и Cmd%256 — веб-сервер не запускается.15.08.2022 в 09:14 #24397manjey73УчастникПеренесите /256 и %256 за пределы конвертирования типа…
То есть сперва Convert.ToUInt16(Cmd)/256 и Convert.ToUInt16(Cmd)%256
Тут еще надо правильно настроить Команду в Шаблоне Modbus, так как из-за формул происходят различные преобразования.
15.08.2022 в 09:21 #24398Yakov_4eУчастникConvert.ToUInt16(Cmd%256) — записывает младший байт, но сбрасывает значение старшего в 0,
Convert.ToUInt16(Cmd/256) — обнуляет значение младшего и старшего;(byte)Convert.ToUInt16(Cmd%256) и (byte)Convert.ToUInt16(Cmd/256) — аналогично формулам выше;
(byte)(Convert.ToUInt16(Cmd)%256) и (byte)(Convert.ToUInt16(Cmd)/256) — аналогично формулам выше.
15.08.2022 в 09:25 #24399manjey73Участник15.08.2022 в 09:27 #24402manjey73УчастникИдет привидение к байту, а там нули….
Сбрасывает значение старшего при записи в прибор? тогда надо иначе, это для варианта когда по одному регистру запись. Если Мульти, сразу в два регистра надо формулу делать общую и приводить просто к UInt16
- Этот ответ был изменен 1 год, 8 месяцев назад от manjey73.
15.08.2022 в 09:27 #24403MikhailМодераторДобрый день!
1. Укажите в виде текста, по какому алгоритму должно рассчитываться отправляемое значение.
2. Напишите, какое значение команды Вы отправляете и какой результат формулы требуется получить.
3. Сделайте скриншоты
— отправляемой команды,
— используемой формулы в таблице каналов,
— отправляемого пакета в журнале линии связи. -
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.