主要用Simulink的S-Function模块自定义UDP程序和Fluent的UDF函数编写UDP通讯程序实现,simulink的控制系统仿真发送温度数据至Fluent并接收Fluent反馈的温度点数据,Fluent的UDF函数接收simulink的控制系统仿真数据并赋给边界条件,同时将Fluent温度点的数据发回Simulink,大概流程就是这样啦,具体实现主要就看UDP通讯程序了(主要用C++编译)。
Simulink 里点运行,MATLAB 卡在连接那一步不动了,Fluent 那边控制台也没反应,等了几分钟弹出来一个 timeout。查了一下是启动顺序搞反了,Fluent 必须先以 aas 模式启动等着,MATLAB 再连过去,反过来 Fluent 找不到客户端就一直挂在那。
环境变量 FLUENT_AAS=1 是必须的,它告诉 Fluent 以服务器模式启动,等待外部连接,不加这个变量 Fluent 启动完自己就跑了,MATLAB 连过去的时候对面已经没了。启动顺序就是先开 Fluent,加了这个环境变量之后它会停在等待状态,再从 MATLAB 里加载 aas 工具箱连过去。工具箱版本跟 Fluent 版本要对上,从 ANSYS 安装目录搜 *.mltbx 找到匹配的那个,别从论坛随便下。
工具箱装完先在 MATLAB 命令行验证一下,敲 `as = ansys.aas.FluentServer;` 看有没有报错,报“类不存在”就是工具箱没装完整,附加功能管理器里确认一下状态。连接之前工作目录全英文,中文路径下 Fluent 读 journal 文件会静默失败,MATLAB 那边也读不到返回的数据。

UDF 那条路也试过,Fluent 侧写 UDF 在每一步迭代完成后读写共享文件,MATLAB 侧用 .m 文件轮询同一个文件,通讯方式用 UDP。UDP 端口设成 5001 和 5002 一边一个,MATLAB 的 udpport 函数建通道,UDF 里用 C 的 socket 写。这个方案的好处是不依赖 aas 工具箱,Fluent 和 MATLAB 可以装在两台机器上,走局域网通信。坏处是 UDP 不保证送达,Fluent 算得快的时候 MATLAB 那边可能漏掉几个时间步,在 UDF 里加一个握手信号,MATLAB 确认收到之后 Fluent 才往下走。
还有个更省事的路子是共享数据文件。Fluent 跑 journal 文件,Simulink 跑 S-function,两边读写同一个 txt 文件,Fluent 算完一步写数据,S-function 轮询文件看数据准备好标志,读到之后处理完再写回去。这个方案不用写 socket 代码,但文件 I/O 速度慢,时间步多了之后卡得厉害,适合几十步量级的耦合,几百步以上还是走内存或者网络通信。
FMU 导出是另一个方向。Fluent 2024 之后支持把模型导出成 .fmu 文件,Simulink 里直接加载 FMU 模块,选 Co-Simulation 模式。这个不用装 aas 工具箱,Simulink 原生支持 FMI,兼容性好一些。缺点是 Fluent 这边对 FMI 的支持是 import only,只能 Fluent 导出给 Simulink 用,Simulink 反向往 Fluent 传数据走这条路不行。双向耦合还是得回到 UDF 或者 aas 工具箱。
报错“Error reading files generated by Ansys Fluent”的时候先看 MATLAB 那边的返回值类型,Fluent 写出来的可能是字符串格式,MATLAB 读进来期望的是数值,类型对不上就报“First input must be either a character vector or a string scalar”。在 MATLAB 侧加一个 str2double 转换,或者 Fluent 的 UDF 里用 fprintf 写数值的时候指定格式。D:\Fluent_work\coupling\ 下面那个 test.txt 的数据格式改过了,前面加了一行 header 标注变量名和单位,MATLAB 侧读的时候跳过第一行。
Fluent journal 文件里 `/solve/dual-time-iterate` 的步数跟 Simulink 的仿真步长要对齐。Fluent 算 10 步写一次数据,Simulink 那边步长设成 Fluent 时间步长的 10 倍,两边时间轴同步。有个坑是 Fluent 的 dual-time 迭代步数跟物理时间步不一样,journal 里写的是每个物理时间步内迭代几次,Simulink 那边要的是物理时间步的推进量,把这两个搞混了时间轴会差一个数量级。D:\Fluent_work\coupling\journal\ 下面那个文件里 `/solve/set/time-step` 的值是 0.001,Simulink 的 sample time 设成……
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删