编辑: glay | 2019-09-25 |
5 使用指南 Martin Ohlin Dan Henriksson Anton Cervin Department of Automatic Control Lund University January
2007 第2页共21 页目录TrueTime 1.5 使用指南
1 目录.2
1 介绍.4
2 开始.4 2.1 软件要求.4 2.2 安装.4 2.3 编译.4
3 仿真器使用.4
4 函数代码编写.4 4.1 Matlab函数代码编写.5 4.2 C++函数代码编写.5 4.3 调用Simulink模块对话框
5 5 初始化.6 5.1 编写Matlab初始化脚本文件.6 5.2 编写C++初始化脚本文件.7
6 编译.7
7 TrueTime Kernel
7 7.1 动态电压范围.7
8 TrueTime Network
7 8.1 CSMA/CD (Ethernet)―以太网.9 8.2 CSMA/AMP (CAN)9 8.3 Round Robin (Token Bus) ―轮询(令牌总线)9 8.4 FDMA―频分
9 8.5 TDMA (TTP)―时分.9 8.6 Switched Ethernet―交换式以太网.10
9 TrueTime Wireless Network.10
10 TrueTime Battery
10 11 TrueTime Standalone Network Blocks.10
12 例程.10 12.1 PID-control of a DC-servo
10 12.2 Task Scheduling and Control.11 12.3 Distributed Control System.11 12.4 Deadline Overrun Handling
12 12.5 Task Synchronization Using Monitors
12 12.6 Distributed Wireless Control System
13 12.7 Control and Coordination of Mobile Motes.13 12.8 Wireless Ad-hoc Routing Using AODV.13 12.9 Mote Soccer.13 12.10 ttSendMsg/ttGetMsg stand-alone network blocks.13
13 Kernel执行技术细节.13 第3页共21 页13.1 Kernel的数据结构.13 13.2 任务模型(Task Model)15 13.3 Kernel的函数.16 13.4 时序(Timing)16
14 TrueTime命令列表
16 14.1 命令解析.18 ttCallBlockSystem (TH)18 ttCreateInterruptHandler (I)19 ttCreatePeriodicTask (I)19 ttGetMsg (TH)20 ttInitNetwork (I)20 ttSendMsg (TH)20
15 参考文献.21 第4页共21 页http
1 介绍 本文为基于 Matlab/Simulink 仿真工具 TrueTime 的说明.TrueTime 为实时控制任务内核、网络传 输及设备动态特性的联合仿真器. 该仿真器在参考文献中已经有阐述, 但本文内容与上述文献不完全相 同. 本文描述了 TrueTime 创建的基本步骤.包括如何编写仿真执行过程中运行的代码,如何配置内核 模块和网络模块以及得到可执行仿真程序前怎么样编译.任务的代码函数和初始化命令以 C++或Matlab 的M文件形式编写,两种情况都进行了描述. 提供了十个参考例程,如何对看待标准和分布式 PID 控制,调度,溢出处理,同步,无线网络控 制,微调,使用 AODV 的无线 ad-hoc 路由选择,移动足球机器人及 ttSendMsg/ttGetMsg 模块. 本文也涉及一些 TrueTime 内部工作,包括任务模型,执行细节和时序细节.网络模块和无线仿真 的无线模块的内容也有涉及.本文最后给出 TrueTime 所有命令参数的详细解释.
2 开始 2.1 软件要求 Simulink 6.x 及Matlab 7.x 2.2 安装 ://www.control.lth.se/truetime可免费下载软件 2.3 编译 该部分内容详见――安装备忘.
3 仿真器使用 TrueTime 模块可以与 Simulink 中的普通模块连接构建实时控制系统.仿真运行前必须初始化 Kernel 和Network 模块,并创建任务、中断柄、定时器、事件、监视器等. 如前所述,初始化代码和仿真执行时的代码文件以 M 文件或 C++代码编写.代码如何编写,初始 化前有哪些需要准备,将在后面讨论.后面还将涉及到 M 代码如何编译执行.
4 函数代码编写 任务的执行和中断柄由代码函数定义. 根据执行模块可将代码函数分为几个代码段. 在每段代码开 始,执行所有的用户代码.代码函数返回每段代码的执行时间. 4.1 Matlab函数代码编写 下面给出了一个简单 P 控制器的 Matlab 代码函数的语法. function [exectime, data] = Pcontroller(segment, data) switch segment, case 1, r = ttAnalogIn(1);
y = ttAnalogIn(2);
data.u = data.K * (r-y);
% user code exectime = 0.002;
case 2, ttAnalogOut(1, data.u);
exectime = -1;
% finished end 变量 segment 决定执行哪段代码,data 是用户定义的数据结构,当任务创建时,该数据与任务关 联(详见命令表中 ttCreateTask[单独一件任务]和ttCreatePeriodicTask[周期任务]) .变量 data 实时刷 新,并由代码函数返回,代码函数也返回执行代码的执行时间(execution time) . 在本例中,第一段代码的执行时间为 2ms,这意味着任务从输入到输出的最小时间为
2 毫秒但是, 高优先级任务的抢占可能引起更长的延迟.第二段代码返回一个负的执行时间,意思是结束程序,也就 是说没有其他代码段需要执行. ttAnalogIn(从输入通道读值)和ttAnalogOut(向输出通道写值)是实时向环境读写信号的基本命 令.更多细节描述可见文尾的命令列表. 4.2 C++函数代码编写 4.3 调用Simulink模块对话框 C++和M文件例子都可以调用内嵌代码函数的 Simulink 模块图, 这是控制器执行的常用方法. 下 表为离散 PI 控制器例子使用的
1 段代码程序.ttCallBlockSystem 命令的详细解释见文后命令列表. function [exectime, data] = PIcode(segment, data) switch segment, case 1, inp(1) = ttAnalogIn(1);
inp(2) = ttAnalogIn(2);
第5页共21 页第6页共21 页outp = ttCallBlockSystem(2, inp, '
PI_Controller'
);
data.u = outp(1);
exectime = outp(2);
case 2, ttAnalogOut(1, data.u);
exectime = -1;
% finished end
5 初始化 初始化 TrueTime Kernel 模块包括详细定义输入数出模块的端口数目,定义调度策略,创建任务、 中断柄、事件、监视器等,这些内容需要在每个 Kernel 模块的初始化脚本文件中定义.初始化脚本也 可以为代码函数提供几个可选参数.其他 Kernel 模块参数将在本文的第七部分论述. 下面例子的初始化脚本文件以 C++和M文件两种方式给出.可选参数叫做 argument. 5.1 编写Matlab初始化脚本文件 下面列出了一个 TrueTime 仿真需要的最少初始化代码. Kernel 模块的初始化需要确定输入输出端 口数目和函数 ttInitKernel 使用的控制策略. 函数 ttCreatePeriodicTask 用来创建一个周期任务, 任务的 周期由 TrueTime 的Kernel 模块对话框的初始化参数给出. (注意:初始化参数可能是 Matlab 专用数 据结构)本例中代码函数 Pcontroller 下面函数定义.函数的更多详细解释见命令列表. function example_init(initarg) % 初始化 Kernel ttInitKernel(2, 1, '
prioFP'
);
% 定义参数 data.u = 0;
data.K = 2;
offset = 0;
period = initarg;
prio = 5;
% 创建任务 ttCreatePeriodicTask('
ctrl'
, offset, period, prio, '
Pcontroller'
, data);
function [exectime, data] = Pcontroller(segment, data) switch segment, case 1, r = ttAnalogIn(1);
y = ttAnalogIn(2);
data.u = data.K * (r-y);
exectime = 0.002;
case 2, ttAnalogOut(1, data.u);
exectime = -1;
% finished end 在Matlab 中,可能发现尽管改变了代码函数或初始化脚本,但是仿真却没有任何改变,那么试试 在Matlab 提示符做如下输入: >
>
clear functions 强制 Matlab 在每次仿真开始时重新调用所有函数, 使用如下输入 (这里假设模型名称为 mymodel) : >
>
set_param('
mymodel'
, '
InitFcn'
, '
clear functions'
) 5.2 编写C++初始化脚本文件
6 编译 如果需要重新编译的话看此部分.
7 TrueTime Kernel Kernel 模块可以通过模块对话框设置.有些参数可以使用 ttSetKernelParameter 命令在运行时设 置.见下图. 7.1 动态电压范围 若需要则看.
8 TrueTime Network Network 模块为网络控制系统提供了通信资源,可以仿真局域网的媒介访问和包传输过程.网络模 块采用事件驱动方式,当有消息进出网络时,网络模块执行相应的功能. 第7页共21 页 网络模块包括 Snd、Rcv 和Schedule 三个接口.Snd 接口发送数字信息,Rcv 接口是将网络模块发 送的数字信息送至 Kernel 模块的 Rcv 端口,Schedule 用于显示仿真过程中网络资源的分配情况. True........