Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2022, 14:47   #1
geb2010
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 25
По умолчанию библиотека ModBus RTU для ардуино

Здравствуйте !
Я из Ардуино МЕГА 2560 передаю данные в панель СП270 по МодВас РТУ функцией:
writeSingleRegister(adr, dan) - передача значения dan по адресу adr. Передается правильно.
И так все данные ( 6 переменных ), что на мой взгляд не совсем удачно.
Есть функция для передачи нескольких данных writeMultipleRegister , но я не смог ее реализовать.
Использую библиотеку ModbusMaster.h, но примера передачи нескольких данных этой функцией в инете не нашел.
В файле ModbusMaster.cpp в этой функции указаны два параметра - адрес для панели СП270 и количество регистров для записи данных в эти регистры (так я понял), а как указать откуда брать данные не понятно. Мне кажется в функции должен быть еще параметр с адресом данных или я чего-то не понимаю.
Подскажите пожалуйста как правильно вызывать функцию writeMultipleRegister или ссылку с использованием этой функции.
С уважением Геннадий.
geb2010 вне форума Ответить с цитированием
Старый 17.08.2022, 14:54   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от geb2010 Посмотреть сообщение
Использую библиотеку ModbusMaster.h, но примера передачи нескольких данных этой функцией в инете не нашел.
Врете. Пример есть и даже приведен на главной странице гитхаба
Код:
  // set word 0 of TX buffer to least-significant word of counter (bits 15..0)
  node.setTransmitBuffer(0, lowWord(i));
  
  // set word 1 of TX buffer to most-significant word of counter (bits 31..16)
  node.setTransmitBuffer(1, highWord(i));
  
  // slave: write TX buffer to (2) 16-bit registers starting at register 0
  result = node.writeMultipleRegisters(0, 2);
p51x вне форума Ответить с цитированием
Старый 20.08.2022, 22:23   #3
geb2010
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 25
По умолчанию

p51x:
Здравствуйте !
Я виноват, не посмотрел страницу до конца.
Я не знаю английского, а переводчик переводит так, что мне не понятно что за данные задаются.
Все что я понял:
- первая строка устанавливает буфер, но что за параметры ( 0, lowWord(i) ) ?
- аналогично и вторая строка.
В третьей строке происходит непосредственно передача, но почему в ней только два параметра ?
Мне надо передать сразу шесть параметров.
Если Вам не трудно поясните пожалуйста ...
С уважением Геннадий
geb2010 вне форума Ответить с цитированием
Старый 22.08.2022, 11:24   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от geb2010 Посмотреть сообщение
Я не знаю английского, а переводчик переводит так, что мне не понятно что за данные задаются.
Та ладно
Цитата:
@param u8Index индекс массива буферов передачи (0x00..0x3F)
Значение @param u16Value для размещения в позиции u8Index буфера передачи (0x0000..0xFFFF)
@вернуть 0 в случае успеха; номер исключения при сбое
что непонятно?

Цитата:
Сообщение от geb2010 Посмотреть сообщение
- первая строка устанавливает буфер, но что за параметры ( 0, lowWord(i) ) ?
Код:
/**
Place data in transmit buffer.
@see ModbusMaster::clearTransmitBuffer()
@param u8Index index of transmit buffer array (0x00..0x3F)
@param u16Value value to place in position u8Index of transmit buffer (0x0000..0xFFFF)
@return 0 on success; exception number on failure
@ingroup buffer
*/
uint8_t ModbusMaster::setTransmitBuffer(uint8_t u8Index, uint16_t u16Value)
Цитата:
Сообщение от geb2010 Посмотреть сообщение
В третьей строке происходит непосредственно передача, но почему в ней только два параметра ?
А сколько вам надо для передачи стартового индекса и кол-ва?
Код:
/**
Modbus function 0x10 Write Multiple Registers.
This function code is used to write a block of contiguous registers (1 
to 123 registers) in a remote device.
The requested written values are specified in the transmit buffer. Data 
is packed as one word per register.
@param u16WriteAddress address of the holding register (0x0000..0xFFFF)
@param u16WriteQty quantity of holding registers to write (1..123, enforced by remote device)
@return 0 on success; exception number on failure
@ingroup register
*/
p51x вне форума Ответить с цитированием
Старый 22.08.2022, 17:35   #5
geb2010
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 25
По умолчанию

p51x:
Здравствуйте !
Наверно я тупой, поэтому запутался еще больше. Я таких строк, которые Вы мне написали не видел.
Напишите, правильно ли я понял:
node.setTransmitBuffer(0, lowWord(i));
-> 1-ый парам. = 0 Это начальный адрес буфера ТХ.
-> 2-ой парам = lowWord(i) это 1-я половина регистра (0 -15 бит) переменной "I"
node.setTransmitBuffer(1, highWord(i));
-> 1-ый парам. = 1 это след. адрес буфера ТХ.
-> 2-ой парам. = highWord(i) это 2-я половина регистра (16 -31 бит) переменной "I"
result = node.writeMultipleRegisters(0, 2);
-> 1-ый парам. = 0 это начальный адрес буфера ТХ.
-> 2-ой парам. = 2 это количество регистров, которые будут переданы.

