CANFestival a tvorba Object Dictionary

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

CANFestival a tvorba Object Dictionary

Príspevok od používateľa jirka.jirka. » 14 Feb 2019, 08: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) 85 stiahnutí
0

Používateľov profilový obrázok
jirka.jirka.
Ultimate člen
Ultimate člen
Príspevky: 1537
Dátum registrácie: 17 Okt 2008, 00:00
Bydlisko: Uherské Hradiště
Kontaktovať používateľa:

Re: CANFestival a tvorba Object Dictionary

Príspevok od používateľa jirka.jirka. » 14 Feb 2019, 12: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) 90 stiahnutí
0

Napísať odpoveď