如何在ZEMAX和MATLAB之间通信

本文内容:

1如何在MATLAB和ZEMAX中设置通信链接

2如何为MATLAB设置ZEMAX DDE

工具箱

3常见问题及解答

Zemax

and Matlab : 强大的配对

Zemax具有内置的DDE(动态数据交换)服务器,因而允许其他的windows程序和zemax函数之间建立链接。如果你用譬如C++之类的编程语言来编写一个zemax

DDE应用,那将是一件非常复杂的事情。另一种选择是选择一种脚本语言,比如说tcl,python和matlab。Matlab是不错的选择,因为它有大量的处理和可视化科学与工程数据的函数。Matlab也有工具箱在一些更加专业和学科性的领域来扩展它的能力。

那么,什么是DDE?

DDE是windows的一种协议来允许不同应用之间的通信。

DDE通信有一些模式,最简单的就是数据串之间的交换。两个应用中的一个必须把自己设置为服务器。Zemax此时就是服务器,所以你要做的事情就是打开zemax。你一旦启动了zemax,dde服务器就已经就绪并等待客户机来连接和请求服务。此时的客户机就是matlab。

从matlab连接到zemax

如果你查阅zemax手册中的“Zemax

Extensions”章中的The Data

Items部分,你会看到许多不同的你可以用matlab(或者其他的客户机)发送到zemax的请求命令。手册里还记录了zemax会返回给客户机的回复信息。这些请求可能是为了让zemax运行一个特别的函数或者计算,挥着仅仅是为了发送当前存储在zemax DDE服务器上的透镜数据。

有一点需要注明。Zemax总会将存在DDE服务器中的透镜数据复制一份给zemax的LDE用户。这个方法很不错,因为你不会希望一些DDE客户机未经预料的进入zemax并改变了你的透镜数据。有一些函数能直接把LDE中的透镜数据复制到DDE服务器中或者反过来也可。PushLens项指导zemax来把DDE服务器中的透镜数据复制给LDE,GetRefresh项会把LDE中的数据复制到DDE服务器中。当你在matlab中开发你的应用时,追踪你的数据并注意如何运用PushLens 和 GetRefresh是非常重要的。

从zemax的preferences对话框中,你能控制哪个扩展程序(此时是matlab)能让zemax把透镜数据从DDE服务器中发送到LDE中去。选择EDITORS标签,找到Allow Extensions

to Push Lenses复选框。见下图:

Matlab有一些基础函数来执行DDE客户机操作。他们包括:

ddeinit

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

ddereq

-用来从DDE服务器中请求数据

ddeterm

-结束DDE链接

基本的从matlab连接到zemax的顺序是:

1启动zemax和matlab

2使用ddeinit函数初始化DDE链接

3使用ddereq函数发送给zemax请求和接受其回复

4用ddeterm函数结束链接

Ddereq函数是以文本模式使用的,也就是说,你发送给zemax数据和接收到的回复都是字符串。为了把字符串变成更有用的类型(浮点型,双精度型,整型等),你要用到sscanf或其他函数来进行字符串变换,比如str2num函数。

你可以通过下载来减少一些努力。这个工具箱是GPL下的开放资源,并且实现了zemax手册中zemax

extensions记录的每一个数据项条目的功能。工具箱中相应的matlab函数有和数据项一样的名字,但是前缀是z。下面是开始的步骤:

1下载工具箱文件(zip文件)

2解压,并将解压后的文件放在磁盘上的任何位置,命名为MZDDE。

3启动zemax和matlab

4把MZDDE目录加入到matlab路径中以使matlab找到新函数(文件菜单>选择set

path)

5如果你在matlab中键入help

medde,你会得到一列关于所有工具箱中的函数和简短的描述的清单。如果是这样,那么你就可以使用工具箱

了。

6使用zDDEInit函数打开到zemax的DDE连接。这一步很重要,如果你在试图执行其他调用前不这么做,matlab会发布一个冗长的错误信息以表示一些麻烦已经发生了。你应该联系你的数学技术支持人员。如果有这样的提示的话,直接忽略,然后调用zDDEInit。

7需要的话可以调用工具箱中其他的函数。如果你要和zemax用户接口直接联系的话,使用zPushLens 和 zGetRefresh是非常明智的。当然,你也可以从matlab命令行来调用这些函数,或者把它们编入你的matlab函数和脚本里。

8调用zDDEClose来结束。在大多数情况下这一步并不重要,你也可以直接结束matlab和zemax。

