Добрый день! На основе примера Евгения Кислова переделываю скрипт под свои нужды.
Задача состоит в том чтобы имя файла формировалось с помощью функции snprintf и состояло из даты и времени формата ддммггггччммсс.csv
snprintf(filename,(FILENAMESIZE+1), "%02d%02d%04d%02d%02d%02d.csv", wDay, wMonth, wYear, wHour, wMinute, wSecond);
Происходит ошибка открытия файла. Друзья, что у меня не верно? Если ли ошибка в длине имени файла FILENAMESIZE = 18?
// e.kislov@owen.ru
// DECLARATION PART
#define BUFSIZE 80
#define TITLESIZE 100
#define FILENAMESIZE 18
#define LF 0x0A
#define CR 0x0D
char acBuffer[BUFSIZE]; // buffer for archive entry
char acTitle[TITLESIZE]; // buffer for title entry
FILE *ptrFile; // pointer to file
WORD wYear; // system date-time
WORD wMonth;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
float fVoltage; // variable for arhcive (float)
float fCurrent; // variable for arhcive (float)
float fTemp; // variable for arhcive (float)
char filename[FILENAMESIZE];
// END_DECLARATION
// MACRO_ARCHIVE
// get data for archive to macro
fVoltage = *(float*)(PSW+256);
fCurrent = *(float*)(PSW+258);
fTemp = *(float*)(PSW+260);
// get system date-time and convert it from BCD to DEC
wYear = 2000 + (LOBYTE(PSW[30]) / 16) * 10 + LOBYTE(PSW[30]) % 16;
wMonth = (PSW[31] / 16) * 10 + PSW[31] % 16;
wDay = (PSW[32] / 16) * 10 + PSW[32] % 16;
wHour = (PSW[33] / 16) * 10 + PSW[33] % 16;
wMinute = (PSW[34] / 16) * 10 + PSW[34] % 16;
wSecond = (PSW[35] / 16) * 10 + PSW[35] % 16;
if (PSW[312]==1)
{
Reads(HMI_LOCAL_MCH, 0, TYPE_PSW, 316, FILENAMESIZE/2, &filename);
}
else
{
//open file, choose your name as you wish (no CAPS, no space, no keywords, no signs (like _), no russian letters)
snprintf(filename,(FILENAMESIZE+1), "%02d%02d%04d%02d%02d%02d.csv", wDay, wMonth, wYear, wHour, wMinute, wSecond);
//Write filename to register
Writes(HMI_LOCAL_MCH, 0, TYPE_PSW, 316, FILENAMESIZE/2, &filename);
}
ptrFile = fopen(filename, "w");
if(ptrFile==NULL)
{
PSW[310]=1; // no USB, create warning message
}
else
{
PSW[310]=2; // USB detected, create inform message
if ( PSW[312]==0 ) // no title, we need to write it once
{
// create title as format string
// use ASCII-codes (Win1251) for russian letters
// choose your text and format as you wish
snprintf(acTitle, (TITLESIZE-1), "Log file;%c%c%c%c%c%c%c%c;%c%c%c%c%c;Voltage;Current;T emperature;%c%c",
CR, LF, CR, LF, 0xC4, 0xE0, 0xF2, 0xE0, 0xC2, 0xF0, 0xE5, 0xEC, 0xFF, CR, LF);
// write title to file
fwrite(acTitle, 1, strlen(acTitle), ptrFile);
PSW[312]=1; // this way we will not write title anymore
PSW[314]=PSW[314]+strlen(acTitle);// move position for next writing
//WriteToPFW_DW(400, GetPFW(400)+strlen(acTitle)); // move position for next writing
}
// now we need to write archive data in file
// move position for writing in file
fseek(ptrFile, PSW[314], SEEK_SET);
// convert your archive data to format string
// use ASCII-codes (Win1251) for russian letters
// choose your data and format as you wish
snprintf(acBuffer, (BUFSIZE-1), "%02d.%02d.%04d;%02d:%02d:%02d;%.2f;%.2f;%.0f;%c%c ",
wDay, wMonth, wYear, wHour, wMinute, wSecond, fVoltage, fCurrent, fTemp, CR, LF);
// write data to file
fwrite(acBuffer, 1, strlen(acBuffer), ptrFile);
// close file
fclose(ptrFile);
// move position for next writing
PSW[314] = PSW[314]+strlen(acBuffer);
}
// END_MACRO_ARCHIVE