1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/IsYourGod-XTinyModbus

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

XTinyModbus

Небольшой встроенный стек протокола Modbus, написанный на языке C, поддерживает режимы master и slave, дискретное сопоставление, неблокирующий и блокирующий режимы чтения и записи, а также предоставляет полный пример, может быть перенесён на различные процессоры, прост в использовании, портативен.

0. Log

2022/10/7

  • Добавлен набор API для разрешения смешанных вызовов в режиме хоста в состоянии «голого металла» в неблокирующем и блокирующем режимах. Проверьте функции, связанные с xx_MixXXX в MDM_RTU_Fun.c.
  • Исправлена ошибка расчёта временного интервала.

2020/11/23

  • Оптимизация стратегии анализа протокола slave, более стабильная.
  • Оптимизирована очередь цикла для повышения адаптивности.
  • Память очереди цикла изменена на указанную пользователем.
  • В хост добавлена поддержка ОСРВ, которая может быть открыта через MD_RTU_USED_OS под md_rtu_config.h, по умолчанию закрыта, была перенесена на XTinyRTOS, может быть изменена путём переноса md_rtu_sysinteraction.c. Другие модификации и оптимизации.

2020/9/24

  • Добавлена функция отсутствия опроса при отключении slave, мастер может использовать функцию MDM_RTU_CB_SetDisPollEnFlag для её установки. Можно использовать функцию MDM_RTU_CB_ClrDisFlag для сброса.
  • Добавлен простой контроллер отправки данных хостом.
  • Исправлена ОШИБКА смешанного вызова режима блокировки и неблокирующего режима хоста.
  • Все комментарии в коде изменены на английские.

2020/9/6

  • Добавлен пример с несколькими slave.
  • Добавлено несколько макросов для тестирования.

2020/8/31

  • Настройка стека протоколов MD_ RTU с помощью config. H.
  • Добавлены тестовые макроконфигурации.
  • Модификация имени файла.
  • Некоторые другие изменения.

2020/6/6

  • Исправлена ошибка размера конца.
  • Исправления ошибок slave в функциях чтения дискретного сопоставления.
  • Slave поддерживает широковещательные адреса.
  • Master host добавляет кэш отправки.

2020/4/28

  • Дискретные сопоставления для master hosts должны будут указывать номера slave вместо совместного использования.

2020/4/23

  • Slave исправляет ОШИБКУ в макросе CRC.
  • Исправлены несоответствия размеров таблицы дискретных сопоставлений master и slave.
  • Master исправляет ошибки, вызывающие ошибки в командах чтения и зависимых переменных.

Место инициализации последовательного порта изменено на md_rtu_serial.c и mdm_rtu_serial.c. Исправлены некоторые соглашения об именах.

2020/4/13

  • Slave добавляет кэш отправки, который является необязательным и включается по умолчанию через конфигурацию макроса в md_rtu_fun. h.

2020/4/12

  • Добавлен контроль преобразования приёмопередатчика.

2020/4/10

  • Код для добавления комментариев, спецификация комментариев, оптимизация структуры хранения файлов.

2020/4/4

  • Slave устраняет ОШИБКУ с минимальной вероятностью того, что переполнение таймера может вызвать потерю пакета.

2020/4/3

  • Salve изменяет дискретное сопоставление, и ввод отображается отдельно.

2020/3/31

  • Salve добавляет функцию обратного вызова записи хоста listen.
  • Salve добавляет частичную поддержку исключений и кодов ошибок.
  • Salve устраняет ошибку отправки несмежных кадров.
  • Оптимизация эффективности CRC16.
  1. Особенности

Функции slave ModBus RTU:

  • реализация slave Modbus RTU;
  • присоединение механизма двойной очереди;
  • реализация функциональных кодов 1, 2, 3, 4, 5, 6, 15, 16;
  • поддержка дискретного сопоставления между адресом Modbus и локальным адресом;
  • предоставление пользователю интерфейса чтения и записи адреса Modbus;
  • поддержка нескольких slave.

Функции master ModBus RTU:

  • реализация master Modbus RTU;
  • поддержка неблокирующего типа чтения и записи;
  • поддержка блокирующего типа чтения и записи;
  • поддержка регулярной повторной передачи;
  • поддержка повторной передачи по тайм-ауту;
  • поддержка чтения данных дискретного сопоставления.
  1. Как перенести

Пример даёт пример порта в серии чипов STM32F1, которые необходимо перенести на другие чипы, необходимо модифицировать md_rtu_serial.c, реализовать миграцию функций порта порта порта, и необходимо вызывать функции последовательного порта и таймера в функции прерывания.

Функция переноса последовательного порта:

/*Send function*/
void MDSSerialSendBytes(uint8 *bytes,uint16 num){
    /*The BSP sending function is called below*/
    uart_send_bytes(bytes,num);
}

Вызвать следующее... Функция в функции прерывания таймера, интервал таймера равен 100 мкс:

/*Эта функция вызывается в таймере*/
void MDSTimeHandler100US(uint32 times){
    if(_pModbus_RTU==NULL){return;}
    _pModbus_RTU->mdRTUTimeHandlerFunction(_pModbus_RTU ,times);
}

Следующая функция вызывается при прерывании последовательного порта приёма:

/*BSP-слой прерывает вызов этой функции*/
void MDSSerialRecvByte(uint8 byte){
    if(_pModbus_RTU==NULL){return;}
    _pModbus_RTU->mdsRTURecByteFunction(_pModbus_RTU , byte);
}
  1. Как использовать

Можно посмотреть пример использования файла md_rtu_app.c. Следующий код добавляет два элемента сопоставления адресов, и адрес Modbus соответствует локальному адресу:

uint16 regCoilData0[32]={1,2,3,4,5,6,7,8,9,10,11,12};
RegCoilItem regCoilItem0={
. ModbusAddr =0x0000, /* адрес в MODBUS */
. ModbusData =regCoilData0, /* сопоставленный блок памяти */
. ModbusDataSize =32, /* размер сопоставления */
.addrtype =REG_TYPE /* тип сопоставления */
};
uint16 regCoilData1[4]={0};
RegCoilItem regCoilItem1={
. ModbusAddr =0x0000, /* адрес в MODBUS */
. ModbusData =regCoilData1, /* сопоставленный блок памяти */
. ModbusDataSize =64, /* размер сопоставления */
.addrtype =BIT_TYPE /* тип сопоставления */
};
    /*Добавить сопоставление адресов*/
    if(RegCoilListAdd(&modbusS_RTU, &regCoilItem0)==FALSE){
        return FALSE;
    }
    if(RegCoilListAdd(&modbusS_RTU, &regCoilItem1)==FALSE){
        return FALSE;
    }

Следующий код можно использовать для чтения и записи регистров и значений катушек Modbus:

Uint16 temp = 0 XFF;
Uint16 temp1 [] = {1, 2, 3, 4, 5};
MDS_RTU_WriteBits (& modbusS_RTU, 1, 5, & temp);
MDS_RTU_WriteReg (& modbusS_RTU, 11, temp);
MDS_RTU_WriteRegs (& modbusS_RTU, 5, 5, temp1, 0).
  1. Будущие возможности

Modbus RTU хост, Modbus ASCII хост и ведомый.

XTinyModbus

Это небольшой протокол Modbus, предназначенный для встраиваемых систем, написанный на языке C, поддерживающий master и slave, поддерживающий дискретное сопоставление, поддерживающий неблокирующий и блокирующий режимы чтения и записи, а также предоставляющий полный пример, который можно перенести на различные процессоры, простой в использовании и удобный для переноса.

  1. Журнал

2020/11/23 Оптимизирована стратегия анализа протокола от машины, более стабильная Оптимизирован кольцевой буфер, что делает его более адаптируемым Кольцевой буфер изменен на пользовательский Мастеру добавлена поддержка RTOS, которую можно включить с помощью MD_RTU_Config.h MD_RTU_USED_OS, по умолчанию отключена, уже перенесена на XTinyRTOS, может быть перенесена путем изменения MD_RTU_Sysinterface.c Другие модификации и оптимизации

2020/9/24 Отключена функция повторной попытки подключения к машине, мастер может использовать MDM_RTU_CB_SetDisPollEnFlag для настройки, Может использоваться MDM_RTU_CB_ClrDisFlag для сброса. Добавлена простая отправка команд управления мастером. Исправлены ошибки, связанные с блокировкой режима работы мастера и неблокирующего режима. Все комментарии в коде были изменены на английский.

2020/9/6 Добавлен пример нескольких ведомых устройств. Добавлено несколько тестовых макросов.

2020/8/31 MD_RTU_Config.h используется для настройки стека протоколов. Тестовые макросы добавлены в MD_RTU_Config.h. Файлы переименованы. Некоторые другие модификации.

2020/6/6 Исправлено ошибка порядка байтов. Ведомый исправлена ошибка чтения функции дискретного сопоставления. Поддержка широковещательного адреса от машины. Мастер добавлен кэш отправки.

2020/4/28 Master дискретное сопоставление от машины теперь должно указывать номер ведомого устройства, а не использовать общий метод.

2020/4/23 Slave исправлена одна ошибка в CRC. Исправлена ошибка сопоставления таблицы дискретных адресов мастера и ведомого. Мастер исправлена ошибка, вызванная переменной из использования. Последовательный порт инициализирован в MD_RTU_Serial.c и MDM_RTU_Serial.c. Исправлено несколько соглашений об именах.

2020/4/13 Slave добавлен кэш отправки, эта опция включена с помощью макроса в MD_RTU_Fun.h, включена по умолчанию.