Если правильно то что я написал выше, то я должен, наверно, записать в буфер ТХ 6 своих переменных, разбив каждую на две части, по адресам буфера ТХ начиная с 0 до 11, а в команде передачи указать вторым параметром вместо 2 двенадцать?
Буду Вам очень признателен.
С уважением Геннадий.
geb2010 вне форума Ответить с цитированием
Старый 22.08.2022, 17:56   #6
geb2010
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 25
По умолчанию

p51x:
Здравствуйте !
Я наверно тупой, поэтому еще больше запутался.
Напишите, если Вам не трудно, правильно ли я понял:
node.setTransmitBuffer(0, lowWord(i));
-> 1-ый парам. = 0, это нулевой адрес буфера ТХ.
-> 2-ой парам. = lowWord(i), это младшая часть переменной I (0-15 бит)
node.setTransmitBuffer(1, highWord(i));
-> 1-ый парам. = 1, это следующий адрес буфера ТХ.
-> 2-ой парам. = highWord(i), это старшая часть переменной I (16-31 бит)
result = node.writeMultipleRegisters(0, 2);
-> 1-ый парам. = 0, это нулевой адрес буфера ТХ.
-> 2-ой парам. = 2, это количество регистров, которые будут переданы.

1) Можно задать буфер ТХ так: unsignet int BufTX(12) ?
2) В буфер ТХ записать по адресам начиная с 0 по 11 6 своих переменных, разбив на 2 части каждую, а в команде передачи во 2-ом параметре указать вместо 2 12 ?

Буду Вам очень признателен.
С уважением Геннадий.
geb2010 вне форума Ответить с цитированием
Старый 22.08.2022, 18:06   #7
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от geb2010 Посмотреть сообщение
1) Можно задать буфер ТХ так: unsignet int BufTX(12) ?
Он уже в либе задан
Код:
uint16_t _u16TransmitBuffer[ku8MaxBufferSize];
Цитата:
Сообщение от geb2010 Посмотреть сообщение
2) В буфер ТХ записать по адресам начиная с 0 по 11 6 своих переменных, разбив на 2 части каждую
Вы собрались 32-битные регистры писать?

Цитата:
Сообщение от geb2010 Посмотреть сообщение
а в команде передачи во 2-ом параметре указать вместо 2 12 ?
Сколько наберете.

Цитата:
Сообщение от geb2010 Посмотреть сообщение
-> 1-ый парам. = 0 это начальный адрес буфера ТХ.
На кой он там? Откуда либа возьмет регистр, с которого писать? Для кого написано
Код:
u16WriteAddress address of the holding register
p51x вне форума Ответить с цитированием
Старый 22.08.2022, 19:05   #8
geb2010
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 25
По умолчанию

p51x:
У меня число, например - 0xfe7d, разве не 32 разрядное ?

uint16_t _u16TransmitBuffer[ku8MaxBufferSize]; и u16WriteAddress address of the holding register;
но это Вы написали, что в библиотеке, а как же мне указывать имя буфера и его адрес в программе ? Таких строк в примере на главной странице гитхаба я не нашел.
geb2010 вне форума Ответить с цитированием
Старый 22.08.2022, 19:50   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от geb2010 Посмотреть сообщение
например - 0xfe7d, разве не 32 разрядное ?
16-разрядное.
Цитата:
Сообщение от geb2010 Посмотреть сообщение
а как же мне указывать имя буфера и его адрес в программе ?
Так вы и не можете свой буфер передавать. Вам нужно вызвать несколько раз setTransmitBuffer, чтобы заполнить буфер _u16TransmitBuffer данными, а потом вызвать writeMultipleRegisters, чтобы передать данные, как и указано в примере на гитхабе.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 22.08.2022, 21:19   #10
geb2010
Пользователь
 
Регистрация: 15.10.2012
Сообщений: 25
По умолчанию

BDA:
Все понял, спасибо.
p51x:
Вам большое спасибо за терпение.
Все заработало.
До свидания.
geb2010 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сложить время. ардуино [Timur] Общие вопросы C/C++ 3 19.04.2020 11:27
тест Ардуино uldin Паскаль, Turbo Pascal, PascalABC.NET 0 16.12.2018 22:47
Программа для Ардуино Влад66 Фриланс 2 24.03.2017 07:38
raspberry в дополнение к Ардуино rlib Компьютерное железо 14 10.05.2016 16:11