手机版
位置:筑能财经 > 滚动 >

Simulink模型打包发布:使用MATLAB Engine和PyQt

来源:哔哩哔哩 | 2023-07-29 10:53:05

为实现一些相对复杂的系统开发或建模仿真,可以借助MathWorks® Simulink在图形化的工程界面中编辑和测试模型,或者使用MathWorks提供的现成实例与模块以零基础快速搭建所需的仿真环境。但若要让他人运行自己搭建的模型,并根据需要自行修改部分模型参数,或是发布为可供他人使用的仿真工具,则需要将模型打包为独立的可执行文件,并设计前端图形化界面以查看仿真输出结果、修改仿真参数。

模型打包的官方推荐做法是使用MATLAB®自带的Simulink Compiler工具,将编译好的 Simulink模型和用于设置、运行和分析仿真的 MATLAB代码一起打包,且可以附带由 MATLAB App设计工具设计的UI。该方法理论上实现不难,打包出的程序只需Runtime环境即可运行。但MATLAB App设计工具并非主流前端设计工具,需要学习成本,且制作的UI界面较为简单,不满足对前端界面要求较高的场景;此外,打包生成的代码可读性较差,网上现有的案例资源等又极少,一旦报错,很难定位错误,效率不高。


(资料图)

解决方案提出:

为解决该问题,就需要抛弃官方提供的MATLAB App设计工具和Simulink Compiler打包工具,自行设计前端界面、获取Simulink运行数据并打包发布。一种可行的方案是通过主流前端设计工具制作前端GUI界面,并通过外部会话访问MATLAB,以此控制Simulink模型运行并获取运行时的数据,如可以采用官方提供的用于Python的MATLAB Engine API(/help/matlab/matlab_external/),通过Python会话在后台调用MATLAB,将仿真实时状态和模型参数等显示在以PyQt制作的前端UI界面中,最后通过Pyinstaller打包发布。

该方案可以实现复杂的前端软件设计与Simulink模型仿真相结合,且体积不大、兼容性较好,但需安装有MATLAB环境而非Runtime,即发布给他人时除软件本体外还需附带完整MATLAB安装包或对方已安装MATLAB(若未安装则Simulink仿真部分不可用,但不影响软件其他功能)。本质上Simulink模型并没有被编译发布,只是调用了相关api接口使模型在后台仿真运行。官方文档(/help/matlab/)中也指出了:

“MATLAB Engine API for Python 可提供一个包,供 Python 将 MATLAB 作为计算引擎来调用。引擎应用程序需要已安装版本的 MATLAB;您无法在只有 MATLAB Runtime 的机器上运行 MATLAB Engine。”

目前,该方案在网上可供参考的资源不多,文中可能存在错误和可优化的部分。我使用的Simulink模型为纯电动汽车建模(EvReferenceApplication),模型细节可参考的我的另一篇文章(/article1)。前端GUI界面使用PyQt5设计,制作一个小型仿真系统软件界面来控制电动汽车模型仿真的启停以及部分模型参数的修改,同时实时读取并显示仿真输出数据。软件界面设计需在保证功能完整的前提下尽量高效美观。

安装用于 Python 的 MATLAB Engine API

安装前需要确认电脑中的Python和MATLAB版本是否兼容,可以查看官方文档页面。(/support/requirements/)

在MATLAB根目录\extern\engines\python文件夹中找到,即自动安装脚本文件;控制台进入该目录(若Python安装在虚拟环境则要在对应虚拟环境终端进入),输入指令python install,安装会自动执行。安装完成后MATLAB Engine会以Python包的形式存在,可以通过pip list查询。

除此之外,MATLAB R2022b及以上也可以通过pip安装,详情可参考官方文档。(/help/matlab/matlab_external/)

MATLAB Engine需要读取_文件中的地址信息来调用电脑中的MATLAB,该文件默认存放于Python包文件夹\matlab\engine中,且仅在安装时自动生成,记录本机MATLAB地址。若本机MATLAB地址改变、_文件丢失等都会导致寻址失败。因此不难想到,若要在打包发布时将MATLAB Engine以python包的形式包含,移植到他人电脑中运行,则必须手动修改_文件中的地址信息为对方电脑中的MATLAB地址,否则无法正常运行。

MATLAB Engine需要读取的文件地址信息(即_文件)如下:

修改python包代码

为保证MATLAB Engine在打包移植后仍能正常读取配置文件,获取目标系统环境信息及MATLAB地址,需对包中部分代码进行修改。

在本机Python包文件夹\matlab\engine\__init__.py中找到调用_文件所在代码:

_arch_filename = (_module_folder, "_")

将其改为:

_arch_filename = (('.'), "")

