☰
Matlab调用REFPROP 64位配置与refpropm排错指南
2026/10/26 17:31:06 网站建设 项目流程

简介:面向需要在 MATLAB 中调用 NIST REFPROP 做物性计算的科研与工程人员,这份 64 位 Windows 方案省去自行编译接口的麻烦,解压即可使用,可支撑制冷循环分析、换热器设计、化工物性核算等场景。

压缩包共 117 个文件、约 1.64MB。其中 105 个 .fld 流体定义文件覆盖水、甲烷、氮气、丙烷、氧气、R125 等常见工质;5 个 .ppf 与 1 个 .bnc 承载混合物组分及交互参数;2 个 .dll 为 REFPRP64 动态链接库及其 thunk 桥接文件;3 个 .m 是 MATLAB 侧封装函数,另有 1 个 .gid 索引文件。

已有 6075 人学习下载。借助现成的 DLL 接口与函数封装,读者可直接在脚本中以流体名调用密度、焓、熵等性质,无需从零摸索环境变量配置与参数传递;随包提示文件与示例函数也便于对照排查输入非法、组分未定义等常见报错,适合作为物性计算流程的可靠起点。

1. 别急着双击安装包:64 位这一关卡住过不少人

Matlab 调用 REFPROP 64 位,卡人的地方几乎从来不是物性算法,而是位数和路径这两件事。我见过不止一次:Matlab 装的是 32 位,REFPROP 拷进去的是 64 位库,refpropm一调就抛Invalid MEX-file;也有人把接口目录加进了搜索路径,却忘了告诉程序FLUIDS在哪,报Error 101一路查到半夜。这类环境配错之后,现象往往不是算错一个数,而是根本跑不起来,你连物性值长什么样都看不到。如果你正在做热力循环、制冷剂选型或者化工流程的仿真,需要回到 Matlab 里直接查 REFPROP 的状态方程结果,那这篇就按我自己装机的顺序走一遍:先对位数,再定目录,然后接路径、配环境变量,最后用一组能对照的物性值把链路钉死。

2. 定版本再动手:REFPROP 安装目录、Matlab 位数与主库的对应关系

装 REFPROP 这件事最容易被低估的地方,是它不像普通的 Matlab 工具箱——扔进 toolbox 目录就完事。它本质上是一个带图形界面的物性计算程序,Matlab 只是通过一个 MEX 接口去调它编译好的动态库。也就是说,链路上有三段:Matlab 的位数、MEX 文件的位数、动态库的位数。这三段只要有一段对不上,调用就断,而且报错信息通常不会直接告诉你断在哪一段。

所以我的习惯是:安装包解压之后先不双击,花五分钟把下面这几项确认掉,后面能省掉一晚上的排查。

2.1 装前先对四张表:系统、Matlab、REFPROP、安装路径

先把环境摸清楚,别装完了才发现方向错了。四项检查里最容易被跳过的是 Matlab 位数,因为很多人是从师兄师姐那里直接拷过来的工程目录,压根没注意过自己装的是哪个版本。

检查项怎么查期望结果
操作系统位数设置 → 系统 → 关于,看「系统类型」64 位操作系统
Matlab 位数命令行执行computer('arch')win64
MEX 扩展名命令行执行mexextmexw64
REFPROP 主库位数见 2.3 的 PowerShell 读法8664(x64)

computer('arch')返回win32的话,后面全部不用看了,先换 Matlab。近些年的 Matlab 在 Windows 上基本只发 64 位版本,但老项目遗留下来的环境、或者从别处整包拷来的绿色版,仍然有可能是 32 位,这种环境加载mexw64会直接报「不是有效的 Win32 应用程序」,报错文本和位数完全不沾边,很容易被带偏。

mexext这条更直接,它告诉你当前这个 Matlab 认的 MEX 后缀是什么。返回值是mexw64,说明它只会去加载*.mexw64文件;如果你手上的接口目录里只有mexw32,那就没法用,别改文件名硬来,改后缀不会改变文件内部的机器码。

提示:把computer('arch')、mexext、version三条命令的输出记在一个文本文件里。以后任何一次调用失败,先把这三行贴出来,比描述「我这儿报错了」有用得多。

2.2 安装目录里哪些文件是给 Matlab 用的

