📄 second.c
字号:
}else{
if(re_keep_force==1){//原阶段绿闪,黄灯清空时间后第一秒
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
}else{
if(step_counter!=force_number-1){
now_uncount--; //新的强制输入后,原阶段剩余时间继续减少
}else{
if(force_exe_flag==1){
now_uncount =max_green_flash+max_red_clear+max_yellow+1;
force_exe_flag=0;
}
}
}
}
}else{ //无强制状态下
if(re_control!=1){ //正常自动运行状态下非感应控制倒计时计算和赶感应控制倒计时计算
//非感应控制
if(/*sensor_step[step_counter]*/asc_flag==0)now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
//感应控制
if(/*sensor_step[step_counter]*/asc_flag==1){
if(per_count>2){
if(go>1){
// now_uncount=step_time-now_step_key;
now_uncount=sch_step[step_counter]-now_step_key; //降级使用
auto_down=1;
}else {
now_uncount=step_time-now_step_key;
}
}
else {
now_uncount=step_time-now_step_key;
}
}
if((alt_change==0x01)&&(machine_flag==0x01)){ //新阶段第一秒并且信号机做主机使用
alt_change=0;
deal_zone(); //发送点:阶段开始的第一秒发送个从机需要是数据
}
}
if((re_control!=1)&&(exit_remote==1)){
now_uncount=max_green_flash+max_red_clear+max_yellow+1-now_step_key;
}
//now_uncount=XBYTE[baseaddr_now_schemesch+8+step_counter]-now_step_key;
// if((re_control!=1)&&(last_force_flag==0))now_uncount=max_green_flash+max_red_clear+max_yellow+1;
if((force_flag==0)&&last_force_flag==1){//遥控状态返回自动
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
now_step_key=0;
}
}
// }
if((re_control!=1)&&(last_re_control==1)){
now_uncount=max_green_flash+max_red_clear+max_yellow+1;
exit_remote=1;
}
last_force_flag=force_flag;
last_re_control=re_control;
//强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制强制
////////////////////////////////////////////////////////////////////////////////////////
if(/*sensor_step[step_counter]*/asc_flag==0) //阶段为固定配时
{
for(i=0; i<16; i++) //此循环用于查找当前阶段用到的相位
{
toto = 0x0001;
toto = toto<<i;
now_phase_temp = toto&inuse_phase[step_counter];
if(re_control==1&&step_counter!=reph_number-1)//遥控响应尚未开始执行
now_phase_tempn = toto&inuse_phasen[reph_number-1];
else if(force_flag==1&&step_counter!=force_number-1)//遥控响应尚未开始执行
now_phase_tempn = toto&inuse_phasen[force_number-1];
else
now_phase_tempn = toto&inuse_phasen[step_counter];
if(now_phase_temp!=0)
{
now_lamp_temp = XBYTE[baseaddr_now_phasesch+18*i];
now_lamp_temp = now_lamp_temp<<8;
now_lamp = now_lamp_temp|XBYTE[baseaddr_now_phasesch+18*i+1];
if(now_uncount>red_yellow_green_clear[i]) //当前倒计时处于绿灯时间范围内
// step_uncount[4][16]:当前阶段的剩余时间累计,全红时间,黄灯时间,绿闪时间,绿灯时间
{
clear_flag=0; //不处于清空时间
clear_force=0;
now_phase_status = now_phase_status|now_phase_temp;
now_step_uncount = now_uncount-red_yellow_clear[i]; //非行人相位 不是行人相位
//当前绿灯的倒计时
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=1; /*当前阶段用的灯组置成绿色*/
}
}
}
else if(now_uncount>=red_yellow_clear[i]) /*当前阶段处于绿闪*/
{
clear_flag=1;
clear_force=1;
now_step_uncount = now_uncount-red_yellow_clear[i];
for(j=0; j<16; j++)
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=2; /*当前阶段用的灯组置成绿闪*/
if(now_phase_tempn!=0)
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
else if(now_uncount<red_yellow_clear[i]&&now_uncount>=red_clear[i])
{
clear_flag=1;
clear_force=1;
if(now_phase_tempn==0)
now_phase_status = now_phase_status&(~now_phase_temp);
now_step_uncount = now_uncount-red_clear[i];
//now_uncount:当前阶段的倒计时 now_step_uncount:当前绿灯的倒计时
for(j=0; j<16; j++)
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
// if(now_uncount>red_clear[i])
{
lamp_state[j]=3; /*当前阶段用的灯组置成黄色*/
if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)==0x04)
lamp_state[j]=4; /*灯组是行人灯组,在黄灯期间置红色*/
}
if(now_phase_tempn!=0)
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
else if(now_uncount<red_clear[i]) //当前倒计时处于全红时间范围内
{
clear_flag=1;
clear_force=1;
if(now_phase_tempn==0)
now_phase_status = now_phase_status&(~now_phase_temp);
now_step_uncount = now_uncount; //当前阶段的倒计时
for(j=0; j<16; j++)
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=4; /*当前阶段用的灯组置成绿闪*/
if(now_phase_tempn!=0)
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
//感应阶段,感应阶段 感应阶段,感应阶段感应阶段,感应阶段感应阶段,感应阶段感应阶段,感应阶段
/////////////////////////////////////////////////////////////////////////////////////////////
else if(/*sensor_step[step_counter]*/asc_flag==1) //阶段为感应配时
{
for(i=0; i<16; i++) //此循环用于查找当前阶段用到的相位
{
toto = 0x0001;
toto = toto<<i;
now_phase_temp = toto&inuse_phase[step_counter]; //当前阶段是否包含该相位
now_phase_tempn = toto&inuse_phasen[step_counter];
if(now_phase_temp!=0) //
{
now_lamp_temp = XBYTE[baseaddr_now_phasesch+18*i];
now_lamp_temp = now_lamp_temp<<8;
now_lamp = now_lamp_temp|XBYTE[baseaddr_now_phasesch+18*i+1];
// if(now_uncount>red_yellow_green_clear[i]) //当前倒计时处于绿灯时间范围内
if(now_uncount>max_green_flash+max_yellow+max_red_clear) //当前倒计时处于绿灯时间范围内
{
clear_flag=0; //不处于清空时间
clear_force=0;
//绿灯倒计时=阶段倒计时-全红时间-黄灯时间
now_phase_status = now_phase_status|now_phase_temp;
//行人相位倒计时采用当前以红清空时间为基准
if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)!=0x04){
now_step_uncount = now_uncount-red_yellow_clear[i];
}
//当前阶段倒计时
if(now_step_key<(step_time-sensor_distance-max_red_clear-max_yellow))sensor_car_flag = 0;
//当前阶段倒计时处于绿时可延长范围
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
//感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制感应控制
if(now_step_key<(step_time-max_green_flash-max_red_clear-max_yellow)&&now_step_key>=(step_time-max_green_flash-max_red_clear-max_yellow-sensor_distance))
{
sensor_car_flag=1;
//无遥控和强制状况下
if((carnumber!=lastcarnumber)&&(re_control==0)&&(force_flag!=1)&&(max_end_flag!=0x02))
{
difer=0;
diff=now_step_key-(step_time-max_green_flash-max_red_clear-max_yellow-sensor_distance);
lastcarnumber = 0;
carnumber=0;
if(max_end_flag==0x00)add_greentime =now_step_key+sensor_distance; //增加后的绿时长度
if((add_greentime>=max_greentime)&&( max_end_flag==0))max_end_flag++;
if((add_greentime>=max_greentime)&&(max_end_flag==0x01))
{
max_end_flag++;
ensensor_flag = 0;
sensor_car_flag = 0;
if(add_greentime>=max_greentime)difer=0;
// else{
// difer=sensor_distance-(add_greentime-max_greentime);
// step_time=step_time+difer;
// }
add_greentime = max_greentime;
step_time=step_time+difer;
}
if(max_end_flag==0x00){
step_time=step_time+diff;//sensor_distance;
}
// step_time =step_time+difer;// add_greentime+XBYTE[baseaddr_now_phasesch+18*i+15]+XBYTE[baseaddr_now_phasesch+18*i+16]+XBYTE[baseaddr_now_phasesch+18*i+17];
// sensor_counter = 1;
if(machine_flag==0x01){
deal_zone();//此处处理小区域控制问题 主机使用
}
}
}
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
lamp_state[j]=1; /*当前阶段用的灯组置成绿色*/
}
}
} //当前倒计时处于绿闪时间范围内
// else if(now_uncount>=red_yellow_clear[i]&&now_uncount<=red_yellow_green_clear[i])
else if(now_uncount>=(max_red_clear+max_yellow)&&now_uncount<=(max_green_flash+max_red_clear+max_yellow))
{ clear_flag=1;
clear_force=1;
now_step_uncount = now_uncount-red_yellow_clear[i]; //当前阶段的倒计时
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
if(now_phase_tempn==0)
{
ensensor_flag = 0;
sensor_car_flag = 0;
step_time = now_step_key+now_uncount;
lamp_state[j]=2; /*当前阶段用的灯组置成绿闪*/
}
else
{
lamp_state[j]=1; /*下一阶段用的灯组仍置成绿色*/
}
}
}
}
// else if(now_uncount>=red_clear[i]) //当前倒计时处于黄灯时间范围内
// else if(now_uncount<red_yellow_clear[i]&&now_uncount>=red_clear[i]) //当前倒计时处于黄灯时间范围内
else if(now_uncount<(max_red_clear+max_yellow)&&now_uncount>=max_red_clear) //当前倒计时处于黄灯时间范围内
{ clear_flag=1;
clear_force=1;
if(now_phase_tempn==0)
now_phase_status = now_phase_status&(~now_phase_temp);
now_step_uncount = now_uncount-red_clear[i]; //当前阶段的倒计时
for(j=0; j<16; j++) //此循环用于查找当前相位用到的灯组
{
toto1 = 0x0001;
toto1 = toto1<<j;
inuse_lamp_temp = toto1&now_lamp;
if(inuse_lamp_temp!=0)
{
// if(now_uncount>red_clear[i])
{
lamp_state[j]=3; /*当前阶段用的灯组置成黄色*/
if((XBYTE[baseaddr_now_phasesch+18*i+2]&0x04)==0x04)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -