ZEMAX | 編程語言 (ZPL) 簡介

用戶可以使用Zemax編程語言 (Zemax Programming LanguageZPL) 在OpticStudio中編寫自己的程序。這些程序可以實現(xiàn):

  • 自動重復(fù)鍵盤和鼠標(biāo)的操作

  • 基于OpticStudio的數(shù)據(jù)進(jìn)行計算

  • 以特定格式輸出數(shù)據(jù)

  • 以圖表或表格的形式生成數(shù)據(jù)

以及很多其它的功能!

創(chuàng)建ZPL宏程序非常簡單。本文概述了ZPL的主要功能、變量示例,描述了ZPL中重要的函數(shù)和關(guān)鍵詞。

作者 Dan Hill, updated by Alessandra Croce

簡介

ZPL是不區(qū)分大小寫的“宏”或“腳本”語言,并且是擴展OpticStudio計算范圍的最簡單方法。它是根據(jù)BASIC建模的,并且是一種解釋型語言。這意味著編寫ZPL宏非常容易,但是這也意味著進(jìn)行復(fù)雜計算時,其執(zhí)行速度要比完全編譯的代碼慢。

ZPL腳本可以調(diào)用OpticStudio中已編譯的函數(shù)(關(guān)鍵字和操作數(shù)),并且在以下情況下很實用:

  • 當(dāng)您需要特殊格式的數(shù)據(jù)

  • 實現(xiàn)不在程序中的功能或計算,例如數(shù)據(jù)提取,導(dǎo)出或簡單繪圖

  • 在沒有適當(dāng)?shù)牟僮鲾?shù)時進(jìn)行優(yōu)化(創(chuàng)建自定義操作數(shù))

  • 創(chuàng)建自定義/復(fù)雜求解(創(chuàng)建自定義求解)

  • 自動重復(fù)鍵盤的操作

請注意,ZPL不能用于編輯用戶自定義表面或物體,若有需要,您可以使用DLL。

ZPL包含五個基本概念:變量 (variables)、運算符 (operations)、函數(shù) (functions)、關(guān)鍵詞 (keywords)  (comments)。以下將對這些概念進(jìn)行介紹,可以在OpticStudio幫助手冊的“編程 ( Programming) 選項卡> 關(guān)于ZPL(About the ZPL”部分查閱更多信息。

ZPL的目標(biāo)是為沒有太多編程經(jīng)驗的光學(xué)工程師提供強大的編程工具,該工具可以快速執(zhí)行,并且易于學(xué)習(xí)。OpticStudio還支持ZOS-API,這是API級別的接口,外部程序(例如Matlab或Python)可以通過ZOS-API訪問OpticStudio的功能。想要了解更多信息,請查看文章 " 什么是 ZOS-API ,作用是什么?" 。

賦值、變量和數(shù)組

基本的賦值語法為:

variable = expression

其中 “ = ” 意為“將值設(shè)為”。

變量可以是數(shù)值 (numeric) 字符串 (string),這取決于它們所包含的數(shù)據(jù)類型。表達(dá)式可以是確切值、其它變量或復(fù)雜的數(shù)學(xué)表達(dá)式/函數(shù)。只有數(shù)組變量需要在使用前聲明,因此例如 x = 7 無需提前聲明數(shù)字變量 x即可工作。如下有效賦值的示例:

x = 4
y = 3
z = x + y

字符串變量名稱中的最后一個字符必須帶有 $ 字符:

newstring$ = "Here is the new string"

變量始終保持為雙精度64位值。它們的名稱有一些必須遵守的限制。變量名稱不應(yīng):

  • 超過28個字符

  • 包含用作運算符的任何特殊字符 (*, !, <, &, 等)

  • 包含任何空格 (改為使用 “ _ ”)

  • 與關(guān)鍵字或函數(shù)相同

數(shù)組

ZPL還支持?jǐn)?shù)組(或向量)變量,有4個預(yù)定義的向量,分別稱為VEC1, VEC2, VEC3,VEC4, 主要由其他命令(例如GETPSFGETMTF, 等)使用,它們的大小由SETVECSIZE 關(guān)鍵字設(shè)置。

用戶自定義數(shù)組變量必須在使用前用DECLARE 關(guān)鍵字聲明。它們最多可以由4維構(gòu)成,并可以為雙精度或整數(shù)數(shù)據(jù)類型。必須使用RELEASE 關(guān)鍵字釋放分配給數(shù)組的內(nèi)存。

可以使用以下語法給用戶自定義數(shù)組賦值:

arrayname(index1, index2, …) = value

可以使用以下語法提取值:

value = arrayname(index1, index2, …)

關(guān)鍵字和函數(shù)

