VISSIM 二次开发介绍(一)

更新时间:2024-07-07 21:19:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

一、前 言

相信各位在使用VISSIM微观仿真软件的过程中,会想到通过仿真手段验证自己研究的模型算法效果,而Vissim自带的功能往往无法满足,因此需要进行二次开发,而这一过程就需要用到VISSIM提供的COM接口。从本期开始,我们将介绍基于C#平台的VISSIM二次开发,每一期都将附上图文步骤和C#源代码。同时,我们非常欢迎在此过程中能够和大家一起讨论,分享相关的经验和感悟。

二、VISSIM二次开发思路

以高速公路管理控制为例,其思路即在仿真平台基础上,通过COM接口和C#构建控制平台,平台可集成路况判别,事故检测、管理控制等一系列功能,并通过VISSIM自带的评价模块(可输出总车辆行驶时间、行驶距离、排放等参数)对路网运行状态进行评价,概要思路如图1所示。

图1 高速公路VISSIM仿真平台原理示意图 三、C#平台对接

本期主要介绍VISSIM 4.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官方的二次开发手册中会有详细介绍。

图3 VISSIM对象关系

首先双击Form1对话框,打开后台代码,添加VISSIM的COM接口命名空间,并新建一个初始化函数“InitialVissim ()”,代码如下: using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing; using System.Linq; using System.Text;

using System.Windows.Forms;

using VISSIM_COMSERVERLib; //注意添加命名空间

namespace VissimComTest_1 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent();

InitialVissim(); //初始化函数 } } }

public void InitialVissim() {

Vissim vis = new Vissim(); if ( vis != null ) {

vis.LoadNet(@\.inp文件路径\} }

完成后,点击编译,运行,就可以打开指令路径的vissim路网了(注意,4.3版本需要将系统时间调至2008年,否则无法运行)。 第三步,添加控件

下面我们通过添加按钮控制和文本框控制来实现VISSIM路网的开启和仿真参数的设置。首先,在VS开发平台中点开控件工具箱,拖入一个

按钮控制,并在属性中将Text改为“开启路网”,Name改为“Start”,如图4所示。

图4 拖入按钮控件

双击“开启路网”按钮控件,进行代码编写,将之前放在public Form1(){}中的 InitialVissim()函数移动到private void Start_Click(object sender, EventArgs e){}中,运行编译之后,可以通过按钮控件打开Vissim路网。接着我们添加一组TextBox控件来设置仿真参数,如:仿真周期和仿真速度等,将对应的TextBox控件分别命名为“SimulationPeriod”和“SimulationSpeed”。同时添加一个“开始仿真”的按钮控件(命名为“StartSimulation”),用于启动仿真,如图5所示。

图5 加入TextBox控件设置仿真参数 同样,添加相应的代码,如下:

private void StartSimulation_Click(object sender, EventArgs e) {

Vissim vis = new Vissim();

Simulation sim = 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),读者可自行尝试实现退出程序后系统时间复位的功能。同时可以下载开发手册,举一反三,自行摸索。

下期预告:下期中我们将介绍如何在仿真运行过程中获取检测器参数,以及如何设置路网的事故场景。 【附】第一期完整代码:

using System;

using System.Drawing; using System.Collections;

using System.Windows.Forms; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Text;

using System.Threading; using System.Linq;

using System.Runtime.InteropServices; using VISSIM_COMSERVERLib;

namespace VissimComTest_1 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent();

SystemTime MySystemTime = new SystemTime(); //此部分修改系统时间

DateTime DateTime = new DateTime();

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); //修改系统时间结束

}

private void Form1_Load(object sender, EventArgs e) {

}

public void InitialVissim() {

Vissim vis = new Vissim(); //新建路网

vis.LoadNet(@\二次开发\\路网模型\\crossing_model.inp\加载路网

}

private void Start_Click(object sender, EventArgs e) {

InitialVissim(); //初始化 }

//开始仿真

private void StartSimulation_Click(object sender, EventArgs e) {

Vissim vis = new Vissim(); //此时定义的路网即对应已打开的路网

Simulation sim = 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用于设置系统时间

public class SetSystemDateTime {

[DllImportAttribute(\

public static extern void GetLocalTime(SystemTime st);

[DllImportAttribute(\

public static extern void SetLocalTime(SystemTime st); }

//自定义类SystemTime用于定义日期时间类

[StructLayoutAttribute(LayoutKind.Sequential)]

public class SystemTime {

public ushort vYear;

public ushort vMonth;

public ushort vDayOfWeek;

public ushort vDay;

public ushort vHour;

public ushort vMinute;

public ushort vSecond;

} }

本文来源:https://www.bwwdw.com/article/zoi.html

Top