Seite 1 von 1

Pfad erzeugen

Verfasst: Freitag 12. Juli 2013, 12:22
von Simonfroehlich
Hallo,
vielleicht kann mir jemand weiterhelfen.
ich versuche gerade eine DLL zu programmieren über VS C++2008.
Das Programm soll eine Pfad erstellen wenn dieser noch nicht existiert.

void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser, StringParam PStrings)
{
struct tm *LokalZeit;
time_t Zeit; time(&Zeit);
LokalZeit = localtime(&Zeit);
wchar_t wDateipfad[256];
bool Error;

char Artikel[256]="";
sprintf(Artikel,"R:\\In_Prod\\%s\\%d" , PChar(PStrings[ArtikelInPin]),LokalZeit->tm_year+1900 );
sprintf(PChar(PStrings[TestOutPin]),"%s", Artikel);
mbstowcs(wDateipfad, Artikel, strlen(Artikel)+1);//Plus null
Error = CreateDirectory(wDateipfad,NULL);
if (Error==false)
{
POutput[TestOutPin]=GetLastError();
}
Wenn ich das Programm mit einem Testprogramm in VS simuliere wird der Pfad erzeugt.
Lade ich die DLL in Profilab und führe das Programm aus, so wird der Pfad nicht erzeugt.

Mfg
Simon

Re: Pfad erzeugen

Verfasst: Freitag 12. Juli 2013, 13:20
von IKT
@simon
was im code sofort auffällt ...
Da sind 2 öffnende, geschweifte Klammern und nur 1 schliessende ... dies funktioniert niemals ... (egal welcher C dialekt).
Ansonsten verstehe ich die VS Syntax zu wenig ...

Re: Pfad erzeugen

Verfasst: Freitag 12. Juli 2013, 13:41
von Simonfroehlich
Ja ich habe nur den Teil reinkopiert der für die Pfad Erzeugung zuständig ist.

Das Programm lässt sich compilieren und die anderen Funktionen laufen in der DLL auch.

habe jetzt auch den Befehl mkdir() ausprobiert erzeugt aber wieder kein Pfad.

Re: Pfad erzeugen

Verfasst: Montag 15. Juli 2013, 09:05
von Mike D
Moin,
was wird denn an TestOutPin ausgegeben?

Re: Pfad erzeugen

Verfasst: Montag 15. Juli 2013, 14:28
von Simonfroehlich
Hallo,

der ist nur zum testen.
Gebe einen String oder double aus.

Mein Programm funktioniert so wie ich es geschrieben habe, wenn mein Pfad auf kein Netzwerklaufwerk zugreift.
Vielleicht kann mir jemand sagen warum das so ist.

Gruß

Simon

Re: Pfad erzeugen

Verfasst: Montag 15. Juli 2013, 14:39
von Mike D
Simonfroehlich hat geschrieben:der ist nur zum testen.
das war mir schon klar, ich meinte mit meiner Frage: was wird ausgegeben wenn die DLL in PL aufgerufen wird, ein String mit sinnvoller Pfandangabe oder ein Fehler?

Außerdem: CCalculateEx wird nicht nur einmal in PL aufgerufen, sondern bei jedem Simulationsdurchlauf, also versuchst du mit min 1000Hz einen neuen Pfad anzulegen.
Was macht die DLL denn sonst noch?

Mike

Re: Pfad erzeugen

Verfasst: Dienstag 16. Juli 2013, 08:25
von Simonfroehlich
Hier mal die ganze Funktion von CCalculateEx

Der Pfad, so wie die Textfile wird nur einmal erzeugt oder überprüft ob sie schon existiert.
Wird der Name der Textfile verändert, so wird diese neu erzeugt.

File *fp muss Global deklariert werden.

DLLEXPORT void _stdcall CCalculateEx(double *PInput, double *POutput, double *PUser,StringParam PStrings)
{

char Temp[100]="";
wchar_t wTemp[100];
char cDateipfad[100]="";
wchar_t wDateipfad[100];

char dateiname[256]="";
struct tm *LokalZeit;
time_t Zeit;
time(&Zeit);
LokalZeit = localtime(&Zeit);
//-------------------------Datei Pfad erzeugen oder überprüfen ob dieser schon exisitiert.---------------
if (StatusDateipfad==false)
{
sprintf(cDateipfad,"c:\\ETWDevice\\%s",PChar(PStrings[ArtikelInPin]));//, timeinfo->tm_year+1900);
mbstowcs(wDateipfad, cDateipfad, strlen(cDateipfad)+1);

CreateDirectoryW(wDateipfad, NULL);

sprintf(cDateipfad,"c:\\ETWDevice\\%s\\%d",PChar(PStrings[ArtikelInPin]),LokalZeit->tm_year+1900);
mbstowcs(wDateipfad, cDateipfad, strlen(cDateipfad)+1);

if(CreateDirectoryW(wDateipfad, NULL))
{
StatusDateipfad=true;
}
else if (GetLastError()==ERROR_ALREADY_EXISTS)
{
StatusDateipfad=true;
}
else if (GetLastError()==ERROR_PATH_NOT_FOUND)
{
MessageBoxW(NULL,TEXT("ERROR_PATH_NOT_FOUND"),TEXT("Config"), MB_OK);
}
}
//---------------------------------------------------------------------------------------------------------
//--------------------------------Textfile erzeugen--------------------------------------------------------
if((PInput[TaktInPin]==0&&Takt_OLD==true)&&StatusDateipfad==true)
{
Takt_OLD=false;
switch (Counter)
{
case 0://1. Überprüfen der Daten und Kopfzeile erzeugen.
{
if(PInput[PrueferInPin]==0){MessageBoxW(NULL,TEXT("Kein Prüfer eingetragen"),TEXT("Fehler"), MB_OK);}
else if(PInput[FANrInPin]==0){MessageBoxW(NULL,TEXT("Keine FA-Nr vorhanden"),TEXT("Fehler"), MB_OK);}
else if(PInput[SNrInPin]==0){MessageBoxW(NULL,TEXT("Keine S-Nr vorhanden"),TEXT("Fehler"), MB_OK);}
else
{
sprintf(Temp,"c:\\ETWDevice\\%s\\%d\\%d.txt",PChar(PStrings[ArtikelInPin]),
LokalZeit->tm_year+1900,
(int) PInput[SNrInPin] );
mbstowcs(wTemp, Temp, strlen(Temp)+1);

fp = fopen( Temp,"a"); // Datei neu erzeugen bzw. weiterschreiben,wenn sie schon existiert.
fprintf(fp, "\n**************************************************\n");
fprintf(fp, "Prüfprogramm: %s",PChar(PStrings[ArtikelInPin]));
fprintf(fp, "\n**************************************************\n\n");
fprintf(fp, "Datum: %02d:%02d:%02d - %02d.%02d.%d\n", LokalZeit->tm_hour,
LokalZeit->tm_min,
LokalZeit->tm_sec,
LokalZeit->tm_mday,
LokalZeit->tm_mon+1,
LokalZeit->tm_year+1900);
fprintf(fp, "Prüfer: %d\n",(int)PInput[PrueferInPin]); // reinen Text "Hallo!" in die Datei schreiben
fprintf(fp, "FA-Nr.: %d\n",(int)PInput[FANrInPin]);
fprintf(fp, "Seriennr.: %d\n",(int) PInput[SNrInPin]);
fprintf(fp, "\n--------------------------------------------------\n");
fprintf(fp, "\n------------------Prüfschritte--------------------\n\n");
StatusHeaderFile=true;
Counter++;
}
}
break;

case 1://Prüfschritte werden so lange wiederholt, bis ein Impuls am Eingang "Speichern" aktiv wird.
{
fprintf(fp,"- %s: %s\n", PChar(PStrings[PruefschrittInPin]),
PChar(PStrings[ErgebnisInPin]));
}
break;
default:
{
}
}
}
else if(PInput[TaktInPin]==5)
{
Takt_OLD=true;
}
//----------------------------------------------------------------------------------------------------------
POutput[TestOutPin]=Counter;

if(PInput[SpeichernInPin]==0&&Speichern_OLD==true)
{
Speichern_OLD=false;

if (Counter>0)
{
Counter = 0;
fprintf(fp, "\n-----------------------Ende-----------------------");
fprintf(fp, "\n**************************************************\n");
fclose(fp); // Datei schließen wenn eine offen ist.
}

}
else if (PInput[SpeichernInPin]==5)
{
Speichern_OLD=true;
}
}

Hier noch die Textfile, die erzeugt wird.

**************************************************
Prüfprogramm: XXX
**************************************************

Datum: 09:14:13 - 16.07.2013
Prüfer: XXX
FA-Nr.: XXXX
Seriennr.: XXX

--------------------------------------------------

------------------Prüfschritte--------------------

- Spannung 3,3V: 3,3125
- Spannung 24V: 24,25
- Spannung 12V: 12,25
- Freigabe: OK
- Aktor: OK

-----------------------Ende-----------------------
**************************************************
Gruß
Simon