当前位置:文档之家› 03@@v4l2驱动

03@@v4l2驱动

03@@v4l2驱动
03@@v4l2驱动

V4L2的是V4L的第二个版本。原来的V4L被引入到Linux内核2.1.x的开发周期后期。Video4Linux2修正了一些设计缺陷,并开始出现在2.5.X内核。Video4Linux2驱动程序包括Video4Linux1应用的兼容模式,但实际上,支持是不完整的,并建议V4L2的设备使用V4L2的模式。现在,该项目的DVB-Wiki托管在LinuxTV的网站上。

要想了解V4l2有几个重要的文档是必须要读的,Documentation/video4linux目录下的V4L2-framework.txt和videobuf、V4L2的官方API文档V4L2API Specification、drivers/media/video目录下的vivi.c(虚拟视频驱动程序-此代码模拟一个真正的视频设备V4L2 API)。

V4l2可以支持多种设备,它可以有以下几种接口:

1.视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头.V4L2的最初设计就是应用于这种功能的.

2.视频输出接口(video output interface):可以驱动计算机的外围视频图像设备--像可以输出电视信号格式的设备.

3.直接传输视频接口(video overlay interface):它的主要工作是把从视频采集设备采集过来的信号直接输出到输出设备之上,而不用经过系统的CPU.

4.视频间隔消隐信号接口(VBI interface):它可以使应用可以访问传输消隐期的视频信号.

5.收音机接口(radio interface):可用来处理从AM或FM高频头设备接收来的音频流.

V4L2驱动核心

V4L2的驱动源码在drivers/media/video目录下,主要核心代码有:

v4l2-dev.c

//linux版本2视频捕捉接口,主要结构体video_device的注册

v4l2-common.c//在Linux

操作系统体系采用低级别的操作一套设备structures/vectors的通用视频设备接口。

//此文件将替换videodev.c的文件配备常规的内核分配。

v4l2-device.c// V4L2的设备支持。注册v4l2_device

v4l22-ioctl.c

//处理V4L2的ioctl命令的一个通用的框架。

v4l2-subdev.c//v4l2子设备

v4l2-mem2mem.c//内存到内存为Linux和videobuf视频设备的框架。设备的辅助函数,使用其源和目的地videobuf 缓冲区。

头文件linux/videodev2.h、media/v4l2-common.h、

media/v4l2-device.h、media/v4l2-ioctl.h、media/v4l2-dev.h、

media/v4l2-ioctl.h等。

V4l2相关结构体

1.V4l2_device

struct V4l2_device{

/*DEV->driver_data指向这个结构。注:DEV可能是空的,如果没有父设备是如同ISA设备。*/

struct device*dev;

/*用于跟踪注册的subdevs*/

struct list_head subdevs;

/*锁定此结构体;可以使用的驱动程序以及如果这个结构嵌入到一

个更大的结构。*/

spinlock_t lock;

/*独特的设备名称,默认情况下,驱动程序姓名+总线ID*/

char name[V4L2_DEVICE_NAME_SIZE];

/*报告由一些子设备调用的回调函数。*/

void(*notify)(struct v4l2_subdev*sd,

unsigned int notification,void*arg);

};

v4l2_device注册和注销

v4l2_device_register(struct device*dev,struct

v4l2_device*v4l2_dev);

第一个参数‘dev’通常是一个pci_dev的struct device的指针,但它是ISA设备或一个设备创建多个PCI设备时这是罕见的DEV为NULL,因此makingit不可能联想到一个特定的父母v4l2_dev。您也可以提供一个notify()回调子设备,可以通过调用通知你的事件。取决于你是否需要设置子设备。一个子设备支持的任何通知必须在头文件中定义.

注册时将初始化v4l2_device结构体.如果dev->driver_data字段是空,它将连接到v4l2_dev.

v4l2_device_unregister(struct v4l2_device*v4l2_dev);

注销也将自动注销设备所有子设备。

2.video_device

在/dev目录下的设备节点使用的struct video_device

(v4l2_dev.h)创建。

struct video_device

{

/*设备操作函数*/

const struct v4l2_file_operations*fops;

/*虚拟文件系统*/

struct device dev;/*v4l设备*/

struct cdev*cdev;/*字符设备*/

struct device*parent;/*父设备*/

struct v4l2_device*v4l2_dev;/*v4l2_device parent*/

/*设备信息*/

char name[32];

int vfl_type;

/*'minor'is set to-1if the registration failed */

int minor;

u16num;

/*use bitops to set/clear/test flags*/

unsigned long flags;

/*属性来区分一个物理设备上的多个索引*/

int index;

/*V4L2文件句柄*/

spinlock_t fh_lock;/*锁定所有的

v4l2_fhs*/

struct list_head fh_list;/*List of struct v4l2_fh*/

int debug;/*Activates debug level*/

/*Video standard vars*/

v4l2_std_id tvnorms;/*Supported tv norms*/

v4l2_std_id current_norm;/*Current tvnorm */

/*释放的回调函数*/

void(*release)(struct video_device*vdev);

/*控制的回调函数*/

const struct v4l2_ioctl_ops*ioctl_ops;

}

动态分配:

struct video_device*vdev=

video_device_alloc();

结构体配置:

fops:设置这个v4l2_file_operations结构,

file_operations的一个子集。v4l2_dev:设置这个v4l2_device父设备

name:

ioctl_ops:使用v4l2_ioctl_ops简化的IOCTL,然后设置v4l2_ioctl_ops结构。

lock:如果你想要做的全部驱动程序锁定就保留为NULL。否则你给它一个指针指向一个mutex_lock结构体和任何

v4l2_file_operations被调用之前核心应该释放释放锁。

parent:一个硬件设备有多个PCI设备,都共享相同

v4l2_device核心时,设置注册使用NULL v4l2_device作为父设备结构。

flags:可选的。设置到V4L2_FL_USE_FH_PRIO如你想让框架处理VIDIOC_G/S_PRIORITY的ioctl。这就需要您使用结构v4l2_fh。这个标志最终会消失,一旦所有的驱动程序使用的核心优先处理。但现在它必须明确设定。

如果使用v4l2_ioctl_ops,那么你应该设置。

unlocked_ioctlvideo_ioctl2在v4l2_file_operations结构。

注册/注销video_device:

video_register_device(struct video_device*vdev,int type, int nr);

__video_register_device(struct video_device*vdev,int type, int nr,int warn_if_nr_in_use)

参数:

vdev:我们要注册的视频设备结构。

type:设备类型注册

nr:设备号(0==/dev/video0,1??==

/dev/video1,...-1==释放第一个)

warn_if_nr_in_use:如果所需的设备节点号码已经在使用另一个号码代替选择。

注册程式分配次设备号和设备节点的数字根据请求的类型和注册到内核新设备节点。如果无法找到空闲次设备号或设备节点编号,或者如果设备节点注册失败,就返回一个错误。

video_unregister_device(struct video_device *vdev);

3.v4l2_subdev

每个子设备驱动程序必须有一个v4l2_subdev结构。这个结构可以独立简单的设备或者如果需要存储更多的状态信息它可能被嵌入在一个更大的结构。由于子设备可以做很多不同的东西,你不想结束一个巨大的OPS结构其中只有少数的OPS通常执行,函数指针进行排序按类别,每个类别都有其自己的OPS结构。顶层OPS结构包含的类别OPS结构,这可能是NULL如果在subdev驱动程序不支持任何从该类别指针。

struct v4l2_subdev{

#if defined(CONFIG_MEDIA_CONTROLLER)

struct media_entity entity;

#endif

struct list_head list;

struct module*owner;

u32flags;

struct v4l2_device*v4l2_dev;

const struct v4l2_subdev_ops*ops;

/*从驱动程序中不要调用这些内部操作函数!*/

const struct v4l2_subdev_internal_ops

*internal_ops;

/*这个subdev控制处理程序。可能是NULL。*/

struct v4l2_ctrl_handler*ctrl_handler;

/*名字必须是唯一*/

char name[V4L2_SUBDEV_NAME_SIZE];

/*可用于到类似subdevs组,值是驱动程序特定的*/

u32grp_id;

/*私有数据的指针*/

void*dev_priv;

void*host_priv;

/*subdev设备节点*/

struct video_device devnode;

/*事件的数量在打开的时候被分配*/

unsigned int nevents;

};

4.v4l2_buffer

struct v4l2_buffer{

__u32index;

enum v4l2_buf_type type;

__u32bytesused;

__u32flags;

enum v4l2_field field;

struct timeval timestamp;

struct v4l2_timecode timecode;

__u32sequence;

/*memory location*/

enum v4l2_memory memory;

union{

__u32offset;

unsigned long userptr;

}m;

__u32length;

__u32input;

__u32reserved;

};

V4L2核心API提供了一套标准方法的用于处理视频缓冲器(称为“videobuf”)。这些方法允许驱动程序以一致的方式来实现read(),mmap()和overlay()。目前使用的设备上的视频缓冲器,支持scatter/gather方法(videobuf-dma-SG),线性存取的DMA的(videobuf-DMA-contig),vmalloc 分配的缓冲区,主要用于在USB驱动程序(DMA缓冲区的方法

videobuf-vmalloc)。

videobuf层的功能为一种V4L2驱动和用户空间之间的粘合层。它可以处理存储视频帧缓冲区的分配和管理。有一组可用于执行许多标准的POSIX I /O系统调用的功能,包括read(),poll()的,happily,mmap()。另一套功能可以用来实现大部分的V4L2的ioctl()调用相关的流式I/O 的,包括缓冲区分配,排队和dequeueing,流控制。驱动作者使用videobuf 规定了一些设计决定,但回收期在驱动器和一个V4L2的用户空间API的贯彻实施在减少代码的形式。

关于videobuf的层的更多信息,请参阅

Documentation/video4linux/videobuf

V4l2驱动架构

驱动架构图

所有的驱动程序有以下结构:

1)每个设备包含设备状态的实例结构。

2)子设备的初始化和命令方式(如果有).

3)创建V4L2的设备节点(/dev/videoX,/dev/vbiX and /dev/radioX)和跟踪设备节点的具体数据。

4)文件句柄特定的结构,包含每个文件句柄数据;

5)视频缓冲处理。

驱动源码分析https://www.doczj.com/doc/f67008564.html,

vivi.c虚拟视频驱动程序

-----此代码模拟一个真正的视频设备V4L2API(位于drivers/media/video目录下)

入口:+int__init vivi_init(void)

+vivi_create_instance(i)/*创建设备*//**/。

+分配一个

vivi_dev的结构体/*它嵌套这结构体v4l2_device和video_device*/

+

v4l2_device_register(NULL,&dev->v4l2_dev);/*注册vivi_dev中的

V4l2_device*/

+初始化视频的DMA队列

+初始化锁

+

video_device_alloc();动态分配video_device结构体

+构建一个

video_device结构体vivi_template并赋给上面分配的video_device

st atic struct video_device vivi_template={

.name="vivi",

.fops=&vivi_fops,

.ioctl_ops=&vivi_ioctl_ops,

.minor=-1,

.release=video_device_release,

.tvnorms=

V4L2_STD_525_60,

.current_norm=V4L2_STD_NTSC_M,

} ;

+

video_set_drvdata(vfd,dev);设置驱动程序专有数据

+所有控件设置为其默认值

+

list_add_tail(&dev->vivi_devlist,&vivi_devlist);添加到设备列表

+构建v4l2_file_operations结构体vivi_fops并实现.open.release.read.poll.mmap函数

-----.ioct l用标准的v4l2控制处理程序

+构建v4l2_ioctl_ops结构体vivi_ioctl_ops

static const struct v4l2_ioctl_ops vivi_ioctl_ops={

.vidioc_querycap=vidioc_querycap,

.vidioc_enum_fmt_vid_cap=

vidioc_enum_fmt_vid_cap,

.vidioc_try_fmt_vid_cap=

vidioc_try_fmt_vid_cap,

.vidioc_s_fmt_vid_cap=

vidioc_s_fmt_vid_cap,

.vidioc_reqbufs=vidioc_reqbufs,

.vidioc_querybuf=vidioc_querybuf,

.vidioc_qbuf=vidioc_qbuf,

.vidioc_dqbuf=vidioc_dqbuf,

.vidioc_s_std=vidioc_s_std,

.vidioc_enum_input=vidioc_enum_input,

.vidioc_g_input=vidioc_g_input,

.vidioc_s_input=vidioc_s_input,

.vidioc_queryctrl=vidioc_queryctrl,

.vidioc_g_ctrl=vidioc_g_ctrl,

.vidioc_s_ctrl=vidioc_s_ctrl,

.vidioc_streamon=vidioc_streamon,

.vidioc_streamoff=vidioc_streamoff,

#ifdef CONFIG_VIDEO_V4L1_COMPAT

.vidiocgmbuf=vidiocgmbuf,

#endif

};

+int vivi_open(struct file*file)

+vivi_dev*dev=

video_drvdata(file);访问驱动程序专用数据

+分配+初始化句柄

(vivi_fh)数据

+重置帧计数器

+

videobuf_queue_vmalloc_init();初始化视频缓冲队列

+开启一个新线程用于开始和暂停

+实现自定义的v4l2_ioctl_ops函数

附:Sub-devices

Sub-devices支持的头文件

V4l2-subdev.h

子设备是某种程度上主桥设备连接的设备。这些设备通常是音频/视频流合并器/编码器/解码器或传感器和摄像头控制器。

一般控制这些器件通过I2C总线,但也可用于其他总线。

v4l2_subdev结构提供了一个通用的方式访问这些设备,sub-devices支持的大部分操作分为以下几个类别:

核心操作、音频操作、视频操作、调谐器操作,每个类别都可以在实现subdev的驱动程序时设置自己的操作。

struct v4l2_subdev_ops{

const struct v4l2_subdev_core_ops*core;

const struct v4l2_subdev_tuner_ops*tuner;

const struct v4l2_subdev_audio_ops*audio;

const struct v4l2_subdev_video_ops*video;

} ;

一个subdev驱动程序可以设置不执行的操作函数指针为空(如要产生音频subdev通常没有实现视频类操作)。唯一的例外是核心类:必须始终存在。

这些OPS都在内部使用,所以它是没有必要去更改,添加或删除它们或从一个移动到另一个类别。目前这些OPS基于原有的控制命令,但OPS不仅限于一个参数,一旦所有的I2C驱动subdev转换为使用这些OPS,就有改进的余地。

1.核心操作v4l2_subdev_core_ops

struct v4l2_subdev_core_ops{

int(*g_chip_ident)(struct v4l2_subdev*sd,struct

v4l2_dbg_chip_ident*chip);

int(*log_status)(struct v4l2_subdev*sd);

int(*s_config)(struct v4l2_subdev*sd,int irq,void

*platform_data);

int(*init)(struct v4l2_subdev*sd,u32val);

int(*load_fw)(struct v4l2_subdev*sd);

int(*reset)(struct v4l2_subdev*sd,u32val);

int(*s_gpio)(struct v4l2_subdev*sd,u32val);

int(*queryctrl)(struct v4l2_subdev*sd,struct

v4l2_queryctrl*qc);

int(*g_ctrl)(struct v4l2_subdev*sd,struct v4l2_control *ctrl);

int(*s_ctrl)(struct v4l2_subdev*sd,struct v4l2_control *ctrl);

int(*g_ext_ctrls)(struct v4l2_subdev*sd,struct

v4l2_ext_controls*ctrls);

int(*s_ext_ctrls)(struct v4l2_subdev*sd,struct

v4l2_ext_controls*ctrls);

int(*try_ext_ctrls)(struct v4l2_subdev*sd,struct

v4l2_ext_controls*ctrls);

int(*querymenu)(struct v4l2_subdev*sd,struct

v4l2_querymenu*qm);

int(*s_std)(struct v4l2_subdev*sd,v4l2_std_id norm);

long(*ioctl)(struct v4l2_subdev*sd,unsigned int cmd,void *arg);

#ifdef CONFIG_VIDEO_ADV_DEBUG

int(*g_register)(struct v4l2_subdev*sd,struct

v4l2_dbg_register*reg);

int(*s_register)(struct v4l2_subdev*sd,struct

v4l2_dbg_register*reg);

#endif

};

