XTinyModbus
Небольшой встроенный стек протокола Modbus, написанный на языке C, поддерживает режимы master и slave, дискретное сопоставление, неблокирующий и блокирующий режимы чтения и записи, а также предоставляет полный пример, может быть перенесён на различные процессоры, прост в использовании, портативен.
0. Log
2022/10/7
2020/11/23
2020/9/24
2020/9/6
2020/8/31
2020/6/6
2020/4/28
2020/4/23
Место инициализации последовательного порта изменено на md_rtu_serial.c и mdm_rtu_serial.c. Исправлены некоторые соглашения об именах.
2020/4/13
2020/4/12
2020/4/10
2020/4/4
2020/4/3
2020/3/31
Функции slave ModBus RTU:
Функции master ModBus RTU:
Пример даёт пример порта в серии чипов 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);
}
Можно посмотреть пример использования файла 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, ®CoilItem0)==FALSE){
return FALSE;
}
if(RegCoilListAdd(&modbusS_RTU, ®CoilItem1)==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).
Modbus RTU хост, Modbus ASCII хост и ведомый.
Это небольшой протокол Modbus, предназначенный для встраиваемых систем, написанный на языке C, поддерживающий master и slave, поддерживающий дискретное сопоставление, поддерживающий неблокирующий и блокирующий режимы чтения и записи, а также предоставляющий полный пример, который можно перенести на различные процессоры, простой в использовании и удобный для переноса.
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.
Характеристики ведомого ModBus RTU:
Характеристики ведущего ModBus RTU:
В примере приведен перенос на чип 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, ®CoilItem0)==FALSE){
return FALSE;
}
if(RegCoilListAdd(&modbusS_RTU, ®CoilItem1)==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);
Будущие функции Modbus ASCII хост и клиент.
Спасибо за внимание Фиолетовый § пыль, зависимый лист знает осень
Примечание: В ответе сохранены оригинальное форматирование и спецсимволы.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )