VISSIM-二次开发介绍(一)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、前言相信各位在使用VISSIM微观仿真软件的过程中,会想到通过仿真手段验证自己研究的模型算法效果,而Vissim自带的功能往往无法满足,因此需要进行二次开发,而这一过程就需要用到VISSIM提供的COM接口。从本期开始,我们将介绍基于C#平台的VISSIM二次开发,每一期都将附上图文步骤和C#源代码。同时,我们非常欢迎在此过程中能够和大家一起讨论,分享相关的经验和感悟。二、VISSIM二次开发思路以高速公路管理控制为例,其思路即在仿真平台基础上,通过COM接口和C#构建控制平台,平台可集成路况判别,事故检测、管理控制等一系列功能,并通过VISSIM自带的评价模块(可输出总车辆行驶时间、行驶距离、排放等参数)对路网运行状态进行评价,概要思路如图1所示。图1高速公路VISSIM仿真平台原理示意图三、C#平台对接本期主要介绍VISSIM4.3和C#平台的对接,实现的最初级功能包括:(1)通过C#windows控件打开VISSIM路网;(2)设置VISSIM仿真参数(仿真时长、仿真速度、精度、随机种子数等)。第一步,加载COM接口在C#中新建window窗体应用项目,命名为“VissimComTest_1”,并在解决方案资源管理器中右键点击“引用”,将VISSIM的COM接口载入项目,如图2所示。图2加载VISSIM接口第二步,新建路网在编写代码之前要了解的是VISSIM的整个开发构架,如图3所示。根对象是Vissim,路网对象Net下分出各子对象,如路段(link)、路径(paths)、车辆(vehicle)等。具体的对象关系及相关的函数在VISSIM官方的二次开发手册中会有详细介绍。图3VISSIM对象关系首先双击Form1对话框,打开后台代码,添加VISSIM的COM接口命名空间,并新建一个初始化函数“InitialVissim()”,代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingVISSIM_COMSERVERLib;//注意添加命名空间namespaceVissimComTest_1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();InitialVissim();//初始化函数}}}publicvoidInitialVissim(){Vissimvis=newVissim();if(vis!=null){vis.LoadNet(@.inp文件路径,0);}}完成后,点击编译,运行,就可以打开指令路径的vissim路网了(注意,4.3版本需要将系统时间调至2008年,否则无法运行)。第三步,添加控件下面我们通过添加按钮控制和文本框控制来实现VISSIM路网的开启和仿真参数的设置。首先,在VS开发平台中点开控件工具箱,拖入一个按钮控制,并在属性中将Text改为“开启路网”,Name改为“Start”,如图4所示。图4拖入按钮控件双击“开启路网”按钮控件,进行代码编写,将之前放在publicForm1(){}中的InitialVissim()函数移动到privatevoidStart_Click(objectsender,EventArgse){}中,运行编译之后,可以通过按钮控件打开Vissim路网。接着我们添加一组TextBox控件来设置仿真参数,如:仿真周期和仿真速度等,将对应的TextBox控件分别命名为“SimulationPeriod”和“SimulationSpeed”。同时添加一个“开始仿真”的按钮控件(命名为“StartSimulation”),用于启动仿真,如图5所示。图5加入TextBox控件设置仿真参数同样,添加相应的代码,如下:privatevoidStartSimulation_Click(objectsender,EventArgse){Vissimvis=newVissim();Simulationsim=vis.Simulation;try{sim.Period=Convert.ToDouble(this.SimulationPeriod.Text);sim.Speed=Convert.ToDouble(this.SimulationSpeed.Text);sim.RunContinuous();}catch{MessageBox.Show(仿真未正常结束!);sim.Stop();}}编译运行后,如图6所示。图6仿真运行效果图需要指出的是,一旦开启了连续仿真模式sim.RunContinuous(),则仿真运行期间不能进行其他操作,除非事先设定了中断点。但是经过尝试发现,以for循环搭配单步仿真的方式更加灵活,能够在仿真运行过程中进行各种操作,且不影响仿真进度和最终结果,这方面内容将在后续几期中介绍。另外,每次开启vissim4.3之前都需要调整时间,很是繁琐,直接在软件中进行修改,在启动时将时间自动修改为2008,注意!需要在编译后以管理员模式打开可执行文件.exe(保存在项目目录下的bin→Debug→VissimComTest_1.exe),读者可自行尝试实现退出程序后系统时间复位的功能。同时可以下载开发手册,举一反三,自行摸索。下期预告:下期中我们将介绍如何在仿真运行过程中获取检测器参数,以及如何设置路网的事故场景。【附】第一期完整代码:usingSystem;usingSystem.Drawing;usingSystem.Collections;usingSystem.Windows.Forms;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Text;usingSystem.Threading;usingSystem.Linq;usingSystem.Runtime.InteropServices;usingVISSIM_COMSERVERLib;namespaceVissimComTest_1{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();SystemTimeMySystemTime=newSystemTime();//此部分修改系统时间DateTimeDateTime=newDateTime();MySystemTime.vYear=(ushort)2008;//改为2008年MySystemTime.vMonth=(ushort)Convert.ToInt32(DateTime.Now.Month.ToString());//获取当前月MySystemTime.vDay=(ushort)Convert.ToInt32(DateTime.Now.Day.ToString());MySystemTime.vHour=(ushort)Convert.ToInt32(DateTime.Now.Hour.ToString());MySystemTime.vMinute=(ushort)Convert.ToInt32(DateTime.Now.Minute.ToString());MySystemTime.vSecond=(ushort)Convert.ToInt32(DateTime.Now.Second.ToString());SetSystemDateTime.SetLocalTime(MySystemTime);//修改系统时间结束}privatevoidForm1_Load(objectsender,EventArgse){}publicvoidInitialVissim(){Vissimvis=newVissim();//新建路网vis.LoadNet(@C:\Users\lenovo\Desktop\VISSIM二次开发\路网模型\crossing_model.inp,0);//加载路网}privatevoidStart_Click(objectsender,EventArgse){InitialVissim();//初始化}//开始仿真privatevoidStartSimulation_Click(objectsender,EventArgse){Vissimvis=newVissim();//此时定义的路网即对应已打开的路网Simulationsim=vis.Simulation;//仿真对象try{sim.Period=Convert.ToDouble(this.SimulationPeriod.Text);//设置仿真周期sim.Speed=Convert.ToDouble(this.SimulationSpeed.Text);//设置仿真速度sim.RunContinuous();//进行连续仿真}catch//如果捕获到异常{MessageBox.Show(仿真未正常结束!);sim.Stop();//仿真结束}}//自定义类SetSystemDateTime用于设置系统时间publicclassSetSystemDateTime{[DllImportAttribute(Kernel32.dll)]publicstaticexternvoidGetLocalTime(SystemTimest);[DllImportAttribute(Kernel32.dll)]publicstaticexternvoidSetLocalTime(SystemTimest);}//自定义类SystemTime用于定义日期时间类[StructLayoutAttribute(LayoutKind.Sequential)]publicclassSystemTime{publicushortvYear;publicushortvMonth;publicushortvDayOfWeek;publicushortvDay;publicushortvHour;publicushortvMinute;publicushortvSecond;}}

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功