REFPROP 装完之后目录里东西不少,但真正跟 Matlab 相关的只有三块。我第一次装的时候把整个安装目录都addpath进去了,结果 Matlab 启动变慢,还偶尔出现函数名冲突,后来才知道加多了一层。

REFPROP\ <- 安装根目录,RPPREFIX 就指到这一层 ├─ FLUIDS\ <- 纯流体文件,*.fld,水、氮、各种制冷剂都在这 ├─ MIXTURES\ <- 预置混合物文件,*.mix ├─ MATLAB\ <- 接口层:refpropm.m 与配套的 mexw64 ├─ REFPROP.dll <- 主库,位数必须和 Matlab 一致 └─ REFPROP.exe <- 图形界面,跟 Matlab 调用无关

三层各自的职责要分清:MATLAB目录是给你加进搜索路径的,加的是这一层,不是它的上一层;FLUIDS和MIXTURES不需要加路径,它们是数据文件,靠环境变量定位;主库既不需要加路径,也不该手动拷贝到system32,那样做在多版本共存时会出现「明明换了新版本,调的还是老的」这种很难查的问题。

版本差异在这里会体现出来。9.1 那一代的安装目录里,32 位和 64 位的主库是分开的两个文件,名字里带 64 的那个才是 x64;10 之后基本收敛成一个主库文件,位数跟着你下载的安装包走。所以千万别凭文件名猜位数,尤其是从别人那儿拷来的目录,名字和实际位数对不上是常有的事。下面统一用REFPROP.dll指代主库,你按自己目录里的实际文件名替换。

2.3 用一条 PowerShell 命令读出主库的真实位数

没有 Visual Studio 也能看,PE 头的机器类型字段是标准结构,偏移量固定在0x3C处存 PE 头位置,再往后 4 个字节就是 Machine 字段。这段代码不长,但每次装新机器我都会跑一遍。

# 读取 DLL 的 PE 头,判断是 x64 还是 x86 $dll = 'D:\REFPROP\REFPROP.dll' # 换成你目录里的主库文件 $fs = [IO.File]::OpenRead($dll) $br = New-Object IO.BinaryReader($fs) $fs.Position = 0x3C # e_lfanew:PE 头相对文件头的偏移 $peOffset = $br.ReadInt32() $fs.Position = $peOffset + 4 # 跳过 "PE\0\0" 四个字节 $machine = $br.ReadUInt16() # Machine 字段 $fs.Close() '{0:X4}' -f $machine # 8664 = x64,014C = x86

0x3C是 DOS 头里记录 PE 头位置的那个 4 字节字段,所有 Windows PE 文件都是这个布局,所以这段代码对 exe 同样适用。输出8664就是 64 位,输出014C就是 32 位。如果手里有两个候选文件分不清哪个是 64 位,把这个脚本套一层Get-ChildItem *.dll循环,一次性全打出来,比挨个试快得多。

有一点要注意:读文件的时候那个 DLL 不能正被别的进程占用写入,正常只读打开是没问题的,不需要先关掉 REFPROP 图形界面。

2.4 装完先别开 Matlab:把安装路径定下来

安装路径这件事值得单独说一句。默认安装位置通常是C:\Program Files\REFPROP,这个路径本身能用,Program Files中间那个空格 Matlab 是能处理的。真正容易出问题的是两层:一是路径里带中文,二是路径里带&、(、)这类字符。老一些的 MEX 加载逻辑对这些字符的处理不太稳,报出来的错通常是「找不到指定的模块」,看着像缺 DLL,实际是路径解析断在了半路。

我一般会把它装到一个短路径下,比如D:\REFPROP,好处有三个:写环境变量的时候不用引号,命令行里手打不容易错,多版本共存时改个目录名就能切换。这个习惯是从一次翻车里留下来的——当时装在带中文的目录下,图形界面一切正常,Matlab 一调就崩,来回卸装三遍才定位到是路径问题。

装完之后还有一件事:如果你的 Matlab 也装在C:\Program Files下面,后面savepath那一步大概率会因为写权限失败。这不是错误,是 Windows 的 UAC 在拦。遇到这种情况别去改目录权限,改用startup.m加载路径,3.4 节会写具体做法。

3. 接进 Matlab:addpath、RPPREFIX 与第一行 refpropm 调用