我们强烈建议至少实现这些操作:

g_chip_ident

log_status

g_register

s_register

这些提供了基本的调试支持。

ioctl:是指为仿制的ioctl类的命令。根

据使用情况,它可能是更好地使用特定子设备操作(目前尚未实施),因为OPS提供适当的类型检查。

s_config:如果设置,那么它总是在v4l2_subdev被注册后由v4l2_i2c_new_subdev函数调用后。它用于将数据

传递到平台,可用于subdev在初始化过程中。

init:一些适当的默认值初始化传感器寄存器。不使用新的驱动程序时现有的驱动程序应该删除它。

reset:复位通用的命令。参数选择复位哪一个子系统。传递0将复位整个芯片。使用新的驱动程序前要先挂载在

linux-media列表上再复位。

s_gpio:设置GPIO引脚。如果需要的话可能还需要扩展方向参数。

2.分类操作

struct v4l2_subdev_video_ops、

struct v4l2_subdev_audio_ops、

struct v4l2_subdev_tuner_ops

以上结构体都在V4l2-subdev.h中定义。由于操作函数太多就没有必要一一列举。

3.v4l2_subde初始化

(1)子设备驱动初始化的v4l2_subdev结构使用:

v4l2_subdev_init(sd,&ops);

(2)V4l2i2c子设备的初始化

void v4l2_i2c_subdev_init(struct v4l2_subdev*sd,struct i2c_client*client,const struct v4l2_subdev_ops*ops)

Camera模块解析之驱动篇.

1手机摄像头功能概述

手机摄像头功能由多个功能模块组成,主要三个部分,采集,加工,显示。

(1)采集部分由感光的sensor完成,通过CAM IF接口与手机芯片内的CAM连接。

(2)CAM对CAM IF数据进行加工,主要是格式转换,特殊效果等。最终处理出来的一帧数据,存在内存中。

(3)手机的刷新线程,使用手机内部的DMA功能,或者OVERLAY技术,把处理好的camera图像,显示到LCD上。刷新部分,不在camera框架范围内,后面只做简单讨论。

图1:Camera典型硬件模块图

2Sensor简介

Sensor是对图像的采集系统,通常采用的是ov系列的芯片。如ov2655等。通常包含两路接口:

(1)控制总线:Sensor也是一个智能嵌入式系统,一般通过I2C总线与手机芯片通信。手机可以通过I2C读写Sensor的寄存器,改变Sensor的参数,从而改变其工作方式。

(2)数据总线:Sensor通过CAM IF接口与CAM联系。

图2:sensor硬件连接图

由图可知,sensor工作的条件需要:

(1)电压供应,一般模拟电压,数字电压。

(2)工作时钟,通常为24M HZ的正弦波。一般为手机芯片产生

(3)SDA,SCL,i2c总线连接,sensor通常为从设备。

(4)standby控制线,手机芯片通过这条GPIO控制线,控制sensor的工作是否开启。

(5)Sensor输出给手机芯片的接口,CAM IF接口:

(6)并行数据线,通常8位,10位。分辨率高的sensor数据线需要更多。

(7)提供给手机芯片内集成的camera模块的PCLK,HCLK,VCLK.(像素同步信号,行同步信号,帧同步信号)。

Sensor通常产出稳定频率的数据图像流,手机芯片可以通过I2C总线接口,修改寄存器,改变帧频率。也可以改变sensor的输出流的格式,通常采用yuv422格式。

3CAM简介

CAM就是将Sensor采集过来的数据,转换相应格式,及其他加工,最后存放到内存中。CAM核心就是个DSP。这个阶段,dsp可以做很多图像处理的事情。比如颜色纠正,自动对焦,scaler等。不同平台会有不同。

由于Sensor的核心也是dsp,对于这些特效工作,一般Sensor中也会提供。

高通平台的Sensor的特效(反色)就可以在Sensor中设置。

由图可知

CAM consists ofthe following elements:

?Image Signal Processing(ISP)1

?Color Processing

?Image effects

?Luminance/Chrominance Splitter(Y/C Split) ?Resize(Down/Up-Scalers)

?JPEG Encoder

?YCbCr to RGB conversion for preview

?Memory Interface

?Control Unit

具体详解,可见ste6715datesheet。

这些模块看似很复杂,对于我们开发者来说,也不复杂。我们知道它们相应的流程,并且知道每个子模块提供了什么功能。这些模块的功能可以通过相应模块的寄存器进行相应调整的]。这同sensor的参数调整的思想是一样的。硬件提供功能,通过寄存器进行参数调整。

Camera的native层软件接口,在Camera在native层中,提供了/dev/video*的设备节点。Native层通过打开设备文件,关联上camera,申请一串帧缓冲区,建立循环队列,并把这些内存地址传给内核的camera模块,并等待内核camera 的处理结束。Camera模块一帧处理结束,native层就会返回。

4LCD显示

LCD的显示,就是将lcd的framebuffer的数据映射到LCD屏上,而我们camera 的数据要在屏幕上显示,就只需建立camera帧buffer到framebuffer的映射关系。可以使用内核的DMA,也可以使用overlay。通常的preview过程都是在native层以上开个线程,waiting kernel的处理完成,然后push到lcd屏上,如此循环。

(1)软件设计思想

5V4l2驱动框架:

关联文件:V4l2-dev.c(src\linux\kernel\linux\drivers\media\video)

Videodev2.h(src\linux\kernel\linux\include\linux)Cam-core分析

V4l2.c(src/linux/modules/v4l2cam)

V4L2是linux的标准接口,提供了众多的标准IOCTL接口,这样不管内核驱动如何改变,风格各异,都可以让应用程序native程序稳定工作。IOCTL接口标准定义于Videodev2.h,这个文件也会被android系统所引用。

离散系统稳定性分析

实验一 离散系统稳定性分析 实验学时:2 实验类型:常规 实验要求:必作 一、实验目的: (1)掌握利用MATLAB 绘制系统零极点图的方法; (2)掌握离散时间系统的零极点分析方法; (3)掌握用MATALB 实现离散系统频率特性分析的方法; (4)掌握逆Z 变换概念及MATLAB 实现方法; (5)掌握用MATLAB 分析离散系统稳定性。 二、实验原理: 1、离散系统零极点图及零极点分析; 线性时不变离散系统可用线性常系数差分方程描述,即 ()()N M i j i j a y n i b x n j ==-= -∑∑ (8-1) 其中()y k 为系统的输出序列,()x k 为输入序列。 将式(8-1)两边进行Z 变换的 00 ()()()() () M j j j N i i i b z Y z B z H z X z A z a z -=-== = = ∑∑ (8-2) 将式(8-2)因式分解后有: 11 () ()() M j j N i i z q H z C z p ==-=- ∏∏ (8-3) 其中C 为常数,(1,2,,)j q j M = 为()H z 的M 个零点,(1,2,,)i p i N = 为()H z 的N 个极点。 系统函数()H z 的零极点分布完全决定了系统的特性,若某系统函数的零极点已知,则系统函数便可确定下来。 因此,系统函数的零极点分布对离散系统特性的分析具有非常重要意义。通过对系统函数零极点的分析,可以分析离散系统以下几个方面的特性: ● 系统单位样值响应()h n 的时域特性; ● 离散系统的稳定性;

