![4293ffa4f658ed26b885a440b33a2484.png](https://img-blog.csdnimg.cn/img_convert/4293ffa4f658ed26b885a440b33a2484.png)
封面:望月けい
写在前面:本Com接口教程基于VISSIM4.3版本,编码语言使用Matlab,主要为感应信号控制及实时数据输出作服务。本文旨在帮助为实现一定简单功能,对阅读全英文教程有一定困难的用户。详细Com介绍应参照VISSIM目录下Vissim_Com文件。欢迎指正。
目录:
1.建立COM联结的大致步骤
2.使用Matlab为VISSIM-COM编程的相关知识与具体步骤
4.测量结果的实时简单展示
建立COM联结的大致步骤
1. 在VISSIM GUI中建立完整路网(包括道路,信号灯,车辆输入,检测器)
![b6cee799b0f21329d79489f06d837fa2.png](https://img-blog.csdnimg.cn/img_convert/b6cee799b0f21329d79489f06d837fa2.png)
2. 对路网中相关内容进行设置(如信号控制,评价指标)
![34cd29bc318ecfdfbc732784a41d36dd.png](https://img-blog.csdnimg.cn/img_convert/34cd29bc318ecfdfbc732784a41d36dd.png)
![4a193f29958a36c9a427f4dce0ead8dc.png](https://img-blog.csdnimg.cn/img_convert/4a193f29958a36c9a427f4dce0ead8dc.png)
![ca8c385d737a50386bb8e14d1a445d17.png](https://img-blog.csdnimg.cn/img_convert/ca8c385d737a50386bb8e14d1a445d17.png)
![25ee484e2e437e26806b768ecbc5fc05.png](https://img-blog.csdnimg.cn/img_convert/25ee484e2e437e26806b768ecbc5fc05.png)
![513e20288ad0b6db1c4456209960db70.png](https://img-blog.csdnimg.cn/img_convert/513e20288ad0b6db1c4456209960db70.png)
![2032b2c3386e57aff19721b98af1b01e.png](https://img-blog.csdnimg.cn/img_convert/2032b2c3386e57aff19721b98af1b01e.png)
![86a1251fee3cbedf80301953ba5f43c8.png](https://img-blog.csdnimg.cn/img_convert/86a1251fee3cbedf80301953ba5f43c8.png)
3. 在Matlab中利用编码联结路网,并对参数进一步设置
4. 利用Matlab或Vap/VisVap对信号进行控制
5. 利用Matlab实时输出检测器返回的数据
使用Matlab为VISSIM-COM编程的相关知识与具体步骤
1. 编码前所需要了解的内容
1) Com接口所支持的编码语言基础语法
2) 层级式引用
VISSIM-COM的开发是基于严格的层级模式,对Vissim中对象的引用需要对应层次图自上而下,层次图如下:
![2dd3051f4c0bfdef67f5fd07e5e9bd3d.png](https://img-blog.csdnimg.cn/img_convert/2dd3051f4c0bfdef67f5fd07e5e9bd3d.png)
具体用法例如:当需要对Link做引用时,需要从VISSIM这一层开始向下填写,完整引用写法为:
Link_1 = Vissim.Net.Link; %将Link赋值给Link_1,便于之后调用
2. 具体步骤
1) 建立新的脚本文件,通过命令清空命令行与窗口
clear all; %关闭命令行
close all; %关闭窗口
2) 建立与VISSIM的连接
Vissim = actxserver('Vissim.vissim') %建立连接
3) 加载已经建立好的路网
%% loading the traffic network
access_path = pwd; %identify current floder
Vissim.LoadNet([access_path 'COM_TEST.inp']);
Vissim.LoadLayout([access_path 'test.ini']);
4) 仿真参数设置
%% simulation setting
sim = Vissim.Simulation;
period_time = 6000;
sim.set('Period',period_time); %set period time
step_time = 1;
sim.set('Resolution',step_time); %set step time
提示:此处开始使用set语句,具体使用方法为:
a) 对对象性质赋值:
对象.set('性质名',变量);
b) 对对象属性赋值:
对象.set('AttValue','属性名',变量);
属性表如下:
![1eb39d6498e382d3ccd64d85663d13e0.png](https://img-blog.csdnimg.cn/img_convert/1eb39d6498e382d3ccd64d85663d13e0.png)
解释:设置仿真时长及仿真步长,此处设置仿真时长为6000s,仿真步长为1
5) 车辆输入设置
%% traffic generation
VehicleInput = Vissim.Net.VehicleInputs;
vehin_1 = VehicleInput.GetVehicleInputByNumber(1);
vehin_1.set('AttValue','Volume',500); %主路车辆输入设置为500
vehin_2 = VehicleInput.GetVehicleInputByNumber(2);
vehin_2.set('AttValue','Volume',50); %支路车辆输入设置为50
解释:通过GetVehicleInputByNumber语句调用主路与支路车辆输入量,通过set语句设置输入量大小
6) 信号控制设置
%% set traffic signal control
scs = Vissim.Net.SignalControllers;
sc = scs.GetSignalControllerByNumber(1);
cycle_time = 46;
sc.set('AttValue','CycleTime', cycle_time); %set cycle time
sgs = sc.SignalGroups; %create signal group objects
sg_1 = sgs.GetSignalGroupByNumber(1);
sg_2 = sgs.GetSignalGroupByNumber(2);
sg_1.set('AttValue','State',3);
sg_2.set('AttValue','State',1); %set red signal for sg_2
解释:设置CycleTime(周期时长),并设置两条路上信号灯的初始信号颜色
信号灯状态赋值表如下:
![376279c75852a566449aa50b96298a3e.png](https://img-blog.csdnimg.cn/img_convert/376279c75852a566449aa50b96298a3e.png)
7) 建立评价指标
%% evaluation while running
eval = Vissim.Evaluation;
eval.set('AttValue','DATACOLLECTION',1); %active data collection
eval.set('AttValue','TRAVELTIME',1); %active travel time
eval.set('AttValue','QUEUELENGTH',1); %active queuelength
eval.set('AttValue','DELAY',1); %active delay
eval.set('AttValue','SCDETRECORD',1); %active sc
解释:即将所有设置好的检测内容打开
8) 检测器设置
%% detectors setting
% 1、检测器结果引用
dets = sc.Detectors;
det_1 = dets.GetDetectorByNumber(1);
det_2 = dets.GetDetectorByNumber(2);
% 2、数据采集器结果引用
dats = Vissim.Net.DataCollections;
dat_1 = dats.GetDataCollectionByNumber(1);
dat_2 = dats.GetDataCollectionByNumber(2);
% 3、行程时间结果引用
TravelTime = Vissim.Net.TravelTimes.GetTravelTimeByNumber(1);
% 4、排队长度结果引用
QueueCounter = Vissim.Net.QueueCounters.GetQueueCounterByNumber(1);
% 5、延误结果引用
Del = Vissim.Net.Delays.GetDelayByNumber(1);
9) 结果的输出
SUM = dat_2.GetResult('NVEHICLES','SUM',0);
Speed = dat_2.GetResult('SPEED','MEAN',0);
Occupancy = dat_2.GetResult('OCCUPANCYRATE','SUM',0);
Q_Length = QueueCounter.GetResult(i,'MAX');
T_Time = TravelTime.GetResult(i,'TRAVELTIME','',0);
Delay = Del.GetResult(i,'DELAY','',0);
NStops = Del.GetResult(i,'NSTOPS','',0););
fprintf('%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f,%5.2f',SUM,Speed,Occupancy,T_Time,Q_Length,Delay,NStops);
解释:通过GetResult语句进行赋值后,得到数据,并利用fprintf / disp进行结果的输出
GetRsult语句语法及参数的设置参照如下:
对象.GetResult(时间点,'参数名','','车辆类别');
提示:车辆类别若填0则表示所有车辆,否则为车辆1,车辆2……;参数名的设置如下表:
![4928bb6d16f266b8d61db3319e8e08b0.png](https://img-blog.csdnimg.cn/img_convert/4928bb6d16f266b8d61db3319e8e08b0.png)
测量结果的实时简单展示
![aa8bcf2da3d312ff2a9f1569d87cb81a.png](https://img-blog.csdnimg.cn/img_convert/aa8bcf2da3d312ff2a9f1569d87cb81a.png)
同样你也可以使用其他语言,比如Python进行实现这一简单应用:
![2b1d10b64fbfddb9c448fe717f9b35b6.png](https://img-blog.csdnimg.cn/img_convert/2b1d10b64fbfddb9c448fe717f9b35b6.png)