Modbus RTU — BCD Format

Помечено: 

Просмотр 15 сообщений - с 1 по 15 (из 30 всего)
  • Автор
    Записи
  • #5240
    baur
    Участник

    Добрый день,
    как прочитать тип BCD через ModbusRTU
    BCD
    Лектус берет с настройкой старшим разрядом вперед

    попробовал вот так
    BCD
    показывает 0

    • Тема изменена 9 лет, 4 месяца назад пользователем baur.
    • Тема изменена 9 лет, 4 месяца назад пользователем baur.
    #5243
    baur
    Участник

    старшим разрядом вперед

    ошибся,
    там две галочки старшим байтом вперед и старшим регистром вперед

    • Ответ изменён 9 лет, 4 месяца назад пользователем baur.
    #5245
    manjey73
    Участник

    для BCD надо писать формулу, скажите какое значение должно быть ?
    А так же значения double, скопированные из базы в Сервере (непосредственно в Web приложении они будут не точными, поэтому необходимо смотреть значение канала через Сервер и просмотр базы) при различных вариантах перестановки байт, чтобы определить точную последовательность.

    #5246
    baur
    Участник

    если не указать порядок байт то ничего не получаю
    если указать порядок байт = 01234567 то получаю результат 206592 вместо реального 32700 который показывает счетчик

    #5247
    baur
    Участник

    Реальное значение полученной Лектус
    32700

    Результат RS

    rs
    63 03 00 00 00 02 CC 49
    rq
    63 03 04 00 03
    27 00 52 05

    • Ответ изменён 9 лет, 4 месяца назад пользователем baur.
    • Ответ изменён 9 лет, 4 месяца назад пользователем baur.
    • Ответ изменён 9 лет, 4 месяца назад пользователем baur.
    #5251
    manjey73
    Участник

    Привяжите значение к входному каналу, дайте значению записаться
    Посмотрите значение вот здесь — запустите Сервер
    На Файлах выберите Минутные срезы, выберите минутный срез m170413.dat и посмотрите точные значения данных из базы при разной перестановке байт.

    значение должно быть 32700 или оно у вас меняется ?

    Потому что судя по этому оно у вас другое
    63 03 04 00 03 27 00 52 05
    Либо у вас их тут два значения 30400 и 32700

    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    #5254
    manjey73
    Участник

    а, все, разобрался через парсер. 00 03 27 00 это ваше число в ответе…
    И все таки, привяжите к каналу и посмотрите точное значение в базе среза, мне будет проще подогнать формулу

    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    #5256
    baur
    Участник

    пока у меня значение не меняется, все время 32 700
    m170413.dat показывает то же что в коммуникаторе 206 592

    по сути парсер же показывает 32 700, в чем проблема? почему меняется на 206592?

    00 03 27 00 = 32700

    • Ответ изменён 9 лет, 4 месяца назад пользователем baur.
    #5259
    manjey73
    Участник

    Потому что Сервер в базу данных всегда пишет double, а байты для double не 32700 а совершенно другое значение…

    #5260
    manjey73
    Участник

    public double BcdToDec(double val)
    {
    byte[] bcdNumber = BitConverter.GetBytes(val);
    double result = 0;
    foreach (byte b in bcdNumber)
    {
    int digit1 = b >> 4;
    int digit2 = b & 0x0f;
    result = (result * 100) + digit1 * 10 + digit2;
    }
    return result;
    }

    Добавьте в Администраторы в формулы, название BcdToDec, Описание — Преобразование BCD в десятичное

    Во входном канале установите галочку Использовать формулу и прописать BcdToDec(Cnl)

    Сама формула не вызывает ошибки сервера, но проверить я не могу нормально…

    #5261
    baur
    Участник

    Формула на выходе дает: 380941

    #5263
    manjey73
    Участник

    Перестановка байт в запросе меняет ситуацию и как ?

    Вы в канале уже смотрите значение ? Если уже в канале, то как писал выше скопируйте сюда значение канала из базы данных Сервером без применения формулы

    Я в VS сделал следующее
    byte[] teste = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x27, 0x00 }; //Создал массив для double, где последние 4 байта как раз нужные
    double tet = BitConverter.ToDouble(teste, 0); // конвертнул в double
    byte[] tet1 = BitConverter.GetBytes(tet); // еще раз туда
    double tet2 = BitConverter.ToDouble(tet1, 0); // и обратно

    и вызвал функцию
    double dec = BcdToDec(tet2); // на выходе получил 32700

    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    #5267
    manjey73
    Участник

    Попробуйте его прочитать как int 4 байта

    uint test = 206592 — если это число конвертнуть в double и прогнать через функцию, то я получаю на выходе 380941

    тьфу…

    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    • Ответ изменён 9 лет, 4 месяца назад пользователем manjey73.
    #5268
    baur
    Участник

    Значение канала без формулы

    После применения формулы

    #5272
    manjey73
    Участник

    Попробуйте просто int считать для начала с формулой.

Просмотр 15 сообщений - с 1 по 15 (из 30 всего)
  • Для ответа в этой теме необходимо авторизоваться.