alex38779 писал(а):Протокол выбран modbus, т.к. очень распространен.
данная библиотек не может реализовать функцию мастера
Выше правильно сказали, зачем именно Modbus? Зачем какая-то библиотека?
Разрабатываете протокол обмена, например, такой:
Мастер посылает команду вида
| ADR | CMD | LEN | DATA | CRC | , где
ADR - адрес слейва, CMD - код команды, LEN - длина пакета, DATA - массив данных (могут отсутствовать), CRC - циклический избыточный код для контроля корректности пакета
Эту команду получают все слейвы, но отвечает только тот, чей адрес совпал с полем ADR. Формат пакета ответа слейва может быть точно таким же, что и формат пакета команды, а может отличаться, имея, к примеру, вид:
| ADR | CMD | LEN | STAT | DATA | CRC | , где
ADR - адрес отвечающего слейва, CMD - код команды, на которую отвечает слейв, LEN - длина пакета, STAT - байт статуса, в котором биты могут обозначать текущее состояние слейва (исправен/неисправен термодатчик, целостна ли EEPROM и т.д.). DATA - данные, если они есть (например, передаваемая температура или иной параметр).
Поле DATA в пакете команды, отправляемой мастером, обычно используется, если надо передать слейву какие-то калибровочные константы, если же передается просто запрос значения температуры, то поле остается пустым, а смысл определяется кодом команды.
У слейва в пакета ответа поле DATA, наоборот, обычно задействовано, а отсутствует только в командах проверки наличия слейва.
Например, код команды 0x01 - это код проверки наличия слейва.
В начале работы мастер последовательно передает пакеты вида
| ADR | 0x01 | 0x05 | CRC | (считая CRC двухбайтным)
при этом мастер в поле ADR перебирает все адреса от 0х01 до 0хFF.
Слейв, получив пакет со "своим" адресом, отвечает
| ADR | 0x01 | 0x06 | STAT | CRC | , указывая в поле STAT текущую информацию о своем состоянии.
Мастер, "перебрав" все доступные адреса, создает у себя в памяти таблицу с адресами всех имеющихся слейвов. Если в пакете ответа слейва добавить поле типа слейва (датчик температуры, датчик давления и т.д.) то в таблице дополнительно к адресам указать и типы слейвов. В дальнейшем мастер работает только с найденными слейвами.
Сам же обмен делается так - слейв в прерывании по приему байта помещает принятый байт в пакет приема, используя переменную количества принятых байт как смещение относительно начального адреса пакета приема, после каждого приема сравнивает длину принимаемого пакета с количеством принятых байт. Как только принят весь пакет, рассчитывается CRC, если она корректна, проверяется адрес, если он совпал, проверяется корректность кода команды, если все ОК, то эта команда выполняется. Если что-то не совпало или некорректно - переменная количества принятых байт обнуляется и следующий принятый байт будет первым байтом нового принимаемого пакета.
Ну вот примерно как-то так... Если нужны подробности - спрашивайте.