コプトン光学設計(ロゴ)

レンズ設計・製作、技術・ノウハウ移転サポート

コプトン光学設計コプトン光学設計




設計者コラム

#007 ZEMAXマクロの作成(02)

さてZEMAXマクロ作成の第二回目です。
前回は単に焦点距離とFナンバーを返してくるごく簡単なマクロの作成を行いました。
マクロには前回説明のように、

①バッチ処理
②設計指標
③ソルブ

の三種類の使い方があります。私が知らないだけでもっと他にもあるかもしれませんが、、、。
今回は②の設計指標に使うマクロにトライします。
レンズ設計を行う場合、レンズの曲率半径や厚み、屈折率などを変数にして最適化を行います。この際にメリットファンクションに実現したいオペランドを記入していって目標値に近づけていくことは皆さんご存知のとおりです。
光線収差やMTFといった必要となる大抵のオペランドはあらかじめ用意されていますが、それぞれの会社で独自に使っている指標など用意されていないものもあるでしょう。
こういった場合、既存のオペランドを駆使してどうにかその指標に相当する数値をメリットファンクション上で計算して制御することになりますが、書きづらかったり、複数のプロジェクトで何回も同じことを書き直すのが面倒だったり、そもそも既存のオペランドで書けない場合もあります。

このような場合、マクロを作っておくと後で大変楽ですし設計が簡単になります。
今回はディストーションを例に取り、歪曲収差の入射画角ー像高の関係を設計者の望む形で制御するマクロを作ってみます。
作ったマクロを以下に掲載します。

====== ここから ======

# 像高分割数
fieldn = 10

# 焦点距離
getsystemdata 2
fl = vec2(7)

# 像面番号
surfn = nsur()

# 像高誤差和クリア
y_err = 0

for i,1,fieldn,1

# 入射画角
hy = i/10
raytrace 0, hy, 0, 0, pwav()
ang  = acos(rayn(0))
# 理想像高計算
y = fl * tang(ang)
# 実像高計算
y_real = rayy(surfn)
y_err = y_err + abso(y_real - y)

next

optreturn 0 = y_err
====== ここまで ======

像高分割数は軸上を除き、制御したい画角点数を書きます。
上の例では10点ですね。つまりディストーションのグラフを10分割して、それぞれの点で像高の制御をします。
for〜next文で回している箇所は、各分割点で現状の入射画角に対する像高を計算し、制御目標となる理想像高との差分を計算しています。
現状の像高を計算する前には焦点距離とか、入射画角の計算を行っています。
また各分割点での像高誤差の絶対値の総和を計算していますが、これは変数y_errが相当します。
上の例では理想像高を、 

Y = f・tan(θ)

という一般的な入射画角ー像高関係式で計算していますが、射影方式に従ってこの箇所は書き換えが必要です。
こうして各像高の誤差総和を求めた後、optreturnでその総和をメリットファンクションに返す設定をしています。
この場合、y_err がゼロになれば理想像高と現状の像高が等しくなったという意味になりますね。

このマクロ、というかメリットファンクションで使用するタイプのマクロには幾つかお約束があります。
まずファイル名ですが、

ZPL??.ZPL

というファイル名で保存してください。??の部分は任意の二けたの数字が入ります。
今回は ZPL50.ZPL という名前で保存しましょう。
保存場所は、 

C:¥Users¥”ユーザ名”¥Documents¥Zemax¥Macros

です。『ユーザ名』の箇所は環境に合わせて読み替えてください。
次にメリットファンクションエディタを開き、"ZPLM"というオペランドを書きます。
"Mac#" 設定パラメータには50と入力します。これは先ほどのファイル名 ZPL50.ZPL の50に対応しています。
50以外の数値をファイル名にした方はその数値を入力します。
"データ" 設定パラメータには0を入力します。
この状態でメリットファンクションの更新を行いますと、現在値にマクロ中の y_err の数値が自動的に入ってきますので、目標値をゼロにして制御すれば完了です。

以上、今回はちょっと難しかったかもしれませんがマニュアルを見ながらマクロを読んでいけば何をやっているか理解が深まると思います。
皆さんの事情に合わせて使ってみてください。