ツール番号の置換

先日、ある相談を受けました。工作機械に使用する加工プログラムで、ツール番号(以降「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

f:id:Infoment:20180727062614p:plain

今回は、かなり変則的なことをしている自覚があるので、詳しく解説します。

(1)変更前のT番号で、文字列を分割します(Split関数)

        seq_origin = Split(expression_code, find_tool_number) '…(1)

f:id:Infoment:20180727063749p:plain

(2)変更後文字列作成用の配列について、箱の数を2倍にします。

        ReDim seq_replace(UBound(seq_origin) * 2 )            '…(2)

f:id:Infoment:20180727064809p:plain

(3)先ほど分割した文字を、一つ置きにseq_replaceに格納します。

        For i = 0 To UBound(seq_origin)
            seq_replace(i * 2) = seq_origin(i)                '…(3)
        Next

f:id:Infoment:20180727065657p:plain

(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

f:id:Infoment:20180727070343p:plain

(5)配列を結合して、戻り値とします。

        ReplaceToolNumber = Join(seq_replace, "")            ' …(5)


やれやれ、これで何とかなりそうだ。
「こんな感じでどうです?」
「お~!!!・・・あれ?」
「え?」

・・・次回に続く(かもしれない)。

参考まで。