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

📄 turncontrol.c

📁 一个流量控制仪器的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
							else
							{
								//重要,防止因为上一数据未发送完,发送失败!
								while(CAN_SendToSlave_Allow01(tempi)!=0)
								{
									if(ucSystemCANErrorState)
									{
										//错误报警!
										fnAlarm(1);
	
										fnBeep(1);
										
										//退出循环,防止死机!
										//清除错误标志
										//ucSystemCANErrorState = 0;
										break;
						
									}
					
								}

							}
						}
					}
					else
					{
						CAN_Master_ListTest(127,ucTurnAllow01,ucTurnAllow95,0xFF);
					}
					
					if( ucBuf_AdvanceSet[PPAD_PP1_6] == 3)
					{
						//没有50时间段,所以只要有50,就发出工作许可
						if( List_Nouse.ucListN>0 )
						{
							//发送工作许可
						
							tempi = ListGetFirstNode(State_X3);
						
							if(tempi !=0xFF)
							{
								if(tempi == 0x00)
								{
									//重要,防止因为上一数据未发送完,发送失败!
									while(CAN_SendToSlave_Allow95(tempi)!=0)
									{
										if(ucSystemCANErrorState)
										{
											//错误报警!
											fnAlarm(1);
	
											fnBeep(1);
											
											//退出循环,防止死机!
											//清除错误标志
											//ucSystemCANErrorState = 0;
											break;
						
										}
					
									}								
									ucTurnAllow95 = 1;
								}
								else
								{
									//重要,防止因为上一数据未发送完,发送失败!
									while(CAN_SendToSlave_Allow95(tempi)!=0)
									{
										if(ucSystemCANErrorState)
										{
											//错误报警!
											fnAlarm(1);
	
											fnBeep(1);
											
											//退出循环,防止死机!
											//清除错误标志
											//ucSystemCANErrorState = 0;
											break;
						
										}
					
									}									
								}
							}
						}	
					}
					else
					if( ucBuf_AdvanceSet[PPAD_PP1_6] == 4)
					//还原数+备用数 大于MAX ucBuf_AdvanceSet[PPAD_PP1_7]
					if(List_Return.ucListN + List_Nouse.ucListN > ucBuf_AdvanceSet[PPAD_PP1_7])
					{
						//发送工作许可
						
						tempi = ListGetFirstNode(State_X3);
						
						if(tempi !=0xFF)
						{
							if(tempi == 0x00)
							{
								//重要,防止因为上一数据未发送完,发送失败!
								while(CAN_SendToSlave_Allow95(tempi)!=0)
								{
									if(ucSystemCANErrorState)
									{
										//错误报警!
										fnAlarm(1);
	
										fnBeep(1);
										
										//退出循环,防止死机!
										//清除错误标志
										//ucSystemCANErrorState = 0;
										break;
						
									}
					
								}								
								
								ucTurnAllow95 = 1;
							}
							else
							{
								//重要,防止因为上一数据未发送完,发送失败!
								while(CAN_SendToSlave_Allow95(tempi)!=0)
								{
									if(ucSystemCANErrorState)
									{
										//错误报警!
										fnAlarm(1);
	
										fnBeep(1);
										
										//退出循环,防止死机!
										//清除错误标志
										//ucSystemCANErrorState = 0;
										break;
						
									}
					
								}								
							}
						}
					}				
	
					
				}
			}
			
			
		}

		//发送信息

		//网络处理
		//!!每一秒发送一次,注意这里使用了和时段相关的计时!不是绝对时间计时!
		if( bCANState )
		if( ucCANAddress_Local == 0)
		if(fnBitTest( ucTurnSecT , 2))
       		{
       			ucTurnSecT = fnBitClr( ucTurnSecT , 2 );

			//CAN网络测试
			//CAN_SendToMaster_Turn(ucSystemTurnNum,uc5_TurnTime,uc2_SystemTurnCon,MsgListN);
			//CAN_Master_ListTest(254);
       		}       
	
}


