реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 5 >  
Reply to this topicStart new topic
> FreeModbus
_Pasha
сообщение Mar 7 2011, 16:50
Сообщение #31


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(alux @ Mar 7 2011, 14:47) *
Еще для полного счастья нужно использовать функции для записи\чтения битов ForceSingleCoil (0x05), ReadSingleCoil(0x01).
Приведите, пожалуйста, пример с использованием этих функций. Флаги, битовое поле в области ввода-вывода ниже 0x1f.

А какой гешефт их так описывать?
При адресации можно использовать offsetof()/8, биты задавать перечислениями. Получится
Код
extern
#ifdef CORE_32
#define CORE_WD 32
char
#else
#define CORE_WD 8
int
#endif
mb_coils[];
enum coils {foo,bar};
static inline bool coil_r(enum coils coil);
static inline void coil_w(enum coils coil , bool val);
bool coil_r(enum coils coil)
{
  return (mb_coils[coil / CORE_WD] & (1 << coil & (CORE_WD-1)))?true:false;
}
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 20 2011, 21:37
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



При использовании функции 0x10 PresetMultipleRegisters запрос от мастера идет как положено (проверяю в Serial Port Monitor), а ответа от слева не поступает. Функция 0x06 PresetSingleRegister работает как положено. В mbconfig.h функция 0x10 разрешена :
Код
#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED  (  1 )

В чем может быть проблема?
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Mar 21 2011, 05:29
Сообщение #33


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Callback написали для этой функции?
Go to the top of the page
 
+Quote Post
alux
сообщение Mar 21 2011, 07:09
Сообщение #34


Знающий
****

Группа: Свой
Сообщений: 589
Регистрация: 24-04-05
Пользователь №: 4 447



как выяснилось, проблема не в этой функции (0x10), а в адресе регистров, в которые нужно писать. У меня регистры (переменные типа int) упакованы в структуру :
Код
typedef struct
{
    int NumSensorsDS;            
    int TemperatureTC[NUM_SENSORS];
    int Parameter[2][NUM_SENSORS];
    int Temperature[2];      
    int NumSensorsTC;    
    int Cable;          
    int Average;              
    int Data;              
    long Accum;    
}TValue;

В регистры Cable, Average записываются значения и отдается нормальный ответ от устройства при помощи ф-ций PresetSingleRegister,PresetMultipleRegisters, а если указать адрес записываемого регистра в NumSensorsTC, то запрос остается без ответа. Почему, не пойму никак?..

PS. Callback-функции написаны и работают.

PS2. Вроде нашел... В Callback-функции использую ф-ции записи во флеш.
Код
                            WriteFlashByte(FLASH_PARAMETER_LOCATION + 2 + 1, *(pucRegBuffer));
                            WriteFlashByte(FLASH_PARAMETER_LOCATION + 2, *(pucRegBuffer + 1));

Если закоментировать эти строки, то ответ нормальный появляется. Наверно, правильно сделать так : в колбэк-функции устанавливать флаг, а в главном цикле по этому флагу писать во флеш.
Go to the top of the page
 
+Quote Post
ISK2010
сообщение Apr 19 2011, 04:45
Сообщение #35


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Доброго времени суток!

Занимаюсь изучением МК STM32F105. У меня есть два устройства с RS485 полудуплексом. Хочу их связать, чтобы управлять первым и получать от него измерения с АЦП. Почитал и понял, что нужно применить ModBus как широко распространенный протокол. Велосипед изобретать не хочу, поэтому гляжу в сторону freeModBus. Скачал версию 1.5, но...без поллитра сока не разобраться. А сока нет...

Правильно ли я понял, что нужно свои функции приема-посылки написать?

Не могу понять, вот допустим я в фоне второго устройства хочу получить температуру с первого устройства, что делать? Какую функцию использовать?

Пожалуйста помогите разобраться. Может у кого-нибудь есть простенький пример приклеивания FreeModBus к STM32F10X?

Go to the top of the page
 
+Quote Post
MrYuran
сообщение Apr 19 2011, 13:52
Сообщение #36


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ISK2010 @ Apr 19 2011, 08:45) *
Не могу понять, вот допустим я в фоне второго устройства хочу получить температуру с первого устройства, что делать? Какую функцию использовать?
Пожалуйста помогите разобраться. Может у кого-нибудь есть простенький пример приклеивания FreeModBus к STM32F10X?

Это нужно писать мастер. (FreeModbus - это Slave)
То есть, необходимы функции, которые будут отправлять мастер-пакеты и ожидать ответа.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
ISK2010
сообщение May 13 2011, 13:11
Сообщение #37


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



А как slave должен реагировать на прием пустого ADU? Т.е. который адресован ему и имеет правильный CRC, но не имеет ни функции, ни данных.
Go to the top of the page
 
+Quote Post
yashok
сообщение May 14 2011, 09:03
Сообщение #38


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Цитата
который адресован ему и имеет правильный CRC, но не имеет ни функции, ни данных


