如何在Zemax与Matlab间通信
转自zemax
本文来源:http://www.maning115.com/zemax.html
转载请注明该地址,谢谢合作!
- 如何在Zemax与MATLAB®间建立通信链接;
- 如何在Matlab里使用Zemax DDE工具箱;
- 常见问题及对策。
作者: Derek Griffith
出版日期: 2006.1.3
转自zemax
作者: Derek Griffith
出版日期: 2006.1.3
文章:
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".
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函数名字在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)
你将会得到像这样的一张图:
首先DDE链接初始化,结果0表示成功,然后zLoadFile函数要求Zwmax把透镜数据装入DDE服务器端。现在,展现点列图的一种更好的方式是追踪通过透镜入瞳的螺旋光线,在像平面画出光线截面。这是一个叫SpiralSpot的工具箱函数实现的。在MATLAB提示里键入help spiralspot来获得该函数的帮助。因为SpiralSpot首先使用在GetRefresh来开始对LDE中的透镜数据产生效果,因此在调用SpiralSpot之前必须先执行zPushLens为zPushLens完成执行特别设置了1秒的超时。
注意在本例中,如果你在Zemax文件菜单里加载相同的透镜数据,那么调用zLoadFile函数将会得到相同的结果。
键入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搜索路径下。.
使用工具箱时需谨记