Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • CANFestival a tvorba Object Dictionary

CANFestival a tvorba Object Dictionary

C,C++,C#

Moderátori: psichac, Moderátori

CANFestival a tvorba Object Dictionary

Odoslaťod jirka.jirka. » 14 Feb 2019, 09:26

Zdravím přátelé,

není zde někdo, kdo umí pracovat s CANfestival pro obsluhu CAN sběrnice? Mě se podařilo rozchodit example, ale teď bych si chtěl vytvořit vlastní slovník, kde bych chtěl mít hearbeet a kontrolu na dvě ledky. Ale moc (spíše vůbec) se v tomto neorientuju a nemám se ani koho zeptat. Tak třeba někdo, někdy, někde si s tím hrál a bude vědět mi poradit.

Jako editor používám věc od canfestivalu v pythonu:
    cd cesta do -----> \CANFestival\objdictgen
    python objdictedit.py

A teď co bych potřeboval přesněji:
1. PDO zprávy
- pomocí jedné zprávy kontrolovat LED diodu tzn. pošlu PDO zprávu s hodnotou 1/0 a LED podle toho bude svítit
- pomocí SDO zprávy posílat nějakou hodnotu (třeba jenom periodicky hodnotu 0xAB) a bude mít název PERIOD
2. SDO zprávy
- Mít jednu zprávu, označenou jako: CAS ve které budu vracet 32bit číslo
2. Aktivovat hearbeet - toto se mi již podařilo
3. Error message
- Generovat chybu napr. od napeti.

Vím je toho asi hodně, ale pro názornost tam chci mít zastoupeno od každého stěžejního jednu věc.

A proč že to chci? Protože když budu mít blbě vygenerované tyto soubory, tak se v MCU můžu snažit sebevíc a program mi nepojede.

A potom bych pomocí převodníku CAN-USB tuto činnost ověřil.
Převodník používám: USB2CAN, který dovoluje import ESD souboru pro ověření činnosti.
Prílohy
objdictgen.zip
Generátor pro EDS CanOPEN od CanFESTIVAL
(1.93 MiB) Stiahnutá 8 krát
jirka.jirka.
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1166
Založený: 17.10.2008
Bydlisko: Uherské Hradiště
Karma: 12

Re: CANFestival a tvorba Object Dictionary

Odoslaťod jirka.jirka. » 14 Feb 2019, 13:59

Troško jinak:

V příloze jsou vygenerované soubory pro CANfestival...

V programu mám dva tasky:
canopen_dataprocess_thread - tímto taskem vše nainicializuji...

Kód: Vybrať všetko
static void canopen_dataprocess_thread(void * pvParameters) {
   int i;
   unsigned char ret_canInit;
   Message RxMSG = Message_Initializer;
   CANOpen_Message CAN_Rx_m;

   /* CANOpen Initialising */

   initTimer();

   //setNodeId (&ObjDict_CAN2_Data, LIFTER_ID);
   setNodeId(&ObjDict_Data, ARM_ID);

   CO_D.CO_CAN1 = &ObjDict_Data;
   CO_D.CO_CAN1->canHandle = CAN1;
   printf("CANOpen OD Get The Lifer NodeID...");

   ret_canInit = canInit(CAN1);
   if (ret_canInit) {
      Vypis("CAN init finished...");
      /* State Machine Change to Initialisation and automatic go into Pre_operational*/
      setState(&ObjDict_Data, Initialisation);
      Vypis("State Machine change to Initialisation...");
      /* State Machine change to Pro_operational */
      Vypis("State Machine change to Pro_operational...");
   } else {
      Vypis("CAN init failed...");
   }

   /*create a queue can store 20 data*/
   xQ_CAN_MSG = xQueueCreate(20, sizeof(CANOpen_Message));

   /* Success Or Fail */
   if (NULL == xQ_CAN_MSG) {
      /*failed to creat the queue*/
      while (1) {
         Vypis("!!!CANOpen Queue created failed!!!");
         vTaskDelay(100);
      }
   }
   while (1) {
      /*Receive CANBUS data*/
      if (xQueueReceive(xQ_CAN_MSG, &(CAN_Rx_m), (TickType_t) 100)) {

         RxMSG.cob_id = (uint16_t) (CAN_Rx_m.m.StdId);
         RxMSG.rtr = CAN_Rx_m.m.RTR;
         RxMSG.len = CAN_Rx_m.m.DLC;
         for (i = 0; i < RxMSG.len; i++) {
            RxMSG.data[i] = CAN_Rx_m.m.Data[i]; //Transfer data[0-7] from CAN_Rx_m to RxMSG
         }

         if ((NULL != CO_D.CO_CAN1) && (1 == CAN_Rx_m.CANx)) /*Data From CAN1*/
         {
            canDispatch(CO_D.CO_CAN1, &RxMSG);
         }
      } else {
         // Vypis("Waiting for a CAN message!\r\n");
         vTaskDelay(100);
      }
      vTaskDelay(CANOpen_THREAD_DELAY_TIMER);
   }
}


Nakonec mám druhý task control_thread, kterým vše zpracovávám....
Kód: Vybrať všetko
void control_thread(void * pvParameters) {

   RegisterSetODentryCallBack(CO_D.CO_CAN1, 0x2000, 0x00, &CommandWordUpdate);   //Control word

   while (1) {

      vTaskDelay(ARM_CONTROL_THREAD_DELAY_TIMER);
   }
}


Touto funkcí, jsem nastavil callback funkce, vytvořené pomocí CANfestivalu..
Kód: Vybrať všetko
RegisterSetODentryCallBack(CO_D.CO_CAN1, 0x2000, 0x00, &OnArmCommandWordUpdate);


A nyní, pokud odešlu zprávu z CANu, tak bych měl vypsat něco do sériovky:
Kód: Vybrať všetko
volatile uint8_t last_change = 0;
UNS32 CommandWordUpdate(CO_Data* d, const indextable * unsused_indextable, UNS8 unsused_bSubindex) {
   //printf("chassis control is running\r\n");
   if (last_change != (uint8_t)Switch1) {
      last_change = Switch1;
      Vypis("%d", Switch1);
   }

   asm("NOP");

   return 0;
}


Taky vím, že podmínku splním, tzn. data přijímám a CAN je tudíž OK.
Kód: Vybrať všetko
if (xQueueReceive(xQ_CAN_MSG, &(CAN_Rx_m), (TickType_t) 100))


Problém je, že nic nevypisuji, protože se sem: CommandWordUpdate ani nedostanu. Nějaký nápad, co mám blbě? A myslím si, že chyba je tasku: control_thread

-- Spojený príspevok 14 Feb 2019, 13:44 --

Hotovo, vyřešeno....

Měl jsem špatně namapovaný callback... :rolleyes: :rolleyes: :rolleyes: :rolleyes:

Tzn. místo na adrese 0x2007, jsem to valil na 0x2000 a to je potom jasné, že to nepojede :agree:

No co dodat. Snad jedině, 2 dny v řiti a hlavně to neříkat šéfovi. :thumbup:
Prílohy
Vzor.zip
(13.15 KiB) Stiahnutá 11 krát
jirka.jirka.
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1166
Založený: 17.10.2008
Bydlisko: Uherské Hradiště
Karma: 12


Naspäť na C,C++,C#

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 2 hostí.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.22 sekúnd