Не работает формула с 2-мя байтами

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Сообщения
  • #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 отправляется.

    #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 с ПЛК Овен, возможно она заработает как надо, но вот с двухбайтными ни как…..

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

    Попробуйте в этой формуле заменить массив байт на 0x01…0x08 и посмотреть, какие байты в итоге появятся в пакете Модбас.

    #6072
    manjey73
    Участник

    Сделал, прописал в массив байты с увеличением на 1.
    В логе Коммуникатора все равно летят нули…

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

    Странно. Какое значение команды отображается на странице Данные КП?
    Есть ли в общем логе Коммуникатора какие-либо ошибки?

    #6079
    manjey73
    Участник

    Ошибок при этом нет, плата воспринимает команду и отвечает тем же ответом.
    Я еще раньше пытался эту формулу применить на Овене, дома 2 переменных с одним регистром, результат был тем же, писало нули.

    В Данные КП тоже нули

    • Этот ответ был изменен 6 лет, 10 месяцев назад от manjey73.
    #6081
    manjey73
    Участник

    Если в формуле стоит 1*256 то плата срабатывает, в данных КП соответствующее значение и плата возвращает точно такое же значение.

    То есть явно что-то либо с формулой, хотя она работает прекрасно в Visual Studio либо в коде самой SCADA, что она не берет значения а пишет нули.

    #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); не работает. Буду смотреть подробнее.

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

    Проверил.
    BitConverter.ToDouble(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }, 0) даёт число double очень близкое к нулю, поэтому в событии и в данных КП оно показывается как 0.000

    Если в шаблоне Модбас используется Множественная команда, то Вы увидите 01 02. Если не множественная, то значение команды округляется до целого числа 0.

    #6100
    manjey73
    Участник

    Так а почему оно округляется, так же не должно быть ?

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

    Для Write Single Register это нормально, т.к. передаётся целое число 2 байта.

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