Если вместо функции и данных просто нули, то при проверки кода функции, если он данную ф-цию не поодерживает, должен вернуть ошибку с номером 1 (ILLEGAL FUNCTION).
Go to the top of the page
 
+Quote Post
ISK2010
сообщение May 17 2011, 04:40
Сообщение #39


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



А CRC всех принятых пакетов рассчитывается? Или только тех, которые адресованы нам?

В FreeModbus, я посмотрел, для всех принятых фреймов проверяется минимальная длина и CRC. Но не могу понять зачем. Ведь можно сначала проверять адрес, и тратить время на расчет CRC только "своих" фреймов.

Сообщение отредактировал ISK2010 - May 17 2011, 05:07
Go to the top of the page
 
+Quote Post
yashok
сообщение May 17 2011, 05:04
Сообщение #40


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



По хорошему проверка должна идти в следующей очередности:
1. Длина пакета
2. CRC
3. Адрес
4. Функция
5. Данные
Go to the top of the page
 
+Quote Post
ISK2010
сообщение May 17 2011, 05:10
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Цитата(yashok @ May 17 2011, 09:04) *
По хорошему проверка должна идти в следующей очередности:
1. Длина пакета
2. CRC
3. Адрес
4. Функция
5. Данные


Но почему? Только для того, чтобы вести статистику всех принятых фреймов с ошибкой CRC.


Go to the top of the page
 
+Quote Post
yashok
сообщение May 17 2011, 05:17
Сообщение #42


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Для простых случаев может и можно не проверять. А если сеть протяженная, с большим количеством слейвов, помеховая обстановка серьезная - вероятность ошибок в пакете приличная, проверка crc становится обязательной.
Go to the top of the page
 
+Quote Post
ISK2010
сообщение May 17 2011, 05:29
Сообщение #43


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Бесспорно проверка CRC обязательна. Но только для тех фреймов, которые нам адресованы. А если уже для этих фреймов не сошелся crc, то игнорируем их и инкрементируем счетчик ошибок crc.
Go to the top of the page
 
+Quote Post
yashok
сообщение May 17 2011, 06:01
Сообщение #44


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 31-08-10
Из: Минск-Витебск
Пользователь №: 59 203



Да согласен

Хотя у некторых есть счетчики которые считают ошибки в линии т.к. если есть ошибка, то не известно где именно и кому предназначен пакет.

Сообщение отредактировал yashok - May 17 2011, 05:39
Go to the top of the page
 
+Quote Post
leshij
сообщение Oct 17 2012, 07:26
Сообщение #45





Группа: Новичок
Сообщений: 3
Регистрация: 28-09-12
Из: Новосибирск
Пользователь №: 73 716



Доброго дня всем.
Пытаюсь поднять FreeRTOS(7.2)+lwip(1.4)+FreeModbus(1.5)(TCP), FreeRTOS+lwip на LM3S9B95(board EVB-9B95) худо-бедно справился, пинги идут, httpserver_raw запустился, пробную страничку получил.
А вот с modbus справится не могу. Для теста взял qModMaster, т.к. работать легко с ней(основные шаги connect->read data->disconnect я выполняю по кнопками, что упрощает тест), и параллельно для надежности нечто более сложное NI OPC Server.
Connect, Disconnect работают отлично, вызываются prvxMBTCPPortAccept() и prvxMBTCPPortReceive()(здесь он уходит в prvvMBPortReleaseClient и закрывает соединение).
А вот с чтением данных у меня возникли проблемы, при чтении попадаю я в prvxMBTCPPortReceive(), далее по функции доходит до (void)xMBPortEventPost(EV_FRAME_RECEIVED); и из нее не возвращается, ползу по ней дебагером
Код
//portevent.c
BOOL xMBPortEventPost( eMBEventType eEvent )
{
    eMailBoxEvent = eEvent;
    sys_mbox_post( xMailBox, &eMailBoxEvent );
    return TRUE;
}

он уходит в sys_mbox_post();
Код
//sys_arch.c
void sys_mbox_post( sys_mbox_t *pxMailBox, void *pxMessageToPost )
{
    while( xQueueSendToBack( *pxMailBox, &pxMessageToPost, portMAX_DELAY ) != pdTRUE );
}

и на сколько я понимаю крутится внутри xQueueGenericSend().
После чего отваливается ethernet, т.е. пинги не проходят вообще, да и походу роутер не видит плату, FreeRTOS в это время работает Task'и переключает исправно.
Я уже даже не знаю в какую сторону копать.
Порт modbus взят из демки MCF5235TCP, а LWIP где-то на просторах интернета

[attachment=72049:ports_lwip.zip]
[attachment=72050:port_modbus.zip]
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 5 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:23
Рейтинг@Mail.ru


Страница сгенерированна за 0.01473 секунд с 7
ELECTRONIX ©2004-2016