Seite 1 von 2

1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Do 13. Okt 2016, 15:13
von blindy
Hallo,

habe Heute zum ersten Mal die Firmware upgedatet und zwar auf1.33. kenne mich aber absolut nicht mehr aus, das Menü ist irgendwie nicht mehr das selbe.
Es gibt keinen Heatbed Scan mehr und sobald ich was Drucken möchte erscheint folgende Fehlermeldung:

ERROR: Z COMPENSATION INVALID MATRIX

Was kann ich dagegen tun ?

grüße

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Do 13. Okt 2016, 15:47
von Nibbels
Der Heat-Bed Scan ist unter

Configuration -> Z Calibration

- Scan
-> ist das alte Scan.
- Scan PLA
- Scan ABS

-> heizt automatisch auf eine PLA-ähnliche Temperatur vor. Man darf sich hier nicht von der gefühlt ewig langen Wartezeit verwirren lassen. Der lässt sehr viel länger "Heating..." anzeigen und wartet, sodass sich die Wärme im Heat-Bed gut verteilt. Das dauert glaub an die 10 Minuten.
(Und der stürzt nicht dabei ab ;) )

Beim Scan hatte der bei mir auch schon "Scan Aborted" angezeigt. Und dann weider nicht. Ich weiß hier nicht, was ich da geändert hatte, aber das kann Zufall gewesen sein. Ich musste in dem Fall aber nicht den Extruder zerlegen und neu zusammenschrauben...

LG

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Do 13. Okt 2016, 18:50
von rf1k_mjh11
blindy,

Ergänzend dazu:

Die von dir beobachtete Fehlermeldung ist eine Folge einer 'Neuordnung' der Matrix. Der Firmware fehlt jetzt eine Spalte der Daten. Bei älteren FW-Versionen hatten die HBS-Daten (Matrix) eine Spalte weniger (glaube ich). Die Meldung kommt, weil die FW diese neu hinzugekommene Datenspalte nicht findet.

Keine Sorge - nach dem nächsten erfolgreichen HBS stimmt die Matrix wieder und das Problem ist Geschichte.

mjh11

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Fr 14. Okt 2016, 09:39
von blindy
Vielen Dank :good: :danke:

Jedoch wenn ich einen HBS mache bricht dieser nach ca. 20 min ab, egal ob Scan ABS oder normaler Scan :blink:
Der das Display zeigt mit dann Scan aborted an !

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Fr 14. Okt 2016, 11:08
von Nibbels
Was macht der Drucker gerade, wenn er abbricht?

Und...

- Bricht der immer an der exakt selben Stelle ab?
- Hast du den Scan öfter versucht? (Wie gesagt: Ich hatte das auch und bis heute keine Ahnung, warum das so war.)
- Bist du dir sicher, dass du Anfangs die 0.3mm-Position mit dem Papier oder ähnlichem so gewählt hast, dass keine Position auf deinem Heizbett höher als -0.0 ist? Man soll laut PDF-Anleitung per Sichttest den höchsten Punkt auf dem Heizbett suchen und dort die 0.3mm voreinstellen.
(Abstand Extruder/Düse überall ohne aufsetzen/schleifen)
- Was zeigen deine Digits (Aufpresskraft) im Ruhezustand an, wenn der nicht aufdrückt?