/*******************************************************************
		系统主循环
函数原型: void RUN()
功能: 	系统主循环

涉及变量:

********************************************************************/

void RUN()
{

        void    (*pfnFunc)();



		//根据P89C668的调电调电标志  和  调电保持功能选项  决定是否读入调电记忆数据!
		//调电记忆标志     PP1-4	4	是否采用掉电记忆功能	0-关闭 1-打开

		//读入系统设置BUF
        fnRead_SystemSetToBuf();

		//设置掉电标志!
		//切换时段的时候可以根据此标志判断是否在掉电复位情况!
		ucSystemPowerOff = PowerOff();

		if ( ( ucBuf_AdvanceSet[PPAD_PP1_4] ) & ( ucSystemPowerOff ))
		{
			//注意:读入前,时段计时应该关闭!
			//读入系统记忆RAM数据
			fnRead_SystemZRAM();
			
			//流量计掉电保护,复位清零不允许
			bFluxResetEnable = 0;

			//以调电复位方式进入系统时段循环
			fnEnterTurn(ucSystemTurnNum,3);
			
			//流量计掉电保护,复位清零允许(保护措施,防止在某些没有流量计的时段进入...)
			bFluxResetEnable = 1;
			
			//清楚设置掉电标志!
			ucSystemPowerOff = 0;

		}
		else
		{
			//正常进入系统时段循环
			fnEnterTurn(ucSystemTurnNum,0);
		}



		//设置显示刷新的时间间隔  250ms
		fnSet_DisplayFlashTime(25);
		//开始显示刷新
		fnStart_DisplayFlashTime();

    while(1)
    {
        				//检测输入

                ucKeyInput = fnKeyboardRead();
                
                //菜单分析
                fn_Menu();


                //时段分析执行
                pfnFunc = TurnList[ucSystemTurnNum].pfnRun_TurnN;
                (*pfnFunc)();				//执行当前时段的操作



        				//根据显示刷新计时输出
        				if(fnIfEnd_DisplayFlashTime())
        				{
        					//设置显示刷新的时间间隔  250ms
        					fnSet_DisplayFlashTime(25);
        					//开始显示刷新
        					fnStart_DisplayFlashTime();
        					            
        					
        					            //显示执行--时段分析
                        			fnTurnTimeToDBuf();
        
                        			//8段数码管输出
                        			fnDisplayTheBuf(ucDisplayState);
                        			
                        			//读入系统日期时钟
        											fnRead_SystemClock();
        											
        											//检查当天是否已过
        											//fnCheck_TodayFluxV();
        
        				}
                
                //其它输出(报警、附加等输出)
                
            		//!报警!
            		fnOutput_SystemAlarm();  
            		
            		//主循环网络处理函数
            		RUN_network();
            
            
            		//掉电记忆功能
            		//根据调电记忆标志     PP1-4	4	是否采用掉电记忆功能	0-关闭 1-打开
            
            		//每ZRAM_Time秒,刷新一次掉电记忆RAM
            		//注意这里使用了和时段相关的计时!不是绝对时间计时!
            
            		if ( ucBuf_AdvanceSet[PPAD_PP1_4] ) 
            		if ( fnBitTest( ucTurnSecT , 3 ) )
            		{
            			ucTurnSecT = fnBitClr( ucTurnSecT , 3 );
            
            			ucZRAMTime++;
            
            			if( ucZRAMTime > (ZRAM_Time - 1) )
            			{
            				ucZRAMTime = 0;
            				//刷新系统记忆RAM数据
            				fnWrite_SystemZRAM();
            			}
            
            		}
                

		}

}



