利用matlab进行Vissim二次开发,史上最详细

二次开发之前,应首先解决修改时间的问题,具体操作见
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二次开发的操作大概都在这了。

博文不易,欢迎关注‘一个交通人’
在这里插入图片描述

  • 20
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值