Тел. (495) 972-27-12

Arduino и протокол Modbus

Обсуждаем Arduino, Raspberry Pi и другие электронные компоненты и проекты DIY

Arduino и протокол Modbus

Сообщение Svarog » 22 май 2016, 07:24

Здравствуйте! Проблема такая: я хочу осуществить передачу между двумя Ардуино Уно с помощью протокола Модбас через RS485. Нашел скетчи, собрал схему, но ничего не работает! Помогите разобраться в чем проблема, может ошибка в подключении, может в коде.....Прилагаю скетчи мастера и слейва, а также схему, которую собрал. Как должно быть: Мастер записывает в нулевой регистр единицу, а слейв эту еденицу подает на вывод с подключенным диодом (мне хотя бы для начала сделать это...).

ВОТ МАСТЕР:
Code: [Выделить всё] [Expand/Collapse]
  1. #include <SimpleModbusMaster.h>
  2. //////////////////// Макроопределения портов и настройки программы  ///////////////////
  3. #define baud        9600 // скоростьобмена по последовательному интерфейсу. (UART)
  4. #define timeout     1000 // Длительность ожидание ответа (таймаут modbus)
  5. #define polling     200  // скорость опроса по modbus
  6. #define retry_count 10   // количесво запросов modbus до ошибки и останова обмена
  7. #define TxEnablePin 2    // Tx/Rx пин RS485
  8.  
  9.  
  10.  // Общая сумма доступной памяти на master устройстве, для хранения данных
  11. // не забудьте изменить макроопределение TOTAL_NO_OF_REGISTERS. Если из слейва
  12. // запрашиваешь 4 регистра, то тогда в массиве reg должно быть не меньше 4х ячеек
  13. // для хранения полученных данных.
  14.  
  15. #define TOTAL_NO_OF_REGISTERS 4
  16.  
  17. // Масив пакетов modbus
  18. enum
  19. {
  20.   PACKET1,
  21.   PACKET2,
  22.  
  23.   TOTAL_NO_OF_PACKETS // эту строку неменять
  24. };
  25.  
  26. // Масив пакетов модбус
  27. Packet packets[TOTAL_NO_OF_PACKETS];
  28. // Массив хранения содержимого принятых и передающихся регистров
  29. unsigned int regs[TOTAL_NO_OF_REGISTERS];
  30.  
  31. void setup(){
  32.    // Пакет,SLAVE адрес,функция модбус,адрес регистра,данные,локальный адрес регистра.
  33.  modbus_construct(&packets[PACKET1], 1, PRESET_MULTIPLE_REGISTERS, 0, 1, 0); // запись данных master-slave (slave адрес 1, регистр 0)
  34.  
  35.  // инициализируем протокол модбус
  36.  modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
  37.  
  38. }
  39.  
  40. void loop(){
  41.   modbus_update(); // запуск обмена по Modbus
  42. regs[0] = 1;  // запись данных master-slave (slave адрес 1, регистр 0), запись константы  
  43. }
  44.  
GeSHi © Codebox Plus


ВОТ СЛЕЙВ:
Code: [Выделить всё] [Expand/Collapse]
  1. #include <SimpleModbusSlave.h>
  2. //////////////////// Макроопределения портов и настройки программы  ///////////////////
  3. #define TxEnablePin  2     // Tx/Rx пин RS485
  4. #define baud         9600  // скоростьобмена по последовательному интерфейсу. (UART)
  5. #define timeout      1000  // Длительность ожидание ответа (таймаут modbus)
  6. #define polling      200   // скорость опроса по modbus
  7. #define retry_count  10    // количесво запросов modbus до ошибки и останова обмена
  8. #define Slave_ID     1     // Адрес Slave устройсва
  9. #define LED1 8
  10.  
  11. //////////////// Регистры вашего Slave ///////////////////
  12. enum
  13. {    
  14. //Просто добавьте или удалите регистры. Первый регистр начинается по адресу 0
  15.   master_to_slave_val_1,          //  с адресом массива 0
  16.   master_to_slave_val_2,          //  с адресом массива 1 ---в данном случае не испол-ся(только для примера)
  17.   HOLDING_REGS_SIZE // Это не удалять размер массива HOLDING_REGS.
  18.   //общее количество регистров для функции 3 и 16 разделяет тотже самый массив регистров
  19.   //т.е. то же самое адресное пространство
  20. };
  21. unsigned int holdingRegs[HOLDING_REGS_SIZE]; // функции 3 и 16 массив регистров
  22.  
  23. void setup()
  24. {
  25.  
  26.    modbus_configure(&Serial, baud, SERIAL_8N1, Slave_ID, TxEnablePin, HOLDING_REGS_SIZE, holdingRegs);
  27.    modbus_update_comms(baud, SERIAL_8N1, 1);  
  28.    pinMode(LED1, OUTPUT);
  29. }
  30. void loop()
  31. {
  32.   modbus_update(); // запуск обмена по Modbus
  33.                
  34.   // чтение данных master-slave (регистр 0)
  35.  digitalWrite(LED1, holdingRegs[master_to_slave_val_1]);
  36. }
  37.  
GeSHi © Codebox Plus
Вложения
Безымянный.png
Это схема
Svarog
 
Сообщения: 1
Зарегистрирован: 21 май 2016, 16:24

Re: Arduino и протокол Modbus

Сообщение Mr.Kubikus » 26 май 2016, 13:48

Привет!

В чем выражается состояние "ничего не работает"?
С уважением, Григорий
GitHub FB ВК TW
Аватара пользователя
Mr.Kubikus
Сотрудник ПАКПАК
 
Сообщения: 875
Изображения: 49
Зарегистрирован: 22 окт 2010, 23:57
Откуда: Москва


Вернуться в Arduino и Ко. ♥♥♥



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2