ZPL中的命令分為兩類:

  • 使用關(guān)鍵字可以在 OpticStudio 中執(zhí)行或更改某些內(nèi)容,例如:

    • RAYTRACE 通過系統(tǒng)追跡特定的光線

    • SETUNITS 設(shè)置系統(tǒng)單位

    • PRINT 打印一些內(nèi)容到屏幕或文件

  • 使用函數(shù)可以在 OpticStudio 中報告某些內(nèi)容,例如

    • y_height = RAYY(5), 報告表面5上的光線截距的Y坐標(biāo)

    • lens_units$ = $UNITS(), 報告系統(tǒng)的鏡頭單位

本文將給出關(guān)鍵字和函數(shù)的一些示例,這些示例涵蓋了OpticStudio中可用的整個光線追跡和物理光學(xué)計算范圍。請參閱OpticStudio幫助文件,以查看所有支持的函數(shù),關(guān)鍵字和常規(guī)ZPL功能。

關(guān)鍵字

關(guān)鍵字和函數(shù)是對OpticStudio中已編譯例程的調(diào)用,通常與功能區(qū) ( Ribbon Bar ) 中相關(guān)功能的工作原理非常相似。

RAYTRACE =>

ZEMAX | 編程語言 (ZPL) 簡介的圖1

LOADARCHIVE =>

ZEMAX | 編程語言 (ZPL) 簡介的圖2

 它們的執(zhí)行速度與內(nèi)部命令一樣快,而調(diào)用命令的消耗卻很小。因此,不要認(rèn)為ZPL太“慢”!但是請記住,宏中的顯式計算將被解釋執(zhí)行,因此與已編譯的程序相比速度較慢。如果宏內(nèi)部的計算速度很重要,請改用 ZOS-API.NET 。

關(guān)鍵字可以指導(dǎo)程序流程(IF或FOR語句),或運行光線追跡或調(diào)整透鏡參數(shù)等。例如,使OpticStudio將系統(tǒng)優(yōu)化10圈,可以發(fā)送以下命令:

OPTIMIZE 10

同樣,執(zhí)行此代碼與您按下“優(yōu)化( Optimize )”按鈕并在圖形用戶界面中選擇“ 10圈( 10 Cycles )”完全相同。

關(guān)鍵字和操作數(shù)

在Zemax早期,編寫了諸如GETMTF GETZERNIKE 之類的關(guān)鍵字以訪問相應(yīng)的分析功能。但是,隨著代碼庫的增加,這很快變得很單調(diào)。因此,通過其關(guān)聯(lián)的優(yōu)化操作數(shù)可以訪問大多數(shù)分析功能。這可以通過評價函數(shù)執(zhí)行,也可以直接使用 OPEV() or或 OPEW()數(shù)值函數(shù)從宏中調(diào)用操作數(shù)本身來執(zhí)行。有關(guān)更多詳細(xì)信息,請參見 "如何使用 OPEV 和 OPEW 獲取ZPL宏中任意優(yōu)化操作數(shù)的值" 。

函數(shù)

如前所述,函數(shù)與關(guān)鍵字不同,因為它們不執(zhí)行或更改文件中的任何內(nèi)容,而是使OpticStudio生成有關(guān)某些內(nèi)容的報告。ZPL支持多種函數(shù),包括數(shù)值和字符串。數(shù)值函數(shù)的示例是:

x = SQRT(y)y = ABSO(z*TANG(e*numpoints))pi = 4*ATAN(1)

相反,字符串函數(shù)以 $ 符號開頭,例如:

$DATE()$LENSNAME()surf3_glass$ = $GLASS(3)

與關(guān)鍵字不同,函數(shù)只能在賦值的右側(cè),或者在作為關(guān)鍵字參數(shù)的表達(dá)式中使用。某些函數(shù)(例如PWAV()(報告系統(tǒng)的主波長))返回的值與參數(shù)無關(guān),因此不需要提供該值。但是,仍然需要括號。

運算和邏輯運算符

ZPL支持基本的數(shù)值運算(加法,減法,除法,乘法)和字符串運算(加法)。兩種運算的示例如下:

Z = (X + 1)/(Y * 6)

R$ = "Hello " + "World"將字符串"Hello World"賦給變量R$

其他數(shù)值和字符串函數(shù),例如SINE(), SQRT(), $GETSTRING(), 等,可用于更復(fù)雜的運算。可以使用括號來自定義運算序列,否則默認(rèn)運算序列為:函數(shù)(例如SQRT()), 邏輯運算符(例如>), 乘法和除法,加法和減法。

ZPL還支持邏輯運算符,包括數(shù)值和字符串。這些可用于邏輯測試以及對多個表達(dá)式的比較。邏輯運算的結(jié)果為“(TRUE)”(任何非零值)或“(FALSE)”(零)。OpticStudio將零視為“”,將任何非零值視為“”。

數(shù)值邏輯運算符表格如下:

& (AND) > (GREATER THAN)
| (OR) < (LESS THAN)
^ (XOR) > = (GREATER or EQUAL)
! (NOT) < = (LESS or EQUAL)
= = (EQUAL) ! = (NOT EQUAL)

數(shù)值邏輯運算符的示例如下:

IF(A > 5) THEN PRINT "A is greater than 5"


字符串邏輯運算符的表格如下:

$ = = (EQUAL) $ > = (GREATER or EQUAL)
$ > (GREATER THAN) $ < = (LESS or EQUAL)
$ < (LESS THAN) $ ! = (NOT EQUAL)

字符串邏輯運算符示例如下:

IF (C$ $== B$) THEN PRINT "Strings are identical"

賦值與邏輯運算符

錯誤使用運算符 “=” 和邏輯運算符 “= = ”很常見。

例如,下圖中的宏:

ZEMAX | 編程語言 (ZPL) 簡介的圖3

在此宏中,“a = b”是賦值,讀取為“將變量a的值設(shè)置為等于變量b的值”。由于操作成功,所以O(shè)pticStudio將a的值設(shè)置為等于b,并返回“真”。因此,宏可寫為:

IF (TRUE)

PRINT "a equals b"

ELSE

PRINT "a does not equal b"

ENDIF

在這種情況下,OpticStudio會發(fā)現(xiàn)錯誤并返回:

Syntax error: Illegal assignment (a = b).


可以使用邏輯運算“a == b”來進(jìn)行正確的操作。


IF 與 FOR 條件循環(huán)

ZPL可以進(jìn)行IF與FOR的條件循環(huán)。

IF循環(huán)的語法如下:

IF (expression)

(commands)

ELSE

(commands)

ENDIF

IF (expression) THEN (single command)

IF循環(huán)通常與邏輯運算符一起用作表達(dá)式語句中的測試條件。例如:

IF (X < Y)

PRINT "X is less than Y"

ELSE

PRINT "X is greater than Y"

ENDIF

請注意,有一些要留給用戶來發(fā)現(xiàn)的錯誤,例如,如果x = y會怎樣?

FOR循環(huán)的語法如下:

FOR variable, start_value, stop_value, increment

(commands)

NEXT

例如:

FOR i, 1, 10, 1

PRINT i

NEXT

同時定義變量和起始值的以下語法也是有效的:

FOR i = 1, 10, 1

請注意,start_value和stop_value可以是顯式數(shù)字,也可以是任何計算結(jié)果為數(shù)字的變量或表達(dá)式。增量應(yīng)該是整數(shù),或者是任何取值為整數(shù)的變量或表達(dá)式。

調(diào)用宏和子例程

關(guān)鍵字 CALLMACRO 可以用一個宏(父級)調(diào)用另一個宏(子級)。數(shù)字和字符串緩沖區(qū)可以在父宏和子宏之間共享數(shù)據(jù)。示例宏“ Parent.ZPL”和“ Child.ZPL”都包含在OpticStudio安裝文件中,并在幫助文件的“編程 ( Programming ) 選項卡>關(guān)于ZPL ( About the ZPL ) >從宏中調(diào)用宏 ( Calling a Macro from within a Macro )”部分進(jìn)行了描述。

關(guān)鍵字GOSUB可以執(zhí)行跳轉(zhuǎn)到SUB指示的子例程。子例程完成執(zhí)行后,控制其值返回到GOSUB關(guān)鍵字之后的行。在整個宏中,可以多次調(diào)用子例程。請注意,它們是在同一個宏中定義的,與前述的分離的父/子宏的情況不同。有關(guān)子例程的更多信息,請參見OpticStudio幫助文件的“編程( Programming )選項卡>關(guān)于ZPL( About the ZPL >關(guān)鍵字( KEYWORDS ) > GOSUB,SUB,RETURN和END”部分。

RAYTRACE, RAYTRACEX 和相關(guān)功能

對于要在序列模式下使用的宏,最重要的關(guān)鍵字之一是RAYTRACE,它追跡給定波長的單條光線(由歸一化視場和光瞳坐標(biāo)確定)。關(guān)鍵字沒有其他作用,語法為:

RAYTRACE hx, hy, px, py, wave

例如:

RAYTRACE 0, 1, 0, 0, PWAV(),在主波長處追跡主光線。

然后,您可以使用后續(xù)函數(shù)提取任何相關(guān)的光線追跡數(shù)據(jù),例如:

  • RAYX(x), RAYY(x),和 RAYZ(x),返回表面 x 上的光線的X-,Y-和Z-坐標(biāo)

  • RAYL(x), RAYM(x),和 RAYN(x),返回表面x上的光線的方向余弦值

  • RANX(x), RANY(x),和 RANZ(x),返回光線擊中表面x處的表面法線余弦值

  • RAYT(x)返回光線到表面 x 的光路長度

  • OPDC() 返回光線相對于主光線的光程差

例如,以下代碼追跡波長2的邊緣光線。然后將像面上光線的Y坐標(biāo)截距提取并打印在屏幕上:

RAYTRACE 0, 0, 0, 1, 2

PRINT "The chief ray height is ", RAYY(NSUR())

函數(shù)RAYE()報告追跡光線時可能發(fā)生的任何錯誤:

  • 如果在光線追跡過程中未發(fā)生任何錯誤,則返回零。

  • 負(fù)值表示在該表面上發(fā)生了全內(nèi)反射,該表面序號數(shù)是返回值的絕對值

  • 正值表示光線錯過了返回的表面編號

檢查RAYE()是可選操作,但是,如果RAYE()不返回零,則上述數(shù)據(jù)提取函數(shù)可能會返回?zé)o效數(shù)據(jù)。