离散系统的频率特性; 1.1、零极点图的绘制 设离散系统的系统函数为 ()()() B z H z A z = 则系统的零极点可用MA TLAB 的多项式求根函数roots()来实现,调用格式为: p=roots(A) 其中A 为待根求多项式的系数构成的行矩阵,返回向量p 则是包含多项式所有根的列向量。如多项式为231()4 8 B z z z =+ + ,则求该多项式根的MA TLAB 命令为为: A=[1 3/4 1/8]; P=roots(A) 运行结果为: P = -0.5000 -0.2500 需注意的是,在求系统函数零极点时,系统函数可能有两种形式:一种是分子、分母多项式均按z 的降幂次序排列;另一种是分子、分母多项式均按1z -的升幂次序排列。这两种方式在构造多项式系数向量时稍有不同。 (1)()H z 按z 的降幂次序排列:系数向量一定要由多项式最高次幂开始,一直到常数项,缺项要用0补齐;如 3 4 3 2 2()3221 z z H z z z z z += ++++ 其分子、分母多项式系数向量分别为A=[1 0 2 0]、B=[1 3 2 2 1]。 (2)()H z 按1z -的升幂次序排列:分子和分母多项式系数向量的维数一定要相同,不足的要用0补齐,否则0z =的零点或极点就可能被漏掉。如 1 1 2 12()11124 z H z z z ---+= + + 其分子、分母多项式系数向量分别为A=[1 2 0]、B=[1 1/2 1/4]。 用roots()求得()H z 的零极点后,就可以用plot()函数绘制出系统的零极点图。下面是求系统零极点,并绘制其零极点图的MA TLAB 实用函数ljdt(),同时还绘制出了单位圆。 function ljdt(A,B) % The function to draw the pole-zero diagram for discrete system p=roots(A); %求系统极点 q=roots(B); %求系统零点 p=p'; %将极点列向量转置为行向量

多台电机同步驱动

多台电机同步驱动 图片: 摘要:在涂装行业中,由于传动链一般为几百米至上千米不等,因此传动链驱动通常采用几台电机同时驱动,要求几台电机速度同步才能保证传动链的正常运行,否则就会产生链条堆积或断裂,使系统不能很好的运行。同时本文将重点介绍安邦信G11变频器在传动链多台电机同步控制的应用。 关键词:传动链、同步控制、变频调速 一、前言 目前在涂装行业中由于涂装加工工艺流程较多,且规模较大,机械化生产线取代人工生产线。被加工工件多数采用吊空线或地盘线输送,在整个加工工艺流程中循环运行。传动链一般都很长,几百米至几千米不等。这样,一台电机驱动根本实现不了,就要求几台电机同时驱动一条传动链,就必须让电机实现同步控制,否则链条就容易堆积或断裂。 二、控制方式及控制要求 解决多台马达作同步控制时多数厂家大都采用两种控制方式。 1、采用滑差调速电机拖动(俗称VS马达控制器或速比控)。利用行程开关调整滑差。VS马达控制器是一种相当简单的带电压负反馈的,单相晶闸管整流控制器,其控制器输出一个直流供应给VS马达的励磁线圈。此控制系统的负载特性相当差,低速时速度极不稳定,容易造成系统链条堆积或断裂,且故障率很高。 2、采用变频器加异步电机拖动,利用行程开关调整速差。其控制原理是:在链条的每一传动段中,安装一个驱动座和一个调整座。调整座是可以移动的,可以用于存储过多的链条,当链条区段速度不一致时,链条会伸长和收紧。这样调整座的移动会让其行程开关发生状态

变化,从而调整马达的速度,使之达到平衡输送的目的。此系统工作时,调整是靠行程开关来检测,各区段链条的伸长和收紧。我们知道调整座不可能做得太长,行程开关也不能安装太多。因此,马达的速度调整是有级的、跳变的。调整幅度较大,调整座不断调整,导致系统频繁动作。机械磨损快,且传动链运行速度 下面我向大家介绍一种,性能更优越,成本更低的传动链自动化驱动方案。 首先我们采用深圳市安邦信电子有限公司生产的G11系列多功能矢量控制变频器,因为此变频器在传动链的自动化驱动方面有以下优势。 a、矢量控制技术,稳速精度是开环无速度传感器矢量控制:±0.5% ,闭环有速度传感器矢量控制:±0.02% b、低频转矩大,0.5HZ 满转矩输出。 c、功能强大特有频率源选择模式及给定模式,X、Y模式 d、过程PID控制系统。 只需从模拟量输入端口(0- +10V/0-20MA)引入反馈信号,即可实现过程PID系统的自动化控制。 因此在整个系统中,无需PLC等自动化产品作过程PID系统和其它功能,只要简单的线路联接,就可以实现整个传动链的自动化控制。 (1)各驱动马达基本同步,传动链条不堆积,不断裂。 (2)最高线速度可达到10m/min (3)调整座调整量越小越好. (4)调整座需安装极限保护. 三、控制原理: 1、在调整座的定滑轮上加装一个角位移传感器,将链条的伸长或收紧变化率通过传感器检测,并转换为0-10V/0-20mA的模拟信号,作为PID的反馈信号,送回变频器。 2、通过变频器的键盘设置,调整座的平衡点,系统根据反馈信号与PID给定的平衡点作比较,决定马达的调整方向和速率。 3、由于PID系统反应,调整座与平衡点稍微发生偏移时系统立刻做调整,这样,保证了在高速时能有效调整。 4、由于变频器采用矢量控制保证了速度不随负载的变化而变化。同时,克服低速时速度不稳定的缺陷。 5、采用主-从式结构,所有变频器的控制模式均为开环矢量控制模式,其速度可以通过面板设定或外置电位器给定。将一台E11矢量变频器作为主驱动输出,从驱动均采用G11系列产品,多台从驱动可以共用一台主驱动。 6、主驱动的运行频率通过AO模拟口输出,作为从驱动变频器的初始同步转速,其偏差可以通过模拟量输出口AO的零偏及增益的定义来修正。 7、从驱动的辅助频率源来自于PID。这样,从驱动马达的速度就靠调整座的信号来追踪主驱动马达的速度,达到同步的目的。 8、在每一个调整座安装极限开关,防止意外情况发生。 简易线路图:(见附件) 四、结束语 本系统在优化参数值之后,传动链的运行非常稳定。而且本系统电气器件配置简炼,逻辑清晰,与原老式系统相比,省去了价格昂贵的同步控制板和PLC,成本有较大的降幅。在行

同步整流电路的驱动方式综述

同步整流电路的驱动方式综述 预研部余恒23343 一、问题提出: 为了适应电子、通信设备和大规模集成电路的供电要求,DC/DC 模块电源输出电压越来越低,而输出电流却越来越大。传统的肖特基整流方式逐渐被同步整流方式所取代。用低导通电阻MOSFET代替常规肖特基整流/续流二极管,可以大大降低整流部分的功耗,提高变换器的性能,实现电源的高效率,高功率密度。同步整流已经相当流行。但是用MOS代替肖特基二极管势必带来这样一个问题:同步整流MOS管如何驱动?因为二极管不需要驱动,而MOS管是需要驱动的。对于同步整流管的驱动方式,本人收集了部分资料,做了总结,向各位专家学习。 二、驱动方式探讨: 从总的来说同步整流管的驱动方式分为自驱和外驱。 1、外驱:利用原边等驱动信号来控制整流管的开关,优点是可减 小整流管的死区,而且很容易实现时序。不足之处也是显然的,增加了电路的复杂性、成本和可靠性。 *例如,单端正激谐振复位电路,副边续流管可以由原边信号驱动 (如图),也可以整流管由OUT1控制开通,续流管由OUT2控 *又例如图2,这种电路是为了设计原副边的时序。Driverl为正时,Q1导通,副边Qs2处于工作状态。由于Qs12的导通,Qs1 处于关断状态。死区时间Driverl和Driver2为0,则Qs11、Qs21 导通,Q12、Q22的关断,那么Qs1和Qs2均导通,工作在续流状态。当 Driver2为正时,Qs1导通,Qs2关断,Q2延时导通,这样Qs2处于工作状态,Qs1处于关断状态。同样死区时间Qs1 和Qs2同时续流。 可见通过外驱方式实现了原副边时序,使得在死区时间整流管处于工作状态,就不会经过整流管的体二极管续流,从而减小了续流损耗。

离散事件模拟

