2007年10月02日

[007]プログラム例〜ねじ切り計算プログラム〜

今回は簡単ながら、実用的なプログラム例を挙げてみました。実はわたくし、機械加工関係の仕事をしています。今回のプログラム例は旋盤でねじを切る際に役に立っています。

Screenshot076.png

ソースはNejiNavi.tar.gzです。
解凍するとNejiNaviというディレクトリができます。そのなかのNejiNavi.prjをanjutaで開けば好きなように弄れる筈です。

旋盤でバイトを使ってねじを切る場合、切込みを数回〜10回位に分けて行いますが、その切込み量を計算してくれるアプリケーションです。

上のスクリーンショットは、M30、ピッチ1.5のめねじを旋盤で切る場合の計算結果です。
この場合のねじを切る手順としては、

  1. 下穴をΦ28.38に仕上げる
  2. 先端が60°のネジ切りバイトをセットする
  3. バイトの先端が内径面に触れたところで切込目盛を0(原点)にセットする
  4. 刃物送り(軸方向)ハンドルの目盛も0にする
  5. 最初の切込み0.3で1回目のねじ切りをする
  6. 2回目は切り込み0.45(原点に対して)、刃物送り0.09で行う
  7. 10回目まで同様

となります。


ねじの計算式
《切込み量》
三角ねじの切込み量は、ピッチをPとすると以下のようになります。
[メートルねじ] ねじ山の角度=60°
おねじ→0.649P めねじ→0.58P

[ユニファイねじ] ねじ山の角度=60°
おねじ→0.613P めねじ→0.58P

[ウィットねじ] ねじ山の角度=55°
おねじ→0.64P めねじ→0.569P

《めねじの下穴径》
[ネジの下穴径]=[ねじの呼び径]-(5/4)*H
ここで、
H=P/{2*tan(θ/2)}
P:ピッチ θ:ねじ山の角度


補間曲線について
例えばM30、P=1.5のめねじの場合、最終的な切り込みは
0.58 × 1.5 = 0.87mm
となります。これを10回程度に分けて切込むことになります。1回目の切込みを0.3mmとした場合、2回目から9回目までの切込みはどうやって計算すればいいのでしょう?

このことに関する答は私の持っている参考書には載っていませんでした。なので適当な曲線を使って補間してみることにしました。

(x1,g1)、(x2,g2)の2点を通る補間曲線g(x)はf(x1)≠f(x2)を満たす任意の曲線f(x)を使って
g(x)=g1 + [{f(x)-f(x1)}/{f(x2)-f(x1)}](g2-g1)

のように求めることができます。

今回のプログラムでは具合の良さそうな曲線として以下の曲線を補間に使っています。
f(x) = [1+exp{0.28(x+100)}]/[1-exp{0.28(x+100)}]


M30、P=1.5のめねじで、1回目の切込みを0.3mmと場合の補間曲線g(x)のグラフは以下のようになります。
Screenshot077.png
あとはシコシコとプログラムを書くだけです。



ウィジット・ツリーと各ウィジットのプロパティ
《ウィジットツリー》
Screenshot078.png

《各ウィジットのプロパティ》
window1
タイトル→「ねじナビ」
幅→チェックを外す
高さ→350
シグナル→「destroy」
ハンドラ→「gtk_main_quit」
シグナル→「realize」
ハンドラ→「on_windown1_realize」

table
行数→4
列数→5

labelKei
ラベル→「呼び径:」
X方向に埋める→「いいえ」

entryKei
文字の幅→8(チェックを入れる)
X方向に広げる→「いいえ」
X方向に埋める→「いいえ」

labelPitch
ラベル→「ピッチ:」
X方向に埋める→「いいえ」

engryPitch
文字の幅→8(チェックを入れる)
X方向に広げる→「いいえ」
X方向に埋める→「いいえ」

labelKaisu
ラベル→「回数:」
X方向に埋める→「いいえ」

entryKaisu
テキスト→10
文字の幅→8(チェックを入れる)
X方向に広げる→「いいえ」
X方向に埋める→「いいえ」

labelKirikomi
ラベル→「初回切込量:」
X方向に埋める→「いいえ」

entryKirokomi
テキスト→0.3
文字の幅→8(チェックを入れる)
X方向に広げる→「いいえ」
X方向に埋める→「いいえ」

文字の幅→8(チェックを入れる)
X方向に広げる→「いいえ」
X方向に埋める→「いいえ」

comboboxType
アイテム→ 「メートルおねじ
メートルめねじ
ユニファイおねじ
ユニファイめねじ
ウィットおねじ
ウィットめねじ」

列の占有→2
Y方向に広げる→「いいえ」
X方向に埋める→「いいえ」
Y方向に埋める→「いいえ」

