在使用PSIM的C语言模块时,一直以为Simplified C Block
模块 和 C Block
模块用法基本是一样的,但是今天在仿真BUCK电路时,同样的代码使用C Block
模块仿真结果就正常,使用Simplified C Block
模块仿真的结果始终都不对。于是通过几个小测试,发现这两个模块使用起来差别还是挺大的。
下面就来分析对比一下这两个C模块的区别。
分别使用 C Block
模块和Simplified C Block
模块写个简单的测试程序。
在 C Block
模块中,初始化时定义一个变量cnt
,然后在函数中每次给变量加1,最后输出变量的值。
在 Simplified C Block
模块中,定义一个变量cnt
,然后每次给变量加1,最后输出变量的值。
C Block
模块和Simplified C Block
模块代码在每个时间步长间隔中都会被系统调用一次。系统的时间参数设置如下:
时间步长为1us
,也就是每1us
系统就会调用一次模块。系统总仿真时间为0.01s
,也就是说仿真在0.01s
之后就会停止。
下面看这两个模块的输出结果。
C Block
模块的输出值随着时间一直增加,而Simplified C Block
模块的值一直是1。由于系统会每1us调用一次模块,C Block
模块中的变量值一直增加,说明C Block
模块的这个变量是全局变量。而Simplified C Block
模块的值一直是1,说明Simplified C Block
模块中的变量时局部变量,相当于一个函数,每次调用的时候,值都会被重新初始化,要保持值不变,就需要将值设置为静态变量。
将Simplified C Block
模块中的值修改为静态变量,然后再次查看波形。
这时两个模块的值都会随着时间的增加而逐渐增加的。
难道仅仅是全局变量和局部变量的区别吗?下面再用BUCK电路的代码测试一下。
为了测试简单,这里省略了硬件电路,输入的两路信号都设置为固定值。然后通过PID算法计算误差,在通过输出端口输出。
C Block
模块代码如下:
Simplified C Block
模块代码如下:
这两个模块里面的算法是一样的,唯一的区别就是把Simplified C Block
模块里面的变量全部定义为静态变量。运行结果如下:
V1是C Block
模块的输出曲线,V2是Simplified C Block
模块的输出结果,将波形放大观察。
可以看到V1的输出结果是一直维持不变的,直到下一次新的结果到来。而V2的输出结果只是在代码执行的过程中输出一次,一但代码执行结束,那么输出值就直接变成了0。相当于V1的输出结果有锁存功能,V2输出结果没有锁存功能。虽然V2每次计算的结果是正确的,但是由于结果不能保存,就会导致在BUCK电流闭环控制中执行结果不正确。
通过这个测试可以发现C Block
模块输出的结果也相当于是全局变量,会一直保存在内存中,而Simplified C Block
模块输出的结果相当于调用了一个函数,在函数内部值可以保存,但是退出函数后,数据就看不到了。这个特性和函数里面定义的变量比较像,一个具有全局属性,一个具有局部属性。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://hxydj.blog.csdn.net/article/details/122984535
内容来源于网络,如有侵权,请联系作者删除!