files.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 1,452 行 · 第 1/3 页
C
1,452 行
// you must assign s32in before s32out unless there are no s32invoid SymbolsAutoAssign (int VariableBuf,char SymbolBuf[],char CommentBuf[]){ int scansymb,found = FALSE,i,numofvariable =1; char Buffer[30]; int startnum=0;// default number of s32in pins // this checks which type of pin we are naming. S32out is different // because it starts naming variables after the last S32in so it needs // to how many positions to offset- startnum // S32 in and out are mapped on top of WORD variables instead of adding a new variable switch(VariableBuf) { case BITIN:numofvariable= InfosGene->SizesInfos.nbr_phys_inputs;break; case BITOUT:numofvariable= InfosGene->SizesInfos.nbr_phys_outputs;break; case S32IN:numofvariable= InfosGene->SizesInfos.nbr_s32in;break; case S32OUT:numofvariable= InfosGene->SizesInfos.nbr_s32out +InfosGene->SizesInfos.nbr_s32in; startnum=InfosGene->SizesInfos.nbr_s32in;break; default : rtapi_print_msg(RTAPI_MSG_ERR, "Cannot auto assign symbol names-wrong variable name");return; }//printf("variable to assin %i number of variables available %i\n",numofvariable-startnum,InfosGene->SizesInfos.nbr_symbols); // assign variable to each s32in pin... for (i=startnum;i<numofvariable;i++) { found = FALSE; //set buffer to variable to check %W0,%W1 ... strcpy(Buffer,""); sprintf(Buffer,"%%%c%d",pinletter[VariableBuf],i); //printf("%s\n",Buffer); scansymb=0; // scan all symbol variables while ( scansymb<InfosGene->SizesInfos.nbr_symbols ) { // check for exsisting variable/symbol name if (strcmp(SymbolArray[ scansymb ].VarName, Buffer) == FALSE) { found = TRUE ; // already a symbol for this variable break;// stop looking then } scansymb ++;// check the rest } scansymb=0;// this assigns a symbol to an unassigned variable// while there is no symbol already assigned and we are not at the// end of the symbol data.. while ( found == FALSE && scansymb<InfosGene->SizesInfos.nbr_symbols ) { // look for an empty spot... if (SymbolArray[ scansymb ].VarName[ 0 ] == '\0') { //copy variable name already in Buffer to VarName array strcpy( SymbolArray[scansymb].VarName, Buffer ); //put a symbol name (and it's number) in buffer // and copy it to Symbol array strcpy(Buffer,""); sprintf(Buffer,"%s%d",SymbolBuf,i-startnum); strcpy( SymbolArray[scansymb].Symbol, Buffer ); //printf("%s\n",Buffer); strcpy(Buffer,""); sprintf(Buffer,"%s",CommentBuf); strcpy( SymbolArray[scansymb].Comment, Buffer ); break;// we are done looking } scansymb ++;// keep looking for empty spot if not done } }return;}char SaveSymbols(char * FileName){ FILE * File; char Okay = FALSE; int NumSymbol = 0; StrSymbol * pSymbol; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; Symbols\n"); fprintf(File,"#VER=1.0\n"); do { pSymbol = &SymbolArray[ NumSymbol ]; if ( pSymbol->VarName[0]!='\0') fprintf(File,"%s,%s,%s\n", pSymbol->VarName, pSymbol->Symbol, pSymbol->Comment ); NumSymbol++; } while(NumSymbol<NBR_SYMBOLS); fclose(File); Okay = TRUE; } return (Okay);}void LoadAllLadderDatas(char * DatasDirectory){ char FileName[500]; InitAllLadderDatas( TRUE ); rtapi_print_msg(RTAPI_MSG_DBG, "Loading datas from %s...\n", DatasDirectory); sprintf(FileName,"%s/timers.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading timers datas from %s\n",FileName); LoadTimersParams(FileName,TimerArray); sprintf(FileName,"%s/monostables.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading monostables datas from %s\n",FileName); LoadMonostablesParams(FileName,MonostableArray); sprintf(FileName,"%s/counters.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading counters datas from %s\n",FileName); LoadCountersParams(FileName); PrepareTimers(); PrepareMonostables(); PrepareCounters(); sprintf(FileName,"%s/arithmetic_expressions.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading arithmetic expressions from %s\n",FileName); LoadArithmeticExpr(FileName); // Sections added since v0.5.5, the format of files has a little changed : // before the prev/next rungs were not saved in each rung... // and the nmber of rungs changed when saved... sprintf(FileName,"%s/sections.csv",DatasDirectory); // rtapi_print_msg(RTAPI_MSG_DBG, "Loading sections datas from %s\n",FileName); if ( LoadSectionsParams(FileName) ) { sprintf(FileName,"%s/rung_",DatasDirectory); LoadAllRungs(FileName,RungArray); } else { rtapi_print_msg(RTAPI_MSG_DBG, "Rungs with old format found (no sections)\n"); sprintf(FileName,"%s/rung_",DatasDirectory); LoadAllRungs_V1(FileName,RungArray,&InfosGene->FirstRung,&InfosGene->LastRung,&InfosGene->CurrentRung); // if we load old format files, sections wasn't created, so we must write theses infos... SectionArray[ 0 ].FirstRung = InfosGene->FirstRung; SectionArray[ 0 ].LastRung = InfosGene->LastRung; }#ifdef SEQUENTIAL_SUPPORT sprintf(FileName,"%s/sequential.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading sequential datas from %s\n",FileName); LoadSequential( FileName );#endif sprintf(FileName,"%s/ioconf.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading I/O configuration datas from %s\n",FileName); LoadIOConfParams( FileName );#ifdef USE_MODBUS sprintf(FileName,"%s/modbusioconf.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading modbus distributed I/O configuration datas from %s\n",FileName); LoadModbusIOConfParams( FileName );#endif sprintf(FileName,"%s/symbols.csv",DatasDirectory); //rtapi_print_msg(RTAPI_MSG_DBG, "Loading symbols from %s\n",FileName); LoadSymbols(FileName); PrepareRungs();#ifdef SEQUENTIAL_SUPPORT PrepareSequential();#endif if(nogui) return;#ifdef GTK_INTERFACE ManagerDisplaySections( ); DisplaySymbols( );#endifreturn;}void SaveAllLadderDatas(char * DatasDirectory){ char FileName[500]; sprintf(FileName,"%s/timers.csv",DatasDirectory); SaveTimersParams(FileName,TimerArray); sprintf(FileName,"%s/monostables.csv",DatasDirectory); SaveMonostablesParams(FileName,MonostableArray); sprintf(FileName,"%s/counters.csv",DatasDirectory); SaveCountersParams(FileName); sprintf(FileName,"%s/arithmetic_expressions.csv",DatasDirectory); SaveArithmeticExpr(FileName); sprintf(FileName,"%s/rung_",DatasDirectory); SaveAllRungs(FileName); sprintf(FileName,"%s/sections.csv",DatasDirectory); SaveSectionsParams( FileName );#ifdef SEQUENTIAL_SUPPORT sprintf(FileName,"%s/sequential.csv",DatasDirectory); SaveSequential( FileName );#endif sprintf(FileName,"%s/ioconf.csv",DatasDirectory); SaveIOConfParams( FileName );#ifdef MODBUS sprintf(FileName,"%s/modbusioconf.csv",DatasDirectory); SaveModbusIOConfParams( FileName );#endif sprintf(FileName,"%s/symbols.csv",DatasDirectory); SaveSymbols( FileName ); InfosGene->AskConfirmationToQuit = FALSE;}#ifdef __WIN32__#define CAR_SEP '\\'#else#define CAR_SEP '/'#endifvoid VerifyDirectorySelected( char * NewDir ){ strcpy(InfosGene->LadderDirectory,NewDir); if (strlen(InfosGene->LadderDirectory)>1) { if ( strcmp( &NewDir[ strlen( NewDir ) -4 ], ".clp" )!=0 ) { // verify if path given is really a directory (not a file in it) DIR *pDir; pDir = opendir(InfosGene->LadderDirectory); if (pDir==NULL && errno==ENOTDIR) { int Lgt = strlen(InfosGene->LadderDirectory); char * End = &InfosGene->LadderDirectory[Lgt-1]; do { End--; } while(*End!=CAR_SEP && --Lgt>0); End++; if ( Lgt>0 ) { *End = '\0'; } else { debug_printf("ERROR whith path directory given for project !!!\n"); InfosGene->LadderDirectory[ 0 ] = '\0'; } } else { if (InfosGene->LadderDirectory[strlen(InfosGene->LadderDirectory)-1]!=CAR_SEP) strcat( InfosGene->LadderDirectory, "/" ); } } } debug_printf("DIRECTORY = %s\n",InfosGene->LadderDirectory);}void InitTempDir( void ){ char * TmpEnv = getenv("TMP"); if ( TmpEnv==NULL ) TmpEnv = "/tmp"; // get a single name directory sprintf( TmpDirectory, "%s/classicladder_tmp_XXXXXX", TmpEnv ); if ( mkdtemp( TmpDirectory )==NULL ) { sprintf( TmpDirectory, "%s/classicladder_tmp", TmpEnv );#ifndef __WIN32__ mkdir( TmpDirectory, S_IRWXU );#else mkdir( TmpDirectory );#endif }}char LoadProjectFiles( char * FileProject ){ char Result = FALSE; char OldProjectFound = TRUE;//V0.7.5 InitTempDir( );//V0.7.5 rtapi_print_msg(RTAPI_MSG_DBG, "Init tmp dir=%s\n", TmpDirectory); CleanTmpDirectory( TmpDirectory, FALSE ); /* if it is an old project, read directly from the directory selected... */ if ( strcmp( &FileProject[ strlen( FileProject ) -4 ], ".clp" )==0 ) OldProjectFound = FALSE; if ( OldProjectFound ) { rtapi_print_msg(RTAPI_MSG_DBG, "Loading an old project (many files in a directory) !\n"); LoadAllLadderDatas( FileProject ); } else { // split files of the project in the temp directory Result = SplitFiles( FileProject, TmpDirectory );rtapi_print_msg(RTAPI_MSG_DBG, "Load project '%s' in tmp dir=%s\n", FileProject, TmpDirectory); LoadAllLadderDatas( TmpDirectory ); } return Result;}char SaveProjectFiles( char * FileProject ){//v0.7.5 InitTempDir( ); CleanTmpDirectory( TmpDirectory, FALSE );rtapi_print_msg(RTAPI_MSG_DBG, "Save project '%s' from tmp dir=%s\n", FileProject, TmpDirectory); SaveAllLadderDatas( TmpDirectory ); if ( strcmp( &FileProject[ strlen( FileProject ) -4 ], ".clp" )!=0 ) strcat( FileProject, ".clp" ); // join files for the project in one file return JoinFiles( FileProject, TmpDirectory );}/* clean the tmp directory of the parameters files */void CleanTmpDirectory( char * Directory, char DestroyDir ){ DIR *pDir; struct dirent *pEnt; char Buff[400]; if (Directory[0]!='\0') { pDir = opendir(Directory); if (pDir) { while ((pEnt = readdir(pDir)) != NULL) { if ( strcmp(pEnt->d_name,".") && strcmp(pEnt->d_name,"..") ) {////WIN32PORT added / sprintf(Buff, "%s/%s", Directory,pEnt->d_name); remove(Buff); } } } closedir(pDir); /* delete the temp directory if wanted */ if ( DestroyDir ) {rmdir(Directory); // _rmdir() for Win32 ? rtapi_print_msg(RTAPI_MSG_DBG, "removing temp dir-%s\n",Directory);} }}#define FILE_HEAD "_FILE-"#define STR_LEN_FILE_HEAD strlen(FILE_HEAD)// Join many parameters files in a project filechar JoinFiles( char * DirAndNameOfProject, char * TmpDirectoryFiles ){ char ProjectFileOk = FALSE; FILE * pProjectFile; char Buff[300]; char BuffTemp[300]; DIR *pDir; struct dirent *pEnt; pProjectFile = fopen( DirAndNameOfProject, "wt" ); if ( pProjectFile ) { /* start line of project */ fputs( "_FILES_CLASSICLADDER\n", pProjectFile ); /* read directory of the parameters files */ pDir = opendir( TmpDirectoryFiles ); if (pDir) { while ((pEnt = readdir(pDir)) != NULL) { if ( strcmp(pEnt->d_name,".") && strcmp(pEnt->d_name,"..") ) { FILE * pParametersFile;////WIN32PORT added / sprintf(Buff, "%s/%s", TmpDirectoryFiles,pEnt->d_name); pParametersFile = fopen( Buff, "rt" ); if (pParametersFile) { sprintf( BuffTemp, FILE_HEAD "%s\n", pEnt->d_name ); fputs( BuffTemp, pProjectFile ); while( !feof( pParametersFile ) ) { char Buff[ 300 ]; fgets( Buff, 300, pParametersFile ); if (!feof(pParametersFile)) { fputs( Buff, pProjectFile ); } } fclose( pParametersFile ); sprintf( BuffTemp, "_/FILE-%s\n", pEnt->d_name ); fputs( BuffTemp, pProjectFile ); } } } closedir(pDir); } /* end line of project */ fputs( "_/FILES_CLASSICLADDER\n", pProjectFile ); fclose(pProjectFile); ProjectFileOk = TRUE; } return ProjectFileOk;}// Split a project file in many parameters fileschar SplitFiles( char * DirAndNameOfProject, char * TmpDirectoryFiles ){ char ProjectFileOk = TRUE; char Buff[ 300 ]; FILE * pProjectFile; FILE * pParametersFile; char ParametersFile[300]; strcpy(ParametersFile,""); pProjectFile = fopen( DirAndNameOfProject, "rb" ); if ( pProjectFile ) { /* start line of project ?*/ fgets( Buff, 300, pProjectFile ); if ( strncmp( Buff, "_FILES_CLASSICLADDER", strlen( "_FILES_CLASSICLADDER" ) )==0 ) { while( !feof( pProjectFile ) ) { fgets( Buff, 300, pProjectFile ); if ( !feof( pProjectFile ) ) { // header line for a file parameter ? if (strncmp(Buff,FILE_HEAD,STR_LEN_FILE_HEAD) ==0) {////WIN32PORT added / sprintf(ParametersFile, "%s/%s", TmpDirectoryFiles, &Buff[STR_LEN_FILE_HEAD]); ParametersFile[ strlen( ParametersFile )-1 ] = '\0';//WIN32PORTif ( ParametersFile[ strlen(ParametersFile)-1 ]=='\r' )ParametersFile[ strlen(ParametersFile)-1 ] = '\0'; } else { /* not end line of project ? */ if ( ( strncmp( Buff, "_/FILES_CLASSICLADDER", strlen("_/FILES_CLASSICLADDER") )!=0 ) && Buff[ 0 ]!='\n' ) { char cEndOfFile = FALSE; /* file parameter */ pParametersFile = fopen( ParametersFile, "wt" ); if (pParametersFile) { fputs( Buff, pParametersFile ); while( !feof( pProjectFile ) && !cEndOfFile ) { fgets( Buff, 300, pProjectFile ); if (strncmp(Buff,"_/FILE-",strlen("_/FILE-")) !=0) { if (!feof(pProjectFile)) fputs( Buff, pParametersFile ); } else { cEndOfFile = TRUE; } } fclose(pParametersFile); } } } } } } else { ProjectFileOk = FALSE; } fclose(pProjectFile); } else { ProjectFileOk = FALSE; } return ProjectFileOk;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?