LG

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Fr 14. Okt 2016, 13:47
von Zaldo
Prüfe mal ob Deine Druckplatte links und rechts auf der gleichen Höhe steht, der Fehler passiert gerne wenn die beiden Kugelumlaufspindeln nicht gleich stehen (z.b. weil sich die Riemenscheibe auf einer Spindel aufgrund einer nicht ganz festen Madenschraube etwas verdreht hat.

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Mo 17. Okt 2016, 09:31
von blindy
Hallo,

ja, der Drucker bricht immer an der selben Stelle ab ( 8. Reihe 3. Zeile), mir ist aufgefallen , dass der Drucker während des Scans min 15-20x Z-Home neu angefahren ist. Jedoch haben sich die Z-Werte kaum geändert, immer zwischen -0,20 und -0,28 außer vor dem Abbruch -0,17mm!

Das ist der gefühlte 10. Scan xD.

Ja bin ich mir, der Drucker hat doch bis vor dem Update ohne gröbere Probleme funktioniert xD

Die Digits zeigen mir im kalten Zustand -850 Digits, im warmen Zustand( Scan ABS) +250 Digits und während des HBS +824 Digits an.



Die Druckplatte ist definitiv auf gleicher höhe bzw. die Abweichung von links auf rechts beträgt 0,03mm.

lg

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Mo 17. Okt 2016, 17:44
von rf1k_mjh11
blindy,

Achte sehr genau darauf, dass es keine ungewollte Krafteinwirkung (auf die Dehnmessstreifen) während des Scans gibt. Am besten ein kurzes Stück Filament (150mm) im Hot End belassen (beim RF2000 in beide Hot Ends) und die Andrückrollen gespannt lassen. Damit wird sichergestellt, dass die Andrückrolle (oder beim RF1000 der Kugellagerhalter) das Hot End nicht berühren kann. Das kann nämlich zu einer ungewollten Beeinflussung der DMS führen, was zum Abbruch des Abtastvorgangs führen kann. Die Firmware achtet sehr genau auf die Werte der DMS und wird leicht verwirrt.

Ich hatte einmal ein ähnlich 'unerklärliches' Verhalten, wo eine ältere Version die Beeinflussung duldete, die neuere aber nicht. (Siehe einige Posts in diesem Thread).

mjh11

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Mo 17. Okt 2016, 23:41
von Nibbels
Ich habe aus eigenem Interesse etwas im Sourcecode der 1.33 gelesen.

g_abortZScan = 0 -> Kein Fehler.
g_abortZScan = 1 -> Abbruchbedingung erreicht.

Was dann
#define UI_TEXT_HEAT_BED_SCAN_ABORTED "Scan aborted"
auslöst.

Das passiert im Druckerbetrieb, wenn:

a) mehr Punkte in X ausgelesen werden, als die Matrix größe hat:

Code: Alles auswählen

if( nIndexX > COMPENSATION_MATRIX_MAX_X )
	{
		if( Printer::debugErrors() )
		{
			Com::printFLN( PSTR( "scanHeatBed(): the x-dimension of the compensation matrix became too big: " ), nIndexX );
		}
		g_abortZScan = 1;
		break;
	}
b) Wenn mehr Punkte in Y ausgelesen werden, als die Matrix größe hat:

Code: Alles auswählen

if( nIndexY > COMPENSATION_MATRIX_MAX_Y )
	{
		if( Printer::debugErrors() )
		{
			Com::printFLN( PSTR( "scanWorkPart(): the y-dimension of the compensation matrix became too big: " ), nIndexY );
		}
		g_abortZScan = 1;
		break;
	}
c) die Ruhekraft nicht korrekt ermittelt werden kann:

Code: Alles auswählen

// scan this point
if( testIdlePressure() )
	{
		// the current idle pressure is not plausible
		g_abortZScan = 1;
		break;
	}
a) und b) dürften per Definition nie auftreten, ausser jemand schreibt die anzahl der Punkte um.
c) bleibt übrig.

-----------------------------------------
Also gibt es mit ziemlicher Sicherheit ein Problem mit der Funktion die den Ruhe-Kraft-Mittelwert bildet.
testIdlePressure()

Code: Alles auswählen

short testIdlePressure( void )
{
	short	nTempPressure;
	short	nTemp;


	if( readAveragePressure( &nTempPressure ) )
	{
		// some error has occurred
		if( Printer::debugErrors() )
		{
			Com::printFLN( PSTR( "testIdlePressure(): the pressure could not be determined" ) );
		}
		return -1;
	}
	g_nCurrentIdlePressure = nTempPressure;
	return 0;

} // testIdlePressure
Bzw. darunterliegend:
readAveragePressure

Code: Alles auswählen

g_nScanPressureReads	 = HEAT_BED_SCAN_PRESSURE_READS; //=15
g_nScanPressureReadDelay	 = HEAT_BED_SCAN_PRESSURE_READ_DELAY_MS; //=15
g_nScanPressureTolerance	 = HEAT_BED_SCAN_PRESSURE_TOLERANCE; //=15

ACTIVE_STRAIN_GAUGE //=> 0x49

Code: Alles auswählen

short readAveragePressure( short* pnAveragePressure )
{
	short	i;
	short	nTempPressure;
	short	nMinPressure;
	short	nMaxPressure;
	long	nPressureSum;
	char	nTemp;


	nTemp = 0;
	while( 1 )
	{
		// we read the strain gauge multiple times and check the variance
		nPressureSum = 0;
		nMinPressure = 32000;
		nMaxPressure = -32000;
		for( i=0; i<g_nScanPressureReads; i++)
		{
#if FEATURE_WATCHDOG
			HAL::pingWatchdog();
#endif // FEATURE_WATCHDOG

			HAL::delayMilliseconds( g_nScanPressureReadDelay );
			nTempPressure =  readStrainGauge( ACTIVE_STRAIN_GAUGE );
			nPressureSum  += nTempPressure;
			if( nTempPressure < nMinPressure )	nMinPressure = nTempPressure;
			if( nTempPressure > nMaxPressure )	nMaxPressure = nTempPressure;
		}
		nTempPressure = (short)(nPressureSum / g_nScanPressureReads);

		if( (nMaxPressure - nMinPressure) < g_nScanPressureTolerance )
		{
			// we have good results
			*pnAveragePressure = nTempPressure;
			return 0;
		}

		nTemp ++;
		if( nTemp >= 5 )
		{
			// we are unable to receive stable values - do not hang here forever
			if( Printer::debugErrors() )
			{
				Com::printF( PSTR( "readAveragePressure(): the pressure is not constant: " ), nMinPressure );
				Com::printF( PSTR( " / " ), nTempPressure );
				Com::printFLN( PSTR( " / " ), nMaxPressure );
			}
			break;
		}
	
		// wait some extra amount of time in case our results were not constant enough
		HAL::delayMilliseconds( 100 );
		
		//runStandardTasks();
		Commands::checkForPeriodicalActions(); 
	}

	if( Printer::debugErrors() )
	{
		Com::printFLN( PSTR( "readAveragePressure(): the pressure is not plausible" ) );
	}
	g_abortZScan	   = 1;
	*pnAveragePressure = 0;
	return -1;

} // readAveragePressure
Die darunterliegende Funktion readStrainGauge( ACTIVE_STRAIN_GAUGE ); erfasst einfach nur den Messwert und ist hier vermutlich uninteressant.

Diese Funktion `readAveragePressure` summiert also (g_nScanPressureReads mal) 15 mal den Kraftwert und schreibt mit, welches der kleinst und welches der größte gemessene Kraftwert war, welcher auftrat.
Die Summe der Kraftwerte ergibt den Mittelwert.

Aber dem Mittelwert wird nicht blind vertraut:
Nun wird geschaut, ob die Streuung der Ruhe-Digits, der Abstand zwischen MIN und MAX, nicht größer ist, als (g_nScanPressureTolerance) 15.

Stimmt das nicht, wird fünf weitere Male ausprobiert, ob es klappt und dann abgebrochen.
-> Scan Aborted.

Die Frage ist also:

Warum ist der Messwert in diesen knapp 250ms (15ms x 15 Messungen) nicht konstant?
(Und: Warum ist dieser ganze 5x hintereinander nicht konstant/ungültig?)

a) Vibriert irgendwas so, dass der Kraftsensor das `hört`?
b) Ist das Messsignal schlecht?
c) Stört etwas das Messsignal durch Übersprechen?
d) Existiert ein mechanisches Nachschwingen?
e) Hängt ein Lüfter mit Unwucht am Extruder?
f) ???


Wenn das Nachschwingen das Problem wäre, und nicht ein Lüfter oder ähnliches, dann:
Vor diesen Mittelungen wird immer um g_nScanIdleDelay gewartet.

Diese Variable wird mit

Code: Alles auswählen

g_nScanIdleDelay			 = HEAT_BED_SCAN_IDLE_DELAY_MS; //=250
initialisiert.

Und es gibt dazu
M3042

Code: Alles auswählen

case 3042: // M3042 [S] - configure the delay (in ms) between reaching of a new x/y position and the test of the idle pressure
			{
				if( pCommand->hasS() )
				{
					// test and take over the specified value
					nTemp = pCommand->S;
					if( nTemp < 1 )		nTemp = 1;
					if( nTemp > 10000 )	nTemp = 10000;

					g_nScanIdleDelay = nTemp;
					if( Printer::debugInfo() )
					{
						Com::printF( PSTR( "M3042: new idle delay: " ), (int)g_nScanIdleDelay );
						Com::printFLN( PSTR( " [ms]" ) );
					}
				}
				else
				{
					showInvalidSyntax( pCommand->M );
				}
				break;
			}
Für mich sieht das so aus, als könnte ich den Wert zur Laufzeit mit diesem G-Code überschreiben und höhere Werte testen.

Oder man ändert:

Code: Alles auswählen

if( nTemp >= 5 )
auf >5.

Doch... wenn ein Test 15x15ms Zeit braucht und es 5x nicht klappt, hätte der Extruder insgesamt über 1 Sekunde nachgeschwungen + Delay zu Beginn. Also etwa 1,25s ausschwingen und noch keine Ruhe im System? Naja ...


LG

Re: 1.33. ERROR: Z COMPENSATION INVALID MATRIX

Verfasst: Di 18. Okt 2016, 00:08
von Nibbels
Kann es sein, dass das Kalibrieren ohne RF2000-Blech-Lüfterhalter funktioniert?
War dieser bisher, ist er korrekt/fest angeschraubt?

LG