📄 optimize.lst
字号:
368 =1 void can_call_in(uchar a); //外呼
369 =1 can_receive_more(uchar a); //控制器
370 =1 can_receive_only(uchar a); //控制器
371 =1 clear_unknow_code(uchar a); //清乱码
372 =1 void can_call_assign(); //外呼分派
373 =1 can_call_lamp(); //暂定50ms循环点灯,灭灯
374 =1
375 =1
2
3 /*uchar GetNextStopLIdx(uchar cEIdx, uchar cStartFloorIdx, uchar bStartDirect, uchar *bDirect);*/
4 uint CalTimeToDest(uchar cEIdx, uchar cStartFloor, uchar cEndFloor);
5 uint GetEleToFloorTime(uchar cEIdx, uchar cLIdx, uchar updown_flg);
6 uchar IsExistInsel(uchar cEIdx);
7
8 void WashOut_DistributeInSel(uchar *pWashOutFlg);
9 void WashOut_2FloorMoveEle(uchar *pWashOutFlg);
10 void WashOut_NotStopEle(uchar *pWashOutFlg);
11 void WashOut_VetoEle(uchar *pWashOutFlg);
12 uchar WashOut_LongTimeEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg);
13 void WashOut_HeavyBearEle(uchar *pWashOutFlg);
14 void WashOut_NoSameDirectionEle(uchar *pWashOutFlg);
15 void WashOut_NoInSelStopEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg);
16 void WashOut_MoreStopCntEle(uchar *pWashOutFlg);
17 uchar WashOut_LargerIndexEle(uchar *pWashOutFlg);
18 void UpdateDistribution(uchar cLIdx, uchar updown_flg, uchar cBestEleNo);
19 void UpdateStaticStopDistribution(uchar cLIdx, uchar cBestEleNo);
20
21
22 //对所有群控电梯进行选优处理
23 //说明:只要不是所有电梯都被"一票否决",经过选优处理后,一定会选出一个最佳方案
24 void OptimizeArrange(uchar cLIdx, uchar updown_flg)
25 {
26 1 uchar m_cENum = m_pL_Data->cENum;
27 1 uchar cBestEIdx = INVALID_ELEINDEX; //最优的电梯索引(注:INVALID_ELEINDEX代表无效索引)
28 1 uchar bWashOutFlg[ENum_MAX]; //淘汰标记
29 1 uchar i=0;
30 1 uchar ret=0; //时间计算正确与否
31 1
32 1 //淘汰标记清零
33 1 for(i=0; i<ENum_MAX; i++){
34 2 bWashOutFlg[i] = 0;
35 2 }
36 1
37 1 //淘汰"2层以内运动中的电梯"
38 1 WashOut_2FloorMoveEle(bWashOutFlg);
39 1
40 1 // if(cLIdx==8){
41 1 // mE_InputData.mDianTi[0].TongXun.bZhiShi=m_InterData[0].b2FloorMove;
42 1 // }
43 1 //淘汰"该层不可停的电梯"
44 1 WashOut_NotStopEle(bWashOutFlg);
45 1
46 1 //淘汰"已被一票否决的电梯"
47 1 WashOut_VetoEle(bWashOutFlg);
48 1
49 1 //淘汰"到达该层所需时间较长的电梯"
50 1 ret = WashOut_LongTimeEle(cLIdx, updown_flg, bWashOutFlg);
51 1
52 1 //淘汰"承载较重的电梯"
53 1 WashOut_HeavyBearEle(bWashOutFlg);
54 1
55 1 //淘汰"非顺向的电梯"
C51 COMPILER V6.12 OPTIMIZE 06/05/2005 15:44:44 PAGE 15
56 1 WashOut_NoSameDirectionEle(bWashOutFlg);
57 1
58 1 //若合格的电梯中有一部内选恰好为外呼,且方向一致,淘汰其余电梯
59 1 WashOut_NoInSelStopEle(cLIdx, updown_flg, bWashOutFlg);
60 1
61 1 //淘汰"停靠层站数较多的电梯"
62 1 WashOut_MoreStopCntEle(bWashOutFlg);
63 1
64 1 //淘汰"电梯优先级号较大的电梯",得到最优电梯序号
65 1 cBestEIdx = WashOut_LargerIndexEle(bWashOutFlg);
66 1
67 1 //2004.07.21 LHM staticstop
68 1 if((cBestEIdx!=0xFF) && (ret==1)){ //最优电梯索引有效,时间计算有效
69 2 UpdateDistribution(cLIdx, updown_flg, cBestEIdx);
70 2 }else{
71 2 // P1_4=0;
72 2 }
73 1
74 1 }
75
76 void WashOut_DistributeInSel(uchar *pWashOutFlg)
77 {
78 1 uchar m_cENum = m_pL_Data->cENum;
79 1 uchar i=0;
80 1
81 1 for(i=0; i<m_cENum; i++){
82 2 //对于当前所讨论的外呼,该电梯是否已被分配了内选
83 2 if(pWashOutFlg[i]==0)
84 2 if(IsExistInsel(i)==1)
85 2 pWashOutFlg[i] = 1;
86 2 }
87 1 }
88
89 void WashOut_2FloorMoveEle(uchar *pWashOutFlg)
90 {
91 1 uchar m_cENum = m_pL_Data->cENum;
92 1 uchar i=0;
93 1
94 1 for(i=0; i<m_cENum; i++){
95 2 //对于当前所讨论的外呼,该电梯是否"处于两层以内,并且处于运动中"
96 2 if(pWashOutFlg[i]==0)
97 2 if(m_InterData[i].b2FloorMove==1)
98 2 pWashOutFlg[i] = 1;
99 2 }
100 1
101 1 }
102
103 void WashOut_NotStopEle(uchar *pWashOutFlg)
104 {
105 1 uchar m_cENum = m_pL_Data->cENum;
106 1 uchar i=0;
107 1
108 1 for(i=0; i<m_cENum; i++){
109 2 //对于当前所讨论的外呼,该电梯是否"在外呼层可停"
110 2 if(pWashOutFlg[i]==0)
111 2 if(m_InterData[i].bFloorCanStop==0)
112 2 pWashOutFlg[i] = 1;
113 2 }
114 1 }
115
116 void WashOut_VetoEle(uchar *pWashOutFlg)
117 {
C51 COMPILER V6.12 OPTIMIZE 06/05/2005 15:44:44 PAGE 16
118 1 uchar m_cENum = m_pL_Data->cENum;
119 1 uchar i=0;
120 1
121 1 for(i=0; i<m_cENum; i++){
122 2 //电梯是否"一票否决"
123 2 if(pWashOutFlg[i]==0)
124 2 if(m_InterData[i].bVeto==1)
125 2 pWashOutFlg[i] = 1;
126 2 }
127 1 }
128
129 // 返回0异常,返回1正常
130 uchar WashOut_LongTimeEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg)
131 {
132 1 uchar m_cENum = m_pL_Data->cENum;
133 1 uint time_min = 0xFFFF; //初始时,设置最短时间足够大
134 1 uchar i=0;
135 1 uchar j=0;
136 1 uint time=0;
137 1
138 1 for(i=0; i<m_cENum; i++){
139 2 if(pWashOutFlg[i] == 0){
140 3
141 3 //电梯到第cLIdx所用时间(若超时,追加超时时间)
142 3 // uint time = 0;
143 3 time = GetEleToFloorTime(i, cLIdx, updown_flg)/* + m_cOvertime[i]*/;
144 3 //Added by LHM 2004.07.19 计算异常时,不取本次的计算结果
145 3 if(time==0xFFFF){
146 4 return 0;
147 4 }
148 3 if(time<time_min){ //新短时间
149 4 if(((time_min-time)>TIMEINTERVAL_MIN)){//若比最短时间"短很多",更新最短时间,且确保淘汰前面的电梯;
150 5 time_min = time;
151 5 //确保淘汰前面的电梯
152 5 for(j=0; j<i; j++){
153 6 if(pWashOutFlg[j] == 0)
154 6 pWashOutFlg[j] = 1;
155 6 }
156 5 }
157 4 else{ //若比最短时间"短不太多",仅更新最短时间;
158 5 time_min = time;
159 5 }
160 4 }
161 3 else{ //较长时间
162 4 //若比最短时间"长太多",则淘汰;
163 4 if(( (time-time_min)> TIMEINTERVAL_MIN))
164 4 pWashOutFlg[i] = 1;
165 4 }
166 3 }
167 2 }
168 1
169 1 return 1;
170 1 }
171
172 void WashOut_HeavyBearEle(uchar *pWashOutFlg)
173 {
174 1 uchar m_cENum = m_pL_Data->cENum;
175 1 uchar bear_min = Weight_Heavy; //初始时,设置负载足够大
176 1 uchar i=0;
177 1 uchar j=0;
178 1
179 1 for(i=0; i<m_cENum; i++){
C51 COMPILER V6.12 OPTIMIZE 06/05/2005 15:44:44 PAGE 17
180 2 if(pWashOutFlg[i] == 0){
181 3 //取得电梯承载状态
182 3 uchar cBear = m_InterData[i].cWeight;
183 3 if(cBear<bear_min){ //出现新最小负载
184 4 //更新最小负载
185 4 bear_min = cBear;
186 4 //确保淘汰前面的电梯
187 4 for(j=0; j<i; j++){
188 5 if(pWashOutFlg[j] == 0)
189 5 pWashOutFlg[j] = 1;
190 5 }
191 4 }else if(cBear == bear_min){ //负载与前次相同
192 4 //do nothing
193 4 }else{ //出现更大负载或错误信号
194 4 //设置淘汰标记
195 4 pWashOutFlg[i] = 1;
196 4 }
197 3 }
198 2 }
199 1
200 1 }
201
202 void WashOut_NoSameDirectionEle(uchar *pWashOutFlg)
203 {
204 1 uchar m_cENum = m_pL_Data->cENum;
205 1 uchar i=0;
206 1
207 1 uchar cExistSameFlg = 0; //"尚未淘汰的电梯中,存在顺向电梯"的标记
208 1 for(i=0; i<m_cENum; i++){
209 2 if(pWashOutFlg[i]==0)
210 2 if(m_InterData[i].bSameDirection==1){
211 3 cExistSameFlg = 1;
212 3 break;
213 3 }
214 2 }
215 1
216 1 if(cExistSameFlg == 1){ //存在
217 2 for(i=0; i<m_cENum; i++){
218 3 if(pWashOutFlg[i]==0)
219 3 if(m_InterData[i].bSameDirection==0){ //淘汰非顺向的电梯
220 4 //设置淘汰标记
221 4 pWashOutFlg[i] = 1;
222 4 }
223 3 }
224 2 }else{ //不存在
225 2 //do nothing
226 2 }
227 1 }
228
229 //若尚未淘汰的电梯中有一部内选恰好为外呼,且方向一致,淘汰其余电梯
230 void WashOut_NoInSelStopEle(uchar cLIdx, uchar updown_flg, uchar *pWashOutFlg)
231 {
232 1 uchar m_cENum = m_pL_Data->cENum;
233 1 uchar i=0;
234 1 uchar bExist = 0; //"某梯在cLIdx层存在内选,尚未淘汰"标记
235 1 E_DianTi *pEleData = 0;
236 1 E_FangXiang *pFangXiang = 0;
237 1
238 1 for(i=0; i<m_cENum; i++){
239 2 pEleData = &(m_pE_InputData->mDianTi[i]);
240 2 pFangXiang = &(pEleData->FangXiang);
241 2 if(pWashOutFlg[i] == 0){ //尚未淘汰
C51 COMPILER V6.12 OPTIMIZE 06/05/2005 15:44:44 PAGE 18
242 3 // if((pEleData->bNeiXuan[cLIdx]==1)){ //存在内选
243 3 if((GetArrayData(pEleData->bNeiXuan, cLIdx)==1)){ //存在内选
244 4 if((updown_flg==1)&&(pFangXiang->bShang==1)&&(pFangXiang->bXia==0)) //方向一致(上)
245 4 bExist = 1;
246 4 else if((updown_flg==0)&&(pFangXiang->bShang==0)&&(pFangXiang->bXia==1))//方向一致(下)
247 4 bExist = 1;
248 4 }
249 3 }
250 2 }
251 1
252 1 if( bExist == 1){ //存在
253 2 for(i=0; i<m_cENum; i++){
254 3 pEleData = &(m_pE_InputData->mDianTi[i]);
255 3 pFangXiang = &(pEleData->FangXiang);
256 3 if(pWashOutFlg[i] == 0){
257 4 // if(pEleData->bNeiXuan[cLIdx] != 1){
258 4 if(GetArrayData(pEleData->bNeiXuan, cLIdx) != 1){
259 5 pWashOutFlg[i] = 1;
260 5 }else{
261 5 if((updown_flg==1)&&(pFangXiang->bShang==1)&&(pFangXiang->bXia==0)){ //方向一致(上)
262 6 pWashOutFlg[i] = 0;//do nothing
263 6 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -