搜档网
当前位置:搜档网 › serialport事件触发方式

serialport事件触发方式

serialport事件触发方式
serialport事件触发方式

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

Dim port As SerialPort = New SerialPort("COM4", 9600, Parity.Even, 8, StopBits.One)

port.Open()

port.DtrEnable = True

port.RtsEnable = True

port.ReceivedBytesThreshold = 64

End Sub

当你需要接收到几个字符触发一次DataReceived的时候,ReceivedBytesThreshold就设置为几

你设置的接收长度不对吧,你设置为1试试不就知道了嘛

设置为port.ReceivedBytesThreshold =1也测试过了,也不能触发。

之前用另一种方式,数据传送没有问题(用串口助手测试的)

现在,只是form画面打开了,只是不触发SerialPort1_DataReceived事件???

With SerialPort1

.PortName = "com4"

.BaudRate = 9600

.....

End With

1。简介

随着USB的流行,串口通讯已经应用到日常生活的很多方面了,USB是一种高速的串口通讯协议,USB接口非常复杂,通常被用在需要传输大量数据数据的地方,如U盘、相机、

打印机等。除了USB这种较为奢侈的串口外,在工控和嵌入式行业,大量被使用的是另一种古老的串口协议,RS-232串口。RS-232是一种非常简洁的低速串口通讯接口,它可以同时进行数据接收和发送的工作。

2。.NET 2.0对串口的支持

.NET 2.0提供了对串口通信功能的支持,有关类可以在命名空间System.IO.Ports下找到,这其中最为重要的是SerialPort类。

通过创建一个新的SerialPort 对象,我们就可以在.NET程序中控制串口通讯的全过程。

3。使用SerialPort 设置串口属性

进行串口通讯时,需要设置一些相关参数,可以通过设置SerialPort 类的属性来进行。串口属性主要包括

.PortName 串口名称,COM1, COM2等。

.BaudRate 波特率,也就是串口通讯的速度,进行串口通讯的双方其波特率需要相同,如果用PC连接其他非PC系统,一般地,波特率由非PC系统决定。

.Parity 奇偶校验。可以选取枚举Parity中的值

.DataBits 数据位

.StopBits 停止位,可以选取枚举StopBits中的值

.Handshake 握手方式,也就是数据流控制方式,可以选取枚举Handshake中的值

4。打开与关闭串口

在创建一个SerialPort 对象,设置串口属性后,可以通过Open()方法打开串口。数据读写完成后,可以通过Close()方法关闭串口。

根据经验,对于有些系统,在打开串口后,还需要将RtsEnable设置为True,这样才能读写数据,否则不能正常读写数据。

5。读写行数据

双方通讯时,一般都需要定义通讯协议,即使最简单的通过串口发送文本聊天的程序。

通常是在当一方按下回车时,将其所数据的文本连同换行符发给另一方。在这个通讯事例中,协议桢是通过换行符界定的,每一桢数据都被换行符隔开,这样就很容易识别出通讯双发发送的信息。

在以上的例子中,可以用WriteLine()来发送数据,用ReadLine()来读取数据。WriteLine发送完数据后,会将换行符作为数据也发送给对方。ReadLine()读取数据时,直至遇到一个换行符,然后返回一个字符串代表一行信息。换行符可以通过SerialPort 的属性NewLine来设

置。一般地,Windows将CrLn作为换行符,而在Linux下,换行符则只用一个Ln表示。

ReadLine()方法是阻塞的,直至遇到一个换行符后返回。在读取数据时,如果一直没有遇到换行符,那么在等待ReadTimeout时间后,抛出一个TimeoutException。默认情况下,ReadTimeout为InfiniteTimeout。这样,ReadLine一直处于阻塞状态,直至有新一行数据到达。

WriteLine()方法也是阻塞的,如果另一方不能及时接收数据,就会引起TimeoutException异常。

由于ReadLine()和WriteLine()方法都是阻塞式的,在程序使用SerialPort 进行串口通讯时,一般应该把读写操作交由其他线程处理,避免因为阻塞而导致程序不响应。

6。读写字节或字符数据

对于字节或字符数据,用Read()方法来读数据,该方法需要一个字节或字符数组作为参数来保存读取的数据,结果返回实际读取的字节或字符数。写数据使用Write()方法,该方法可以将字节数组、字符数据或字符串发送给另一方。

如果通讯双方交换的数据位字节流数据,要构建一个使用的串口通讯程序,那么双方应该定义数据桢格式。通常数据桢由桢头和桢尾来界定。

发送数据比较简单,只需要将构造好的数据用Write()方法发送出去即可。

接收数据则比较复杂,通讯是以字节流的形式到达的,通过调用一次Read()方法并不能确保所读取的数据就是完整一桢。因此需要将每次读取的数据整合在一起,对整合后的数据进行分析,按照定义的桢格式,通过桢头和桢尾,将桢信息从字节流中抽取出来,这样才能获取有意义的信息。

除了利用Read()方法来读数据,还可以使用ReadExisting()方法来读取数据。该方法读取当前所能读到的数据,以字符串的形式返回。

7。事件

SerialPort 提供了DataReceived事件。当有数据进入时,该事件被触发。该事件的触发由操作系统决定,当有数据到达时,该事件在辅助线程中被触发。辅助线程的优先级比较低,因此并不能确保每个字节的数据到达时,该事件都被触发。

在使用该事件接收数据时,最好对定义通讯协议格式,添加桢头和桢尾。在DataReceived 事件中接收数据时,把数据放在数组中或字符串中缓冲起来,当接收的包含桢头和桢尾的完整数据时,在进行处理,另外,为了有效地接收数据,可以在每次读取数据后,加入System.Threading.Thread.Sleep方法进行演示。

8。其他

用跳线使串口的第2、3针连接,可以在本地计算机上实现串口通信,所以,通过串口的第2、3针的连接可以对程序进行检测。

https://www.sodocs.net/doc/bc18273830.html,/zhangzhaoyun/pic/item/c99be8d9164ceaf739012fb7.jpg

