⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 distribute.lst

📁 一整套电梯控制器源程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
 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 + -