カスタム関数

新しいカスタム関数を追加することにより、MotionSolve関数のセットを拡張することが可能です。

例えば、以下のとおり、2つのベクトルの特別なスカラー(ドット)積を計算するために、2つの新しい関数を定義できます:
DOT1
(i_marker_id, i_axis_idx, j_marker_id, j_axis_idx)
マーカーJの単位軸と、別のマーカーIの単位軸との内積。例えば、
DOT1(I,1,J,3)=UVX(I)*UVZ(J)
DOT2
(i_marker_id, j_marker_id, j_axis_idx)
マーカーJの1つの軸に沿った単位ベクトルとマーカーJからIへの単位ベクトルとのドット積。例えば、
DOT2(I, J,3)=DXYZ(I,J)*UVZ(J)

この方法で定義されたカスタム関数は、予め定義されているMotionSolve関数と全く同じように使用されます。 例えば、カスタム関数は、ユーザーサブルーチン内からのSYSFNCコールおよびCUSFNCコールと同様に式内で使用できます。

予め定義されているMotionSolve関数とカスタム関数が同じ名前を持つ場合、カスタム関数の方が優先されます。カスタム関数は、予め定義されている関数を無効にします。

カスタム関数の作成

  1. マッピングファイルを編集します。
    カスタム関数を宣言するマッピングファイルへのエントリは、下記のように作成されます:


    図 1. マッピングファイルを編集してカスタム関数を宣言
    CustomFunction要素のための一般的なシンタックスは:
    <CustomFunction
      SYMBOL              = "string"
      USRSUB_DLL_NAME     = "valid path name"
      USRSUB_FNC_NAME     = "valid function name"
      NUM_PARAM           = "integer"
    />
    属性
    詳細
    SYMBOL
    カスタム関数を特定するために使用されるシンボルを指定します。このシンボルは、関数にアクセスするMotionSolve XMLで使用します。
    USRSUB_DLL_NAME
    ユーザーサブルーチンを含むDLLまたは共有ライブラリのパスと名前を指定します。MotionSolveはこの情報を使用して、実行時にDLL内のユーザーサブルーチンを読み込みます。
    USRSUB_FNC_NAME
    現在の目的のためにソルバーにより使用されるDLL内の関数を指定します。
    NUM_PARAM
    計算実行のための入力としてカスタム関数が取るパラメータの数を指定します。
  2. マッピングファイルへのパスを定義します。
    1. 下に示すとおり、環境変数Variable name: MS_CUSTOM_MAPPING_FILE を、マッピングファイルを指すように修正します。


      図 2.
  3. 環境変数を設定します。
    1. 下に示すように、VARSUBライクなユーザーサブルーチンを作成し、DLLを構築します:


      図 3. ユーザーサブルーチンとDLL


      図 4.
この時点から、DOT1およびDOT2カスタム関数は、予め定義されているMotionSolve関数と同様にモデル内に使用できます。例えば、下の図に示す例では、一般的な拘束要素を定義するためのDOT1関数の使用を示しています。この拘束は、I マーカー(i_marker_id = 100)のx-軸(i_axis_idx = 1)と J マーカー(j_marker_id = 200)のy-軸(j_axis_idx = 2)の間の角は大きさは等しいが、I マーカーのy-軸と J マーカーのx-軸の間の角と逆であることを指定します。


図 5. XMLでのDOT1関数の使用
すべての引数が整数形式である場合、下に示すとおりSYSFNCを使用することができます:


図 6. 関数SYSFNCの使用
引数が整数と小数の混合である場合、CUSFNCを使用します:


図 7. 関数CUSFNCの使用