.BytesToRead 该属性返回能够读到的字节数。

方法名称

说明

Close

关闭端口连接,将IsOpen 属性设置为False,并释放内部Stream 对象

Open

打开一个新的串行端口连接

Read

从SerialPort 输入缓冲区中读取数据字节数

ReadByte

从SerialPort 输入缓冲区中同步读取一个字节

ReadChar

从SerialPort 输入缓冲区中同步读取一个字符

ReadLine

一直读取到输入缓冲区中的NewLine 值

ReadTo

一直读取到输入缓冲区中指定value 的字符串

Write

已重载。将数据写入串行端口输出缓冲区

WriteLine

将指定的字符串和NewLine 值写入输出缓冲区

DiscardInBuffer

DiscardOutBuffer

清空接收缓冲区数据

清空输出缓冲去数据

属性说明

名称

说明

BaseStream

获取SerialPort 对象的基础Stream 对象

BaudRate

获取或设置串行波特率

BreakState

获取或设置中断信号状态

BytesToRead

获取接收缓冲区中数据的字节数

BytesToWrite

获取发送缓冲区中数据的字节数

CDHolding

获取端口的载波检测行的状态

CtsHolding

获取“可以发送”行的状态

DataBits

获取或设置每个字节的标准数据位长度

DiscardNull

获取或设置一个值,该值指示Null 字节在端口和接收缓冲区之间传输时是否被忽略DsrHolding

获取数据设置就绪(DSR) 信号的状态

DtrEnable

获取或设置一个值,该值在串行通信过程中启用数据终端就绪(DTR) 信号Encoding

获取或设置传输前后文本转换的字节编码

Handshake

获取或设置串行端口数据传输的握手协议

IsOpen

获取一个值,该值指示SerialPort 对象的打开或关闭状态

NewLine

获取或设置用于解释ReadLine( )和WriteLine( )方法调用结束的值

Parity

获取或设置奇偶校验检查协议

ParityReplace

获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节PortName

获取或设置通信端口,包括但不限于所有可用的COM 端口

ReadBufferSize

获取或设置SerialPort 输入缓冲区的大小

ReadTimeout

获取或设置读取操作未完成时发生超时之前的毫秒数

ReceivedBytesThreshold

获取或设置DataReceived 事件发生前内部输入缓冲区中的字节数

RtsEnable

获取或设置一个值,该值指示在串行通信中是否启用请求发送(RTS) 信号StopBits

获取或设置每个字节的标准停止位数

WriteBufferSize

获取或设置串行端口输出缓冲区的大小

WriteTimeout

获取或设置写入操作未完成时发生超时之前的毫秒数

ActionEvent事件处理机制

类 ActionEvent https://www.sodocs.net/doc/bc18273830.html,ng.Object java.util.EventObject java.awt.AWTEvent java.awt.event.ActionEvent 所有已实现的接口: Serializable public class ActionEvent extends AWTEvent 指示发生了组件定义的动作的语义事件。当特定于组件的动作(比如被按下)发生时,由组件(比如Button)生成此高级别事件。事件被传递给每一个ActionListener对象,这些对象是使用组件的addActionListener方法注册的,用以接收这类事件。 注:要使用键盘在Button上触发ActionEvent,请使用空格键。 实现ActionListener接口的对象在发生事件时获取此ActionEvent。因此,侦听器不必处理个别鼠标移动和鼠标单击的细节,而是可以处理像“按下按钮”这样的“有意义”(语义)事件。 从以下版本开始: 1.1 另请参见: ActionListener, Tutorial: Java 1.1 Event Model, 序列化表格 字段摘要 static int ACTION_FIRST 用于标识动作事件的 ID 序列的起始编号。 static int ACTION_LAST 用于标识动作事件的 ID 序列的结束编号。 static int ACTION_PERFORMED 此事件 id 指示发生了有意义的动作。 static int ALT_MASK alt 修饰符。 static int CTRL_MASK Ctrl 修饰符。 static int META_MASK

最优控制读书报告

最优控制读书报告 学院 专业 班级 姓名 学号

最优控制理论是现在控制理论的一个重要组成部分。控制理论发展到今天,经历了古典控制理论和现代控制理论两个重要发展阶段,现已进入了以大系统理论和智能控制理论为核心的第三个阶段。对于确定性系统的最优控制理论,实际是从20世纪50年代才开始真正发展起来的,它以1956年原苏联数学家庞特里亚金(Pontryagin)提出的极大值原理和1957年贝尔曼提出的动态规划法为标志。这些理论一开始被应用于航空航天领域,这是由于导弹、卫星等都是复杂的MIMO非线性系统,而且在性能上有极其严格的要求。时至今日,随着数字技术和电子计算机的快速发展,最优控制的应用已不仅仅局限于高端的航空航天领域,而更加渗入到生产过程、军事行动、经济活动以及人类的其他有目的的活动中。最优控制的发展成果主要包括分布式参数的最优控制、随机最优控制、自适应控制、大系统最优控制、微分对策等,可以这样讲,最有控制理论对于国民经济和国防事业起着非常重要的作用。 这个学期开设的最优控制课程,主要介绍的是静态优化,经典变分法以及极小值原理。对于静态优化的方法,解决的主要是如何求解函数的极值问题;变分法则被用来求解泛函的极值问题;极小值原理的方法,适用于类似最短时间控制、最少燃料控制的问题。另外,在这些的基础上,我们还学习研究了线性系统二次型指标的最优控制,即线性二次型问题(LQR)。 类似其他的控制理论与控制工程的专业课程,最优控制的基础不但是有关自动化、控制方面的内容,很大一部分可以说是高等数学,以及更加深刻的数学知识和理论。就这门课程而言,遇到的第一个比较重要的数学命题,就是关于泛函的问题。在学习泛函之前,我们都对于函数的定义非常清楚,简而言之,泛函就是“函数的函数”。在动态系统最优控制问题中,其性能指标就是一个泛函,而性能指标最优即泛函达到极值。

动态规划讲解大全(含例题及答案)

