ModBus RTU групповое чтение

Пользовательские блоки для коммкникации и связи GSM, GPRS, IR, Bluetooth и другие
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Ответить
Аватара пользователя
Sancho
Полковник
Сообщения: 3810
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 528
Откуда: Ярославль.
Имя: Александр
Контактная информация:

ModBus RTU групповое чтение

#1

Сообщение Sancho » 24.12.2020{, 16:57}

Вариант для группового чтения, т.е. несколько регистров, идущих подряд, за один запрос.
Адреса слэйвов и номер первого регистра задаются на входах блоков.
В основном задаётся общее число используемых блоков и скорость порта.
На выходе основного блока битовая маска, в которой 1 соответствуют о том, что последнее чтение было удачным.
Для теста удобно использовать программу Mod-RsSim , mod_RSsim.exe, тут есть тоже, которая имитирует несколько слэйвов с возможностью вкл/откл, внизу панели квадратики, если зелёный доступен, в жёлтой рамке - опрашивается, красный - недоступен. Да много чего.
Пока только чтение.
Код основан на flprog, почти.
Можно, при желании, изменить на флоат, а byte получить вообще не проблема, т.к. в этой версии данные хранятся именно в них.
Количество слэйвов можно увеличить, изменив блок и сохранив его под новым именем, также количество регистров можно увеличить/уменьшит.
Заготовка - одним словом, для экспериментов . И для понимания алгоритма.
Идея описана в этой теме.
Для скачивания вложений Вы должны быть зарегистрированы.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Ingwar
Подполковник
Сообщения: 1309
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 87
Откуда: Ленобласть
Имя: Игорь

ModBus RTU групповое чтение

#2

Сообщение Ingwar » 24.12.2020{, 17:45}

Вот бы "групповуху" добавить в саму программу... (машинка есть) :yes:
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Serg_Grn
Лейтенант
Сообщения: 306
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 27
Откуда: Одесса
Имя: Сергей

ModBus RTU групповое чтение

#3

Сообщение Serg_Grn » 10.05.2021{, 18:01}

Блоки оказались очень в нужное время в нужном месте :)
Sancho, спасибо.

Для полного счастья не хватает блоков записи. И для input registers тоже.
А так получается что либо читаешь группой, но не можешь писать, либо пишешь встроенным модбасом, но вынужден читать порегистрово, а это иногда оказывается плохо - теряются короткие во времени сигналы при слишком долгом обмене...

Velis
Рядовой
Сообщения: 2
Зарегистрирован: 16.05.2021{, 11:01}
Репутация: 0
Имя: Максим

ModBus RTU групповое чтение

#4

Сообщение Velis » 24.05.2021{, 20:17}

прошу прощения, можно объяснить все для пионеров, как работать с данными блоками. нужно в одном запросе отправить температуру и влажность. заранее спасибо

Аватара пользователя
Sancho
Полковник
Сообщения: 3810
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 528
Откуда: Ярославль.
Имя: Александр
Контактная информация:

ModBus RTU групповое чтение

#5

Сообщение Sancho » 25.05.2021{, 08:49}

Velis писал(а):
24.05.2021{, 20:17}
прошу прощения, можно объяснить все для пионеров, как работать с данными блоками. нужно в одном запросе отправить температуру и влажность. заранее спасибо
Напрямую в модбасе отправить можно только от мастера к слэйву.
Из слэйва можно считать.
Поэтому не совсем понятна затея... :)
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Velis
Рядовой
Сообщения: 2
Зарегистрирован: 16.05.2021{, 11:01}
Репутация: 0
Имя: Максим

ModBus RTU групповое чтение

#6

Сообщение Velis » 25.05.2021{, 19:19}

благодарю

Serg_Grn
Лейтенант
Сообщения: 306
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 27
Откуда: Одесса
Имя: Сергей

ModBus RTU групповое чтение

#7

Сообщение Serg_Grn » 07.06.2021{, 18:06}

Добавил вариант блоков (основной и один слейв) для чтения 9 регистров.
Основной_МВ_01_9_(Code_-_Basic).ubi
Устройство_0_9int_(Code_-_Basic).ubi
Для скачивания вложений Вы должны быть зарегистрированы.

Аватара пользователя
support
Супермодератор
Сообщения: 1750
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 599
Откуда: Астрахань
Имя: Сергей
Контактная информация:

ModBus RTU групповое чтение

#8

Сообщение support » 07.06.2021{, 18:26}

Sancho писал(а):
24.12.2020{, 16:57}
Вариант для группового чтения, т.е. несколько регистров, идущих подряд, за один запрос.
Реализованно в версии 7.3.6. Подряд идущие регистры теперь читаются одним запросом.
Автор программы FLProg.

Serg_Grn
Лейтенант
Сообщения: 306
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 27
Откуда: Одесса
Имя: Сергей

ModBus RTU групповое чтение

#9

Сообщение Serg_Grn » 07.06.2021{, 18:31}

support, ничего себе! А я и не знал, спасибо огромное!

Serg_Grn
Лейтенант
Сообщения: 306
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 27
Откуда: Одесса
Имя: Сергей

ModBus RTU групповое чтение

#10

Сообщение Serg_Grn » 08.06.2021{, 16:24}

support писал(а):
07.06.2021{, 18:26}
Реализованно в версии 7.3.6.
support, подскажите пожалуйста, проблема обрисованная по ссылке ниже решена или нет?
viewtopic.php?t=6709&start=20#p94137

Wadim77
Рядовой
Сообщения: 13
Зарегистрирован: 20.08.2020{, 19:23}
Репутация: 0
Имя: Wadim

ModBus RTU групповое чтение

#11

Сообщение Wadim77 » 26.07.2021{, 21:50}

support писал(а):
07.06.2021{, 18:26}
Sancho писал(а):
24.12.2020{, 16:57}
Вариант для группового чтения, т.е. несколько регистров, идущих подряд, за один запрос.
Реализованно в версии 7.3.6. Подряд идущие регистры теперь читаются одним запросом.
Уточните, пож, что вы имели ввиду?

Аватара пользователя
support
Супермодератор
Сообщения: 1750
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 599
Откуда: Астрахань
Имя: Сергей
Контактная информация:

ModBus RTU групповое чтение

#12

Сообщение support » 28.07.2021{, 06:50}

Wadim77 писал(а):
26.07.2021{, 21:50}
support писал(а):
07.06.2021{, 18:26}

Реализованно в версии 7.3.6. Подряд идущие регистры теперь читаются одним запросом.
Уточните, пож, что вы имели ввиду?
вот смотри, регистры идут с номерами 5,6,7,8,9 11,12,13,14
одним запросом прочитаются с 5 по 9, и вторым с 11 по 14. если они будут идти подряд 5,6,7,8,9 ,10,11,12,13,14 то они прочитаются одним запросом
Автор программы FLProg.

Serg_Grn
Лейтенант
Сообщения: 306
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 27
Откуда: Одесса
Имя: Сергей

ModBus RTU групповое чтение

#13

Сообщение Serg_Grn » 10.10.2021{, 12:01}

support, обратите пожалуйста внимание на ещё одну проблему в Modbus RTU master, она давно есть, я столкнулся с ней опять сейчас. Суть проблемы: некоторые слейв устройства (ПЛК) не отвечают на часть запросов мастера, т.е. то отвечают, то нет... Я смотрел осциллографом и видел что пакеты запросов идут, а ответов нет, точнее чаще их нет, чем они есть.
В итоге обнаружено следующее: в Modbus RTU master функция _modbusMasterSendTxBuffer() имеет строку delay(10), эта строка расположена после строки Serial2.write.
Я перемещаю delay(10) до Serial2.write, в результате у меня формируется задержка перед отправкой следующего запроса слейву, таким образом проблема решается и слейв начинает нормально отвечать в каждом запросе.
Спасибо!

Ingwar
Подполковник
Сообщения: 1309
Зарегистрирован: 28.10.2015{, 22:47}
Репутация: 87
Откуда: Ленобласть
Имя: Игорь

ModBus RTU групповое чтение

#14

Сообщение Ingwar » 10.10.2021{, 13:10}

