先日、ある相談を受けました。工作機械に使用する加工プログラムで、ツール番号(以降「T番号」)を簡単に置換できないか、というものです。
- ここでいう「ツール」とは、孔を明けたりネジを立てたり、面を削ったりする刃物を意味しています。
- 工作機械によっては、その機能でプログラムのT番号を変更できるものもあります。
例えば、このような感じです。
T番号を含む文字列:G43Z0T1M03S7000P1M66T11(PT1)
変更前T番号・・・「T1」
変更後T番号・・・「T5」
※加工プログラムは、テキストファイル形式で保存されています。
※上記はブログ用に編集されており、実際のプログラムとは異なります。
※G43は工具長補正、M03は主軸正転などの意味があります。
単純にT1をT5に置換すると、末尾のT11がT15に置き換わってしまいます。
T11はそのままに、T1だけをT5に置換する必要があるわけです。
そこで、様々なやり方があると思いますが、今回はこのようにしてみました。
Function ReplaceToolNumber(expression_code As String, _ find_tool_number As String, _ Replace_tool_number As String) As String Dim seq_origin As Variant seq_origin = Split(expression_code, find_tool_number) '…(1) Dim seq_replace As Variant ReDim seq_replace(UBound(seq_origin) * 2 ) '…(2) Dim i As Long For i = 0 To UBound(seq_origin) seq_replace(i * 2) = seq_origin(i) '…(3) Next For i = 1 To UBound(seq_replace) - 1 Step 2 '…(4) If IsNumeric(Left(seq_replace(i + 1), 1)) = False Then seq_replace(i) = Replace_tool_number Else seq_replace(i) = find_tool_number End If Next ReplaceToolNumber = Join(seq_replace, "") ' …(5) End Function
今回は、かなり変則的なことをしている自覚があるので、詳しく解説します。
(1)変更前のT番号で、文字列を分割します(Split関数)
seq_origin = Split(expression_code, find_tool_number) '…(1)
(2)変更後文字列作成用の配列について、箱の数を2倍にします。
ReDim seq_replace(UBound(seq_origin) * 2 ) '…(2)
(3)先ほど分割した文字を、一つ置きにseq_replaceに格納します。
For i = 0 To UBound(seq_origin) seq_replace(i * 2) = seq_origin(i) '…(3) Next
(4)残りの箱に、文字を格納します。
一つ後ろの文字の一文字目で判別。
数字なら、別のT番号と判断して、元のT番号を格納。
数字以外なら、置換対象と判断し、置換後のT番号を格納。
For i = 1 To UBound(seq_replace) - 1 Step 2 '…(4) If IsNumeric(Left(seq_replace(i + 1), 1)) = False Then seq_replace(i) = Replace_tool_number Else seq_replace(i) = find_tool_number End If Next
(5)配列を結合して、戻り値とします。
ReplaceToolNumber = Join(seq_replace, "") ' …(5)
やれやれ、これで何とかなりそうだ。
「こんな感じでどうです?」
「お~!!!・・・あれ?」
「え?」
・・・次回に続く(かもしれない)。
参考まで。