动态规划讲解大全 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。 动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。 虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。 基本模型 多阶段决策过程的最优化问题。 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如图所示:(看词条图) 这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。 记忆化搜索 给你一个数字三角形, 形式如下: 1 2 3 4 5 6 7 8 9 10 找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大. 无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min{f(i+1, j),f(i+1, j + 1)} 对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么

事件机制

事件机制 1.什么是事件? a)在文档中,可以被识别的控件的操作就是事件。鼠标的点击, 单击双击。。鼠标经过移出,键盘按下等。。。 2.事件流? a)在文档中事件执行的顺序就是事件流。 微软公司提出事件的流程应该为冒泡流。 网景公司提出事件的流程应该为捕获流。 W3C为了平衡事件流机制,制订了标准的事件流。 第一阶段:事件流的捕获阶段

第二阶段:处于事件阶段 第三阶段:事件流的冒泡阶段 关于浏览器的问题: 关于标准的事件流,并不是所有的浏览器都能够很好的支持。 能支持标准时间流的浏览器为:IE9+、chrome、firefox、safari、opera,低版本IE678等只支持冒泡流 毋须担心,因为大部分常用事件都是处于冒泡流。 如何添加或者注册事件以及事件的取消: DOM0阶段(无标准阶段) 注册事件 方法1:在HTML中使用事件相关属性 例如:

方法2:在JS的元素节点中使用和事件同名的属性添加 例如:元素节点.onlick=action; 注意:方法2中的action是一个函数,可以是声明函数也可以是一个匿名函数 取消事件 在添加事件的方法2基础上进行重新赋值即可 元素节点.onclick=null;

该方法对于使用DOM0的2中事件添加方法都可以取消。DOM2阶段 注册事件 IE浏览器 attachEvent()方法 格式:元素节点.attachEvent(事件名,事件的执行方法); 参数1:书写时必须是字符串,而且必须有on 参数2:执行事件的方法,要求如果需要删除的情况下必须写声明函数,只有确认不需要删除的情况下才可以使 用匿名函数。推荐使用声明函数 非IE浏览器 addEventListener() 格式:元素节点.addEventListener(‘事件名’,事件的执行方法,处于事件流的阶段); 参数1:书写必须是字符串,而且不能有on 参数2:执行事件的方法,要求如果需要删除的情况下必须写声明函数,只有确认不需要删除的情况下才可以使 用匿名函数。推荐使用声明函数 参数3:设置事件发生的阶段,true捕获阶段false冒泡阶段,默认是false(推荐false) 取消事件

完整word版iH5初级教程掌握H5的事件机制

iH5初级教程:掌握H5的事件机制 简介: iH5的事件工具有很多的用处,而事件工具是很多中交互或互动的网页中必备的工具,当然这h5页面也不例外,这也就是平常我们在制作网页交互逻辑的工具。工具: 1.微信H5页面的制作素材,包括图片,音乐,文案 2.可以到iH5官网上选择自己喜欢的作品来获取灵感。 步骤: 1.先来看看事件的概念,h5页面有很多的元素,包括图片、视频、音频等,那么需要它有一些动态的效果,这就需要有时间的概念和交互的关系。所谓交互逻辑就是这些素材间的互动关系,例如点击视频开始播放、文字撞击使图片被撞走,这些都是由事件触发的。 2.开始使用事件。首先在舞台下添加图片,选中对象树中的矩形图片 ,点击工具栏事件工具,添加事件,这样事件作为这个矩形图的子对象,3.左边我们可以看见事件1的三个选框。

4.触发条件可以自由选择,实际上就是这个对象有一个什么样的操作的时候或者有一个什么动作的时候事件会被触发,建议PC端选择点击,手机端选择手指按下。在这里我们选择点击是最简单的。 5.目标对象的选择指的是事件触发的对象,可以通过选框选择舞台、矩形或者是圆,在对象多的时候可以使用“从舞台或对象选择”,点击它可以直接在右侧对象树的舞台上面点击选择对象,在这里我们选择 圆。. 6.选择了圆以后会有很多的动作可以选择,这里我们选择让它交替显示,这样的话就可以在点击矩形的时候让圆不断地显示和隐藏。

每个对象下都可以兼有多个触发条件,其中哪一个触发条件符合触发事件,目7. 标对象的动作就会开始。更多的零代码的交互设计可以登陆iH5的官网进行学习。 知识点: 1、事件:事件对象是iH5编辑器中制作互动效果的重要工具,它用来设定对象与对象之间的相互控制关系,比如,当一个图片对象被点击的时候,一个视频对象会开始播放。添加一个事件的过程包括:选中预添加事件的父对象,该对象即 为触发对象,如果该对象可以设置触发条件,工具栏的事件组件会点亮,点击事件工具图标即可添加。由于事件对象也是一类功能性的对象,它不能在舞台上被显示,因此你必须通过对象树来选中它,进而通过属性面板来对它进行进一步编辑。

状态反馈控制的特性及发展

