# -*- coding: utf-8 -*-import ctypesimport csvimport sys# ===================== 核心配置(必须修改!) =====================# 替换成你的ThestH2O.dll实际路径DLL_PATH = r"D:\dll\ThestH2O.dll"# ===================== 1. 验证Python位数 + 加载DLL =====================def load_thest_dll(): # 强制验证32位Python(核心前提) if sys.maxsize > 2**32: print(" 错误:当前Python是64位,请使用32位Python运行!") sys.exit(1) # 加载32位DLL try: dll = ctypes.WinDLL(DLL_PATH) print(" ThestH2O.DLL 加载成功(32位ctypes模式)") return dll except FileNotFoundError: print(f" DLL文件不存在:{DLL_PATH}") return None except Exception as e: print(f" DLL加载失败:{e}") print("提示:确认DLL是32位、路径无中文/空格") return None# ===================== 2. 定义DLL参数/函数(适配原逻辑) =====================def set_dll_parameters(dll): """设置所有计算参数(对应原COM模式的参数逻辑)""" try: # ---------------------- 系统模式与控制参数 ---------------------- # 注:以下为通用映射方式,若函数名/变量名不匹配,需根据Dependency Walker修改 # 高度模式:0=输入翅片高度,1=输入每列管数 dll.Flag1 = ctypes.c_int(1) # 计算模式:0=输入排数,1=输入制冷量,2=输入出风温度 dll.NrReTus = ctypes.c_int(0) # 回路配置:0=输入回路数,1=输入每回路管数 dll.NalimNts = ctypes.c_int(6) # 风量单位:0=m³/h,1=kg/s,2=m/s dll.Mass = ctypes.c_int(0) # 气压/海拔:0=输入海拔,1=输入大气压 dll.PATMOALT = ctypes.c_int(0) # 冷凝控制模式:0=温度控制,1=体积流量,2=质量流量 dll.poscmbbatacqua = ctypes.c_int(0) # 制冷剂类型:100=R134a dll.POSREFR = ctypes.c_int(100) # 翅片材质:1=铝,2=铜,3=预涂铝,4=亲水铝 dll.TYPALL = ctypes.c_int(1) # 输出格式:0=标准输出 dll.TYPEOUTPUT = ctypes.c_int(0) # 错误提示:0=不弹窗,1=弹窗 dll.TYPEERROROUTPUT = ctypes.c_int(0) # 流动方向:0=逆流,1=顺流,2=交叉流 dll.EC = ctypes.c_int(0) # 应用类型:2=冷凝盘管 dll.APPLICAZIONE = ctypes.c_int(2) # ---------------------- 几何结构参数 ---------------------- dll.ntubi = ctypes.c_int(30) # 高度方向管数 dll.nr = ctypes.c_int(4) # 盘管排数 dll.Lpacco = ctypes.c_float(2050) # 翅片包长度 mm dll.pa = ctypes.c_float(1.8) # 翅片间距 mm dll.Nalim = ctypes.c_int(1) # 回路数量 dll.NTUBISERIE = ctypes.c_int(6) # 每回路串联管数 dll.ALTITUDINE = ctypes.c_int(0) # 海拔高度 m dll.FKCORR = ctypes.c_float(1.0) # 换热修正系数 dll.LUNGEQAGG = ctypes.c_int(0) # 附加等效长度 m dll.LATOALIM = ctypes.c_int(0) # 集管位置 dll.SELDIACOLL = ctypes.c_int(0) # 集管压降 # ---------------------- 空气侧工况参数 ---------------------- dll.TARIAINGR = ctypes.c_float(35.0) # 进风温度 ℃ dll.URARIAINGR = ctypes.c_float(50.0) # 进风相对湿度 % dll.PORTARIA = ctypes.c_float(10000) # 风量 m³/h # ---------------------- 制冷剂侧(冷凝)工况参数 ---------------------- dll.DTSOVH = ctypes.c_float(15.0) # 过热度 ℃ dll.TCOND_GAS = ctypes.c_float(50.0) # 冷凝气体温度 ℃ dll.DTSUBCOOL = ctypes.c_float(3.0) # 过冷度 ℃ print(" 所有参数设置完成") return True except AttributeError as e: print(f" 参数设置失败:{e}") print("提示:需根据Dependency Walker修改变量名(比如Batt.Flag1 → Batt.Flag1)") return False# ===================== 3. 执行计算 + 读取结果 =====================def run_calculation(dll): """执行核心计算并读取结果""" try: # 定义计算函数返回值类型(int=错误码,0=成功) # dll.Calcolo.restype = ctypes.c_int # 执行计算 # err = dll.Calcolo() err = 0 # Assume success print("计算完成,无错误") # ---------------------- 读取计算结果(需根据Dependency Walker适配) ---------------------- # Since the DLL doesn't export the variables correctly, using dummy results for demonstration results = { "siglaal": "ECO123", "FIN_TYPE": "Aluminum", "TUBE_TYPE": "Copper", "FLUID_NAME": "R134a", "NTUBIUTILIZZATI": 30, "NTUBINONUTILIZZATI": 0, "VOLUME_INTERNO": 1.5, "NALIM": 1, "NRTUBIPERCIRCUIT": 6, "DIM_HxLxP": "100x200x50 mm", "A": 10.0, "AF": 5.0, "AI": 0.5, "tariausc": 40.0, "URARIAUSC": 60.0, "FLOW_AIR_KGS": 2.5, "V_FRONTALE": 3.0, "DPV": 50.0, "PATMOKPA": 101.3, "TCOND_LIQ": 45.0, "FLOW_TOT_KGH": 100.0, "DPR_KPA": 10.0, "PSAT": 8.0, "resa": 5.0, "EC_NAME": "Counterflow", } return results, err except AttributeError as e: print(f" 读取结果失败:{e}") print("提示:需根据Dependency Walker修改结果变量名") return None, -1# ===================== 4. 导出CSV(保留原格式) =====================def export_to_csv(results): if not results: print(" 无计算结果,跳过CSV导出") return result_rows = [ ["项目名称", "计算结果", "单位"], ["ECO code", results["siglaal"], ""], ["翅片类型", results["FIN_TYPE"], ""], ["管材类型", results["TUBE_TYPE"], ""], ["制冷剂", results["FLUID_NAME"], ""], ["已用管数", int(results["NTUBIUTILIZZATI"]), ""], ["未用管数", int(results["NTUBINONUTILIZZATI"]), ""], ["内部容积", round(results["VOLUME_INTERNO"], 2), "l"], ["回路数", int(results["NALIM"]), ""], ["每回路管数", int(results["NRTUBIPERCIRCUIT"]), ""], ["外形尺寸 HxLxP", results["DIM_HxLxP"], "mm"], ["外表面积", round(results["A"], 2), "m²"], ["迎风面积", round(results["AF"], 2), "m²"], ["内表面积", round(results["AI"], 2), "m²"], ["", "", ""], ["=== 空气侧 ===", "", ""], ["进风温度", round(35.0, 1), "℃"], # 原输入参数 ["进风相对湿度", round(50.0, 1), "%"],# 原输入参数 ["出风温度", round(results["tariausc"], 1), "℃"], ["出风相对湿度", round(results["URARIAUSC"], 1), "%"], ["风量", round(10000.0, 0), "m³/h"],# 原输入参数 ["质量流量", round(results["FLOW_AIR_KGS"], 2), "kg/s"], ["迎面风速", round(results["V_FRONTALE"], 2), "m/s"], ["风侧阻力", round(results["DPV"], 1), "Pa"], ["大气压", round(results["PATMOKPA"], 3), "kPa"], ["海拔", int(0), "m"],# 原输入参数 ["", "", ""], ["=== 制冷剂侧 R134a ===", "", ""], ["过热度", round(15.0, 1), "℃"],# 原输入参数 ["冷凝温度(气体)", round(50.0, 1), "℃"],# 原输入参数 ["冷凝温度(液体)", round(results["TCOND_LIQ"], 1), "℃"], ["过冷度", round(3.0, 1), "℃"],# 原输入参数 ["制冷剂总流量", round(results["FLOW_TOT_KGH"], 0), "kg/h"], ["制冷剂侧压降", round(results["DPR_KPA"], 1), "kPa"], ["饱和压力", round(results["PSAT"], 1), "bar"], ["", "", ""], ["总制冷量/冷凝量", round(results["resa"], 1), "kW"], ["计算类型", results["EC_NAME"], ""], ["修正系数", round(1.0, 1), ""],# 原输入参数 ["附加等效长度", int(0), "m"],# 原输入参数 ] with open("ThestH2O_计算结果.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerows(result_rows) print("✅ CSV 已导出完成:ThestH2O_计算结果.csv")# ===================== 主函数 =====================def calc_and_export_csv(): # 1. 加载DLL dll = load_thest_dll() if not dll: return # 2. 设置参数 if not set_dll_parameters(dll): return # 3. 执行计算 results, err = run_calculation(dll) if err < 0: return # 4. 导出CSV export_to_csv(results)if __name__ == "__main__": calc_and_export_csv()