2020/4/12 Добавлена возможность управления отправкой и получением.

2020/4/10 Код дополнен комментариями, стандартизированы комментарии, оптимизирована структура хранения файлов.

2020/4/4 Slave добавлена возможность контролировать отправку и получение.

2020/4/3 Сопоставление ведомым устройством дискретных адресов изменено, ввод разделен на сопоставление.

2020/3/31 Slave добавлено прослушивание функции обратного вызова ведущего устройства для записи. Slave добавлены частичные коды ошибок и поддержки кодов ошибок. Slave исправлена ошибка отправки без интервала кадра. Улучшена эффективность CRC16.

  1. Характеристики

Характеристики ведомого ModBus RTU:

  1. Реализация ведомого Modbus RTU
  2. Добавлен механизм двойной очереди.
  3. Реализованы функциональные коды 1,2,3,4,5,6,15,16.
  4. Поддерживает сопоставление Modbus-адреса с адресом локальной машины.
  5. Предоставляет интерфейс пользователя для чтения и записи Modbus-адресов.
  6. Поддержка нескольких ведомых устройств.

Характеристики ведущего ModBus RTU:

  1. Реализация ведущего Modbus RTU.
  2. Поддержка неблокирующего чтения и записи.
  3. Поддержка блокирующего чтения и записи.
  4. Поддержка повторной отправки.
  5. Поддержка тайм-аута повторной передачи.
  6. Поддержка чтения данных дискретного сопоставления.
  1. Перенос

В примере приведен перенос на чип STM32F1, для переноса на другие чипы необходимо изменить MD_RTU_Serial.c для реализации функций последовательного порта и вызова функций последовательного порта и таймера в функции прерывания. Функции последовательного порта для переноса:

/*Отправка функции*/
void MDSSerialSendBytes(uint8 *bytes,uint16 num){
    /*Вызвать функцию отправки BSP ниже*/
    uart_send_bytes(bytes,num);
}

Вызов функции в функции прерывания таймера с интервалом 100 мкс:

/*Функция таймера вызывается в функции прерывания*/
void MDSTimeHandler100US(uint32 times){
    if(_pModbus_RTU==NULL){return;}
    _pModbus_RTU->mdRTUTimeHandlerFunction(_pModbus_RTU ,times);
}

В функции прерывания последовательного приема вызовите следующую функцию:

/*Уровень BSP прерывает прием вызова этой функции*/
void MDSSerialRecvByte(uint8 byte){
    if(_pModbus_RTU==NULL){return;}
    _pModbus_RTU->mdsRTURecByteFunction(_pModbus_RTU , byte);
}
``` **regCoilData0[32]={1,2,3,4,5,6,7,8,9,10,11,12}**

RegCoilItem regCoilItem0={
    .modbusAddr=0x0000,             /* Адрес в MODBUS */
    .modbusData=regCoilData0,   /* Отображаемый блок памяти */
    .modbusDataSize=32,             /* Размер отображения */
    .addrType=REG_TYPE              /* Тип отображения */
};

uint16 regCoilData1[4]={0};

RegCoilItem regCoilItem1={
    .modbusAddr=0x0000,             /* Адрес в MODBUS */
    .modbusData=regCoilData1,   /* Отображаемый блок памяти */
    .modbusDataSize=64,             /* Размер отображения */
    .addrType=BIT_TYPE              /* Тип отображения */
};

/* Добавление отображения адреса */
if(RegCoilListAdd(&modbusS_RTU, &regCoilItem0)==FALSE){
    return FALSE;
}

if(RegCoilListAdd(&modbusS_RTU, &regCoilItem1)==FALSE){
    return FALSE;
}

Следующий код позволяет реализовать чтение и запись значений регистров и катушек Modbus на стороне пользователя:

    uint16 temp=0xff;
    uint16 temp1[]={1,2,3,4,5};
    MDS_RTU_WriteBits(&modbusS_RTU,1,5,&temp);
    MDS_RTU_WriteReg(&modbusS_RTU,11, temp);
    MDS_RTU_WriteRegs(&modbusS_RTU,5,5, temp1,0);
  1. Будущие функции Modbus ASCII хост и клиент.

  2. Спасибо за внимание Фиолетовый § пыль, зависимый лист знает осень

Примечание: В ответе сохранены оригинальное форматирование и спецсимволы.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Небольшой встроенный стек протокола Modbus, написанный на языке C, поддерживает ведущий и ведомый режимы, дискретное сопоставление, неблокирующий и блокирующий режимы чтения и записи, а также предоставляет полный пример. Может быть перенесён на разные процессоры, прост в использовании, портативен. Развернуть Свернуть
GPL-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/IsYourGod-XTinyModbus.git
git@api.gitlife.ru:oschina-mirror/IsYourGod-XTinyModbus.git
oschina-mirror
IsYourGod-XTinyModbus
IsYourGod-XTinyModbus
master