シグナル→「realize」
ハンドラ→「on_comboboxType_realize」(デフォルト)
シグナル→「changed」
ハンドラ→「on_comboboxType_changed」(デフォルト)

comboboxMemori
アイテム→ 「半径目盛
直径目盛」

列の占有→2
Y方向に広げる→「いいえ」
X方向に埋める→「いいえ」
Y方向に埋める→「いいえ」

シグナル→「realize」
ハンドラ→「on_comboboxMemori_realize」(デフォルト)
シグナル→「changed」
ハンドラ→「on_comboboxMemori_changed」(デフォルト)


buttonKeisan
ラベル→「計算する」
X方向に埋める→「いいえ」

シグナル→「clicked」
ハンドラ→「on_buttonKeisan_clicked」(デフォルト)

frameKekka
影→「In」

垂直パディング→4
列の占有→5

labelKekka
ラベル→「結果」

alignmentKekka
ウィジット名の変更のみ

scrolledwindowKekka
ウィジット名の変更のみ

scrolledwindowKekka
ウィジット名の変更のみ


callbacks.hとcallbacks.c
イベント処理を行っている部分です。
callbacks.h
callbacks.c
何も難しいことはしていません。ミソとしては、

  1. コンボボックスのデフォルト選択をするためにrealizeイベントを用いていること
  2. グローバル変数の初期化をするためにwindow1のrealizeイベントを用いていること

位でしょう。

あと今回のプログラムで利用したGtkおよびGlibの関数についてまとめてみました。
[他ウィジットの参照]
GtkWidget* lookup_widget(GtkWidget *widget,
const gchar *widget_name)
(例)
GtkWidget *widget = lookup_widget(GTK_WIDGET(button),"entry");
"entry"という名前のウィジットを取得


[ウィジット間のキャスト]
GtkWidgetへのキャスト GTK_WIDGET(anyWidget)
GtkEntryへのキャスト GTK_ENTRY(anyWidget)
GtkLabelへのキャスト GTK_LABEL(anyWidget)
GtkButtonへのキャスト GTK_BUTTON(anyWidget)


[GtkEntryからの文字列の取得]
const gchar* gtk_entry_get_text(GtkEntry *entry);
(例)
gchar *text = gtk_entry_get_text(entry);


[GtkComboBoxのアイテムの選択]
void gtk_combo_box_set_active(GtkComboBox *combo_box,gint index_)
gint gtk_combo_box_get_active(GtkComboBox *combo_box);
(例)
3番目(0から数えれば4番目)のアイテムを選択
gtk_combo_box_set_active(combo,3);

現在選択されているアイテムの番号を取得する
gint selected = gtk_combo_box_get_active(combo);


[GtkLabelへの文字列の設定]
void gtk_label_set_text(GtkLabel *label, const gchar *str);
(例)
gtk_label_set_text(label,"ほげほげ");


[GtkTextViewへの文字列の設定」

GtkTextViewへ文字列を設定する場合には、2段階の操作が必要です。
GtkTextBuffer* gtk_text_view_get_buffer(GtkTextView *text_view);
void gtk_text_buffer_set_text(GtkTextBuffer *buffer,
const gchar *text,
gint len);
(例)
GtkTextBuffer *buffer = gtk_text_view_get_buffer(textview);
gtk_text_buffer_set_text(buffer,"ほげほげ",-1);



[文字列の分割]
gchar** g_strsplit (const gchar *string,
const gchar *delimiter,
gint max_tokens);
(例)
gchar **array = g_strsplit("2048/3/18,"/",4);
array[0]の値→"2048"
array[1]の値→"3"
array[2]の値→"18"
array[3]の値→NULL


[文字列から実数への変換]
gdouble g_strtod (const gchar *nptr,gchar **endptr);
(例)
gdouble num = g_strtod("3.1412",NULL);


[文字列への出力]
gchar* g_strdup_printf (const gchar *format, ...);
(例)
gint i=5;
gdouble x=1.41421356;
gchar s[]="hogehoge";
gchar *str = g_strdup_printf("i=%d\tx=%.3f\tstr=%s\n",i,x,s);
strの値→"i=5 x=1.414 str=hogehoge"




参考書

◎旋盤作業の実技 小林輝夫/水沢昭三 共著 理工学社
posted by knyakki at 11:35| Comment(1) | TrackBack(1) | プログラミング | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
失礼いたします
Posted by エロ at 2008年01月25日 23:49
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/58368790

この記事へのトラックバック

北海道 - 直あど交換所
Excerpt: 地域別お相手検索機能で直あど交換!
Weblog: 北海道 - 直あど交換所
Tracked: 2014-03-06 09:04
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。