📄 turncontrol.c
字号:
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 + -