文末有彩蛋哦。
去年提到要写一篇如何在利用PSIM + Visual Studio进行仿真联调,加速实际嵌入式端C代码的开发,但因为懒一直没兑现。
本期简单总结下实现的方法。
特别声明:本文约一半以上内容有kimi/文心一言提问式生成,仅用于技术交流,禁止用于商业使用。若推文内容存在侵权,请留言与我联系,我将删除对应内容。
1 Simulink VS PSIM
PSIM和Simulink都是电子仿真领域中广泛使用的软件工具,它们各有优势和劣势。以下是对两者在电子仿真方面的优劣势对比(基于Kimi提问式生成的答案,并做了微调):
PSIM:
-
PSIM专为电力电子和电机控制系统设计,因此在这些领域的仿真中表现出较高的效率。
-
它使用专门的仿真引擎,针对开关和瞬态行为进行了优化,适合处理快速开关事件和瞬态分析。
-
对于非常复杂的电路或者需要大量矩阵运算的系统,PSIM可能不如Simulink高效。
-
由于PSIM主要针对电力电子系统,对于信号处理或控制系统等其他类型的复杂电路,其效率可能不如Simulink。
-
优势:
-
局限性:
Simulink:
-
Simulink作为一个多领域仿真工具,可以处理电子、控制、信号处理、通信等多个领域的复杂系统。
-
依托于MATLAB的强大数学计算能力,Simulink能够处理复杂的算法和数学模型,适合进行系统级建模和仿真。
-
Simulink提供了丰富的模块库和工具箱,可以方便地构建和扩展模型,对于需要频繁修改和迭代的复杂电路设计非常有用。
-
在处理非常复杂的电路时,Simulink的计算效率可能会受到影响,尤其是在模型规模非常大时,可能需要较长的仿真时间和更多的计算资源。
-
优势:
-
局限性:
个人使用体验:
去年基于Simulink搭建了一个较为复杂的双向DCDC模型,并加载了多个c语言文件进行采样滤波,环路控制与状态切换功能的仿真,速度慢到无法接受,而且在与visual studio进行单步联调时Matlab容易闪退,最后只好切换到PSIM中进行同等功能的建模仿真,速度确实快了不少。实际产品软件的问题基本都能在模型中复现并调测,极大地加快了开发效率。
另外当前我使用的PSIM版本为V9.1,visual studio使用的是2010版本。若需使用其他版本,方法也是类似的。
2 为什么选择加载DLL方式?
对于单一的C文件仿真,可以直接在PSIM中使用简化C模块(Simplified C block)或通用C模块(General C block)来实现。
以通用C模块(General C block)为例,以下是常规的步骤:
-
添加通用C模块:
-
在菜单栏中,选择“Elements” -> “Other” -> “Function Blocks” -> “C block”。
-
-
配置C模块:
-
放置通用C模块到电路图中,并双击打开。
-
在打开的界面中,可以选择不同的功能类型,如初始化(OpenSimUser Fcn)、运行时(RunSimUser Fcn)和退出时(CloseSimUser Fcn)的代码块。
-
-
编写C代码:
-
在“RunSimUser Fcn”模块中编写具体的执行代码。
-
-
设置输入输出:
-
输入输出端口在通用C模块中使用
in
和out
数组的形式。
-
-
编辑图形:
-
同样可以使用“Edit Image”功能来自定义模块的图形符号。
-
-
测试电路:
-
搭建电路并进行仿真,验证C模块的功能。
-
由于每个C程序块中的变量对于其他C程序块来说是不可见的。要将值从一个C程序块传递到另一个C程序块或其他电路部分,只能通过C程序块的输入输出端口。所以如果仅仅是仿真下简单的逻辑与算法,那么可以使用该方法。但是如果需要使用多个C语言的仿真,那么就会比较复杂。
从嵌入式产品的软件开发而言,即便扣除驱动层代码,服务层和业务层的功能代码通常会有多个甚至几十个源文件。举个例子,对于常规的开关电源的软件功能模块,通常包含采样滤波,环路控制算法,事件检测诊断,状态机等。因此,在这个使用场景下,建议使用dll的方式进行。
3 PSIM加载dll的方法
加载dll的前提是,咱们得先有个dll。具体方法可以参考下述链接,这里不再赘述。
PSIM中动态链接库DLL使用方法_psim 中的dll block中unable to load the dll file-CSDN博客
唯一需要注意的是
1. 若发现PSIM加载dll之后,点击运行时提示找不到相关函数,可以参考下述的方法设置一下。
- 写一个def文件,强制导出此函数,其中双引号的名字要与你导出的文件名一致
- 在项目属性--链接器--输入--模块定义文件,选择刚才的def文件
2. 当PSIM已经加载了dll时,若需要在visual studio中重新编译生成dll,先要将PSIM关闭该文件,否则会提示生成失败。
为了演示方便,我这边创建了一个简单的PSIM文件和包含了多个c语言文件的dll工程,通过dll的功能函数将两个输入分别进行相加和取平均值操作。
4 在Visual studio中联调
1. 打开Visual studio dll工程,并打开PSIM软件。
2. 在Visual studio中选择工具 -- 附加到进程 --选择PSIM.exe
3. 在刚才的对应的.c文件中 你想调试的地方添加断点
4. 在PSIM中运行模型
5. 此时你就可以看到代码会在你断点处停止,接下来你就可以根据需要愉快的进行调试,如单步调试,通过监视窗口查看当前作用域下的变量等visual studio丰富的调试工具了。
PSIM与VS联合调试
内容回顾:今天我们比较了PSIM和Simulink在电子仿真领域的优缺点,简单而言PSIM适合电力电子系统仿真并且在此类场景中仿真速度有优势,而Simulink适用于多领域的复杂系统建模。同时还介绍了在PSIM中加载和使用DLL的方法,包括配置C模块、编写C代码、设置输入输出端口和测试电路。此外,提供了在Visual Studio中与PSIM进行联合仿真和调试的步骤。
彩蛋:微信公众号-“ 芯连心嵌入式设计交流”,对话框回复“PSIM DLL”,可以下载推文中的示例,包含PSIM工程和visual studio工程源码。