半实物仿真
回看自己的博客已经有五年之久了,最近几年也只是逛逛园子,看看别人写的文章和新闻板块,也可能是这两年从事的工作偏离了大众,对于一些新语言、新工具、也只能看看了,压根不是很了解。
园子里面相对于工控、测试、仿真人员基本很少,相关文章也很少,工业控制方面编程语言NI Labview图像化、数据流、模块化的编程语言确实属于小众了;对于半实物仿真测试有兴趣的或者对NI VeriStand仿真平台想了解的,希望可以对于你们有帮助;以及后续基于NI VeriStand仿真引擎开发自己的HIL(硬件在环)仿真测试环境;先熟悉下,NI的HIL仿真平台NI VeriStand;
1. 概述
VeriStand是美国 National Instruments公司专门针对HiL仿真测试系统而开发出的软件环境。
VeriStand是一种基于配置的软件环境,它简单易用,无需编程就完成实时测试系统的创建,实现HIL测试中所需的各种功能。NI VeriStand能够配置模拟、数字和基于FPGA的硬件I/O接口;能够配置激励生成、记录数据、计算通道和事件警报;能够从NI LabVIEW和MathWorks Simulink®等建模环境中导入控制算法和仿真模型;能够利用操作界面实时在线监控运行任务并与之交互。
本文档介绍了NI VeriStand各项主要功能的使用方法,并按照通用的开发测试顺序编写,主要内容包括:
- 创建软件模型(基于Matlab);
- 创建MiL测试系统;
2. 创建软件模型(基于Matlab)
Veristand支持市面上主流的图形建模工具以及代码建模开发工具所生成的模型库的导入。包括MathWorks, Inc.的Simulink®软件、ITI的SimulationX、Maplesoft的MapleSim、Gamma Technologies Inc.的GT-POWER,YHSIM以及其他编程环境所创建并编译的函数或模型代码。本文介绍基于matlab2015b以及Veristand2015 sp1版本的模型建立。Veristand可以从NI官网下载,程序安装顺序,先装matlab R2015b开发环境,再装NI VeriStand。
NI VeriStand可以利用*.dll文件导入由Matlab/Simulink创建的算法或仿真模型,下图所示为Simulink模型导入NI VeriStand的过程:
注意:veristand 2015 sp1版本支持
不同版本的veristand支持不同版本的matlab生成的模型库,可以从ni官网查找版本对应;
2.1 创建被控对象模型
下面过程将演示如何将Simulink中的发动机Engine模型,转换为VeriStand可用的被控对象模型。
搜索Modeling Engine Timing Using Triggered Subsystem打开Simulink模型: Modeling Engine Timing Using Triggered Subsystem另存到新建工作目录中,例如 D:\NIVS_HandsOn,为避免和原有模型冲突,重命名为Engine.mdl。
该发动机模型要求的输入信号为
- Throttle Angle 节气门开度
- Drag Torque 拖拽扭矩(负载扭矩)
输出信号为
- Engine Speed 发动机转速
关于该模型的具体信息,请参考Simulink帮助文档。
运行后结果如下所示,上图为发动机模型所需输入信号,黄色曲线为负载扭矩,紫色曲线为节气门开度;下图中为发动机模型计算的输出信号,黄色曲线为发动机转速。
- 0~5s,节气门开度不变,负载扭矩在2s时,由25 Nm 下降到20 Nm,发动机转速因负载扭矩变小而提高;
- 5s时,节气门开度增加,负载不变时,发动机转速快速升高;
- 8s时,负载扭矩再次增加,节气门开度不变,转速下降。
1.正确安装VeriStand后,在Simulink Library Browser 中会自动添加 NI VeriStand Blocks,如下图所示:
2.修改模型
将模型中需要做映射的端口,用相应的NIVeriStand In 和NIVeriStand Out 替代;
完成修改后的发动机模型如下所示:
3.设置编译环境并编译
1) 打开Simulink模型的Configuration Parameters (快捷键:Ctrl+E),
2) 在Code Generation中,指定System target file为NIVeriStand.tlc,点击OK确认。
注意:如果实时目标机为cRIO系列,此处要选择NIVeriStand_VxWorks.tlc
3) 回到Solver页面,选择定步长求解器:fixed step-size ordinary differential equation(ODE) solver
注意:NI VeriStand只支持使用定步长的常微分方程求解器
4) 指定步长:Fixed-step size (fundamental sample time)为0.001,也就是1kHz
5) 注意:步长越小仿真模型计算越准确,但相应的会消耗更多技术资源。修改完步长后,要再次运行仿真模型,观察结果,既要避免因步长选择过大,出现如无法收敛,计算精度无法满足要求,又要避免过小的步长造成cpu运算负担过大,影响实时性。
6) 点击 Build Model图标或者Ctrl + B,开始编译
7)
8) 编译成功后,Matlab的Command Windows中出现下列提示,
9) ### Successful completion of Real-Time Workshop build procedure for model: ModelName,
10)并生成与Engine.mdl同名的Engine.dll文件,保存在新生成的Engine_niVeriStand_rtw文件夹内.
2.2 创建控制器模型
在Simulink提供的Demo Engine Timing Model with Closed Loop Control中包含了控制器ECU的算法。我们需要把其中的控制器(Controller)算法从闭环模型中分割出来,建立单独的ECU模型,并编译为对应的 *.dll文件。
Controller采用PI控制算法,可根据目标发动机转速,结合发动机模型中的负载扭矩,计算出节气门开度,最终使发动机实际转速与目标转速一致。
下图中黄色曲线为发动机负载曲线,紫色曲线为控制器输出的节气门开度
1) 2s时,由25 Nm变为20 Nm
2) 8s时,由20 Nm变为25 Nm
下图中黄色曲线为目标转速(Speed Setpoint),在5s时由2000 rpm跳变为3000 rpm,紫色曲线为实际转速。
- 分割、修改ECU模型
1) 打开所需的Demo:Engine Timing Model with Closed Loop Control
2) 提取模型中的Controller子模块
3) 添加NIVeriStand In、NIVeriStand Out和NIVeriStandSignalProbe,另存为Ecu.mdl。修改后的ECU模型如下所示:
4) 设置编译环境并编译,最终生成所需的Ecu.dll文件。具体配置过程请参考发动机模型转换部分。
3. 创建MiL测试环境
在上一章中,我们准备好了Engine和Ecu的软件模型,在本章中,我们会将其导入到NI VeriStand中,创建一个MiL (Model-in-the-Loop) 测试环境,并介绍如何在Work Space中添加控件,控制和观察Engine、Ecu的行为。
1.运行 NI VeriStand
Start » Program Files » National Instruments » NI VeriStand » NI VeriStand.
2.新建一个项目(Create a new project).
1) 选择 File » New Project.或者直接选择NEW NI VeriStand Project
2) 在Project Name中输入项目名称:ecu hil hands on.
3) 指定项目根目录 Project Root Folder 到 <Public Documents>\National Instruments\NI VeriStand 2015 \Projects
4) 勾选Create folder for project.
5) 点击OK确认.
3.点击 Configure Project, 打开项目浏览器Project Explorer.
项目浏览器(Project Explorer) 用于配置测试所需的全部设置。通过Project Explorer可以部署(Deploy)和运行(Run)系统定义文件。项目浏览器包括所有运行和自动化测试所需关键的参数,同时也可以添加定制文件
4.展开 System Definition File 节点.
5.鼠标右键单击 <ProjectName>.nivssdf 文件,选择 Launch System Explorer.
系统浏览器 (System Explorer) 用于创建NI Veristand系统定义文件。系统定义文件是一个配置NI Veristand引擎特性的文件。通过添加,删除和修改位于系统浏览器左部的各项配置可以定义各种属性,包括NI VeriStand引擎的执行方式、硬件端口、计算通道、对仿真模型的控制、报警,执行顺序以及管理通道之间的映射关系。完成系统定义文件的设置后,它将被部署到NI VeriStand 引擎并开始运行。
6.添加发动机Engine模型
1) 展开Targets » Controller,点击Simulation Models;
2) 添加模型 Add Simulation Model.
3) 将目录转换到Engine.dll所在目录
4) 选择Engine.dll,单击 OK.确认
发动机模型有2个输入 (节气门开度和负载扭矩) 和1个输出(发动机输出)。
7.添加控制器ECU模型
1) 点击 Simulation Models,添加仿真模型 Add Simulation Model;
2) 选择Ecu.dll,单击 OK 确认。
控制器模型包含2个输入(目标转速rpm和实际转速 rad/s)和1个输出(节气门位置)。目标转速由上位机给定、实际转速来自于发动机模型,ECU计算出的节气门位置再传递给发动机模型。
8.调整发动机模型和控制器模型的运行顺序
1) 在System Explorer左侧的树状结构中选择Execution Order;
2) 将发动机模型的色条由Group1拖到Group2
9.现在需要将发动机和控制器模型的输入输出端口映射到一起
1) 从菜单中选择Tools » Edit Mappings
2) 从Sources 来源窗口中选择Simulation Models » Models » Ecu » Outports » throttle angle setpoint
3) 从Destinations目标窗口中选择Simulation Models » Models » Engine » Inports » Throttle Angle.
4) 点击Connect,完成两个信号的相互映射
10.NI VeriStand中也可以实现批量导入导出映射配置文件
1) 在System Mapping的工具条上点击Open.
2) 选择文件映射文件 <Public Documents>\National Instruments\NI VeriStand\Projects\ecu hil hands on\ecu hil mapping.txt.
3) 点击Import,导入剩余的映射配置到VeriStand中.
4) 点击Exit,所有的映射关系会在Mappings的列表中显示出来
11.添加标定参数,实现在线标定功能
1) 展开 Models » Ecu » Parameters,里面包含了Simulink模型中所有Block的参数
2) 双击Source窗口中的 Proportional Gain,添加PI控制器的比例系数
3) 双击Source窗口中的 Integral Gain,添加PI控制器的积分系数
12.在System Explorer的树状节点中选择 Controller。
此页面包括以下组件:
目标规格 - 包括以下组件:
- 名称 - 指定系统的名称。您指定的名称将替换控制器配置树。
- 操作系统 -指定目标的操作系统。您可以从以下选项中进行选择:
- PharLap
- VxWorks
- Windows - (默认)
- Linux_32_ARM
- Linux_x64
- P地址 - 指定目标的IP地址。
- 处理器分配 - 包括以下组件,可用于指定执行VeriStand Engine 的主控制循环和数据处理循环的处理器:
- 主控制回路模式 -指定用于确定运行主控制回路的处理器的模式。您可以从以下选项中进行选择:
- 自动 - (默认)RT调度程序确定在每个迭代执行循环的最佳处理器。
- 手动 -执行您在“ 处理器”字段中指定的处理器上的循环。如果目标具有多个处理器,NI建议您选择此选项,以便RT调度程序不会通过重复确定最佳处理器来危及系统时序。
- 处理器 -指定执行循环的处理器。默认值为-2(任何可用的处理器)。如果指定了无效的处理器,则循环将在第一个可用处理器上执行。
- 数据处理循环模式 -指定用于确定运行数据处理循环的处理器的模式。您可以从以下选项中进行选择:
- 自动 - (默认)RT调度程序确定在每个迭代执行循环的最佳处理器。
- 手动 -执行您在“ 处理器”字段中指定的处理器上的循环。如果目标具有多个处理器,NI建议您选择此选项,以便RT调度程序不会通过重复确定最佳处理器来危及系统时序。
- 处理器 -指定执行循环的处理器。默认值为-2(任何可用的处理器)。如果指定了无效的处理器,则循环将在第一个可用处理器上执行。
- 目标抽取 - 包括以下组件,可用于指定各种循环从主控制循环获取更新数据的频率:
- 数据处理循环 -指定数据处理循环从主控制循环读取值的频率。默认值为1,这意味着每次主控制循环执行时,数据处理循环读取值。但是,如果您知道系统通道表中的值不会频繁更改,则可以指定更高的值来加速整个系统的执行时间。例如,如果指定10,则数据处理循环仅在主控循环的每十次迭代读取值。
- 其他设置 - 包括以下组件:
- 最大流量通道 - 指定VeriStand Engine可以流式传输到主机的通道的最大数量。默认值为512。
- 执行模式 - 指定VeriStand Engine循环的执行模式。您可以从以下选项中进行选择:
- 并行 - (默认)并行执行VeriStand Engine的所有循环。在这种模式下,系统仅写入值,并启动的执行模型执行循环(一个或多个)对系统的第一次迭代中,但它并没有从环路(一个或多个)读取的值。在第二次和随后的迭代中,系统从先前执行的模型执行循环中读取值。这会导致执行模型时出现一个周期的延迟,但可以提高整个系统的执行速度,特别是在多核目标上。
- 低延迟 - 并行执行VeriStand Engine的所有循环,但在系统的每次迭代(包括第一个)中写入值,执行和读取模型执行循环中的值。National Instruments建议您仅在需要最小化输入,型号执行和输出之间的延迟时才选择此模式。在每次迭代中等待模型执行循环读取,执行和写入可能会显着降低系统的执行速度。
- 过滤DAQ错误 -指定是否从NI-DAQmx函数调用中过滤错误。如果您不希望在NI-DAQ设备报告错误时关闭系统,请选择此选项。该数据采集错误系统通道仍寄存器过滤错误,这样就可以监视该信道跟踪误差DAQ如果您选择此选项。
- 滤波器看门狗错误 -指定是否过滤由定时监视器报告的错误。例如,如果将主控制循环设置为高速执行,并且系统包含大型或复杂型号,则如果型号无法快速执行以跟上主控制回路,则看门狗会报告错误。如果您希望NI VeriStand忽略这些错误,请选择此选项。
- FPGA /扫描界面模式 -指定NI扫描引擎在RT目标上的界面模式。您可以使用此选项来覆盖NI扫描引擎的当前设置,这对某些C系列模块(如NI 986x系列设备)非常有用。此选项被禁用,并且对Windows目标没有影响。
- 您可以从以下选项中进行选择:
- 使用当前 - (默认)使用当前配置的NI扫描引擎接口模式。NI VeriStand不会覆盖任何设置。
- FPGA模式 - 将NI扫描引擎设置为LabVIEW FPGA接口模式。
- 扫描模式 - 将NI扫描引擎设置为扫描界面模式。
- DAQ DIO速率 -指定DIO循环读取和写入DAQ数字线路值的赫兹速率。默认值为100 Hz。
- 预热时间 -指定系统在开始记录延迟计数之前必须等待的时间量(以秒为单位)。使用此选项可以避免在初始化系统执行后的最初几秒钟内由于预期的抖动而收到延迟计数错误。
- 定时源设置 -包括以下可用于指定系统时序的组件:
- 主控制回路定时源 -指定系统的定时源。定时源将系统发送给主控制回路。您可以从以下选项中进行选择:
- 自动定时 - (默认)NI VeriStand确定要使用的定时源。如果在机箱配置页面上指定有效的定时设备作为机箱主硬件同步设备,NI VeriStand将使用该设备作为定时源。如果您没有在该页面上指定有效的定时设备,NI VeriStand将选择第一个可用的定时设备。定时设备可以包括具有至少一个模拟输入通道的NI-DAQ设备,任何NI FPGA设备或定制设备。如果系统不包括有效的定时设备,NI VeriStand将使用您指定的目标速率来计时系统。
- DAQ Timing -NI VeriStand在系统中使用NI-DAQ设备作为定时源。将具有至少一个模拟输入通道的NI-DAQ设备添加到配置树以启用此选项。
- 自定义设备定时 -NI VeriStand使用您指定的定制设备作为时序源。
- 目标速率 - 以Hz为单位指定目标速率。默认值为100.如果您的系统定义不包含有效的硬件或定制设备定时源,NI VeriStand将使用此值来计算主控制循环的执行时间。
- 定时源超时 -指定主控制循环在超时之前等待从定时源接收到其第一个刻度的时间(秒)。
- 定时源设置 - [主控制回路定时源:DAQ Timing]指定主控制回路的定时源设置:
- 控制循环从任务 - (默认)创建一个使用采样时钟和睡眠时间的组合的定时源来确定何时向主控制回路发送刻度。
- 任务信号(示例完成) - 每次主DAQ设备从其AI通道中完成采集采样时,都会创建一个定时源,该定时源向主控制回路发送一个刻度。
- 主DAQ设备 - [主控制环路定时源:DAQ时序]指定用作主控制回路的主定时设备的DAQ设备。
- DAQ超时 - [主控制循环定时源:DAQ Timing]指定在超时之前等待DAQ设备传输数据的时间。
- 定时循环休眠时间 - [主控制循环定时源:DAQ Timing]以微秒为单位指定主控循环在每次打勾之后睡眠的时间。默认值为0.如果设备具有外部定时源,则NI VeriStand将忽略此值。
- 主自定义设备 - [主控制环路定时源:自定义设备定时]指定要用作主定时源的自定义设备。任何定时和同步设备或包括定时源VI的任何定制设备可以是主定时设备。
13.改变目标速率Target Rate 为1000 Hz (1 kHz)
14.保存并且关闭系统浏览器System Explorer
至此我们已经导入了所需的模型并且将端口映射到了一起,下面就可以将系统定义文件部署到计算机中并开始运行。通过在Workspace中添加相应控件,可以设定发动机目标转速,然后观察控制器是如何通过调整节气门开度,使发动机达到指定转速的。
15.选择Operate » Run, 部署和执行系统定义文件
16.点击Screen » Screen Properties…从中可以修改页面(screen)名称
1) Name the screen:MIL.
2) 选择 OK.
17.切换到编辑模式,可以添加控件。选择 Screen » Edit Mode or CTRL+M.
18.从左侧的Workspace Controls栏中,拖拽一个图形控件Graph(Simple)
1) 名称Graph Title: Engine Speed
2) 选择通道Channel:
Controller » Simulation Models » Models
» Engine » Outports » Engine Speed
3) 点击 将Engine Speed添加到Graph中
4) 选择Format & Precision 标签
5) 修改Y轴的显示范围最大值Maximum:5000 和最小值Minimum: 0
6) 修改Y轴坐标名称scale Label: rpm
7) 修改X轴坐标名称scale label: time
19.从左侧的Workspace Controls栏中,拖拽一个数字控件Numeric Control (Medium)
- 选择通道Channel: Controller » Simulation Models » Models » Ecu » Inports » rpm Setpoint
- 填写控件名称Control Label: rpm Setpoint
20.从左侧的Workspace Controls栏中,拖拽一个数字控件Numeric Control (Medium)
- 选择通道Channel: Controller » Simulation Models » Models » Engine » Inports » Load Torque
- 填写控件名称Control Label: Load Torque
21.退出编辑模式,选择 Screen » Edit Mode (Ctrl + M).
22.添加对Engine模型运行的控制,从左侧的Workspace Controls栏中,拖拽一个模型控件Model (Model Control)
- Model: Controller / Ecu
23.添加对Ecu模型运行的控制,从左侧的Workspace Controls栏中,拖拽一个模型控件Model (Model Control)
- Model: Controller / Engine
24.修改Ecu控制器中的I参数,从左侧的Workspace Controls栏中,拖拽一个模型标定控件Model Calibration Control (Medium)
- 需要标定的通道名称Calibration:ECU/Controller/Integral Gain/Gain
- 填写控件名称Control Label: I 参数
25.修改Ecu控制器中的P参数,从左侧的Workspace Controls栏中,拖拽一个模型标定控件Model Calibration Control (Medium)
- 需要标定的通道名称Calibration: ECU/Controller/Proportional Gain/Gain
- 填写控件名称Control Label: P 参数
26.至此基本的MiL测试环境创建完成,可以改变目标转速和负载,验证Ecu控制器中的算法是否满足要求,也就是实际转速能否快速、稳定的跟随目标转速。并能通过修改P、I参数,优化Ecu的控制效果,并确定出最佳数值。
上面的操作相信你已经对veristand有了初步的了解;回头我将操作做整理成手册,后续对
- 实现自动化测试、记录数据;
- 创建HiL测试系统。
- 创建实时激励配置文件
- Verstand高级功能
- 创建HIL测试系统
- 为NI Veristand创建自定义设备
- 为NI Veristand创建自定义工作空间对象
- 了解NI Veristand引擎架构
- 了解内联硬件接口自定义设备
园子里从事这方面的人不是很多,冷门;