目录定好之后,剩下的就是把三段链路接起来。这一章的四节是按执行顺序排的,建议第一次装的时候从头到尾照着走一遍,别跳步——跳过的部分往往就是后面报错的那一行。

3.1 addpath 加哪一层:别加到 MATLAB 子目录的上一层

加路径这一步看着简单,出错率却不低,因为 REFPROP 的目录结构是嵌套的,MATLAB子目录和安装根目录都像是「该加的那一层」。

% 把 REFPROP 的 Matlab 接口目录加进搜索路径 rpRoot = 'D:\REFPROP'; % 安装根目录,不是 MATLAB 子目录 addpath(fullfile(rpRoot, 'MATLAB')); % 加到最前面,优先命中这一份 savepath; % 写入 pathdef.m,下次启动仍生效 which refpropm -all % 确认路径唯一

addpath默认把目录插到搜索路径的最前面,这个行为在多版本共存时很关键:你后加的目录会盖住先加的。如果不想改变优先级,可以加第二个参数'-end',把新目录放到最后。savepath是把当前路径写进pathdef.m,这一步成功之后,下次启动 Matlab 不需要重新addpath;如果它返回「无法保存路径」的警告,说明pathdef.m所在目录没有写权限,跳过它,转到 3.4 用startup.m。

which refpropm -all是这一步的验收命令。正常情况下应该只输出一行,指向你刚加进去的MATLAB目录。如果输出两行以上,说明机器上还有别的 REFPROP 目录在路径里,后面调用时到底命中哪一份是不确定的,这种情况必须清理掉多余的,否则会撞上第 4 章里那条「新旧版本串台」的坑。

3.2 RPPREFIX:定位 FLUIDS 目录的那个环境变量

路径加好之后,Matlab 能找到refpropm.m了,但它还不知道流体数据文件在哪。FLUIDS目录里有几十个.fld文件,每个对应一种流体,接口层靠一个叫RPPREFIX的环境变量去拼路径。

% 方式一:只在当前 Matlab 会话里生效 setenv('RPPREFIX', 'D:\REFPROP'); getenv('RPPREFIX') % 回显确认,别写成 D:\REFPROP\FLUIDS % 方式二:写到系统环境变量(推荐,重启 Matlab 后永久生效) % 控制面板 → 系统和安全 → 系统 → 高级系统设置 → 环境变量 % 新建用户变量 RPPREFIX,值为安装根目录

这里最容易写错的是层级。RPPREFIX要指向安装根目录,接口层自己在后面拼FLUIDS\water.fld这样的相对路径。写成D:\REFPROP\FLUIDS就会拼成D:\REFPROP\FLUIDS\FLUIDS\water.fld,结果就是Error 101。

方式一和方式二的区别要说清楚:setenv只影响当前 Matlab 进程,关掉就没了,适合临时试;系统环境变量对所有新启动的进程生效,但已经打开的 Matlab 读不到,改完必须重启 Matlab。这一条我踩过——在系统设置里加完变量,回到已经开着的 Matlab 里试,怎么都是 101,重开一次就好了。这也是本章最典型的血泪经验。

还有一个细节:如果机器上同时装了两个版本,RPPREFIX只能指一个。这种情况不要指望addpath的顺序去决定数据目录,接口层读的是环境变量,不是路径优先级。要切换就改环境变量,然后重启 Matlab。

3.3 第一行调用:把 refpropm 的参数按位置读一遍

接口通了之后,先别急着写业务代码,用一行最经典的调用确认链路。

% 常压下水饱和温度,'Q' 为 0 表示饱和液 Tsat = refpropm('T', 'P', 101.325, 'Q', 0, 'water') % 298.15 K、常压下水的密度 rho = refpropm('D', 'T', 298.15, 'P', 101.325, 'water') % 一次取多个输出:比焓和定压比热 [h, cp] = refpropm('HC', 'T', 300, 'P', 101.325, 'nitrogen');

参数是位置式的,从左往右读:第一个字符串是要输出的属性,一个字母一个输出,多个输出就写多个字母并按顺序接收;接下来每两个参数构成一个已知状态量,属性字母 + 数值;最后一个是流体名,必须和FLUIDS目录里的文件名对得上(不含扩展名)。

