Конфигурация slave modbus устройства

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY
Ответить
stapmoff
Сообщения: 18
Зарегистрирован: 16 май 2016, 18:04

Конфигурация slave modbus устройства

Сообщение stapmoff »

Привет всем! Есть дивайсик на ардуино, работает в slave режиме передает считаные данные с аналогового входа, другому устройству! Вопрос. Реально ли с помощью конвертора USB -> RS485 конфигурировать девайс, а именно переписывать адрес устройства и менять формат передачи (8-N-1, 8-N-2, 8-E-1 и тд.) Я понимаю, что это реально, как минимум нужна софтина на ПК и каким то макаром с помощью этого софта и конвертора менять значения на девайсе. Если кто поможет, отблагодарю материально)) ОБЕЩЯЮ

Мой Скетч

Код: Выделить всё

#include <SimpleModbusSlave.h>

#define  LED 9  

/
//////////////// Регистры вашего slave ///////////////////
enum 
{     
  // just add or remove registers and your good to go...
  // The first register starts at address 0
  ADC_VAL,     
  PWM_VAL,        
  HOLDING_REGS_SIZE // leave this one
  // total number of registers for function 3 and 16 share the same register array
  // i.e. the same address space
};

unsigned int holdingRegs[HOLDING_REGS_SIZE];
void setup()
{
  /* parameters(HardwareSerial* SerialPort,
                long baudrate, 
      unsigned char byteFormat,
                unsigned char ID, 
                unsigned char transmit enable pin, 
                unsigned int holding registers size,
                unsigned int* holding register array)
  */
  
  /* Valid modbus byte formats are:
     SERIAL_8N2: 1 start bit, 8 data bits, 2 stop bits
     SERIAL_8E1: 1 start bit, 8 data bits, 1 Even parity bit, 1 stop bit
     SERIAL_8O1: 1 start bit, 8 data bits, 1 Odd parity bit, 1 stop bit
      
  */
   
  modbus_configure(&Serial, 19200, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);

  // modbus_update_comms(baud, byteFormat, id) is not needed but allows for easy update of the
  // port variables and slave id dynamically in any function.
  modbus_update_comms(19200, SERIAL_8N2, 1);
  
  pinMode(LED, OUTPUT);
}

void loop()
{
  // modbus_update() is the only method used in loop(). It returns the total error
  // count since the slave started. You don't have to use it but it's useful
  // for fault finding by the modbus master.
  
  modbus_update();
  
  holdingRegs[ADC_VAL] = analogRead(A0); // update data to be read by the master to adjust the PWM
  
  analogWrite(LED, holdingRegs[PWM_VAL]>>2); // constrain adc value from the arduino master to 255
  
}
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Конфигурация slave modbus устройства

Сообщение Mr.Kubikus »

Привет!
Из приведенного кода не очевидно, что формат можно изменять через последовательный интерфейс.

Однозначно можно сказать, что формат передачи задается в вашем коде в строке 37:

Код: Выделить всё

modbus_configure(&Serial, 19200, SERIAL_8N2, 1, 2, HOLDING_REGS_SIZE, holdingRegs);
Чтобы его изменить надо поменять значения аргументов в вызове функции modbus_configure(). Затем заново скомпилировать код и загрузить его в микроконтроллер.
С уважением, Григорий
GitHub FB ВК
stapmoff
Сообщения: 18
Зарегистрирован: 16 май 2016, 18:04

Re: Конфигурация slave modbus устройства

Сообщение stapmoff »

Хорошо, черт с ним с форматом, адрес поменять можно и например скорость?
stapmoff
Сообщения: 18
Зарегистрирован: 16 май 2016, 18:04

Re: Конфигурация slave modbus устройства

Сообщение stapmoff »

stapmoff писал(а):Хорошо, черт с ним с форматом, адрес поменять можно и например скорость?
Хотя самое главное - это адрес
stapmoff
Сообщения: 18
Зарегистрирован: 16 май 2016, 18:04

