_Pasha 0 7 марта, 2011 Опубликовано 7 марта, 2011 · Жалоба Еще для полного счастья нужно использовать функции для записи\чтения битов 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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 20 марта, 2011 Опубликовано 20 марта, 2011 · Жалоба При использовании функции 0x10 PresetMultipleRegisters запрос от мастера идет как положено (проверяю в Serial Port Monitor), а ответа от слева не поступает. Функция 0x06 PresetSingleRegister работает как положено. В mbconfig.h функция 0x10 разрешена : #define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED ( 1 ) В чем может быть проблема? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 21 марта, 2011 Опубликовано 21 марта, 2011 · Жалоба Callback написали для этой функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 21 марта, 2011 Опубликовано 21 марта, 2011 · Жалоба как выяснилось, проблема не в этой функции (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)); Если закоментировать эти строки, то ответ нормальный появляется. Наверно, правильно сделать так : в колбэк-функции устанавливать флаг, а в главном цикле по этому флагу писать во флеш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 19 апреля, 2011 Опубликовано 19 апреля, 2011 · Жалоба Доброго времени суток! Занимаюсь изучением МК STM32F105. У меня есть два устройства с RS485 полудуплексом. Хочу их связать, чтобы управлять первым и получать от него измерения с АЦП. Почитал и понял, что нужно применить ModBus как широко распространенный протокол. Велосипед изобретать не хочу, поэтому гляжу в сторону freeModBus. Скачал версию 1.5, но...без поллитра сока не разобраться. А сока нет... Правильно ли я понял, что нужно свои функции приема-посылки написать? Не могу понять, вот допустим я в фоне второго устройства хочу получить температуру с первого устройства, что делать? Какую функцию использовать? Пожалуйста помогите разобраться. Может у кого-нибудь есть простенький пример приклеивания FreeModBus к STM32F10X? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrYuran 16 19 апреля, 2011 Опубликовано 19 апреля, 2011 · Жалоба Не могу понять, вот допустим я в фоне второго устройства хочу получить температуру с первого устройства, что делать? Какую функцию использовать? Пожалуйста помогите разобраться. Может у кого-нибудь есть простенький пример приклеивания FreeModBus к STM32F10X? Это нужно писать мастер. (FreeModbus - это Slave) То есть, необходимы функции, которые будут отправлять мастер-пакеты и ожидать ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба А как slave должен реагировать на прием пустого ADU? Т.е. который адресован ему и имеет правильный CRC, но не имеет ни функции, ни данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yashok 0 14 мая, 2011 Опубликовано 14 мая, 2011 · Жалоба который адресован ему и имеет правильный CRC, но не имеет ни функции, ни данных Если вместо функции и данных просто нули, то при проверки кода функции, если он данную ф-цию не поодерживает, должен вернуть ошибку с номером 1 (ILLEGAL FUNCTION). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 17 мая, 2011 Опубликовано 17 мая, 2011 (изменено) · Жалоба А CRC всех принятых пакетов рассчитывается? Или только тех, которые адресованы нам? В FreeModbus, я посмотрел, для всех принятых фреймов проверяется минимальная длина и CRC. Но не могу понять зачем. Ведь можно сначала проверять адрес, и тратить время на расчет CRC только "своих" фреймов. Изменено 17 мая, 2011 пользователем ISK2010 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yashok 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба По хорошему проверка должна идти в следующей очередности: 1. Длина пакета 2. CRC 3. Адрес 4. Функция 5. Данные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба По хорошему проверка должна идти в следующей очередности: 1. Длина пакета 2. CRC 3. Адрес 4. Функция 5. Данные Но почему? Только для того, чтобы вести статистику всех принятых фреймов с ошибкой CRC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yashok 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба Для простых случаев может и можно не проверять. А если сеть протяженная, с большим количеством слейвов, помеховая обстановка серьезная - вероятность ошибок в пакете приличная, проверка crc становится обязательной. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ISK2010 0 17 мая, 2011 Опубликовано 17 мая, 2011 · Жалоба Бесспорно проверка CRC обязательна. Но только для тех фреймов, которые нам адресованы. А если уже для этих фреймов не сошелся crc, то игнорируем их и инкрементируем счетчик ошибок crc. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yashok 0 17 мая, 2011 Опубликовано 17 мая, 2011 (изменено) · Жалоба Да согласен Хотя у некторых есть счетчики которые считают ошибки в линии т.к. если есть ошибка, то не известно где именно и кому предназначен пакет. Изменено 17 мая, 2011 пользователем yashok Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LeLLIuj 0 17 октября, 2012 Опубликовано 17 октября, 2012 · Жалоба Доброго дня всем. Пытаюсь поднять 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 где-то на просторах интернета Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться