仿真软件GCKontorl之软件在环(SiL)仿真

2023-05-16

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

一、GCKontrol支持用户自定义C代码

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

图1:GCKontrol – SiL仿真测试

C语言有以下四大优势:

1)简洁紧凑、灵活⽅便

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

2)运算符丰富

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

3)数据结构丰富

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

4)C是结构式语⾔

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

二、GCKontrol C-Code模块介绍

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

目前C-Code模块支持:

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

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

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

三、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模块文件导入及  全局参数设定

四、本案例(PMSM工程)仿真结果

PMSM工程如下:

仿真结果如下:

总结:对C代码的支持,使GCKontrol可以适配更多的应用场景,支持更多的功能,应用于更多的领域。特别是对软件在环(SiL)、嵌入式算法、用户自定义算法的测试验证等等。例如:用GCKontrol做被控对象模型,用手写C代码实现控制策略算法等等。把C-Code模块和GCKontrol的PythonAPI相结合,可实现软件在环(SiL)自动化测试。C-Code模块化的形式使模型可视化更强,操作更加简单,同时C-Code模块支持多个模块使用同一个C代码脚,实现了代码的复用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仿真软件GCKontorl之软件在环(SiL)仿真 的相关文章

  • 服务器后端开发,学什么编程语言?

    服务器后端开发 xff0c 学什么编程语言 xff1f 技术 后台开发 xff0c 目前主流的编程语言是Java xff0c Go语言 xff0c C 43 43 xff0c python 以及php 个人建议学Java xff0c 主流中
  • ROS基础:功能包的创建与编译

    创建 如果你使用的是catkin编译系统 xff0c 那么可以很容易地创建一个功能包 首先进入你的工作空间的src目录下 xff1a cd catkin ws src 然后运行catkin create pkg命令 xff1a catkin
  • 关于TF转换信息(Transforms)的理解

    本文主要内容参考自ROS wiki tf Overview Transformations xff0c 在加入了自己的一些理解的同时 xff0c 我也对原文进行了适当的修改 原文使用Creative Commons Attribution
  • RealSense SDK 开发笔记(一)环境配置

    转载请注明出处 2017 以后的SDK结构必然趋于稳定 xff0c 也就会多一些新特性和新设备的支持 xff0c 配置流程不再变化 2016 2 xff1a 目前SDK版本是2016R1 xff0c 配置过程一模一样 xff0c SDK主要
  • 闭包方法的学习

    相关链接 swift中使用 64 noescape的正确姿势 文档闭包 闭包可以捕获和存储其在上下文中任意常量和变量的引用 被称为包裹常量和变量 Swift会为你管理在捕获过程中涉及到的所有内存操作 在函数章节中介绍的全局和嵌套函数也是特殊
  • CMakeLists常用方法

    我们在编译一个C C 43 43 项目时有时候是需要我们阅读编译脚本来确定编译时的参数 CMakeLists txt是比较常见的编译脚本 xff0c 这里简单介绍几个常用的函数 cmake minimum required 设置cmake的
  • halcon中Image的像素类型

    在学习halcon算子sub image ImageMinuend ImageSubtrahend ImageSub Mult Add 时 xff0c 在样例中遇到了一个操作 This example demonstrates how to
  • GitHub Action构建并推送DockerHub

    前言 偶尔会构建一些自己用的容器 xff0c 之前一直用的是Docker提供的构建服务 xff0c 然而Docker开始收费了 xff0c 那只能另寻他法 之所以不本地构建推送 xff0c 是因为构建的时候经常因为网络问题 xff0c 访问
  • BIO与NIO的方式实现文件拷贝

    面试题 编程实现文件拷贝 xff08 这个题目在笔试的时候经常出现 xff0c 下面的代码给出了两种实现方案 xff09 span class hljs keyword import span java io FileInputStream
  • 一路(16)走来,一起(17)依然同行

    来个自我介绍吧 xff0c 我叫 xff0c 计算机科学与技术专业 xff0c 本科 xff0c 这句话应该是16年整整一年说过最多的 那么我去年整整一年我又有那些收获呢 xff0c so xff0c 我也来个年终总结 xff0c 年初展望
  • 电路城(www.cirmall.com)-学习IoT,BLE编程绝佳平台,nRF52832 BLE(蓝牙低能耗)开发板

    该nRF52832 BLE xff08 蓝牙低能耗 xff09 开发板是一款具有温度 xff0c 湿度 xff0c 环境光和加速度传感器的蓝牙低能耗开发板 该蓝牙开发板具有ARM Cortex M4F CPU的nRF52832 BLE So
  • Linux上jmeter-server启动失败

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 Jmeter server启动失败 xff1a Cannot start Unable to get local host I

