// ПРИМЕР СОРТИРОВКИ АДРЕСОВ УСТРОЙСТВ IARDUINO:                                        //
// даже если на шине имеются устройства iarduino с одинаковыми адресами.                //
                                                                                        //
#include <SoftwareSerial.h>                                                             //   Подключаем библиотеку для работы с программной шиной UART.
#include <iarduino_Modbus.h>                                                            //   Подключаем библиотеку для работы по протоколу Modbus.
                                                                                        //
SoftwareSerial rs485(8,9);                                                              //   Создаём объект для работы с программной шиной UART-RS485 указывая выводы RX, TX.
ModbusClient   modbus(rs485, 2);                                                        //   Создаём объект для работы по протоколу Modbus указывая объект программной шины UART-RS485 и вывод DE конвертера UART-RS485.
                                                                                        //
void setup(){                                                                           //
     Serial.begin(9600); while(!Serial);                                                //   Инициируем передачу данных в монитор последовательного порта, указав его скорость.
     rs485.begin(9600); while(!rs485);                                                  //   Инициируем работу с программной шиной UART-RS485 указав её скорость.
     modbus.begin();                                                                    //   Инициируем работу по протоколу Modbus.
//   modbus.setTimeout(10);                                                             //   Указываем максимальное время ожидания ответа по протоколу Modbus.
//   modbus.setDelay(4);                                                                //   Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus.
//   modbus.setTypeMB( MODBUS_RTU );                                                    //   Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII.
                                                                                        //
//   Определяем наличие адресов принадлежащих двум и более устройствам:                 //
     Serial.println("Проверка адресов...");                                             //
     if( modbus.searchERR() ){                                                          //   Проверяем адреса на наличие ошибок.
         Serial.print( "Найдено " );                                                    //
         Serial.print( modbus.available() );                                            //
         Serial.print( " адресов принадлежащих двум и более устройствам: {" );          //
         while( modbus.available() ){ Serial.print(' '); Serial.print(modbus.read()); } //   Выводим адреса принадлежащие двум и более устройствам.
         Serial.println( "}." );                                                        //
     }else{                                                                             //
         Serial.println( "Все адреса на шине уникальны!" );                             //
     }                                                                                  //
                                                                                        //
//   Меняем адреса устройств, даже если сейчас есть устройства с одинаковыми адресами:  //
     Serial.println("Сортировка адресов...");                                           //
     int i=modbus.sortID(10);                                                           //   Меняем адреса устройств в список начинающийся с адреса 10 (например, для трёх устройств, адреса станут: 10,11,12).
     if(i<0){Serial.println( "Не удалось отсортировать все адреса устройств" ); }       //
     else   {Serial.println( (String) "Изменены адреса "+i+" устройств" );      }       //
                                                                                        //
//   Выводим адреса всех устройств на шине:                                             //
     Serial.println("Поиск устройств...");                                              //
     if( modbus.findID() ){                                                             //   Ищем адреса всех устройств на шине.
         Serial.print( "Найдено устройств " );                                          //
         Serial.print( modbus.available() );                                            //
         Serial.print( ", с адресами:" );                                               //
         while( modbus.available() ){ Serial.print(' '); Serial.print(modbus.read()); } //   Выводим адреса найденных устройств.
         Serial.println( '.' );                                                         //
     }else{                                                                             //
         Serial.println( "На шине не обнаружено ни одного устройства" );                //
     }                                                                                  //
}                                                                                       //
                                                                                        //
void loop(){                                                                            //
}                                                                                       //
