| (1)Cinteger 整数类 |
| Data: int data // |
| Method: CInteger() ~CInteger(); |
| 说明:封装一个整数 |
| (2)CBinarySequence 二进制序列类 |
| Data: m_sequence // 个元素为整型的链表,存放检测器十个0.1秒的有无车状态 |
| Method: CBinarySequence(); ~CBinarySequence() |
| 说明:将按位存贮的deton转化为链表,易于统计占用时间 |
| (3)Cplan 控制方案类 |
| Data: m_Cyclelength //周期 m_GreenPercent[4] //绿信比,存百分数 m_Offset //相位差 m_GreenTime[5] //各相位绿时 m_type //方案类型,0-绿信比,1-各相位绿时 m_Amb_Red //总红时+总黄时 |
| Method: Cplan(); ~Cplan(); |
| 说明: 红时,黄时由初始的定时方案一次设定,以后不能改变 |
| (4)CDetector 检测器类 |
| Data: m_id //检测器ID m_length //检测器长度 m_type // 0-presence(存在型 ) ,1- passage( 脉冲型) m_Link //所属链路指针 m_distanceFromDownstreamNode //距下游节点距离 m_Lane //所属车道指针 m_CorsimId //所属CORSIM的ID m_count; //从仿真开始的车俩计数 m_activationTime //一秒钟的车辆占用时间统计 m_deactivationTime //一秒钟的空闲时间统计 m_precount //前次读检测器时的车俩计数 m_GreenSpaceTime //本周期的绿时空闲时间 m_GreenOcctime //本周期的绿时占用时间 m_culspeed //本周期的速度累加值 m_cultime //累加速度的时间(次数) m_state //检测器状态,1-有车,0-无车 |
| Method: CDetector() ~CDetector() |
| 说明: |
| (6)CLane 车道类 |
| Data: m_id //车道编号,面向节点,由右至左为1~7 m_type //车道类型(bay or full) m_Link //所属链路 m_length //车道长度 m_leftMovementPercent //车辆左转率 m_thruMovementPercent //车辆直行率 m_rightMovementPercent //车辆右转率 m_DetectorList //车道上的检测器链表 m_StopBarDetectorList //停止线上的检测器链表,用于感应控制 |
| Method: CLane() ~CLane() |
| 说明: |
| (5)CSignalState 信号装态类 |
| Data: signalCode // 从36型记录读到的信号编码 m_actualCode // 用于设置SDCODE,AMBSPC的实际码 SDCODE AMBSPC m_Link //所属链路 |
| Method: CSignalState() ~CSignalState() SetSDCODE( void ) //调用GetSDCODE()设置SDC码(TSIS中的交通权编码) GetSDCODE( int actualCode ) //由actualCode得到SDC码 SetAMBSPC( void ) //设置AMBSPC码(TSIS中的红黄编码,避免绿冲突) GetAMBSPC1( int nextActualCode )//由当前实际码,几下一个实际码,决定AMBSPC码 GetAMBSPC3( int nextActualCode ) GetAMBSPC4( int nextActualCode ); GetAMBSPC5( int nextActualCode ); GetAMBSPC6( int nextActualCode ); GetAMBSPC7( int nextActualCode ); GetAMBSPC8( int nextActualCode ); GetAMBSPC9( int nextActualCode ); |
| 说明: |
| (10)Globals 接口 |
| Data: GiEndOfInit//从仿真达到稳态后开始计时 GiPrevInit//上次调用JMAIN()的时间 GiPrevTime//1-仿真尚未到达稳态,0-仿真已到达稳态 stime=0 //定时方案的周期 ttime=1000//网络到达稳态的时间 F=0//保证ttime的正确性 pNetwork//网络对象 |
| Method: INIT() //设置由RTE仿真时,仿真开始调用它创建仿真的网络对象 JMAIN() //设置由RTE仿真时,每一时间步序(1s)调用它更新控制信号 JEXIT() // 销毁仿真对象,释放资源,宣告仿真结束 |
| 说明: |
| (8)CNode节点类 |
| Data: m_id;// 节点ID m_CORSIMInternalID//所属CORSIM的ID m_xPos // 节点坐标 m_yPos m_Link1;// 节点的链路,从西方向开始逆时针排序 m_Link2; m_Link3; m_Link4; m_Link5; m_typeOfControl;// 控制类型,"external"-由外部RTE控制 m_duration[12]; // 四个相位,12个信号状态的持续时间 m_GreenOercent[3][5][3] //三个周期,五条链路,三条车道的绿时占有率 m_Flow[3][5][3] //三个周期,五条链路,三条车道的流量 int m_Speed[3][5][3] //三个周期,五条链路,三条车道的车速 m_Cplan//节点的实时控制方案 m_detphase[5][3]//存贮节点中5条链路3个车道有通行权的相编号。 pre_maxoercent[4];//前次各相最大绿时利用率 |
| Method: CNode() ~CNode() SetSDCCode( void )//设置节点个链路的sdc码 SetSignalState( void ) //设置节点个链路的信号状态 CreatePlan()//创建实时控制方案 PutPlan()//将方案放入duration以便创建信号状态链表 ReadDetectors()//读检测器数据(流量,占有率) WriteData()//将数据写入文件 DataProcess_evalue()//对读取的数据进行处理和预测 |
| 说明: |
| (7)CLink 链路类 |
| Data: m_id //链路ID m_CorsimId //所属CORSIM的ID m_upnode //上游节点 m_dnnode //下游节点 m_thrunode //直行节点 m_leftnode //左转节点 m_rightnode //右转节点 m_listOfLanes //所含车道链表 m_listOfDetectors //所含检测器链表 m_signalStates //信号状态链表 m_length //路长 m_numOfFullLanes;//full型车道数 m_numOfLeftTurnBays;//左传bay车道数 m_numOfRightTurnBays;//右转bay数 m_lengthOfLeftBay;//左传bay长度 m_lengthOfRightBay;//右转bay长度 m_freeFlowSpeed; //车流自由速度 m_travelTime; //旅行时间 m_leftMovementPercent;//左转率 m_thruMovementPercent;//直行率 m_rightMovementPercent;//右转率 m_channelCode[7];//??? m_NumOfDetectors;//检测器数目 m_code[12] //该链路的信号状态编码 m_sdcode//该链路的当前信号状态sdc编码 m_offset;//相位差 m_pos //在链表中的位置 m_opposingLink;//反向链路 m_opposingID //冲突链路ID |
| Method: CLink() ~CLink() ConvertToBinary( int nValue )//二进制数转换成二进制链表 FindLane( int corsimId ) //据ID号找车道 ComputeTravelTime( void ) //计算旅行时间 ProcessDetectors( void ) //每秒处理检测器 ReadDetectors(int speed[3],int flow[3],float oercent[3]) //周期末读检测器 CreateSignalStates( void ) //创建信号装态链表 SetSDCCode( void ) //设置链路SDC码 AdjustSignalState( void ) //调整链路SDC码 |
| 说明: |
| (9)CNetwork 交通网类 |
| Data: m_LinkList //链路链表 m_NodeList//节点链表 cyclelength[11] //记录各节点周期 m_NetworkName//交通网名 m_TrafInputFile//交通文件名 |
| Method: CNetwork() CNetwork( const CString& strInputFileName ~CNetwork() GetTrafInputName( void ) const { return m_TrafInputFile;}//获取输入文件名 SetTrafInputName( const CString& strName ) { m_TrafInputFile = strName; }//设置输入文件名 ReadTrafFile( void )//读输入文件 ReadTRFLine( FILE* pFile, char* pszLine )//读取固定行 GetNodes( FILE* pFile )//创建节点 GetLinks( FILE* pFile)//创建链路 CreateL anes( FILE* pFile )//创建车道 GetDetectors( FILE* pFile )//创建检测器 ReadCard35( FILE* pFile )//读35型记录,读取节点信号状态持续时间 ReadCard36( FILE* pFile )// /读35型记录,读取节点信号编码 FindNode( int id )//由id找节点 FindLink( int up, int dn )//由上下游节点找链路 GetLinkCorsimId( int upnode, int dnnode ) //由上下游节点找链路点 GetDetectorCorsimId( CDetector* pDetector )//确定检测id CreatePlan()//由检测数据,优化生成控制方案 CreateSignalStates( void )//创建信号状态 UpdateNodeSignalStates( void )//每秒更新全号状态 ProcessDectors()//处理检测器 |
| 说明: |
N
Y
1.INIT
1.1信号状态链表的生成过程
2.JMAIN
N
Y
2.1处理检测器
2.2优化控制方案
3.仿真过程的时间线索主要事件
初始化时读取定时方案存于各节点的Cplan中并记录公共周期(用于
判断是否到达周期末) 一到稳态,马上执行pNetwork->CreatePlan(),此时该函数仅仅起到复位检测器的作用(因为UserMethod()前两次不会修改Cplan)
第二个周期末执行pNetwork->CreatePlan() *而pNetwork->CreatePlan()遍历调用各节点的CreatePlan() 节点的CreatePlan()读取并保存数据后调用UserMethod()进行节点方案优化,将结果存于节点的Cplan后,返回pNetwork->CreatePlan() 后 pNetwork->CreatePlan()获取各节点的周期并选择一最大周期作为公共周期 然后在逐节点调用节点的PutCplan ()设置节点的duration[],并设置公共周期 返回JMAIN()重新创建信号状态 直到下一个周期末从*处重复工作。
四 实时算法流程
1.算法一
五 使用说明
1.该RTE用于交通网线控的实时方案仿真,目前节点最多只能有四个相位,暂无green diagonal通行权,一条路不能同时拥有直左右通行权或直右通行权 且车道通行权跨相时,车道归于第二相;只能有四条路,链路编号左1,下2,右3,上4; 每条路最多只能有三各车道,车道编号由外为:1(右转),2(直行),3(左转)。
2. SIS中的trf文件配置:
A.在*.tno对应的Network中,设置干线上的节点为定时控制方案,并在其属性对话框,设置具体方案。
B.生成的trf文件中,将要进行实时控制的节点对应的36型记录的77列设为2。
C.运行tool->simulation下的RTE(summer)。
3.仿真结果看*.out文件,为方便在TSHELL中给出了几个重要参数:
看CUMULATIVE NETSIM STATISTICS AT TIME栏目下,最后一行“0SUBNETWORK=”,对应一些重要参数解释如下:
4.加控制算法:
A.在节点类的UserMethod()中加算法;
B.检测数据(保存有最近三个周期的数据,下标0~2),通过数组引用。
例:m_GreenOercent[2][4][3]为当前第四条链路上第三个车道的绿时占有率
m_Flow[2][4][3],m_Speed[2][4][3]分别表示流量和车速。
如果某条路通行时间跨越两相,该车道的绿时占有率为两相总的绿时占有率。
C.优化结果存贮于节点的Cplan对象中(参见Cplan类),方案的红时和黄时沿用定时方案的设置,以后不能改变。
一 基础知识
1. CORSIM结构
上图说明了在TSIS 5.1体系结构内对CORSIM的操作, 其中包括支持实时扩展的接口。图中,空心箭头代表控件接口,实心箭头代表标准动态链接库接口。该模型中CORSIM驱动控件是用于进行TSIS仿真的工具和提供用户操作的命令接口。该驱动控件使用户能够控制CORSIM的执行,输出过程以及管理用户提供的RTEs。
2.CORSIM接口函数格式
第一行使作为DLL的函数能通过Microsoft提供的_declspec(dllexport)扩展被导出。接着是函数定义,由于函数被导出,所以RTE库将包含其函数原型的一个定义。函数名将根据编译器类型及编译器用于创建动态库时的选项被作一定的修饰。_stdcall 便是一个修饰,其作用是确保函数能被导出为与WIN32 API 命名一致的形式。
3.访问CORSIM中的数据
为了能存取CORSIM中的数据结构,你必须将你的RTE DLL与CORSIM提供的corsim. Lib
库进行连接。该库包含CORSIM进行仿真的所有数据结构。参阅数据字典,将你要访问的数据导入到你的RTE DLL中,(参见summer的netsim.h文件),
例如导入检测器的detmod:
#define DLL_IMPORT extern "C" __declspec( dllimport )
DLL_IMPORT struct { int DTMOD[IMXDET]; } SIN314;
#define dtmod SIN314.DTMOD
DTMOD数组包含在通用数据块SIN314中。例子中,SIN314首先被作为一个具有DTMOD的数据元素的结构被导入,接着以别名dtmod定义了SIN314结构中的DTMOD元素。FORTRAN数组下标从1开始,而C下标从0开始,故下标为十访问了FORTRAN数组DTMOD数组的第11个元素。其中包括监测器类型,车速等数据,他们安位压缩存储。
4.调用CORWin 接口函数
TSIS提供一系列函数通过向CORSIM Driver软件发送Windows消息或向CORSIM Driver接口发送文本消息来存取CORSIM的其它数据结构。为访问这些函数,你必须连接由TSIS提供的RTE DLL和CORWin.Lib库。
例如以下导入CORWin.Lib的OutputString()函数,该函数可以在CORSIM的Tshell中打印消息(参见summer的corwin.h文件):
#define CORWINAPI __declspec(dllimport)
CORWINAPI void __stdcall OutputString(char* str, unsigned int size,
int msgCode,unsigned long color);
5.编译你的动态库时应设置环境变量包含corsim.lib和CORWin.lib库,或者直接将这两个库饱和在你的工程中。
6.在Tshell中配置TRE
a.Tools中选Toolconfiguration…弹出对话框;
b.单击Add按钮,弹出对话框;
c.path中填:CorsimDriver.dll的路径,
name中填你对RTE的命名,
category选Simulation,
associated extension填trf
Toolbar Button选你喜欢的图标作RTE的快捷按钮,下一步;
d.任选output tab及help file,下一步;
e.输入Corsim.dll的路径及名称,其他为默认,下一步;
f.据喜好选择提示信息颜色,下一步;
g.据用户要求选择随机数的生成等,可默认,下一步;
h.单击add弹出对话框,找到你的RTE动态库(例如F:\\Sample\\Debug\\interfac.dll),填入接口函数名,下一步;
i.单击完成,大功告成。