ラダーロジックを使用してプログラムを構築したことがある方なら(まだの方は、このリンクをご覧ください。理由が分かります。)、標準的にソフトウェアに付属する多数のファンクションブロックをご覧になったことがあるはずです。Rockwell AutomationのConnected Components Workbench(CCW)はその好例で、すぐに使えるプログラムには、数学、タイミング、比較、トリガ、論理、変換、その他いくつかのカテゴリがあり、それぞれに複数のファンクションブロックがあります。このように、さまざまなツールを自由に使うことができるのですから、これ以上何が必要なのでしょう。簡単に言えば、パーソナライズされた利便性です。
2つの変数の差を計算するプログラムを想像してください。1つのラングで、2つの変数を入力する減算関数ブロックを使用するだけで、その差分を第3の変数に移動させることができます。この場合、関数が単純で簡単なので、関数ブロックは必要ありません。さて、2つの変数の差を計算するプログラムの代わりに、変数 A、B、および C の2次式を計算するプログラムを作ることを想像してみてください。ここで、各変数は入力に応じて複数の値を持ちます。これを行うには、変数 A、B、およびCよりもはるかに多くの変数を作成することになり、すぐに2次式の1つのインスタンスでさえも、多くの関数ブロックで満たされた複数のラングを持つことになります。これにより、各変数がどのように次の変数に流れ込んでいくのかを読み解くのが難しく、指数関数的に複雑になっていくため、エラーが発生しやすくなります。
そこで、ユーザー定義関数ブロック(UDFB)の利点が発揮されます。前述のように2次式の各インスタンスごとにプログラムの長さ(と変数の数)を膨大に増やすのではなく、UDFBでは、関数のインスタンスを1つ作成し、それを1つの関数ブロックの中にインスタンス化することが可能です。これで、入力のバリエーションごとに、インスタンス化された2次式を伴うラングを持たせることで、プログラムをシンプルにすることができます。これでプログラムは、先ほどの単純な引き算の関数と同じように、すっきりとわかりやすいものになりました。さらに、UDFBを他のプログラム用に保存したり、ライブラリに追加して必要なときにいつでも使えるようにすることも可能です。
結局のところ、UDFBを作ることは、プログラムそのものを作ることと大差はありません。もし、そのプログラムが非常に特殊な目的のために作成され、二度と使用されることがないのであれば、UDFB化しても何の利益も得られない可能性が高いです。もし、既存の関数の組み合わせをプログラムの複数の箇所で使用したり、複数の異なるプログラムで使用したり、あるいは、プログラムを見る技術者のために高レベルのオペレーションを提示したい場合、ユーザー定義関数ブロックを作成して再利用すると、作成時間だけでなく、プログラムを読んだり変更する時間も節約することができます。