Ответы пользователя по тегу Modbus
  • Как считать данные по протоколу modbus?

    Ocelot
    @Ocelot
    Из всей инструкции самое главное - строчки вида
    MODBUS register: 702, 801,
    751, 851
    Это адреса регистров, которые вам нужно читать/писать.

    Пример как это делать, есть в описании библиотеки modbus-serial:
    var ModbusRTU = require("modbus-serial");
    var client = new ModbusRTU();

    // open connection to a serial port
    client.connectRTU("/dev/ttyUSB0", {baudrate: 9600}, write);

    function write() {
    client.setID(1);

    // write the values 0, 0xffff to registers starting at address 5
    // on device number 1.
    client.writeRegisters(5, [0 , 0xffff])
    .then(read);
    }

    function read() {
    // read the 2 registers starting at address 5
    // on device number 1.
    client.readHoldingRegisters(5, 2)
    .then(console.log);
    }
    Вместо address 5 подставьте нужный вам адрес. Можно читать/писать несколько регистров с последовательными адресами за раз. На каком этапе возникают трудности?
    Ответ написан
    4 комментария
  • Modbus, RS485 передача данных через rx\tx 1-3, есть ли особенности?

    Ocelot
    @Ocelot
    Скорее всего, эта либа не умеет поднимать интерфейс на произвольных пинах, а пользуется аппаратным UART. Но она не знает, на каких пинах живет этот UART, поэтому требует указать при запуске.
    Оставьте модбас на дефолтных tx/rx пинах, а для общения с компом поднимите SoftwareSerial
    Ответ написан
  • Modbus RTU как отправить и обработать запрос?

    Ocelot
    @Ocelot
    Мастер посылает пакеты. Слейв слушает линию, и когда видит пакет, обрабатывает его и отвечает. slave.poll() как раз отвечает за приём, обработку пакета и отправку ответного. Этот метод нужно периодически дёргать в основном цикле, по таймеру или просто так. Если мастер ничего не прислал, slave.poll() просто завершается. Все модбасные регистры отображаются в память слейва (массив au16data[]), можно их читать/писать в любой момент. Точнее, не совсем в любой, а когда не вызывается slave.poll().

    Блок
    if (master.getState() == COM_IDLE) {
          u8state = 0;
          u32wait = millis() + 100;       
        }
    даёт задержку 100мс перед следующим опросом модбаса. В коде мастера реализован простейший конечный автомат с тремя состояниями.
    1) u8state == 1 Отправка запроса
    2) u8state == 2 Приём ответа
    3) u8state == 0 Задержка
    Ответ написан
    6 комментариев
  • FreeModBus на lpc2378 rs485, не считывает данные, из за чего может быт time out?

    Ocelot
    @Ocelot
    Нужно сначала понять, что вообще у вас происходит.
    1) Slave принимает фрейм? Поднимите на контроллере отладочный UART и шлите в него всё, что принято по RS-485. Все ок? Едем дальше.
    2) Slave передает ответ? Подключите к линии RS-485 отдельный адаптер и посмотрите через терминал, что там вообще передается. Посмотрите осциллографом, что творится на выводах UART контроллера. Проверьте, что пин RTS действительно работает. Нет осциллографа - хотя бы светодиоды воткните, будет видно, тишина там или какие-то шевеления.
    3) На физическом уровне все хорошо, но MODBUS все равно дает отлуп по таймауту? HEX-редактор в зубы, и изучайте перехваченные фреймы. Ответ формируется корректно? Размер поля данных соответствует заголовку? Контрольная сумма правильно считается?
    Ответ написан
    Комментировать
  • Как в freemodbus задать порт для rts, для rs485?

    Ocelot
    @Ocelot
    Файл port.h (он свой для каждой архитектуры), в нем что-нибудь вроде
    #define RTS_PIN         PD2
    #define RTS_DDR         DDRD
    #define RTS_PORT        PORTD
    Ответ написан
  • Библиотека freemodbus как отправить посылку?

    Ocelot
    @Ocelot
    Массив байт можно считывать через очереди или через файлы (команды Modbus 0x18 и 0x14). Ни то, ни другое freemodbus не умеет. Вижу два решения:
    1. Дописать поверх библиотеки расширение для FIFO.
    2. Передавать массив через функцию "Read Input Registers (0x04)"

    Какой предполагается размер массива и известен ли он в момент запроса?
    Ответ написан