TC3 Target Visu - Textliste (Sprachdatei in PLC auslesen)

Hendrik

Level-1
Beiträge
219
Reaktionspunkte
19
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Moin,
ich steh aktuell vor einem Problem. Ich habe mehrere Sprachen auf dem Tc3 System und wollte ein ErrLog als CSV exportieren. In der PLC arbeite ich mit Dynamischen Textlisten und somit mit Fehlercodes. Damit beim Exportieren nicht nur die Fehlernummern aufgelistet werden dachte ich mir ich lese die Sprachdatei einfach aus und such mir entsprechend meiner Nummern die Übersetzung aus der Datei. Leider funktioniert dies nicht. Hat jemand vielleicht eine Idee?

Die Datei befindet sich unter TC3 und einem CE in folgendem Pfad.
\Hard Disk\TwinCAT\3.1\Boot\Plc\Port_851\Visu\port_851.errortextlist.txt

Ich habe also einen Funktionsbaustein programmiert. Siehe Code:

Code:
FUNCTION_BLOCK FB_Read_ErrText_List
VAR_INPUT
	bExecute:		BOOL;
END_VAR
VAR_OUTPUT
	bBusy:			BOOL;
	bError:			BOOL;
	iErrID:			UDINT;
END_VAR
VAR
	iStep:				UINT;
	ExecuteTrig:		R_TRIG;
	VarExecute: 		BOOL;
	fbFileOpen: 		FB_FileOpen;
	Var_nMode:			DWORD	:= FOPEN_MODEREAD OR FOPEN_MODETEXT;                           
	Var_ePath: 			E_OpenPath := PATH_GENERIC;  
	Var_tTimeout:		TIME := DEFAULT_ADS_TIMEOUT;
	Var_hFile: 			UINT;
	fbFileGets: 		FB_FileGets;
	Var_sLine: 			STRING[255];
	sLineArray: 		ARRAY[1..100] OF STRING[255];
	sCbReadArray: 		ARRAY[1..100] OF UDINT;
	ArraysLinePos: 		INT;
	fbFileClose: 		FB_FileClose;
	fbFileRead: 		FB_FileRead;
	iReadStep: 			UINT := 50;
	nModeCase: INT;
END_VAR




(*___________________________________________________________*)
//Main
ExecuteTrig(CLK := bExecute);


CASE iStep OF
	(*____________________________________________________*)
	0:
		IF ExecuteTrig.Q = TRUE THEN
			bBusy			:= TRUE;
			bError			:= FALSE;
			iErrID			:= 0;
			Var_hFile		:= 0;
			ArraysLinePos	:= 1;
			VarExecute		:= TRUE;
			CASE nModeCase OF
				0:
					Var_nMode:= FOPEN_MODEREAD OR FOPEN_MODETEXT;    
				10:
					Var_nMode:= FOPEN_MODEREAD;    
				20:
					Var_nMode:= FOPEN_MODEREAD OR FOPEN_MODEBINARY;
					
			END_CASE  
	
			MEMSET(ADR (sLineArray[1]),0,100* SIZEOF (sLineArray[1]));
			iStep			:= 10;
		END_IF;	
	(*____________________________________________________*)
	10:	// Open
		fbFileOpen(
					sNetId		:= '', 
					sPathName	:= '\Hard Disk\TwinCAT\3.1\Boot\Plc\Port_851\Visu\port_851.errortextlist.txt', 
					nMode		:= Var_nMode, 
					ePath		:= Var_ePath, 
					bExecute	:= VarExecute, 
					tTimeout	:= Var_tTimeout);
		
		VarExecute	:= FALSE;	
		
		IF fbFileOpen.bError = FALSE THEN
			IF fbFileOpen.bBusy = FALSE THEN
				Var_hFile	:= fbFileOpen.hFile;
				fbFileOpen(
						sNetId		:= '', 
						sPathName	:= '\Hard Disk\TwinCAT\3.1\Boot\Plc\Port_851\Visu\port_851.errortextlist.txt', 
						nMode		:= Var_nMode, 
						ePath		:= Var_ePath, 
						bExecute	:= FALSE, 
						tTimeout	:= Var_tTimeout);
			
				VarExecute	:= TRUE;
				iStep		:= iReadStep;					
			ELSE
				;
			END_IF;
		ELSE
			fbFileOpen(
					sNetId		:= '', 
					sPathName	:= '\Hard Disk\TwinCAT\3.1\Boot\Plc\Port_851\Visu\port_851.errortextlist.txt', 
					nMode		:= Var_nMode, 
					ePath		:= Var_ePath, 
					bExecute	:= FALSE, 
					tTimeout	:= Var_tTimeout);
			iStep	:= 1000;
		END_IF;
	(*____________________________________________________*)
	20:	// READ	
		fbFileRead(
					sNetId		:= '', 
					hFile		:= Var_hFile, 
					pReadBuff	:= ADR(Var_sLine), 
					cbReadLen	:= SIZEOF(Var_sLine), 
					bExecute	:= VarExecute, 
					tTimeout	:= Var_tTimeout);
		VarExecute	:= FALSE;	
		
		IF fbFileRead.bError = FALSE THEN
			IF fbFileRead.bBusy = FALSE THEN
				VarExecute	:= TRUE;		
				sCbReadArray[ArraysLinePos]	:= fbFileRead.cbRead;
				sLineArray[ArraysLinePos]	:= Var_sLine;
				fbFileRead(
							sNetId		:= '', 
							hFile		:= Var_hFile, 
							pReadBuff	:= ADR(Var_sLine), 
							cbReadLen	:= SIZEOF(Var_sLine), 
							bExecute	:= FALSE, 
							tTimeout	:= Var_tTimeout);
				IF ArraysLinePos < 100 THEN
					ArraysLinePos	:= ArraysLinePos + 1;
				ELSE
					iStep		:= 30;	
				END_IF;	
				IF fbFileRead.bEOF = FALSE THEN
					;
				ELSE
					iStep		:= 30;
				END_IF;
			ELSE
				; //WAIT
			END_IF;
		ELSE
			fbFileRead(
						sNetId		:= '', 
						hFile		:= Var_hFile, 
						pReadBuff	:= ADR(Var_sLine), 
						cbReadLen	:= SIZEOF(Var_sLine), 
						bExecute	:= FALSE, 
						tTimeout	:= Var_tTimeout);
			iStep	:= 1000;
		END_IF;
		
		
	(*____________________________________________________*)
	50:	// READ
		fbFileGets(
				sNetId	:= '', 
				hFile	:= Var_hFile, 
				bExecute:= VarExecute, 
				tTimeout:= Var_tTimeout);
		VarExecute	:= FALSE;	
		
		IF fbFileGets.bError = FALSE THEN
			IF fbFileGets.bBusy = FALSE THEN
				sLineArray[ArraysLinePos]	:= fbFileGets.sLine;	
				fbFileGets(
							sNetId	:= '', 
							hFile	:= Var_hFile, 
							bExecute:= FALSE, 
							tTimeout:= Var_tTimeout);
				VarExecute	:= TRUE;
				IF ArraysLinePos < 100 THEN
					ArraysLinePos	:= ArraysLinePos + 1;
				ELSE
					iStep		:= 30;	
				END_IF;	
				IF fbFileGets.bEOF = FALSE THEN
					;
				ELSE
					iStep		:= 30;
				END_IF;
			ELSE
				;//WAIT		
			END_IF
		ELSE
			fbFileGets(
						sNetId	:= '', 
						hFile	:= Var_hFile, 
						bExecute:= FALSE, 
						tTimeout:= Var_tTimeout);
			iStep	:= 1000;
		END_IF;
		
	(*____________________________________________________*)
	30:	// CLOSE
		fbFileClose(
					sNetId	:= '', 
					hFile	:= Var_hFile, 
					bExecute:= VarExecute, 
					tTimeout:= Var_tTimeout);
	
		VarExecute	:= FALSE;
		IF fbFileClose.bError = FALSE THEN
			IF fbFileClose.bBusy = FALSE THEN
				fbFileClose(
						sNetId	:= '', 
						hFile	:= 0, 
						bExecute:= FALSE, 
						tTimeout:= Var_tTimeout);
				Var_hFile	:= 0;
				bBusy		:= FALSE;
				iStep		:= 0;	
			ELSE
				;
			END_IF;
		ELSE
			fbFileClose(
						sNetId	:= '', 
						hFile	:= 0, 
						bExecute:= FALSE, 
						tTimeout:= Var_tTimeout);
			iStep	:= 1000;	
		END_IF
	(*____________________________________________________*)
	1000:	// Error
	
		bBusy		:= FALSE;
		bError		:= TRUE;
		iErrID		:= 1000;
		Var_hFile	:= 0;
		iStep		:= 0;	
					
END_CASE

Leider kommt beim auslesen nur Buchstabengulasch raus....
Am PRG Code zu erkennen habe ich schon mehrere Kombinationen zum Lesen der Datei ausprobiert.

Ich hoffe ich steh einfach nur auf dem "Schlauch".

Vielen Dank für alle Anregungen im voraus!
Grüße Hendrik
 
Hallo Hendrik,

bin mir nicht ganz sicher aber ich zähl mal auf was mir so auffällt ... vielleicht bekommen wir es so gemeinsam hin :wink:

... ich sehe keine Sprung nach iStep 20, da liest du die Datei ein. Für mich sieht es so aus als ob du von 10 direkt nach 50 springst (iReadStep ist mit 50 vordeklariert) und dort dann halt irgendwas ausliest, erklärt vielleicht den 'Müll'.

Selbst wenn du über iStep 20 deine Dateil liest benutz du keinen Stringbuffer - mit SIZEOF(var_sLine) wird die Größe der Variablendeklaration aufgelöst. Du wirst immer 255 Zeichen einlesen egal wie groß deine Stringzeile in deiner Datei ist. Damit kannst du dir ebenfalls viel Müll reinholen.

In dem Sinne ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sieht eher so aus, als ob wahlweise im Binary oder Text mode gelesen werden soll. Wobei der Text mode zunächst mal der richtige ist.
Var_nMode wird zwar mit FOPEN_MODEREAD OR FOPEN_MODETEXT initialisiert, aber dann in Schritt 0 nochmal entsprechend nModeCase gesetzt. Ist nModeCase wirklich = 0?
Sonst poste doch mal, wie die erste Zeile im Original und nach dem Einlesen aussieht.

Nebenbei: Du machst Dir das Leben zu schwer. Bei den File-FB-Aufrufen, mit denen Du bExecute wieder false setzt, kannst Du die übrigen Inputs weglassen.
 
Zurück
Oben