其中“”可以是任意文本文件,需自行编写代码,在程序运行时根据当前系统环境在程序运行根目录下生成该文件,从而实现MATLAB Engine包寻址。

在python中调用MATLAB Engine

官方文档(/help/matlab/matlab_external/)中给出了在python中调用MATLAB Engine的代码示例和说明可供参考,但大多较为简略,且实际编程时还需结合以编程方式运行仿真(/help/simulink/ug/),用代码代替Simulink® UI 与仿真进行交互,如果以前从未接触过Simulink的代码形式,可能遇到不少问题。本仿真系统中用到的部分代码见下表。

其中,本仿真系统用到的部分set_param中的parameter参数与对应的value值见下表。需注意表中所有参数均为字符串。

另外需要注意的是,在python中调用MATLAB Engine相当于访问外部会话,属于耗时操作,若写在主程序线程中将会导致线程阻塞,影响前端GUI界面运行,需要利用多线程通信来解决该问题。

打包发布

使用pyinstaller打包发布python程序,但pyinstaller无法正确识别MATLAB Engine包,此时需要手动复制该包;若需要打包为单一可执行程序(.exe),则需要配置hooks来添加指定包。

在主程序.py目录下新建文件夹,命名为hooks,其内新建py文件,内容如下:

from import collect_all

datas, binaries, hiddenimports = collect_all('matlab')

打包时额外添加指令:--additional-hooks-dir=hooks。如:

pyinstaller -F -w --additional-hooks-dir=hooks 主程序.py

即可正确打包为单一可执行程序。

由于B站专栏格式限制,部分内容或代码可能存在格式异常。原文内容请前往/article1

标签:

精彩放送

