Modbus rs485 обмен со стороны мастера

ROV
Offline
Зарегистрирован: 22.12.2017

Кто празднику рад - за неделю пъян! Иак что всех

с наступающим Новым Годом!

При получении мастером от слейва читаю первое значение регистра

Обмен идет но дальнейшие параметры получить не могу

Slave

#include <SimpleModbusSlave.h>
//////////////////// Макроопределения портов и настройки программы  ///////////////////
#define baud        9600 // скоростьобмена по последовательному интерфейсу. (UART)
#define timeout     50 // Длительность ожидание ответа (таймаут modbus)
#define polling     1200  // скорость опроса по modbus
#define retry_count 0   // количесво запросов modbus до ошибки и останова обмена 0 - безконечный обмен
#define TxEnablePin 2    // Tx/Rx пин RS485 пин№3

unsigned int Id_Slv = 1;//Идентификатор slave 1,2,3,4
enum 
{     
  holdingReg,
  HOLDING_REGS_SIZE 
};

unsigned int holdingRegs[HOLDING_REGS_SIZE]; // function 3 and 16 register array
int i;
void setup() {
  modbus_configure(&Serial, baud, SERIAL_8N2, Id_Slv, TxEnablePin, HOLDING_REGS_SIZE, holdingRegs);
  modbus_update_comms(baud, SERIAL_8N2, Id_Slv);
 
}

void loop() {
    for(i=1;i<10;i++)
    {
    holdingRegs[0] = i;

    modbus_update();
    //delay(timeout);
    //Serial.print(holdingRegs[0]);
    }
    //Serial.println();
}

Монитор на slave показывает изменение передаваемых данныхЧитаю слейв монитором - все идет как надо

#include <SimpleModbusMaster.h>
//////////////////// Макроопределения портов и настройки программы  ///////////////////
#define baud        9600 // скоростьобмена по последовательному интерфейсу. (UART)
#define timeout     50 // Длительность ожидание ответа (таймаут modbus)
#define polling     1200  // скорость опроса по modbus
#define retry_count 0   // количесво запросов modbus до ошибки и останова обмена 0 - безконечный обмен
#define TxEnablePin 2    // Tx/Rx пин RS485 пин№3



#define TOTAL_NO_OF_REGISTERS 1

enum
{
  holdingReg,
  TOTAL_NO_OF_PACKETS 
};


Packet packets[TOTAL_NO_OF_PACKETS];

unsigned int regs[TOTAL_NO_OF_REGISTERS];

void setup()
{
// Пакет,SLAVE адрес,функция модбус,адрес регистра,количесво запрашиваемых регистров,локальный адрес регистра.
    modbus_construct(&packets[holdingReg], 1, READ_HOLDING_REGISTERS,    0, 1, 0); // чтение данных slave-master (slave адрес 1, регистр 0)
    modbus_configure(&Serial, baud, SERIAL_8N2, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
}

void loop()
{

  for (int Col=1;Col<10;Col++)

  {
  
  modbus_update(); // запуск обмена по Modbus

  //delay(timeout);
  
  if (Col < 10) {

  Serial.print(regs[holdingReg]);
  }
  else
  {
    Serial.println();
  }

  }
  
}

Данные на мастере получаю но только первое значение при запускеОбмен идет но получаю лишь первое значениеВерсия IDE

Хочу чтоб данные все поступали а не только то что упало первым

В чем я не прав?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А какие вам еще "дальнейшие параметры" ? Вы читаете всего один регистр с адреса 0. Установите "num of coils" в QModBus больше 1 и получите еще параметры. Но правда у вас и в программе всего один регистр активен TOTAL_NO_OF_REGISTERS 1, измените на большее число... А вообще я сомневаюсь, что вы понимаете к чему стремитесь. Может хотя бы википедию почитаете про модбас ....

ROV
Offline
Зарегистрирован: 22.12.2017

Благодарю за ответ

Что я хочу - я понимаю

Почитано и первоисточник то-же