/*******************************************************************
		时段00初始化函数
函数原型: void fnInit_Turn00()
功能: 	时段00初始化函数
涉及变量:
********************************************************************/
void fnInit_Turn00()
{

	//!由50或系统启动时自动设置正流量!其中经过95暂停记录。

	//开始 --正流量
	FluxPulseCounterEnable;
	
	//00时间段私有初始化
	ucSystemAlarm = fnBitClr( ucSystemAlarm , 2 );	//CL(ALARM3) 盐液开关T3引发报警布尔变量		清0
	ucSystemAlarm = fnBitClr( ucSystemAlarm , 3 );	//CL(ALARM4) 压力开关T4引发报警布尔变量		清0
	ucSystemAlarm = fnBitClr( ucSystemAlarm , 4 );	//CL(ALARM5) 负流量引发报警布尔变量		清0

	
}

/*******************************************************************
		时段00执行函数
函数原型: void fnRun_Turn00()
功能: 	时段00执行函数
涉及变量:
********************************************************************/
void fnRun_Turn00()
{

	//流量计运行
	fnRun_Flux();

   
        //开始
        
        //BSET( PP1-2)			工作段时间是否引发再生
        if( ucBuf_AdvanceSet[PPAD_PP1_2] )
        {
        	//时间是否到达设定?
        	if(fnIfEnd_TurnTime())
        	{
        		ucSystemCouse = fnBitSet( ucSystemCouse , 0 );	//CL(COUSE1) =1 定时引发布尔变量
        	
        		//进入[60]时间段
        		fnEnterTurn(Turn_60,0);
        		
        		//立即退出本函数
        		return;
        	}
        }
        else
        {
        	//时间是否到达设定?
        	if(fnIfEnd_TurnTime())
        	{
        		//从头开始重新计时[00]时间
        		
                	//读入指定地址,大小的时段时间量:	
                	//CAT24WC64P  (N<=8192)(地址:0-8191)
                	//CAT24WC16P  (N<=2048)(地址:0-2047)
        		fnRead_Eeprom(TurnList[Turn_00].uiTurnTimeAddress,
                        	4,uc4_SystemTurnTime); 
                        	
                        fnSet_TurnTime(uc4_SystemTurnTime,0);     //设置时段定时器时间,倒计时
                        
                        fnStart_TurnTime();                     //开始时段定时器
        	}
        }        	
        
        //BSET( PP1-3)			流量是否引发再生
        if( ucBuf_AdvanceSet[PPAD_PP1_3] )
        {
        	//累积流量达到设定?
        	if (bFluxLimitOver)
        	{
        		ucSystemCouse = fnBitSet( ucSystemCouse , 1 );	//CL(COUSE2) =1 定量引发布尔变量
        	
        		//进入[60]时间段
        		fnEnterTurn(Turn_60,0);
        		
        		//立即退出本函数
        		return;
              	}        	
        }        
        
        //BSET( P6-15)			工作时是否可以暂停[76]
        if( ucBuf_NormSet[PAD_P6_15] )
        {
        	//检测面板按键是否收到PAUSE?
        	//判断键盘输入  KEY_PAUSE  暂停键  暂停当前时间段00,进入时间段76
        	if(ucKeyInput == KEY_PAUSE)
        	{
        		ucSystemPause = fnBitSet( ucSystemPause , 3 );	//CL(PAUSE4) =1 工作时手动引发暂停布尔变量
        		
        		//清空键盘处理	
        		ucKeyInput = KEY_NOKey; 
        	
        		//暂停切换时间段[76]
        		fnEnterTurn(Turn_76,1);
        		
        		//立即退出本函数
        		return;
        		
        	}
        }
        
        //检测面板按键是否收到 MAN?
        //检测面板手动信号  KEY_MAN  进入[60]时间段
        if(ucKeyInput == KEY_MAN)
        {
        	ucSystemCouse = fnBitSet( ucSystemCouse , 2 );	//CL(COUSE3) =1 手动引发的布尔变量  	
        	
        	//清空键盘处理	
        	ucKeyInput = KEY_NOKey; 
        	
        	//切换时间段[60]
        	fnEnterTurn(Turn_60,0);
        		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -