Добрый день! На основе примера Евгения Кислова переделываю скрипт под свои нужды.
Задача состоит в том чтобы имя файла формировалось с помощью функции 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