许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Matlab通过DDE控制TracePro实操记录

Matlab通过DDE控制TracePro实操记录

阅读数 3
点赞 0
article_banner

DDE通道初始化失败弹出来的时候,屏幕上就一行字 `Error using ddeinit: The first channel is not valid`,TracePro明明开着,Scheme编辑器里也能跑宏,就是连不上。翻了一下午论坛,光行天下那个帖子里列了六条原因,逐条对下来,卡在第一个:TracePro的DDE服务默认没开,得在宏里手动启。在TracePro的Scheme Editor里敲 `(dde-enable)` ,或者从宏菜单里找 `DDE Server Enable` 那个选项,点一下,再回Matlab跑 `ddeinit` 就通了。D:\TracePro\DDE_notes\ 下面存着这个坑的记录。


DDE通信的四个函数就够用了,`ddeinit`、`ddeexec`、`ddereq`、`ddeterm`。初始化通道用 `TP = ddeinit('TracePro', 'Scheme')`,第一个参数是服务名,TracePro认的就是 `'TracePro'` 这个字符串,大小写不敏感但拼写不能错。第二个参数是主题,固定写 `'Scheme'`,TracePro的DDE接口只暴露这一个主题。通道建完返回一个数值句柄,后面所有操作都拿这个句柄当第一个参数。不建通道直接调 `ddeexec` 就报 “first channel is not valid”,跟前面那个错是同一个根子。D:\TracePro\DDE_notes\init_channel.m 里存着标准写法。


发命令用 `ddeexec(TP, cmd)`,cmd是TracePro的Scheme宏字符串,就是平时在Scheme Editor里敲的那些命令,原封不动塞进去就行。打开文件用 `(file:open "D:\TracePro\model.oml")`,光线追迹用 `(raytrace:start)`,保存数据用 `(file:save-data "D:\TracePro\out.txt" ...)`。`ddeexec` 只管发,不管TracePro有没有执行完,也拿不到返回值,适合那些不需要等结果的命令。需要读返回值的用 `ddereq`,`req = ddereq(TP, cmd)`,TracePro执行完命令之后把Scheme的返回值当字符串传回来,Matlab这边收到的是字符串或者数字。论坛上有人试过用 `ddereq` 直接读透镜的半径和口径,回复说DDE本来就僵硬,TracePro的Scheme接口不是所有属性都能直接问,能读的只有宏命令显式返回的东西,透镜的几何参数得先写一个自定义宏把数据打到文件里,再用 `ddereq` 或者Matlab直接读文件。D:\TracePro\DDE_notes\cmd_library.txt 里记着几个常用的Scheme命令。

Matlab通过DDE控制

64位Matlab有个已知的 `ddeinit` 用完十次就失败的问题,MathWorks的答案页上确认了R2008b 64位有这个bug,32位没这个问题。现在2024a之后的Matlab在64位Windows上DDE还能用,但稳定性不如以前,有人遇到跑几十次循环之后通道断了,得把Matlab重启。绕的办法是每次循环结束之后 `ddeterm(TP)` 关掉通道,下一次循环重新 `ddeinit`,不要一直拿同一个句柄用到底。另外Matlab的DDE功能官方已经不再积极维护了,MathWorks的答复里明确说了“DDE functionality is very old and not under active development”,能用但别指望它稳定。D:\TracePro\DDE_notes\stability_tips.txt 里记着“每二十次循环重启一次Matlab”的土办法。


TracePro从某个版本开始加了COM接口,比DDE稳定得多,但要多花钱买。论坛上有人提了一嘴“新版本不是支持com方式了嘛,加钱,用新版本的”,这句话记一下,以后预算够的话直接换COM,别在DDE上耗时间。DDE的传输速率也慢,大量光线追迹的数据靠 `ddereq` 一条条读回来,延迟很明显,数据量大的话还是走文件交换。Matlab发 `ddeexec` 让TracePro执行一个保存宏,宏把数据写到txt或者csv,Matlab再 `readmatrix` 读回来,这条路虽然土但比纯DDE可靠。D:\TracePro\DDE_notes\file_swap\ 下面那个 save_irradiance.mac 就是干这个的,宏里写 `(file:write-data "D:/TP_out/irr.csv" ...)`,Matlab这边 `data = readmatrix('D:/TP_out/irr.csv')`。


通道名字用 `'TracePro'` 还是 `'tracepro'` 还是 `'TP'`,试过只有 `'TracePro'` 能通,别的拼法都报通道无效。TracePro的DDE服务注册名就是这个,别自己改。防火墙和杀软有时候会拦DDE的本地通信,把Matlab和TracePro都加到白名单里,特别是Defender的“受控文件夹访问”,它拦DDE的进程间通信拦得莫名其妙。D:\TracePro\DDE_notes\firewall_notes.txt 里记着上次Defender拦DDE的日志片段。


下次把那个循环仿真的脚本改成每二十次 `ddeterm` 再 `ddeinit` 的写法,现在用的是同一个句柄跑到底,跑到四五十次就开始丢命令,TracePro那边没反应,Matlab这边也不报错,就是干等。那个 `ddeterm` 之后重新 `ddeinit` 的延时给 0.5 秒,太短了TracePro还没释放干净。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空