Posun nuly (absolutní snímač)

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:

Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 07 Dec 2016, 11:46

Zdravím. Mám absolutní snímač a teď jsem došel k primitivní věci, ale nenapadá mě jak ji nejlépe vyřešit.

Dejme tomu, že po instalaci absolutního snímače bude osa natočená pokaždé nějak jinak. A teď zařízení natočím do správné polohy a té bych chtěl nastavit nulu. Takže jakýsi offset. Ale když potom budu točit s oskou, tak abych měl vždy kladnou hodnotu. Tzn. nastavím 0° a potom když budu točit, tak jako by se nic nestalo. Tzn. hodnoty budou 0~360°.

část kódu je zde:

Kód: Vybrať všetko

polohaAbsolutnihoSnimace = (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);
převod hodnoty polohaAbsolutnihoSnimace

Kód: Vybrať všetko

uhel = (((float)(polohaAbsolutnihoSnimace*360)/(8192));
Hodnota z enkodéru je 13 bitů. Nějaký nápad, jak toho docílit? Díky moc
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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 07 Dec 2016, 13:11

Tady jsem něco sesmolil. Tak snad je to správně.... :D

Kód: Vybrať všetko

uhel = (((float)(polohaAbsolutnihoSnimaceADC)*360)/(8192)) - OdecetKorekcnihoUhlu;
if (uhel < 0)
	uhel = 360 + uhel;
Kde OdecetKorekcnihoUhlu je dany úhel, o který se to má posunout.
0

Zaky
Stály člen
Stály člen
Príspevky: 215
Dátum registrácie: 08 Nov 2014, 16:41

Re: Posun nuly (absolutní snímač)

Príspevok od používateľa Zaky » 07 Dec 2016, 13:12

Chtělo by to doplnit, zda absolutní snímač lze točit kolem dokola a zda má rozsah 360°, Tedy z něj dostáváš hodnoty 0-8191. Pokud ano, tak od přečtené hodnoty odečti svůj offset, pokud je hodnota kladná, nebo 0, máš hotovo, pokud je záporná, odečti ji od 360° a máš taky hotovo, jo a koukám, že už to máš :-)
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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 07 Dec 2016, 13:15

Kua, jsem si myslel, že jsem na něco zapomněl.... :D

jedná se o jednootáčkový. Tzn. 0~360° a výstup potom je 0~8192. Po přetočení přeteče.
0

Zaky
Stály člen
Stály člen
Príspevky: 215
Dátum registrácie: 08 Nov 2014, 16:41

Re: Posun nuly (absolutní snímač)

Príspevok od používateľa Zaky » 07 Dec 2016, 15:35

Korekci bych udělal jako první na celočíselné hodnotě, pokud z toho potom potřebuješ úhel, zvaž, jestli není lepší ho počítat taky celočíselně, třeba v tisícínách stupně, tedy 185.452° reprezentovat jako celočíselných 185452. Float není v neopodstatněných případech zrovna vhodný datový typ, už kvůli výpočetní náročnosti.
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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 07 Dec 2016, 17:55

Můj chip obsahuje FPU jednotku. Takže jsem si s tím chtěl trošku pohrát. A zkoušel jsem ji vypnout, to je potom rooodeo. :D Ale když ji zapnu, tak to nejde ani poznat.

Ale stejně to předělám tak, ať jedu pouze v celých číslech.
Takže úhel 123,45° budu mít prezentované jako 12345°. :)
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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 23 Dec 2016, 10:36

Zdravím.

Mám 2 zařízení na CAN bus. Když mám obě připojené, tak všechno funguje. Ale nyní se snažím o toto. Jak udělat, aby když se mi jedno zařízení odpojí, tak aby druhé pokračovalo dále?

Mám to takto?