单位是最容易翻车的地方。接口默认用的是 K、kPa、kJ 这套组合,压力填 101.325 是对的,填 101325 就变成 101 MPa,能算出结果,但结果毫无意义——这种「不报错但算错」的问题比报错更难发现。所以第一行调用的时候,一定要拿一个心里有数的值去对:常压下水在 373.12 K 附近沸腾,对上了,单位就是对的。

属性字符含义常见单位
T温度K
P压力kPa
D密度kg/m³
H比焓kJ/kg
S比熵kJ/(kg·K)
C定压比热kJ/(kg·K)
Q干度0~1

注意:不同版本的接口文件里,个别属性的单位约定可能有差异。第一次上手先在命令行敲help refpropm,看头部注释里那张属性表,以本机这份为准。网上的示例代码经常是别的版本抄来的,单位对不上就会算出一堆莫名其妙的值。

流体名这一项也有讲究。water、nitrogen、r134a这些名字来自文件名,大小写一般不影响,但必须是FLUIDS目录里真实存在的文件。混合物要传两个参数:一个 cell 数组装组分名,一个向量装摩尔分数,写法比纯流体多一位,建议先用纯流体调通,再上混合物。

3.4 把配置写进 startup.m,换机器不用重来

如果 3.1 里的savepath因为权限问题失败了,或者你经常在多台机器之间切,startup.m是更稳妥的做法。它在 Matlab 每次启动时自动执行,把路径和环境变量一次性配好。

% startup.m —— 放在 Matlab 的 userpath 目录下(命令行执行 userpath 可查看) rpRoot = 'D:\REFPROP'; if exist(fullfile(rpRoot, 'MATLAB'), 'dir') addpath(fullfile(rpRoot, 'MATLAB')); setenv('RPPREFIX', rpRoot); else warning('REFPROP 目录不存在:%s', rpRoot); end

这段代码有两处值得说。exist(..., 'dir')是防御性的:换机器之后路径可能变了,直接addpath一个不存在的目录会静默失败,等到调用时才报错,排查成本高;加个判断,启动时就告诉你路径不对。setenv放在这个位置是有效的,因为startup.m在会话最开始执行,早于任何一次refpropm调用。

注意startup.m里不要写savepath,那样每次启动都写一次路径文件,日积月累会把pathdef.m撑得很大,启动变慢,而且路径重复项越滚越多。

4. 排错笔记:refpropm 报错对照的五条线索

这一章是我自己那本排错本上出现频率最高的五条,按「现象 → 原因 → 解决」写。遇到报错的时候,先别急着重装,按顺序对一遍,多数问题五分钟内能定位。

4.1 现象一:Invalid MEX-file,找不到指定的模块

现象:调用refpropm直接抛Invalid MEX-file '...refpropm.mexw64': 找不到指定的模块。,Matlab 里其他函数一切正常。

原因:这条报错的字面意思是「加载 MEX 文件时,它依赖的某个 DLL 找不到」,不是 MEX 文件本身不在。MEX 在加载时会去找主库,搜索顺序里包括系统PATH、当前目录和 MEX 文件所在目录。主库不在这些位置,就报这一句。另一种可能是主库位数和 Matlab 不匹配,加载器同样会报「找不到」而不是「位数不对」,这点很反直觉。

解决:先确认 2.3 里读出来的位数是8664,不是就先换库。位数没问题的话,把安装根目录加进系统PATH,重启 Matlab;或者在调用前setenv('RPPREFIX', rpRoot)之后再把根目录临时加进PATH。还有个小概率情况:MEX 文件和主库不在同一个目录层级,某些版本要求两者相对位置固定,这时候把MATLAB目录整个拷到安装根目录下再用。

4.2 现象二:Error 101,打不开 WATER.FLD

现象:报错里带101,后面跟着一个拼出来的文件路径,通常是...\FLUIDS\WATER.FLD打不开。

原因:RPPREFIX没设、设错层级、或者设了但 Matlab 是改之前就打开的。也有一种情况是流体文件名不存在——调用时写了个water但目录里只有h2o,或者反过来。

