files.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 1,452 行 · 第 1/3 页
C
1,452 行
FILE * File; char Okay = FALSE; char Line[300]; char * LineOk; int Params[3]; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { if (Line[0]!=';') { ConvRawLineOfNumbers(Line,2,Params); switch(Params[0]) { case BASE_MINS: case BASE_SECS: case BASE_100MS: BufMonostables->Base = CorresDatasForBase[Params[0]].ValueInMS; BufMonostables->Preset = Params[1] * BufMonostables->Base; strcpy(BufMonostables->DisplayFormat,CorresDatasForBase[Params[0]].DisplayFormat); break; default: BufMonostables->Base = 1; BufMonostables->Preset = 10; strcpy(BufMonostables->DisplayFormat,"%f?"); rtapi_print_msg(RTAPI_MSG_ERR, "!!! Error loading parameter base in %s\n",FileName); break; }rtapi_print_msg(RTAPI_MSG_DBG, "Monostable => Base = %d , Preset = %d\n",BufMonostables->Base,BufMonostables->Preset); BufMonostables++; } } } while(LineOk); fclose(File); Okay = TRUE; } return (Okay);}char SaveMonostablesParams(char * FileName,StrMonostable * BufMonostables){ FILE * File; char Okay = FALSE; int NumMonostable = 0; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; Monostables :\n"); fprintf(File,"; Base(see classicladder.h),Preset\n"); do { fprintf(File,"%d,%d\n",ConvBaseInMilliSecsToId(BufMonostables->Base),BufMonostables->Preset/BufMonostables->Base); BufMonostables++; NumMonostable++; } while(NumMonostable<NBR_MONOSTABLES); fclose(File); Okay = TRUE; } return (Okay);}char LoadCountersParams(char * FileName){ FILE * File; char Okay = FALSE; char Line[300]; char * LineOk; int Params[1]; int ScanCounter = 0; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { if (Line[0]!=';') { ConvRawLineOfNumbers(Line,1,Params); CounterArray[ ScanCounter++ ].Preset = Params[0]; } } } while(LineOk); fclose(File); Okay = TRUE; } return (Okay);}char SaveCountersParams(char * FileName){ FILE * File; char Okay = FALSE; int ScanCounter; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; Counters :\n"); fprintf(File,"; Preset\n"); for( ScanCounter=0; ScanCounter<NBR_COUNTERS; ScanCounter++ ) { fprintf(File,"%d\n",CounterArray[ ScanCounter ].Preset); } fclose(File); Okay = TRUE; } return (Okay);}char LoadArithmeticExpr(char * FileName){ FILE * File; char Okay = FALSE; char Line[300]; char * LineOk; int NumExpr = 0; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { if (Line[0]!=';') {//WIN32PORT RemoveEndLine( Line ); strcpy(ArithmExpr[NumExpr].Expr,Line); NumExpr++; } } } while(LineOk); fclose(File); Okay = TRUE; } return (Okay);}char SaveArithmeticExpr(char * FileName){ FILE * File; char Okay = FALSE; int NumExpr; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; Arithmetic expressions :\n"); fprintf(File,"; Compare or Operate ones\n"); for(NumExpr=0; NumExpr<NBR_ARITHM_EXPR; NumExpr++) { fprintf(File,"%s\n",ArithmExpr[NumExpr].Expr); } fclose(File); Okay = TRUE; } return (Okay);}char LoadSectionsParams(char * FileName){ FILE * File; char Okay = FALSE; char Line[300]; char * LineOk; int NumSection; StrSection * pSection; int Params[10]; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { switch(Line[0]) { case ';': break; case '#': if(strncmp(&Line[1],"VER=",4)==0) { if (atoi(&Line[5])>1) { rtapi_print_msg(RTAPI_MSG_ERR, "Sections file version not supported...\n"); LineOk = FALSE; } } // #NAMExxx=.... if(strncmp(&Line[1],"NAME",4)==0) { Line[ 8 ] = '\0'; NumSection = atoi( &Line[5] ); strcpy(SectionArray[ NumSection ].Name, &Line[9]);//WIN32PORT RemoveEndLine( SectionArray[ NumSection ].Name ); } break; default: ConvRawLineOfNumbers(Line,6,Params); NumSection = Params[ 0 ]; pSection = &SectionArray[ NumSection ]; pSection->Used = TRUE; pSection->Language = Params[ 1 ]; pSection->SubRoutineNumber = Params[ 2 ]; pSection->FirstRung = Params[ 3 ]; pSection->LastRung = Params[ 4 ]; pSection->SequentialPage = Params[ 5 ];dbg_printf("Section %d => Name=%s, Language=%d, SRnbr=%d, FirstRung=%d, LastRung=%d, SequentialPage=%d\n", NumSection,pSection->Name, pSection->Language, pSection->SubRoutineNumber, pSection->FirstRung, pSection->LastRung, pSection->SequentialPage); break; } } } while(LineOk); fclose(File); Okay = TRUE; } return (Okay);}char SaveSectionsParams(char * FileName){ FILE * File; char Okay = FALSE; int NumSection; StrSection * pSection; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; Sections\n"); fprintf(File,"#VER=1.0\n"); NumSection = 0; do { pSection = &SectionArray[ NumSection ]; if ( pSection->Used ) fprintf(File,"#NAME%03d=%s\n", NumSection, pSection->Name); NumSection++; } while(NumSection<NBR_SECTIONS); NumSection = 0; do { pSection = &SectionArray[ NumSection ]; if ( pSection->Used ) fprintf(File,"%03d,%d,%d,%d,%d,%d\n", NumSection, pSection->Language, pSection->SubRoutineNumber, pSection->FirstRung, pSection->LastRung, pSection->SequentialPage ); NumSection++; } while(NumSection<NBR_SECTIONS); fclose(File); Okay = TRUE; } return (Okay);}char LoadIOConfParams(char * FileName){ FILE * File; char Okay = FALSE; char Line[300]; char * LineOk; StrIOConf * pConfInput = &InfosGene->InputsConf[ 0 ]; StrIOConf * pConfOutput = &InfosGene->OutputsConf[ 0 ]; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { if (Line[0]!=';') { /* input/output depending of the first caracter */ if ( Line[0]=='0' ) ConvRawLineOfNumbers(Line+2,6,(int*)pConfInput++); if ( Line[0]=='1' ) ConvRawLineOfNumbers(Line+2,6,(int*)pConfOutput++); } } } while(LineOk); fclose(File); Okay = TRUE; } return (Okay);}char SaveIOConfParams(char * FileName){ FILE * File; char Okay = FALSE; int NumConf; int NbrConf; int Pass; StrIOConf * pConf; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; I/O Configuration\n"); for( Pass=0; Pass<2; Pass++) { NbrConf = (Pass==0)?NBR_INPUTS_CONF:NBR_OUTPUTS_CONF; for( NumConf=0; NumConf<NbrConf; NumConf++ ) { pConf = (Pass==0)?&InfosGene->InputsConf[ NumConf ]:&InfosGene->OutputsConf[ NumConf ]; /* valid mapping ? */ if ( pConf->FirstClassicLadderIO!=-1 ) { fprintf(File,"%d,%d,%d,%d,%d,%d,%d\n", Pass, pConf->FirstClassicLadderIO, pConf->DeviceType, pConf->SubDevOrAdr, pConf->FirstChannel, pConf->NbrConsecutivesChannels, pConf->FlagInverted ); } } } fclose(File); Okay = TRUE; } return (Okay);}#ifdef USE_MODBUSchar LoadModbusIOConfParams(char * FileName){ FILE * File; char Okay = FALSE; char Line[300]; int IntDatas[ 6 ]; char * LineOk; StrModbusMasterReq * pConf = &ModbusMasterReq[ 0 ]; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { if (Line[0]!=';') { // if dotted IP address is used, special first field if ( strchr( Line, '.' ) ) { char * EndFirstField = strchr( Line, ',' ); // search end of the first field if ( EndFirstField ) { ConvRawLineOfNumbers( EndFirstField+1, 5, &IntDatas[1] ); *EndFirstField = '\0'; strcpy( pConf->SlaveAdr, Line ); } else { LineOk = FALSE; } } else { ConvRawLineOfNumbers( Line, 6, IntDatas ); sprintf( pConf->SlaveAdr, "%d", IntDatas[0] ); } if ( LineOk ) { pConf->TypeReq = (char)IntDatas[ 1 ]; pConf->FirstModbusElement = IntDatas[ 2 ]; pConf->NbrModbusElements = IntDatas[ 3 ]; pConf->LogicInverted = (char)IntDatas[ 4 ]; pConf->OffsetVarMapped = IntDatas[ 5 ]; pConf++; } } } } while(LineOk); fclose(File); Okay = TRUE; } return (Okay);}char SaveModbusIOConfParams(char * FileName){ FILE * File; char Okay = FALSE; int NumLine; StrModbusMasterReq * pConf; File = fopen(FileName,"wt"); if (File) { fprintf(File,"; Modbus Distributed I/O Configuration\n"); for (NumLine=0; NumLine<NBR_MODBUS_MASTER_REQ; NumLine++ ) { pConf = &ModbusMasterReq[ NumLine ]; /* valid request ? */ if ( pConf->SlaveAdr[0]!='\0' ) { fprintf(File,"%s,%d,%d,%d,%d,%d\n", pConf->SlaveAdr, pConf->TypeReq, pConf->FirstModbusElement, pConf->NbrModbusElements, pConf->LogicInverted, pConf->OffsetVarMapped ); } } fclose(File); Okay = TRUE; } return (Okay);}#endifchar LoadSymbols(char * FileName){ FILE * File; char Okay = FALSE; char Line[300]; char * LineOk; int NumSymbol = 0; char *PtrStrings[ 4 ]; int LgtMaxStrings[ 4 ]; StrSymbol * pSymbol; File = fopen(FileName,"rt"); if (File) { do { LineOk = fgets(Line,300,File); if (LineOk) { switch(Line[0]) { case ';': break; case '#': if(strncmp(&Line[1],"VER=",4)==0) { if (atoi(&Line[5])>1) { rtapi_print_msg(RTAPI_MSG_ERR, "Symbols file version not supported...\n"); LineOk = FALSE; } } break; default: pSymbol = &SymbolArray[ NumSymbol ]; PtrStrings[ 0 ] = pSymbol->VarName; LgtMaxStrings[ 0 ] = LGT_VAR_NAME; PtrStrings[ 1 ] = pSymbol->Symbol; LgtMaxStrings[ 1 ] = LGT_SYMBOL_STRING; PtrStrings[ 2 ] = pSymbol->Comment; LgtMaxStrings[ 2 ] = LGT_SYMBOL_COMMENT; PtrStrings[ 3 ] = NULL; LgtMaxStrings[ 3 ] = 0; ConvRawLineOfStrings( Line, LgtMaxStrings, PtrStrings ); RemoveEndLine( pSymbol->Comment );dbg_printf("Symbol: %s - %s - %s\n", pSymbol->VarName, pSymbol->Symbol, pSymbol->Comment); NumSymbol++; break; } } } while(LineOk); fclose(File); Okay = TRUE; }// call funtion to auto assign symbol names to HAL pins // must assign S32IN before S32OUT! SymbolsAutoAssign(BITIN,"CLinB\0","Auto named bit-in pin \0"); SymbolsAutoAssign(BITOUT,"CLoutB\0","Auto named bit-out pin \0"); SymbolsAutoAssign(S32IN,"CLinS\0","Auto named s32-in pin \0"); SymbolsAutoAssign(S32OUT,"CLoutS\0","Auto named s32-out pin \0"); return (Okay);}//auto assignment of names for symbols of s32in,s32out, bitin //and bitout if not already assigned a name
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?