随机推荐

  • Mysql的七种join

    对于SQL的Join xff0c 在学习起来可能是比较乱的 我们知道 xff0c SQL的Join语法有很多inner的 xff0c 有outer的 xff0c 有left的 xff0c 有时候 xff0c 对于Select出来的结果集是什
  • shell脚本实现自动保留最近n次备份记录

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 项目中出现的问题 某天上午服务器出现卡顿特别严重 xff0c 页面加载速度奇慢 xff0c 并且某些页面刷新出现404的问题
  • Java实现终止线程池中正在运行的定时任务

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 源于开发 最近项目中遇到了一个新的需求 xff0c 就是实现一个可以动态添加定时任务的功能 说到这里 xff0c 有人可能会说
  • TCP 粘包问题浅析及其解决方案

    最近一直在做中间件相关的东西 xff0c 所以接触到的各种协议比较多 xff0c 总的来说有TCP xff0c UDP xff0c HTTP等各种网络传输协议 xff0c 因此楼主想先从协议最基本的TCP粘包问题搞起 xff0c 把计算机网
  • Redis协议规范(译文)

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 Redis客户端使用名为RESP xff08 Redis序列化协
  • Netty 源码中对 Redis 协议的实现

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 近期一直在做网络协议相关的工作 xff0c 所以博客也就与之相关
  • 高性能无锁队列 Disruptor 初体验

    原文地址 xff1a haifeiWu和他朋友们的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 最近一直在研究队列的一些问题 xff0c 今天楼主要分
  • Vultr(云服务器)安装GUI图形化界面(已解决)

    服务器 xff1a Vultr OS xff1a Ubuntu 14 04 步骤 xff1a 1 远程登陆到服务器 2 确保所有的包和依赖关系是最新的 apt span class hljs keyword get span update
  • WorkerMan客户端连接失败

    workerman客户端连接失败 今天访问客服聊天功能发现不能发送信息 xff0c 然后看到是因为 WebSocket 连接失败 xff0c 图如下 xff1a 根据字面意思已经了解了问题是因为连接拒绝 xff0c 那么为什么会拒绝呢 xf
  • 2020计算机技术类,部分人工智能与软件工程SCI一区期刊列表(基于letpub数据)

    网上找了很久将计算机技术作为独立大区的期刊列表 xff0c 还是没有找到 所以我决定根据letpub的数据 xff0c 自己整理下 xff0c 方便以后查看 注 xff1a 由于2020与2019年的数据存在一些冲突 xff0c 部分数据可
  • IoT -- 解读物联网四层架构

    本文以物联网四层架构为基础 xff0c 从物联网产品设计的角度来解读每层架构的功能以及主要内容 xff0c 旨在为物联网产品设计以及实现思路感兴趣的物联网产品或研发人员有些帮助 通过互联网 xff0c 人和人之间可以传递和交流信息 物联网
  • 【putty无法连接Linux-centos7】

    一 二 1 vmware中打开虚拟机 xff0c 选择网络适配器 xff0c 选择模式 选择桥接模式 xff0c 则跟电脑主机一样使用以太网 xff0c 可以联网 xff0c 也可以ping通其他主机 xff0c 选择vmnet8 NAT模
  • 我的视觉SLAM学习的小小入门---Ubuntu18配置VINS-MONO

    前言 作为一名才接触视觉SLAM的菜鸟 xff0c 除了捧着高翔老师的书看着那晦涩难懂的代码与理论 xff0c 就是跟着高翔老师的课程囫囵吞枣地学着 但是似乎总不见成效 xff0c 时常想象着何时可以像大佬们一样建图 Vins mono可算
  • 关于Ubuntu(Debian)软件源报错问题及解决

    问题 xff1a 在执行sudo apt get update时出现以下报错 xff0c 查询得知是因为换源以后 xff0c 新的下载源没有公钥 W GPG error http mirrors aliyun com debian bust
  • Cmake常用指令

    1 SET SET lt variable gt lt value gt CACHE lt type gt lt docstring gt FORCE 将缓存条目variable设置为值 lt value gt xff0c 除非用户进行设置
  • [LeetCode] Two Sum 两数之和 java实现 C++实现

    LeetCode Two Sum 两数之和 java实现 C 43 43 实现 Given an array of integers return indices of the two numbers such that they add
  • FreeRTOS学习总结 (一)

    FreeRTOS学习总结 一 移植 上图是从FreeRTOS官网下载的源文件目录 xff0c 移植所需要的文件都在Source文件夹下 如上图 xff0c 在工程文件夹下创建FreeRTOS文件夹 xff0c 子文件夹和相应文件 xff0c
  • FreeRTOS学习总结 (二)

    FreeRTOS学习总结 四 软件定时器 软件计时器由FreeRTOS内核实现 xff0c 并在其控制之下 它们不需要硬件支持 xff0c 也与硬件计时器或硬件计数器无关 软件计时器功能是可选的 要使用软件计时器功能 xff1a 1 构建F
  • 网络编程及三大协议(TCP + UDP + Http)

    网络编程及三大协议 xff08 TCP 43 UDP 43 Http xff09 一 网络编程 1 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备 xff0c 通过通信线路连接起来 xff0c 在网络操作系统 xff0
  • 仿真软件GCKontorl之软件在环(SiL)仿真

    摘要 xff1a 软件在环SiL Software in the Loop 仿真 xff0c 是将仿真工程中的某些仿真模型或控制策略 xff0c 采用写手代码替代 xff0c 完成软件在环 SiL 的仿真测试及验证 特别是C语言在嵌入式系统