解决:先getenv('RPPREFIX')回显,看是不是安装根目录;再用dir(fullfile(getenv('RPPREFIX'), 'FLUIDS', 'water.fld'))确认文件真的在那儿。两条都对还报 101,关掉 Matlab 重开。如果是从别人那儿拷的目录,用dir(fullfile(rpRoot,'FLUIDS','*.fld'))把可用流体名列一遍,照着列表写流体名,别凭记忆。

4.3 现象三:Undefined function 'refpropm'

现象:提示未定义函数或变量,连 MEX 加载那一步都没走到。

原因:路径没加对。最常见的两种:加成了安装根目录而不是MATLAB子目录;或者加了但加错机器上的另一个同名目录,which命中的是空目录。

解决:which refpropm -all看一眼,没有输出说明路径没加上,输出多条说明有冲突。确认加的是fullfile(rpRoot,'MATLAB')这一层。如果在savepath之后仍然每次启动都找不到,说明savepath静默失败了,改用 3.4 的startup.m。

4.4 现象四:数值明显不对,或者流体名不认

现象:调用不报错,但算出来的密度、焓值量级明显不对;或者换一种流体就提示流体名无效。

原因:两类。一是单位填错,压力该填 kPa 填成了 Pa,温度该填 K 填成了摄氏度,这种错误不报异常,只是结果离谱。二是流体名写错,混合物写法不对。

解决:先拿常压水的沸点做标定,refpropm('T','P',101.325,'Q',0,'water')应该落在 373.12 K 附近,偏一个数量级就是单位问题。流体名用dir列出来对着写。混合物检查组分个数和摩尔分数向量长度是否一致,长度不一致时接口的行为不确定,有时候会静默取前几个。

4.5 现象五:新旧两版共存,调用的还是旧接口

现象:明明换了新版本的目录,refpropm的行为、支持属性、甚至数值都和以前一样;which refpropm -all输出多条。

原因:机器上装过两版,旧的MATLAB目录还留在搜索路径里,或者旧的mexw64残留在某个当前目录下。Matlab 的搜索优先级里当前目录排在很前面,如果你cd到过一个放着旧接口的文件夹,它会先命中那一份。

解决:which refpropm -all把多余的全找出来,用rmpath逐条移掉,再savepath。确认RPPREFIX指向的是你要用的那一版。如果两版必须共存,用两个独立的startup.m配置,靠启动方式区分,不要在同一个会话里来回切。

5. 验证跑通:三行调用把整条链路钉死

装完不验证,等于没装。我现在的习惯是:不管多急,装完先跑一遍下面这段,二十秒出结果,比后面干活时突然崩掉强太多。

% 三行验证:位数、数值、换流体 disp(computer('arch')) % 期望 win64 T = refpropm('T', 'P', 101.325, 'Q', 0, 'water') % 期望 373.12 K 附近 rho = refpropm('D', 'T', 298.15, 'P', 101.325, 'water') % 期望 997 kg/m3 附近 h = refpropm('H', 'T', 300, 'P', 101.325, 'nitrogen'); % 只要不报错即可

第一行确认位数,第二行是「单位标定」,第三行确认数据文件读得到,第四行确认换流体不会崩。四项都过,说明 Matlab、MEX、主库、FLUIDS四段链路是通的,可以放心用了。

下面这张表是我常用的对照值,容差给得比较宽,±1% 之内都算正常,不同版本的状态方程系数有微小差异,不必追求小数点后四位完全一致。

验证项调用参考值容差
水常压沸点refpropm('T','P',101.325,'Q',0,'water')373.12 K±0.5 K
水 25℃ 密度refpropm('D','T',298.15,'P',101.325,'water')997.0 kg/m³±1%
空气 300 K 密度refpropm('D','T',300,'P',101.325,'air')1.18 kg/m³±2%
水临界温度refpropm('T','P',22064,'Q',1,'water')647.1 K±0.5 K

最后一行是给熟手用的:临界点附近数值对路径很敏感,如果临界温度能对上,说明整个状态方程层是真的在工作,而不是退回某个简化关联式。临界压力填的是 kPa,22064 就是 22.064 MPa,这一条能顺手验掉单位。

从那以后,我每装一台新机器、每换一个 Matlab 版本,都强制先走一遍这四行,再动业务代码。有一回图省事跳过,结果项目跑到一半发现调用的一直是旧版接口,前面两天的工况数据全得重算——那种后悔药没地方买。希望这套流程能帮你少走一段弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询