首页/文章/ 详情

GCKontorl之软件在环(SiL)仿真

2年前浏览993

摘要:软件在环SiL(Software in the Loop)仿真,是将仿真工程中的某些仿真模型或控制策略,采用写手代码替代,完成软件在环(SiL)的仿真测试及验证。特别是C语言在嵌入式系统有广泛应用,GCKontrol用C-Code模块来实现对用户自定义C语言代码的支持,可满足嵌入式代码的测试验证,或满足不同应用的需求。本文将介绍GCKontrol模块C-Code模块及应用。



 

01

GCKontrol支持用户自定义C代码


 
GCKontrol用C-Code模块支持用户自定义C代码,用于实现软件在环(SiL),SiL仿真测试,嵌入式代码的测试,或满足不同应用的需求。

图1:GCKontrol – SiL仿真测试

C语言有以下四大优势:

1)简洁紧凑、灵活⽅便

C语言把⾼级语⾔的基本结构和语句与低级语⾔的实⽤性结合起来。

2)运算符丰富

C的运算类型极其丰富,表达式类型多样化,灵活使⽤各种运算符可以实现在其它⾼级语⾔中难以实现的运算。

3)数据结构丰富

C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共⽤体类型等,能⽤来实现各种复杂的数据类型的运算,使程序效率更⾼。

4)C是结构式语⾔

结构化⽅式可使程序层次清晰,便于使⽤、维护以及调试。C语⾔是以函数形式提供给⽤户的,这些函数可⽅便地调⽤,并具有多种循环、条件语句控制程序流向,从⽽使程序完全结构化。


 

02

GCKontrol C-Code模块介绍


 
由于C语言强劲的优势,其应用领域和使用群体十分广泛。为了满足用户复杂的建模场景,编程习惯,减少建模操作的繁琐性,解决用户系统设计对C语言的依赖问题,或是在GCKontrol中实现软件在环(SiL),我们在GCKontrol中开发了C-Code模块,用户可以把自己编辑的C代码脚本应用到C-Code模块,以实现想要的算法或者模块需求。

目前C-Code模块支持:

1) 用户自定义模块内部算法和输入输出端口及全局参数;

2) 用户对第三方库-lib静态库的调用;

3) 导入C-Code模块自带的模板,定义编辑基于C语言的功能脚本,适配C-Code模块格式;



 

03

C-Code模块案例(PMSM工程)介绍


 
3.1. 本案例(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(矢量控制)模块输出的三相电压。三相输出电压如下:

Ua = ma * Udc
Ub = mb * Udc

Uc = mc * Udc

三相输出功率为:

Power_a = Ia * Ua
Power_b = Ib * Ub

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工程)仿真结果


 
PMSM工程如下:

仿真结果如下:

电机控制试验
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-09-29
最近编辑:2年前
世冠科技
国内领先的系统仿真工业软件和数...
获赞 28粉丝 17文章 146课程 1
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