VISSIM 二次开发介绍(一)
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
月
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());
public partial class Form1 : Form {
public Form1() {
InitializeComponent(); InitialVissim(); //初始化函数
} } }
public void InitialVissim() { Vissim vis = new Vissim(); if ( vis != null ) { vis.LoadNet(@".inp 文件路径", 0);
图 5 加入 TextBox 控件设置仿真参数
同样,添加相应的代码,如下: private void StartSimulation_Click(object sender, EventArgs e)
{ Vissim vis = new Vissim();
Simulation sim = vis.Simulation; try {
using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using VISSIM_COMSERVERLib; //注意添加命名空间
namespace VissimComTest_1 {
} public void InitialVissim() {
Vissim vis = new Vissim(); //新建路网
vis.LoadNet(@"C:\Users\lenovo\Desktop\VISSIM 二次开发\路网 模型\crossing_model.inp", 0); //加载路网
DateTime DateTime = new DateTime();
MySystemTime.vYear = (ushort)2008; //改为 2008 年
MySystemTime.vMonth = (ushort)Convert.ToInt32(DateTime.Now.Month.ToString()); //获取当前
sim.Stop();
} } 编译运行后,如图 6 所示。
图 6 仿真运行效果图 需要指出的是,一旦开启了连续仿真模式 sim.RunContinuous(),则仿 真运行期间不能进行其他操作,除非事先设定了中断点。但是经过尝试 发现,以 for 循环搭配单步仿真的方式更加灵活,能够在仿真运行过程 中进行各种操作,且不影响仿真进度和最终结果,这方面内容将在后续 几期中介绍。另外,每次开启 vissim4.3 之前都需要调整时间,很是繁 琐,直接在软件中进行修改,在启动时将时间自动修改为 2008,注意! 需要在编译后以管理员模式打开可执行文件.exe(保存在项目目录下的 bin→Debug→VissimComTest_1.exe),读者可自行尝试实现退出程 序后系统时间复位的功能。同时可以下载开发手册,举一反三,自行摸 索。
sim.Speed = Convert.ToDouble(this.SimulationSpeed.Text); //设置仿真速度
sim.RunContinuous(); //进行连续仿真 } catch //如果捕获到异常 {
MessageBox.Show("仿真未正常结束!");
sim.Stop(); //仿真结束 } }
图 4 拖入按钮控件 双击“开启路网”按钮控件,进行代码编写,将之前放在 public Form1(){} 中的 InitialVissim()函数移动到 private void Start_Click(object sender, EventArgs e){}中,运行编译之后,可以通过按钮控件打开 Vissim 路网。 接着我们添加一组 TextBox 控件来设置仿真参数,如:仿真周期和仿真 速 度 等 , 将 对 应的 TextBox 控 件 分 别 命 名 为 “SimulationPeriod” 和 “SimulationSpeed” 。 同 时 添 加 一 个 “ 开 始 仿 真 ” 的 按 钮 控 件 ( 命 名 为 “StartSimulation”),用于启动仿真,如图 5 所示。
图 2 加载 VISSIM 接口 第二步,新建路网
在编写代码之前要了解的是 VISSIM 的整个开发构架,如图 3 所示。根 对象是 Vissim,路网对象 Net 下分出各子对象,如路段(link)、路径 (paths)、车辆(vehicle)等。具体的对象关系及相关的函数在 VISSIM 官方的二次开发手册中会有详细介绍。
图 1 高速公路 VISSIM 仿真平台原理示意图 三、C#平台对接
本期主要介绍 VISSIM 4.3 和 C#平台的对接,实现的最初级功能包括: (1)通过 C#windows 控件打开 VISSIM 路网;(2)设置 VISSIM 仿 真参数(仿真时长、仿真速度、精度、随机种子数等)。
第一步,加载 COM 接口 在 C#中新建 window 窗体应用项目,命名为“VissimComTest_1”,并 在解决方案资源管理器中右键点击“引用”,将 VISSIM 的 COM 接口载 入项目,如图 2 所示。
MySystemTime.vSecond = (ushort)Convert.ToInt32(DateTime.Now.Second.ToString());
SetSystemDateTime.SetLocalTime(MySystemTime); //修改 系统时间结束
}
private void Form1_Load(object sender, EventArgs e) {
[DllImportAttribute("Kernel32.dll")]
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;
sim.Period = Convert.ToDouble(this.SimulationPeriod.Text);
sim.Speed = Convert.ToDouble(this.SimulationSpeed.Text);
sim.RunContinuous(); } catch {
MessageBox.Show("仿真未正常结束!");
} } 完成后,点击编译,运行,就可以打开指令路径的 vissim 路网了(注
意,4.3 版本需要将系统时间调至 2008 年,否则无法运行)。
第三步,添加控件
下面我们通过添加按钮控制和文本框控制来实现 VISSIM 路网的开启和
仿真参数的设置。首先,在 VS 开发平台中点开控件工具箱,拖入一个
按钮控制,并在属性中将 Text 改为“开启路网”,Name 改为“Start”,如 图 4 所示。
图 3 VISSIM 对象关系 首先双击 Form1 对话框,打开后台代码,添加 VISSIM 的 COM 接口命 名空间,并新建一个初始化函数“InitialVissim ()”,代码如下: using System; using System.Collections.Generic; using ponentModel; using System.Data;
//自定义类 SetSystemDateTime 用于设置系统时间
public class SetSystemDateTime {
[DllImportAttribute("Kernel32.dll")]
public static extern void GetLocalTime(SystemTime st);
}
private void Start_Click(object sender, EventArgs e) {
InitialVissim(); //初始化 }
//开始仿真
private void StartSimulation_Click(object sender, EventArgs e) {
下期预告:下期中我们将介绍如何在仿真运行过程中获取检测器参数,
以及如何设置路网的事故场景。
【附】第一期完整代码:
using System; using System.Drawing; using System.Collections; using System.Windows.Forms; using System.Collections.Generic; using ponentModel; using System.Data; using System.Text; using System.Threading; using System.Linq; using System.Runtime.InteropServices; using VISSIM现方式做保护处理对用户上传分享的文档内容本身不做任何修改或编辑并不能对任何下载内容负责
一、前 言 相信各位在使用 VISSIM 微观仿真软件的过程中,会想到通过仿真
手段验证自己研究的模型算法效果,而 Vissim 自带的功能往往无法满 足,因此需要进行二次开发,而这一过程就需要用到 VISSIM 提供的 COM 接口。从本期开始,我们将介绍基于 C#平台的 VISSIM 二次开发, 每一期都将附上图文步骤和 C#源代码。同时,我们非常欢迎在此过程 中能够和大家一起讨论,分享相关的经验和感悟。
public ushort vSecond;
} }Βιβλιοθήκη 二、VISSIM 二次开发思路 以高速公路管理控制为例,其思路即在仿真平台基础上,通过 COM
接口和 C#构建控制平台,平台可集成路况判别,事故检测、管理控制 等一系列功能,并通过 VISSIM 自带的评价模块(可输出总车辆行驶时 间、行驶距离、排放等参数)对路网运行状态进行评价,概要思路如图 1 所示。
Vissim vis = new Vissim(); //此时定义的路网即对应已打开 的路网
Simulation sim = vis.Simulation; //仿真对象
try {
sim.Period = Convert.ToDouble(this.SimulationPeriod.Text); //设置仿真周期
namespace VissimComTest_1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
SystemTime MySystemTime = new SystemTime(); //此部
分修改系统时间
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());
public partial class Form1 : Form {
public Form1() {
InitializeComponent(); InitialVissim(); //初始化函数
} } }
public void InitialVissim() { Vissim vis = new Vissim(); if ( vis != null ) { vis.LoadNet(@".inp 文件路径", 0);
图 5 加入 TextBox 控件设置仿真参数
同样,添加相应的代码,如下: private void StartSimulation_Click(object sender, EventArgs e)
{ Vissim vis = new Vissim();
Simulation sim = vis.Simulation; try {
using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using VISSIM_COMSERVERLib; //注意添加命名空间
namespace VissimComTest_1 {
} public void InitialVissim() {
Vissim vis = new Vissim(); //新建路网
vis.LoadNet(@"C:\Users\lenovo\Desktop\VISSIM 二次开发\路网 模型\crossing_model.inp", 0); //加载路网
DateTime DateTime = new DateTime();
MySystemTime.vYear = (ushort)2008; //改为 2008 年
MySystemTime.vMonth = (ushort)Convert.ToInt32(DateTime.Now.Month.ToString()); //获取当前
sim.Stop();
} } 编译运行后,如图 6 所示。
图 6 仿真运行效果图 需要指出的是,一旦开启了连续仿真模式 sim.RunContinuous(),则仿 真运行期间不能进行其他操作,除非事先设定了中断点。但是经过尝试 发现,以 for 循环搭配单步仿真的方式更加灵活,能够在仿真运行过程 中进行各种操作,且不影响仿真进度和最终结果,这方面内容将在后续 几期中介绍。另外,每次开启 vissim4.3 之前都需要调整时间,很是繁 琐,直接在软件中进行修改,在启动时将时间自动修改为 2008,注意! 需要在编译后以管理员模式打开可执行文件.exe(保存在项目目录下的 bin→Debug→VissimComTest_1.exe),读者可自行尝试实现退出程 序后系统时间复位的功能。同时可以下载开发手册,举一反三,自行摸 索。
sim.Speed = Convert.ToDouble(this.SimulationSpeed.Text); //设置仿真速度
sim.RunContinuous(); //进行连续仿真 } catch //如果捕获到异常 {
MessageBox.Show("仿真未正常结束!");
sim.Stop(); //仿真结束 } }
图 4 拖入按钮控件 双击“开启路网”按钮控件,进行代码编写,将之前放在 public Form1(){} 中的 InitialVissim()函数移动到 private void Start_Click(object sender, EventArgs e){}中,运行编译之后,可以通过按钮控件打开 Vissim 路网。 接着我们添加一组 TextBox 控件来设置仿真参数,如:仿真周期和仿真 速 度 等 , 将 对 应的 TextBox 控 件 分 别 命 名 为 “SimulationPeriod” 和 “SimulationSpeed” 。 同 时 添 加 一 个 “ 开 始 仿 真 ” 的 按 钮 控 件 ( 命 名 为 “StartSimulation”),用于启动仿真,如图 5 所示。
图 2 加载 VISSIM 接口 第二步,新建路网
在编写代码之前要了解的是 VISSIM 的整个开发构架,如图 3 所示。根 对象是 Vissim,路网对象 Net 下分出各子对象,如路段(link)、路径 (paths)、车辆(vehicle)等。具体的对象关系及相关的函数在 VISSIM 官方的二次开发手册中会有详细介绍。
图 1 高速公路 VISSIM 仿真平台原理示意图 三、C#平台对接
本期主要介绍 VISSIM 4.3 和 C#平台的对接,实现的最初级功能包括: (1)通过 C#windows 控件打开 VISSIM 路网;(2)设置 VISSIM 仿 真参数(仿真时长、仿真速度、精度、随机种子数等)。
第一步,加载 COM 接口 在 C#中新建 window 窗体应用项目,命名为“VissimComTest_1”,并 在解决方案资源管理器中右键点击“引用”,将 VISSIM 的 COM 接口载 入项目,如图 2 所示。
MySystemTime.vSecond = (ushort)Convert.ToInt32(DateTime.Now.Second.ToString());
SetSystemDateTime.SetLocalTime(MySystemTime); //修改 系统时间结束
}
private void Form1_Load(object sender, EventArgs e) {
[DllImportAttribute("Kernel32.dll")]
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;
sim.Period = Convert.ToDouble(this.SimulationPeriod.Text);
sim.Speed = Convert.ToDouble(this.SimulationSpeed.Text);
sim.RunContinuous(); } catch {
MessageBox.Show("仿真未正常结束!");
} } 完成后,点击编译,运行,就可以打开指令路径的 vissim 路网了(注
意,4.3 版本需要将系统时间调至 2008 年,否则无法运行)。
第三步,添加控件
下面我们通过添加按钮控制和文本框控制来实现 VISSIM 路网的开启和
仿真参数的设置。首先,在 VS 开发平台中点开控件工具箱,拖入一个
按钮控制,并在属性中将 Text 改为“开启路网”,Name 改为“Start”,如 图 4 所示。
图 3 VISSIM 对象关系 首先双击 Form1 对话框,打开后台代码,添加 VISSIM 的 COM 接口命 名空间,并新建一个初始化函数“InitialVissim ()”,代码如下: using System; using System.Collections.Generic; using ponentModel; using System.Data;
//自定义类 SetSystemDateTime 用于设置系统时间
public class SetSystemDateTime {
[DllImportAttribute("Kernel32.dll")]
public static extern void GetLocalTime(SystemTime st);
}
private void Start_Click(object sender, EventArgs e) {
InitialVissim(); //初始化 }
//开始仿真
private void StartSimulation_Click(object sender, EventArgs e) {
下期预告:下期中我们将介绍如何在仿真运行过程中获取检测器参数,
以及如何设置路网的事故场景。
【附】第一期完整代码:
using System; using System.Drawing; using System.Collections; using System.Windows.Forms; using System.Collections.Generic; using ponentModel; using System.Data; using System.Text; using System.Threading; using System.Linq; using System.Runtime.InteropServices; using VISSIM现方式做保护处理对用户上传分享的文档内容本身不做任何修改或编辑并不能对任何下载内容负责
一、前 言 相信各位在使用 VISSIM 微观仿真软件的过程中,会想到通过仿真
手段验证自己研究的模型算法效果,而 Vissim 自带的功能往往无法满 足,因此需要进行二次开发,而这一过程就需要用到 VISSIM 提供的 COM 接口。从本期开始,我们将介绍基于 C#平台的 VISSIM 二次开发, 每一期都将附上图文步骤和 C#源代码。同时,我们非常欢迎在此过程 中能够和大家一起讨论,分享相关的经验和感悟。
public ushort vSecond;
} }Βιβλιοθήκη 二、VISSIM 二次开发思路 以高速公路管理控制为例,其思路即在仿真平台基础上,通过 COM
接口和 C#构建控制平台,平台可集成路况判别,事故检测、管理控制 等一系列功能,并通过 VISSIM 自带的评价模块(可输出总车辆行驶时 间、行驶距离、排放等参数)对路网运行状态进行评价,概要思路如图 1 所示。
Vissim vis = new Vissim(); //此时定义的路网即对应已打开 的路网
Simulation sim = vis.Simulation; //仿真对象
try {
sim.Period = Convert.ToDouble(this.SimulationPeriod.Text); //设置仿真周期
namespace VissimComTest_1 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
SystemTime MySystemTime = new SystemTime(); //此部
分修改系统时间