📄 searchsch.lst
字号:
185 {
186 1 uchar i,j,k;
187 1 uint xdata toto;
188 1 uint xdata phasek;
189 1
190 1 uint xdata addr_exange;
191 1 uint xdata addr_sch;
192 1
193 1 uchar h,m,sh,num,w,s,sum;
194 1 uchar idd,tmod;
195 1 uint t[16];
196 1
197 1 unsigned long xdata now_colock,time_d;
198 1 for(i=0;i<16;i++)t[i]=5;
199 1 EA=0;
200 1 per_count++;
201 1 if(per_count>100)per_count=100;
202 1 now_day_planid = search_day_plan(); //查找日计划表号
203 1 if(now_day_planid==0)
204 1 {
205 2 now_day_planid=1;
206 2 }
207 1 else if(now_day_planid<=32)
208 1 {
209 2 now_schemeid = search_scheme(); //查找方案号
210 2 // if(loop_error_flag==1)now_schemeid=32; //如果当前相位全部检测器都出现故障,降级为
-方案32
211 2 baseaddr_now_schemesch = 0x5E83+41*(now_schemeid-1);
212 2 now_step_schid = XBYTE[baseaddr_now_schemesch]; //当前阶段表号
213 2 step_num = XBYTE[0x5243+(now_step_schid-1)*98];
214 2 XBYTE[baseaddr_now_schemesch+1]=step_num; //当前阶段数
215 2
216 2 baseaddr_now_stepsch = 0x5243+98*(now_step_schid-1);
217 2 now_phase_schid = XBYTE[baseaddr_now_stepsch+3]; //当前相位表号
218 2 if(now_phase_schid==0)
219 2 {
220 3 baseaddr_now_phasesch = 0x5001;
221 3 }
222 2 else if(now_phase_schid==1)
223 2 {
224 3 baseaddr_now_phasesch = 0x5122;
225 3 }
226 2
227 2 for(i=0; i<step_num; i++){sensor_step[i] = 0;} //lq //感应阶段标志置成0先
228 2
229 2 for(i=0; i<step_num; i++)
230 2 {
231 3 k = 3*i;
232 3 addr_temp=baseaddr_now_stepsch+k;
233 3 inuse_phase_temp = XBYTE[addr_temp+1]; //baseaddr_now_stepsch:阶段表基址
234 3 inuse_phase_temp = inuse_phase_temp<<8;
235 3 inuse_phase[i] = (inuse_phase_temp|XBYTE[addr_temp+2]); //阶段用到的相位
236 3
237 3 if(i<step_num-1)
238 3 {
239 4 inuse_phase_temp = XBYTE[baseaddr_now_stepsch+4+k];
240 4 inuse_phase_temp = inuse_phase_temp<<8;
C51 COMPILER V6.02 SEARCHSCH 09/28/2006 21:46:50 PAGE 5
241 4 inuse_phasen[i] = inuse_phase_temp|XBYTE[baseaddr_now_stepsch+5+k]; //下个阶段用到的相位
242 4 inuse_phasen[i] = inuse_phasen[i]&inuse_phase[i]; //当前和下个阶段都用到的相位
243 4 inuse_phasen1[i] = ~inuse_phasen[i];
244 4 inuse_phase1[i] = inuse_phase[i]&inuse_phasen1[i]; //去掉下个阶段用到的相位
245 4 }
246 3 else //最后阶段的下一个阶段为第一个阶段
247 3 {
248 4 //inuse_phasen[i] = 0;
249 4 //inuse_phase1[i] = inuse_phase[i];
250 4
251 4 inuse_phase_temp = XBYTE[baseaddr_now_stepsch+1];
252 4 inuse_phase_temp = inuse_phase_temp<<8;
253 4 inuse_phasen[i] = inuse_phase_temp|XBYTE[baseaddr_now_stepsch+2]; //下个阶段用到的相位
254 4 inuse_phasen[i] = inuse_phasen[i]&inuse_phase[i]; //当前和下个阶段都用到的相位
255 4 inuse_phasen1[i] = ~inuse_phasen[i];
256 4 inuse_phase1[i] = inuse_phase[i]&inuse_phasen1[i]; //去掉下个阶段用到的相位
257 4 }
258 3
259 3 for(j=0; j<16; j++)
260 3 {
261 4 phasek = 18*j;
262 4 toto = 0x0001;
263 4 toto = toto<<j;
264 4 inuse_phase_temp = toto&inuse_phase1[i];
265 4 // inuse_phase_temp = toto&inuse_phase1[j];
266 4 if(inuse_phase_temp!=0)
267 4 { //////////////////////////////////////////////////////////////////////////
268 5 if(XBYTE[baseaddr_now_phasesch+11+phasek]!=0)
269 5 sensor_step[i] = 1;// && ((XBYTE[baseaddr_now_phasesch+2+phasek]&0x
-04)!=0x04)) //感应间隔不为0,即为感应相位
270 5 // sensor_step[j] = 1;
271 5 }
272 4
273 4 }
274 3 }
275 2 if(start_counter>10){
276 3 step_counter = 0;
277 3 now_step_key = 0;
278 3 sensor_virgin_flag = 1;
279 3 now_phase_status = 0;
280 3 }
281 2 if(XBYTE[0X8021]==0X00){
282 3 step_counter = 0;
283 3 now_step_key = 0;
284 3 sensor_virgin_flag = 1;
285 3 now_phase_status = 0;
286 3 }else{ //////////////////////////////////////////相位差处理
287 3 if(start_counter<10){
288 4 for(i=0;i<24;i++){
289 5 period_start[i]=0x00000000;
290 5 sssch[24]=0;
291 5 }
292 4 addr_temp = 0x63a4+74*(now_day_planid-1); //当前日计划表基地址
293 4 period_start[0]=0X00;//240*60; //协调的标准时间是0点
294 4 for(i=0;i<timeid;i++){ //各时段开始时间 以秒为单位记
295 5 addr_exange=(addr_temp+i*3);
296 5 h=XBYTE[addr_exange];
297 5 m=XBYTE[addr_exange+1];
298 5 if(h*60+m>1092)period_start[i+1]=64800+((h-18)*3600+m*60);
299 5 else period_start[i+1]=(h*3600+m*60);//((h*60+m)*60); //各时段开始时间 以秒
-为单位记
300 5 sh=XBYTE[addr_exange+2]; //时段对应的方案号
C51 COMPILER V6.02 SEARCHSCH 09/28/2006 21:46:50 PAGE 6
301 5 sssch[i]=sh;
302 5 addr_sch=0x5e82+41*(sh-1); //方案的基地址
303 5 num=XBYTE[addr_sch+2];
304 5 t_sch[i]=0; //本方案的阶段数
305 5 for(w=0;w<num;w++){
306 6 t_sch[i]=t_sch[i]+XBYTE[addr_sch+w+9]; //计算每时段对应方案的周期
307 6 }
308 5 }
309 4
310 4 for(i=timeid;i>0;i--){
311 5 t_sch[i]=t_sch[i-1]; //循环向后移1位
312 5 sssch[i]=sssch[i-1];
313 5 }
314 4 t_sch[0]=t_sch[timeid]; //最后的移到最前
315 4 sssch[0]=sssch[timeid];
316 4 for(i=0;i<timeid;i++){
317 5 dlt[i]=(period_start[i+1]-period_start[i])%t_sch[i];//时段总秒数对周期取余数
318 5 period_start[i+1]=period_start[i+1]+dlt[i]; //时段真正的开始时间
319 5 }
320 4
321 4 h=XBYTE[0Xc004];
322 4 m=XBYTE[0XC002];
323 4 s=XBYTE[0XC000];
324 4 s=s+XBYTE[0X8021]; //
325 4 if(h*60+m>1092){
326 5 now_colock=64800+((h-18)*3600+m*60)+s;
327 5 }else now_colock=h*3600+m*60+s;
328 4 i=0;
329 4 do{
330 5 i++;
331 5
332 5 }while((now_colock>=period_start[i])&&(period_start[i]!=0x00));
333 4 idd=i-1; //判断当前时段 相位差已经起作用
334 4 time_d= now_colock-period_start[idd]; //当前时间与本阶段开始时间的时间差
335 4 tmod=time_d%t_sch[idd]; //周期的余数
336 4 addr_sch=0x5e82+41*(sssch[idd]-1); //本阶段方案基本地址
337 4 num=XBYTE[addr_sch+2]; //阶段数
338 4 i=0;sum=0;
339 4 do{
340 5 i++;
341 5
342 5 sum=sum+XBYTE[addr_sch+i+8];
343 5 }while(tmod>=sum);
344 4 step_counter=i-1; //当前所应处的阶段
345 4 step_time=XBYTE[addr_sch+i+8];
346 4
347 4 if(i==0x01)now_step_key=tmod;
348 4 else now_step_key=(tmod+XBYTE[addr_sch+i+8]-sum);
349 4 now_phase_status = 0;
350 4 EA=1;
351 4 }
352 3 }
353 2
354 2
355 2 use_phase = 0; //整个阶段用到的相位
356 2 for(i=0; i<step_num; i++)
357 2 {
358 3 // toto = 0x0001;
359 3 toto = (0x0001<<i);
360 3 use_phase = (use_phase|inuse_phase[i]); //整个阶段用到的相位
361 3 }
362 2 use_lamp = 0; //整个阶段用到的灯组
C51 COMPILER V6.02 SEARCHSCH 09/28/2006 21:46:50 PAGE 7
363 2 addr_temp=baseaddr_now_phasesch;
364 2 lai_temp=0;
365 2
366 2 /*
367 2 for(i=0;i<16;i++){
368 2 addr_temp=18*i;
369 2 addr_temp=addr_temp+baseaddr_now_phasesch;
370 2 g=XBYTE[addr_temp];
371 2 l=XBYTE[addr_temp+1];
372 2 toto = (0x0001<<i);
373 2 if((toto&use_phase)!=0)t[i]=((g<<8)|l);
374 2 } */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -