如何在Zemax与Matlab间通信

如何在Zemax与Matlab间通信

转自zemax

本文来源:http://www.maning115.com/zemax.html

转载请注明该地址,谢谢合作!



本文内容:
  • 如何在Zemax与MATLAB®间建立通信链接;
  • 如何在Matlab里使用Zemax DDE工具箱;
  • 常见问题及对策。

作者: Derek Griffith

出版日期: 2006.1.3


Zemax与MATLAB:强大的配对

Zemax具有内置的DDE( 动态数据交换Dynamic Data Exchange)服务器,因而允许其它的Windows ®应用程序和Zemax函数之间建立链接。如果你用譬如C++之类的编译语言编写DDE应用程序将会有点复杂。另一种较好的选择是使用像 Tcl, Python 或者 MATLAB之类的脚本语言。Matlab是个不错的选择,因为它不仅仅是一种脚本语言。Matlab为处理和可视化科学与工程数据提供了丰富的函数。Matlab工具箱将它的基础功能拓展到了一些更加专业领域和学科。

DDE是什么?

DDE是Windows提供的一种允许应用程序间相互通信的设施与协议。

DDE通信有一些模式,最简单的就是数据串间的交换。其中的一个应用程序必须设置自己为服务器。此场景中Zemax就是DDE服务器,因此你必须要启动Zemax。一旦你启动了Zemax,DDE服务器立即就绪并等待客户端链接和请求响应。此场景下Matlab就是客户端。

在Matlab中访问Zemax

如果你查阅Zemax手册的“Zemax扩展”章节中的“数据项目”部分,你将会看到许多你可以在Matlab中发送到Zemax中的请求字符串命令(或者其它的DDE客户端)。手册中也记录了Zemax将会返回给客户端的回复信息。这些请求可能是让Zemax运行一个特定的函数或计算或简单的发送当前存储在Zemax DDE服务器端上的透镜数据。

有一点需要注意。Zemax总包含一份从DDE服务器端内存的拷贝透镜数据,因此在Zwmax的LDE的用户可以使用。这是非常不错的。因为你不希望一些DDE客户端意外进入并改变你的透镜数据。 有一些函数之间把LDE中的透镜数据复制给DDE服务器端或是反过来。PushLens项指导Zemax来把Zemax DDE服务器端中的透镜数据复制到LDE中,GetRefresh项将会把LDE中的透镜数据复制到DDE服务器端。 当你在MATLAB中开发你的应用时,追踪你的数据并注意你自己如何使用PushLens和GetRefresh项是非常重要的。

从Zemax首选项对话框里,你应该控制哪个扩展(此场景下是MATLAB)被允许让Zemax把透镜数据从DDE服务器端发送到LDE中去。选择位于首选项对话框里的编辑标签,找到 "Allow Extensions to Push Lenses".

如何在Zemax与Matlab间通信_第1张图片

MATLAB有一些基本函数来执行DDE客户端操作。 他们包括如下.

ddeinit - 这个函数用来初始化DDE对话。

ddereq - 用来从DDE服务器端请求数据。

ddeterm - 结束DDE链接。

从MATLAB访问Zemax的基本顺序是

1) 启动Matlab和Zemax;

2) 在MATLAB中使用ddeinit函数初始化DDE链接;

3) 使用ddereq函数发送和获得来自Zemax的响应;

4)使用ddterm函数结束链接。

ddereq函数是以文本模式使用的,就是说,你发送到Zemax的数据和接收到的数据都是字符串格式的。为了把字符串变成在MATLAB更有用的对象类型,你应该使用sscanf函数或者其它函数进行字符串数据转换,例如:str2num。


Matlab的Zemax DDE工具箱

你可以通过下载 Zemax DDE toolbox来减轻你的工作。这个工具箱是GPL下的开放资源,并实现了Zemax手册里Zemax扩展中记录的每一个数据项目功能的MATKAB函数。 工具箱中相应的MATLAB函数和数据项目有相同的名字,但是加了前缀"z"。为了开始使用,执行下面的步骤。
  1. 下载工具箱文件 (.zip 文件);
  2. 解压文件到你的磁盘里的一个命名为MZDDE的子文件夹里;
  3. 启动Zemax 和 MATLAB;
  4. 把MZDDE目录添加懂啊你的MATLAV路径中以使MATLAB找到这些新函数(执行“文件菜单>>选择设置路径...);
  5. 如果你在MATLAB提示下键入help mzdde,你应该会得到一列关于工具箱中的所有函数和每个函数的简要描述。如果是这样骂你就可以去使用这个工具箱了;
  6. 使用函数zDDEInit去打开DDE链接。这一步至关重要。如果你在尝试执行这个工具箱中的其它调用之前未这样做,MATLAB将会返回一个冗长的错误信息以表明一些麻烦已经发生了骂你应该联系你的MathWorks技术支持人员。如果这个发生,直接忽略,然后调用zDDEInit;
  7. 需要的话可以调用工具箱中的其它函数。如果你需要和Zemax用户接口联系的话,使用zPushLens和zGetRefresh是明智的。当然,你可以从MATLAB命令行里调用这些函数,或者把他们直接加入到你的MATLAB函数和脚本里;.
  8. 通过调用zDDEClose来结束。在大多数情况下这一步并不重要,你可以直接结束MATLAB和Zemax而不用关闭DDE链接。

