基于网上资料很少的情况下,研究了将近一个月,入了无数的大坑(能把人栽死的那种)含泪写下这篇文章
首先,Matlab并不是支持COM所有函数处理的,目前试到的函数不是很多,大部分功能还是可以实现的。
/*****************写在前面*******************************/
程序中的获得的数据前提是在VISSIM路网中设置有相应的检测器或者变量,否则获取不到,有可能出错
所以对路网能实现哪些功能必须非常熟悉。程序中只是为了调用数据,获得数据,处理数据,设置数据。
Matlab一些功能性定义:
%%建立VISSIM的COM接口
vissim =actxserver('VISSIM.vissim.430');
%% 加载交通网络
current_path = pwd;
vissim.LoadNet([current_path '\vissim.inp']);
vissim.LoadLayout([current_path '\vissim.ini']);
%%设置仿真参数
sim = vissim.Simulation;
new_period_time =101;
sim.set('Period',new_period_time);
new_Resolution =1;
sim.set('Resolution',new_Resolution);
new_Speed=1;
sim.set('Speed',new_Speed);
new_Random_Seed=50;
%sim.set('RandomSeed',new_Random_Seed);
%% 定义网络对象
vnet=vissim.Net;
%% 设置路段属性
Link=vnet.Links;
lnk1=Link.GetLinkByNumber(1); %东进直等,定义变量
%% 获得各个车道车辆数量
veh1=lnk1.GetVehicles;
%% 设置行程时间检测器
T_Time1=vnet.TravelTimes.GetTravelTimeByNumber(1);%东进口直行
%% 设置数据采集器
dats = vnet.DataCollections;
dat_1 = dats.GetDataCollectionByNumber(1); %西出口1
%% 设置路径决策
routingDecision1=vnet.RoutingDecisions.GetRoutingDecisionByNumber(1);%南进混
%% 软件激活计测器评价
eval = vissim.Evaluation;
eval.set('AttValue','DATACOLLECTION',1); %激活数据采集器模块
eval.set('AttValue','TRAVELTIME',1); %激活行程时间模块
eval.set('AttValue','Link',0); %不激活路段评价
eval.set('AttValue','Delay',1);
eval.set('AttValue','QUEUECOUNTER',1);
%% 设置交通信号灯
controllers = vissim.Net.SignalControllers;
groups = controllers.Item(1).SignalGroups;
group1 = groups.GetSignalGroupByNumber(1);%裕华路直行加右转
%%车辆信息
vehicleInput1=vissim.Net.VehicleInputs.GetVehicleInputByNumber(1);%东
v1=vehicleInput1.get('AttValue','VOLUME');
vehicle1 = vissim.Net.TrafficCompositions.GetTrafficCompositionByNumber(1);
vv=vehicle2.get('AttValue1','RELATIVEfLOW',100 );
route1 = vissim.Net.RoutingDecisions.GetRoutingDecisionByNumber(1);
%%此外注意,获得数据结果时(用某个检测器的数据)要注意程序中和vissim路网中的模型检测周期一致,否则得到的数据一直为0.
dat_1_vehicle_num=dat_1.GetResult('NVEHICLES','SUM',0);