Стартовая страница › Форумы › Понять, как работает ПО › Использование формул › Не работает формула с 2-мя байтами
- В этой теме 10 ответов, 2 участника, последнее обновление 6 лет, 10 месяцев назад сделано Mikhail.
-
АвторСообщения
-
08.06.2017 в 11:29 #6052manjey73Участник
double SwapCmd()
{
ushort val = (ushort)Cmd;
byte[] buf = BitConverter.GetBytes(val);
return BitConverter.ToDouble(new byte[] { buf[1], buf[0], 0, 0, 0, 0, 0, 0 }, 0);
}Данная предложенная формула не работает в SCADA, как бы не переставлял байты (в какую позицию бы не тыкал)
При этом в Visual Studio она прекрасно отрабатывает, делал имитацию.Может не лады какие в самом коде SCADA, что он не может потом с 2-мя байтами справиться ?
Смотрю по отправке в логе Коммуникатора, всегда 00 00 отправляется.08.06.2017 в 12:27 #6053manjey73УчастникВ общем ситуация такая. Есть 8 канальное реле с управлением по Modbus RTU.
https://ru.aliexpress.com/item/8-Channel-DC-12V-RS485-Relay-Module-Modbus-RTU-485-Remote-Control-Switch-for-PLC-PTZ/32769685000.htmlБинарные команды не принимает в любом виде, не зависимо от количества байт.
0100, 00000100 и другие комбинации. Коммуникатор пишет недопустимая команда.Запрос на включение канала реле должно выглядеть так
02 06 00 01 01 00 D9 A9
Выключение
02 06 00 01 02 00 D9 59Адрес устройства 2, Holding Registr, 01 00 (256 дес) и CRC включает
02 00 (512) соответственно выключает.
Следующий регистр соответственно следующее реле.Если в Коммуникаторе подавать Стандартной командой 256 и 512 то все работает.
Так же работает из Scada (указал формулу CmdVal*256) и подаю 1 или 2 стандартной командой.
Но вот с переворотом байт, применяя Стандартную команду полный игнор, всегда отправка по нулям.Пока нет возможности проверить вышеприведенную формулу на float с ПЛК Овен, возможно она заработает как надо, но вот с двухбайтными ни как…..
08.06.2017 в 16:34 #6063MikhailМодераторПопробуйте в этой формуле заменить массив байт на 0x01…0x08 и посмотреть, какие байты в итоге появятся в пакете Модбас.
09.06.2017 в 11:26 #6072manjey73УчастникСделал, прописал в массив байты с увеличением на 1.
В логе Коммуникатора все равно летят нули…09.06.2017 в 14:32 #6074MikhailМодераторСтранно. Какое значение команды отображается на странице Данные КП?
Есть ли в общем логе Коммуникатора какие-либо ошибки?09.06.2017 в 16:37 #6079manjey73УчастникОшибок при этом нет, плата воспринимает команду и отвечает тем же ответом.
Я еще раньше пытался эту формулу применить на Овене, дома 2 переменных с одним регистром, результат был тем же, писало нули.В Данные КП тоже нули
- Этот ответ был изменен 6 лет, 10 месяцев назад от manjey73.
09.06.2017 в 16:48 #6081manjey73УчастникЕсли в формуле стоит 1*256 то плата срабатывает, в данных КП соответствующее значение и плата возвращает точно такое же значение.
То есть явно что-то либо с формулой, хотя она работает прекрасно в Visual Studio либо в коде самой SCADA, что она не берет значения а пишет нули.
11.06.2017 в 10:03 #6094MikhailМодераторПопробовал у себя.
Формула:double TestFunc() { return BitConverter.ToDouble(new byte[] { 0, 0, 0, 0, 0, 0, 0xf0, 0x3f }, 0); }
Возвращает 1.
Но return BitConverter.ToDouble(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, 0); не работает. Буду смотреть подробнее.
11.06.2017 в 11:16 #6096MikhailМодераторПроверил.
BitConverter.ToDouble(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, 0) даёт число double очень близкое к нулю, поэтому в событии и в данных КП оно показывается как 0.000Если в шаблоне Модбас используется Множественная команда, то Вы увидите 01 02. Если не множественная, то значение команды округляется до целого числа 0.
11.06.2017 в 12:09 #6100manjey73УчастникТак а почему оно округляется, так же не должно быть ?
13.06.2017 в 13:01 #6125MikhailМодераторДля Write Single Register это нормально, т.к. передаётся целое число 2 байта.
-
АвторСообщения
- Вы должны авторизироваться для ответа в этой теме.