Telemetria (si fa per dire) per KFlop

Sezione dedicata ai controlli seriali, usb e Ethernet
Per gli approfondimenti si rimanda ai subforum specifici.
Subforum:
CncDrive
PlanetCNC
RosettaCNC
Twintec
Rispondi
Avatar utente
Pedro
God
God
Messaggi: 7021
Iscritto il: domenica 6 aprile 2008, 18:44
Località: Roma

Re: Telemetria (si fa per dire) per KFlop

Messaggio da Pedro » giovedì 30 ottobre 2014, 15:22

le cose banali sono quelle che passano inosservate purtroppo, e certo che quel delay, guarda caso di 0.2, genera uno sfasamento. Bravo anche per aver trovato la soluzione =D>
"Ho controllato molto approfonditamente," disse il computer, "e questa è sicuramente la risposta. Ad essere sinceri, penso che il problema sia che voi non abbiate mai saputo veramente qual è la domanda."

Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Re: Telemetria (si fa per dire) per KFlop

Messaggio da walgri » venerdì 31 ottobre 2014, 8:42

Tutto "quadra" :D
Screenshot2x2.png
Voglio rifinire la questione degli fprintf e poi si passa sulla macchina.
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Re: Telemetria (si fa per dire) per KFlop

Messaggio da walgri » sabato 1 novembre 2014, 1:10

Circa il comportamento della fprintf nel caso in cui non si aggiunga il "\n" alla stringa: Kerekes risponde che in tal caso il risultato è indeterminato. Le stringhe devono essere terminate da "\n", quindi: una riga, una fprintf.

Questo in pratica chiude questa parte del progetto che partiva dalla necessità di avere dei diagrammi dello Step Response anche durante una lavorazione (in cui tra l'altro non viene utilizzato il Jerk), monitorare gli errori di più assi contemporanemente, avere uno strumento più comodo nel caso di sistemi con asse slave. Infatti se l'init.c che definisce il legame master-slave non viene caricato, il dialogo dello step response muoverà solo il master, con risultati poco piacevoli.

Da domani verrà applicato sulla mia macchina.
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Re: Telemetria (si fa per dire) per KFlop

Messaggio da walgri » domenica 2 novembre 2014, 19:24

Una prova fatta al volo, con tutti i parametri PID da rivedere perchè ho cambiato la risoluzione dell'encoder a 500 fronti/giro, il driver è impostato a 5000 step/giro. Il gain sull'input è impostato a 1, la vite ha passo 5, quindi sull'ordinata si leggono i centesimi di mm.
Error.png
Questo è il Gcode relativo, la possibilità di inserire delle pause G4 è in effetti molto comoda e consente di monitorare a lungo le "code":

Codice: Seleziona tutto

G21
M118
G4 P0.5
G1 X30 F5000
G4 P0.5
G1 X0
G4 P3
M119
M2
E' uno strumento che comincia a piacermi !
Non hai i permessi necessari per visualizzare i file e le foto allegati in questo messaggio. Per visualizzare tali file devi registrarti ed effettuare il Login
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Avatar utente
Pedro
God
God
Messaggi: 7021
Iscritto il: domenica 6 aprile 2008, 18:44
Località: Roma

Re: Telemetria (si fa per dire) per KFlop

Messaggio da Pedro » domenica 2 novembre 2014, 20:12

:)

bello, bravo, complimenti sia per l'utility che per i risultati di "precisione"
"Ho controllato molto approfonditamente," disse il computer, "e questa è sicuramente la risposta. Ad essere sinceri, penso che il problema sia che voi non abbiate mai saputo veramente qual è la domanda."

Avatar utente
walgri
God
God
Messaggi: 4735
Iscritto il: giovedì 13 gennaio 2011, 18:37
Località: Cagliari

Re: Telemetria (si fa per dire) per KFlop

Messaggio da walgri » domenica 22 marzo 2015, 10:19

Ho modificato il codice che recupera i dati dalla KFlop. Ho fatto in modo (bachi a parte :mrgreen: ) che una volta impostato il bit di controllo, i dati vengano continuamente registrati. Una volta terminato lo spazio a disposizione (o il limite impostato con la costante TOTALSAMPLES) si ricomincia sovrascrivendo i valori più vecchi.

