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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> CANFestival, посылка PDO запроса
Ekka
сообщение Dec 8 2017, 07:16
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Привет всем! Помогите, пожалуйста разобраться. Битый час сижу...
Не получается отправить PDO. Может, не так отправляю или словарь не правильно настроен, или вообще инициализирую не так...
Использую генератор OD на Питоне. objdictedit.py.

Вот код настройки ( может, ошибка супер-тупая, не пинайте, если, кто что знает, растолкуйте мне, пожалуйста)
Есть один Потребитель и один Производитель. При запросе на активацию Потребителя подчиненный узел переходит в сотояние готовности и присылает Boot-Up, а дальше
ерунда какая-то... Node_Guard или просто муть.
Не пинать, пжлста, учусь.

у Producer

CODE
int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();

/* Initialize all configured peripherals */
MX_GPIO_Init();

/* USER CODE BEGIN my */
//кан на 500 kbit/s
canInit(500);
initTimer();
thisDict=&OD_Prod_Data;
//установка номера узла
setNodeId(thisDict,0x12);
//инициализация CANopen
setState(thisDict,Initialisation);
//ждем сотояния готовности
while(getState(thisDict)!=Pre_operational);
setState(thisDict,Operational);
LED_RED_ON();

/* USER CODE END my */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
masterSendNMTstateChange(thisDict,0x17,NMT_Reset_Node);
masterSendNMTstateChange(thisDict,0x17,NMT_Start_Node);
HAL_Delay(1000);
sendPDOrequest(thisDict,0x1400);
masterSendNMTstateChange(thisDict,0x17,NMT_Stop_Node);
HAL_Delay(5000);
}
/* USER CODE END 3 */

}


А это у Consumer
CODE
int main(void)
{

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

/* MCU Configuration----------------------------------------------------------*/

/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();

/* Configure the system clock */
SystemClock_Config();

/* Initialize all configured peripherals */
MX_GPIO_Init();
//кан на 500 kbit/s
canInit(500);
initTimer();
thisDict=&OD_Prod_Data;
//номер узла
setNodeId(thisDict,0x17);
//инит узла
setState(thisDict,Stopped);
//MX_TIM1_Init();
//MX_TIM3_Init();

/* USER CODE BEGIN 2 */
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

}
/* USER CODE END 3 */

}

если еще какой-то код нужен, я пришлю.
Может, в принципах CANOpen недоперлось по существу...у меня

КАК ПРАВИЛЬНО OD настроить?

Сообщение отредактировал IgorKossak - Dec 8 2017, 11:45
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!
Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 8 2017, 10:31
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Получилось получать hearbeat-ы нормально. Кто-то может мне растолковать, как правильно PDO отправлять и получать? crying.gif
Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 8 2017, 11:42
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Вот что видно в CANHacker




как я понимаю, статус у обоих Operation, Consumer принимает от Producer 0x0212... Он что-то должен ответить? Или я вообще не в ту сторону "але"
Go to the top of the page
 
+Quote Post
_3m
сообщение Dec 8 2017, 13:08
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 728
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(Ekka @ Dec 8 2017, 14:42) *
Вот что видно в CANHacker
...
как я понимаю, статус у обоих Operation, Consumer принимает от Producer 0x0212... Он что-то должен ответить?

Consumer ничего не должен отвечать на pdo.
Почему у вас 212 с нулевой длиной ?
Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 8 2017, 13:39
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Цитата(_3m @ Dec 8 2017, 14:08) *
Consumer ничего не должен отвечать на pdo.
Почему у вас 212 с нулевой длиной ?