注意到为了增加可读性,工具箱函数名是大写的。Matlab函数名在windows下对大小写不敏感,也就是说,zddeinit和zDDEInit效果是一样的。在matlab命令行中这是很方便的。但是大写可以提高函数和脚本的可读性。所有函数的源码都是可以修改和重复使用的,你也可以检查源码来观察基础的matlab DDE调用是如何工作的。

超时(TIMEOUTS)

Matlab的每一个到zemax的DDE调用都可能会超时。zDDEInit函数的默认设置超时时间是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函数要求zemax把透镜数据装入DDE服务器。现在,把点列图画出来的一种漂亮的方法是追踪通过透镜入瞳的螺旋光线然后把像平面的光线截面画出来。这通过工具箱函数SpiralSpot来实现。键入help

spiralspot来获取该函数的帮助。因为SpiralSpot首先使用zGetRefresh来开始对LDE中的透镜数据作用,所以在调用SpiralSpot之前必须先调用zPushLens。zPushLens的超时时间是1秒。

注意到本例中,如果你如果在zemax文件菜单中载入相同的透镜那么会和调用zLoadFile相同的效果。

追踪大量光线

标准的DDE调用文本模式很多情况下是足够使用的,但是当客户机和服务器之间大量数据需要交换时就力不从心了。当你想追踪大量光线时,这个问题就来了。

并不是一次追踪一条光线,而是先创建一个包含所有光线的数组,然后一次性把这个数组传递给zemax。Zemax然后追踪所有的光线,然后把整个数组还给客户机。注意在DDE中传输的并不是所有数据,而仅仅是数组所在内存的指针。这样便消除了大量光线追迹时DDE通信的瓶颈。

不幸的是,当初在写工具箱时,matlab就不允许除了文本模式以外的DDE模式。为了避免这个问题,需要用mex(matlab可执行)格式写一些C代码。生成的.dll文件命名为zArrayTrace。键入help

zArrayTrace以获得关于大量光线追迹的更多信息。查阅zemax手册中的相应部分也同样有用。为了设置zArrayTrace模式0的光线输入数据,函数genRayDataMode0很有用。

编译matlab编写的单机zemax扩展

如果你有matlab编译器,那么你可以把用工具箱编写的matlab脚本编译到单机扩展,以便zemax扩展菜单可以运行。这样做的时候有一些陷进需要避免。

首先,有一些matlab函数不能被编译,你需要为这些函数(还好不是很多)想一些其他办法。

第二,当你的单机扩展本应该在装有matlab的电脑上运行良好时,事实上却并没有运行,这主要是因为这台电脑没有matlab运行时间库(Matlab runtime

libraries)。因此你需要把你的扩展和运行时间库一起打包来确保完全可移植性。Matlab的自解压文件mglinstaller.exe会使打包大多数运行时间库更容易一点,文件目录是C:/MATLAB/extern/lib/win32 或者附近。

最后一个是常规的matlab运行时间库不包含上面提到的DDE函数代码。通过你的matlab安装文件中搜索匹配dde*.dll的文件就能找到这些.dll文件。一般在C:/MATLAB/Toolbox/matlab/winfun 或附近。运行时间库包括DDE库,都必须安装在WINDOWS搜索路径下。

使用工具箱时需谨记:

1你的第一个调用必须是zDDEInit。

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

3zemax有两份透镜数据,一个在LDE中表示,一个存在DDE服务器里。你可以用zPushLens 和 zGetRefresh把一个数据复制到另一个。zPushLens总是需要一个参数作为超时限。

4你只有在EDITORS标签中选中了复选框以后才可以用zPushLens。