Re: Конфигурация slave modbus устройства

Сообщение stapmoff »

stapmoff писал(а):
stapmoff писал(а):Хорошо, черт с ним с форматом, адрес поменять можно и например скорость?
Хотя самое главное - это адрес
Если даже это не возможно, то я думаю реально перенести конфигурацию Modbus в eeprom контроллера и там уже менять эти параметры, а после перезагрузки девайса в скетче указать, чтоб считывал конфиг. modbus из eeprom?
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Конфигурация slave modbus устройства

Сообщение Mr.Kubikus »

Так можно. Выделите один регистр в адресном пространстве Modbus слейва для установки адреса устройства. Напишите свой обработчик, который будет сохранять значение из этого регистра в EEPROM микроконтроллера, а после перезагрузки берите значение из EEPROM для инициализации интерфейса Modbus.
Если даже это не возможно, то я думаю реально перенести конфигурацию Modbus в eeprom контроллера и там уже менять эти параметры, а после перезагрузки девайса в скетче указать, чтоб считывал конфиг. modbus из eeprom?
С уважением, Григорий
GitHub FB ВК
stapmoff
Сообщения: 18
Зарегистрирован: 16 май 2016, 18:04

Re: Конфигурация slave modbus устройства

Сообщение stapmoff »

Mr.Kubikus писал(а):Так можно. Выделите один регистр в адресном пространстве Modbus слейва для установки адреса устройства. Напишите свой обработчик, который будет сохранять значение из этого регистра в EEPROM микроконтроллера, а после перезагрузки берите значение из EEPROM для инициализации интерфейса Modbus.
Если даже это не возможно, то я думаю реально перенести конфигурацию Modbus в eeprom контроллера и там уже менять эти параметры, а после перезагрузки девайса в скетче указать, чтоб считывал конфиг. modbus из eeprom?
Вот как раз таки обработчик и все остальное написать пока сам не в силах, не силен я в написании прошивок)) Помогите
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
Сообщения: 1020
Зарегистрирован: 22 окт 2010, 23:57

Re: Конфигурация slave modbus устройства

Сообщение Mr.Kubikus »

К сожалению, у меня недостаточно свободного времени чтобы разработать для вас исходный код. Могу только поделиться идеями для дальнейшей работы.

В библиотеке SimpleModbusSlave отсутствует возможность запускать пользовательские обработчики при обращении мастера к регистрам слейва. Поэтому чтобы отловить момент когда мастер записывает в регистр слейва новый адрес придется выполнять проверку содержимого этого регистра в каждой итерации функции loop(). Проверка будет заключаться в сравнении текущего значения со значением, считанным на предыдущей итерации. Если они не равны, то это означает, что мастер произвел запись нового адреса и его необходимо записать в EEPROM.

Для работы с EEPROM смотрите описание библиотеки EEPROM Library. Там есть хорошие примеры.
С уважением, Григорий
GitHub FB ВК
stapmoff
Сообщения: 18
Зарегистрирован: 16 май 2016, 18:04

Re: Конфигурация slave modbus устройства

Сообщение stapmoff »

Mr.Kubikus писал(а):К сожалению, у меня недостаточно свободного времени чтобы разработать для вас исходный код. Могу только поделиться идеями для дальнейшей работы.

В библиотеке SimpleModbusSlave отсутствует возможность запускать пользовательские обработчики при обращении мастера к регистрам слейва. Поэтому чтобы отловить момент когда мастер записывает в регистр слейва новый адрес придется выполнять проверку содержимого этого регистра в каждой итерации функции loop(). Проверка будет заключаться в сравнении текущего значения со значением, считанным на предыдущей итерации. Если они не равны, то это означает, что мастер произвел запись нового адреса и его необходимо записать в EEPROM.

Для работы с EEPROM смотрите описание библиотеки EEPROM Library. Там есть хорошие примеры.
Спасибо! Посмотрим, что можно накрутить
Ответить