CNCの実験(ソフト編)                             2006.03.15(水)〜 /

著作者名: 中野 良知 作成開始: 2006.03.10(金) 更新 : 2006.03.15(水) GUIの項目を追加。NCコードの項目を追加。 : 2006.03.16(木) C# Tipsにグラフィックとカウンターの項目を追加。 : 2006.03.19(日) ステッピングモーター制御の項目を追加 : 最小移動量の項目を追加。 : 2006.03.22(水) レジストリへのデータ登録の項目と、 : レジストリからのデータ取得の項目を追加。 : 2006.04.13(木) 移動パルス数の組み換え項目を追加。 : 文字の検索の項目と文字列の取り出し項目を追加。 : 2006.04.19(水) 日時の取得とファイル名の取得の項目を追加。 : 2006.06.12(月) Z軸原点出し項目を追加。
概要 「CNCの実験」で作成したCNC Appの資料です。 開発言語は Visual C# 2005 Express Edition Beta2 を使用しました。 同言語の導入方法については、Visual C#の導入検討を参照してください。 DXFデータをNCコードに変換するAppの作成資料は、 DXF2NC作成ドキュメントをご覧下さい。 目次 1. NCコード 1.1. G00(早送り) 1.2. G01(切削送り) 1.3. G02(円弧補間CW) 1.4. G03(円弧補間CCW) 1.5. G90(絶対位置指令)・G91(増分値指令) 1.6. G92(ワーク座標系変更) 1.7. M03(主軸CW回転オン)・M04(主軸CCW回転オン) 1.8. M05(主軸回転停止) 1.9. M30(EOT(End Of Text)) 1.10. F(Feed。送り速度) 1.11. サブプログラム 1.12. R(円弧の半径) 1.13. I・J(中心の相対座標) 2. ファイルの読み込み 2.1. 字句解析 2.2. 意味解析 2.3. NCコード実行 3. ステッピングモーター制御 3.1. パルス出力 3.1.1. I/Oマップ 3.1.2. 出力データ 3.1.3. タイミングチャート例 3.1.4. パルス出力用変数 4. 位置制御 4.1. 最小移動量 4.2. 制御手順 4.3. 移動パルス数の計算 4.3.1. ステップパルス生成のブロック線図(X,Y,Z共通) 4.4. ステッピングモータ駆動 4.4.1. ステップパルスデータ 4.5. 仮想3軸関数 4.5.1. 移動パルス数の組み換え 4.6. 原点出し 4.6.1. Z軸原点出し 5. GUI 6. C# Tips 6.1. 数字を数値に変換 6.2. 数値を数字に変換 6.3. 絶対値 6.4. 四捨五入 6.5. メッセージボックス 6.6. グラフィック 6.7. カウンター 6.8. レジストリへデータを登録 6.9. レジストリからデータを取得 6.10. 文字の検索 6.11. 文字列の取り出し 6.12. 日時の取得 6.13. ファイル名の取得 7. 法律条項 1. NCコード Gコードとも呼ばれます。 今回作成したCNC App(Computer Numeric Control windows Application)は、以下の NCコードに対応しました。 G00 早送り G01 切削送り G02 円弧補間CW G03 円弧補間CCW G90 絶対位置指令 G91 増分値指令 G92 ワーク座標系変更 M03 主軸CW回転オン M04 主軸CCW回転オン M05 主軸回転停止 M30 EOT(End Of Text) M98 サブプログラムコール M99 サブプログラム終了 F Feed。送り速度 L サブプログラムコールループ数 O サブプログラムラベル(被コール側) P サブプログラムラベル(コール側) R 円弧半径 I 中心の相対座標(X方向) J 中心の相対座標(Y方向) 1.1. G00(早送り) ツールを目的の座標まで、高速に移動する指令です。 送り速度は、ステッピングモ ーターが脱調しない数値(mm/min)をGUI(後に記述)で設定します。 書式 内容 -------------------+--------------------------------------------------------- G00 X10 Y10 現在位置からX座標10mm、Y座標10mmへ高速で直線移動します。 X20 Y20 前回実行したNCコードがG00なら、現在位置からX座標20mm、Y 座標20mmへ高速で直線移動します。 1.2. G01(切削送り) 現在座標から目的の座標まで、直線で切削移動する指令です。 切削送り速度は、Fで 指定します。 書式 内容 -------------------+--------------------------------------------------------- G01 X10 Y10 F50 現在位置からX座標10mm、Y座標10mmまで直線で切削します。 切削の送り速度は、50mm/minです。 X20 Y20 前回実行したNCコードがG01なら、現在位置からX座標20mm、Y 座標20mmまで直線で切削します。 1.3. G02(円弧補間CW) 現在座標から目的の座標まで、時計回りで円弧を切削する指令です。 切削送り速度 は、Fで指定します。 書式 内容 -------------------+--------------------------------------------------------- G02 X10 Y10 R10 F50 現在位置からX座標10mm、Y座標10mmまで中心角が180以下の円 弧を時計回りで切削します。 切削の送り速度は、50mm/min です。 G02 X10 Y10 -R10 現在位置からX座標10mm、Y座標10mmまで中心角が180以上の円 弧を時計回りで切削します。 切削の送り速度は、前回切削に 使用した送り速度になります。 1.4. G03(円弧補間CCW) 現在座標から目的の座標まで、反時計回りで円弧を切削する指令です。 切削送り速 度は、Fで指定します。 書式 内容 -------------------+--------------------------------------------------------- G03 X10 Y10 R10 F50 現在位置からX座標10mm、Y座標10mmまで中心角が180以下の円 弧を反時計回りで切削します。 切削の送り速度は、50mm/min です。 G03 X10 Y10 -R10 現在位置からX座標10mm、Y座標10mmまで中心角が180以上の円 弧を反時計回りで切削します。 切削の送り速度は、前回切 削に使用した送り速度になります。 1.5. G90(絶対位置指令)・G91(増分値指令) G91は、X、Y、Zに続く数字が増分値であることを指令します。 G90で増分値指令(インクリメンタル指令)を絶対値指令に戻します。 書式 内容 -------------------+--------------------------------------------------------- G91 G01 Z-0.2 増分-0.2mmで、Z方向に切込みます。 G91 絶対値制御に変更します。 サブプログラムと併用すると、コードが簡潔になります。 下記は、半径5mmの円を仕上り深さ2mmまで0.2mmづつ10回に分けて切込みます。 現在位置は原点(X=0、Y=0、Z=0)にあるとします。 (ワーク面より1mmツールを上昇) G00 Z1 (座標10,0へ移動) G00 X10 (ワーク面までツールを下げる) G00 Z0 (サブプログラムを10回コール) M98 P10 L10 (終了) M30 (半径5mmの円をZ方向に増分値0.2mmで切削するサブルーチン) O10 (ツールを0.2mm(増分値)下げる) G91 G01 Z-0.2 (絶対値指令) G90 (半径5mmの円を切削) G02 X10 Y0 I0 J5 (サブルーチン終了) M99 1.6. G92(ワーク座標系変更) 現在座標を指定値に変更します。 書式 内容 -------------------+--------------------------------------------------------- G92 X0 Y0 Z0 現在がX座標10mm、Y座標10mm、Z座標2mmとすると、この指令で 座標がX座標0mm、Y座標0mm、Z座標0mmになります。 CNC Appでは、現在座標の変更と、ステップパルス数の累計値も変更します。 使用例: ワーク表面をZの原点にする場合、ツールをワークに当てると傷が付きます。 そこで厚みの分かっている紙などでツールの刃先を受け、G92 Z0.12を実行すればワ ーク表面がZの原点0になります。 (上記は紙の厚み0.12mmを想定) 1.7. M03(主軸CW回転オン)・M04(主軸CCW回転オン) 以下のメッセージボックスを表示し、テーブル及びツールの移動を停止します。 「OK」釦を左クリックすると表示が消え、次のNCコードを実行します。 1.8. M05(主軸回転停止) 以下のメッセージボックスを表示し、テーブル及びツールの移動を停止します。 「OK」釦を左クリックすると表示が消え、次のNCコードを実行します。 1.9. M30(EOT(End Of Text)) NCコードの終了を表し、サブプログラムがない場合はこれ以降の記述は無視します。 サブプログラムはこのNCコード以降に記述します。 書式 内容 -------------------+--------------------------------------------------------- M30 NCコードの実行終了。 1.10. F(Feed。送り速度) 切削中のツールの移動速度です。単位はmm/minです。 書式 内容 -------------------+--------------------------------------------------------- G01 X10 Y10 F50 現在位置からX座標10mm、Y座標10mmへ切削速度50[mm/min]で 移動します。 1.11. サブプログラム サブプログラムはNCコードの M98、M99、 L、O、Pを組み合わせて使用します。 書式 内容 -------------------+--------------------------------------------------------- M98 P10 L10 サブプログラム10を10回実行します。 M98でサブプルグラムの使用を指令します。 Pに続けてサブプログラムの名前を記述します。 Lに続けてサブプログラムの実行回数を記述します。 O10 サブプログラムの先頭につける名前。 ... OとM99の間にサブプログラムを記述します M99 サブプログラムの終了。 記述例1: 現在位置は原点(X=0、Y=0、Z=0)にあるとします。 (ワーク面より1mmツールを上昇) G00 Z1 (座標10,0へ移動) G00 X10 (ワーク面までツールを下げる) G00 Z0 (サブプログラムを10回コール) M98 P10 L10 (終了) M30 (半径5mmの円をZ方向に増分値0.2mmで切削するサブルーチン) O10 (ツールを0.2mm(増分値)下げる) G91 G01 Z-0.2 (絶対値指令) G90 (半径5mmの円を切削) G02 X10 Y0 I0 J5 (サブルーチン終了) M99 記述例2: サブプログラムを多重化して円形の平面切削を行います。 外周を0.2mm掘り下げ、同じ深さで中心に向かって同心円で切削します。 10回繰返して仕上り深さが2mmの円形のプール状になります。 ここクリックするとNCコードリストを表示します。 1.12. R(円弧の半径) 円弧切削時の半径を指定します。 書式 内容 -------------------+--------------------------------------------------------- G02 X10 Y10 R5 F50 現在位置を始点として、終点がX座標10mm、Y座標10mmで半径 が5mm、中心各が180度以下の円弧を切削します。 G02 X10 Y10 -R5 現在位置を始点として、終点がX座標10mm、Y座標10mmで半径 が5mm、中心各が180度以上の円弧を切削します。 1.13. I・J(中心の相対座標) 円又は円弧の中心を表す座標で、現在位置からの相対座標で表します。 Iに続く数値がX方向の相対位置で、Jに続く数値がY方向の相対位置です。 書式 内容 -------------------+--------------------------------------------------------- G02 X10 Y10 I0 J5 現在位置を始点として、終点がX座標10mm、Y座標10mmで 中心座標はXが現在と同じで、Yが現在より+5mmの座標です。 現在位置がX座標10mm、Y座標10mmで円になります。 2. ファイルの読み込み NCコードが書かれたファイルは、全ての行(ソースコード)をCNC App内部の文字列配 列に代入します。 これにより、サブプログラムを実行する際にNCコードの行を任意 に選択しやすくなります。 2.1. 字句解析 ソースコードが入っている文字列配列から1行づつ読み出し、字句に分割します。 G01 X10 Y10 F50 は、jiku[]配列に下記の様に格納します。 ┏━━━━━━┓ ┃G01 ┃ ┣━━━━━━┫ ┃X10 ┃ ┣━━━━━━┫ ┃Y10 ┃ ┣━━━━━━┫ ┃F50 ┃ ┗━━━━━━┛ 2.2. 意味解析 jiku[]配列の内容の意味を解析します。 ┏━━━━━━┓ ┃G01 ┃ → "G01"で g01()関数をコールします。 ┣━━━━━━┫ ┃X10 ┃ → X座標用の変数に"10"を数値に変換して代入します。 ┣━━━━━━┫ ┃Y10 ┃ → Y座標用の変数に"10"を数値に変換して代入します。 ┣━━━━━━┫ ┃F50 ┃ → 送り速度用の変数に"50"を数値に変換して代入します。 ┗━━━━━━┛ 2.3. NCコード実行 g00()、g01()、G02()などの各コードに対応した関数をコールします。 各関数では、意味解析で用意したX、Y、Z座標用の変数やF値用の変数などを参照し、 テーブルやツールの移動に必要なステップパルス数を求め、さらにステッピングモー ターを回転させるための出力データを作成し、モータードライブへ出力します。 3. ステッピングモーター制御 ステッピングモーターを回転させる為の駆動パルスを制御します。 1−2相駆動方式の採用で最小送り量が1相式の1/2になり、より微細な加工を可能 にします 1−2相駆動方式の駆動原理については、「ステッピングモータの制御」をご覧下さい。 3.1. パルス出力 1つのステッピングモータを回転させる為に4つのパルス出力を使用し、X、Y、Z合 計で12ポートの出力になります。 3.1.1. I/Oマップ EZ-USB 軸 名称 ポート ----+------+--------------- X A B-0 -A B-1 B B-2 -B B-3 Y A B-4 -A B-5 B B-6 -B B-7 Z A C-0 -A C-1 B C-2 -B C-3 3.1.2. 出力データ バイト型の配列にポート出力データをステップ順に用意します。 byte[] pulse = new byte[] { 1, 1 + 4, 4, 4 + 2, 2, 2 + 8, 8, 8 + 1 }; X軸用モータードライバーに、配列の添え字番号を昇順にデータを出力すると、テー ブルが左に移動し、降順にデータを出力すると右へ移動します。 Y軸用は、配列の要素を4ビット左へ論理シフトしX軸用のデータを合成して出力しま す。 3.1.3. タイミングチャート例 ┌─────┐ ┌─────┐ A(1) ┘ └─────────┘ └───── ┌─────┐ ┌─────┐ B(4) ────┘ └─────────┘ └─ ┌─────┐ ┌─── -A(2) ────────┘ └─────────┘ ──┐ ┌─────┐ -C(8) └─────────┘ └───────── ()内は、ポートの重み付けです。 3.1.4. パルス出力用変数 ステップパルスを出力する為の制御用変数です 名称 用途 ------------------------+---------------------------------------------------- public int x_pulse_num X軸ドライブパルスNo。配列の添え字番号 public int y_pulse_num Y軸ドライブパルスNo。配列の添え字番号 public int z_pulse_num Z軸ドライブパルスNo。配列の添え字番号 public byte x_out X軸出力ポートデータ保存 public byte y_out Y軸出力ポートデータ保存 public byte z_out Z軸出力ポートデータ保存 public byte a_out A軸出力ポートデータ保存 X,Y,Z_pulse_numは、0から7までを循環します。ステッピングモーターの回転方向に より、1ステップ毎にインクリメント又はデクリメントし、ポート出力データ配列か らデータを取り出す為に使用します。 x,y,z_outは、各軸の出力データを保存します。 次回のステップがX軸のみの移動の 場合などでは、Y軸用のパルス出力が変化しないように、この変数のデータをY軸用と して出力します。 4. 位置制御 直線、円、円弧などの図形を切削するためにワークテーブルやスピンドルを指定した 位置へ移動させます。 4.1. 最小移動量 移動量の最小値は、ステッピングモーターの1回転に要するステップ数と送りネジの ピッチにより決まります。 最小移動量[mm/ステップ] = 送りネジのピッチ[mm/回転] ÷ 1回転に要するステップ数[ステップ/回転] 例: 1回転当りのステップ数 = 96[ステップ/回転] 送りネジのピッチ = 1[mm/回転] 最小移動量[mm/ステップ] = 1[mm/回転] ÷ 96[ステップ/回転] = 0.0104666[mm/ステップ] = 10.4666[μm/ステップ] 4.2. 制御手順 1) NCコードから移動方向と移動量を計算し、ステッピングモーターの駆動パルスデ ータに変換します。 2) ステッピングパルスデータを、指定した周期でUSB経由でEZ-USBマイコンに送りま す。 3) EZ-USBマイコンは送られてきたステッピングパルスデータをポートに出力します。 4) EZ-USBマイコンのポートに接続した、モータードライブ回路でステッピングモー ターを駆動します。 4.3. 移動パルス数の計算 移動に必要なパルス数は、 パルス数 = 移動距離 × 1回転当りのパルス数 ÷ 送りねじピッチ (割り算で小数点以下が切捨てられる為、掛け算を先に記述します。) 例: 移動距離=10[mm]。 送りねじピッチ0.998[mm/回転]。 1回転当りのパルス数=96[パルス/回転]。 パルス数 = 10mm × 96 ÷ 0.998 = 961.92[パルス] X、Y、Zの各軸の移動に必要なパルス数は下記の式で計算します。 原点から目標座標までのパルス数 −) パルス数の累計 ------------------------------------------------ = 移動パルス数 メカにバックラッシュが無ければこの値でステッピングモータを回転させます。 移動パルス数は移動方向により+又は−の値になります。 パルス数の累計は初期値は0で、求めた移動パルス数の総和です。 メカにバックラッシュがある場合は、移動パルス数にバックラッシュ量に相当する パルス数を加えます。 移動パルス数 +)バックラッシュ相当にパルス数 ------------------------------------------------ = ステップパルス数 4.3.1. ステップパルス生成のブロック線図(X,Y,Z共通) ┏━┓ ┏━┓ 原点から移動先座標迄のパルス数─→┨−┠─┬─┨+┠─→ステップパルス数出力 (計算値) ┗━┛ │ ┗┯┛ (移動方向により±) ↑ │ ↑ 移動パルス数の累計────────→┘ │ │ ↑ │ │ │┏━━━━━━━━━━━━━━━┓ │ │ └┨ステップパルス数出力後に加える┠←┘ │ ┗━━━━━━━━━━━━━━━┛ │ a │ S1 ○────────┤ バックラッシュ──────○── ┏━━━┓ │ ○──┨−1倍┠─┘ b ┗━━━┛ *S1は移動方向に変化があった時、移動方向によりa側又はb側に接続します。 *バックラッシュを含まないステップパルス数を累計し、次回のステップパルス生 成の時に使用します。 4.4. ステッピングモータ駆動 1-2相方式で駆動します。 1回転48ステップのステッピングモーターを、1回転96ステップで駆動でき、微小な位 置制御が可能です。 1-2相方式の詳細は、CNCの実験資料ページの「ステッピングモーターの制御」を参照 して下さい。 4.4.1. ステップパルスデータ 現在座標がX=0、Y=0で G01 X10 Y10 では、X軸とY軸は同時に1ステップづつ回転しま す。 X方向に10mmの移動では、10mm÷10.42μm=約960ステップが必要です。 960ステップ分のステッピングモーター制御信号をXとYについて作成します。 Zについては、変化のない制御信号を同時に作成し、X、Y、Zの各制御信号はステップ 毎にまとめておきます。 さらに、送り速度に関係するステップパルス幅を時間データも前述のX、Y、Zのステ ップパルス制御信号データ毎に組み合わせます。 1ステップ分のX、Y、Zそしてパルス幅時間データを4バイトで構成します。 データ順 内容 -------------+---------------------------------------------------------- 1バイト目 パルス幅(μsec)の下位1バイト 2バイト目 パルス幅(μsec)の上位1バイト 3バイト目 X軸駆動データ。 ポート出力下位4ビット(A相:2bit,B相:2bit) Y軸駆動データ。 ポート出力上位4ビット(A相:2bit,B相:2bit) 4バイト目 Z軸駆動データ。 ポート出力下位4ビット(A相:2bit,B相:2bit) A軸駆動データ。 ポート出力上位4ビット(A相:2bit,B相:2bit) byte型の配列を4バイト毎のブロックに分け、1ブロックに1ステップ分のデータを 格納します。 NCコード1行分のパルスデータ │←───────────────────────── ─ ─ ──→│ 第1ブロック 第2ブロック 第3ブロック │←─────→│←─────→│←─────→│ ┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳ ━ ━ ━━━┓ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┃ ┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻ ━ ━ ━━━┛ ↑ ↑ ↑ ↑ └┬┘ │ └─ Z、Aポート出力データ │ └── X、Yポート出力データ └── パルス幅時間データ(μsec) 現在座標がX=0、Y=0で G01 X10 Y10 では、ブロックは約960個になります。 (構造体にしてもよいデータ構成です。) 4.5. 仮想3軸関数 ステップパルスデータの生成を、移動量の条件をひとつにした仮想の3軸関数で行い ます。 4.5.1. 移動パルス数の組み換え 実際のX、Y、Zの各軸の移動パルス数をpx、py、pzとし、仮想3軸関数内での移動パル ス数をvxp、vyp、vzpとします。 仮想3軸関数では、vxp >= vyp >= vzp の関係で処理をするため、 yp > xp >= zp の場合は、 vxp = py; vyp = xp; vzp = zp; というようにxp、ypのデータを組み換えて仮想3軸関数を実行します。 組み換えリスト データの組み換え 移動量の関係 vxp vyp vzp -----------------+-------+-------+-------- xp >= yp >= zp xp yp zp xp >= zp > yp xp zp yp yp > xp >= zp yp xp zp yp >= zp > xp yp zp xp yz > yp >= xp zp yp xp yz > xp > yp zp xp yp これにより、move_table関数にあった X、Y、Z の大小関係でそれぞれ使用していた6 つのルーチンが1つなり、変更前に800行以上あったプログラムが約400行にサイズダ ウンし、プログラムの見通しが良くなりました。 1) 仮想3軸関数は、仮想の3軸移動量データVX、VY、VZを使用します。 2) 仮想3軸関数は、VX >= XY >= VZ の条件でのみステップパルスデータを生成しま す。 従って、実際の各軸の移動量を、上記の条件を充たす為のアルゴリズムで 組み換えます。 3) バックラッシュやパルス出力に用いる諸々の制御パラメータも、同様のアルゴリズ ムで組み換えます。 4) 実際の各軸の移動量を引数にして、仮想3軸関数をコールします。 5) 仮想3軸関数の処理が終了すると、同関数の呼び出し前とは逆のアルゴリズムで 、モータ駆動データや制御パラメータを、実際の3軸系に組み換えます。 実3軸系(各軸の移動量、制御パラメータ) ↓ 仮想3軸系に組み換え ↓ ┏━━━━━━━━━┓ ┃ 仮想3軸関数 ┃───────────┐ ┗━━━━━━━━━┛ │ ↓ ↓ 制御パラメータ 実モータ駆動データに組み換え ↓ ↓ 実3軸系に組み換え EZ-USBマイコンへ出力 ↓ モータ駆動 4.6. 原点出し 4.6.1. Z軸原点出し Z軸を降下させて、ワークの表面にエンドミルの刃先が接触した位置をZ軸の原点にし ます。 ワークとエンドミルの刃先の接触は、電気的な導通により検出します。 EZ-USBマイコンのポートA5のディレクションを入力に設定し、ハイレベルからローレ ベルに入力が変化した位置をZ原点とします。 ポートマップ EZ-USB コネクター 名称 記号 ポート 端子No --------------+---------+----------+-------------- Z軸原点検出 XZ0_DET A5 A1 フローチャート (Z軸原点出しスタート) ↓ ├←─────────┐ ↓ Low │ < PORT-A5 入力 >→─────────┐ ↓ High │ │ Z軸降下(最小分解能で) │ │ ↓ │ │ └──────────┘ │ ↓ Z軸現在位置を0(原点)に設定 ↓ Z軸の原点からのパルス数を0に設定 ↓ 終了 5. GUI 左上のテキストボックスに G00 X10 Y10 とキー入力し[Enter]すると、テーブルを 移動させる事ができます。 X、Y、Zの軸設定値は、Appを終了するときにレジストリに書き込み、次回Appを実行 するとき終了時の値を復元します。 手動でテーブルやツールを移動させる事ができます。 移動量は自由に設定可能です。 主に原点の位置出しをする時に使用します。 注意: ハンドルを設けて原点の位置出しをすると、CNC Appの各軸の移動方向の記憶とハン ドル操作に依る移動方向が異なる場合があり、バックラッシュ補正が移動寸法精度に 影響する事があります。 ハンドルでは概ねの位置調整を行い、CNC Appの手動パネ ルの各釦で微小な調整を行うようにします。 6. C# Tips CNC Appを作成するときに用いた、C#の予約関数の使い方です。 6.1. 数字を数値に変換 double n = double.Parse("12345"); 変数nの値は12345になります。 6.2. 数値を数字に変換 string s = n.ToString(); 変数n=12345の時、変数sは文字列で"12345"になります。 6.3. 絶対値 double a = System.Math.Abs(-1); 変数aは1になります。 6.4. 四捨五入 double r = Math.Round(1.5); 変数rは2になります。 6.5. メッセージボックス MessageBox.Show("スピンドルを回転してください。"); 6.6. グラフィック 1) グラフィックイメージを使えるようにします。 pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 2) 直線を描きます。 Graphics g = Graphics.FromImage(pictureBox1.Image); // ハンドルの取得 Pen MyPen = new Pen(Color.Blue, 1); // ペンの生成 g.DrawLine(MyPen, x1, y1, x2, y2); // 線の描画 g.Dispose(); // ハンドルを廃棄 pictureBox1.Invalidate(); // 再描画 Application.DoEvents(); // OSに一時的に戻し画面に表示 3) グラフィックをクリアし、再描画に備えます。 pictureBox1.Image.Dispose(); // グラフィックイメージを廃棄 pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height); 4) ペンの色を変更します。 MyPen.Color = Color.WhiteSmoke; 6.7. カウンター ステップパルス幅を制御する為に、PC内臓のクロックカウンターを使用します。 1) dllを使用することを宣言します。 [DllImport("kernel32.dll")] 2) ステップパルス幅を制御します。 QueryPerformanceFrequency(ref freq); // カウンタ周波数の取得 QueryPerformanceCounter(ref count2); // カウンタ取り込み j = 0; for (k = 0; k < pulse_count; k++) { count1 = count2; // スタート点保存 // パルス幅の下位桁を取得。(単位[μs]) count3 = (long)drive_data[drive_data_no + j++]; // パルス幅の下位を取得し下位桁に加える。(単位[μs]) count3 += (long)(drive_data[drive_data_no + j++] << 8); // カウント値に換算。(単位[カウント]) count3 = count3 * freq / 1000000; // ステップパルスデータをEZ-USBマイコンへ出力 m = 0; buf[m++] = (byte)EzSub.EzByte.EZR_WRITE; buf[m++] = (byte)EzSub.EzByte._OUTB; buf[m++] = drive_data[j++]; buf[m++] = (byte)EzSub.EzByte.EZR_WRITE; buf[m++] = (byte)EzSub.EzByte._OUTC; buf[m++] = drive_data[j++]; usb.BulkWrite((int)EzSub.EzInt.RGIO_CPIPE, buf, m); // 遅延残り分を消化 while (true) { QueryPerformanceCounter(ref count2); // カウンタ取り込み if ((count2 - count1) > count3) break; // 遅延終了チェック } } 6.8. レジストリへデータを登録 Windowsのレジストリへ変数のデータを登録しておくと、次回のApp起動で同じデータ を変数に復元する事ができます。 // レジストリの検索 string sub_key = "SOFTWARE\\CNC\\SETTINGS"; RegistryKey reg_key = Registry.LocalMachine.OpenSubKey(sub_key); if (reg_key == null) { // レジストリに登録がなければ // SOFTWAREレジストリにCNCを作成する reg_key = Registry.LocalMachine.CreateSubKey(sub_key); // X_MAX_FEEDの項目に定数X_MAX_FEEDの値を登録する reg_key.SetValue("X_MAX_FEED", X_MAX_FEED); }else{ // レジストリに登録があれば reg_key.SetValue("X_MAX_FEED", X_MAX_FEED); } 6.9. レジストリからデータを取得 Windowsのレジストリからデータを取得し、前回Appの終了した時とデータを変数に復 元します。 // レジストリの検索 string sub_key = "SOFTWARE\\CNC\\SETTINGS"; RegistryKey reg_key = Registry.LocalMachine.OpenSubKey(sub_key); if (reg_key != null) { // レジストリに登録があれば if (reg_key.GetValue("X_MAX_FEED") != null) { // X_MAX_FEEDの項目があれば // 項目の値を取得して変数へ代入する x_max_feed = (int)reg_key.GetValue("X_MAX_FEED"); } } 6.10. 文字の検索 文字列中の文字の検索をします。 一致する文字があると文字列中の位置を返します。 string str = "N0010 M30"; if( str.IndexOf("M30") >= 0){ // NCコード終了 } 上記では 6 を返します。 文字列の先頭と一致する場合、str = "M30" では 0 を返します。 一致する文字がなければ、 0 未満(-1)を返します。 6.11. 文字列の取り出し 文字列の中の指定した位置から指定した個数の文字列を取得します。 string str = "G00 X0 Y0"; string s1, s2, s3; s1 = str.Substring(0, 1); s2 = str.Substring(1, 2); s3 = str.Substring(4, 1); s1には"G"、s2には"00"、s3には"X"、がそれぞれ代入されます。 6.12. 日時の取得 // 日時を取得します。 DateTime nowTime = DateTime.Now; // 文字列変数に代入します。 string str = "(" + nowTime + ")"; strの内容は、"(2006/04/19 20:16:00)" です。 (年月日時間は参考例) 6.13. ファイル名の取得 string file_name = "d:\\NTCAD\\DFX\\ベアリングホルダー.DXF"; // ファイルパスを取得し、文字列変数に代入します。 string str = "(" + System.IO.Path.GetFileName(file_name) + ")"; strの内容は、"(ベアリングホルダー.DXF)" です。 7. 法律条項 この資料により生じたいかなる障害や損害に対し、著者は全てを免責されるものとします。 この資料は、著作権法の下で保護され、入手先、著者、日付、法律条項を含んだ場合にのみ複製が可能です。 複製をする場合は著者まで連絡をお願いします。
ページのTopへ:2006.02.12〜 CNCの実験へ:2005.09.04〜2005.12.31
サイトのTopへ
inserted by FC2 system