Serg_Grn писал(а):
10.10.2021{, 12:01}
В итоге обнаружено следующее: в Modbus RTU master функция _modbusMasterSendTxBuffer() имеет строку delay(10), эта строка расположена после строки Serial2.write.
Я перемещаю delay(10) до Serial2.write, в результате у меня формируется задержка перед отправкой следующего запроса слейву, таким образом проблема решается и слейв начинает нормально отвечать в каждом запросе.
У меня в проекте вот такая картина
СпойлерПоказать
void _modbusMasterSendTxBuffer()
{
byte i = 0;
int crc = modbusCalcCRC(_modbusMasterBufferSize, _modbusMasterBuffer);
_modbusMasterBuffer[ _modbusMasterBufferSize ] = crc >> 8;
_modbusMasterBufferSize++;
_modbusMasterBuffer[ _modbusMasterBufferSize ] = crc & 0x00ff;
_modbusMasterBufferSize++;
UCSR0A=UCSR0A |(1 << TXC0);
delay(10);
digitalWrite(16, 1);
delay(1);
Serial.write(_modbusMasterBuffer, _modbusMasterBufferSize);
while (!(UCSR0A & (1 << TXC0)));
digitalWrite(16, 0);
Serial.flush();
_modbusMasterBufferSize = 0;
_modbusMasterSendTime = millis();
}
Вроде строка delay раньше, но это никак не помогает... Не могу нормально читать более 4 int из ПР200 ( Допускаю, что виновником может быть MAX485. Но у меня сейчас только такие...
Люди в своем большинстве живо интересуются всем на свете, за исключением того, что действительно стоит знать.

Аватара пользователя
Sancho
Полковник
Сообщения: 3810
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 528
Откуда: Ярославль.
Имя: Александр
Контактная информация:

ModBus RTU групповое чтение

#15

Сообщение Sancho » 10.10.2021{, 13:26}

Serg_Grn писал(а):
10.10.2021{, 12:01}
Я перемещаю delay(10) до Serial2.write, в результате у меня формируется задержка перед отправкой следующего запроса слейву, таким образом проблема решается и слейв начинает нормально отвечать в каждом запросе.
Не смотрел, но я так, через delay, не делал.
У меня после обработки предыдущего запроса, с учётом ожидания приёма последнего символа, время 20 + 5 + время обработки ответа.
После опроса последнего слэйва 800 +5 + ..
void _nextStep(bool rez)
{
_MB_Send_Time = millis();
if(rez)_allStatus|=1<<nomer;
else _allStatus&= ~(1<<nomer);
if(nomer == 3-1){_MB_Next_send= 800;} // смотреть 3....
else {_MB_Next_send=20;}
_MB_Mode = 1; //3
}
В курсе проблем некоторых ПЛК и общих правил.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Serg_Grn
Лейтенант
Сообщения: 306
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 27
Откуда: Одесса
Имя: Сергей

ModBus RTU групповое чтение

#16

Сообщение Serg_Grn » 10.10.2021{, 14:37}

Sancho писал(а):
10.10.2021{, 13:26}
Не смотрел, но я так, через delay, не делал.
Да, я знаю что в Ваших блоках не так. Просто хотел бы чтоб в штатных блоках это решилось тоже, тем более, что там теперь есть групповое чтение. Хотя тут тема не совсем об этом, но я надеюсь меня простят за офтоп :)

Отправлено спустя 14 минут 1 секунду:
Ingwar писал(а):
10.10.2021{, 13:10}
У меня в проекте вот такая картина
Может у Вас контроллер другой, у меня ESP32, картина такая:
СпойлерПоказать
_modbusMasterSendTxBuffer();
_modbusMasterState = 2;
}
void _modbusMasterSendTxBuffer()
{
byte i = 0;
int crc = modbusCalcCRC(_modbusMasterBufferSize, _modbusMasterBuffer);
_modbusMasterBuffer[ _modbusMasterBufferSize ] = crc >> 8;
_modbusMasterBufferSize++;
_modbusMasterBuffer[ _modbusMasterBufferSize ] = crc & 0x00ff;
_modbusMasterBufferSize++;
Serial2.write(_modbusMasterBuffer, _modbusMasterBufferSize);
delay(10);
Serial2.flush();
_modbusMasterBufferSize = 0;
_modbusMasterSendTime = millis();
}
И вот переместив delay(10); на одну строку вверх я решаю проблему обмена со слейвом.

Ответить

Вернуться в «Коммуникация и связь»