摘要:软件在环SiL(Software in the Loop)仿真,是将仿真工程中的某些仿真模型或控制策略,采用写手代码替代,完成软件在环(SiL)的仿真测试及验证。特别是C语言在嵌入式系统有广泛应用,GCKontrol用C-Code模块来实现对用户自定义C语言代码的支持,可满足嵌入式代码的测试验证,或满足不同应用的需求。本文将介绍GCKontrol模块C-Code模块及应用。
01
GCKontrol支持用户自定义C代码
C语言有以下四大优势:
1)简洁紧凑、灵活⽅便
C语言把⾼级语⾔的基本结构和语句与低级语⾔的实⽤性结合起来。
2)运算符丰富
C的运算类型极其丰富,表达式类型多样化,灵活使⽤各种运算符可以实现在其它⾼级语⾔中难以实现的运算。
3)数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共⽤体类型等,能⽤来实现各种复杂的数据类型的运算,使程序效率更⾼。
4)C是结构式语⾔
02
GCKontrol C-Code模块介绍
目前C-Code模块支持:
1) 用户自定义模块内部算法和输入输出端口及全局参数;
2) 用户对第三方库-lib静态库的调用;
3) 导入C-Code模块自带的模板,定义编辑基于C语言的功能脚本,适配C-Code模块格式;
03
C-Code模块案例(PMSM工程)介绍
本案例以PMSM(永磁三相同步电机)工程为背景,来描述C-Code模块在该工程中的应用。
如下图所示,基于GCKontrol实现的PMSM工程,该工程有四大部分:
1)FOC矢量控制子系统;
2)逆变器模块;
3)电机模型子系统;
4)机械方程模块;
其中第2个模块逆变器由C-Code模块实现计算,第4个模块机械方程由C-Code模块实现计算。本文重点在于介绍C-Code模块在GCKontrol工程中的用法,故不对本工程的原理做深入介绍,如FOC矢量控制子系统和电机模型子系统等。
图2:GCKontrol PMSM(永磁三相同步电机)工程
该工程运行后,两个C-Code模块的输出如下:
图3:GCKontrol PMSM工程输出
3.2 GCKontrol的C-Code模块基本机制
GCKontrol的C-Code模块基本调用机制是:需要两个核心文件*.h(C语言头文件), *.c(C语言源文件)。以下对C-Code自带的模板操作中,可快速查看*.h和*.c,及其需要包括的定义及函数。
双击C-Code模块(或右键C-Code模块),可得属性对话框:
图4:C-Code模块数据设置
点击1“下载模板”,加载userCode.c后可出现上图中2.1~2.4内容:输入变量、输出变量、全局参数。点击3“打开文件夹”,可看到userCode.h和userCode.c两个C语言文件。下面分别加以介绍。
3.2.1 C-Code头文件*.h的核心内容介绍
1)用户输入结构体InVar,可在其中定义更多输入元素。
2)用户输出结构体OutVar,可在其中定义更多输出元素。
3)用户的全局参数结构体ParVar,可在其中定义更多全局参数。
4)用户初始化函数userInit,用于初始化输入、输出及参数等。
5)用户入口函数(主函数)userDoStep,用户实现的核心内容入口函数。
3.2.2 C-Code源文件*.c的核心内容介绍
1)初始化函数实现userInit,此函数可初始化输入、输出及参数等。
2)用户入口函数实现userDoStep, 此函数是用户实现的核心内容入口函数。
3.2.3 C-Code调用第三方库依赖方法介绍
很多手写代码会用到静态链接库(lib 文件),lib文件在编译的时候需要设置链接(link),也要有头文件的依赖(*.h)。GCKontrol C-Code模块的手写代码支持对第三方库依赖(lib文件)的调用。该功能拓展了GCKontrol的应用范围,以适配多种不同的应用背景。
GCKontrol配置第三方库依赖的方法是:双击C-Code模块(或右键C-Code模块),可得属性对话框,点击左侧“路径设置“,可以设置第三方库依赖-静态链接库,可以设置一个或多个外部库依赖项,如下图所示:
图12:C-Code引用第三方库/依赖的设置
在本案例的机械方程C-Code模块实现中,实现了对第三方库的调用,并将重点说明其使用方法。
3.2.4 C-Code模块引用第三方库依赖扩展说明
如3.2.3中C-Code模块“路径设置”页面所示,引用第三方库依赖有下列扩展:
1.附加包含目录:
1)指定一个或多个要添加到包含路径中的目录:当目录不止一个时,请用分号分隔。
2)支持本机电脑配置的环境变量。
3)支持本系统环境变量(如ProjectDir、WorkSpaceDir)
2.附加库目录:
1)只支持.a的静态库
2)支持本机电脑配置的环境变量
3)支持本系统环境变量(如ProjectDir、WorkSpaceDir)
3.附加依赖项
1)指定要添加到链接命令行的附加项[例如:libgc32.a]
4.环境变量格式如下
1)$(ProjectDir)/
3.3 三相逆变器的C-Code模块
图13:逆变器C-Code模块图
3.3.1 三相逆变器的数学原理
下面公式中Udc为直流母线电压,ma, mb, mc分别为FOC(矢量控制)模块输出的三相电压。三相输出电压如下:
Uc = mc * Udc
三相输出功率为:
Power_c = lc * Uc
三相总功率为:
PowerAC = Power_a Power_b Power_c
直流电流输出:
Idc = PowerAC/Udc
3.3.2 逆变器C-Code模块的实现
由3.3.1里三相逆变器的数学原理可定义:
输入变量:ma, mb, mc, la, lb, lc, udc
输出变量:Ua, Ub, Uc, Idc
参数:无
3.3.2.1 逆变器C-Code头文件实现
由以上定义可实现逆变器C语言头文件inverter_model.h,如下所示:
图14:逆变器C-Code模块头文件
3.3.2.2 逆变器C-Code源文件实现
依据3.3.1中三相逆变器的数学原理,可用C语言实现逆变器数学模型,此案例工程中代码源文件为inverter_model.c,在userInit函数中对输出参数初始化,在userDoStep()函数中实现了三相逆变器的数学模型。如下所示:
图15:逆变器C-Code模块源文件
3.4 机械方程C-Code模块的实现
图16:机械方程C-Code模块图
3.4.1 机械方程的数学原理
下面对该机械原理及参数加以简单介绍
1)输入误差:diff_T = Te – TL,其中Te为案例工程中电机模型的输出力矩TL为外部负载力矩。
2)转动惯量:Inertia为电机的转动惯量,为常量,此处设为常量1.
3)极对数:number_pole为电机的极对数,为常量,此处设为常量4.
由公式:diff_T=Inertia * dw/dt / number_pole(力矩=转动惯量*角加速度 /极对数),其中w为电机转速(单位:rad/s)。由以上原理可得:
1)diff_T = Te – TL,单位:Nm
2)w = integrator(diff_T) * number_pole,单位:rad/s
重点说明:上述用到积分integrator(diff_T),所以积分步长stepTime是该原理中一个关键参数(本案例中积分步长stepTime与调度步长一致)。
3.4.2 机械方程C-Code模块的实现
由3.4.1里机械方程的数学原理可定义:
输入变量:Te, TL
输出变量:speed(即原理描述中的w)
参数:Inertia, number_pole, stepTime
3.4.2.1 机械方程C-Code中第三方库依赖的实现
在机械方程的数学原理描述中,没有第三方库依赖,但为了在本文中重点介绍C-Code可以引用第三方库依赖,我们对方程diff_T = Te – TL中的Te-TL进行了封装,封装为一个静态库libsub.a,该库中封装了API接口函数Sub(double a, double b)。下面简单介绍这一封装及编译为静态库的过程,分下面4步。
1)头文件sub.h
2)源文件sub.c
3)基于MinGW编译器对其编译为静态链接库libsub.a
3.1)用下面命令对上述sub.c编译为sub.o
gcc -o sub.o -m64 -Wall -fPIC -c sub.c
3.2)用下面命令对sub.o编译为libsub.a
ar -crv libsub.a sub.o
3.3)生成下面两个文件,其中libsub.a是C-Code模块要引用的第三方库
图17:编译好的libsub.a库
4)对该第三方库进行如下配置
图18:机械方程C-Code模块libsub.a库的配置
3.4.2.2 机械方程C-Code中头文件的实现
由机械方程的输入,输出,参数的定义可实现机械方程的C语言头文件machine_equation.h,如下所示:
图19:机械方程C-Code模块头文件
3.4.2.3 机械方程C-Code中源文件的实现
依据3.4.1中机械方程的数学原理,可用C语言实现机械方程数学模型,此案例工程中代码源文件为machine_equation.c,在userInit函数中对输出参数初始化,在userDoStep()函数中实现了机械方程的数学模型,在该函数中,特别调用了第三方依赖库sub(double a, double b)函数。如下所示:
图20:机械方程C-Code模块源文件
3.4.2.4 机械方程C-Code代码上传及全局参数设定
右单击machine_equation C-Code模块,在属性对话框中“数据设置”页,点击“上传”,将3.4.2.3中的machine_equation.c导入(machine_equation在相同目录中)。关在全局参数中,对三个参数值进行设定。如下图所示
图21:机械方程C-Code模块文件导入及 全局参数设定
04
本案例(PMSM工程)仿真结果