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 + -
显示快捷键?