状态反馈控制的主要特性及发展 摘要: 控制理论是关于控制系统建模、分析、综合设计的一般理论,是一门技术科学。控制理论的产生及发展与控制技术的发展密切相关,是人类在认识世界和改造世界的过程中逐步形成的,并随着社会的发展和科学的进步而不断发展,状态反馈控制是现代控制理论中一个十分重要的部分,其在实际工程领域中占有举足轻重的地位。 本论文分为三个部分,第一部分主要是介绍了现代控制理论的发展与组成要素以及特点,第二部分介绍了状态反馈控制的主要特性,如:可控性、可观性等。第三部分主要是介绍了状态反馈控制的发展历程,随着科学技术的发展,状态反馈控制理论将在人们认识事物运动的客观规律和改造世界中将得到进一步的发展和完善。 1.前言 1.1现代控制理论概述 对系统或对象施加作用或限制,使其达到或保持某种规定或要求的运动状态。施加作用或限制的本质就是对系统的调节,其依据是给定任务目标和系统变化。因此,控制就是为了实现任务目标给系统或对象的调节作用。这种调节作用是由系统或对象自身完成时,就是自动控制。控制的基本要素如下: (1)控制对象或系统。要了解对象的性质,需建立或辨识系统模型 (2)控制方法。确定适当的调节作用 (3)反馈。检验和协调控制作用 按照控制系统分析设计方法和要求的不同,控制理论存在经典控制理论和现代控制理论之分。一般来说,1960年代以前形成的控制理论属于经典控制理论,其后形成的是现代控制理论。现代控制理论主要包括线性系统理论、系统辨识与建模、最优滤波理论、最优控制、自适应控制五个分支。其中,线性系统理论主要包括系统的状态空间描述、能控性、能观测性和稳定性分析,状态反馈、状态观测器及补偿理论和设计方法等内容。线性系统理论是现代控制理论中理论最完善、技术上较成熟、应用也最广泛的部分,是现代控制理论的基础。 从20世纪50年代末开始,随着科学技术的发展和生产实际的进一步需要,出现了多输入/多输出控制系统、非线性控制系统和时变控制系统的分析与设计问题。与此同时,近代数学的形成和数字计算机的出现为现代控制理论的建立和发展准备了两个重要的条件。近代

重大突发事件信息报送制度

幸福路小学重大突发事件信息报送制度 为了预防、控制学校突发事故的发生,提高快速反应、信息报送和应急处理重大突发事件的能力,确保学校各项设施的安全运行,保障学校正常的教学科研、办公及生活秩序,特制定本制度。 一、工作目标 1、普及各类突发事件的应急常识,提高师生、职工的配合意识。 2、建立快速反应、信息报送和应急处理机制,及时采取措施,确保重大突发事件达到及时报送、控制,保障学校及师生安全。 二、工作原则 1、预防为主,常备不懈。立足于防范,抓早、抓小,强化信息的广泛收集和深层次研究,争取早发现,早报告,早控制,早解决。做好宣传普及重大突发事件的防控措施,提高师生应对突发事件的水平,及时采取预防与控制措施,防止事态的扩大。 2、统一指挥,快速反应。严格执行国家有关法律法规,对于违法行为,依法追究责任。成立重大突发事件领导小组,全面负责重大突发事件的处置工作,形成处置重大突发事件的快速反应机制。一旦发生重大事件,确保发现、报告、指挥、处置等环节的紧密衔接,做到快速反应,正确应对,果断处置,力争把问题解决在萌芽状态。 3、加强保障,重在建设。从法规上、制度上、组织上、物质上全面加强保障措施。在领导精力、经费保障和力量部署等方面加强硬件与软件建设,提高工作效率。 4、条块结合,以块为主。发生突发事件后,在重大突发事件领导小组的统一领导下,启动应急预案,重大突发事件的预防和控制工作实行条块结合,以块为主。 5、快速反应,运转高效。建立预警控制和处理快速反应机制,强化人

力、物力、财力储备,增强应急处理能力。按照“四早”要求,即早发现、早报告、早控制、早处理,及时快速对突发事件做出反应。 6、系统联动,群防群控。发生突发事件后,各相关部门负责人要立即深入第一线,掌握情况,开展工作,控制局面。形成各级各部门系统联动,群防群控的处置工作格局。 三、组织管理 (一)组织机构 突发事件领导小组,组成人员如下: 组长:杨静 成员:刘新陈凌波马刚尹喜王杉李耀猛 (二)主要职责: 1、负责信息报送、应急预案的制订、修订、处置。 2、检查监督突发事件的防控措施。 3、第一时间到达现场,指挥、控制和及时处理突发事件。 4、及时通知上级领导,并以多种方式通知全校师生。 5、写出突发事件的情况报告。 (三)报送原则 不瞒报,不漏报,不虚报,第一时间实是求是报送教育局及派出所等有关安全部门。 四、各类重大突发事件的应急反应 (一)重大突发火灾事故 1、由于供电线路短路引起的,应在第一时间切断所有电源,组织人员 使用灭火器灭火,并报突发事件领导小组,若火势较大,应及时向“119” 报警求援,争取把损失降到最低。 2、由于使用电、气焊引起火灾事故,应在第一时间组织人员使用灭火

最优控制理论的发展与展望

最优控制理论的发展与展 望 Last revision on 21 December 2020