函數(shù)RAYV()可用于檢查光線是否存在漸暈,即是否被孔徑擋住了。該函數(shù)返回光線存在漸暈的表面編號;如果光線未發(fā)生漸暈,則返回零。請記住,如果光線照射到孔徑上,仍會被追跡,并且可以通過使用RAYV()測試是否發(fā)生漸暈來將其排除在計算之外。

RAYTRACEX關(guān)鍵字是RAYTRACE的實用擴展。它調(diào)用OpticStudio光線追跡例程,從任意表面起始追跡當(dāng)前系統(tǒng)中特定的光線。語法為:

RAYTRACEX x, y, z, l, m, n, surf, wave

如上所述,然后可以使用與RAYTRACE相同的后續(xù)功能提取有關(guān)光線追跡的數(shù)據(jù)。

ZPL 中的注釋

最后,您可以使用注釋來標(biāo)注ZPL宏是如何工作的。任何以“!”為起始的行,或任何“#”后輸入的字符都將作為注釋,這些內(nèi)容在執(zhí)行ZPL宏時被忽略。OpticStudio將僅執(zhí)行將這些組件包在一起的腳本。

例如,想像您需要優(yōu)化鏡頭,計算評價函數(shù)值,并將該值乘以5的對數(shù),相應(yīng)的ZPL如下所示:

ZEMAX | 編程語言 (ZPL) 簡介的圖4

執(zhí)行ZPL宏的速度非常快,并且ZPL是非常容易學(xué)習(xí)和使用的語言。為了幫助您入門,知識庫中有一些介紹Zemax編程語言某些功能的文章,并且OpticStudio下載文件中提供了許多示例。


相關(guān)閱讀 - 編程

ZEMAX | OpticStudio 的冷反射分析宏

ZEMAX | 如何用 ZOS-API 創(chuàng)建用戶自定義分析

ZEMAX | 在 Mathematica 中與 OpticStudio 交互

ZEMAX | 旋轉(zhuǎn)對稱不規(guī)則性(RSI)簡介

ZEMAX | ZOS-API、ZPL 和 DLL 之間的區(qū)別

ZEMAX  | 如何使用 ZOS-API 創(chuàng)建飛行時間自定義分析

ZEMAX | 如何使用 ZPL 創(chuàng)建用戶自定義求解



歡迎掃碼添加宇熠工作人員微信,

進(jìn)入 zemax 微信交流群。

一起來學(xué)習(xí)光學(xué)設(shè)計吧!

ZEMAX | 編程語言 (ZPL) 簡介的圖5

掃碼邀您入群


如果您對產(chǎn)品感興趣,或需要技術(shù)支持,歡迎致電垂詢!

電話:027-87878386

郵箱:market@ueotek.com

關(guān)注武漢宇熠視頻號 查看更多精彩視頻 


ZEMAX | 編程語言 (ZPL) 簡介的圖6
ZEMAX | 編程語言 (ZPL) 簡介的圖7

武漢宇熠科技是 ZEMAX 中國區(qū)官方指定代理商,提供 ZEMAX 光學(xué)設(shè)計軟件的培訓(xùn)、銷售、技術(shù)支持、二次開發(fā)、解決方案及 ZEMAX 軟件相關(guān)全方位定制服務(wù)。有關(guān) ZEMAX ,您可以點擊文末“閱讀原文”了解更多信息,或致電垂詢武漢宇熠工作人員:

銷售熱線:027-87878386

咨詢郵箱:sales@ueotek.com

ZEMAX | 編程語言 (ZPL) 簡介的圖8
ZEMAX | 編程語言 (ZPL) 簡介的圖9


ZEMAX | 編程語言 (ZPL) 簡介的圖10

ZEMAX | 編程語言 (ZPL) 簡介的圖11


??點擊閱讀原文咨詢產(chǎn)品或技術(shù)支持。

登錄后免費查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項目客服
  • 培訓(xùn)客服
  • 平臺客服

TOP

1