Vissim11二次开发之C#---实现仿真时间内实施不同信号控制方案
Vissim11二次开发之C#—实现仿真时间内实施不同信号控制方案
本文起源:近些日子,由于论文仿真需求,重重重操Vissim旧业。
先说下需求情况吧:路网区域优化前后两种信号控制方案,由于论文场景要求,新的控制方案要在特定时间实施,故在vissim进行仿真时间内需要改变其信号控制方案。作为交通专业研究生,研究生期间无论是项目亦或是研究跟着给本科生讲述过一个多小时怎样使用Vissim。Vissim仿真及二次开发分为以下几个阶段。
(1)研一:Vissim软件初识。研一时候尽管本科阶段接触过Vissim软件,无奈本科土木道桥交通方向没有意识到自己认真学习Vissim,此时初期可谓透明小白,研究生一入学,刚好遇上的第一个项目就是关于Vissim建模以及二次开发的,此时主要工作:vissim仿真建模、vissim二次开发(使用语言为Vb.nebt)。当时由于要上课加上编程基础为零,vissim建模交给了本科生,本人则零敲碎打进行vissim二次开发相关工作。最后结果是:vissim仿真建模基本入门(简单的画路网),二次开发更是不甚理解(VB.net窗体调出Vissim并运行)。
(2)研二:此时由于老师安排教会本科生Vissim使用,故自己重新一步步又学了一遍Vissim,不要问为什么重新学,问就是时间太久&长时间不用。此时结果是:vissim路网建模步骤清晰化,但问题在于:本人长时间在Visssim 11、Vissim5.2、Vissim4.3不同版本之间反复横跳,亦可以说是三个版本绕着我做三体运动。由于当时经常使用编程语言为C#,而Vissim二次开发相关博文多为matlab或是python,加上本身COM文档为Vb,最后二次开发无实质进展。
(3)研三:现如今一是论文需要加上前段时间老师布置两个仿真场景的数据分析,Vissim仿真现在应该算的上熟悉了吧。而最近就是系统学习了二次开发。
- 解决问题过程:
好了,上面介绍了我的Vissim之路,下面介绍一下我解决这个问题的过程:
1百度阶段
首先,我觉得网上一定有人遇到过这个问题,一搜果然:地址为https://www.zhihu.com/question/310565097/answer/584761987
找到了,直接拿来用就行了,问题来了: - 这位博士大神的Vissim版本是4.3,我的是11,造成语法改变,参数好像也变了;
- 其用的为python编写,我Python用的不多,笔记本没有pycharm,不能调试。
解决思路:改参数>>改语言(matlab)>改语言(C#),最终还是没有解决。
2发现Vissim Basic Comand文件阶段
发现了Vissim各种语言二次开发基本之灵,选择C#照抄改成中文,绝对有点感觉了步入下一阶段
3实践:解决本文问题。 - 路网及信号配时如下图:
将上文知乎博士大神的Python代码改成C#版本的就行了
开始:
作者:Song
链接:https://www.zhihu.com/question/310565097/answer/584761987
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。import win32com.client as com
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#加载接口及文件
vissim_com = com.Dispatch("Vissim.Vissim")
vissim_com.LoadNet(r'C:\Users\1.inp')
vnet = vissim_com.net
SgCtrls = vnet.SignalControllers
SgGrps1 = SgCtrls.GetSignalControllerByNumber(1).SignalGroups.GetSignalGroupByNumber(1)# 设置仿真参数
Sim = vissim_com.simulation
Sim.RandomSeed = 60
Sim.Resolution = 10
Sim.Period = 1200
# 打开评价
eval = vissim_com.Evaluation
eval.SetAttValue('DATACOLLECTION', True)
dceval = eval.DataCollectionEvaluation
dceval.SetAttValue('FILE', True)
dceval.SetAttValue('COMPILED', True)# 开始仿真
for SimStep in range(1, int(Sim.Period * Sim.Resolution)):Sim.RunSingleStep()
#设置两个信号方案if SimStep / Sim.Resolution < 600:#注意除以Sim.Resolution,才对应当前仿真秒SgGrps1.SetAttValue("REDEND", 1)SgGrps1.SetAttValue("GREENEND", 55)else:SgGrps1.SetAttValue("REDEND", 1)SgGrps1.SetAttValue("GREENEND", 5)
Sim.stop()
而我写的C#
Vissim Vissim = new Vissim(); //如果安装多个版本的vissim,你必须设置你想要打开的vissim版本号string Path_of_COM_Basic_Commands_network = Directory.GetCurrentDirectory();//定义文件目录为当前文件目录Path_of_COM_Basic_Commands_network = "Addre\\";//最后经常使用string Filename = Path_of_COM_Basic_Commands_network + "vissimCOM改变控制方案.inpx"; //定义要打开的Vissim文件名称Vissim.LoadNet(Filename, false);//加载路网文件//加载设置(Layout文件)Filename = Path_of_COM_Basic_Commands_network + "vissimCOM改变控制方案.layx";//Vissim.LoadLayout(Filename);INet Net = Vissim.Net;//初始化netISignalController SignalController = Net.SignalControllers.get_ItemByKey(1);ISignalGroup SgGrps1 = SignalController.SGs.get_ItemByKey(1);//设置仿真参数ISimulation Sim = Vissim.Simulation;//随机种子60int RandSeed = 60;Sim.set_AttValue("RandSeed",RandSeed);//仿真精度10int SimRes = 10;Sim.set_AttValue("SimRes", SimRes);//仿真时长1200sint SimPeriod = 1200;Sim.set_AttValue("SimPeriod", SimPeriod);int SimStep;for(SimStep=1;SimStep <SimRes * SimPeriod; SimStep++){if (SimStep/SimRes < 600){//报错位置SgGrps1.set_AttValue("ENDRED", "1");SgGrps1.set_AttValue("GREENRED", "55");}else{SgGrps1.set_AttValue("ENDRED", "1");SgGrps1.set_AttValue("GREENRED", "55");}}
可是我运行完后报错:
可见我属性值写的有问题,Vissim11属性值中存在或是我没有找到正确使用方法(若找到后面更新)。
查阅C#二次开发文档发现其设置新的状态代码为:
SgGrps1.set_AttValue("SigState", "GREEN");
相当于给灯组新的状态。
于是我转换思路,自己在不同时间定义灯组状态状态不就可以形成不同配时了。
前600秒内:前20s绿灯后40秒红灯
//前600秒if (SimTime < 60){if (SimTime < 20){SgGrps1.set_AttValue("SigState", "GREEN");//前20s绿灯}else{SgGrps1.set_AttValue("SigState", "RED");//后40秒红灯}}
//后600sif (SimTime < 20){SgGrps1.set_AttValue("SigState", "GREEN");}else{SgGrps1.set_AttValue("SigState", "RED");}
并周期性循环周期为60s
结果输出600秒前后排队长度对比结果查看代码是否正常运行:
由图可见600s后由于绿灯时间长在周期60s内为50s,红灯10s;排队长度基本为0。证明控制方案正常运行。
修改600s后灯组状态为红色结果为:
方案成功。
最后:对比与上面大神的方法主要存在以下不同:
(1)语言不同:python Vs C# 使用C#的可以借鉴本文
(2)版本不同:Vissim4.3 Vs Vissim 11 Vissim 6以后语句产生改变见下图
后续安排:整理完成Vissim Basic Command C#语句。使用读入不同Sig文件完成本文需求 ,本文仅仅简单模拟:一方面较为代码书写在路网信号涉及较多时变得复杂,此外需要重复编写信号控制方案代码。
Vissim11二次开发之C#---实现仿真时间内实施不同信号控制方案相关推荐
- C#进行Visio二次开发之Shape的Data1、Data2、Data3的用处
我们知道,Visio的Shape对象有有3个比较特别的属性,分别是Data1.Data2.Data3,平常我们很少用到它,因为我们如果需要属性的话,可能会通过ShapeSheet的Customed P ...
- U9二次开发之BP定时任务插件开发
采购订单BP定时任务插件开发 最近我们公司要做采购订单审批和OA的集成,也就是把u9的审批流程搬到OA里去做.当业务员点击标准采购提交按钮的时候,把采购订单的信息触发到OA流程,在OA里做审核,OA审 ...
- C#进行Visio二次开发之Web查看Visio图纸
前面介绍的Visio开发知识,都是基于Winform的Visio的开发知识,图纸的展示都是基于Winform方式展示的.但很多时候,如果能够通过Web方式可以查看最新的图纸信息,那么系统将更加趋向完美 ...
- C#进行MapX二次开发之MapX基础知识
C#进行MapX二次开发之MapX基础知识 MapX的主要技术特点 (1). 以表(Table)的形式组织信息 每一个表都是一组MapInfo文件,这些文件组成了地图文件和数据库文件.为使用MapIn ...
- AutoCAD .Net二次开发之Editor选择集
AutoCAD .Net二次开发之Editor选择集 PickFirst选择集 一般选择集 选择集过滤SelectionFilter Editor的路径: Autodesk.AutoCAD.Appli ...
- Datax 插件二次开发之parquet日志问题处理
Datax 插件二次开发之parquet日志问题处理 Date: December 31, 2021 参考文档: https://blog.csdn.net/wuleidaren/article/de ...
- Revit二次开发之DMU
Revit二次开发之DMU Revit是一款三维联动的设计软件,一处修改处处修改, 比如,在三维视图修改了墙的位置,二维视图上墙的位置也跟着变化了,同时,墙上的门窗也会跟着移动. 这种联动关系是R ...
- AutoCAD .Net二次开发之JIG动态绘制详解
AutoCAD .Net二次开发之JIG动态绘制详解 AutoCAD平台动态绘制分两种,单实体绘制EntityJig和多实体绘制DrawJig,需要自己自定义类去继承.(本人的理解全放在了代码注释中, ...
- ProE二次开发之VS2005+ProE Wildfire 4.0开发环境配置
下载:配置文档 一.新增头文件路径 **********************Include Files********************* Tools->Options->Pro ...
最新文章
- 如何正确排序整数数组
- linux查端口占用
- flask开发restful api系列(5)-短信验证码
- Linux 文件与目录管理、ls、cd、pwd、mkdir、rmdir、cp、 rm
- Java中Web程序修改配置文件不重启服务器的方法
- Serverless 实战 —— 快速搭建 SpringBoot 应用
- es大量数据导入效率优化
- Hbase+Phoenix使用总结
- bandizip修改压缩文件内容_BandiZip使用方法,成功压缩解压文件
- Anaconda安装python模块
- (毕业设计资料)基于单片机智能液位水位监测控制系统设计
- java.sql.SQLException: 列名无效
- 信息检索平台Terrier的使用
- 2015校园O2O商业模式解析——从物流切入
- Axure 9 实战案例,基本元件的应用 1,用矩形与标题设计视频封面
- 第19天---python办公自动化---操作PDF文件
- Event Loop事件循环机制
- 斯坦福和伯克利计算机专业,斯坦福、加州伯克利、卡内基梅隆以及MIT计算机专业录取...
- harbor 详解
- 阿里云ecs windows 2008 安装ftp