Non appena il bit di controllo torna basso oppure uno degli assi si disabilita (riga 50, in questo caso vengono monitorati solo il ch1 e il ch3), i dati vengono scritti sul file di testo.

Codice: Seleziona tutto

#include "KMotionDef.h"

#define CONTROL_BIT 2000 // Input bit that triggers data gather

#define TOTALSAMPLES 10000  // Maximum flattened array (of doubles) size
#define FIELDSPERSAMPLE 9   // Number of fields per row
#define SAMPLEINTERVAL 5 // Gather data every SAMPLEINTERVAL time slices

void stringcat(char*, char*);

main(){
	int i, j, k, l, N;
	double T0,*p=gather_buffer, *limit, *c;
	char line[500];
	BOOL rewinded = FALSE;

	printf("Data gathering thread started\n");

	//Setup an output bit to control data gather
	SetBitDirection(CONTROL_BIT,1);
	ClearBit(CONTROL_BIT);
	
	if (FIELDSPERSAMPLE * TOTALSAMPLES < MAX_GATHER_DATA) {
		N = FIELDSPERSAMPLE * TOTALSAMPLES;
	} else {
		N = ((int)MAX_GATHER_DATA / FIELDSPERSAMPLE) * FIELDSPERSAMPLE;
	}
	
	limit = &gather_buffer[N];
	
	while(1){
		while(!ReadBit(CONTROL_BIT)); // wait for control bit to be high
		printf("Gathering started\n");

		T0 = Time_sec();

		// Capture Data
		i = 0;
		
		while (1) { 
			*p++ = Time_sec() - T0;
			*p++ = ch0->Dest;
			*p++ = ch0->Position;
			*p++ = ch1->Dest;
			*p++ = ch1->Position;
			*p++ = ch2->Dest;
			*p++ = ch2->Position;
			*p++ = ch3->Dest;
			*p++ = ch3->Position;
			if(!ReadBit(CONTROL_BIT) || !ch1->Enable || !ch3->Enable) {
				break;
			}
			for (k=0; k<SAMPLEINTERVAL; k++) WaitNextTimeSlice();
			
			if (p == limit) {
				p=gather_buffer; // "rewind" the pointer
				rewinded = TRUE;
			}
		}
		
		ClearBit(CONTROL_BIT);
		printf("Gathering stopped, transmitting %d rows of %d doubles\n", i, i*FIELDSPERSAMPLE);

		FILE *f=fopen("C:\\temp\\kflopdata.txt","wt");
		
		if (rewinded) {
			c = p;
		} else {
			c = gather_buffer;
		}

		while(1) {
			for (k=0; k<5; k++)	WaitNextTimeSlice();
			// round times to nearest servo tick
			c[0] = ((int)(c[0]/TIMEBASE + 0.5))*TIMEBASE;		
			sprintf(line, "%12.5f,%12.5f,%12.5f,%12.5f,%12.5f,",c[0],c[1],c[2],c[3],c[4]);
			stringcat(line, "%12.5f,%12.5f,%12.5f,%12.5f\n");
			fprintf(f, line, c[5], c[6], c[7], c[8]);
			c += FIELDSPERSAMPLE;
			
			if (c == limit){
				c = gather_buffer; //Riavvolgo il puntatore
			}
			if (c == p){
				break;
			}	
		}
		
		p=gather_buffer; // "rewind" the pointer
		
		fclose(f);
		printf("Data file ready\n");
		ClearBit(46);
		Delay_sec(0.5);
		SetBit(46);
	}
}


void stringcat(char *original, char *add){
	while(*original)
		original++;
	while(*add){
		*original = *add;
		add++;
		original++;
	}
	*original = '\0';
}
edit: mi piacciono poco le #DEFINE per definire le costanti, preferisco in genere dichiarare delle const int o delle const <tipo>. Nella fretta ho dimenticato ho modificare e ho preferito riportare qui la versione che sicuramente è stata compilata ed eseguita.

Inoltre il messaggio di diagnostica alla riga 62, quella printf, si può sostituire con

Codice: Seleziona tutto

printf("Gathering stopped\n");
perchè i non è più utilizzata in questa versione del programma.
...stop chasing shadows, just enjoy the ride.
Aìna pantografoTelemetria per KFlopBlenderCAM STL + DXF

Rispondi

Torna a “Controlli Seriali, Usb e Ethernet”