TOSUN同星TsMaster使用入门——2、使用TS发送报文,使用graphics分析数据等
在第一章里面已经介绍了关于同星工程的创建和最基础的总线分析,接下来看看怎么使用TS发送报文以及图形化分析数据。
目录
一、使用Graphics分析报文信号/变量(对标CANoe Graphics)
二、使用数值窗口统计信号值/变量
三、使用TS发送报文
3.1 使用报文发送模块发送报文(类似CANoe的IG,CANIG,PDU IG等)
3.2 利用rbs仿真自动发送CAN报文
3.2.1 非周期报文发送
3.2.2 非周期报文无法自动周期发送的解决办法
3.2.3 周期报文的发送方法
3.2.4 其他注意事项
3.3 利用rbs仿真发送LIN报文
四、结束
由于信号定义在数据库文件中,以下所述内容皆为有数据库文件(DBC、ARXML、LDF)等文件的前提下进行。
一、使用Graphics分析报文信号/变量(对标CANoe Graphics)

在TS的分析菜单栏内,选择图形,新增一个图形

打开后的界面如图所示,为了方便使用,我们先将右上角的链接图标点一下,让图形能够在工程运行时就自己启动。
当我们需要查看某个信号的变化曲线或者变化规律时,通过trace窗口(报文信息窗口)查看就显得比较费劲了,需要自己去人为查看报文的每一帧的信息,较为复杂和困难。和CANoe的Graphics一样,TS的图形窗口中也可以非常方便的分析信号并曲线显示出来。
在界面左边右击鼠标,选择添加需要观测的量

在这里可以把自己想观测的信号或者系统变量添加进来,这里我添加一个CAN信号和一个LIN信号作为演示。
选择添加CAN信号,在弹出的数据库中选择需要观测的信号

我这里选择FL_WinPosSts信号进行观测,随后点击确定。
再次右击鼠标选择添加LIN信号,打开LIN数据库选择视图

我这里选择0x15中的WiperControl信号。

添加完成后的界面如图所示。
鼠标左键点击信号名称之后,右边的坐标轴中就会出现对应信号的坐标

此时在图形中就可以很明显的看到信号曲线的跳变了,当信号发生变化时,图形也会改变。


当我们把左边红框中的√给勾上时,图标上就会出现打钩的所有信号的坐标轴,这样子就可以方便的观测多个信号的实时值了。

在示例中,我的LIN信号的曲线由于坐标轴非常大,导致我的信号值看着十分不明显,不方便观察,这里我们给LIN信号值修改一个观测的最大值和最小值。

在信号名称处双击鼠标左键,打开信号定义界面,在信号的最大值处输入一个合适的值,这里我输入10.随后点击应用

现在可以较为明显的观测到我信号的跳变了。
现在我们的两个信号是在一个分栏里一起观察,如果想把两个信号分开观察,我们可以点击上面的选项,新增一个分栏

选择添加分栏

就得到了两个分栏,我们按住LIN信号WiperControl将其拖动到下面的分栏


就可以将信号分开显示了,对于两个以上的信号,也可以使用这种方式添加更多的分栏将其分开显示,或者每个分栏中观测一些信号。。
在上图中我们可以看到,x轴的时间长度为10s左右,如果觉得10s时间太短不方便观测,可以缩放x轴的长度来使观测的时间范围更长或者更短。
在图形界面,单击键盘按键 D 可以将x轴范围调长,点击 E 则可以将x轴范围调短,可以根据需要自己调整。
如果想要将波形上抬或者下移,只需点击键盘上的方向键上下左右即可实现波形的四个方向的移动。
如果想要知道某个点的具体坐标,可以在菜单栏中点击红框中的按钮,第一个用于显示横轴值,第二个用于显示纵轴值。


打开显示之后,鼠标在曲线上移动即可得到当前选中的地方的坐标值。
如果想要知道两个坐标之间间隔的时间,可以点击暂停按键将曲线停止更新后

点击如图中的两条竖线调出两条直线。


届时随着鼠标的移动,直线就会跟着移动,在需要测量的起点地方直接鼠标左键点击即可安置第一条竖线。

安置完成之后,在另一个需要测量的终点地方,单击鼠标右键即可放置第二条直线。

坐标轴下方便会出现这两条直线选中的区域的时间差。

采样点图标用于给图形设置是否显示采样点,如果选中此图标,曲线中将会对收到的每一帧信号的时间节点进行描粗,在日常分析故障log判断是否丢帧有较大的作用。
例如我上面的图中就是选中了采样点图标,坐标点被描粗了。如果取消选中,坐标点便不会被描绘出来。

当不描绘坐标点时,看到的曲线就是一条平滑的线。
二、使用数值窗口统计信号值/变量
TS提供了一个数值统计窗口用于统计指定的信号或者变量出现过的值的区间。

在分析栏中点击数值显示添加一个数值显示窗口。

同样的,在窗口中右击鼠标即可添加需要观测的量。
我这里选择观测我的FR_WinPosSts信号。

点击应用之后,界面上就会出现此信号的值统计

在统计窗口中,可以统计给定信号的最大值和最小值,现在我的信号由于还没有产生变化,所以值都是一样的,等到信号发生变化时,数值统计窗口的值也会发生变化。

现在我的信号值发生了更新,更新到了70,那么统计到的最大值就是70.

现在我的当前值为51了,我的最大值仍旧统计到的是我总线上出现过的数据中的最大值。
三、使用TS发送报文
TS作为一个非常强大的对标Vector CANoe的总线分析、测试、开发工具,日常使用中当然不仅限于分析报文,我们更多时是用其来充当上位机,去控制我们的产品,执行诊断、刷写等功能。
要控制产品,我们就需要使用TS向产品发送报文,那么如何使用TS发送报文呢?
3.1 使用报文发送模块发送报文(类似CANoe的IG,CANIG,PDU IG等)

可以看到,目前我的总线上只有一个rx报文,TS并没有报文对外发出。
我们创建一个报文发送模块,来通过TS对外发送报文

选择添加一个CAN CANFD报文发送和一个LIN报文发送

添加完成后,二者的界面如图所示。
我们在CAN CANFD报文发送模块中,在空白处单击鼠标右键,选择新建一条原始报文。

随后输入报文的信息,点击发送图标,即可将报文发送到总线上去。


可以看到,总线上出现了我刚刚发送的报文。
如果想要持续发送报文,可以将触发类型由手动改为周期发送,输入需要的周期之后,即可按照定义的周期往总线上进行发送。这里我将我的周期设置为1000ms

设置完成后,点击发送。

可以看到,0x123报文在按照1000ms为周期往总线上进行自动发送了。
这时,如果想修改发送的数据,直接修改数据字节即可。
接下来,我们再次右击鼠标选择添加一个报文进行发送。
这次,选择从数据库添加报文


我选择发送0x321这条数据库中的报文,点击确定。

当发送的报文是数据库中的报文时,就可以选择修改报文中的信号了。
同样的,为这条报文配置一个1000ms周期发送,然后开启发送

现在我们就可以修改报文中的信号了,当修改信号之后,发到总线上的报文信号也随之改变了。

如此,就可以实现发送信号控制我们的产品了。
CAN报文的发送就到此为止,我们看下怎么使用发送模块发送LIN报文
打开LIN报文发送模块

仍旧使用新建LIN报文和从数据库中添加报文两种方法。
先演示新建LIN报文

输入要发送的报文的ID,并将方向设置为“发”,填写字节数据。

由于我们还没有发送LIN报文,现在LIN总线上没有报文。
在LIN发送模块上方,有个小滑块选择是进行单帧发送,还是进行调度表发送,这里我们先选择单帧发送。

点击发送之后,报文就出现在了总线上。
随后我们再添加一帧。将其的方向设置为“收”,然后给与一个ID,TS便会往总线上发送这个ID的报文头。

将模式切换为调度表模式,点击部署。

总线上就不仅出现了我们发送的0x15报文,也同时出现了我们接收的0x1F报文(TS上设置方向为接收表示向总线上发报文头等待响应)
紧接着,演示下在新建时选择从数据库中添加新报文。我这里添加两个报文,一个0x15,一个0x20.

将0x15设置为发送,0x20设置为接收,部署。

总线上也正常出现了我们发送的报文0x15和我们接收的报文0x20。
3.2 利用rbs仿真自动发送CAN报文
rbs(剩余总线仿真——Residual bus simulation
)是同星软件附带的一个类似于CANoe的IL交互层一样自动发送报文的功能模块,基于rbs引擎,我们可以实现自动向总线上发送报文。
!!!注意,使用rbs总线仿真,需要数据库中的报文定义时,对其定义了发送周期属性,若没有定义发送周期属性,开启rbs引擎并不会一直对外发送报文,而是仅会在信号/报文值被改变时往总线上发送一帧相应的报文。
3.2.1 非周期报文发送
首先我们查看下报文是否具备周期属性,来检查能否直接使用rbs总线仿真。
点击数据库,显示CAN数据库,打开之后展开CAN报文界面,选择一个CAN报文

随后窗口左边便会出现这个报文的定义,其中有着周期选项。如果周期位置为0说明此报文没有配置周期属性,或者此报文为事件触发帧,没法直接利用rbs仿真技术持续对外发送。
打开rbs仿真窗口,在菜单栏中选择仿真,打开旗下的CAN总线仿真窗口。


打开后的窗口如上图所示,左侧的通道上挂载着当前dbc中的所有节点。
当节点未启用时,其处于灰色。
现在,我们激活dbc的rbs仿真,将dbc名称处的方框打上勾
并且试着将其中一个节点也打钩,我这里选择勾上windows和Test,可以看到

当dbc激活后,被激活的对应节点在总线上呈现出彩色,未激活的节点仍旧处于灰色。
当我们需要发送某个报文时,只需要把此报文对应的激活框也勾上即可,例如我现在将windows_CAN这帧报文给激活

随后运行TS,再点击左上角的rbs仿真运行图标,开启rbs仿真。

大家也可以打开自动启动,这样子每次工程启动之后便会帮我们运行rbs仿真模块。

我现在已经运行起来了rbs仿真,但是总线上并没有出现对应的报文,这就是我刚刚所说的,如果报文没有配置周期属性,那么TS默认此报文是一个事件触发帧,我们需要修改了报文的值之后,TS才会往总线上发送一帧报文。
在rbs仿真的数据区可以看到,现在我的报文数据是全0,当我修改其中任意一个字节之后,按下回车,总线上便出现了刚刚发送的一帧报文,由于报文没有周期属性,所以只会发送一帧。

紧接着,继续修改报文,TS便会继续发送一帧,这里就不再演示了。
3.2.2 非周期报文无法自动周期发送的解决办法
为了解决非周期报文TS不会自动进行周期发送的问题,我们需要为报文增加一个周期属性,由于TS没有提供DBC编辑器,我们只能通过其他手段来编辑DBC。
如果大家对DBC的结构和属性非常熟悉,可以直接以文本形式打开DBC文件,为其添加一个周期属性。但我相信大部分人都没有这个能力,所以这里我选择借助CANoe的DBC编辑软件,CAN DB++来解决这个问题。(如果没有CANoe可以去网上寻找安装包或者去Vector的官网下载一个demo版或者直接安装CAN DB++)
使用CAN DB++打开我们的DBC文件
打开之后,点击我们的报文,然后且到属性页,如图所示。
可以看到属性页空空如也,啥也没有。我们需要给报文添加一个周期属性。

如图所示,点击菜单中的View,再点击Attribute Definitions,打开属性界面。

在空白处右击鼠标,创建一个属性

这里注意,这个属性的名字必须要使用固定的名称--"GenMsgCycleTime",否则将没有作用。

创建完成后点击确定即可。
然后再次点击菜单栏的View按钮,选择over View,回到主视图

回到主视图之后,找到一个报文并双击打开,切换到属性视图,可以看到这时候我们的报文已经具备了一个属性,并且上面的分组为"interaction layer",这便是我上文提到的IL交互层。
随后,点击周期属性后面的数字“0”,将其修改为一个其他值,比如100,200,这里随意大家修改。注意,这个周期的单位是ms。这里我修改为200ms

修改完成之后,点击确定。
大家可以根据需要,对dbc中的其他报文也给予周期属性,这里我就不再一个个演示了。
修改完成之后,点击左上角的保存图标即可

然后,让我们重新回到TS软件。将TS软件的DBC更新一下。
打开CAN数据库界面,先关闭数据库,随后再重新添加。

