KpModbus

Просмотр 8 сообщений - с 1 по 8 (из 8 всего)
  • Автор
    Сообщения
  • #1511
    SDevel
    Участник

    Добрый день!
    Поскольку для команд не предусмотрен выбор типа, то лучше сделать так :

    // формирование команды Modbus
                BitConverter.GetBytes((float)cmd.CmdVal) 

    т.к. в PLC число с плав. точкой обычно 4 байта (2 регистра Modbus)

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

    Добрый день! Уточните, пожалуйста, где именно Вы предлагаете так сделать.

    #1514
    SDevel
    Участник

    Метод void SendCmd(Command cmd)

    // формирование команды Modbus
                        if (modbusCmd.Multiple)
                        {
                            modbusCmd.Data = cmd.CmdTypeID == BaseValues.CmdTypes.Standard ?
                                BitConverter.GetBytes(cmd.CmdVal) : cmd.CmdData;
                        }

    cmd.CmdVal имеет тип double и BitConverter.GetBytes возвращает массив из 8 байт, а в PLC тип REAL 4 байта. Приведение типа к float как я писал ранее оказалось не достаточно, требуется еще развернуть массив байт в обратную сторону(BigEndian — LittleEndian) в результате получаем Float Inverse

    Поэтому лучшим решением будет добавить в свойствах команды параметр «Порядок байт» аналогично элементам. При этом будет возможность отправлять стандартной командой
    и double и float в нужной для конкретного PLC последовательности.

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

    Спасибо за предложение, особенно касательно порядка байт в командах. Правда пока не могу сказать, когда это будет реализовано.

    Реальное количество передаваемых байт для множественной команды задаётся полем Количество элементов, а вот порядок байт пока нельзя задать в Коммуникаторе.

    Так что Вы можете использовать стандартную команду, только нужно написать формулу в базе конфигурации, которая будет формировать нужный double.

    #1526
    SDevel
    Участник

    Подработал код kpModbus под свои нужды.

    1. Убрал поле порядок байт у сигналов, т.к в пределах одного устройства он един и нет смысла для каждого сигнала его прописывать.

    2. Порядок байт задается в пользовательских параметрах. Если задан «ByteOrder» то этот порядок един для всех Modbus устройств на линии связи. Но можно указать порядок байт индивидуально через «ByteOrder.<НомерКП>» такой параметр приоритетный.
    При отсутствии параметра используется дефолтный «1032».

    3. Порядок байт используется и для команд и для сигналов.

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

    Вы не выкладывали fork на github или аналогичный ресурс?

    #1532
    SDevel
    Участник

    Пока нет. Если надо могу выслать вам по емайл.

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

    По е-маил не совсем удобно, тем более, что новая версия драйвера может быть полезной сообществу, и было бы замечательно, если она будет легко доступной на привычных ресурсах в веб.

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