Терминальная программа – это многофункциональный кроссплатформенный инструмент инженера, который позволяет взаимодействовать с внешним устройством или сервером. Приложение поддерживает различные вариации протокола Modbus, а также дает возможность работы с данными в строковом или байтовом формате.
В этом обновлении я расширил работу с макросами. Теперь макросы поддерживают отправку нескольких сообщений за раз. А еще появился конструктор макроса, в котором можно отправлять как отдельные сообщения, так и весь макрос целиком.
Подробнее читайте в этой статье!

Для начала ознакомимся со списком изменений:
Расширена работа с макросами. Макрос разделен на команды. Теперь в одном макросе можно отправить несколько сообщений за раз.
В проект внедрен DI.
Рефакторинг. Уменьшена связность между компонентами.
Исправлены мелкие ошибки.
Начну свой рассказ с DI. Насколько он нужен в оконном приложении? Вопрос философский. Но на него можно дать универсальный ответ - "Зависит от проекта".
Если мы говорим о разработке больших приложении, то без использования внедрения зависимостей мы со временем выстрелим себе в ногу. Сложные взаимосвязи между компонентами как раз и поспособствуют этому.
Использование DI в коде позволит внести еще немного стандартизации при разработке и уменьшит взаимосвязь между классами. Эта как раз те основные причины, по которым я и решил внедрить DI в этом проекте. Так как он написан на C#, то я взял стандартную реализацию от Microsoft - Microsoft.Extensions.DependencyInjection.
К сожалению, примеров использования DI именно в оконных приложениях довольно мало. Поэтому мне пришлось какие то вещи додумывать самому. Возможно, как-нибуть напишу об этом отдельно. А пока вы можете посмотреть код этого проекта в качестве примера.
И теперь перейдем к самому интересному :)
Расширенные макросы
Макрос разделен на команды. Каждая команда – это отправка одного сообщения.
В окне "Макросы" при нажатии на кнопку "Создать макрос" или на кнопку с шестерёнкой у какого-то отдельного макроса открывается конструктор.


В конструкторе есть возможность отправки отдельных команд или всего макроса полностью. Для этого предусмотрены соответствующие кнопки в шапке макроса и у каждой команды в списочной форме.
Рабочее поле разделено на четыре части.
Сверху находится поле редактирования имени макроса, а левее от него кнопки сохранения и запуска макроса. Перед сохранением или запуском происходит проверка. В случае наличия ошибок, появляется сообщение с перечислением всех найденных ошибок.
Нижняя часть разделена пополам. Слева находится список со всеми командами макроса и кнопка добавления команды, а справа форма редактирования выбранной команды. Редактируемая команда подсвечивается в списке.
Для каждого режима работы предусмотрена своя форма редактирования команды.
У каждой команды в списке есть четыре компонента.

Рассмотрим их слева направо.
Кнопка запуска команды.
Если команда не содержит ошибок и хост подключен, то сообщение будет отправлено. В противном случае появится сообщение с описанием ошибки.Поле с названием команды.
Оно доступно только для выделения и копирования. Изменить название команды можно только в форме редактирования.Кнопка открытия/закрытия формы редактирования команды.
Редактируемая команда подсвечивается в списке. Также можно не закрывая форму редактирования текущей команды, нажать на эту же кнопку у другой команды и редактировать уже её.Кнопка удаления команды.
Просто так удалить нельзя, нужно подтвердить удаление в диалоговом окне.
Еще хочу предупредить, что я изменил структуру файлов макросов. Поэтому макросы из версии 3.1.0 не будут работать в этой версии приложения.
На этом с макросами все.
В прошлых статьях я почему то обходил вниманием Modbus сканер, который был добавлен еще в версии 3.0.0. Я даже в документации забыл его указать :)
Modbus сканер
Modbus сканер служит для поиска подчиненных устройств на линии связи. Эта функция доступна только при подключении по последовательному порту, т.к. при подключении по TCP/IP в ней смысла нет.

В поле «Устройства» будут отображаться адреса найденных устройств. Если после окончания поиска это поле пустое, то это означает, что ни одно устройство не ответило во всем диапазоне допустимых адресов (1 – 255). Широковещательный адрес 0 не учитывается, т.к. согласно документации устройства не должны на него отвечать.
В правом верхнем поле указан PDU, с которым проводится опрос.
Важно понять, как работает пауза между отправками сообщений. Эта пауза состоит из двух составляющих – пользовательский таймаут, который указывается в поле «Пауза», и таймаут чтения, в течении которого приложение ждет ответа от устройства. Таймаут чтения задается в настройках.
Важно!
Возможна ситуация, когда после опроса всех адресов поле «Устройства» пустое. При этом достоверно известно, что на линии связи находятся исправно работающие устройства. Это объясняется тем, что подчиненное устройство по каким-либо причинам не успело обработать сообщение и отправить ответ. В таких случаях рекомендуется увеличить пользовательский таймаут в поле «Пауза».
Итого
Это уже четвертая статья из этого цикла, а версия приложения поднялась до 3.2.0 (обновлено до версии 3.2.1). Теперь с помощью него можно создавать более удобные макросы.
Приложение все еще тестируется на Windows 10/11, Ubuntu и Astra Linux.
Буду рад обратной связи в комментариях.
Смотрите также:
Кроссплатформенный терминал Modbus TCP / RTU / ASCII с открытым исходным кодом: Часть 3
Кроссплатформенный терминал Modbus TCP / RTU / ASCII с открытым исходным кодом: Часть 2
Терминал Modbus TCP / RTU / ASCII с открытым исходным кодом: Часть 1
UPD от 13.04.2025
Иногда мне в личные сообщения пишут с просьбами о помощи с приложением или с оборудованием. Чаще всего получается помочь. И чтобы облегчить себе дальнейшую разработку и консультации, я расширил функционал MessageBox.
Вот список дополнений:
В MessageBox появились иконки, которые зависят от типа сообщения.
В MessageBox стал доступен "Отчет об ошибке", который появляется у сообщений с типом ошибки. Отчет можно посмотреть в отдельном окне, копировать в буфер обмена или в текстовый файл.
Ссылки на скачивание обновлены до версии 3.2.1. Но предыдущие версии приложения вы можете найти по этой ссылке.