二次开发之前,应首先解决修改时间的问题,具体操作见
https://blog.csdn.net/qq_38439669/article/details/106736422
好了,进入正题
1、利用时间修改工具打开Vissim ,启动Vissim:
vissim=actxserver('VISSIM.vissim.430');%启动vissim
current_path='C:\Users\Desktop\simulation';
vissim.LoadNet([current_path,'\simulatonpm.inp']);%创建Vissim实例,导入路网
vissim.LoadLayout([current_path,'\simulation.ini']);%导入背景
sim=vissim.Simulation;%设置仿真属性
sim.Period=3600;%设置仿真时间
sim.Speed=20;%设置仿真速度
vnet=vissim.Net;%获取路网属性
2、获取路网车辆输入
vehicles_in=vnet.VehicleInputs;
for i=1:vehicles_in.count
vehicle_in(i)=vehicles_in.GetVehicleInputByNumber(i); %获取车辆输入
end
for i=1:vehicles_in.count
vehicle_in(i).set('AttValue','VOLUME',volume(i)); %为各路段赋予车辆流量
end
3、获取路段属性
for i=1:links.count
if isempty(links.GetLinkByNumber(i))
break;
end
link(i)=links.GetLinkByNumber(i);
end
4、获取信号控制机
scs=vnet.SignalControllers;
for i=1:scs.count
sc(i)=scs.GetSignalControllerByNumber(i);
end
for i=1:scs.count-1
sc(i).set('AttValue','offset',round(C*double(o(i)))); %为各信号控制机设置初始偏移量
end
for i=1:scs.count
sc(i).set('AttValue','cycletime',C); %为各信号机设置信号周期
end
sc(1).SignalGroups.GetSignalGroupByNumber(1).set('Attvalue','Amber',3); %为第一个信号机第一个 信号灯设置黄灯时间
sc(1).SignalGroups.GetSignalGroupByNumber(1).set('Attvalue','Redend',4);%为第一个信号机第一个 信号灯设置红灯时间
sc(1).SignalGroups.GetSignalGroupByNumber(1).set('Attvalue','Greenend',36);%为第一个信号机第一个 信号灯设置绿灯时间
%具体的可根据需要修改
sc(16).SignalGroups.GetSignalGroupByNumber(1).set('AttValue','Type',2);%将第16控制机的第一相位设置为常绿
sc(16).SignalGroups.GetSignalGroupByNumber(2).set('AttValue','Type',3)%将第16控制机的第二相位设置为常红
%1表示定周期;2表示常绿;3表示常红
5、获取停车信号
stops=vnet.stopsigns;
for i=1:14
stop(i)=stops.GetStopSignByNumber(i);
stop(i).set('AttValue1','TIMEDIST',30,2);%为公交设置停车分布2
end
%小编的vissim车辆种类含义:10表示小汽车;30表示公交
6、获取评价指标(单步仿真评价指标)
eval=vissim.Evaluation;
eval.set('AttValue','DATACOLLECTION',1);%激活评价指标
eval.set('Attvalue','TRAVELTIME',1);
eval.set('AttValue','DELAY',1);
for i=1:sim.Period
%获取行程时间评价结果
sim.RunSingleStep;%单步仿真
time_evals=vnet.traveltimes;
for i=1:time_evals.count
time_eval(i)=time_evals.GetTravelTimeByNumber(i).GetResult(600,'TRAVELTIME',0);
end
%获取平均速度评价结果
dats=vnet.Datacollection;
for i=1:dats.count
speed_dat(i)=dats.GetDataCollectionByNumber(i).GetResult('600','SPEED','MEAN');
end
%获取平均延误评价结果
delays=vnet.Delays;
for i=1:delays.count
delay(i)=delays.GetDelayByNumber(i).GetResult('600','DELAY');
end
%其他评价指标类似
end
7、多次仿真评价结果
eval=vissim.Evaluation;
eval.set('AttValue','DATACOLLECTION',1);
eval.set('Attvalue','TRAVELTIME',1);
eval.set('AttValue','DELAY',1);
for i=35:50
randseed=i;
sim.set('RandomSeed',randseed);
sim.RunContinuous;%连续仿真
sim.Stop;
adr1=[current_path,'\simulatonpm.mes'];
speed_mean(i-34)=importdata(adr1);%从文件导入数据
adr2=[current_path,'\simulatonpm.rsz'];
traveltime{i-34}=importdata(adr2);
adr3=[current_path,'\simulatonpm.vlz'];
dlay{i-34}=importdata(adr3);
end
授人以鱼不如授人以渔,利用matlab进行vissim二次开发具体操作可根据下图指示:
1、首先打开并运行一个vissim程序。
运行结果如下所示
2、点击vissim变量打开属性框,我们可以看到vissim下面的子属性通过加’.'的方式获得,例如:(注意区分大小写)
3、对照vissim二次开发操作手册书写代码,例如:
注意,查看某属性的值与为该属性赋值分别为:
net.SignalControllers.GetSignalControllerByNumber(1).AttValue('cycletime')%查看信号控制机1的当前信号周期
net.SignalControllers.GetSignalControllerByNumber(1).set('AttValue','cycletime',120)%设置信号控制机1 的周期为120
net.SignalControllers.GetSignalControllerByNumber(1).AttValue('cycletime')%查看设置后的信号周期
运行结果为:
另外,附上vissim开发手册与二次开发手册(中文版)下载地址:
https://download.csdn.net/download/qq_38439669/12521618
好了,利用matlab进行vissim二次开发的操作大概都在这了。
博文不易,欢迎关注‘一个交通人’