新闻资讯

  1. 【焦点复盘】大金融板块引领指数逼空上涨 中信证券3年来罕见涨停 新一轮行情正式开启?
  1. 广东防风应急响应降为Ⅳ级 仍需防范次生灾害
  1. 1688陶管家官网(1688陶管家)
  1. 行政拘留!以虚假证明、恶意投诉骗取关怀,招行信用卡坚决拒绝
  1. 常宝华和侯宝林谁的辈分高_马三立和侯宝林谁辈分高
  1. 一甲基二氯氢硅烷商品报价动态(2023-07-28)
  1. 高等数学常用导数(常用导数)
  1. 高质量发展调研行|“乡村合伙人”唱响山乡“振兴曲”
  1. 天晟新材涨20.04%
  1. 首发阵容强大 新出土文物重磅亮相 三星堆博物馆新馆来了
  1. 红星阀门5.3*2.2米大型水利闸门成功投产并交付
  1. 宫崎骏封镜之作《男孩和苍鹭》 成为多伦多揭幕片
  1. 高质量发展调研行|“乡村合伙人”唱响山乡“振兴曲”
  1. “蓉火”传递 青春与梦想交相辉映
  1. 大运会,成都准备好了
  1. 凡人微光|成为闪光的自己
  1. 科普|发胖、爆痘、体毛多,看生殖医生如何“相面识病”
  1. 这是一支熊猫含量“超标”的视频
  1. 云意电气(300304)7月28日主力资金净卖出409.39万元
  1. 习近平和彭丽媛为出席成都第31届世界大学生夏季运动会开幕式的国际贵宾举行欢迎宴会
  1. 孕产妇护理专家方案(关于孕产妇护理专家方案简述)
  1. 石榴种植方法盆栽 石榴种植方法
  1. 梁家辉刘嘉玲是夫妻吗知乎(梁家辉刘嘉玲是夫妻吗)
  1. 协鑫集成首个TOPCon电池项目投产
  1. 交通运输部启动防御台风I级响应
  1. 独家视频丨习近平:建立中格战略伙伴关系 把双边关系定位提高到新水平
  1. 颠覆认识:揭秘起亚EV技术流的真正实力
  1. 起底上海被指低俗营销咖啡厅 被指低俗营销咖啡厅刚获食品许可证
  1. 白酒股震荡走强,贵州茅台涨超3%
  1. 孕产妇实用医学百科(关于孕产妇实用医学百科简述)
  1. 赵又廷 家境(赵又廷家是豪门吗)
  1. 快手怎么做营销?有哪些营销模式?
  1. 碧玉青玉白玉墨玉
  1. 两次领先都不赢,2-2AC米兰又受挫,遭斑马军团阻击,连续2场不胜
  1. 荣旗科技7月28日加速下跌
  1. 再传利好消息!楼市,又要热闹起来了?
  1. 岗石图片(岗石)
  1. 物理暴击宝珠名字(物理暴击宝珠)
  1. 墨玉怎么看是哪个产地
  1. 何向荣带队在天津等地考察学习
  1. 10股获基金调研 美埃科技最受关注
  1. 摆脱顽固性便秘!南华医院全科医学科肠菌移植解忧愁
  1. 唐宋诗人爱题壁
  1. Mysteel调研:全国建筑钢材本周及下周停复产情况统计(2023年7月28日)
  1. 红米12c可以刷什么系统
  1. 2023安徽池州市考试录用公务员录用手续办理通知(六)
  1. 证券ETF基金(512900)涨4.20%,天风证券、太平洋涨停
  1. 国内需求不足,应加大宏观调控力度
  1. 世界气象组织表示 今年7月或将成为有记录以来最热的月份
  1. 承达集团旗下公司年内被起诉逾70次,营收净利连续两年下滑
  1. 中信建投:美联储本轮加息周期或将阶段性结束 为A股反弹创造有利窗口
  1. 华西证券给予华能国际买入评级
  1. 女足今晚变阵迎战海地队
  1. 关注 | 李凯尔与中国男篮会合 大概率不会出战与埃及热身赛
  1. 男篮世界杯 | 曾凡博腰部不适 正在进行恢复治疗
  1. 艾伯维发布2023年第二季度业绩
  1. 风暴眼 | 国足主帅星夜返回筹备世预赛 9月热身第2个对手难觅
  1. 大金融股持续走高 财富趋势涨超10%
  1. 3项违法事实!陕煤集团1800万吨煤矿又被罚了!
  1. 遥感三十六号卫星顺利升空 长征火箭连续150次发射成功创纪录
  1. 张予曦演过的电影有哪些(张予曦演过赤狐先生吗)
  1. 清镇市青龙山街道:当好和谐社会“保卫者”给群众看得见的安全感
  1. 菏泽一小学老师手绘肖像 送给80多名毕业学生
  1. 美腾科技:7月27日融资买入460.44万元,融资融券余额4009.8万元
  1. A股市场投资策略周报:政治局会议一锤定音 市场信心将逐步提振
  1. 麦当劳二季度利润接近翻番 中国需求推动国际特许市场销售额增14%
  1. 原创丨一个车皮来大庆的老侯走了
  1. 房地产ETF(512200)涨0.90%,滨江集团涨4.61%
  1. 东方甄选旗下抖音自营品店铺被关三天原因曝光:讲解配料表露出商品包装二维码 被判定引流
  1. 今年已亏20%!还能拿住吗?
  1. 黄白玉牌里有气泡
  1. AMD发R9 7945HX3D移动处理器 128MB超大缓存ROG独占
  1. 扫清肝炎防治路上的“拦路虎”
  1. 上半年重庆汽车消费补贴3000万元 惠及1.1万人,带动销售额19.13亿元
  1. 青海三江源牧民摄影师:用相机呈现生态影像长卷
  1. 【开盘】A股三大股指集体低开,沪指逼近3200点关口
  1. 紧急提醒:不建议儿童使用!
  1. 通辽:2023年食品安全风险预警交流会商会议召开
  1. 河南援非医疗50年:“中国白求恩”梅庚年遗志代代传续
  1. 多位患者治疗仅过半程 九州牙管家医院关门一月引不满
  1. 河北省第十四届人民代表大会常务委员会公告(第8号)
  1. 杭州启动地铁志愿服务共建项目 用 “有爱”助力“无碍”
  1. 双台风来袭!刚刚,我市发布台风蓝色预警!
  1. 中国博物馆参观“护照” 记录参观历史之旅
  1. 上半年用电加速回升 产业优化显效
  1. 中信建投:新消费何去何从——日本资产负债表“躺平”后消费并非“佛系”
  1. 辽宁:“十四五”时期培育认定约20个特色产业集群
  1. 摩根士丹利基金方旭赟:善用大类资产配置策略管理“固收+”产品
  1. 中老年想要养生该如何饮食?饮食清单都在这,照着吃或能长寿
  1. 低位增配权益 公募FOF“腾笼换鸟”布局后市
  1. 首款基金投顾参与的家庭服务信托今日面市
  1. 台风“杜苏芮”即将在福建惠安到厦门一带沿海登陆
  1. 二季度资金追捧 多只ETF规模增长居前
  1. 7月27日基金净值:工银金融地产混合A最新净值2.344,涨0.26%
  1. “9+N”产业支撑明显,烟台有色及贵金属产业产值迈上千亿级
  1. 不只是快乐:“村超”给中国西南小城带来了什么?
  1. 九丰能源07月27日获沪股通增持12.54万股
  1. 精检细修保安全
  1. 免费安全工程师视频,免费安全工程师视频软件
  1. 邪光斩装备搭配_邪光