Стартовая страница › Форумы › Понять, как работает ПО › Формулы › Не работает формула с 2-мя байтами
- В этой теме 10 ответов, 2 участника, последнее обновление 9 лет назад сделано
Mikhail.
-
АвторСообщения
-
08.06.2017 в 11:29 #6052
manjey73Участник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 #6053
manjey73УчастникВ общем ситуация такая. Есть 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 #6063
MikhailМодераторПопробуйте в этой формуле заменить массив байт на 0x01…0x08 и посмотреть, какие байты в итоге появятся в пакете Модбас.
09.06.2017 в 11:26 #6072
manjey73УчастникСделал, прописал в массив байты с увеличением на 1.
В логе Коммуникатора все равно летят нули…09.06.2017 в 14:32 #6074
MikhailМодераторСтранно. Какое значение команды отображается на странице Данные КП?
Есть ли в общем логе Коммуникатора какие-либо ошибки?09.06.2017 в 16:37 #6079
manjey73УчастникОшибок при этом нет, плата воспринимает команду и отвечает тем же ответом.
Я еще раньше пытался эту формулу применить на Овене, дома 2 переменных с одним регистром, результат был тем же, писало нули.В Данные КП тоже нули
-
Ответ изменён 9 лет назад пользователем
manjey73.
09.06.2017 в 16:48 #6081
manjey73УчастникЕсли в формуле стоит 1*256 то плата срабатывает, в данных КП соответствующее значение и плата возвращает точно такое же значение.
То есть явно что-то либо с формулой, хотя она работает прекрасно в Visual Studio либо в коде самой SCADA, что она не берет значения а пишет нули.
11.06.2017 в 10:03 #6094
MikhailМодераторПопробовал у себя.
Формула: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 #6096
MikhailМодераторПроверил.
BitConverter.ToDouble(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, 0) даёт число double очень близкое к нулю, поэтому в событии и в данных КП оно показывается как 0.000Если в шаблоне Модбас используется Множественная команда, то Вы увидите 01 02. Если не множественная, то значение команды округляется до целого числа 0.
11.06.2017 в 12:09 #6100
manjey73УчастникТак а почему оно округляется, так же не должно быть ?
13.06.2017 в 13:01 #6125
MikhailМодераторДля Write Single Register это нормально, т.к. передаётся целое число 2 байта.
-
Ответ изменён 9 лет назад пользователем
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.