//************************************************************************** //Skeleton of trread.dll(経路データ読み込み) //************************************************************************** // #include #include //外部参照(DLL)関数の定義 __declspec(dllexport) void TRREADSUFFIX(char*); __declspec(dllexport) void TRREADKIND(int*,char*); __declspec(dllexport) void TRREADPATHCOLOR(int*,unsigned int*); __declspec(dllexport) void TRREADOPEN(char*); __declspec(dllexport) void TRREADSTARTPOINT(double*); __declspec(dllexport) void TRREADPATH(int*,int*,double*,double*,double*,int*, double*,double*,int*,int*); __declspec(dllexport) void TRREADCLOSE(); //本DLL内のグローバル変数の定義 FILE *fp; char rddata[160]; double pss[3],maxvol[100]; int nt; void TRREADSUFFIX(char *suffix) //[- O] 拡張子文字 { strcpy(suffix,".TXT"); } void TRREADKIND(int *lang, //[I -] =0 標準時 =1 他言語時 char *item) //[- O] 項目名 { if( *lang ) { strcpy(item,"MONITORING DATA(*.TXT)"); //他言語モード(TRYCUT.MESインストール) } else { strcpy(item,"切削モニタリングデータ(*.TXT)"); //標準(日本語)モード } } void TRREADPATHCOLOR(int *npc, //[- O] 経路色の数(MAX:10) unsigned int *rgb) //[- O] 経路色 RGBのそれぞれの // 割合(0-255)を4バイト変数 // 中の3バイトで定義 { int i; // 単位移動当たりの除去量のレベルによりパスを色分けするため // グラデーションがかかるように色を定義 *npc=10; for(i=0;i<*npc;i++) rgb[i]=RGB(255,225-25*i,225-25*i); } void TRREADOPEN(char *clfilename) //[I -] 経路ファイル名 { char *tmp; fp=fopen(clfilename,"r"); // モニタリングデータより、まずは単位移動当たりの除去量の最も多い // 値を取得するために、一度全部トレースして読む。工具ごとに最大値 // を保持させる。 nt=0; maxvol[nt]=0.0; while(fgets(rddata,sizeof(rddata),fp)) { if( !strnicmp(rddata,"N",1) ) { tmp = strpbrk(&rddata[1],"AVUD"); if( tmp != NULL ) maxvol[nt] = max(maxvol[nt],atof(tmp+1)); } else if( !strnicmp(rddata,"T",1) ) { nt++; maxvol[nt]=0.0; } } nt=0; // ポインターを先頭に戻して最初の"%"行を読んでおく fseek(fp,0,0); fgets(rddata,sizeof(rddata),fp); } void TRREADSTARTPOINT(double *startp) //[- O] スタート位置 X,Y,Z { char *tmp; // スタート点(G92)座標を読む fgets(rddata,sizeof(rddata),fp); tmp=strpbrk(rddata,"X"); startp[0]=atof(tmp+1); tmp=strpbrk(tmp+1,"Y"); startp[1]=atof(tmp+1); tmp=strpbrk(tmp+1,"Z"); startp[2]=atof(tmp+1); memcpy(pss,startp,24); } void TRREADPATH(int *nblock,//[- O] 経路のブロック番号 int *kind, //[- O] 指令コード 0:G00 1:G01 2:G02 3:G03 // ※工具番号指定は、1000+T番号 double *ps, //[- O] 始点座標XYZ double *pe, //[- O] 終点座標XYZ double *pc, //[- O] 円弧中心座標XYZ int *ipl, //[- O] 平面指定 17:G17,18:G18,19:G19 double *feed, //[- O] 送り速度 double *dataux,//[- O] 付加情報 int *pcl, //[- O] TRREADPATHCOLORで定義された経路描画の // 色番号(0〜9) int *irc) //[- O] Return Code 1(TRUE) :正常 // 0(FALSE):終了 { char *tmp; *irc= TRUE; if( fgets(rddata,sizeof(rddata),fp) == NULL ) { *irc=FALSE; return; } // 移動ブロックを読む if( !strnicmp(rddata,"N",1) ) { *nblock=atoi(&rddata[1]); tmp=strpbrk(&rddata[3],"G"); *kind=atoi(tmp+1); memcpy(ps,pss,24); tmp=strpbrk(tmp+1,"X"); pe[0]=atof(tmp+1); tmp=strpbrk(tmp+1,"Y"); pe[1]=atof(tmp+1); tmp=strpbrk(tmp+1,"Z"); pe[2]=atof(tmp+1); memcpy(pss,pe,24); // 単位移動当たりの除去量を読みペン番号を決める。 tmp = strpbrk(tmp+1,"AVUD"); if( tmp != NULL ) { *pcl=min(9,(int)(atof(tmp+1)/maxvol[nt]*10)); } else { *pcl=0; } // 工具番号を返して工具交換する } else if( !strnicmp(rddata,"T",1) ) { nt++; *kind=1000; *kind+=atoi(&rddata[1]); // "%"行で終了させる } else { *irc= FALSE; } } void TRREADCLOSE() { fclose(fp); }