重新添加,添加完成之后,点击报文查看下是否具备了周期属性。

可以看到,这里我的报文已经具备了周期,周期为200ms。
然后,重新rbs仿真窗口,依次设置一下想要激活的报文和节点

设置完成后,启动rbs仿真,我们的报文就会按照200ms的周期发送到总线上了。
3.2.3 周期报文的发送方法
周期报文无需采取第二步,直接按照第一步添加完成之后,就可以实现自动发送了。
3.2.4 其他注意事项

如果修改了信号,报文却没有发送出去,可以查看下设置中的配置是否勾选了“当信号被更改时自动发送信号所在报文”。
3.3 利用rbs仿真发送LIN报文
发送LIN报文的方法总体上和发送CAN报文相同,导入完成ldf文件后,打开LIN rbs仿真模块。

打开便能够看到如图所示的界面,可以使用左侧的展开按钮将报文层次展开更为清晰。
其中,如果想要TS作为主机发送,就需要勾选MasterNode(大家的不一定叫这个名字,反正红色图标的节点是主机),蓝色图标的节点就是从机。

展开后可以看到一些跟我的界面类似的界面,像表格一样的图标的,表示调度表。比如我图中的"NomalTable"和"DiagnosticTable",绿色纸飞机表示的,是这个界面的发送报文,蓝色信封表示的,则是这个节点的接收报文。

现在我勾选上我的主机发送的报文,其他的不勾选,然后点击运行,总线上便出现了我发送的主机报文。
如果想要发送从机头,可以将主机节点调度表下的蓝色信封表示的接收报文勾选上,TS便会自动发送从机的报文头等待从机响应。

如图所示,当我勾选了从机头之后,总线上便出现了从机的报文(由于我没有接从机,从机无法应答,收到的便是错误帧)
当我接上从机之后,我们看看

