
简介面向MATLAB网络化运动控制与资源调度学习者的TrueTime 2.0中文使用文档适合正在搭建仿真环境、需要理解工具箱结构、模块职责与调度实验组织方式的初中级读者。压缩包共1个docx文件约402KB内容集中为一册说明文档便于离线查阅和按主题检索目前已有1593人学习。文档覆盖工具箱部署、路径与环境变量配置、Kernel、Simulator、Controller等模块的功能划分与参数配置并涉及最大误差优先调度、优先级反馈控制等运动控制知识点同时提示常见配置问题的排查思路兼顾MATLAB基础操作与mex编译器等前置知识。读者可据此建立TrueTime与MATLAB协同仿真框架理解仿真流程、任务调度机制和网络控制实验设计方法为系统建模、调度策略验证及后续实验复现提供参考也可作为课程设计、毕业课题与科研入门阶段的参考资料。1. 先别急着装TrueTime 2.0 到底是干什么的很多人第一次听到 TrueTime 2.0是被一句「你先把这个装上」砸过来的。装完之后硬盘里多了个文件夹Simulink 里多了几个图标然后就没然后了。它其实没那么神秘TrueTime 2.0 是一个跑在 MATLAB/Simulink 上的工具箱专门仿真「计算机控制一台机器」这件事只不过这里的计算机不止一台它们要靠网络互相传消息消息会排队、会晚到、会丢。你真正要观察的问题是——网络一卡控制效果会烂到什么程度。如果你正在做运动控制、资源调度方向的课设或课题需要「先在电脑里试一百遍再上真机试一遍」它就是那层替你挨打的沙盘。零基础也能上手前提是顺序别搞反。2. 为什么值得先学它一个工具箱省掉的重复劳动先说结论TrueTime 2.0 的价值不在于它多高深而在于它把「网络」这件说不清道不明的事变成了几个可以填数字的框。你在真实设备上想验证「网络延迟从 5 毫秒涨到 50 毫秒控制系统会不会抖」需要拆线、换交换机、改配置一天可能只跑两三组数据在仿真里改一个输入框回车两秒钟出结果。这个差别做过实验的人都懂。2.1 网络化控制系统到底在仿真什么传统的控制课里传感器、控制器、执行器之间是一根线直连的我们默认信号瞬时就到了。真实车间不是这样几十台设备挂在一根总线上传感器采完数据要打包、排队、等总线空闲、发出去控制器算完再把指令打包发回来。中间这一段「打包—排队—传输—接收」的时间不是零而且每次都不一样。这一小段时间会带来四件麻烦事。第一是延迟指令到得晚控制就慢半拍第二是抖动每次延迟长短不一控制器的节奏被打乱第三是丢包某个数据包没送到控制器拿着旧数据做决定第四是冲突两个节点同时抢总线谁先发要看协议。TrueTime 干的事就是把这四件事在电脑里复现出来让你看它们怎么一点点把控制曲线搞坏。打个生活化的比方你点外卖厨房做菜是「计算」骑手送餐是「网络传输」你吃上饭是「执行」。菜本身做得再好骑手路上堵二十分钟你吃到的还是凉的。仿真就是让你不用真点一百次外卖也能知道几点下单会凉。为什么非得在仿真里做真机贵、复现难、参数不敢乱改。你不可能为了看「周期从 10 毫秒改成 20 毫秒会怎样」去拆一台设备。而仿真里这些都只是输入框里的数字。这也是新手最该先建立的心态先把沙盘玩熟再去碰真东西。2.2 TrueTime 的三大件Kernel、Network、Send/Receive新手最容易犯的错是把模块说明文档从头看到尾。那份文档很长第一遍看完基本什么也记不住。真正需要认识的只有三个模块剩下的等用到再查。Kernel 是「一台计算机」。它里面跑任务每个任务有周期、执行时间、优先级、截止期还要选一个调度策略来决定谁先跑。它还有对外的接口接传感器的 A/D、接执行器的 D/A、接网络的端口。你在仿真里放两个 Kernel就等于放了两台电脑。Network 是「一根网线」。它决定消息怎么在节点之间走可选类型包括以太网、CAN 总线、轮询、频分这类每种下面的参数都不一样。第一次别贪多选一个最普通的先跑通。Send 和 Receive 是「网卡口」。Kernel 自己不直接连网络得靠这两个模块把消息送出去、收进来填的是源节点号、目的节点号、消息长度这些。模块在仿真里扮演什么第一次先动哪个参数Kernel一台计算机节点任务周期、执行时间Network一条通信介质网络类型、数据速率Send / Receive节点的收发接口源节点号、目的节点号认识这三个已经够你把第一个模型搭起来了。至于电池模块、时钟模块、事件模块都属于「以后再说」的范围一开始全塞进去只会让你自己乱。2.3 上手前的底子三样够用两样可以缓一缓不需要你先成为 MATLAB 高手。真正必需的只有三样第一MATLAB 的基本操作。会开命令行窗口、会跑 .m 脚本、知道 addpath 和 savepath 是干什么的就够了。这三件事花半小时能学会。第二Simulink 的基本操作。会从库浏览器拖模块、会用鼠标连线、会双击改参数、会点运行、会加一个示波器看波形。这是硬门槛不会的话先花一个下午拖几个加减法模块练手比硬着头皮装工具箱划算。第三一点点控制常识。知道采样周期是什么、知道反馈是把输出量回去比较、知道 PID 大概是干什么的。不要求会推导只要求听到这些词不发怵。可以缓一缓的是两样。一是 C 语言——TrueTime 里有 C 写的文件需要编译但你只需要装个编译器让它自己编不用自己写一行 C。二是调度理论——最大误差优先、优先级反馈这些名词等你跑通第一个模型、看到曲线因为调度策略变化而变样了再去查理解得快十倍。我第一次接触这类工具箱的时候卡了整整两天最后发现不是理论不懂是路径没加对。所以别急着补理论先把环境跑通。3. 从零装一遍下载、路径、编译的完整流程这一章是整个入门路上最容易翻车的地方也是最多人半途放弃的地方。它的难点不在智力在耐心七八个步骤任何一个漏掉最后都会表现成同一句报错。所以我按顺序写每一步都告诉你「这一步到底在干什么」你照着做出问题时也大概知道该回头查哪一步。3.1 第一步下载解压放进 toolbox 目录从说明文件里给出的官方发布页面下载最新版本。原文作者用的是 TrueTime 2.0 beta 1你不必跟他一模一样但要注意不同小版本的文件夹名字可能不同后面所有路径都要换成你自己的千万别照抄。下载下来是一个压缩包解压后得到类似 truetime-2.0 这样的文件夹里面能看到 kernel、examples 之类的子目录。把这个文件夹整个复制到 MATLAB 安装目录下的 toolbox 文件夹里。# 以 Windows 为例最终的目标结构大概长这样版本号和路径换成你自己的 # D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0\ # ├─ kernel\ # ├─ examples\ # └─ 其他子目录... # 如果习惯用命令行复制可以这样写 xcopy /E /I D:\下载\truetime-2.0 D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0xcopy /E /I的意思是连子目录一起复制目标不存在就自动创建。为什么不建议放在桌面或者中文目录里因为在 Windows 上路径带空格带中文后面编译那一步特别容易报「找不到文件」而报错信息又不会直白告诉你「是路径的锅」。放进 toolbox 还有个好处路径短以后复制粘贴不容易错。提示装之前先确认你的 MATLAB 是 32 位还是 64 位后面选编译器要用到。命令行窗口输入computer就能看到。3.2 第二步setpath把 Kernel 目录加进去MATLAB 找一个函数是在它的「搜索路径」里挨个目录翻。工具箱的目录不在默认搜索路径里所以要手动加。界面操作主页选项卡 → 设置路径 → 添加文件夹 → 选中 truetime-2.0 下的 kernel 目录 → 保存。原文提到 kernel 里一共包含 4 个和 truetime 相关的文件建议都包含进去这样不容易出错如果你想省事只加 kernel 文件夹也行真出错了再回头补。命令操作更稳也不容易点错% 把 kernel 目录加进搜索路径并保存下来下次启动 MATLAB 依然有效 ttRoot D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0; % 换成你自己的解压位置 addpath(fullfile(ttRoot, kernel)); % 把 kernel 子目录加入搜索路径 savepath; % 保存路径设置否则关掉 MATLAB 就没了 % 验证一下到底加对没有 which init_truetimefullfile会自动按系统习惯拼接路径分隔符省得你手写反斜杠写错。savepath是关键的一步很多人只 addpath 不 savepath当场能用第二天开机又不行了然后开始怀疑人生。最后那句which init_truetime如果打印出一个完整的文件路径说明加对了如果提示 not found说明上一步没生效别往下走。3.3 第三步环境变量和 startup.m 这两个小动作这两个动作看起来像玄学其实目的很朴素让 MATLAB 每次一启动就自动知道 TrueTime 在哪不用你天天手动加路径。环境变量在 Win7 上的位置是右键「计算机」→ 属性 → 高级 → 环境变量 → 在系统变量里新建。Win10 和 Win11 换了地方右键「此电脑」→ 属性 → 高级系统设置 → 环境变量。变量名按说明文件里写的填值填你自己的 truetime 根目录设完一路点确定然后重启电脑——原文明确说了要重启这一步别偷懒。REM 也可以用命令行设系统级环境变量需要管理员权限的命令行窗口 REM 变量名照说明文件填这里用 TRUETIME_ROOT 代指/M 表示写入系统变量而不是用户变量 setx TRUETIME_ROOT D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0 /M然后是 startup.m。它是 MATLAB 每次启动都会自动执行的一个脚本放在 MATLAB 安装目录的 toolbox\local 下。原文给出的做法是打开 local 下的 startupsav.m 去改其实你直接在同一个位置新建或编辑 startup.m效果一样。% 文件位置MATLAB安装目录\toolbox\local\startup.m % 每次打开 MATLAB 都会自动跑一遍这里面的内容 ttRoot D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0; addpath(fullfile(ttRoot, kernel)); % 开机就把 TrueTime 的路径挂上原文还有一步是把 local 目录下的 matlabrc.m 打开、不做任何修改直接另存。这一步在老版本 MATLAB 上有它的道理但你不必纠结它的原理只要保证两件事就行local 目录里有 init_truetime.m并且启动时路径能挂上。把 kernel 里的 init_truetime.m 复制到 local 目录用一个命令就能完成# 把初始化脚本复制到 local 目录让 MATLAB 启动时能找到它 copy D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0\kernel\init_truetime.m D:\Program Files\MATLAB\R2017b\toolbox\local\init_truetime.m为什么要放 local因为 MATLAB 启动时对 local 目录有特殊照顾放在这里的东西启动阶段就能被找到不会被「路径还没加好」这件事卡住。3.4 第四步装编译器跑 make_truetimeTrueTime 里有一部分文件是 C 写的需要在你自己的电脑上编译一遍才能用这一步叫 mex 编译。这是整个安装流程里最容易卡住的地方原文作者也说了他试过好几个编译器都不成功最后用的是 64 位的 TDM-GCC 5.1.0 那个安装包。经验上讲失败的原因八成是位数不匹配MATLAB 是 64 位装的编译器是 32 位怎么调都不认。安装编译器时记得勾选「加入 PATH」装完重开 MATLAB。% 第一步让 MATLAB 认识你刚装的编译器 mex -setup % 按提示选择 C 编译器选项里出现你装的那个就选它 mex -setup -v % 如果上面没列出编译器加 -v 看它到底在哪些目录找过方便对症下药mex -setup的交互是一问一答的形式看清楚再回车选错了重来一次就行不会弄坏什么。-v是 verbose 的意思会把它搜索过的目录全打出来报错时对着这个列表看八成能发现是路径没配好。编译器认到之后再编译工具箱本体% 第二步切到 TrueTime 根目录执行编译 cd(D:\Program Files\MATLAB\R2017b\toolbox\truetime-2.0) % 必须先切到根目录 make_truetime % 编译 TrueTime 的 mex 文件先cd到根目录这一步不能省因为make_truetime内部用的是相对路径你在别的目录下执行它会找不到源文件。编译过程会刷一屏文字中间出现几个 warning 是正常的原文也说了「如果出现警告先不用管」。你要盯的是最后一行出现 successful 就说明成了。3.5 第五步三条命令验收别靠感觉装完别急着关窗口花十秒验一下比事后排查省一小时。% 验收三条命令全过才算真装好 which init_truetime % 1. 初始化脚本能不能被找到 exist(rtsys, file) % 2. 编译出来的核心文件在不在返回 2 或 3 表示存在 truetime % 3. 能不能弹出 TrueTime 的工作窗口第一条打印出完整路径第二条返回值不是 0第三条弹出一个窗口——三条都过这条安装链路就算打通了。第三条如果没有窗口弹出来先别怀疑安装看看是不是窗口被主界面挡在后面了。4. 第一个例子跑通从一条命令到一条曲线环境装好只是「工具齐了」真正让你有感觉的是第一次看到自己搭的模型跑出一条随时间变化的曲线。这一章做一个极简的两台计算机、一条网络、一条消息能跑就行不追求漂亮。4.1 先用一条命令确认界面活着在命令行窗口敲truetime回车。这个命令会打开 TrueTime 的工作窗口里面通常能看到示例模型和模块库的入口。这一步的意义在于它把「路径、编译、界面」三件事一次性验证了——只要窗口能起来说明前面的功夫没白费。窗口弹出来之后别急着关从里面翻一个最简单的示例模型出来看看。看的时候只关注三件事模块是怎么连的、双击模块之后有哪些输入框、跑完之后波形在哪个示波器里看。其余的细节一概先跳过。4.2 搭一个最小模型两台电脑一根网线整个模型只有五个模块加一个示波器。照下面这个顺序做打开 Simulink新建一个空白模型。在库浏览器里找到 TrueTime 的分类拖两个 Kernel 模块到画布上一个当控制器一个当被控对象节点。拖一个 Network 模块进来网络类型先选最普通的那种数据速率填一个你熟悉的数量级。拖一个 Send 和一个 Receive把 Kernel 和 Network 两头接上注意方向别接反。双击控制器那个 Kernel按照下表填参数先只填能填的其余保持默认。在被控对象的输出上加一个示波器方便看结果。保存文件名取个纯英文的比如 tt_min_demo。Kernel 关键参数它在说什么第一次建议怎么填任务数这台「电脑」里同时跑几个任务先填 1 个周期任务每隔多久被触发一次从 0.01 秒起步执行时间这个任务算一次要占多少时间比周期小一个数量级比如 0.001优先级多个任务抢 CPU 时谁先跑先都设成一样的暂时不比调度策略用什么规则挑任务第一次选固定优先级Network 关键参数它在说什么网络类型消息按什么协议抢总线数据速率一秒钟最多传多少比特最小帧长一个消息最少要占多少长度丢包概率消息凭空消失的概率先填 0参数填得不对没关系第一次的目标是「跑起来」不是「跑得对」。我见过太多新手在第一个模型上纠结参数合不合理纠结三天模型一次没跑过——这才是真正的浪费。4.3 用脚本把这个模型跑起来模型存好之后可以点界面上的运行按钮也可以用脚本跑。脚本的好处是以后你要跑十组参数做对比改一行数字就行不用手点十次。% first_run.m —— 跑一次刚才搭好的最小模型并画出结果 model tt_min_demo; % 模型名不带 .slx 后缀 load_system(model); % 只加载进内存不弹出界面速度快 set_param(model, StopTime, 2); % 仿真时长设成 2 秒注意这里是字符串 out sim(model); % 开始仿真结果全部塞进 out y out.get(yout); % 取出模型里记录到 yout 的信号 t y.time; % 时间轴 v squeeze(y.signals.values); % 挤出多余的维度方便画图 plot(t, v, LineWidth, 1.2); xlabel(仿真时间 (s)); ylabel(控制量); title(第一次跑通控制量随时间的变化); grid on;load_system和open_system的区别值得记一下前者只加载不显示适合批量跑后者会弹出界面适合调试。StopTime必须写成字符串写成数字会报错这是新手最常见的低级翻车点。squeeze是因为yout里的数据维度常常是 N×1×1直接 plot 会画出奇怪的东西挤掉多余维度就正常了。前提是你在模型里把信号勾选了记录否则yout是空的。4.4 结果怎么看三条对照说明问题第一条曲线画出来大概率不会漂亮有超调、有振荡、毛刺还不少。这很正常控制系统本来就这样。你真正要做的是做对照实验看改动带来的差别你改了什么大概率会看到说明什么网络速率调低一个数量级曲线滞后变明显振荡加剧延迟真的在影响控制效果任务周期调大一倍曲线变粗糙但 CPU 负载下来了资源调度里最典型的取舍丢包概率从 0 调到 1%偶发的大幅波动数据丢一次控制器就「瞎」一下把这三组对照跑一遍你对「网络化控制」这四个字的理解会比看十页文档都实在。到这个时候你才算真正入门了。5. 新手最容易翻车的 5 个地方这一章列出来的都是我见过或者自己踩过的高频坑。共同特点是报错信息完全不指向真正的原因所以你只能靠「现象 → 原因 → 解决」这条链子倒推。5.1 坑一make_truetime 报一堆错或者提示找不到编译器现象命令行刷出一屏红色错误或者明确提示找不到编译器有时候 mex -setup 里干脆列不出任何可选项。原因绝大多数是位数不匹配——MATLAB 是 64 位装的编译器是 32 位两边对不上。其次是装完编译器没有重开 MATLAB环境变量还没生效。原文作者当年也是换了好几个编译器才成功这说明问题出在环境上而不是你操作错了。解决确认 MATLAB 位数命令行输入computer装对应位数的编译器安装时勾选加入 PATH装完彻底关掉 MATLAB 再重开。然后用mex -setup -v看它到底搜了哪些目录对着列表判断是没装好还是没被认出来。5.2 坑二输入 truetime 提示未定义函数现象明明昨天还能用今天开机敲truetime直接回一句未定义。原因只做了 addpath没做 savepath。路径只在当前这个会话里有效关掉 MATLAB 就忘了。另一种可能是路径加到了 kernel 目录但实际需要的那几个文件在别的子目录里。解决重新 addpath 之后一定跟一句 savepath。然后再用which init_truetime验证一次。如果还是找不到把 kernel 目录下所有相关的文件目录都加进去宁可多加别漏加。5.3 坑三模型能跑完但曲线是一条直线或者全是零现象仿真顺利结束没有任何报错但画出来的图一条平的或者干脆全是 0。原因消息根本没送到。常见的是 Send 模块里的目的节点号填错了、Receive 的源节点号对不上或者 Kernel 的网络接口数量设成了 0压根没接上网络。解决从接收端往回查。先看 Receive 模块有没有收到东西再看 Send 的源和目的是不是和两个 Kernel 的节点编号一一对应最后确认 Kernel 的接口数量不是 0。这类问题不会有报错只能靠一层层看信号。5.4 坑四换了电脑或者换了 MATLAB 版本全线失效现象在实验室能跑拷回自己电脑就报错或者 MATLAB 升了个版本原来的模型打不开了。原因编译出来的那些文件是跟操作系统位数和 MATLAB 版本绑定的换个环境就不认。同时写死在 startup.m 里的绝对路径也指向了旧机器。解决在新机器上老老实实重走一遍改路径、重跑mex -setup、重跑make_truetime。别想着直接拷编译好的文件过去那是给自己挖坑。5.5 坑五路径里带空格或者中文编译到一半莫名失败现象编译过程跑到一半停住提示某个文件找不到但你去看那个文件明明就在那儿。原因路径里的空格和中文在某些编译环节会被截断或者转码出错。MATLAB 装在Program Files下面就带空格这本身不致命但如果你的解压目录再套一层中文文件夹名就很容易出问题。解决把工具箱放在纯英文、路径尽量短的目录里实在不行换个盘符根目录试试。改完路径记得把 startup.m 和环境变量里的旧路径一起更新别只改一处。注意这五条坑里前两条占了新手翻车原因的绝大多数。真卡住了先照着这两条排查一遍比到处问人快。6. 跑通之后学什么从「能跑」到「会改」跑通第一个模型之后最忌讳的事是立刻去啃理论。我带过的新手里凡是跑通当天就抱着调度算法论文啃的一周后基本都放下了反而是那些继续瞎改参数、把曲线改坏了再改回来的学得最扎实。下面这条路径是我自己走过、也推荐给别人的顺序阶段干什么大概花多久第一步只改一个参数观察曲线怎么变比如网络速率、任务周期两三个晚上第二步换一种网络类型对比同一套控制参数下的差异一个晚上第三步换调度策略看任务执行顺序怎么影响输出一个周末第四步把工具箱自带的示例模型逐个跑一遍挑一个改造成自己的场景一到两周第五步回头补调度理论这时候看论文才看得进去长期第一步最关键也最容易被跳过。做法很土拿一张纸写下你要改的那个参数、改前的值、改后的值然后跑一遍把两条曲线画在同一张图上。改一个变量跑一次记一次。这个笨办法能让你在两天内建立起「哪个参数管什么」的直觉比看任何教程都管用。具体到代码上可以写个小脚本批量跑% sweep_demo.m —— 同一个模型换不同参数各跑一次把曲线叠在一张图上 model tt_min_demo; rates [1e5, 1e6, 1e7]; % 三档网络速率单位 bit/s按你模型的参数名改 figure; hold on; for k 1:numel(rates) load_system(model); set_param([model /Network], DataRate, num2str(rates(k))); % 改网络速率 out sim(model); y out.get(yout); plot(y.time, squeeze(y.signals.values), DisplayName, [num2str(rates(k)) bit/s]); end legend(show); grid on; xlabel(仿真时间 (s)); ylabel(控制量);这段代码的核心是set_param它让你用命令行改模块参数不用手点界面。参数名比如DataRate要对着你界面上那个框的真实名字写写错了会报「参数不存在」这时候双击模块看一眼就知道该怎么改。再往后就是补理论的时候了。运动控制里那些听着吓人的词比如最大误差优先调度、优先级反馈控制等你亲手把曲线改坏过几次再去看定义会发现它们说的其实就是你踩过的那些坑的正式说法。我自己的教训是第一次装这个工具箱我卡在编译那一步整整两天最后发现只是编译器位数装错了。从那以后我每次装任何带编译环节的工具箱都会先敲一句computer确认位数再看一眼路径里有没有空格和中文最后才动手。这个习惯帮我省下的时间比任何教程都多。希望帮到你。本文还有配套的精品资源点击获取