у меня так в библиотеке написано
Код
sendPDOrequest (CO_Data * d, UNS16 RPDOIndex)
{
  UNS16 *pwCobId;
  UNS16 offset = d->firstIndex->PDO_RCV;
  UNS16 lastIndex = d->lastIndex->PDO_RCV;

  if (!d->CurrentCommunicationState.csPDO)
    {
      return 0;
    }

  /* Sending the request only if the cobid have been found on the PDO
     receive */
  /* part dictionary */

  MSG_WAR (0x3930, "sendPDOrequest RPDO Index : ", RPDOIndex);

  if (offset && RPDOIndex >= 0x1400)
    {
      offset += RPDOIndex - 0x1400;
      if (offset <= lastIndex)
        {
          /* get the CobId */
          pwCobId = d->objdict[offset].pSubindex[1].pObject;

          MSG_WAR (0x3930, "sendPDOrequest cobId is : ", *pwCobId);
          {
            Message pdo;
            pdo.cob_id = UNS16_LE(*pwCobId);
            pdo.rtr = REQUEST;
            pdo.len = 0;
            return canSend (d->canHandle, &pdo);
          }
        }
    }
  MSG_ERR (0x1931, "sendPDOrequest : RPDO Index not found : ", RPDOIndex);
  return 0xFF;
}


как мне тогда от Consumer получить значение проецируемой переменной?


нет...не то, как от Producer послать какие-то данные Consumer-y, я понимаю, что там длина должна быть 8, и данные, но их там нет
Go to the top of the page
 
+Quote Post
_3m
сообщение Dec 8 2017, 14:24
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 728
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(Ekka @ Dec 8 2017, 16:39) *
нет...не то, как от Producer послать какие-то данные Consumer-y, я понимаю, что там длина должна быть 8, и данные, но их там нет

Вы посылаете remote request. А producer должен посылать данные. Используйте другую функцию.
Кроме того CiA Application Note 802 рекомендует вообще не использовать remote request потому что с ним много проблем.
Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 11 2017, 10:34
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Цитата(_3m @ Dec 8 2017, 15:24) *
Вы посылаете remote request. А producer должен посылать данные. Используйте другую функцию.
Кроме того CiA Application Note 802 рекомендует вообще не использовать remote request потому что с ним много проблем.


Получилось передавать данные от Producer и Consamer в сеть из спроецированных переменных. А как ПРИНЯТЬ в спроецированные переменные? принимать не хочет ни в какую....