//离散事件模拟,模拟银行营业时的排队情况 //不考虑顾客中途离开,顾客到达事件随机,业务办理时间 //长度随机,选择最短的队排队,不再换队 //作者:nuaazdh //时间:2011年12月10日08:52:37 #include #include #include #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Status; typedef struct Event{ //事件类型 int OccurTime; //事件发生时刻 int NType; //事件类型,0表示到达事件,1至4表示四个窗口的离开事件 struct Event *next; }Event,ElemType; typedef struct{ //单向链表结构 ElemType *head;//头指针 ElemType *tail;//尾指针 int len; //长度 }LinkList; typedef LinkList EventList; //事件链表 typedef struct QElemType{ //队列元素 int ArriveTime;//到达时间 int Duration;//办理业务所需时间 struct QElemType *next; }QElemType; typedef struct{//队列结构 QElemType *head;//头指针 QElemType *tail;//尾指针 }LinkQueue; Event NewEvent(int occurT,int nType); //根据OccurTime和NType值,创建新事件 Status InitList(LinkList *L);

同步伺服电机(PMSM)驱动器原理

同步伺服电机(PMSM)驱动器原理 1 引言 随着现代电机技术、现代电力电子技术、微电子技术、永磁材料技术、交流可调速技术及控制技术等支撑技术的快速发展,使得永磁交流伺服技术有着长足的发展。永磁交流伺服系统的性能日渐提高,价格趋于合理,使得永磁交流伺服系统取代直流伺服系统尤其是在高精度、高性能要求的伺服驱动领域成了现代电伺服驱动系统的一个发展趋势。永磁交流伺服系统具有以下等优点:(1)电动机无电刷和换向器,工作可靠,维护和保养简单;(2)定子绕组散热快;(3)惯量小,易提高系统的快速性;(4)适应于高速大力矩工作状态;(5)相同功率下,体积和重量较小,广泛的应用于机床、机械设备、搬运机构、印刷设备、装配机器人、加工机械、高速卷绕机、纺织机械等场合,满足了传动领域的发展需求。 永磁交流伺服系统的驱动器经历了模拟式、模式混合式的发展后,目前已经进入了全数字的时代。全数字伺服驱动器不仅克服了模拟式伺服的分散性大、零漂、低可靠性等确定,还充分发挥了数字控制在控制精度上的优势和控制方法的灵活,使伺服驱动器不仅结构简单,而且性能更加的可靠。现在,高性能的伺服系统,大多数采用永磁交流伺服系统其中包括永磁同步交流伺服电动机和全数字交流永磁同步伺服驱动器两部分。伺服驱动器有两部分组成:驱动器硬件和控制算法。控制算法是决定交流伺服系统性能好坏的关键技术之一,是国外交流伺服技术封锁的主要部分,也是在技术垄断的核心。 2 交流永磁伺服系统的基本结构 交流永磁同步伺服驱动器主要有伺服控制单元、功率驱动单元、通讯接口单元、伺服电动机及相应的反馈检测器件组成,其结构组成如图1所示。其中伺服控制单元包括位置控制器、速度控制器、转矩和电流控制器等等。我们的交流永磁同步驱动器其集先进的控制技术和控制策略为一体,使其非常适用于高精度、高性能要求的伺服驱动领域,还体现了强大的智能化、柔性化是传统的驱动系统所不可比拟的。 目前主流的伺服驱动器均采用数字信号处理器(DSP)作为控制核心,其优点是可以实现比较复杂的控制算法,事项数字化、网络化和智能化。功率器件普遍采用以智能功率模块(IPM)为核心设计的驱动电路,IPM内部集成了驱动电路,同时具有过电压、过电流、过热、欠压等故障检测保护电路,在主回路中还加入软启动电路,以减小启动过程对驱动器的冲击。

离散事件建模及仿真

第7章离散事件系统建模与仿真 离散事件系统指的是一组实体为了达到某些目的,以某些规则相互作用、关联而集合在一起。与连续事件系统不同,离散事件系统所包含的事件在时间上和空间上都是离散的。离散事件系统在生产和生活中是很常见的,例如一个超市就是一个离散事件系统,它由顾客和收银员组成。在离散事件系统中,各事件以某种顺序或在某种条件下发生,并且大都是随机性的,所以,其模型很难用某种规范的形式,一般采用流程图或者网络图的形式来定义实体在系统中的活动。这类系统在建模时,只要考虑系统内部状态发生变化的时间点和发生这些变化的原因,而不用描述系统内部状态发生变化的过程。本章将介绍几种常见的离散事件系统和离散事件系统建模方法。 7.1 离散事件系统模型 离散事件系统是指系统的状态仅在离散的时间点上发生变化的系统,而且这些离散时间点一般是不确定的。这类系统中引起状态变化的原因是事件,通常状态变化与事件发生是一一对应的。事件的发生没有持续性,可以看作在一个时间点上瞬间完成,事件发生的时间点是离散的,因而这类系统称为离散事件系统。首先看一个典型的离散系统的例子。 例7.1 超市服务系统 某理发店只有一名理发师。在正常的工作时间内,如果理发店没有顾客,则理发师空闲;如果有顾客,则为顾客理发。如果顾客到达理发店时,理发师正在为其他顾客服务,则新来的顾客在一旁排队等候。显然,每个顾客到达理发店的时间是随机的,而理发师为每个顾客服务的时间也是随机的,进而队列中每个顾客的等候时间也是随机的。 下面,结合例7.1介绍一下在离散事件系统仿真中所用到的一些基本概念。 (1)实体 实体是指有可区别性且独立存在的某种事物。在系统中,构成系统的各种成分称为实体,用系统论的术语,它是系统边界内的对象。在离散事件系统中,实体可分为两大类:临时实体和永久实体。临时实体指的是只在系统中存在一段时间的实体,这类实体由系统外部到达系统,在系统仿真过程中的某一时刻出现,最终在仿真结束前从系统中消失。例7.1中,顾客是临时实体,他们按一定的规律到达,经过理发师服务(可能要排队等待一段时间),最终离开系统。那些虽然达到,但未进入理发店的顾客则不能称为该系统的临时实体。永久实

离散事件系统仿真实验

实验二离散事件系统仿真实验 目录 实验题目 (1) 一、实验目标 (1) 二、实验原理 (1) 1. 排队系统的一般理论 (1) 2. 离散系统常用的仿真策略 (2) 3. 本实验采用单服务台模型 (3) 4. 仿真运行方式 (3) 三、理论分析 (4) 1. 涉及的基本概念 (4) 2. 仿真的总体规划设计 (5) 四、建模过程 (7) 1. 思路分析 (7) 2. 仿真策略 (7) 3. 事件列表 (8) 4. 变量定义 (8) 5. 系统流程框图 (9) 五、仿真源程序(Matlab) (10) 六、结果分析 (12) 七、感受及建议 (15)

实验题目 实体(临时实体)到达模式:实体到达模式是顾客到达模式,设到达时间间隔Ai 服从均值5min A β=的指数分布 /1 ()(0) A A A f A e A ββ?=≥服务模式:设服务员为每个顾客服务的时间为Si .它也服从指数分布,均值为4min S β=/1 ()(0) S S s f S e S ββ?=≥服务规则:由于是单服务台系统,考虑系统顾客按单队排列,并按FIFO 方式服务 一、实验目标 通过单服务台排队系统的方针,理解和掌握对离散事件的仿真建模方法,以便对其他系统进行建模,并对其系统分析,应用到实际系统,对实际系统进行理论指导。 二、实验原理 1. 排队系统的一般理论 一般的排队系统都有三个基本组成部分:

(1)到达模式:指动态实体(顾客)按怎样的规律到达,描写实体到达的统计特性。通常假定顾客总体是无限的。 (2)服务机构:指同一时刻有多少服务设备可以接纳动态实体,它们的服务需要多少时间。它也具有一定的分布特性。通常,假定系统的容量(包括正在服务的人数加上在等待线等待的人数)是无限的。 (3)排队规则:指对下一个实体服务的选择原则。通用的排队规则包括先进先出(FIFO),后进先出(LIFO),随机服务(SIRO)等。 2. 离散系统常用的仿真策略 (1)事件调度法(Event Scheduling): 基本思想:离散事件系统中最基本的概念是事件,事件发生引起系统状态的变化,用事件的观点来分析真实系统。通过定义事件或每个事件发生系统状态的变化,按时间顺序确定并执行每个事件发生时有关逻辑关系。 (2)活动扫描法: 基本思想:系统有成分组成,而成分又包含活动。活动的发生必须满足某些条件,且每一个主动成分均有一个相应的活动例程。仿真过程中,活动的发生时间也作为条件之一,而且较之其他条件具有更高的优先权。 (3)进程交互法: 基本思想:将模型中的主动成分历经系统所发生的事件及活动,按时间发生的顺序进行组合,从而形成进程表。系统仿真钟的推进采

离散时间系统最优控制

第五章离散时间系统最优控制

引言 ?前面所讨论的都是关于连续时间系统的最优控制问题。?现实世界中,很多实际系统本质上是时间离散的。 机 ?即使是系统是时间连续的,因为计算机是基于时间和数值上都离散的数字技术的,实行计算机控制时必须 将时间离散化后作为离散系统处理。 ?因此,有必要讨论离散时间系统的最优控制问题。 ?离散时间系统仍然属于连续变量动态系统(CVDS)范畴。 注意与离散事件动态系统(DEDS)的区别。 ?CVDS与DEDS是自动化领域的两大研究范畴,考虑不同的自动化问题。

5.1 离散时间系统最优控制问题的提法 (1) 离散系统最优控制举例——多级萃取过程最优控制 ?萃取是指可被溶解的物质在两种互不相溶的溶剂之间的转移,一般用于将是指可被溶解的物质在两种互不相溶的溶剂之间的转移,般用于将要提取的物质从不易分离的溶剂中转移到容易分离的溶剂中。 ?多级萃取是化工生产中提取某种价值高、含量低的物质的常用生产工艺。 萃取V u (0) u (1) u (k -1) u (N -1) V V V V V V 萃取器1萃取器2 萃取器 k 萃取器N x (0) x (1)x (2) x (k -1) x (k ) x (N )x (N -1) 含物质z (0)z (1) z (k-1) z (N -1) 多级萃取过程 A 的混合物以流量V 进入萃取器1,混合物中A 浓度x (0); 萃取剂以流量u (0)通过萃取器1,单位体积萃取剂带走A 的量为z (0); 一般萃取过程的萃取物含量均较低,可认为通过萃取器1后混合物流量仍为V ; 流出萃取器1的混合物中A 物质的浓度为x (1)。以此类推至萃取器N 。

数据结构课程设计之银行离散事件模拟

《数据结构》课程设计报告

银行业务模拟与离散事件模拟 一、实验目的 1. 通过此次课程设计中银行业务模拟的题目,掌握队列(或者链表) 等数据结构的基本操作方面的知识,并能灵活的解决一些基本的问题,加深对其性质及各项操作的理解; 2. 将所学数据结构方面的知识与一门具体的语言相结合(C/C++)来进行实现,感受数据结构的强大作用,加深理解。 二、问题描述 1.问题描述 假设某银行有4个窗口对外接待客户,从早晨银行开门(开门9:00am,关门5:00pm)起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户(建议:客户进入时间使用随机函数产生),若某个窗口的业务员正空闲,则上前办理业务;反之,若4个窗口均有窗户所占,他便会排在人数最少的队伍后面。 2. 任务要求 编制一个程序以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间。建议有如下设置: (1)客户到达时间随机产生,一天客户的人数设定为100人。 (2)银行业务员处理时间随机产生,平均处理时间10分钟。 (3)将一天的数据(包括业务员和客户)以文件方式输出。 三、算法的思想与算法实现步骤 1. 基本思想 通过队列数据类型进行基本操作,主要有三个模块:分别是主函数模块、 主要操作函数及基本操作函数。其中,主函数负责其他子函数的调用实现以及基本界面的操作,主要函数包括开门函数的实现:OpenForDay,顾客到达函数:CustomerArrived,顾客离开的函数:CustomerDepartion等;而基本操作函数

就是对其中牵扯到的操作进行具体的实现,如按时间先后插入队列OrderInsert、寻求最短的队列MinCuQueue、删除队列元素以及销毁等。 2. 实现步骤 首先,分析题目要求划分实现模块、画出大致的流程图,定义基本数据类型,诸如结构体、队列等; 其次,考虑基本大致的操作,比如要拟定开门的时间、顾客到来为其提供服务以及离开时的操作等; 再次,针对上述的基本操作实现具体需要进行的操作,具体实现每个环节需要进行的基本操作,即具体编写每个小函数实现功能; 最后,编写主函数对每个实现进行按需调用,实现操作。 3. 流程图 图-1 事件流程图

单服务台排队系统离散事件系统仿真实验

离散事件系统仿真实验 一、实验目标 通过单服务台排队系统的方针,理解和掌握对离散事件的仿真建模方法,以便对其他系统进行建模,并对其系统分析,应用到实际系统,对实际系统进行理论指导。 二、实验原理 1.排队系统的一般理论 一般的排队系统都有三个基本组成部分: (1)到达模式:指动态实体(顾客)按怎样的规律到达,描写实体到达的统计特性。通常假定顾客总体是无限的。 (2)服务机构:指同一时刻有多少服务设备可以接纳动态实体,它们的服务需要多少时间。它也具有一定的分布特性。通常,假定系统的容量(包括正在服务的人数加上在等待线等待的人数)是无限的。 (3)排队规则:指对下一个实体服务的选择原则。通用的排队规则包括先进先出(FIFO),后进先出(LIFO),随机服务(SIRO)等。 2.对于离散系统有三种常用的仿真策略:事件调度法、活动扫描法、进程交互法。 (1)事件调度法(Event Scheduling): 基本思想:离散事件系统中最基本的概念是事件,事件发生引起系统状态的变化,用事件的观点来分析真实系统。通过定义事件或每个事件发生系统状态的变化,按时间顺序确定并执行每个事件发生时有关逻辑关系。 (2)活动扫描法: 基本思想:系统有成分组成,而成分又包含活动。活动的发生必须满足某些条件,且每一个主动成分均有一个相应的活动例程。仿真过程中,活动的发生时间也作为条件之一,而且较之其他条件具有更高的优先权。 (3)进程交互法: 基本思想:将模型中的主动成分历经系统所发生的事件及活动,按时间发生的顺序进行组合,从而形成进程表。系统仿真钟的推进采用两张进程表,一是当前事件表,二是将来事件表。 3.本实验采用的单服务台模型 (1)到达模式:顾客源是无限的,顾客单个到达,相互独立,一定时间的到达数服从指数

排队系统的离散事件模拟-示例

2.4 M/M/1排队系统的模拟 这个排队系统的服务员为一人。顾客到达系统的间隔时间为平均值等于1分的指数分布随机变量。单位顾客服务时间为平均值等于0.5分的指数分布随机变量。单列排队,采取先进先出的规则,排队行列的最大容量为100。模拟的终止条件为有1000个顾客服务结束离开系统。 2.4.1 系统的实体、属性和事件 事件类型有顾客到达事件、服务开始事件以及服务结束事件。但是,服务开始事件一般与顾客到达事件或服务结束事件相互重合,所以决定有两类事件: a. 第1类事件——顾客到达事件; b. 第2类事件——顾客在服务结束后离开系统。 2.4.2 系统模拟程序 为了进行模拟,除了主程序外,还编制了一系列的子程序或函数,它们的功能如表1.2.3所示。 表1.2.3 排队服务系统模拟的子程序和函数 表1.2.4列举模型的变量的名称和定义。 表1.2.4 本模型的变量

