/* #TITLE# ばねの強度計算 */ /* BANE.MAC 2003.11.1 by kita*/ /* 「第2版 ばねの設計」 ばね技術研究会編 丸善(株) より */ /* 2015.3.25 単位を変更 kgf -> N */ clear(); ERROR/OFF str = array(5); /*条件文字列格納用配列*/ mojikan = 5 / #CURPICSCF; /*------- メニュー画面 */ label0: echo "1.引張 2.圧縮 3.皿 4.Tosion 終了"; menu_no = getany(1); type_tmp = vtype(menu_no); if (type_tmp == 5) { /* Entr キーのみ */ exit; } switch (menu_no){ case 1: goto label1;break; case 2: goto label2;break; case 3: goto label3;break; case 4: goto label4;break; } label1: /* 引張ばね */ echo "仕様文字列をピック"; p = getpnt(1); id0 = pick(p); VER [idptr(id0)] str0 = #VERTXT; /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ tmp = sscan(str0,"%s %f %s %s %f %s %s %f %s %s %f %s %f %s %s %f %s %f %s"); k = tmp[1]; l0 = tmp[4]; p0 = tmp[7]; lset = tmp[10]; lact = tmp[15]; tmp[12] = p0 + k*(lset-l0); tmp[17] = p0 + k*(lact-l0); /*0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 */ str1 = sprint("%s %3.3f %s\r%s %3.1f %s %s %3.2f %s\r%s %3.1f %s %3.1f %s\r%s %3.1f %s %3.1f %s", tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],tmp[5],tmp[6],tmp[7],tmp[8],tmp[9],tmp[10],tmp[11],tmp[12],tmp[13],tmp[14],tmp[15],tmp[16],tmp[17],tmp[18]); TEXT/MOD [idptr(id0)] [str1] goto label0; /* 引張ばね終了 */ label2: /* 圧縮ばね */ echo "仕様文字列をピック"; p = getpnt(1); id0 = pick(p); VER [idptr(id0)] str0 = #VERTXT; tmp = sscan(str0,"%s %f %s %s %f %s %s %f %s %f %s %s %f %s %f %s"); k = tmp[1]; l0 = tmp[4]; lset = tmp[7]; lact = tmp[12]; tmp[9] = k*(l0 - lset); tmp[14] = k*(l0 - lact); str1 = sprint("%s %3.3f %s\r%s %3.1f %s\r%s %3.1f %s %3.2f %s\r%s %3.1f %s %3.2f %s", tmp[0],tmp[1],tmp[2],tmp[3],tmp[4],tmp[5],tmp[6],tmp[7],tmp[8],tmp[9],tmp[10],tmp[11],tmp[12],tmp[13],tmp[14],tmp[15]); TEXT/MOD [idptr(id0)] [str1] goto label0; /* 圧縮ばね終了 */ label3: /* 皿ばね */ echo "1.即実行 2.条件文字列サンプル 3.中止"; menu_no = getany(1); type_tmp = vtype(menu_no); if (type_tmp == 5) { /* Entr キーのみ */ menu_no = 1; } else if (type_tmp != 3) { /* 数字以外 */ echo "\a"; goto label3; } else if (menu_no < 1 || menu_no > 3){ echo "\a"; goto label3; } switch (menu_no){ case 1: break; case 2: echo "書き出す位置をクリックしてください"; locate_txt = getpnt(1); GNT "内径D1= 50" <[locate_txt[0]],[locate_txt[1]]> GNT "外形D2= 300" <[locate_txt[0]],[locate_txt[1]-mojikan]> GNT "板厚t= 0.5" <[locate_txt[0]],[locate_txt[1]-mojikan*2]> GNT "さら深さH= 8" <[locate_txt[0]],[locate_txt[1]-mojikan*3]> GNT "たわみdelta= 6" <[locate_txt[0]],[locate_txt[1]-mojikan*4]> GNT "E,myuu= 21000 0.3" <[locate_txt[0]],[locate_txt[1]-mojikan*5]> TEXT/MOD /* 文字列修正 */ goto label3; break; case 3: exit; break; default: goto label3; } echo "計算条件文字列をピックしてください"; str = gettxt(6); r1 = 0; r2 = 0; t = 0;h = 0; delta = 0; p = 0; e = 21000; myuu = 0.3; /*変数初期化*/ for (i=0;i<=5;i+=1){ if (strstr(str[i],"D1=") != -1){ tmp = sscan(str[i],"%s %f"); r1 = tmp[1]/2; } else if (strstr(str[i],"D2=") != -1){ tmp = sscan(str[i],"%s %f"); r2 = tmp[1]/2; } else if (strstr(str[i],"t=") != -1){ tmp = sscan(str[i],"%s %f"); t = tmp[1]; } else if (strstr(str[i],"H=") != -1){ tmp = sscan(str[i],"%s %f"); h = tmp[1]; } else if (strstr(str[i],"delta=") != -1){ tmp = sscan(str[i],"%s %f"); delta = tmp[1]; } else if (strstr(str[i],"E=") != -1){ tmp = sscan(str[i],"%s %f %f"); e = tmp[1]; myuu = tmp[2]; } } /*------ 計算-------*/ alf=r2/r1; c=((alf+1)/(alf-1)-2/log(alf)) * pi * (alf/(alf-1))**2; c1=delta/(1-myuu**2)/t * ((h/t-delta/t)*(h/t-delta/2/t)+1); p=c1*c*e*t**4/r2**2; k=e*t*c/(1-myuu**2)/r2**2 * (h**2 - 3*h*delta + t**2 + 3/2*delta**2); c2=((alf-1)/log(alf)-1)*6/pi/log(alf); c3=3*(alf-1)/pi/log(alf); c4=((alf-1)/log(alf)-alf)*6/alf/pi/log(alf); c5=3*(alf-1)/alf/pi/log(alf); kc1=c*delta/(1-myuu**2)/t * (c2*(h/t-delta/2/t)+c3); kc2=c*delta/(1-myuu**2)/t * (c4*(h/t-delta/2/t)+c5); kt1=-c*delta/(1-myuu**2)/t * (c2*(h/t-delta/2/t)-c3); kt2=-c*delta/(1-myuu**2)/t * (c4*(h/t-delta/2/t)-c5); sgmc1=-kc1*e*t**2/r2**2; sgmc2=-kc2*e*t**2/r2**2; sgmt1=kt1*e*t**2/r2**2; sgmt2=kt1*e*t**2/r2**2; /*------ 許容応力 --------*/ if(t>=0 && t<=0.5){ sgm_a=112; } else if(t>0.5 && t<=0.8){ sgm_a=96; } else if(t>0.8 && t<=1.25){ sgm_a=89; } else if(t>1.25 && t<=3){ sgm_a=82; } else { sgm_a=77; } /*------- 標示 --------*/ ss_tmp = sprint("荷 重 P = %7.2f [kgf]",p); ss_tmp1 = sprint("ばね定数 k = %7.2f [kgf/mm]",k); ss_tmp2 = sprint("内周上縁 σc1 = %7.2f [kgf/mm2]",sgmc1); ss_tmp3 = sprint("外周上縁 σc2 = %7.2f [kgf/mm2]",sgmc2); ss_tmp4 = sprint("内周下縁 σt1 = %7.2f [kgf/mm2]",sgmt1); ss_tmp5 = sprint("外周下縁 σt2 = %7.2f [kgf/mm2]",sgmt2); ss_tmp6 = sprint("許容応力 σca = %7.2f [kgf/mm2]",sgm_a); echo "答の出力位置をクリックしてください"; p_ss=getpnt(1); GNT [ss_tmp] <[p_ss[0]],[p_ss[1]]> GNT [ss_tmp1] <[p_ss[0]],[p_ss[1]-mojikan]> GNT [ss_tmp2] <[p_ss[0]],[p_ss[1]-2*mojikan]> GNT [ss_tmp3] <[p_ss[0]],[p_ss[1]-3*mojikan]> GNT [ss_tmp4] <[p_ss[0]],[p_ss[1]-4*mojikan]> GNT [ss_tmp5] <[p_ss[0]],[p_ss[1]-5*mojikan]> GNT [ss_tmp6] <[p_ss[0]],[p_ss[1]-6*mojikan]> /* デバッグ用 GNT [alf] <100,35> GNT [c] <100,30> GNT [c1] <100,25> GNT [pi] <100,0> GNT [2/log10(alf)] <100,-5> */ echo "グラフの出力位置をクリックしてください"; l0=10*delta; l1=p; p0=getpnt(1); p1=pce(1,1);p1[0]=p0[0]+l0;p1[1]=p0[1]+l1; p_p=pce(1,1); LCP [p0] <[p0[0]+l0],[p0[1]]> <[p0[0]+l0],[p0[1]+l1]> <[p0[0]],[p0[1]+l1]> [p0] <[p0[0]],[p0[1]+l1]> n=l0; /* くり返し数 */ p_max=0;delta_pmax=0; /* 荷重最大となる変位 初期化 */ FREE [p0] /* δ - P 自由曲線開始 */ for(i=1;i<=n;i+=1) { delta_x=i/10; c1=delta_x/(1-myuu**2)/t * ((h/t-delta_x/t)*(h/t-delta_x/2/t)+1); p=c1*c*e*t**4/r2**2; p_p[0]=p0[0]+i; p_p[1]=p0[1]+p; [p_p] } /* δ - P 自由曲線終了 */ FREE [p0] /* δ -σ 自由曲開始 */ for(i=1;i<=n;i+=1) { delta_x=i/10; c1=delta_x/(1-myuu**2)/t * ((h/t-delta_x/t)*(h/t-delta_x/2/t)+1); c2=((alf-1)/log(alf)-1)*6/pi/log(alf); c3=3*(alf-1)/pi/log(alf); c4=((alf-1)/log(alf)-alf)*6/alf/pi/log(alf); c5=3*(alf-1)/alf/pi/log(alf); kc1=c*delta_x/(1-myuu**2)/t * (c2*(h/t-delta_x/2/t)+c3); kc2=c*delta_x/(1-myuu**2)/t * (c4*(h/t-delta_x/2/t)+c5); kt1=-c*delta_x/(1-myuu**2)/t * (c2*(h/t-delta_x/2/t)-c3); kt2=-c*delta_x/(1-myuu**2)/t * (c4*(h/t-delta_x/2/t)-c5); sgmc1=-kc1*e*t**2/r2**2; sgmc2=-kc2*e*t**2/r2**2; sgmt1=kt1*e*t**2/r2**2; sgmt2=kt1*e*t**2/r2**2; p_p[0]=p0[0]+i; p_p[1]=p0[1]+sgmc1; [p_p] } /* δ -σ 自由曲線終了 */ goto label0; /* 皿ばね終了 */ /* ******************** */ /* トーションばねの設計 */ /* ******************** */ label4: echo "1.即実行 2.条件文字列サンプル 3.中止"; menu_no = getany(1); type_tmp = vtype(menu_no); if (type_tmp == 5) { /* Entr キーのみ */ menu_no = 1; } else if (type_tmp != 3) { /* 数字以外 */ echo "\a"; goto label4; } else if (menu_no < 1 || menu_no > 3){ echo "\a"; goto label4; } mojikan = 5 / #CURPICSCF; if (menu_no == 2){ echo "書き出す位置をクリックしてください"; locate_txt = getpnt(1); GNT "材質(1:SS2-2:SUS)= 2" <[locate_txt[0]],[locate_txt[1]]> GNT "線径d[mm]= 3.2" <[locate_txt[0]],[locate_txt[1]-mojikan]> GNT "平均径D[mm]= 26" <[locate_txt[0]],[locate_txt[1]-mojikan*2]> GNT "巻数n= 4" <[locate_txt[0]],[locate_txt[1]-mojikan*3]> GNT "ねじり角fai1[deg]= 30" <[locate_txt[0]],[locate_txt[1]-mojikan*4]> GNT "ねじり角fai2[deg]= 40" <[locate_txt[0]],[locate_txt[1]-mojikan*5]> exit; } echo "作図条件文字列をピックしてください"; /* label_sai:*/ /* 再入力ラベル*/ str = gettxt(6); g_a = 9.8; /* 重力加速度 */ d=0.0;dd=0.0;n=0;fai1=0.0;fai2=0.0; /*変数初期化*/ for (i=0;i<6 ;i+=1){ if (strstr(str[i],"材質") != -1){ tmp = sscan(str[i],"%s %d"); if(tmp[1] == 1){ e = 21000*g_a;} else if(tmp[1] == 2){ e = 19700*g_a;} } else if (strstr(str[i],"線径") != -1){ tmp = sscan(str[i],"%s %f"); d = tmp[1]; } else if (strstr(str[i],"平均径") != -1){ tmp = sscan(str[i],"%s %f"); dd = tmp[1]; } else if (strstr(str[i],"巻数") != -1){ tmp = sscan(str[i],"%s %f"); n = tmp[1]; } else if (strstr(str[i],"ねじり角fai1") != -1){ tmp = sscan(str[i],"%s %f"); fai1 = tmp[1]; } else if (strstr(str[i],"ねじり角fai2") != -1){ tmp = sscan(str[i],"%s %f"); fai2 = tmp[1]; } } ktd = e*d**4/3667/dd/n; /* [N.mm/deg] */ sgm1 = e*d*(fai1/360/dd/n); /* [N/mm2] */ sgm2 = e*d*(fai2/360/dd/n); /* [N/mm2] */ tlk1 = fai1 * ktd; tlk2 = fai2 * ktd; /* ss_tmp1 = sprint("ktd = %6.3f[kgf.mm/deg]\n",ktd); s_tmp2 = sprint("tlk1 = %6.2f[kgf.mm] sgm1 = %5.2f[kgf/mm2]\n",tlk1,sgm1);*/ ss_tmp1 = sprint("ktd = %6.3f[N.mm/deg]\n",ktd); ss_tmp2 = sprint("tlk1 = %6.2f[N.mm] sgm1 = %5.2f[N/mm2]\n",tlk1,sgm1); ss_tmp3 = sprint("tlk2 = %6.2f sgm2 = %5.2f",tlk2,sgm2); ss_tmp = ss_tmp1 + ss_tmp2 + ss_tmp3; echo "答の出力位置をクリックしてください"; TPAT /* 自動点 */ p_ss = getpnt(1); GNT [ss_tmp] [p_ss] ERROR/ONN goto label0; exit;