Nekonecčnou smyčku, kterou vyčítám každých 5ms. Proto vím, že když je 1 průchod smyčkou je 5ms. Takže pokud je timeGyro větší než 20, tak to odpovídá 100ms. A vím, že aby CAN správně fungoval, musím změnit ID přijímané zprávy. Ale pokud to nechám, jak to mám, tak to nefunguje.... :( Nějaký nápad, co dělám špatně? Ten čas 5ms pro mě není kritický, pouze potřebuju, aby když je nějaké zařízení odpojeno, tak od ostatních abych dostával data.

Kód: Vybrať všetko

smyčka, do které vstoupím každých 5ms.
for (;;){
		if (!g_ul_recv_status) {
			//puts("zadna zprava na CAN sbernici\r");
			} 
			else 
			{
				if ((rx_mailbox.ul_id >> 18) == FIRST_GYRO_ID) //rotation to 11bit number (fromt 32bit)
				{
					GyroX	= (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);	
					GyroY	= (int16_t)((rx_mailbox.ul_datal >> 16) & 0x0000ffff);		
					timeGyro = 0;
					prepni = 0;
				}		
				if ((rx_mailbox.ul_id >> 18) == ID_ABS_SNIMAC_READ)
				{
					uhel	= (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);
					timeABS = 0;
					prepni = 1;
				}

			if (failGyro == 0)
				timeGyro++;
			if (failABS == 0)
				timeABS++;

			if ( (timeGyro < 20) && (timeABS < 20) )	//kontrola, zda funguje CANbus
			{	
				if (prepni == 1)
				{
					reset_mailbox_conf(&rx_mailbox);
					rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
					rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
					rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
					rx_mailbox.ul_id = CAN_MID_MIDvA(FIRST_GYRO_ID);
					can_mailbox_init(CAN0, &rx_mailbox);
				}
				if (prepni == 0)
				{
					reset_mailbox_conf(&rx_mailbox);
					rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
					rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
					rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
					rx_mailbox.ul_id = CAN_MID_MIDvA(ID_ABS_SNIMAC_READ);
					can_mailbox_init(CAN0, &rx_mailbox);
				}
			}
			
			if ( (timeGyro > 20) && (failGyro == 0) )
			{
				reset_mailbox_conf(&rx_mailbox);
				rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
				rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
				rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
				rx_mailbox.ul_id = CAN_MID_MIDvA(ID_ABS_SNIMAC_READ);
				can_mailbox_init(CAN0, &rx_mailbox);
				failGyro = 1;	//toto se provede pouze jednou
			}
			if ( (timeABS > 20) && (failABS == 0))
			{
				reset_mailbox_conf(&rx_mailbox);
				rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
				rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
				rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
				rx_mailbox.ul_id = CAN_MID_MIDvA(FIRST_GYRO_ID);
				can_mailbox_init(CAN0, &rx_mailbox);
				failABS = 1;
			}
			g_ul_recv_status = 0;	//clear flag of receive message
		}
	}
-- Spojený príspevok 23 Dec 2016, 10:51 --

Tak problém je někde v tom, že mi nenavštíví tento if:

Kód: Vybrať všetko

if ( (timeGyro > 20) && (failGyro == 0) )
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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 02 Jan 2017, 10:22

Zdravím.

Takže jsem částečně pokročil. Nyní pokud odpojím např. senzor A, tak data vyčítám dál ze zařízení z B. Naopak to platí taktéž. Ale když odpojít obě zařízení, tak se nic neděje...... Třeba někdo uvidí, kde by mohl být problém. Díky moc

Definice, CAN Handleru.

Kód: Vybrať všetko

void CAN0_Handler(void)
{
	uint32_t ul_status;

	ul_status = can_mailbox_get_status(CAN0, 0);
	if ( (ul_status & CAN_MSR_MRDY) == CAN_MSR_MRDY) {
		rx_mailbox.ul_status = ul_status;
		can_mailbox_read(CAN0, &rx_mailbox);
		/* nastavim flag, ktery indikuje, za zprava byla prijata */
		g_ul_recv_status = 1;
	}
}
Smyčka, která proběhne každých 5ms.

Kód: Vybrať všetko

for (;;){
		if (!g_ul_recv_status) {
			/* nic jsem neprijal :) */
			} 
			else 
			{
				if ((rx_mailbox.ul_id >> 18) == FIRST_GYRO_ID) 
				{
					GyroX	= (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);		
					GyroY	= (int16_t)((rx_mailbox.ul_datal >> 16) & 0x0000ffff);
					timeGyro = 0;
					prepni = 0;
				}		
				if ((rx_mailbox.ul_id >> 18) == ID_ABS_SNIMAC_READ)
				{
					uhel	= (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);
					timeABS = 0;
					prepni = 1;
				}
			xQueueSend(vypis_data_ethernet, (void *)&data, 1);
			g_ul_recv_status = 0;	//clear flag of receive message
		}

		if (failGyro == 0)
			timeGyro++;
		if (failABS == 0)
			timeABS++;

		if ( (timeGyro < 20) && (timeABS < 20) )	//kontrola, zda funguje CANbus
		{	
			if ( (prepni == 1) && (failGyro == 0) )
			{
				reset_mailbox_conf(&rx_mailbox);
				rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
				rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
				rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
				rx_mailbox.ul_id = CAN_MID_MIDvA(FIRST_GYRO_ID);
				can_mailbox_init(CAN0, &rx_mailbox);
			}
			if ( (prepni == 0) && (failABS == 0) )
			{
				reset_mailbox_conf(&rx_mailbox);
				rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
				rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
				rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
				rx_mailbox.ul_id = CAN_MID_MIDvA(ID_ABS_SNIMAC_READ);
				can_mailbox_init(CAN0, &rx_mailbox);
			}
		}
		
		if ( (timeGyro > 31) && (failGyro == 0) )
		{
			reset_mailbox_conf(&rx_mailbox);
			rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
			rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
			rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
			rx_mailbox.ul_id = CAN_MID_MIDvA(ID_ABS_SNIMAC_READ);
			can_mailbox_init(CAN0, &rx_mailbox);
			data.rapamep_error |= (1 << CHYBA_GYRO);
			failGyro = 1;
		}
		if ( (timeABS > 31) && (failABS == 0))
		{
			reset_mailbox_conf(&rx_mailbox);
			rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
			rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
			rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
			rx_mailbox.ul_id = CAN_MID_MIDvA(FIRST_GYRO_ID);
			can_mailbox_init(CAN0, &rx_mailbox);
			data.rapamep_error |= (1 << CHYBA_ABS);
			failABS = 1;
		}

		if ( (failABS == 1) && (failGyro == 1) )
		{
                   /* Zde pouze vypisuji, kdyz je chyba. Ale sem jsem nedostanu */
		}
	}
Inicializace CAN busu na SAM4E16E

Kód: Vybrať všetko

extern int8_t inicializace_can(void)
{
	data.rapamep_error = 0;
	
	uint32_t ul_sysclk;
	
	/* Enable CAN0 clock. */
	pmc_enable_periph_clk(ID_CAN0);

	ul_sysclk = sysclk_get_cpu_hz();
	if (can_init(CAN0, ul_sysclk, CAN_BPS_125K)) 
	{
		/* Disable all CAN0 interrupts. */
		can_disable_interrupt(CAN0, CAN_DISABLE_ALL_INTERRUPT_MASK);
		can_reset_all_mailbox(CAN0);

		/* Init CAN0 Mailbox 0 to Reception Mailbox. */
		reset_mailbox_conf(&rx_mailbox);
		rx_mailbox.ul_mb_idx = CAN_COMM_RXMB_ID;
		rx_mailbox.uc_obj_type = CAN_MB_RX_MODE;
		rx_mailbox.ul_id_msk = CAN_MAM_MIDvA_Msk | CAN_MAM_MIDvB_Msk;
		rx_mailbox.ul_id = CAN_MID_MIDvA(/*ID_ABS_SNIMAC_READ*/0x00);
		can_mailbox_init(CAN0, &rx_mailbox);

		/* Init CAN0 Mailbox 1 to Transmit Mailbox. */
		reset_mailbox_conf(&tx_mailbox);
		tx_mailbox.ul_mb_idx = CAN_COMM_TXMB_ID;
		tx_mailbox.uc_obj_type = CAN_MB_TX_MODE;
		tx_mailbox.uc_tx_prio = CAN_TX_PRIO;
		tx_mailbox.uc_id_ver = 0;
		tx_mailbox.ul_id_msk = 0;
		can_mailbox_init(CAN0, &tx_mailbox);

		/* Write transmit information into mailbox. */
		tx_mailbox.ul_id = CAN_MID_MIDvA(CAN_TRANSFER_ID);
		tx_mailbox.ul_datal = 0x00;	//Original - CAN_MSG_DUMMY_DATA;
		tx_mailbox.uc_length = MAX_CAN_FRAME_DATA_LEN;

		/* Enable CAN0 mailbox interrupt. */
		can_enable_interrupt(CAN0, CAN_IER_MB0);	//original 1 << CAN_COMM_RXMB_ID
		
		/* Configure and enable interrupt of CAN1. */
		NVIC_EnableIRQ(CAN0_IRQn);
		
		tx_mailbox.ul_datal = 0;	//zacina od nejspodnejsiho bitu
		tx_mailbox.ul_datah = 0;	//zacina od nejspodnejsiho bitu
		can_mailbox_write(CAN0, &tx_mailbox);	//zapise data do buffera
		/* Send out the information in the mailbox. */
		can_global_send_transfer_cmd(CAN0, CAN_TCR_MB1);	//odesle data z bufferu pryc po CANu
		
		nastaveniAbsSnimace();

		//komunikace je pripravena
		return 0;
	}
	else
	{
		return -1;	//inicializace selhala
	}
}
Popř. kdyby někdo měl nějaký nápad, tak určitě dejte vědět.

Osobně si myslím, že je něco prohnilého v tomto. Protože pokud debuguji program, tak se sem nikdy nedostanu. Což je nějaké divné.

Kód: Vybrať všetko

if ( (failABS == 1) && (failGyro == 1) )
		{
                   /* Zde pouze vypisuji, kdyz je chyba. Ale sem jsem nedostanu */
		}
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Posun nuly (absolutní snímač)

Príspevok od používateľa peterple » 02 Jan 2017, 10:33

Pozrel som zbežne. žiadny zásadný problém nevidím. Typujem že sa ti nulujú tie premenné na počítanie času. Jak to debuguješ? Pripoj si tam sériovú linku, posielaj si na ňu stav týchto dvoch premenných a uvidíš.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 02 Jan 2017, 12:01

Ok. Toto zkusím, ale zde bych problém neviděl.
Protože jakmile přičítám jednu z časových proměnných, tak nastavím daný příznak fail, např. když čas na gyorkopu dosáhne hodnoty 31, nastaví se daný fail flag

Kód: Vybrať všetko

failGyro = 1
, a tím se zakáže přičítání času.

Kód: Vybrať všetko

if (failGyro == 0)
         timeGyro++;
      if (failABS == 0)
         timeABS++;
Čímž další přičítání času už nemůže nastat. Časová proměnná je uint8_t, což je až 255 hodnot. Takže přetečení se mi moc nezdá. Ale ok budu debugovat. Jinak programuji to J-TAGem, ale problém je ten, že používám i ETHERNET, takže ten debug mi vždycky zničí spojení. Proto debuguju skrze ETHERNET a data si vypisuji v mém vlastním jednoduchém terminálu.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Posun nuly (absolutní snímač)

Príspevok od používateľa peterple » 02 Jan 2017, 13:46

nemyslel som že to pretečie, ale že sa to stále nuluje. Break hw debuggerom je to posledné čo by som tu použil. Ten ethernet je 100x lepší.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 03 Jan 2017, 07:16

Takže pátrám dále po chybě.
Pokud "debuguji" po LAN, což je docela fajn, tak jsem dospěl sem.
Pokud odpojím GYRO, tak se nastaví proměnná timeGyro na hodnotu 32 a dále se s ní nic neděje. Úplně stejně je tomu tak i u proměnné timeABS.

Ale pokud odpojím jedno zařízení, vše je OK, viz výše. Ale přidám-li k tomu druhé zařízení, tak se program zastaví. A výpis po LAN taktéž. Takže ještě si asi přidám i nějaké blikání LED a budu muset najít kde se mi program kousne a proč.

Ale aspoň vím, že řešení kontroly zařízení na CANu funguje. Ještě odstranit ten průser, když tam není žádné zařízení.

-- Spojený príspevok 03 Jan 2017, 07:56 --

Klucííííí, já jsem asi trouba. :D

Pokud odesílám data po frontě, tak tyto data musím odesílat až za všema těma kontrolama. :D A ne, že data budu odesílat pouze, pokud přijmu data po CANu.

Protože, když odpojím všechny zařízení z CANu, tak je jasné, že už taky nic neodešlu. :D

Nebo-li.

Původní kód.

Kód: Vybrať všetko

if (!g_ul_recv_status) {
         /* nic jsem neprijal :) */
         } 
         else 
         {
            if ((rx_mailbox.ul_id >> 18) == FIRST_GYRO_ID) 
            {
               GyroX   = (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);      
               GyroY   = (int16_t)((rx_mailbox.ul_datal >> 16) & 0x0000ffff);
               timeGyro = 0;
               prepni = 0;
            }      
            if ((rx_mailbox.ul_id >> 18) == ID_ABS_SNIMAC_READ)
            {
               uhel   = (int16_t)(rx_mailbox.ul_datal & 0x0000ffff);
               timeABS = 0;
               prepni = 1;
            }
         xQueueSend(vypis_data_ethernet, (void *)&data, 1);
         g_ul_recv_status = 0;   //clear flag of receive message
      }
Takže jediné, co je potřeba, tak vzít tento řádek:

Kód: Vybrať všetko

xQueueSend(vypis_data_ethernet, (void *)&data, 1);
A vložit jej až za tu poslední závorku. :D

No nic, vlastní nepozornost.............. :D Tak snad mě nebudete proklínat. :D :axe: Důležité ale je, že chyba byla nalezená.
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: Posun nuly (absolutní snímač)

Príspevok od používateľa jirka.jirka. » 03 Jan 2017, 12:05

A když už tady řeším nějaký ten ofset toho absolutního snímače, tak se ještě zeptám.

V MCU mám jednoduchý výpočet: (nyní prosím omluvte floaty. Všechno bude přepočteno na integer, ale pro názornost je ten float rychlejší.

Kód: Vybrať všetko

polohaAbsolutnihoSnimaceADC	= (int16_t)(rx_mailbox.ul_datal & 0x0000ffff); 
uhel = (((float)(polohaAbsolutnihoSnimaceADC*360))/8192) - ((float)NulovaciUhel/100);
A teď si dělám jednoduchou aplikaci v C#, kde po odeslání příkazu po LAN, provedu zápis offsetu do interní paměti MCU. Toto je v pořádku. Ale jak na ten přepočet toho offsetu v C#?

Kód: Vybrať všetko

$OFSET,xxxxx*CHCK<CR><LF>
Mám to takto:
Vyčtu aktuální hodnotu natočené hřídele, vyčtu aktuální hodnotu offsetu uloženou v paměti MCU. Potom sečtu tyto dvě proměnné a pokud je součet větší než 360°, tak tento úhel odečtu.

Zde je komplet zápis pro stisk tlačítka v C#.

Kód: Vybrať všetko

private void button10_Click(object sender, EventArgs e)
        {
            try
            {
                double OFSIK = OfsetValue ;
                double UHLIK = uhelOtoceni ;

                double SetOffset = OFSIK + UHLIK;
                if (SetOffset > 360.0)
                    SetOffset = SetOffset - 360.0;

                string hodnotaString = Convert.ToString(SetOffset);

                string s1 = getChecksum("$OFSET," + hodnotaString + "*");
                Byte[] data = System.Text.Encoding.ASCII.GetBytes("$OFSET," + hodnotaString + "*" + s1 + "\r\n");
                
                stream.Write(data, 0, data.Length);

                txtTalk.AppendText("Odeslana zprava: " + "$OFSET," + hodnotaString + "*" + s1 + "\r\n");
            }
            catch
            {
                MessageBox.Show("Data nelze odeslat!\r\n" );
            }
        }
Ale nejsem si moc jistý tím zápisem. Ale třeba se jenom mýlím. Mohl by mi na to někdo kouknout, jestli to takto je správně?

Kód: Vybrať všetko

double SetOffset = OFSIK + UHLIK;
       if (SetOffset > 360.0)
       SetOffset = SetOffset - 360.0;
Hlavně mi nejde do hlavy to propojení toho offsetu s aktuální pozicí natočení hřídele.
0

Napísať odpoveď