matlab与zemax,如何在ZEMAX和MATLAB之间通信相关推荐

  1. ZEMAX | ZOS-API、ZPL 和 DLL 之间的区别

    ZEMAX | ZOS-API.ZPL 和 DLL 之间的区别 本文对 ZOS-API.ZPL 和DLL 进行了比较.我们将会对与 OpticStudio 的互联.代码执行.语句和数据存取与处理这些方 ...

  2. matlab的函数要写在哪,matlab函数库在哪

    ---WORD 格式--可编辑--专业资料--- 在 MATLAB 环境下访问外部函数的共享库文件,必须首先把该库文件加载到内存中.一旦加载 成功,就能直接在 MATLAB 中直接请求...... 1 ...

  3. 用matlab处理表格,matlab删除excel表格数据-如何用matlab处理多个excel表格中的数据...

    如何用matlab处理多个excel表格中的数据 biao='D:\Program Files\matlab\bin\filename.xls'; A1=xlsread (biao,'Sheet1', ...

  4. matlab 修改语言环境,VS Code配置Matlab环境

    VSCode这么赞的轻量级多平台IDE,怎么夸它都不为过,而且很有活力,笔者使用了才半年,但半年时间内,更新速度快,且每次更新都让人觉得"值",而不是随随便便更新. 废话还是少说, ...

  5. matlab与excel数据连接数据库,如何实现matlab与excel数据同步 数据交互?

    Excel Link是一个在Windows环境下实现Excel与Matlab进行链接的插件.通过连接Excel和Matlab,用户可以在Excel工作表空间和宏编程工具中使用Matlab的数值计算,图 ...

  6. 【 MATLAB 】序列的奇偶分解的 MATLAB 函数编写实践

    序列 x(n)的奇偶分解的公式为: 编写一个序列 x(n) 的奇偶分解式 xe(n) 和 xo(n),需要考虑的问题是序列长度,下标的变化. 这里必须做个声明,下面的程序中用到了前几篇博客中的几个函数 ...

  7. matlab 2009a使用教程,实验一 安装MATLAB R2009a软件及其简单操作

    实验一安装MATLAB R2009a软件及其简单操作 一.实验目的 1.掌握MATLAB R2009a软件的安装. 2.熟悉启动和退出matlab的方法. 3.熟悉matlab命令窗口的组成. 4.掌 ...

  8. 静电场的有限差分法与matlab 仿真课程设计,计算物理和MATLAB课程设计--自激振动系统的MATLAB仿真.doc...

    东北石油大学课程设计任务书 课程 计算物理和MATLAB课程设计 题目 自激振动系统的MATLAB仿真 专业 姓名 学号 主要内容.基本要求.主要参考资料等 主要内容: 研究范?德?波耳(Van de ...

  9. matlab需要多大运存_提高matlab运行效率

    用过Matlab的人都知道,Matlab是一种解释性语言,存在计算速度慢的问题,为了提高程序的运行效率,matlab提供了多种实用工具及编码技巧. 1. 循环矢量化 Matlab是为矢量和矩阵操作而设 ...

  10. 循环神经网络matlab程序设计,神经网络及深度学习(包含matlab代码).pdf

    神经网络及深度学习(包含matlab代码) 神经网络及深度学习 (包含 MATLAB 仿真) 人工神经网络(Artificial Neural Network,即 ANN ), 作为对人脑最简单的一种 ...

最新文章

  1. win10应用商店打不开_电脑打不开exe程序|Win10提示exe不是有效32应用程序
  2. Android之 AndroidManifest.xml 文件解析
  3. 補丁文件patch制作流程
  4. JAVA开发Web Service几种框架介绍
  5. C++继承中父类和子类之间的赋值兼容
  6. vscode卸载background插件_使用插件一键启用 Visual Studio Code 的毛玻璃效果
  7. [渝粤教育] 郑州大学 互联网国际政治学 参考 资料
  8. js字符串转数字(小数),数字转字符串
  9. OC中NSString 的常用方法
  10. #if、#if defined 的使用
  11. glyphicons-halflings-regular.woff2 文件 404
  12. 九大背包问题专题--二维费用的背包问题
  13. Spring整合MyBatis原理之Mapper接口代理对象的产生以及调用 (三)
  14. Laravel 实战视频教程(精品)
  15. 惠普怎样启动计算机上的无线功能,如何打开hp无线网卡?如何打开惠普笔记本电脑无线网卡...
  16. mac右键文件夹,选择打开方式
  17. android tv 盒子,安卓TV电视盒子推荐软件一览表(盒子端+手机端+电脑端+群晖端)...
  18. 咖啡壶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. PHP,$this-{$xxx} 是什么意思?
  20. 《二叉平衡树(一)》

热门文章

  1. 在MySQL登录时出现Access denied for user ‘root‘@‘localhost‘ (using password: YES) 拒绝访问问题解决
  2. js中字符串方法集合
  3. JavaScript中 切割截取字符串的几种方法
  4. 使用Sophix热修复注意事项
  5. 众为兴SCARA四轴机械臂编程(二)——基于硬接线替代Modbus通讯
  6. 随机森林回归简单示例
  7. 空间解析几何 | 空间曲线的切向量与曲面的法向量
  8. Spark性能优化之通过YDB实现比原生Spark性能高100倍的多表关联
  9. caxa 拉伸命令的使用(一次拉伸很多线)
  10. win10 查看电脑mac 地址和ip