Команда записи младшего или старшего байта.

Стартовая страница Форумы Взаимодействие с устройствами Команда записи младшего или старшего байта.

Просмотр 15 сообщений - с 1 по 15 (из 44 всего)
  • Автор
    Сообщения
  • #24366
    Yakov_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));
    }
    }».
    Сейчас осталась проблема с отправкой значения на запись одного из байтов (старшего или младшего). Поиск необходимой формулы не дал результатов.
    Может кто сталкивался с такой задачей и готов поделится формулой?
    Заранее спасибо.

    #24373
    manjey73
    Участник

    Вы хотите ввести полное число а записаться должен старший или младший байт ?
    и соответственно сделать два раза запись на разных каналах одним числом ?

    Cmd/256 и Cmd%256 в таком случае может помочь

    #24374
    manjey73
    Участник

    И наверное сперва надо примести Cmd к UInt16

    #24375
    Yakov_4e
    Участник

    К примеру: в одном регистре время, часы и минуты — 0x172C (hex), или 23:44 (dec). Для этого регистра я добавил два входных канала для младшего и старшего байтов. В понедельник проверю указанные Вами команды. Спасибо.

    #24376
    manjey73
    Участник

    Вы хотите записать время ? Если текущее, не лучше ли сделать канал который при вводе хоть 0, хоть 1 возьмет DateTime.Now или DateTime.UtcNow и преобразует в нужное число, а команду настроить сразу на запись двух регистров ?

    То есть множественная команда и формат Uint32 а полученное текущее время преобразовать в нужное число ?

    • Этот ответ был изменен 1 год, 8 месяцев назад от manjey73.
    • Этот ответ был изменен 1 год, 8 месяцев назад от manjey73.
    #24379
    Yakov_4e
    Участник

    Этот регистр в качестве примера. Также есть регистры недельного расписания на каждый день, реализованных аналогично. Регистры скоростей вентиляторов, и т.д. Для CMD/256 и CMD%256 необходимо добавлять формулу?

    #24380
    manjey73
    Участник

    Не обязательно, возможно просто в самом канале прописать что-то типа

    Convert.ToUInt16(Cmd/256) или Convert.ToUInt16(Cmd%256) — % это по идее младший байт, так как остаток.

    Возможно вот так потребуется (byte)Convert.ToUInt16(Cmd/256)

    #24381
    manjey73
    Участник

    (byte)(Convert.ToUInt16(Cmd)/256) или так…

    Для команд не тестировал именно такое, надо будет попробовать…

    #24382
    manjey73
    Участник

    последний вариант ошибки не вызывает при передачи проекта, но вот что передавать будет не знаю, не на чем проверить

    #24396
    Yakov_4e
    Участник

    Добрый день.
    С последними тремя формулами, при попытке отправки команды — «Команда отклонена сервером».
    С формулами Cmd/256 и Cmd%256 — веб-сервер не запускается.

    #24397
    manjey73
    Участник

    Перенесите /256 и %256 за пределы конвертирования типа…

    То есть сперва Convert.ToUInt16(Cmd)/256 и Convert.ToUInt16(Cmd)%256

    Тут еще надо правильно настроить Команду в Шаблоне Modbus, так как из-за формул происходят различные преобразования.

    #24398
    Yakov_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) — аналогично формулам выше.

    #24399
    manjey73
    Участник

    хм, последние странно, а если у них убрать впереди (byte) ?

    ААААА, блин, обнуляет поптому что еще надо на 8 бит сдвинуть вправо…

    >> 8

    (byte)(Convert.ToUInt16(Cmd)/256 >> 8)

    • Этот ответ был изменен 1 год, 8 месяцев назад от manjey73.
    • Этот ответ был изменен 1 год, 8 месяцев назад от manjey73.
    #24402
    manjey73
    Участник

    Идет привидение к байту, а там нули….

    Сбрасывает значение старшего при записи в прибор? тогда надо иначе, это для варианта когда по одному регистру запись. Если Мульти, сразу в два регистра надо формулу делать общую и приводить просто к UInt16

    • Этот ответ был изменен 1 год, 8 месяцев назад от manjey73.
    #24403
    Mikhail
    Модератор

    Добрый день!
    1. Укажите в виде текста, по какому алгоритму должно рассчитываться отправляемое значение.
    2. Напишите, какое значение команды Вы отправляете и какой результат формулы требуется получить.
    3. Сделайте скриншоты
    — отправляемой команды,
    — используемой формулы в таблице каналов,
    — отправляемого пакета в журнале линии связи.

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