图1.2.8是本模拟模型的主程序,它的主要功能如下: MAIN PROGRAM NEVNTS = 2 //事件类型 READ 10, MARRVT, MSERVT //到达间隔时间为1,服务时间为0.5 10 FORMA T(2F10.0) READ 20, TOTCUS //结束服务顾客总数1000 20 FORMA T(I 10) CALL INIT 30 CALL TIMING GO TO (40, 50), NEXT //NEXT = 1, GO TO 40; NEXT = 2, GO TO 50 40 CALL ARRIVE GO TO 60 50 CALL DEPART 60 IF(NUMCUS .LT. TOTCUS) GO TO 30 CALL REPORT STOP END 图1.2.8 排队服务系统模拟的主程序 SUBROUTINE INIT TIME = 0.0 STATUS = 0.0 //服务员状态 NIQ = 0 //系统中的停留人数 TLEVNT = 0.0 //上次事件时间 NUMCUS = 0 //已结束服务的顾客数 TOTDEL = 0.0 //顾客停留时间总和 ANIQ = 0.0 //系统中人数的时间积分值

银行业务模拟与离散事件模拟

兰州商学院陇桥学院 工学系课程设计报告 设计题目:银行业务模拟与离散事件模拟系别:工学系 专业 (方向): 年级、班: 学生姓名: 学生学号: 指导教师: 年月日

目录 一、系统开发的背景。 (1) (一)系统功能要求 (1) (二)系统模块结构设计 (1) 三、系统的设计与实现 (2) (一)开门函数: (3) (二)顾客到达函数: (4) (三)顾客离开函数: (5) 四、系统测试 (6) 五、总结 (7) 六、附件(代码、部分图表) (7)

银行业务模拟与离散事件模拟 一、系统开发的背景。 为了在现实生活中,方便银行业务员更好的操作和管理银行出现的各种事件,以及方便算出各种时间,我们设计了银行业务模拟与离散事件模拟系统。 通过此次课程设计中银行业务模拟的题目,掌握队列,或链表等数据结构的基本操作方面的知识并能灵活的解决一些基本的问题,加深对其性质及操作的理解。 将所学数据结构方面的知识与一门具体的语言相结合来进行实现,感受数据结构的强大作用,加深理解。 (一)系统功能要求 编制一个程序,可以以模拟银行的这种业务活动并计算一天中客户在银行逗留的平均时间 1、客户到达时间随机产生,一天客户的人数设定为100人; 2、银行业务员处理时间随机产生,平均处理时间为10分钟; 3、将一天的数据结构(包括业务员和客户)以文件方式输出。 . (二)系统模块结构设计 通过对系统功能的分析,银行业务模拟与离散事件模拟系统功能如下图所示。

银行业务模拟与离散事件模拟系统 通过上图的功能分析,把整个系统划分为3个模块: 1、开门函数,该模块主要实现:银行开始正常营业时间,借助函数OpenForDay()来实现; 2、顾客到达函数,该模块主要实现:客户在银行里从排队到办理完银行业务的功能,借助函数CustomerArrive()来实现; 3、顾客离开函数,该模块主要实现:银行下班时间及顾客全部离开的功能,借助函数CustomerDepart()来实现。 三、系统的设计与实现 【流程图】

基于事件驱动编程

所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数).当然事件不仅限于用户的操作. 事件驱动的核心自然是事件。从事件角度说,事件驱动程序的基本结构是由一个事件收集器、一个事件发送器和一个事件处理器组成。事件收集器专门负责收集所有事件,包括来自用户的(如鼠标、键盘事件等)、来自硬件的(如时钟事件等)和来自软件的(如操作系统、应用程序本身等)。事件发送器负责将收集器收集到的事件分发到目标对象中。事件处理器做具体的事件响应工作,它往往要到实现阶段才完全确定,因而需要运用虚函数机制(函数名往往取为类似于HandleMsg的一个名字)。对于框架的使用者来说,他们唯一能够看到的是事件处理器。这也是他们所关心的内容。 视图(即我们通常所说的“窗口”)是“事件驱动”应用程序的另一个要元。它是我们所说的事件发送器的目标对象。视图接受事件并能够对其进行处理。当我们将事件发送到具体的视图时,实际上我们完成了一个根本性的变化:从传统的流线型程序结构到事件触发方式的转变。这样应用程序具备相当的柔性,可以应付种种离散的、随机的事件。 由于Windows本身是基于“事件驱动”模型的。因而在Windows操作系统下实现应用程序框架有相当的便利。在事件驱动程序的基本单元中,事件收集器已经由Windows系统完成;事件发送器也已经由Windows完成了部分内容。之所以是部分而非完全是因为Windows是用C语言实现的,而不是C++。由于没有对象,Windows将事件发送到所谓的“窗口函数”中(尽管不是发送到具体的对象,但应该说这是面向对象方式实现的一个变体)。要感谢Windows做了这件事。确定事件的目标所要做的工作的复杂可能要超出我们的想象。weWidgets的中所有可以处理事件的类都继承自wxEvtHandler,其中包含frames,buttons,menus,even documents,所有的窗体类(即从wxWindow继承的类)和程序类(application class). 这些类可以有一个事件表,用来绑定事件和被调用的函数(handler functions). 过程3.2. 建立一个静态事件表(即编译时生成的事件表)的操作步骤 建立一个新类(直接或间接从wxEvtHandler继承) 为每个要处理的事件声明被调用的函数 在被处理的事件所在的类的声明中加入宏DECLARE_EVENT_TABLE 在宏BEGIN_EVENT_TABLE... END_EVENT_TABLE(就是事件表)中将函数与枚举的数字绑定(因为产生该类型的事件的按钮不唯一,要用枚举数来区分);有些事件不必与枚举数绑定,因为产生该类型的事件的对象可以确定(比如就是this). 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而事件驱动的程序,则有机会释放cpu从而进入睡眠态(注意是有机会,当然程序也可自行决定不释放cpu),当事件触发时被操作系统唤醒,这样就能更加有效地使用cpu. 2.再说什么是事件驱动的程序。一个典型的事件驱动的程序,就是一个死循环,并以一个线程的形式存在,这个死循环包括两个部分,第一个部分是按照一定的条件接收并选择一个要处理的事件,第二个部分就是事件的处理过程。程序的执行过程就是选择事件和处理事件,而当没有任何事件触发时,程序会因查询事件队列失败而进入睡眠状态,从而释放cpu。 3.事件驱动的程序,必定会直接或者间接拥有一个事件队列,用于存储未能及时处理的事件。 4.事件驱动的程序的行为,完全受外部输入的事件控制,所以,事件驱动的系统中,存在大量这种程序,并以事件作为主要的通信方式。

第四章 离散事件系统 )

第四章 离散事件系统 如前所述,根据变量的性质,可分为连续事件系统和离散事件系统。连续事件系统的状态变量随时间连续变化,其主要特征可通过微分方程描述。离散事件系统的状态仅在离散的时间点上发生变化,而这些离散时间点一般不确定,即离散事件系统内部的状态变化是随机的,同一内部状态可以向多种状态转变,这种变化只在随机时间点发生,且在一段时间内保持不变。系统内部状态的变化虽然遵循一定的统计规律,却很难用函数描述。因此,离散事件系统的建模有其独特性,本章讨论离散事件系统模型及其建模方法。 第一节 离散事件系统模型 一、离散事件系统的基本要素 离散事件系统的类型虽然多种多样,但它们的主要组成要素基本相同。从仿真的角度,离散事件系统由实体(entity )、活动(activity )、资源(resource )以及控制(control )等基本要素构成(见图4-1-1)。 (一)实体(entity ) 构成系统的各种成分称为实体。实体是经过系统处理的事项。例如产品、顾客、文件等等。实体用诸如成本、形状、优先权、质量等特征予以定义。实 体可分为: 1. 生命体(如顾客、病人 等); 2. 无生命体(如文件、纸币、帐单等); 3. 无法感知的事物或无形物(如电话、电子邮件等)。 与实体相关的一个重要概念 是属性(attributes ),属性反映实体的某些性质,其集合描述实体的状态。例如,在超市服务系统中,顾客是一个实体,性别、身高、年龄、到达时间、服务时间和离开时间等是他的属性。一个客观实体有很多属性,对特定系统而言,并非所有属性与所研究问题有关,如顾客的性别、身高、年龄与超市服务的关系不大,则不必作为顾客的一个属性,而顾客到达时间、服务时间和离开时间是研究超市服务效率的重要依据,则是超市服务系统中的顾客属性。 (二)活动(activity ) 导致系统状态发生变化的过程称为活动。例如,对顾客的服务、对设备的一次大修、更换设备某一部件,在仿真中均属于一项活动。活动占用一定时间和资源,直接或间接地涉及到实体。活动可分为: 1. 实体过程(如登记验票、手术、检验、装配等); 2. 实体或资源运动(如铲车装卸货物、乘电梯等); 3. 资源的调节、维护和补给(如机器的调试、零配件的准备等)。 (三)资源(resource ) 资源是与系统状态发生变化有关的因素,是活动得以实现的资料。资源为实施 活动提 图4-1-1 系统要素

