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

 
 
> CANOpen Details, CANOpen for STM32
sayberex
сообщение May 12 2011, 07:47
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 18-11-07
Пользователь №: 32 429



Начал я для себя реализацию CANOpen под STM32 микроконтроллеры. Пытаюсь портировать CANOpenNode и попутно разобраться как же работает CANOpen. Приобрел интерфейсную плату (PISO-CAN200D, PCI to CAN, 2 channel) от ICP-DAS. Они также поставляют библиотеку CANOpen Master Library для винды. И даже шаровый OPC сервер (вдруг кому интересно). Так вот к библиотеке идут примеры. Запускаю я один из них и при инициализации он у меня спрашивает NMT состояние моего слейва ответ проходит успешно потом через SDO сервис как я понимаю он у меня запрашивает отдать ему COB ID SYNC я посылаю ответ а он мне говорит мол таймаут. Что в моем ответе не правильно?
Запрос с PC
STD ID = 0x606
RTR = NO
Length = 4
Data[0] = 0x40
Data[1] = 0x05
Data[2] = 0x10
Data[3] = 0x00

Ответ от MCU
STD ID = 0x606
RTR = NO
Length = 8
Data[0] = 0x40
Data[1] = 0x05
Data[2] = 0x10
Data[3] = 0x00
Data[4] = 0x80
Data[5] = 0x00
Data[6] = 0x00
Data[7] = 0x00

Кстати не взирая на то что утилита говорит тайм-аут ответ от меня все равно приходит(проверял в CAN Utility от ICP-DAS) просто у нее наверно тайм-аут означает как то что истекло время ожидания так и неправильный ответ.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sayberex
сообщение May 19 2011, 12:13
Сообщение #2





Группа: Участник
Сообщений: 13
Регистрация: 18-11-07
Пользователь №: 32 429



Еще немного поэкспериментировал с CANOpen зашел в очередной тупик. Проблема в алгоритме отправки сообщений. Вот мое видение алгоритма отправки.
В конце алгоритма обработки проверять нет ли новых сообщений для отправки и запускать очередь отправки сообщений если она прервалась а сообщения готовые к отправки появились.

void ProcessMain(void) {
//Heartbeat or Node Guard process
if CO_CANRX[NMT_MSG].NewMsg {
if CAN_TransmitStatus(CAN1,1) == CANTXOK {
//Transmit NMT Node Status
CO_CANTX[NMT_MSG].NewMsg = 1;
}
}

//Emergency message process
....

//SDO Service process
....

//Process User -> processing PDO and other

if (IsNewMsg()) { \\если есть сообщения для отправки
if (!IsSequenceRun) { \\Если очередь прерываний завершина то снова запустить
StartTXSequence();
}
}
}

Может кто то видит в этом алгоритме какой нибудь недостаток или предложит лучшую реализацию. И вобще правильно ли что синхронные PDO будут отправляться в ProcessUser или им нужен свой таймер чтобы они отправлялись по четко детерминированному времени тогда это вызывает много вопросов. Планируется что ProcessMain может вызываться как внутри основного цикла так и в Timer ISR.
Go to the top of the page
 
+Quote Post



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

 


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


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