VAP,全称vehicle actuated programming,是微观交通仿真软件VISSIM中的车辆感应控制编程模块。
- 用途:在VISSIM软件中与检测器、信号灯、路径决策、期望车速分布等模块协同使用,实现交通仿真中的车辆感应控制、停车泊位管理、可变车道控制、可变限速控制等功能。
- 使用:预先准备三个文件,并直接在VISSIM软件中调用;文件① vap216.dll,在VISSIM安装目录下的Exe文件中;文件② xx.pua,描述配时方案中的绿灯间隔时间与相位切换次序;文件③ xx.vap,描述交通系统的控制逻辑与灯态控制方式。
目录
1. 基本案例
下面以主次路相交的交叉口为基本场景,建立半感应控制的信号切换逻辑,其中主路一般为绿灯,当次路检测到有车时才会自动切换至次路,因此在VISSIM中预设两相位基础方案。
2. 编辑PUA文件
2.1 借鉴PUA文件
选取VISSIM软件自带的VAP案例,如下图:
(VISSIM安装路径:VISSIM4.3\Example\Training\VAP_PedSignal_E\ped.pua)
$SIGNAL_GROUPS
$
A 1
B 2
$STAGES
$
Stage_1 A
red B
Stage_2 B
red A
$STARTING_STAGE
$
Stage_1
$INTERSTAGE1
Length [s] : 5
From Stage : 1
To Stage : 2
$
A -127 0
B 5 127
$INTERSTAGE2
Length [s] : 5
From Stage : 2
To Stage : 1
$
A 5 127
B -127 0
$END
2.2 编辑PUA文件
PUA文件的模式较为固定,主要按照以下六个部分在记事本软件中分别进行编辑:SIGNAL_GROUPS、IGM、STAGES、STARTING_STAGE、INTERSTAGE、END。
其中,“$”表示文本注释,在两个“$”之间的语句不起作用、而是为编辑者直观地展示各个模块。
1)定义灯组名称:$SIGNAL_GROUPS
在PUA文件中需要预先定义各个灯组的名称、用于后续灯组之间的切换,在两相位控制程序下,将主路和次路的两个灯组分别命名为SG1、SG2。
$SIGNAL_GROUPS
$
SG1 1
SG2 2
2)定义灯组之间的绿灯切换矩阵:$IGM,全称INTERGREEN MATRIX
为各个灯组设置绿灯时间间隔矩阵,绿灯间隔时间即是两个灯组的绿灯结束与绿灯开启的间隔。其中,同一灯组或者同时启亮与关闭的灯组赋值为-127,不同灯组之间的绿灯间隔时间可自定义,本文以5s为例。
$IGM
$
SG1 SG2
SG1 -127 5
SG2 5 -127
3)定义各个阶段启亮与关闭的灯组:$STAGES
VISSIM可实现基于灯组的信号控制方式,在信号控制时依照灯组的启亮顺序将多个灯组划分为多个阶段。在本文中将两个灯组划分为两个阶段,第一阶段主路启亮、第二阶段次路启亮。
$STAGES
$
Stage_1 SG1 # 多个灯组时用“,”隔开
red SG2
Stage_2 SG2
red SG1
4)定义开始阶段:$STARTING_STAGE
设置默认启亮的第一阶段
$STARTING_STAGE
$
Stage_1
5)定义相位切换规则:$INTERSTAGE
根据划分的各个阶段,设置任意两个阶段之间的切换规则,以阶段1切换至阶段2为例程序如下,存在多个阶段切换时,需要重复设置切换规则。
$INTERSTAGE
INTERSTAGE_number: 1 # 阶段切换编号
length[s] : 5 # 尽量与绿灯间隔矩阵保持一致
from Stage : 1 # 从阶段切换至阶段2
to stage : 2
$
SG1 -127 0 # -127与0表示阶段1在执行切换规则之前为绿灯
SG2 5 127 # 5与127表示阶段2在执行切换规则5s后变为绿灯
6)结束:$END
PUA文件运行结束的标志。
$END
最终完整版PUA文件,如下:
$SIGNAL_GROUPS
$
SG1 1
SG2 2
$IGM
$
SG1 SG2
SG1 -127 5
SG2 5 -127
$STAGES
$
stage_1 SG1
red SG2
stage_2 SG2
red SG1
$STARTING_STAGE
$
stage_1
$INTERSTAGE
INTERSTAGE_number: 1
length [s] : 5
from stage : 1
to stage : 2
$
SG1 -127 0
SG2 5 127
$INTERSTAGE
INTERSTAGE_number: 2
length [s] : 5
from stage : 2
to stage : 1
$
SG2 -127 0
SG1 5 127
$END
3. 编辑VAP文件
3.1 借鉴VAP文件
选取VISSIM软件自带的VAP案例,如下图:
(VISSIM安装路径:VISSIM4.3\Example\Training\VAP_PedSignal_E\ped.vap)
PROGRAM ped;
/* SUBROUTINES */
/* PARAMETERS DEPENDENT ON SCJ-PROGRAM */
/* EXPRESSIONS */
Min_Green_Stg1 := T_green( A ) >= T_green_min( A );
Min_Green_Stg2 := T_green( B ) >= T_green_min( B );
Ped_Demand := Occupancy( 2 ) > 0;
/* MAIN PROGRAM */
S00Z001: IF Stage_active( 1 ) THEN
S01Z001: IF Min_Green_Stg1 THEN
S02Z001: IF Ped_Demand THEN
S03Z001: Interstage( 1 , 2 )
END
END
END;
S00Z003: IF Stage_active( 2 ) THEN
S01Z003: IF Min_Green_Stg2 THEN
S03Z003: Interstage( 2 , 1 )
END
END
PROG_ENDE: .
/*----------------------------------------------------------------------------*/
3.2 编辑VAP文件
VAP文件的模式较为固定,主要包括程序头部格式部分和后续主程序编辑部分。
其中,“/*”表示文本注释,在“/* */”之间的语句不起作用、而是为编辑者直观地展示各个模块。
3.2.1 VAP程序头部格式
1)VAP程序名称
/* C:\Users\Administrator\Desktop\Main_branch\main_branch.vap */
PROGRAM main_branch; # 程序名称
VAP_FREQUENCY 1; # 调用vap程序时,各个参数的取值可能有多组,这里默认取第1组
2)程序相关参数
在CONST中为参数赋值单个数值;如果设置多个取值,可在ARRAYS中设置为数组形式;如果调用了子程序,可以在SUBROUTINES中设置子程序的名称与代码。定义主路的绿灯、最小绿和最大绿m_g、m_g_min、m_g_max;次路的最小和最大绿灯时间b_g_min、b_g_max;次路最大红灯等待时间w_max。
CONST
m_g = 30,
m_g_min = 20,
m_g_max = 60,
b_g_min = 10,
b_g_max = 20,
w_max = 40;
/* ARRAYS */
/* SUBROUTINES */
# 例如
# SUBROUTINE busmodule_single;
# D01S00Z001: IF single_A_w THEN
# D01S01Z002: ......
/* PARAMETERS DEPENDENT ON SCJ-PROGRAM */
3)自定义表达式
在EXPRESSION中汇总用到的表达式,如下即是一组判断条件,当(OccT( 21 ) >= w_max)或者(OccT( 23 ) >= w_max)成立时,次路进口道处机动车辆的停车等待时间过长,则t_wait为真;当(StgT(1) >= m_g) and (Det(21) or Det(23)),主路已超出基础绿灯时间且次路有车到达停车线,则Veh_wait为真。
21和23是次路上南北进口道停车线处的检测器编号;22和24是次路上南北进口道停车线前的检测器编号。
/* EXPRESSIONS */
T_wait := (OccT(21) >= w_max) or (OccT(23) >= w_max);
Veh_wait := (StgT(1) >= m_g) and (Det(21) or Det(23));
Veh_arrive := (Det(22) or Det(24));
3.2.2 VAP主程序编辑
1)符号的优先级
优先级 | 符号 | 含义 |
6 | ( ) | 括号 |
5 | NOT | 逻辑非 |
4 | AND * / % \ | 逻辑与,乘,除,求余,整除 |
3 | OR + - | 逻辑或,加,减 |
2 | = <> < <= > >= | 比较符号 |
1 | - | 负号 |
2)基本逻辑语句
符号 | 含义 |
:= | 赋值 |
GOSUB | 运行子程序 |
GOTO | 改变程序流向 |
IF-THEN-ELSE-END | 条件语句 |
Start-Start_at-Stop-Reset | 定时器 |
WAIT_AT-UNTIL | 循环 |
3)常用函数
VAP程序中有一些自带函数可以直接使用,主要分为检测器类、信号灯组类、信号阶段类以及其他函数,下面列举了常用的几个函数及其含义。在VAP文件中可以使用函数全称或者缩写两种形式。
类别 | 函数全称 | 函数简写 | 含义 |
检测器 类函数 | Detection(1) | Det(1) | 1号检测器的状态;如果检测到有车返回1,否则返回0 |
Headway(1) | Hdw(1) | 1号检测器获取的车头时距,没有则返回 | |
Occupancy(1) | OccT(1) | 1号检测器上车辆的占用时长,没有则返回0 | |
Presence(1) | Call(1) | 1号检测器被激活则返回1,否则返回0 | |
Veh_length(1) | V_l(1) | 当前仿真秒,1号检测器上最后一辆车的长度 | |
灯组/ 阶段类函数 | Intergreen(1, 2) | IntG(1, 2) | 返回xxx.pua文件中灯组1和2的绿灯间隔时间 |
Interstage(1, 2) | Is(1, 2) | 由阶段1切换到阶段2 | |
Interstage_active(1, 2) | IsA(1, 2) | 若阶段1到阶段2的绿灯间隔激活则返回1,否则返回0 | |
Interstage_duration(1, 2) | IsT(1, 2) | 返回阶段间隔的当前秒数,若是该间隔未激活返回0 | |
Stage_active(1) | StgA(1) | 若阶段1激活则返回1,否则返回0 | |
Stage_duration(1) | StgT(1) | 返回阶段1已经运行的持续时长,如果未激活则返回0 | |
T_green(1) | Tg(1) | 返回阶段1已运行的绿灯时长,如果不是绿灯则返回0 | |
T_green_min(1) | Tgmin(1) | 返回阶段1最小绿灯时间 |
4)控制逻辑与语句编号
首先,基于本场景建立信号控制逻辑图,其中主次路阶段分别为阶段1和2。在主路绿灯运行期间,主路未超出最小绿灯时间,则继续运行主路绿灯;主路大于等于最大绿灯时间,则结束主路绿灯,由阶段1切换至阶段2;主路绿灯在最小与最大绿灯之间时,如果次路检测到有车在排队等待,则有阶段1切换至阶段2。在次路绿灯运行期间,当超出既定的绿灯时间时,由阶段2切换至阶段1。
其次,为增加网格编号,横向为S、纵向为Z,依次确定判断框、计算框、连线所等所处的网格位置。以T_wait or Veh_wait为例,其编号为S02Z002。
然后,在xxx.vap文件中,将控制流程图转换为编程语言。注意缩进、每一个语句前的行编号,在重复调用某一行的程序时,可使用“GOTO S...Z...”语句实现;每一个IF都对应一个THEN和END;程序结束处注意加上结尾语句。
PROG_ENDE: .
/*----------------------------------------------------------------------------*/
最终,完整版VAP文件如下:
PROGRAM main_branch; /* C:\Users\Administrator\Desktop\Main_branch\main_branch.vap */
VAP_FREQUENCY 1;
CONST
m_g = 30,
m_g_min = 20,
m_g_max = 60,
b_g_min = 10,
b_g_max = 20,
w_max = 40;
/* ARRAYS */
/* SUBROUTINES */
/* PARAMETERS DEPENDENT ON SCJ-PROGRAM */
/* EXPRESSIONS */
T_wait := (OccT(21) >= w_max) or (OccT(23) >= w_max);
Veh_wait := (StgT(1) >= m_g) and (Det(21) or Det(23));
Veh_arrive := (Det(22) or Det(24));
/* MAIN PROGRAM */
S00Z001: IF StgA( 1 ) THEN
S01Z001: IF StgT( 1 ) >= m_g_min THEN
S02Z001: IF StgT( 1 ) >= m_g_max THEN
S03Z002: Interstage( 1 , 2 )
ELSE
S02Z002: IF T_wait or Veh_wait THEN
GOTO S03Z002
END
END
END
END;
S00Z004: IF StgA( 2 ) THEN
S01Z004: IF StgT( 2 ) >= b_g_min THEN
S02Z004: IF StgT( 2 ) >= b_g_max THEN
S03Z005: Interstage( 2 , 1 )
ELSE
S02Z005: IF Veh_arrive THEN
GOTO S03Z005
END
END
END
END
PROG_ENDE: .
/*----------------------------------------------------------------------------*/