最优控制理论的发展与展望 摘要:回顾最优控制的基本思想、常用方法及其应用,并对其今后的发展方向和面临的困难提出一些看法。 关键词:最优控制:最优化技术;遗传算法;预测控制 Abstract: The basic idea, method and application of optimal control are reviewed, and the direction of its development and possible difficulties are predicted. Keywords: optimal control; optimal Technology;Genetic Algorithm;Predictive Control 1引言 最优控制理论是本世纪60年代迅速发展的现代控制理论中的主要内容之一,它研究和解决如何从一切可能的方案中寻找一个最优的方案。1948年维纳等人发表《控制论一关于动物和机器中控制与通信的科学》论文,引进信息、反馈和控制等概念,为最优控制理论诞生和发展奠定了基础。我国着名学者钱学森在1954年编着的《工程控制论》直接促进了最优控制理论的发展与形成。在最优控制理论的形成和发展过程中,具有开创性的研究成果和开辟求解最优控制问题新途径的工作,主要是美国着名学者贝尔曼的“动态规划”和原苏联着名学者庞特里亚金的“最大值原理”。此外,构成最优控制理论及现代最优化技术理论基础的代表性工作,还有库恩和图克共同推导的关于不等式约束条件下的非线性最优必要条件(库恩一图克定理)及卡尔曼的关于随机控制系统最优滤波器等口 2最优控制理论的几个重要内容 最优控制理论的基本思想 最优控制理论是现代控制理论中的核心内容之一。其主要实质是:在满足一定约束条件下,寻求最优控制规律(或控制策略),使得系统在规定的性能指标(目标函数)下具有最优值,即寻找一个容许的控制规律使动态系统(受控对象、从初始状态转移到某种要求的终端状态,保证所规足的性能指标达到最小(大)值。

最优控制理论的发展与展望

最优控制理论的发展与展望 摘要:回顾最优控制的基本思想、常用方法及其应用,并对其今后的发展方向和面临的困难提出一些看法。 关键词:最优控制:最优化技术;遗传算法;预测控制 Abstract: The basic idea, method and application of optimal control are reviewed, and the direction of its development and possible difficulties are predicted. Keywords: optimal control; optimal Technology;Genetic Algorithm ;Predictive Control 1 引言 最优控制理论是本世纪60 年代迅速发展的现代控制理论中的主要内容之一, 它研究和解决如何从一切可能的方案中寻找一个最优的方案。1948 年维纳等人发表《控制论一关于动物和机器中控制与通信的科学》论文,引进信息、反馈和控制等概念,为最优控制理论诞生和发展奠定了基础。我国著名学者钱学森在1954 年编著的《工程控制论》直接促进了最优控制理论的发展与形成。在最优控制理论的形成和发展过程中,具有开创性的研究成果和开辟求解最优控制问题新途径的工作,主要是美国著名学者贝尔曼的“动态规划”和原苏联著名学者庞特里亚金的“最大值原 理” 。此外,构成最优控制理论及现代最优化技术理论基础的代表性工作,还有库恩和图克共同推导的关于不等式约束条件下的非线性最优必要条件(库恩一图克定理)及卡尔曼的关于随机控制系统最优滤波器等口 2 最优控制理论的几个重要内容 2.1 最优控制理论的基本思想最优控制理论是现代控制理论中的核心内容之一。其主要实质是:在满足一定约束条件下,寻求最优控制规律(或控制策略),使得系统在规定的性能指标(目标函数)下具有最优值,即寻找一个容许的控制规律使动态系统(受控对象、从初始状态转移到某种要求的终端状态,保证所规足的性能指标达到最小(大)值。 2.2 最优控制问题的常用方法 ?变分法 ?最小值原理 ?动态规划 2.3 最优化技术概述及基本方法一般最优化方法解决实际工程问题可分为三步: ①据 所提出的最优化问题,建立数学模型,确定变量,列出约束条件和目标函 数;②对所建立的数学模型进行具体分析和研究,选择最优化求解方法:③根据最 优化方法的算法列出程序框图和编写语言程序,用计算机求出最优解,并对算法的

§7.4动态规划与离散系统最优控制

§ 7.4 动态规划与离散系统最优控制 1. 动态规划基本原理 最优性原则应有如此性质: 即无论(整个过程的)初始状态和初始决策如何,其余(后段)各决策对于由第一个决策(后)所形成的状态作为(后段)初始状态来说,必须也是一个最优策略。 A B C D E 最优性原则 图7.5

用式表示 1() ()min{(,())(())},1,2,,n n n n n u x J x R x u x J u x n N -=+= 阶段变量n (分析次序) 状态变量x 决策变量()n u x 决策组11{,, ,}n n u u u - 损失(效益)函数:(,)n R x u 对x 用决策n u 所付代价(效益) 后部最优策略函数()n J x 由x 至终最小损失(最大效益)

A 到D 的最短路线 解 3阶段的决策过程, 在CD 段(首), (分析)阶段变量1n =; 7.6 图A 2C 1 B D 2 B 3 B 1 C 3 C 4 5 55 6 3 3) b (A 2 C 1B D 2 B 3 B 1 C 3 C 4 4 5 55 55 66677 7 3 3 (a) 3 =n 1 =n 2 =n

111111*********()(,)3,();()(,)5,();()(,)3,(). J C R C D u C D J C R C D u C D J C R C D u C D ========= 在BC 段(首), (分析)阶段变量2n =; 21111,2,3 ()min{(,)()} min{73,65,53}8i i i J B R B C J C ==+=+++=,213()u B C =; 22211,2,3 ()min{(,)()} min{63,55,73}9i i i J B R B C J C ==+=+++=,221()u B C =; 23311,2,3 ()min{(,)()} min{53,65,73}8 i i i J B R B C J C ==+=+++=,231()u B C =;

OSAL系统框架专题(触发事件三种方式的详细介绍)

OSAL系统框架专题2010-4-15 2:47:00 9. TI协议栈所用系统框架探讨。 51的系统往往不是太大,但是几十K的程序,也足以让一个初学者望而却步。我们首先忽略C 语言本身的难度,光是系统框架也让生手读起来很吃力,再加上这种到处是API跟"define"的程序,还没有正式学习协议部分就已经让人在丛林中“迷路”了。 在接下来的一段时间内,我会以TI所用的系统框架为主线进行学习,希望大家共同探讨。。。 在层层迷雾中摸索了两天,终于拨云见日,那个心情啊,怎一个“爽”字了得~~~ 可是怎么能把这么复杂的一个问题讲得清楚呢?嗯。。。还是先上图吧 注:为了便于直观,以下涉及到数据地址的地方都是由上而下,地址由高变低 第1节、各个任务是如何被调用到的? 我们还是先从main()函数开始,看看各个任务之间是如何协调工作的。 我们直接进入主循环的核心部分,看一下系统中的几个主要的任务是如何被调用,并开始自己的使命的? 看一段程序的时候,往往要从它的数据结构入手。我们先看一下,主循环中的两个关键数组,*

tasksEvents与*tasksArr,从图一中我们可以看出来,tasksEvents这个数组存放的是从序号为0到tasksCnt,每个任务在本次循环中是否要被运行,需要运行的任务其值非0(用橙色表示),否则为0。而tasksArr数组则存放了对应每个任务的入口地址,只有在tasksEvents中记录的需要运行的任务,在本次循环中才会被调用到。--这节讲完了。。。 把main函数贴过来,我们一点一点看 初始化过程“先不管”,我们先看主循环(dead loop) for(;;) // Forever Loop { uint8 idx = 0; Hal_ProcessPoll(); // 先不管1 do { if (tasksEvents[idx]) // 寻找最高优先级的任务来运行 { break; } } while (++idx < tasksCnt); if (idx < tasksCnt) { uint16 events; halIntState_t intState; HAL_ENTER_CRITICAL_SECTION(intState); events = tasksEvents[idx]; tasksEvents[idx] = 0; // 本任务运行完了,要对其清空,为后面要运行的任务让路 HAL_EXIT_CRITICAL_SECTION(intState); events = (tasksArr[idx])( idx, events ); //最关键的一句话,如图一中,运行对应的任务 HAL_ENTER_CRITICAL_SECTION(intState); tasksEvents[idx] |= events; // 本任务可能没完全完成,如果是这样,再次设置标志位,在下一次循环中继续执行 HAL_EXIT_CRITICAL_SECTION(intState); } } 第2节、系统时间 我们知道,每个操作系统(虽然我不认为OSAL是一个标准的操作系统,但我们先这么叫着吧)都有一个“节拍”-tick,就像每一个“活人”都有心跳一样。那么OSAL的心跳有多快呢?--1ms。当然这个速度是可以设置的,在osal_timer_activate函数中开启了系统节拍,用TIC

GUI系统的事件机制

所谓事件就是指发送给GUI系统的消息,该消息通知GUI系统某种事情已经发生,要求作出响应。事件根据来源可分为以下几种: 1.计算机输入输出设备产生的中断事件,如鼠标和键盘同GUI系统的交互操作。这种事件是最原生的“底层”事件,一般都需要组件做深入处理,籍此触发更高抽象层次具有语义的逻辑事件。为GUI系统扩展自定义组件往往需要编写处理这些事件,派发高级逻辑事件。Swing中这些事件对应的有MouseEvent、KeyEvent等。 2.GUI系统触发的逻辑事件。这种事件是1中所提的原始事件经过组件的处理后发出的高级事件,比如Swing的JButton产生的ActionEvent。另外通知界面重绘的Paint事件也是高级逻辑事件,这种事件在接收到EXPOSE事件或系统显式调用repaint方法后触发的事件。 3.应用程序触发的事件。应用程序主动触发新事件可以有两种方式来进行,第一种是事件通过添加到系统事件队列进行派发。Swing中通过postEvent、repaint及invokeLater等方法,向系统事件队列添加事件。这种触发机制实质上是调度,触发事件的线程和事件派发线程可以不是同一个线程。事件被添加到系统事件队列后触发过程结束,而之后事件的处理要在事件派发线程上等待执行。第二种是通过调用组件的派发方法(Swing中是fireEventXXXX)触发。使用这种方法,事件对象不会被放到系统事件队列中去,而是直接传递给事件处理方法处理。它的触发机制实质上是函数调用。这种事件触发方式要求事件处理线程必须同时是事件派发线程。 GUI系统的事件模型根据事件处理线程和事件派发线程的关系可分为两种,一种是单线程模型,另一种是多线程模型。单线程模型是指事件的处理线程和派发线程是同一线程。事件从事件队列中取出之后,立即在当前线程中处理,处理完后才取下一个事件继续循环。多线程模型是指事件派发线程只负责从事件队列中获取事件。获取到新的事件后,它会启动新的事件处理线程,并将事件交由此线程处理,之后派发线程并不等待事件处理线程完成,而是立即获取下个事件进行派发。下面的图将这两种模型放在同一张示意图中进行了对比。

基于事件和时间触发嵌入式系统编程思想

基于事件和时间触发嵌入式系统编程思想 1 传统编程结构的局限性 当不使用RTOS时,嵌入式软件通常采用两种传统的编程结构进行编程,一种叫“前后台结构”或者叫“超级循环结构”,本质上是事件触发的编程方式,另一种叫时间触发的编程方式,Michael J.Pont的“基于时间触发的编程模式”即属于此。 在实际工作中,当系统稍微复杂时,会发现这两种方式都有一定局限性,下面以一个实际产品设计中遇到的问题为例来说明。 在设计一个用于配电柜的壁装式智能配电仪表时,CPU的程序设计需完成以下任务: (1)每半秒对前显示屏的显示数据进行一次刷行。 (2)每0.1秒对DI/DO进行一次刷新。 (3)每0.2秒对键盘进行一次扫描。 (4)每半秒对测量数据进行一次重新采集和计算。 (5)异步串行口与上位机使用Modbus通信,速率最高19200bps。 (6)CPU通过IIC总线与时钟芯片和EEprom通信。 (7)CPU通过SPI总线与LED数码管及采集芯片通信。 (8)CPU要对所采集的6路信号进行FFT变换。 (9)当系统掉电时,CPU要能快速响应以把当前的电度底数写入EEprom中。 上述任务中,任务(5)和任务(9)是强实时性的,如果对串口的收发事件得不到及时响应,接收时会导致字节丢失,发送时会导致字节间时间间隔太大造成接收方的Modbus帧定界错误,对系统掉电事件如果不能及时响应会造成EEprom的写入失败。其它任务只要在指定的周期内能得到执行就行,但是任务(8)比较特殊,使用通常的8位CPU进行6种信号的FFT变换,哪怕每种信号只做128点的FFT,运算一次也要好几秒。下面来看用传统编程结构实现上述设计时遇到的困扰。 1.1 使用“前后台方式”进行编程 使用“前后台方式”进行编程时,为保证任务(5)的及时性,使用了UART中断,当UART完成一个字节的收发后产生中断,在中断程序中将接收到的字符保存在接收缓冲区或从发送缓冲区取下一个待发字符装入UART进行发送,对Modbus协议的处理可以单独用一个任务在中断外处理,这保证了中断程序的简短。为保证任务(9)响应的及时性,也必须为它安排一个中断。因为当系统掉电时,系统只有不到10ms的过渡时间,系统如果不能在这个时间内完成相关的操作,系统电压将跌落至有效电压以下而丧失工作能力。 安排好了后台的中断任务后再来看看前台的任务如何完成。这里遇到的最大的挑战是对任务(8)的处理,因为任务(8)需要的执行时间太长了,简单的把它当成一个任务处理将影响系统对其它任务的响应,在超级循环中的代码结构如下: while(1) { 任务(1); 任务(2); ………

Qt事件机制浅析

Qt事件机制 Qt程序是事件驱动的, 程序的每个动作都是由幕后某个事件所触发.。 Qt事件的发生和处理成为程序运行的主线,存在于程序整个生命周期。 Qt事件的类型很多, 常见的qt的事件如下: 键盘事件: 按键按下和松开. 鼠标事件: 鼠标移动,鼠标按键的按下和松开. 拖放事件: 用鼠标进行拖放. 滚轮事件: 鼠标滚轮滚动. 绘屏事件: 重绘屏幕的某些部分. 定时事件: 定时器到时. 焦点事件: 键盘焦点移动. 进入和离开事件: 鼠标移入widget之内,或是移出. 移动事件: widget的位置改变. 大小改变事件: widget的大小改变. 显示和隐藏事件: widget显示和隐藏. 窗口事件: 窗口是否为当前窗口. 还有一些非常见的qt事件,比如socket事件,剪贴板事件,字体改变,布局改变等等. 交流会围绕以下三个问题展开: 一、什么是事件? 二、事件是怎样被处理的? 三、事件与信号的区别? 一、什么是事件? 事件:某个“动作”的完成后,需让某个对象知道而发送的消息。(个人观点) 解释:此时的“动作”并非通常意义所指的动作,而是广义的“动作”,是主动和被动的总和。 例:两个窗体A和B,当A为最小化状态时,我们使它最大化,这就会让A主动产生一个重绘事件;当A和B非最小化状态,且B位于A窗体之上时,我们让B最小化,那么刚才被B遮挡的A窗体就会被动地产生一个重绘事件。 Qt 的事件和Qt中的signal不一样. 后者通常用来"使用"widget, 而前者用来"实现" widget. 比如一个按钮, 我们使用这个按钮的时候, 我们只关心他clicked()的signal, 至于这个按钮如何接收处理鼠标事件,再发射这个信号,我们是不用关心的. 但是如果我们要重载一个按钮的时候,我们就要面对event了. 比如我们可以改变它的行为,在鼠标按键按下的时候(mouse press event) 就触发clicked()的signal而不是通常在释放的( mouse release event)时候. 我们按产生来源把事件分为两类: (一)系统产生的;通常是window system把从系统得到的消息,比如鼠标按键,键盘按键等, 放入系统的消息队列中,Qt事件循环的时候读取这些事件,转化为QEvent,再依次处理. (二)是由Qt应用程序程序自身产生的.程序产生事件有两种方式, 一种是调用QApplication::postEvent(). 例如QWidget::update()函数,当需要重新绘制屏幕时,程序调用update()函数,new出来一个paintEvent,调用QApplication::postEvent(),将其放入Qt的消息队列中,等待依次被处理. 另一种方式是调用sendEvent()函数. 这时候事件不会放入队列, 而是直接被派发和处理, QWidget::repaint()函数用的就是这种方式。

最优控制实验报告..

实验报告 课程名称:现代控制工程与理论实验课题:最优控制 学号:12014001070 姓名:陈龙 授课老师:施心陵

最优控制 一、最优控制理论中心问题: 给定一个控制系统(已建立的被控对象的数学模型),选择一个容许的控制律,使被控对象按预定要求运行,并使给定的某一性能指标达到极小值(或极大值) 二、最优控制动态规划法 对离散型控制系统更为有效,而且得出的是综合控制函数。这种方法来源于多决策过程,并由贝尔曼首先提出,故称贝尔曼动态规划。 最优性原理:在一个多级决策问题中的最优决策具有这样的性质,不管初始级、初始状态和初始决策是什么,当把其中任何一级和状态做为初始级和初始状态时,余下的决策对此仍是最优决策 三、线性二次型性能指标的最优控制 用最大值原理求最优控制,求出的最优控制通常是时间的函数,这样的控制为开环控制当用开环控制时,在控制过程中不允许有任何干扰,这样才能使系统以最优状态运行。在实际问题中,干扰不可能没有,因此工程上总希望应用闭环控制,即控制函数表示成时间和状态的函数。 求解这样的问题一般来说是很困难的。但对一类线性的且指标是二次型的动态系统,却得了完全的解决。不但理论比较完善,数学处理简单,而且在工际中又容易实现,因而在工程中有着广泛的应用。

一.实验目的 1.熟悉Matlab的仿真及运行环境; 2.掌握系统最优控制的设计方法; 3.验证最优控制的效果。 二.实验原理 对于一个给定的系统,实现系统的稳定有很多途径,所以我们需要一个评价的指标,使系统在该指标下达到最优。如果给定指标为线性二次型,那么我们就可以利用MATLAB快速的计算卡尔曼增益。 三.实验器材 PC机一台,Matlab仿真平台。 四.实验步骤 例题1 (P269)考虑液压激振系统简化后的传递函数方框图如下,其中K a为系统前馈增益,K f为系统反馈增益,w h为阻尼固有频率。(如图5-5所示) 将系统传递函数变为状态方程的形式如下: , 确定二次型指标为: . 求最优控制使性能指标J最小。

最优控制理论课程总结

最优控制理论课程总结 姓名: 肖凯文班级: 自动化1002班学号: 0909100902 任课老师: 彭辉摘要: 最优控制理论是现代控制理论的核心,控制理论的发展来源于控制对象的要求。尽50年来,科学技术的迅速发展,对许多被控对象,如宇宙飞船、导弹、卫星、和现代工业设备的生产过程等的性能提出了更高的要求,在许多情况下要求系统的某种性能指标为最优。这就要求人们对控制问题都必须从最优控制的角度去进行研究分析和设计。最优控制理论研究的主要问题是:根据已建立的被控对象的时域数学模型或频域数学模型,选择一个容许的控制律,使得被控对象按预定要求运行,并使某一性能指标达到最优值[1]。关键字:最优控制理论,现代控制理论,时域数学模型,频域数学模型,控制率Abstract: The Optimal Control Theory is the core of the Modern Control Theory,the development of control theory comes from the requires of the controlled objects、During the50 years, the rapid development of the scientific technology puts more stricter requires forward to mang

controlled objects,such as the spacecraft,the guide missile,the satellite,the productive process of modern industrial facilities,and so on,and requests some performance indexes that will be best in mang cases、To the control problem,it requests people to research ,analyse,and devise from the point of view of the Optimal Control Theory、 There are mang major problems of the Optimal Control Theory studying,such as the building the time domain’s model or the frenquency domain’s model according to the controlled objects,controlling a control law with admitting, making the controlled objects to work according to the scheduled requires, and making the performance index to reseach to a best optimal value、 Keywords: The Optimal Control Theroy, The Modern Control Theroy,The Time Domaint’s Model,The Frequency domain’s Model,The Control Law 一、引言最优控制理论的形成和发展和整个现代自动控制理论的形成和发展分不开的。在20世纪50年代初期,就有人开始发表从工程观点研究最短时间控制问题的文章,尽管其最优性的证明多半借助于几何图形,仅带有启发性质,但毕竟为发展现代控制理论提供了第一批实际模型。由于最优控制问题引人注目的严格表述形式,特别是空间技术的迫切需求,从而吸引了大批科

事件触发机制

事件(event)是一个非常重要的概念,我们的程序时刻都在触发和接收着各种事件:鼠标点击事件,键盘事件,以及处理操作系统的各种事件。所谓事件就是由某个对象发出的消息。比如用户按下了某个按钮,某个文件发生了改变,socket 上有数据到达。触发事件的对象称作发送者(sender),捕获事件并且做出响应的对象称作接收者(receiver),一个事件可以存在多个接受者。 在异步机制中,事件是线程之间进行通信的一个非常常用的方式。比如:用户在界面上按下一个按钮,执行某项耗时的任务。程序此时启动一个线程来处理这个任务,用户界面上显示一个进度条指示用户任务执行的状态。这个功能就可以使用事件来进行处理。可以将处理任务的类作为消息的发送者,任务开始时,发出“TaskStart”事件,任务进行中的不同时刻发出“TaskDoing”事件,并且携带参数说明任务进行的比例,任务结束的时候发出“TaskDone”事件,在画面中接收并且处理这些事件。这样实现了功能,并且界面和后台执行任务的模块耦合程度也是最低的。 具体说C#语言,事件的实现依赖于“代理”(delegate)的概念,先了解一下代理。 代理(delegate) delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。它所实现的功能与C/C++中的函数指针十分相似。它允许你传递一个类A的方法m给另一个类B的对象,使得类B的对象能够调用这个方法m。但与函数指针相比,delegate有许多函数指针不具备的优点。首先,函数指针只能指向静态函数,而delegate既可以引用静态函数,又可以引用非静态成员函数。在引用非静态成员函数时,delegate不但保存了对此函数入口指针的引用,而且还保存了调用此函数的类实例的引用。其次,与函数指针相比,delegate是面向对象、类型安全、可靠的受控(managed)对象。也就是说,runtime能够保证delegate指向一个有效的方法,你无须担心delegate 会指向无效地址或者越界地址。 实现一个delegate是很简单的,通过以下3个步骤即可实现一个delegate: 1.声明一个delegate对象,它应当与你想要传递的方法具有相同的参数和返回值类型。 2.创建delegate对象,并将你想要传递的函数作为参数传入。 3.在要实现异步调用的地方,通过上一步创建的对象来调用方法。 下面是一个简单的例子:

最优控制

最优控制 学院 专业 班级 姓名 学号

1948年维纳发表了题为《控制论—关于动物和机器中控制与通讯的科学》的论文,第一次科学的提出了信息、反馈和控制的概念,为最优控制理论的诞生和发展奠定了基础。钱学森1954年所着的《工程控制论》直接促进了最优控制理论的发展和形成。 最优控制理论所研究的问题可以概括为:对一个受控的动力学系统或运动过程,从一类允许的控制方案中找出一个最优的控制方案,使系统的运动在由某个初始状态转移到指定的目标状态的同时,其性能指标值为最优。这类问题广泛存在于技术领域或社会问题中。 从数学上看,确定最优控制问题可以表述为:在运动方程和允许控制范围的约束下,对以控制函数和运动状态为变量的性能指标函数(称为泛函)求取极值(极大值或极小值)。解决最优控制问题的主要方法有古典变分法(对泛函求极值的一种数学方法)、极大值原理和动态规划。最优控制已被应用于综合和设计最速控制系统、最省燃料控制系统、最小能耗控制系统、线性调节器等。 例如,确定一个最优控制方式使空间飞行器由一个轨道转换到另一轨道过程中燃料消耗最少,选择一个温度的调节规律和相应的原料配比使化工反应过程的产量最多,制定一项最合理的人口政策使人口发展过程中老化指数、抚养指数和劳动力指数等为最优等,都是一些典型的最优控制问题。最优控制理论是50年代中期在空间技术的推动下开始形成和发展起来的。苏联学者Л.С.庞特里亚金1958年提出的极大值原理和美国学者R.贝尔曼1956年提出的动态规划,对最优控制理论的形成和发展起了重要的作用。线性系统在二次型性能指标下的最优控制问题则是R.E.卡尔曼在60年代初提出和解决的。 最优控制理论-主要方法 解决最优控制问题的主要方法 解决最优控制问题,必须建立描述受控运动过程的运动方程 为了解决最优控制问题,必须建立描述受控运动过程的运动方程,给出控制变量的允许取值范围,指定运动过程的初始状态和目标状态,并且规定一个评价运动过程品质优劣的性能指标。通常,性能指标的好坏取决于所选择的控制函数和相应的运动状态。系统的运动状态受到运动方程的约束,而控制函数只能在允许的范围内选取。因此,从数学上看,确定最优控制问题可以表述为:在运动方程和允许控制范围的约束下,对以控制函数和运动状态为变量的性能指标函数(称为泛函)求取极值(极大值或极小值)。解决最优控制问题的主要方法有古典变分法、极大值原理和动态规划。

相关主题