📄 distribute.lst
字号:
358 =1 //param_save_restore.c
359 =1 void restore_user_param(void);
360 =1 void save_user_param(void);
361 =1 void restore_factory_param(void);
362 =1 uchar erase(uint addr);
363 =1 uchar writef(uint x,uchar y);
364 =1
365 =1 //can.c
366 =1 void can_init(uint pointa); //can初始化
367 =1 void can_reset(void);
C51 COMPILER V6.12 DISTRIBUTE 06/05/2005 15:44:44 PAGE 14
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 Is3FloorDistributed(uchar cLIdx, uchar updown_flg);
4 uchar IsLastOneDistribution(uchar cLIdx, uchar updown_flg);
5 uchar IsSomeoneNextStopFloor(uchar cLIdx, uchar updown_flg);
6 void SetNearNextStopFloorLIdx(uchar cEIdx); //LHM dyn_test temp动态测试专用变量(移植时删除)
7 void DistributeEle(void)
8 {
9 1 uchar m_cLNum = LNum_MAX;
10 1 uchar m_cENum = m_pL_Data->cENum;
11 1 uchar cCurFloorIdx=0;
12 1 uchar i=0,j=0;
13 1 uchar updown_flg; //1上 0下
14 1 uint out_id=0; //楼层数(其中5位有效)
15 1 uchar a=0;
16 1 uchar xdata *can_p;
17 1 uchar cSendLIdx=0;
18 1 uchar ret0=0;
19 1 uchar ret1=0;
20 1
21 1 E_WaiHu *pWaiHu = &(m_pE_InputData->mWaiHu);
22 1
23 1
24 1 //上呼分配(从下而上进行分配)
25 1 uchar cLIdx = m_CalUpLIdx; //(取值0-55)
26 1 uchar bVal; //外呼数值
27 1
28 1 //设置中间数据"楼层可停"
29 1 SetInterVal_FloorCanStop(cLIdx, 1);
30 1 //设置中间数据"2层以内运动"
31 1 SetInterVal_2FloorMove(cLIdx, 1);
32 1 //设置中间数据"顺向"
33 1 SetInterVal_SameDirection(cLIdx, 1);
34 1
35 1 if(GetArrayData(pWaiHu->bShang, cLIdx) == 1){ //若该层有上呼,进行电梯分配
36 2 updown_flg = D_Up; //设置上标记
37 2 bVal = 1;
38 2 //若有一部电梯恰好到达外呼层,顺向,零速信号为1或运行停止信号为0,则撤销外呼点灯
39 2 if(IsWithdrawOutLight(cLIdx,updown_flg)){
40 3
41 3 SetOutCallLight(cLIdx, updown_flg, 0);
42 3 //2004.11.17
43 3 //为避免撤灯时,发生闪烁,取消提前撤灯(需要进一步确认)
44 3 //为了及时外呼撤灯,提前发送撤灯数据
45 3 for(a=0; a<m_cENum; a++){
46 4 if(e_online[a]==1){
47 5 //2004.11.24 LHM
48 5 // cSendLIdx=cLIdx-LNum_MAX_UNDERGROUND+1;
49 5 cSendLIdx=cLIdx-mE_InputData.mDianTi[a].cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
50 5 out_id=cSendLIdx; //计算外呼标志符
51 5 out_id=out_id<<5;
52 5 out_id=out_id|0x4800;
53 5 can_p=canx_cs[a];
54 5 //can是否在线
55 5 if((*(can_p+2)&0x4)==0x4){ // 发送缓冲区空
C51 COMPILER V6.12 DISTRIBUTE 06/05/2005 15:44:44 PAGE 15
56 6 *(can_p+16)=0x02;
57 6 *(can_p+17)=out_id>>8;
58 6 *(can_p+18)=out_id&0xff;
59 6 *(can_p+19)=0x5a; //命令3
60 6 *(can_p+20)=0xa0; //外呼灯
61 6 *(can_p+1)=0x1; //发送请求
62 6 }
63 5 }
64 4 }
65 3 }
66 2 //进行外呼分配
67 2 // if(cLIdx==9)
68 2 // mE_InputData.mDianTi[0].TongXun.bZhiShi=IsLastOneDistribution(cLIdx, updown_flg);
69 2 ret0 = IsSomeoneNextStopFloor(cLIdx, updown_flg);
70 2 ret1 = IsLastOneDistribution(cLIdx, updown_flg);
71 2 if( /*(!Is3FloorDistributed(cLIdx, updown_flg)) && */(ret0==0) && (ret1==0) )
72 2 OptimizeArrange(cLIdx, updown_flg);
73 2
74 2 }else{
75 2 updown_flg = D_Up; //设置上标记
76 2 bVal = 0;
77 2 //确保取消外呼点灯
78 2 SetOutCallLight(cLIdx, updown_flg, bVal);
79 2 //确保取消外呼分配
80 2 SetOutCallDistribution(cLIdx, updown_flg, bVal);
81 2 }
82 1
83 1 cLIdx = m_CalDownLIdx;
84 1 //设置中间数据"楼层可停"
85 1 SetInterVal_FloorCanStop(cLIdx, 0);
86 1 //设置中间数据"2层以内运动"
87 1 SetInterVal_2FloorMove(cLIdx, 0);
88 1 //设置中间数据"顺向"
89 1 SetInterVal_SameDirection(cLIdx, 0);
90 1
91 1 if(GetArrayData(pWaiHu->bXia, cLIdx) == 1){//若该层有下呼,进行电梯分配
92 2 updown_flg = D_Down; //设置下标记
93 2 bVal = 1;
94 2 if(IsWithdrawOutLight(cLIdx,updown_flg)){
95 3 SetOutCallLight(cLIdx, updown_flg, 0);
96 3 //2004.11.17
97 3 //为避免撤灯时,发生闪烁,取消提前撤灯(需要进一步确认)
98 3 //为了及时外呼撤灯,提前发送撤灯数据
99 3 for(a=0; a<8; a++){
100 4 if(e_online[a]==1){
101 5 //2004.11.24 LHM
102 5 // cSendLIdx=cLIdx-LNum_MAX_UNDERGROUND+1;
103 5 cSendLIdx=cLIdx-mE_InputData.mDianTi[a].cJuDiCengShu-LNum_MAX_UNDERGROUND+1;
104 5 out_id=cSendLIdx; //计算外呼标志符
105 5 out_id=out_id<<5;
106 5 out_id=out_id|0x4800;
107 5 can_p=canx_cs[a];
108 5 //can是否在线
109 5 if((*(can_p+2)&0x4)==0x4){ //发送缓冲区空
110 6 *(can_p+16)=0x02;
111 6 *(can_p+17)=out_id>>8;
112 6 *(can_p+18)=out_id&0xff;
113 6 *(can_p+19)=0x5a; //命令3
114 6 *(can_p+20)=0x0a; //外呼灯
115 6 *(can_p+1)=0x1; //发送请求
116 6 }
117 5 }
C51 COMPILER V6.12 DISTRIBUTE 06/05/2005 15:44:44 PAGE 16
118 4 }
119 3 }
120 2 //进行外呼分配
121 2 // if(cLIdx==9){
122 2 // mE_InputData.mDianTi[0].TongXun.bZhiShi=IsLastOneDistribution(cLIdx, updown_flg);
123 2 // P1_7=0;
124 2 // }
125 2 ret0 = IsSomeoneNextStopFloor(cLIdx, updown_flg);
126 2 ret1 = IsLastOneDistribution(cLIdx, updown_flg);
127 2 //if( (!Is3FloorDistributed(cLIdx, updown_flg)) && (!IsSomeoneNextStopFloor(cLIdx, updown_flg))&&(!IsLas
-tOneDistribution(cLIdx, updown_flg)) )
128 2 if( /*(!Is3FloorDistributed(cLIdx, updown_flg)) && */(ret0==0) && (ret1==0) )
129 2 OptimizeArrange(cLIdx, updown_flg);
130 2 }else{
131 2 updown_flg = D_Down; //设置下标记
132 2 bVal = 0;
133 2 //确保取消外呼点灯
134 2 SetOutCallLight(cLIdx, updown_flg, bVal);
135 2 //确保取消外呼分配
136 2 SetOutCallDistribution(cLIdx, updown_flg, bVal);
137 2 }
138 1
139 1 //2004.11.25 added by LHM循环设置点灯数据
140 1 LoopSetCallLightData(m_CalUpLIdx, m_CalDownLIdx);
141 1
142 1 //取得各电梯下一停靠层索引和搜索方向
143 1 for(i=0; i<m_cENum; i++){
144 2 SetNearNextStopFloorLIdx(i);
145 2 }
146 1
147 1
148 1 //下一楼层
149 1 m_CalUpLIdx++; //上呼层索引
150 1 if(m_CalUpLIdx>=m_cLNum)
151 1 m_CalUpLIdx=0;
152 1
153 1 if(m_CalDownLIdx==0) //下呼层索引
154 1 m_CalDownLIdx=mL_Data.cLNum-1;
155 1 else
156 1 m_CalDownLIdx--;
157 1 }
158
159 //外呼是否已经分配给"三层以内(含三层)到达且处于运动中的电梯"
160 uchar Is3FloorDistributed(uchar cLIdx, uchar updown_flg)
161 {
162 1 uchar m_cLNum = LNum_MAX;
163 1 uchar m_cENum = m_pL_Data->cENum;
164 1 uchar i=0,j=0;
165 1 signed char distance=0;
166 1 E_DianTi *pEleData;
167 1 E_FangXiang *pFangXiang; //方向数据
168 1 E_XiangYing *pXiangYing; //外呼分配数据
169 1 uchar cCurFloorIdx; //当前层
170 1
171 1
172 1 for(i=0; i<m_cENum; i++){
173 2 pEleData = &(m_pE_InputData->mDianTi[i]);
174 2 pFangXiang = &(pEleData->FangXiang); //方向数据
175 2 pXiangYing = &(m_pE_OutputData->mXiangYing[i]); //外呼分配数据
176 2 cCurFloorIdx = pEleData->cDangQianCeng-1; //当前层
177 2 if(updown_flg == D_Up){ //上呼
178 3 //外呼层到当前层的间隔楼层数("-1"是因为"当前层"从1开始)
C51 COMPILER V6.12 DISTRIBUTE 06/05/2005 15:44:44 PAGE 17
179 3 if( cLIdx >= cCurFloorIdx)
180 3 distance = cLIdx - cCurFloorIdx;
181 3 else
182 3 distance = cCurFloorIdx - cLIdx;
183 3 //三层以内,运行方向向上,运动中,并且已分配
184 3 //2004.05.25 LHM 修正原因:下位机负责定向,定向用到外呼分配,而撤销外呼用到方向,为避免三角连锁错误,故对于正常
-到达的电梯在开关门状态时,不必进行分配.
185 3 // if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (pXiang
-Ying->bShang[cLIdx]==1)){
186 3 if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (GetArray
-Data(pXiangYing->bShang, cLIdx)==1)){
187 4 if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
188 4 return 1;
189 4 else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
190 4 return 1;
191 4 }
192 3 if(cCurFloorIdx==cLIdx)
193 3 if(pEleData->bDongOrJing ==0)
194 3 if(GetArrayData(pXiangYing->bShang, cLIdx)==1){
195 4 if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
196 4 return 1;
197 4 else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
198 4 return 1;
199 4 }
200 3 }else{ //下呼
201 3 //外呼层到当前层的间隔楼层数("-1"是因为"当前层"从1开始)
202 3 if( cLIdx >= cCurFloorIdx)
203 3 distance = cLIdx - cCurFloorIdx;
204 3 else
205 3 distance = cCurFloorIdx - cLIdx;
206 3 //三层以内,运行方向向上,运动中,并且已分配
207 3 // if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (pXiang
-Ying->bXia[cLIdx]==1)){
208 3 if( (0<=distance) && (distance<=pEleData->cMinCancelFenPei) && (pEleData->bDongOrJing ==1) && (GetArray
-Data(pXiangYing->bXia, cLIdx)==1)){
209 4 if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
210 4 return 1;
211 4 else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
212 4 return 1;
213 4 }
214 3 if(cCurFloorIdx==cLIdx)
215 3 if(pEleData->bDongOrJing ==0)
216 3 if(GetArrayData(pXiangYing->bXia, cLIdx)==1){
217 4 if((pFangXiang->bShang==1) && (pFangXiang->bXia==0) && (cLIdx>=cCurFloorIdx))
218 4 return 1;
219 4 else if((pFangXiang->bShang==0) && (pFangXiang->bXia==1) && (cLIdx<=cCurFloorIdx))
220 4 return 1;
221 4 }
222 3 }
223 2 }
224 1
225 1 return 0;
226 1 }
227
228 //外呼是否是某电梯最后一个外呼分配,且当前层与最后一个外呼之间无内选
229 uchar IsLastOneDistribution(uchar cLIdx, uchar updown_flg)
230 {
231 1 uchar m_cLNum = LNum_MAX;
232 1 uchar m_cENum = m_pL_Data->cENum;
233 1 uchar m_cEleIdx=0xFF; //该外呼已经分配给该部电梯
234 1 uchar i=0,j=0;
235 1
C51 COMPILER V6.12 DISTRIBUTE 06/05/2005 15:44:44 PAGE 18
236 1
237 1 E_DianTi *pEleData;
238 1 E_FangXiang *pFangXiang; //方向数据
239 1 E_XiangYing *pXiangYing; //外呼分配数据
240 1 uchar cCurFloorIdx; //当前层
241 1 uchar cTopFloor = pEleData->cZuiGaoCeng-1; //可到最高层(-1是因为楼层计数从1开始)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -