ModbusMaster.h — изменение узла
Я использую библиотеку ModbusMaster.h в проекте с arduino-uno и преобразователем TTL/RS-485, и функция должна идентифицировать подчиненное устройство, с которым она обменивается данными. Число подчиненных варьируется от 1 до 16. После того, как я начал соединение,
ModbusMaster node(1);
node.begin(9600);
Мне нужно отправить сообщение, и если это сообщение вернет ошибку, мне придется изменить номер подчиненного устройства, пока я не получу действительный ответ. Но никаких функций закрыть это соединение или удалить его я не нашел, даже пробовал,
delete &node;
но это не сработало. Я пытаюсь закрыть это соединение, чтобы начать новое с другого узла, потому что я не нашел функции для изменения номера подчиненного устройства.
@Claudiaum, 👍2
Обсуждение1 ответ
Возможно, этот вопрос слишком старый и API изменился, поэтому мой ответ — справочный.
Конструктор ModbusMaster не принимает параметры.
После чтения исходного кода метод begin(uint8_t подчиненный, Stream &serial)
просто инициализирует переменные и может быть вызван снова с новым значением slave
без необходимо уничтожить объект ModbusMaster.
Ссылка:
[1] https://github.com/4-20ma/ModbusMaster/ blob/master/src/ModbusMaster.cpp, строка 61.
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Связь Arduino Uno и ESP32 с использованием RS485
- Использование сервера Modbus TCP на Arduino
- Управление VFD с помощью ModBus RTU через RS485 и Arduino
- Использование Modbus-RTU с Arduino и контроллером температуры
- считывание данных с контроллера через RS485 Modbus rtu Arduino
- Взаимодействие с контроллером температуры Eurotherm 2416 через Modbus RS232
Я не вижу никакой функции для изменения
_u8MBSlave
, кроме [конструктора](https://github.com/4-20ma/ModbusMaster/blob/master/ModbusMaster.cpp#L66). Мой C не очень хорош, вы можете попробовать что-то вродеnode = ModbusMaster(2);
, @GerbenВообще говоря, вам никогда не следует вызывать команду delete для чего-либо, если вы изначально не создали это с помощью команды new. Попытка удалить объект из стека может привести к сбою вашей программы или другим неправильным действиям., @Peter Bloomfield
Действительно, это не сработает. Но почему бы не
ModbusMaster* node = new ModbusMaster(id)
, затем отправить, проверить на наличие ошибок, если да,delete *node
,++id
, повторить? Не самый эффективный, но простой. (Вы также можете добавить функцию для изменения идентификатора библиотеки.), @fuenfundachtzigГербен, не получилось, =/. Спасибо за совет, Питер. Фуэнфундахциг, как ты это произносишь? Ооо, но это тоже не сработало. Но для решения мне пришлось создать функцию, которая продолжает создавать новые узлы, и каждый раз, когда она создает новый узел, она отправляет запрос, и если запрос был ошибкой, она переходит к созданию другого узла, если ответ был бы успешен, то было бы сделано:
ModbusMaster node4(4)
"если успех был с 4-й попытки", затем:node4.begin(); узел = узел4;
, @Claudiaum