注意为了可读性,工具箱中的函数名字是大写的。MATLAB函数名字在Windows下对大小写不敏感,也就是说zddeinit与zDDEInint的效果是等价的。在MATLAB命令行里这是很方便的,但是大写可以帮助提供喊和脚本的可读性。 所有函数的源码都是可修改和重复使用的,你可以检查源码来分析基本的MATLAB DDE调用是如何工作的。

超时

每一个被MATLAB调用的到Zemax的DDE受限于一个超时限制。在zDDEInint函数里默认设置为3秒。也就是说,如果Zemax在3秒内未响应DDE请求,MATLAB的调用将会一无所获。如果你调用Zemax去做一些费时的计算,你需要增加超时限制。可以调用zSetTimeout函数来实现。

举例

这是一个和Zemax交换的简单例子,在MATLAB里的提示。像平常一样启动Zemax,在MATLAB里键入下面的命令。

>> zddeinit

ans =

     0

>> zLoadFile('C:/Zemax/Samples/Sequential/Objectives/Cooke 40 degree field.zmx')

ans =

     0

>> zpushlens(1)

ans =

     0

>> [x, y] = SpiralSpot(0.4, 0, 1, 10, 10000);

>> plot(x,y)

你将会得到像这样的一张图:

如何在Zemax与Matlab间通信_第2张图片

首先DDE链接初始化,结果0表示成功,然后zLoadFile函数要求Zwmax把透镜数据装入DDE服务器端。现在,展现点列图的一种更好的方式是追踪通过透镜入瞳的螺旋光线,在像平面画出光线截面。这是一个叫SpiralSpot的工具箱函数实现的。在MATLAB提示里键入help spiralspot来获得该函数的帮助。因为SpiralSpot首先使用在GetRefresh来开始对LDE中的透镜数据产生效果,因此在调用SpiralSpot之前必须先执行zPushLens为zPushLens完成执行特别设置了1秒的超时。

注意在本例中,如果你在Zemax文件菜单里加载相同的透镜数据,那么调用zLoadFile函数将会得到相同的结果。


追踪大量光线

标准的DDE文本模式调用在许多情形下是足够使用的,但是当客户端与服务器间惊喜大量数据交换是就显得力不从心了。当你需要追踪大量的光线时,这个问题就来了。.

创建一个包含所有被追踪的光线列表的数组,然后整个数组一次传给Zemax,而不是一次追踪一条光线。Zemax然后追踪所有的光线,并把整个数组返回给客户端。DDE中传递的并不是所有的数据,而仅仅是数组所在内存中的指针。这就消除了当大量光线追踪时DDE通信的瓶颈。

不幸的是,当初编写工具箱时,MATLAB不允许文本模式以外的DDE模式。为了避开这个问题,用mex(MATLAB可执行)格式写一些C语言是必要的。 生成.dll的就叫做zArrayTrace。

键入help zArrayTrace来获得更多关于大体积光线追踪的信息。查阅Zemax手册中的相应章节也是非常有用的。为了帮助设置zArrayTrace模式0的光线输入数据,叫做genRayDataMod()的函数很有用。

编译MATLAB编写的单机Zemax扩展

如果你有MATLAB编译器,编译你的用工具箱编写的MATLAB脚本到单机扩展以便可以从Zemax扩展菜单运行是可能的。当你尝试这样做的时候有一些陷阱必须避免。

首先,有一些MATLAB函数不能被编译,你必须为这些函数想一些办法(还好不是很多)。

其次,当你的单机扩展本应该在安装有MATLAB的机器上运行正常,但如果你的机器上未安装MATLAB运行时间库的话,它将不能运行。因此,你必须把你的扩展连同MATLAB运行时间库打包来确保它的可移植性。MathWorks的自解压文件mglinstaller,exe(通常在 C:/MATLAB/extern/lib/win32 或附近 )通过打包绝大部分运行时间库来使这更容易些。

最后一个陷阱是常规的MATLAB运行库不包含上面所涉及到的DDE函数代码。通过搜索你的MATLAB安装文件匹配dde*dll就可以发现这些.dll文件(通常在 C:/MATLAB/Toolbox/matlab/winfun或附近)。运行库,包括DDE库,必须安装在Windows搜索路径下。.

使用工具箱时需谨记

  1. 你启动Zemax和MATLAB后必须先调用zDDEInit;.

  2. 超时可能是个问题。必要时使用zSetTimeout增加DDE超时限制;.

  3. Zemax有两份透镜数据拷贝,一个在透镜数据编辑器中展示,另一个存储在DDE客户端中。你可以使用zPushLens和zGetRefrsh函数把数据从一端复制到另一端。zPushLens总需要提供一个已秒为单位的超时数据。.

  4. 你只有在通过勾选Zemax首选项参数对话框中的同意Zemax扩展有权推送镜头数据的复选框后方才可以使用zPushLens。.

你可能感兴趣的:(翻译)