离散事件系统仿真论

摘要 近年来,随着我国铁路事业的迅猛发展,铁路的运输能力得到了大幅度提升。在客运技术与速度提高的同时,作为旅客体验铁路服务的一个必要环节,售票环节的重要性也随之提高。然而大型客运站真实的售票过程极为复杂,旅客的行为受事件驱动,他们的状态在一些不均匀的离散时刻发生改变且其变化的内部机理非常复杂,离散时间点一般不能确定,这是典型的离散事件系统,通常无法利用一般的数学方法进行描述。我们通常采用离散事件系统仿真的方法来解决此类问题,它是解决此类问题的最有用处的方法之一。 要对系统进行仿真研究,首先就必须建立起系统的仿真模型。本文在阅读大量文献的基础上,简单介绍了离散事件系统的建模与仿真方法,并对北京西客站售票大厅建立离散事件系统仿真模型,对旅客售票过程进行了优化改善。 关键词:离散事件,系统仿真

Abstract In recent years, with the rapid development of China's railway business, railway transport capacity has been improved significantly. The process of Buy a ticket became more and more important , while the technology and speed had Substantially Improved.But the process in the real world is so complex that we can not use Mathematical methods to study it. The most useful way to study this case is to Simulate the Discrete Event System. Simulation study of a system, we must first establish a system simulation model. On the base of studying a lot of academic articles this thesis simplely introduced the discrete event systems modeling and simulation methods and established the discrete event systems of Beijing West Railway Station. Simulated and optimizated the process of Buy a ticket KEYWORDS:discrete event , system simulation . 1. 概述 (4) 1.1. 售票服务环节研究 (4)

Python离散事件模拟和SimPy简介

Introduction to Discrete-Event Simulation and the SimPy Language Norm Matloff February13,2008 c 2006-2008,N.S.Matloff Contents 1What Is Discrete-Event Simulation(DES)?3 2World Views in DES Programming3 2.1The Activity-Oriented Paradigm (3) 2.2The Event-Oriented Paradigm (4) 2.3The Process-Oriented Paradigm (6) 3Introduction to the SimPy Simulation Language7 3.1SimPy Overview (8) 3.2Introduction to SimPy Programming (9) 3.2.1MachRep1.py:Our First SimPy Program (10) 3.2.2MachRep2.py:Introducing the Resource Class (14) 3.2.3MachRep3.py:Introducing Passivate/Reactivate Operations (16) 3.2.4MMk.py:“Do It Yourself”Queue Management (18) 3.2.5SMP.py:Simultaneous Possession of Resources (20) 3.2.6Cell.py:Dynamic Creation of Threads (22) 3.3Note These Restrictions on PEMs (25) 3.4SimPy Data Collection and Display (25) 3.4.1Introduction to Monitors (25) 3.4.2Time Averages (26) 3.4.3The Function Monitor.timeAverage() (27) 3.4.4But I Recommend That You Not Use This Function (27)

第4章 离散事件系统仿真(本)

第4章 离散事件系统仿真

4.1 离散事件仿真的基本概念 4.1.1.事件 ?事件是描述系统的一个基本要素。事件是指引起系统状态变化的行为,系统的动态过程是靠事件来驱动的。例如,在物流系统中,工件到达可以定义为一类事件。因为工件到达仓库,仓库货位的状态会从空变为满,或者引起原来等待入库的队列长度的变化。 ?事件一般分为两类:必然事件和条件事件。只与时间有关的事件称为必然事件。如果事件发生不仅与时间因素有关,而且还与其它条件有关,则称为条件事件。系统仿真过程,最主要的工作就是分析这些必然事件和条件事件。

4.1.2 成分 描述系统的另一基本要素是成分。成分与实体是同一概念,只是根据习惯,在描述系统时用实体,而在模型描述中用成分。成分分为主动成分和被动成分。 可以主动产生活动的成分称为主动成分,如物流系统中的工件,它的到达将产生入库活动或排队活动。本身不产生活动,只在主动成分作用下才产生状态变化的那些成分称为被动成分。

4.1.3 进程 由若干事件与若干活动组成的过程称为进程。它描述了各事件活动发生的相互逻辑关系及时序关系。例如,工件由车辆装入进货台;经装卸搬运进入仓库;经保管、加工到配送至客户的过程就是一个进程。事件、活动与进程的关系如图 3-1所示进程

4.1.4.仿真时钟 ?仿真时钟用于表示仿真事件的变化。 ?由于仿真实质上是对系统状态在一定时间序列的动态描述,因此,仿真时钟一般是仿真的主要自变量,仿真时钟的推进是系统仿真程序的核心部分。 ?应当指出,仿真时钟所显示的是仿真系统对应实际系统的运行时间,而不是计算机运行仿真模型的时间。仿真时间与真实时间将设定成一定比例关系,使得像物流系统这样复杂的系统,利用计算机仿真只需要几分钟就可以完成,而真实系统的运行则需要若干天,甚至若干月。

离散事件

关于离散事件系统仿真的总结 1、离散系统仿真的认识 1.1系统仿真与系统 系统仿真是以相似原理、系统技术、信息技术及其应用领域有关专业技术为基础,以计算机和各种专用物理效应设备为工具,利用系统模型对真实的或假想的系统进行动态研究的一门多学科的综合性技术口。相似论是系统仿真的主要理论依据。 系统仿真研究的对象是系统。系统是指具有某些特定功能、按照某些规律结合起来、互相作用、互相依存的所有事物的集合或总和。 任何系统都存在三方面需要研究的内容,即实体、属性和活动。实体是存在于系统中的每一项确定的物体。属性是实体所具有的每一项有效的特性。活动是导致系统状态发生变化的一个过程。活动是在一段时间内发生的情况,活动反映了系统的变化规律。存在系统内部的实体、属性和活动组成的整体称为系统的状态。处于平衡状态的系统统称为静态系统,状态随时间不断变化着的系统为动态系统。 根据系统状态的变化是否连续可将系统分为连续系统和离散系统及连续离散混合系统。连续系统的状态变量是连续变化的。离散系统包括离散时间系统和离散事件系统,离散时间系统的状态变量是间断的,但是它和连续系统具有相似的性能,它们的系统模型都能用方程的形式加以描述。 1.2离散事件系统 离散事件系统是指受事件驱动、系统状态跳跃式变化的动态系统。离散事件系统的系统状态仅在离散的时间点上发生变化,而且这些离散时间点一般是不确定的。例如:单人理发馆系统,设上午9:00开门,下午5:00关门。顾客到达时间一般是随机的,为每个顾客服务的时间长度也是随机的。 这类系统中引起状态变化的原因是事件,通常状态变化与事件的发生是一一对应的。事件的发生一般带有随机性,即事件的发生不是确定性的,而是遵循某种概率分布。而且事件的发生没有持续性,在一个时间点瞬间完成。离散事件系统的系统模型不能用方程的形式描述。离散事件系统的研究方法是排队论和运筹论。针对离散事件系统的仿真就称为离散事件系统仿真. 1.3系统模型 系统模型是对实际系统的一种抽象,是系统本质的表述,是人们对客观世界反复认识、分析,经过多级转换、整合等相似过程而形成的最终结果,它具有与系统相似的数学描述形式或物理属性,以各种可用的形式给出研究系统的信息。 系统仿真中所用的模型分为实体模型和数学模型.在离散事件系统仿真中使用的是数学模型.

相关主题
文本预览
相关文档 最新文档