现在总线上的报文就开始正常收发了。
四、结束
下一篇预计将会发布关于简单上位机创建的文章(包含系统变量创建,常用Panel面板控件使用即相关的绑定等),如果觉得我写的东西有用的话还请关注哦
相关文章:
TOSUN同星TsMaster使用入门——2、使用TS发送报文,使用graphics分析数据等
在第一章里面已经介绍了关于同星工程的创建和最基础的总线分析,接下来看看怎么使用TS发送报文以及图形化分析数据。 目录 一、使用Graphics分析报文信号/变量(对标CANoe Graphics) 二、使用数值窗口统计信号值/变量 三、使用TS发送报文 3…...
【操作系统】实验七:显示进程列表
实验7 显示进程列表 练习目的:编写一个模块,将它作为Linux内核空间的扩展来执行,并报告模块加载时内核的当前进程信息,进一步了解用户空间和内核空间的概念。 7.1 进程 进程是任何多道程序设计的操作系统中的基本概念。为了管理…...
day10 电商系统后台API——接口测试(使用postman)
【没有所谓的运气🍬,只有绝对的努力✊】 目录 实战项目简介: 1、用户管理(8个) 1.1 登录 1.2 获取用户数据列表 1.3 创建用户 1.4 修改用户状态 1.5 根据id查询用户 1.6 修改用户信息 1.7 删除单个用户 1.8 …...
JavaScript ES6+ 语法速通
一、ES6 基础语法 1. let 和 const 声明变量 let:块级作用域,可以重新赋值。const:块级作用域,声明常量,不能重新赋值。 let name Li Hua; name Li Ming; // 可修改const age 21; // age 22; // 报错࿰…...
移动端h5自适应rem适配最佳方案
网页开发中,我们常用的单位有如下几个: px:像素固定,无法适配各分辨率的移动设备em: 该单位受父容器影响,大小为父元素的倍数rem: 因为html根元素大小为16px,所以默认 1rem 16px,rem只受根元素…...
2024年使用 Cython 加速 Python 的一些简单步骤
文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 文章有点长,期望您能坚持看…...
EasyExcel设置表头上面的那种大标题(前端传递来的大标题)
1、首先得先引用easyExcel的版本依赖,我那 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version> </dependency> 2、然后得弄直接的实体类,&…...
【Linux网络编程】第十弹---打造初级网络计算器:从协议设计到服务实现
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Protocol.hpp 1.1、Request类 1.1.1、基本结构 1.1.2、构造析构函数 1.1.3、序列化函数 1.1.4、反…...
无限弹窗?无限重启?
Windows开机自启目录: "%USERPROFILE%\AppData\Roaming\Microsoft\windows\StartMenu\Programs\Startup" 基于这个和 start 命令, shutdown 命令, 编写 bat 病毒程序。 无限弹窗 echo start cmd > hack.txt echo %0 >>…...
深入详解人工智能机器学习常见算法中的K-means聚类
目录 引言 1. K-means聚类的基本概念 1.1 K-means聚类的定义 1.2 K-means聚类的核心思想 1.3 K-means聚类的目标函数 2. K-means聚类的核心原理 2.1 初始化 2.2 分配 2.3 更新 2.4 迭代 3. K-means聚类的具体实现 3.1 K-means聚类的算法流程 3.2 K-means聚类的Pyt…...
lc146LRU缓存——模仿LinkedHashMap
146. LRU 缓存 - 力扣(LeetCode) 法1: 调用java现有的LinkedHashMap的方法,但不太理解反正都不需要扩容,super(capacity, 1F, true);不行吗,干嘛还弄个装载因子0.75还中途扩容一次浪费时间。 class LRUC…...
全面深入解析:C语言动态库
引言 动态库(Dynamic Library)是现代软件开发中不可或缺的一部分,它们不仅提高了代码的重用性和维护性,还显著提升了系统的性能和资源利用率。本文将全面探讨C语言中的动态库,从基础概念到高级应用,通过丰…...
运用 SSM 实现垃圾分类系统智能化升级
目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行性 10 3.1.3 操作可行性 10 …...
LeNet-5:深度学习与卷积神经网络的里程碑
目录 编辑 引言 LeNet-5的结构与原理 输入层 C1层:卷积层 S2层:池化层 C3层:卷积层 S4层:池化层 C5层:卷积层 F6层:全连接层 输出层 LeNet-5的算法基础 LeNet-5的优点 LeNet-5的现代应用 …...
从资产流动分析WIF市场潜力X.game深究其他未知因素
近日,两则关于WIF最新消息引起了投资者们的注意。据报道,11月28日Vintermute在过去13小时内累计从Binance交易所提取了价值533万美元的WIF,此举不仅彰显了其强大的资金实力,更在某种程度上推动了WIF币价的反弹;另一方面…...
深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理
深入解析Vue3响应式系统:从Proxy实现到依赖收集的核心原理 响应式系统的基本原理 作为一个热门的JavaScript框架,Vue在3.x版本中引入了基于Proxy的响应式系统。这个系统的核心思想是利用Proxy对象拦截对数据的访问和修改,从而实现数据的自动更…...
FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…...
Linux网络 UDP socket
背景知识 我们知道, IP 地址用来标识互联网中唯一的一台主机, port 用来标识该主机上唯一的一个网络进程,IPPort 就能表示互联网中唯一的一个进程。所以通信的时候,本质是两个互联网进程代表人来进行通信,{srcIp&…...
如何持续优化呼叫中心大模型呼入机器人的性能?
如何持续优化呼叫中心大模型呼入机器人的性能? 原作者:开源呼叫中心FreeIPCC,其Github:https://github.com/lihaiya/freeipcc 持续优化呼叫中心大模型呼入机器人的性能是一个复杂而细致的过程,它涉及到数据、模型结构…...
鸿蒙项目云捐助第四讲鸿蒙App应用的登陆注册页实现
根据app的操作流程可以知道,当启动页启动后,点击启动页中的页面就进入到了登录页。本讲就是针对于登录注册页的实现,实现的界面参考下图。 这里根据这个素材的参考实现鸿蒙Next云捐助的登录页。 一、鸿蒙Next云捐助登录页的实现 在项目中继…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
Vue 实例的数据对象详解
Vue 实例的数据对象详解 在 Vue 中,数据对象是响应式系统的核心,也是组件状态的载体。理解数据对象的原理和使用方式是成为 Vue 专家的关键一步。我将从多个维度深入剖析 Vue 实例的数据对象。 一、数据对象的定义方式 1. Options API 中的定义 在 Options API 中,使用 …...
