VISSIM 二次开发介绍(一)
更新时间:2024-07-07 21:19:01 阅读量: 综合文库 文档下载
- vissim推荐度:
- 相关推荐
一、前 言
相信各位在使用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;
} }
正在阅读:
VISSIM 二次开发介绍(一)07-07
金属加工机械制造项目可行性研究报告12-29
丰田轿车可变配气技术解析09-10
地球生命保护伞(社会资源整合) - 图文04-09
享受春雨阅读答案06-01
2021年安全知识竞赛宣传口号04-29
优化育人环境 打造平安校园Microsoft Word 文档04-16
辩论赛 新南审赛制09-29
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- VISSIM
- 开发
- 介绍
- 高中物理必修二2重难点知识归纳总结及典型题目解析
- 结构件的疲劳寿命分析方法1
- 新视野大学英语第四册第三版课文及翻译
- 金丽衢十二校2018学年高三第一次联考
- 2015财经法规第一章练习
- 高中生托福备考攻略(二)
- 文学欣赏课程整体设计
- 岗位技能培训管理办法(初稿)
- 教科版小学科学二年级上册教案(全册)教学设计
- 行政管理专业分析、就业方向、行业薪资
- 14001环境管理体系考试-审核知识-案例分析题(全)
- 沉积岩特征描述
- c语言实习报告
- 真石漆施工组织设计方案
- 五个自闭症儿童个案分析
- 创新案例专题讲座题库(单选)2016
- 心理运动会策划书(初稿)
- 北京市西城区2018届高三统一测试文综试题
- 外贸函电英语课后练习
- 陕西省师大附中2017届高三下学期七模考试文综地理试题