ВОТ МАСТЕР:
- Code: [Выделить всё] [Expand/Collapse]
- #include <SimpleModbusMaster.h>
- //////////////////// Макроопределения портов и настройки программы ///////////////////
- #define baud 9600 // скоростьобмена по последовательному интерфейсу. (UART)
- #define timeout 1000 // Длительность ожидание ответа (таймаут modbus)
- #define polling 200 // скорость опроса по modbus
- #define retry_count 10 // количесво запросов modbus до ошибки и останова обмена
- #define TxEnablePin 2 // Tx/Rx пин RS485
- // Общая сумма доступной памяти на master устройстве, для хранения данных
- // не забудьте изменить макроопределение TOTAL_NO_OF_REGISTERS. Если из слейва
- // запрашиваешь 4 регистра, то тогда в массиве reg должно быть не меньше 4х ячеек
- // для хранения полученных данных.
- #define TOTAL_NO_OF_REGISTERS 4
- // Масив пакетов modbus
- enum
- {
- PACKET1,
- PACKET2,
- TOTAL_NO_OF_PACKETS // эту строку неменять
- };
- // Масив пакетов модбус
- Packet packets[TOTAL_NO_OF_PACKETS];
- // Массив хранения содержимого принятых и передающихся регистров
- unsigned int regs[TOTAL_NO_OF_REGISTERS];
- void setup(){
- // Пакет,SLAVE адрес,функция модбус,адрес регистра,данные,локальный адрес регистра.
- modbus_construct(&packets[PACKET1], 1, PRESET_MULTIPLE_REGISTERS, 0, 1, 0); // запись данных master-slave (slave адрес 1, регистр 0)
- // инициализируем протокол модбус
- modbus_configure(&Serial, baud, SERIAL_8N1, timeout, polling, retry_count, TxEnablePin, packets, TOTAL_NO_OF_PACKETS, regs);
- }
- void loop(){
- modbus_update(); // запуск обмена по Modbus
- regs[0] = 1; // запись данных master-slave (slave адрес 1, регистр 0), запись константы
- }
- GeSHi © Codebox Plus
ВОТ СЛЕЙВ:
- Code: [Выделить всё] [Expand/Collapse]
- #include <SimpleModbusSlave.h>
- //////////////////// Макроопределения портов и настройки программы ///////////////////
- #define TxEnablePin 2 // Tx/Rx пин RS485
- #define baud 9600 // скоростьобмена по последовательному интерфейсу. (UART)
- #define timeout 1000 // Длительность ожидание ответа (таймаут modbus)
- #define polling 200 // скорость опроса по modbus
- #define retry_count 10 // количесво запросов modbus до ошибки и останова обмена
- #define Slave_ID 1 // Адрес Slave устройсва
- #define LED1 8
- //////////////// Регистры вашего Slave ///////////////////
- enum
- {
- //Просто добавьте или удалите регистры. Первый регистр начинается по адресу 0
- master_to_slave_val_1, // с адресом массива 0
- master_to_slave_val_2, // с адресом массива 1 ---в данном случае не испол-ся(только для примера)
- HOLDING_REGS_SIZE // Это не удалять размер массива HOLDING_REGS.
- //общее количество регистров для функции 3 и 16 разделяет тотже самый массив регистров
- //т.е. то же самое адресное пространство
- };
- unsigned int holdingRegs[HOLDING_REGS_SIZE]; // функции 3 и 16 массив регистров
- void setup()
- {
- modbus_configure(&Serial, baud, SERIAL_8N1, Slave_ID, TxEnablePin, HOLDING_REGS_SIZE, holdingRegs);
- modbus_update_comms(baud, SERIAL_8N1, 1);
- pinMode(LED1, OUTPUT);
- }
- void loop()
- {
- modbus_update(); // запуск обмена по Modbus
- // чтение данных master-slave (регистр 0)
- digitalWrite(LED1, holdingRegs[master_to_slave_val_1]);
- }
- GeSHi © Codebox Plus