Сообщение отредактировал Ekka - Dec 11 2017, 10:35
Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 11 2017, 13:40
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Я ващщще.... глаза замылились((( Вот, что вижу на CANHacker... Объясните, мне кто-нибудь знающий, вот у меня тут Consamer и Producer шлют свои transmit_data (переменные спроецированные на transmit), и что? О_О... какая у них дальше реакция должна быть? Если номер узла совпадает, разве он не должен запихнуть себе в словарь? smile3046.gif




Go to the top of the page
 
+Quote Post
_3m
сообщение Dec 11 2017, 14:52
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 728
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(Ekka @ Dec 11 2017, 16:40) *
Я ващщще.... глаза замылились((( Вот, что вижу на CANHacker... Объясните, мне кто-нибудь знающий, вот у меня тут Consamer и Producer шлют свои transmit_data (переменные спроецированные на transmit), и что? О_О... какая у них дальше реакция должна быть? Если номер узла совпадает, разве он не должен запихнуть себе в словарь?

Должен запихнуть возможно надо дописать rx callback. Смотрите маппинг pdo чтобы у вас RPDO маппилось на TPDO.
Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 12 2017, 12:08
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Цитата(_3m @ Dec 11 2017, 15:52) *
Должен запихнуть возможно надо дописать rx callback. Смотрите маппинг pdo чтобы у вас RPDO маппилось на TPDO.


объясните, пожалуйста, поподробнее rolleyes.gif
Go to the top of the page
 
+Quote Post
_3m
сообщение Dec 13 2017, 07:02
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 728
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(Ekka @ Dec 12 2017, 15:08) *
объясните, пожалуйста, поподробнее rolleyes.gif

Прикрепленное изображение

Смотрите Recieve PDO parameters, Transmit PDO parameters (1400..15FF/ 1800..19FF) а также Receive PDO Mapping, Transmit PDO Mapping (1600..17FF / 1A00..1BFF).

В PDO parameters задается COB-ID а также условия передачи PDO.
Дефолтные значения COB-ID:
TPDO: $NODEID+0x180
RPDO: $NODEID+0x200
Как видите по дефолту COB-ID у них разный и слышать друг друга они не будут. Чтобы PDO принималось надо сконфигурировать устройства чтобы у них был одинаковый COB-ID. Обычно это выполняют при конфигурировании сети на объекте.

Также вам нужно проверить в PDO Mapping какие объекты передаются и принимаются через PDО (там задается соответствие PDOn<->OD[index:subindex]). У передатчика и приемника объекты должны быть совместимы по формату.

Вы хотя бы DS301 и DS401 читали ?
Go to the top of the page
 
+Quote Post
syoma
сообщение Dec 13 2017, 19:12
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 802
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Да, насчет чтения DS301 и DS401 правильно. Да и вообще теорию CANopen надо почитать и поставить хотя бы какую-то надстройку на свой кананализатор купить, чтобы расшифровывать CAN-трафик.

Go to the top of the page
 
+Quote Post
Ekka
сообщение Dec 14 2017, 06:24
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 152
Регистрация: 12-04-16
Из: Белгород
Пользователь №: 91 250



Еще парочка вопросов начинающего. Сказано, что есть SDO - точка-точка и PDO - производитель-потребители. А если, например, не один будет производитель, а несколько, это ошибка?
Go to the top of the page
 
+Quote Post
_3m
сообщение Dec 14 2017, 15:15
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 728
Регистрация: 28-12-06
Пользователь №: 23 960



Цитата(Ekka @ Dec 14 2017, 09:24) *
Еще парочка вопросов начинающего. Сказано, что есть SDO - точка-точка и PDO - производитель-потребители. А если, например, не один будет производитель, а несколько, это ошибка?

Если разные устройства передают pdo с одинаковым cob-id ошибка. Арбитраж кан контроллеров по стандарту не умеет разрешать коллизии для одинаковых cob-id.
Можно передавать разные pdo а в приемнике их все маппить в один объект. Не знаю насколько это удачная идея но спецификация позволяет.
В canopen с маппингом можно такого накрутить что через 2-3 года сами ни с поллитрой ни с канистрой спирта в этом не разберетесь не говоря уже о сотрудниках которые будут работать после вас. Причем все будет в полном соответствии со спецификацией.

Цитата(syoma @ Dec 13 2017, 22:12) *
Да, насчет чтения DS301 и DS401 правильно. Да и вообще теорию CANopen надо почитать и поставить хотя бы какую-то надстройку на свой кананализатор купить, чтобы расшифровывать CAN-трафик.

Вы такие знаете бесплатные ?
Я кроме wireshark - нет.
Go to the top of the page
 
+Quote Post
syoma
сообщение Dec 14 2017, 20:20
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 802
Регистрация: 14-02-07
Из: наших, которые работают за бугром
Пользователь №: 25 368



Цитата
Вы такие знаете бесплатные ?
Я кроме wireshark - нет.

Есть проги для настройки CANopen для лифтов. Например http://www.thor.engineering/downloads.html
Там PDO свои, но она может сканировать сеть и словари, если ей скормить EDS файл, а также смотреть на NMT трафик.
Вот еще одна бесплатная: http://kickdrive.de/en/index.html?products...kdrive_zero.htm

Цитата(Ekka @ Dec 14 2017, 08:24) *
Еще парочка вопросов начинающего. Сказано, что есть SDO - точка-точка и PDO - производитель-потребители. А если, например, не один будет производитель, а несколько, это ошибка?

Может быть сколько угодно производителей и сколько угодно потребителей в рамках ограничений PDO. При этом каждый узел может быть как производителем, так и потребителем одновременно. Как потребитель, он может подписаться на PDO разных производителей.
Go to the top of the page
 
+Quote Post

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

 


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


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