Использование FreeModbus версии V1.6 для хоста
FreeModbus — это открытый исходный код протокола Modbus, но только для ведомых устройств. Исходный код для хост-части является платным. В интернете также не найдено хорошей открытой хост-версии Modbus. Поэтому была разработана поддерживающая режим хоста версия FreeModbus. Версия FreeModbus изменена на V1.6 и имеет следующие характеристики:
Исходный файл | Описание |
---|---|
FreeModbus\modbus\mb.c | Предоставляет настройки ведомого устройства Modbus и функции опроса для прикладного уровня |
FreeModbus\modbus\mb_m.c | Предоставляет настройки хоста Modbus и функции опроса для прикладного уровня |
FreeModbus\modbus\ascii\mbascii.c | Настройки ASCII и его конечный автомат |
FreeModbus\modbus\functions\mbfunccoils.c | Функции ведомого устройства для катушек |
FreeModbus\modbus\functions\mbfunccoils_m.c | Функции хоста для катушек |
FreeModbus\modbus\functions\mbfuncdisc.c | Функции ведомого устройства для дискретных входов |
FreeModbus\modbus\functions\mbfuncdisc_m.c | Функции хоста для дискретных входов |
FreeModbus\modbus\functions\mbfuncholding.c | Функции ведомого устройства для хранения регистров |
FreeModbus\modbus\functions\mbfuncholding_m.c | Функции хоста для хранения регистров |
FreeModbus\modbus\functions\mbfuncinput.c | Функции ведомого устройства для входных регистров |
FreeModbus\modbus\functions\mbfuncinput_m.c | Функции хоста для входных регистров |
FreeModbus\modbus\functions\mbfuncother.c | Прочие функции Modbus |
FreeModbus\modbus\functions\mbutils.c | Некоторые инструменты, используемые в протоколе |
FreeModbus\modbus\rtu\mbcrc.c | Функция проверки CRC |
FreeModbus\modbus\rtu\mbrtu.c | Настройки RUT ведомого устройства и его конечный автомат |
FreeModbus\modbus\rtu\mbrtu_m.c | Настройки RUT хоста и его конечный автомат |
FreeModbus\modbus\tcp\mbtcp.c | Настройки TCP и его конечный автомат |
FreeModbus\port\port.c | Реализует часть интерфейса переноса на «голое железо» |
FreeModbus\port\portevent.c | Реализует интерфейс переноса событий ведомого устройства |
FreeModbus\port\portevent_m.c | Реализует интерфейсы переноса событий и обработки ошибок хоста |
FreeModbus\port\portserial.c | Перенос последовательного порта ведомого устройства |
FreeModbus\port\portserial_m.c | Перенос последовательного порта хоста |
FreeModbus\port\porttimer.c | Перенос таймера ведомого устройства |
FreeModbus\port\porttimer_m.c | Перенос таймера хоста |
FreeModbus\port\user_mb_app.c | Определяет буфер данных ведомого устройства, реализует обратный вызов функций Modbus |
FreeModbus\port\user_mb_app_m.c | Определяет буфер данных хоста, реализует обратный вызов функций Modbus |
Примечание: Все файлы с суффиксом _m являются обязательными для использования в режиме хоста.
Перенос протокола включает в себя две части: аппаратное обеспечение и программное обеспечение. Пользователи могут выбрать в соответствии со своими потребностями.
Примечание: Следующее описание в основном относится к режиму хоста FreeModbus.
Программное обеспечение поддерживает перенос на операционные системы реального времени и «голые» системы. Оно также поддерживает одновременную работу одного хоста с одним ведомым устройством. Кроме того, пользователи могут изменять обратные вызовы событий протокола, чтобы запросы хоста использовали блокирующие и неблокирующие режимы; в отношении ресурсов хоста пользователи также могут устанавливать таймауты ожидания и другие функции.
В настоящее время протокол поддерживает операционные системы, включая RT-Thread (подробности см. в исходном коде проекта), UCOS и FreeRTOS.
При переносе операционной системы и «голой» системы задействованы файлы FreeModbus\port\portevent_m.c
. Этот файл содержит следующие обратные вызовы, которые необходимо перенести:
Обратные вызовы | Описание функции |
---|---|
xMBMasterPortEventInit | Инициализация событий хоста |
xMBMasterPortEventPost | Отправка события хостом |
xMBMasterPortEventGet | Получение события хостом |
vMBMasterOsResInit | Инициализация ресурсов операционной системы хоста |
xMBMasterRunResTake | Хост получает ресурсы |
vMBMasterRunResRelease | Хост освобождает ресурсы |
vMBMasterErrorCBRespondTimeout | Обратный вызов ошибки хоста при тайм-ауте ответа |
vMBMasterErrorCBReceiveData | Обратный вызов ошибки хоста при получении данных |
vMBMasterErrorCBExecuteFunction | Обратный вызов ошибки хоста при выполнении функции Modbus |
vMBMasterCBRequestScuuess | Обратный вызов успеха запроса хоста |
eMBMasterWaitRequestFinish | Обратный вызов завершения ожидания запроса хоста |
При переносе на операционную систему в основном используются технологии синхронизации потоков, связанные с событиями операционной системы. Протоколу Modbus требуется использовать механизм событий операционной системы для реализации уведомлений о событиях и ожидании получения. Потоки Modbus и Modbus Poll должны синхронизироваться через механизм событий. Хосту также нужен сигнал для управления использованием ресурсов, инициализированный по умолчанию как 1, и используется семафор для обеспечения того, чтобы только один поток мог использовать хост при одновременной отправке нескольких запросов хоста.
При переносе на «голую» систему необходимо реализовать механизм уведомления о событиях с помощью программного моделирования. Реализация синхронизации событий, ресурсов и ожидания намного сложнее, чем использование механизма синхронизации потоков операционной системы.
Определение буфера данных находится в верхней части файла FreeModbus\port\user_mb_app_m.c
, всего существует 4 типа буферов данных.
По умолчанию FreeModbus использует одномерный массив в качестве структуры данных буфера для ведомого устройства. Хост может хранить данные всех ведомых узлов в сети, поэтому хост использует двумерный массив для хранения данных всех узлов. Индекс столбца двумерного массива представляет адрес регистра, катушки или дискретного входа, а индекс строки представляет идентификатор узла ведомого устройства (но необходимо вычесть 1), например, usMRegHoldBuf[2][1]
представляет данные ведомого устройства с идентификатором 3, адрес регистра — 1.
Всего существует 4 различных типа данных Modbus, и все функции Modbus вращаются вокруг этих типов данных. Поскольку структура данных разных пользователей может отличаться, соответствующий способ обработки Modbus также будет отличаться. Таким образом, пользователям необходимо настроить обработку каждого типа данных в соответствии с собственной структурой данных буфера. Все обратные вызовы обработки данных Modbus следующие:
Обратные вызовы | Описание функции |
---|---|
eMBMasterRegInputCB | Обратные вызовы ввода регистра |
eMBMasterRegHoldingCB | Обратные вызовы удержания регистра |
eMBMasterRegCoilsCB | Обратные вызовы катушки |
Для структуры буфера данных в форме массива исходный код уже перенесён, можно использовать его напрямую. Также можно использовать библиотеку EasyDataManager, которая использует список в качестве буфера и поддерживает событийное управление для автоматического уведомления приложения об изменениях данных.
При переносе стека протокола Modbus на хост-машину необходимо изменить конфигурацию последовательного порта и таймера. Файлы находятся в папке port. Пользователь должен выполнить перенос в соответствии с характеристиками своего центрального процессора.
Примечание: стек протоколов по умолчанию включает файл переноса для STM32F103X. Пользователи могут использовать его в качестве примера для переноса.
Здесь мы кратко обсудим перенос на основе операционной системы и фреймворка драйвера устройства. В будущем стек протоколов будет поддерживать перенос на фреймворк драйвера устройства RT-Thread. Пользователям не нужно беспокоиться о процессе переноса нижнего уровня, если их микроконтроллеры поддерживают BSP (Board Support Package) от RT-Thread, что снижает стоимость переноса.
Файлы переноса для последовательного порта находятся в FreeModbus\port\portserial_m.c. В этом файле пользователь должен внести изменения в следующие интерфейсы:
Интерфейс | Описание функции |
---|---|
vMBMasterPortSerialEnable | Включает и отключает функции отправки и получения через последовательный порт. Например, при использовании шины 485 необходимо обратить внимание на переключение режима приёма и передачи. |
vMBMasterPortClose | Закрывает последовательный порт |
xMBMasterPortSerialInit | Инициализация последовательного порта. Если используется шина 485, инициализация переключения режима приёма и передачи также должна быть выполнена здесь. |
xMBMasterPortSerialPutByte | Отправляет один байт данных через последовательный порт. |
xMBMasterPortSerialGetByte | Получает один байт данных через последовательный порт. |
prvvUARTTxReadyISR | Обработчик прерывания завершения передачи через последовательный порт. Согласно стандартному методу, просто вызовите метод pxMBMasterFrameCBTransmitterEmpty. |
prvvUARTRxISR | Обработчик прерывания приёма через последовательный порт. Согласно стандартному методу, просто вызовите метод pxMBMasterFrameCBByteReceived. |
Кроме того, в конце файла необходимо добавить программу обслуживания последовательного порта, предоставленную центральным процессором. Переместите интерфейсы программы обработки прерываний отправки и приёма в соответствующие программы обработки прерываний.
Файлы переноса таймера находятся в FreeModbus\port\porttimer_m.c. В этом файле пользователю необходимо внести изменения в следующие интерфейсы:
Интерфейс | Описание функции |
---|---|
xMBMasterPortTimersInit | Инициализирует таймер, копирует предварительное значение частоты и значение времени T3.5 в usPrescalerValue и usT35TimeOut50us соответственно. |
vMBMasterPortTimersT35Enable | Устанавливает таймер для отсчёта времени T3.5. |
vMBMasterPortTimersConvertDelayEnable | Устанавливает таймер для отсчёта задержки преобразования кадра. |
vMBMasterPortTimersRespondTimeoutEnable | Устанавливает таймер для отсчёта тайм-аута ответа. |
vMBMasterPortTimersDisable | Отключает таймер, таймер прекращает отсчёт. |
prvvTIMERExpiredISR | Обработчик прерывания таймера. Согласно стандартному методу, просто вызовите метод pxMBMasterPortCBTimerExpired. |
Примечание:
- usPrescalerValue и usT35TimeOut50us определены в верхней части файла.
- Задержки преобразования кадров и тайм-аут ответа определяются в файле mbconfig.h в каталоге FreeModbus\modbus\include. Пользователи могут настроить их в соответствии со своими потребностями.
Помимо вышеперечисленных интерфейсов, пользователь должен добавить программу обработки прерываний таймера, предоставленную центральным процессором, в конец файла. Перенесите интерфейс программы обработки прерываний таймера в программу обработки.
Использование Modbus Master отличается от использования Modbus Slave. Slave ожидает запросов от Master, а Master активно отправляет запросы и обрабатывает ответы Slave. Когда Master отправляет широковещательный запрос, Slave не должен отправлять ответ, поэтому широковещательные запросы подходят для команд записи данных Slave, но не подходят для чтения данных Slave. Все методы запроса в API возвращают значения одного формата. Значения возврата имеют следующее значение:
Значение возврата | Описание |
---|---|
MB_MRE_NO_ERR | Нормальный, без ошибок |
MB_MRE_NO_REG | Ошибка адреса регистра, катушки или дискретного входа |
MB_MRE_ILL_ARG | Неправильный формат ввода |
MB_MRE_REV_DATA | Ошибка приёма данных |
MB_MRE_TIMEDOUT | Тайм-аут отклика. Master не получил ответ от Slave в течение установленного времени. |
MB_MRE_MASTER_BUSY | Master занят. В течение установленного времени не было отправлено ни одного запроса. |
MB_MRE_EXE_FUN | После получения ответа от Slave, выполнение метода Modbus (функции) вызвало ошибку. |
Все методы запроса Master являются потокобезопасными и блокирующими. Во время использования, если ресурсы Master не могут быть получены в течение установленного тайм-аута, возвращается сообщение о том, что Master занят; если ресурсы Master могут быть получены в течение установленного тайм-аута, необходимо дождаться результата запроса перед возвратом.
Запись данных в определённый регистр хранения Slave.
eMBMasterReqErrCode eMBMasterReqWriteHoldingRegister( UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usRegData,
LONG lTimeOut );
Параметр | Описание |
---|---|
ucSndAddr | Адрес Slave для запроса, 0 означает широковещательную рассылку. |
usRegAddr | Адрес регистра хранения |
usRegData | Данные для записи |
lTimeOut | Время ожидания запроса. Поддерживает бесконечное ожидание, используя параметры бесконечного ожидания операционной системы. |
Запись данных в несколько регистров хранения Slave.
eMBMasterReqErrCode eMBMasterReqWriteMultipleHoldingRegister( UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usNRegs,
USHORT * pusDataBuffer,
LONG lTimeOut )
Параметр | Описание |
---|---|
ucSndAddr | Адрес Slave для запроса, 0 означает широковещательную рассылку. |
usRegAddr | Начальный адрес регистра хранения |
usNRegs | Общее количество регистров хранения |
pusDataBuffer | Буфер данных для записи |
Чтение данных из нескольких регистров хранения.
eMBMasterReqErrCode eMBMasterReqReadHoldingRegister( UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usNRegs,
LONG lTimeOut );
Параметр | Описание |
---|---|
ucSndAddr | Адрес запрашиваемого устройства, 0 обозначает широковещательную рассылку. |
usRegAddr | Адрес регистра хранения |
usNRegs | Количество регистров |
lTimeOut | Тайм-аут запроса. Поддерживается бесконечное ожидание, для этого можно использовать параметры бесконечного ожидания операционной системы. |
Сначала чтение из нескольких регистров, затем запись в них.
eMBMasterReqErrCode eMBMasterReqReadWriteMultipleHoldingRegister( UCHAR ucSndAddr,
USHORT usReadRegAddr,
USHORT usNReadRegs,
USHORT * pusDataBuffer,
USHORT usWriteRegAddr,
USHORT usNWriteRegs,
LONG lTimeOut )
Параметр | Описание |
---|---|
ucSndAddr | Адрес запрашиваемого устройства, 0 обозначает широковещательную рассылку. |
usReadRegAddr | Адрес регистра чтения |
usNReadRegs | Количество регистров чтения |
pusDataBuffer | Буфер данных для записи |
usWriteRegAddr | Адрес регистра записи |
usNWriteRegs | Количество регистров записи |
lTimeOut | Тайм-аут запроса. Поддерживается бесконечное ожидание, для этого можно использовать параметры бесконечного ожидания операционной системы. |
Чтение данных из нескольких входных регистров.
eMBMasterReqErrCode eMBMasterReqReadInputRegister( UCHAR ucSndAddr,
USHORT usRegAddr,
USHORT usNRegs,
LONG lTimeOut );
Параметр | Описание |
---|---|
ucSndAddr | Адрес запрашиваемого устройства, 0 обозначает широковещательную рассылку. |
usRegAddr | Адрес входного регистра |
usNRegs | Количество входных регистров |
lTimeOut | Тайм-аут запроса. Поддерживается бесконечное ожидание, для этого можно использовать параметры бесконечного ожидания операционной системы. |
Запись данных в катушку запрашиваемого устройства.
eMBMasterReqErrCode eMBMasterReqWriteCoil( UCHAR ucSndAddr,
USHORT usCoilAddr,
USHORT usCoilData,
LONG lTimeOut )
Параметр | Описание |
---|---|
ucSndAddr | Адрес запрашиваемого устройства, 0 обозначает широковещательную рассылку. |
usCoilAddr | Адрес катушки |
usCoilData | Данные для записи в катушку |
lTimeOut | Тайм-аут запроса. Поддерживается бесконечное ожидание, для этого можно использовать параметры бесконечного ожидания операционной системы. |
Запись данных в несколько катушек запрашиваемого устройства.
eMBMasterReqErrCode eMBMasterReqWriteMultipleCoils( UCHAR ucSndAddr,
USHORT usCoilAddr,
USHORT usNCoils,
UCHAR * pucDataBuffer,
LONG lTimeOut)
Параметр | Описание |
---|---|
ucSndAddr | Адрес запрашиваемого устройства, 0 обозначает широковещательную рассылку. |
usCoilAddr | Начальный адрес катушек |
usNCoils | Общее количество катушек |
pucDataBuffer | Данные для записи |
lTimeOut | Тайм-аут запроса. Поддерживается бесконечное ожидание, для этого можно использовать параметры бесконечного ожидания операционной системы. |
Чтение данных из нескольких катушек.
eMBMasterReqErrCode eMBMasterReqReadCoils( UCHAR ucSndAddr,
USHORT usCoilAddr,
USHORT usNCoils)
``` **Чтение данных из нескольких дискретных входов**
Чтение данных из нескольких дискретных входов.
```C
eMBMasterReqErrCode eMBMasterReqReadDiscreteInputs( UCHAR ucSndAddr,
USHORT usDiscreteAddr,
USHORT usNDiscreteIn,
LONG lTimeOut )
Параметр | Описание |
---|---|
ucSndAddr | Адрес запрашиваемого устройства, 0 обозначает широковещательную рассылку. |
usDiscreteAddr | Адрес считываемого дискретного входа. |
usNDiscreteIn | Количество считываемых дискретных входов. |
lTimeOut | Время ожидания запроса. Поддерживает бесконечное ожидание, можно использовать параметры бесконечного ожидания операционной системы. |
Все конфигурационные параметры протокола стека находятся в файле FreeModbus\modbus\include\mbconfig.h
. В настоящее время стек протоколов поддерживает два режима: хост и клиент, а также позволяет одновременно использовать оба режима. Клиент поддерживает три режима Modbus RTU, Modbus ASCII и Modbus TCP, в то время как хост в настоящее время поддерживает только широко используемый режим Modbus RTU. При использовании хоста пользователь должен настроить задержку преобразования широковещательной рассылки, время ожидания ответа команды и количество клиентов. Следует отметить, что в настоящее время протокол стека поддерживает только последовательные адреса клиентов, начиная с адреса 1.
Здесь описывается только нормальный процесс использования хоста. Перед использованием хоста необходимо перенести протокол стека в свой проект, включая программное и аппаратное обеспечение, упомянутое выше. После завершения переноса процесс использования выглядит следующим образом:
eMBMasterInit
для инициализации стека протокола Modbus хоста, при этом выполняется инициализация некоторого оборудования, связанного с хостом.eMBMasterEnable
для запуска стека протокола Modbus хоста.eMBMasterPoll
через поток или таймер для определения периода опроса, который определяет время отклика команды.Обработка исключений в основном происходит во время нормального процесса использования хоста. Все коды ошибок API запросов хоста описаны в начале третьей главы, и пользователи должны выполнять различные действия в соответствии с характеристиками своих продуктов. Рекомендуется, чтобы пользователи самостоятельно инкапсулировали механизм повторной отправки методов запроса хоста, этот метод реализации более гибкий. Обычно повторная отправка требуется при получении ошибки кадра данных и ошибки тайм-аута команды ответа. Количество повторных отправок автоматически увеличивается на единицу. Если количество повторных отправок превышает установленное значение, считается, что клиент отключён, и все последующие команды, отправленные этому клиенту, будут заблокированы заранее; если вторая повторная отправка команды выполнена успешно, количество повторных отправок этого клиента автоматически сбрасывается до нуля.
Все эти функции могут быть реализованы с помощью методов запроса хоста или интерфейса обратного вызова в FreeModbus\port\portevent_m.c
, и пользователи могут выбирать их гибко в соответствии со своими потребностями.
Основано на лицензии BSD, подробности см. в файле LICENSE.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )