zemax中如何和matlab中通信,如何在Zemax与Matlab间通信
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".
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"。为了开始使用,执行下面的步骤。
下载工具箱文件 (.zip 文件);
解压文件到你的磁盘里的一个命名为MZDDE的子文件夹里;
启动Zemax 和 MATLAB;
把MZDDE目录添加懂啊你的MATLAV路径中以使MATLAB找到这些新函数(执行“文件菜单>>选择设置路径...);
如果你在MATLAB提示下键入help mzdde,你应该会得到一列关于工具箱中的所有函数和每个函数的简要描述。如果是这样骂你就可以去使用这个工具箱了;
使用函数zDDEInit去打开DDE链接。这一步至关重要。如果你在尝试执行这个工具箱中的其它调用之前未这样做,MATLAB将会返回一个冗长的错误信息以表明一些麻烦已经发生了骂你应该联系你的MathWorks技术支持人员。如果这个发生,直接忽略,然后调用zDDEInit;
需要的话可以调用工具箱中的其它函数。如果你需要和Zemax用户接口联系的话,使用zPushLens和zGetRefresh是明智的。当然,你可以从MATLAB命令行里调用这些函数,或者把他们直接加入到你的MATLAB函数和脚本里;.
通过调用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)
你将会得到像这样的一张图:
首先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搜索路径下。.
使用工具箱时需谨记
你启动Zemax和MATLAB后必须先调用zDDEInit;.
超时可能是个问题。必要时使用zSetTimeout增加DDE超时限制;.
Zemax有两份透镜数据拷贝,一个在透镜数据编辑器中展示,另一个存储在DDE客户端中。你可以使用zPushLens和zGetRefrsh函数把数据从一端复制到另一端。zPushLens总需要提供一个已秒为单位的超时数据。.
你只有在通过勾选Zemax首选项参数对话框中的同意Zemax扩展有权推送镜头数据的复选框后方才可以使用zPushLens。.
zemax中如何和matlab中通信,如何在Zemax与Matlab间通信相关推荐
- android组建之间通信_Android各组件/控件间通信利器之EventBus
实际项目开发过程中,经常遇到如下场景:不同的应用程序组件的控件间具有一定的相互关联性,其中用户对后者进行的某种操作会引起前者的相应改变.举一个具体的场景:以糗事百科为例,在糗事列表页和详情页页,对于每 ...
- Python中的线程间通信
Python中的线程间通信 文章目录 Python中的线程间通信 1.Queue 2.同步机制 1.Event 2.Semaphore(信号量) 3.Lock(锁) 4.RLock(可重入锁) 5.C ...
- vue中组件间通信的6种方式
前言 组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互进行直接的引用,所以组件间的相互通信是非常重要的. 除了使用vuex外还有下面6种组件间 ...
- 微信小程序页面间通信的5种方式
微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...
- arouter跨module传递消息_利用ARouter实现组件间通信,解决子模块调用主模块问题...
一年之前我写过一篇组件间通信的博客Android模块间通信(不使用三方库),当时用的是反射,自己去维护一套"对应关系"(分别给每个模块命名,分别给每个类命名帮助反射找到对应的类), ...
- CAP-微服务间通信实践
微服务间通信常见的两种方式 由于微服务架构慢慢被更多人使用后,迎面而来的问题是如何做好微服务间通信的方案.我们先分析下目前最常用的两种服务间通信方案. gRPC(rpc远程调用) gRPC-微服务间通 ...
- 源码分析Android Handler是如何实现线程间通信的
源码分析Android Handler是如何实现线程间通信的 Handler作为Android消息通信的基础,它的使用是每一个开发者都必须掌握的.开发者从一开始就被告知必须在主线程中进行UI操作.但H ...
- python 线程通信 会涉及到拷贝吗_Python如何实现线程间通信
问题 你的程序中有多个线程,你需要在这些线程之间安全地交换信息或数据 解决方案 从一个线程向另一个线程发送数据最安全的方式可能就是使用 queue 库中的队列了.创建一个被多个线程共享的 Queue ...
- 如何使用 volatile, synchronized, final 进行线程间通信
2019独角兽企业重金招聘Python工程师标准>>> 你是否真正理解并会用volatile, synchronized, final进行线程间通信呢,如果你不能回答下面的几个问题, ...
- activity 点击后传递数据给fragment_ViewModel+LiveData实现Fragment间通信
在前面的文章中,我们已经知道,ViewModel能够将数据从Activity中剥离出来.只要Activity不被销毁,ViewModel会一直存在,并且独立于Activity的配置变化,即旋转屏幕导致 ...
最新文章
- 17.SpringMVC核心技术-拦截器
- C++_泛型编程与标准库(一)
- 两个月不到,我是如何从Python新手成长为谷歌认证TensorFlow开发者的?
- 如何挑选适合的前端框架(去哪儿网前端架构师司徒正美)
- 块级元素内联并列显示
- 电商课题I:集群环境下业务限流
- 架构杂谈《八》Docker 架构
- Vue项目部署,打包发布上线
- sqlserver实验心得体会_SQLServer数据库实训总结
- 2021年退休工资会不会涨?
- 作为刚開始学习的人应该怎样来学习FPGA
- dbf如何导入oracle_Oracle软件的安装介质被注入恶意程序事件分析与防御
- length属性,length()方法和size()的方法的区别
- php 横杠箭头,为什么我的箭头下面有一横线?
- 高职计算机网络基础说课,《计算机网络》说课课件.ppt
- 世界首富马斯克的编程水平怎么样?
- 如何快捷修改eclipse黑色背景和字体颜色设置?
- IT 最高,2018 年全国平均年薪!非私企 147,678¥
- MATLAB坐标区应用
- Exoplayer的缓存 二 下载服务DownloadService