SystemAlarm.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741
  1. /*--------------------------------------------------------------------------------------
  2. * @file SystemAlarm.c
  3. * @author ZhangJing
  4. * @version base on stm32f0x
  5. * @date 2015.10.12
  6. * @brief 系统报警处理
  7. ---------------------------------------------------------------------------------------*/
  8. #include "stm32f10x_gpio.h"
  9. #include "TypeDefine.h"
  10. #include "Driver.h"
  11. #include "DrawLCDGUI.h"
  12. #include "ControlSystem.h"
  13. #include "SystemAlarm.h"
  14. #include "ZigbeeDataHandle.h"
  15. #include "History.h"
  16. #include "Bubble_ADCSetup.h"
  17. #include "ControlSystem.h"
  18. #define INPUTTOTALLDOSE 150000
  19. AlarmTypeFrame sysAlarmFlag; //报警标志位
  20. AlarmTypeFrame AlarmRecord; //报警记录标志
  21. AlarmJudgeFrame SysAlarmJudge; //报警判断
  22. //uint8_t MechanicalFaultCounts = 0; //机械故障报警计数,大于2次则报警
  23. extern uint16_t average_Pressure_bf; //压力平均值
  24. uint8_t sysPromptToneType_bf;
  25. uint8_t VoltLowest_cont=0; //低电压预报警采集次数
  26. uint8_t VoltLowest_cont2=0; //低电压警采集次数
  27. uint32_t Timer_VoltLowes=FORTY_MINUTE_TIMER; //预报警延时40分钟
  28. uint8_t VoltLowest_Alarm_Flag=0; //低电量报警标志
  29. uint8_t Alarm_flag=0; //报警标志
  30. uint8_t ADC_LowVoletCount = 0; //低电压报检测次数
  31. uint8_t JamSelfcheckCycle = 0; //堵塞自检周期
  32. extern uint16_t self_adaption_Pressure; //自适应压力值
  33. extern uint8_t self_adaption_flag; //自适应压力参数处理完成标志,用于后面压力报警判断
  34. uint8_t self_adaption_Alarmcont=0; //自适应压力报警判断次数
  35. extern uint8_t ADC_Voit_Done; //电压AD采集完成标志
  36. //extern SysInfusionModeType infusionMode;
  37. extern uint8_t LcdFlicker_Flag; //背景光闪烁标志
  38. extern uint8_t BlockageRecovery; //堵塞自检恢复标志
  39. extern uint8_t AppendComplete; //堵塞自检后追加量未运行完,返回到主运行界面不暂停
  40. extern uint8_t AnotherAlarm; //发生堵塞报警得时候发生未装药盒报警标志
  41. uint8_t JamSelfcheckThroughCycle = 0; //堵塞自检通过周期
  42. /*************************************************************************************
  43. * Function: PECASelfTestHandle
  44. * Object: 泵自检处理
  45. * 输入: 无
  46. * 输出: 无
  47. * 备注: 1、上电后泵头自检
  48. * 2、if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_CLEAR )
  49. **************************************************************************************/
  50. void PECASelfTestHandle( void )
  51. {
  52. if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_CLEAR )
  53. {
  54. motorWorkState = MOTOR_WORK_ON;
  55. G_LED_ON;
  56. G_Led_Time=HALF_SECOND_TIMER;//自检LED点亮500ms
  57. TaskSchedulerFlag.motorSelfTestFlag = TASK_FLAG_WAIT;
  58. }
  59. }
  60. /*************************************************************************************
  61. * Function: MechanicalFaultHandle
  62. * Object: 机械故障处理
  63. * 输入: 无
  64. * 输出: 无
  65. * 备注: 1、霍尔传感器在该感应到磁场的时候没有感应到,即报警;只能关机
  66. * 2、自检设置为4s,如果在4s内没有出现电机转动或霍尔没有检测到信号,则说明电机或霍尔有问题
  67. * 3、为防止误报,当连续累计3次以上报警时才报机械故障
  68. **************************************************************************************/
  69. void MechanicalFaultHandle( void )
  70. {
  71. if( sysAlarmFlag.MechanicalFault != ALARM_CONTINUE )//当判断出确定有机械故障时就不再进入报警判断
  72. {
  73. if( TaskSchedulerFlag.motorSelfTestFlag != TASK_FLAG_SET )//上电电机自检
  74. {
  75. /* 自检设置为4s,如果在4s内没有出现电机转动或霍尔没有检测到信号,则说明电机或霍尔有问题 */
  76. if( TaskSchedulerFlag.motorSelfTestFlag == TASK_FLAG_OVERTIME )//自检超时
  77. {
  78. sysAlarmFlag.MechanicalFault = ALARM_ON;
  79. }
  80. }
  81. else//通过自检,其它对电机操作时可能出现的报警
  82. {
  83. if( TaskSchedulerFlag.motorRunFlag == TASK_FLAG_OVERTIME )
  84. {
  85. // MechanicalFaultCounts++;
  86. sysAlarmFlag.MechanicalFault = ALARM_ON;
  87. // if( MechanicalFaultCounts >= 3 )
  88. // {
  89. // sysAlarmFlag.MechanicalFault = ALARM_ON;
  90. // }
  91. // else
  92. // {
  93. // motorWorkState = MOTOR_WORK_OFF;
  94. // TaskSchedulerFlag.ipnutFlag = TASK_FLAG_SET;//这个标志位应该用在hall1采集到一次变化的时候
  95. //
  96. // }
  97. }
  98. }
  99. }
  100. /* 当有机械故障报警时,进行关闭电机,跳入报警界面,给从芯片发送数据切断电机电源操作 */
  101. if( sysAlarmFlag.MechanicalFault == ALARM_ON )
  102. {
  103. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  104. motorWorkState = MOTOR_WORK_OFF;
  105. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  106. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  107. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  108. // sysPromptToneCounts = 0;//蜂鸣器-计数
  109. SysHornToneType = WarringTone;//蜂鸣器-故障报警
  110. realTimeData.stateRun = Alarm;
  111. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  112. emSysWorkStep = EnterMechanicalFault;
  113. emDisplayPicture = AlarmDeviceDisp;
  114. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  115. emAlarmRememberPicture = emDisplayPicture;
  116. /* 此报警为不可恢复报警,一旦出现报警就是持续报警,只有关机操作,同时也为了防止屏幕一直刷新,所以更改标志状态 */
  117. sysAlarmFlag.MechanicalFault = ALARM_CONTINUE;
  118. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  119. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  120. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  121. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  122. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  123. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  124. alarmRecord.alarmType = 1;//机械报警
  125. if( historyRefreshFlag == 0 )
  126. {
  127. HistoryQtyAdd();
  128. WriteHistoryRecordQTY();
  129. historyRefreshFlag = 1;
  130. }
  131. WriteHistoryRecord();
  132. }
  133. }
  134. /*************************************************************************************
  135. * Function: JamFaultHandle
  136. * Object: 堵塞故障处理
  137. * 输入: 无
  138. * 输出: 无
  139. * 备注: 1、当触力传感器受到压力A时,出现此报警(A>B>C),按运行键返回到报警前界面
  140. * 2、堵塞故障可恢复
  141. * 3、为防止误报,当连续累计4次以上报警时才报堵塞故障
  142. **************************************************************************************/
  143. void JamFaultHandle( void )
  144. {
  145. if(( realTimeData.pressureF >= PRESSURE_ALARM_VALUE_E ))
  146. {
  147. // if( SysAlarmJudge.JamFaultJudgeCounts >= 4 )
  148. {
  149. realTimeData.pressureF=30;
  150. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  151. motorWorkState = MOTOR_WORK_OFF;
  152. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  153. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  154. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  155. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  156. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  157. // sysPromptToneCounts = 0;//蜂鸣器-计数
  158. SysHornToneType = WarringTone;//蜂鸣器-故障报警
  159. realTimeData.stateRun = Alarm;
  160. sysAlarmFlag.JamFault = ALARM_ON;
  161. SysAlarmJudge.JamFaultJudgeCounts = 0;
  162. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  163. }
  164. // else
  165. // {
  166. // SysAlarmJudge.JamFaultJudgeCounts++;
  167. // }
  168. }
  169. /*else
  170. {
  171. SysAlarmJudge.JamFaultJudgeCounts = 0;
  172. //--------------------------增加自适应功能------------------------
  173. if( self_adaption_flag==1 )
  174. {
  175. if( realTimeData.pressureF >= (self_adaption_Pressure+3 ))
  176. {
  177. if( self_adaption_Alarmcont >= 4 )
  178. {
  179. // 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止
  180. motorWorkState = MOTOR_WORK_OFF;
  181. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  182. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  183. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  184. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  185. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  186. sysPromptToneCounts = 0;//蜂鸣器-计数
  187. //sysPromptToneType = WarringTone;//蜂鸣器-故障报警
  188. realTimeData.stateRun = Alarm;
  189. sysAlarmFlag.JamFault = ALARM_ON;
  190. self_adaption_Alarmcont = 5;
  191. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  192. }
  193. else
  194. {
  195. self_adaption_Alarmcont++;
  196. }
  197. }
  198. else
  199. {
  200. self_adaption_Alarmcont=0;
  201. }
  202. }
  203. else
  204. {
  205. self_adaption_Alarmcont = 0;
  206. }
  207. //----------------------------------------------
  208. }*/
  209. }
  210. /*************************************************************************************
  211. * Function: MaxFaultHandle
  212. * Object: 极限值故障处理
  213. * 输入: 无
  214. * 输出: 无
  215. * 备注: 1、当一小时内输注的总量超过极限量设定即报警
  216. * 2、极限值故障可恢复
  217. **************************************************************************************/
  218. void MaxFaultHandle( void )
  219. {
  220. if( TaskSchedulerFlag.limitJudgeFlag == TASK_FLAG_SET )//如果在1小时之内出现超出极限量值则报警
  221. {
  222. if( realTimeData.inputLimitDose >= ( runParamInfo.limitDose * 10 ) )
  223. {
  224. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  225. motorWorkState = MOTOR_WORK_OFF;
  226. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  227. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  228. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  229. // sysPromptToneCounts = 0;//蜂鸣器-计数
  230. SysHornToneType = WarringTone;//蜂鸣器-故障报警
  231. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  232. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  233. realTimeData.stateRun = Alarm;
  234. sysAlarmFlag.MaxFault = ALARM_ON;
  235. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  236. }
  237. }
  238. else//如果在1小时内没有出现极限量报警,则将极限量的值清零,重新计量
  239. {
  240. realTimeData.inputLimitDose = 0;
  241. TaskSchedulerFlag.limitJudgeFlag = TASK_FLAG_SET;
  242. }
  243. }
  244. /*************************************************************************************
  245. * Function: BubbleFaultHandle
  246. * Object: 气泡或无液故障处理
  247. * 输入: 无
  248. * 输出: 无
  249. * 备注: 1、当触力传感器受到压力B时,出现此报警(A>B>C),按运行键返回到报警前界面
  250. * 2、气泡或无液故障可恢复
  251. * 3、为防止误报,当连续累计9次以上报警时才报气泡或无液故障
  252. **************************************************************************************/
  253. void BubbleFaultHandle( void )
  254. {
  255. if( ( sysAlarmFlag.BubbleFault != ALARM_ON ) )
  256. {
  257. if((BubbleData < Bubble_Alarm_Value )&&(Bubble_Alarm_Value_Down<BubbleData))
  258. {
  259. if( SysAlarmJudge.BubbleFaultJudgeCounts >= 2 ) //连续采集3个周期的数值都小于阈值,报警
  260. {
  261. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  262. motorWorkState = MOTOR_WORK_OFF;
  263. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  264. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  265. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  266. // sysPromptToneCounts = 0;//蜂鸣器-计数
  267. SysHornToneType = WarringTone;//蜂鸣器-故障报警
  268. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  269. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  270. realTimeData.stateRun = Alarm;
  271. sysAlarmFlag.BubbleFault = ALARM_ON;
  272. SysAlarmJudge.BubbleFaultJudgeCounts = 0;
  273. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  274. }
  275. else
  276. {
  277. SysAlarmJudge.BubbleFaultJudgeCounts++;
  278. }
  279. }
  280. else
  281. {
  282. SysAlarmJudge.BubbleFaultJudgeCounts = 0;
  283. }
  284. }
  285. }
  286. /*************************************************************************************
  287. * Function: NonePillCaseHandle
  288. * Object: 未装药盒故障处理
  289. * 输入: 无
  290. * 输出: 无
  291. * 备注: 1、当触力传感器受到压力C时,出现此报警(A>B>C),按运行键返回到报警前界面
  292. * 2、未装药盒故障可恢复
  293. **************************************************************************************/
  294. void NonePillCaseHandle( void )
  295. {
  296. if( sysAlarmFlag.NonePillCase != ALARM_ON )
  297. {
  298. if( realTimeData.pressureF < PRESSURE_ALARM_VALUE_A )
  299. {
  300. // if( SysAlarmJudge.NonePillCaseJudgeCounts >= 1 )
  301. // {
  302. realTimeData.pressureF=30;
  303. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  304. motorWorkState = MOTOR_WORK_OFF;
  305. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  306. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  307. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  308. // sysPromptToneCounts = 0;//蜂鸣器-计数
  309. SysHornToneType = WarringTone;//喇叭-故障报警
  310. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  311. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  312. realTimeData.stateRun = Alarm;
  313. sysAlarmFlag.NonePillCase = ALARM_ON;
  314. // SysAlarmJudge.NonePillCaseJudgeCounts = 0;
  315. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  316. // }
  317. // else
  318. // {
  319. // SysAlarmJudge.NonePillCaseJudgeCounts++;
  320. // }
  321. // }
  322. // else
  323. // {
  324. // SysAlarmJudge.NonePillCaseJudgeCounts = 0;
  325. }
  326. }
  327. }
  328. /*************************************************************************************
  329. * Function: BatteryVoltLowHandle
  330. * Object: 电量低故障处理
  331. * 输入: 无
  332. * 输出: 无
  333. * 备注: 1、当电量低于xxV时,显示此报警,可关机
  334. * 2、电量低于xxV时,有预报,预报时可正常工作
  335. **************************************************************************************/
  336. void BatteryVoltLowHandle( void )
  337. {
  338. if( sysAlarmFlag.VoltLowest != ALARM_ON )
  339. {
  340. //if(ADC_Voit_Done == 1) //只有在电压采集完成之后才可以进行后续判断
  341. {
  342. // ADC_Voit_Done=0;
  343. //if( realTimeData.batteryVolt < BATTERY_VOLT_LOW_LIMIT )
  344. /* if( VoltLowest_Alarm_Flag == TASK_FLAG_SET)
  345. {
  346. VoltLowest_Alarm_Flag = TASK_FLAG_CLEAR;
  347. //VoltLowest_cont2++;
  348. //if( VoltLowest_cont2 >= 2 )//连续采集两次的电压大于设置值报警低电压
  349. {
  350. // VoltLowest_cont2=0;
  351. // 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止
  352. VoltLowest_cont=0; //清除预报警采集次数
  353. motorWorkState = MOTOR_WORK_OFF;
  354. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  355. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  356. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  357. // sysPromptToneCounts = 0;//蜂鸣器-计数
  358. SysHornToneType = WarringTone;//蜂鸣器-故障报警
  359. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  360. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  361. realTimeData.stateRun = Alarm;
  362. sysAlarmFlag.VoltLowest = ALARM_ON;
  363. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  364. emAlarmRecordPicture = emCurrentPicture;
  365. emAlarmRecordStep = emSysWorkStep;
  366. emSysWorkStep = EnterBatteryVoltLow;
  367. emDisplayPicture = AlarmLowVoltDisp;
  368. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  369. emAlarmRememberPicture = emDisplayPicture;
  370. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  371. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  372. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  373. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  374. alarmRecord.alarmType = 6;//电量低
  375. Alarm_flag=1;
  376. }
  377. return ;
  378. }*/
  379. //else if( ( realTimeData.batteryVolt <= BATTERY_VOLT_LOW_PREPARE ) && ( realTimeData.batteryVolt >= BATTERY_VOLT_LOW_LIMIT ) )
  380. // else
  381. if(ADC_Voit_Done == 1)
  382. {
  383. ADC_Voit_Done=0;
  384. if(realTimeData.batteryVolt <= BATTERY_VOLT_LOW_LIMIT)
  385. {
  386. VoltLowest_cont2++; //低电压采集次数
  387. if(VoltLowest_cont2 >=3)
  388. {
  389. VoltLowest_cont2 = 0;
  390. if( sysAlarmFlag.VoltLowest != ALARM_ON )
  391. {
  392. motorWorkState = MOTOR_WORK_OFF;
  393. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  394. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  395. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  396. // sysPromptToneCounts = 0;//蜂鸣器-计数
  397. SysHornToneType = WarringTone;//蜂鸣器-故障报警
  398. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  399. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  400. realTimeData.stateRun = Alarm;
  401. sysAlarmFlag.VoltLowest = ALARM_ON;
  402. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  403. if(TaskSchedulerFlag.JamSelfcheckingFlag != TASK_FLAG_WAIT)
  404. {
  405. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_WAIT;//堵塞自检标志等待
  406. }
  407. emAlarmRecordPicture = emCurrentPicture;
  408. emAlarmRecordStep = emSysWorkStep;
  409. emSysWorkStep = EnterBatteryVoltLow;
  410. emDisplayPicture = AlarmLowVoltDisp;
  411. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  412. emAlarmRememberPicture = emDisplayPicture;
  413. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  414. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  415. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  416. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  417. alarmRecord.alarmType = 6;//电量低
  418. Alarm_flag=1;
  419. }
  420. }
  421. return;
  422. }
  423. if( realTimeData.batteryVolt <= BATTERY_VOLT_LOW_PREPARE )
  424. {
  425. VoltLowest_cont2=0; //清除低电压采集次数
  426. VoltLowest_cont++;
  427. if( VoltLowest_cont >= 3 ) //连续采集3次数据才报预报警
  428. {
  429. VoltLowest_cont=0; //清除预报警采集次数
  430. if( sysAlarmFlag.VoltLowest != ALARM_PREPARE )
  431. {
  432. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  433. sysPromptToneCounts = 0;//蜂鸣器-计数
  434. // sysPromptToneType_bf = sysPromptToneType;
  435. if((SysHornToneType != WarringTone)&&(SysHornToneType != InfusionTone))
  436. {
  437. SysHornToneType = Sound_prepore;//蜂鸣器-电池低压预报
  438. }
  439. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  440. Timer_VoltLowes = FORTY_MINUTE_TIMER;//预报警时,赋予40分钟时间
  441. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  442. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  443. sysAlarmFlag.VoltLowest = ALARM_PREPARE;
  444. }
  445. }
  446. return;
  447. }
  448. else
  449. {
  450. if(( sysAlarmFlag.VoltLowest != ALARM_PREPARE ) || ( sysAlarmFlag.VoltLowest != ALARM_ON ))
  451. {
  452. //TaskSchedulerFlag.speakerFlag = TASK_FLAG_CLEAR;//蜂鸣器响
  453. //sysPromptToneCounts = 0;//蜂鸣器-计数
  454. //sysPromptToneType = SoundOff;//蜂鸣器-电池低压预报恢复
  455. //sysAlarmFlag.VoltLowest = ALARM_OFF;
  456. VoltLowest_cont=0; //清除预报警采集次数
  457. VoltLowest_cont2=0; //清除低电压采集次数
  458. }
  459. }
  460. }
  461. }
  462. }
  463. }
  464. /*************************************************************************************
  465. * Function: LineLostHandle
  466. * Object: 管路脱落故障处理
  467. * 输入: 无
  468. * 输出: 无
  469. * 备注: 当管路脱落时,显示此报警,按运行键返回到报警前界面
  470. **************************************************************************************/
  471. void LineLostHandle( void )
  472. {
  473. if( sysAlarmFlag.LineLost != ALARM_ON )
  474. {
  475. if( realTimeData.pressure2 < PRESSURE_ALARM_VALUE_C )//测试时先用压力为10kpa时表示管路脱落
  476. {
  477. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  478. motorWorkState = MOTOR_WORK_OFF;
  479. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  480. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  481. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  482. sysPromptToneCounts = 0;//蜂鸣器-计数
  483. // sysPromptToneType = WarringTone;//蜂鸣器-故障报警
  484. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  485. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  486. realTimeData.stateRun = Alarm;
  487. sysAlarmFlag.LineLost = ALARM_ON;
  488. TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  489. }
  490. }
  491. }
  492. /*************************************************************************************
  493. * Function: InputTotalHandle
  494. * Object: 输入总量报警处理
  495. * 输入: 无
  496. * 输出: 无
  497. * 备注: 当管路脱落时,显示此报警,按运行键返回到报警前界面
  498. **************************************************************************************/
  499. void InputTotalHandle( void )
  500. {
  501. if( sysAlarmFlag.InputTotal != ALARM_ON )
  502. {
  503. if( realTimeData.InputTotalDose >= INPUTTOTALLDOSE )//当输入总量大于设置的总量值是,报警
  504. {
  505. /* 电机停止工作,将电机停止标志置位,运行标志清除,电机工作状态为停止 */
  506. motorWorkState = MOTOR_WORK_OFF;
  507. TaskSchedulerFlag.motorStopFlag = TASK_FLAG_SET;
  508. TaskSchedulerFlag.motorRunFlag = TASK_FLAG_CLEAR;
  509. TaskSchedulerFlag.speakerFlag = TASK_FLAG_SET;//蜂鸣器响
  510. // sysPromptToneCounts = 0;//蜂鸣器-计数
  511. SysHornToneType = InfusionTone;//蜂鸣器-故障报警
  512. TaskSchedulerTimer.alarmLCDFlashTimer = TWO_FIVE_SECOND_TIMER;//报警LCD闪屏次数显示计时
  513. TaskSchedulerFlag.lcdBlackFlashFlag = TASK_FLAG_SET;
  514. realTimeData.stateRun = Alarm;
  515. sysAlarmFlag.InputTotal = ALARM_ON;
  516. // TaskSchedulerTimer.rtdXmitTimer = TEN_SECOND_TIMER;//准备快速发送实时数据
  517. }
  518. }
  519. }
  520. /*************************************************************************************
  521. * Function: SystemAlarmJudge
  522. * Object: 系统报警判断
  523. * 输入: 无
  524. * 输出: 无
  525. * 备注: 1、所有报警均在本函数中判断、调用,如有相应报警则进入处理
  526. * 2、重要变量:sysAlarmFlag如果有报警则给结构体相应报警变量赋值
  527. **************************************************************************************/
  528. void SystemAlarmJudge( void )
  529. {
  530. if( realTimeData.stateRun != Poweroff ) //有关机指令后就不再进入报警状态
  531. {
  532. if( realTimeData.stateRun != SelfTest )//自检完成后进行电池电量检测
  533. {
  534. // BatteryVoltLowHandle();//电池电量低处理
  535. }
  536. /*机械故障时刻检测*/
  537. if( EngineeringModeValue.deviceAlarm == ENGINEERINGMODE_ON )
  538. {
  539. MechanicalFaultHandle();//机械故障处理
  540. }
  541. if( ( realTimeData.stateRun == FirstRun ) || ( realTimeData.stateRun == MainRun ) || ( realTimeData.stateRun == PCARun ) ||(AnotherAlarm == 1))//在运行时进行故障判断
  542. {
  543. AnotherAlarm = 0;
  544. MaxFaultHandle();//极限故障处理
  545. InputTotalHandle();//输入总量报警处理
  546. // if( EngineeringModeValue.closedState == ENGINEERINGMODE_ON )
  547. // {
  548. // LineLostHandle();//管路脱落故障处理
  549. // }
  550. if( ( EngineeringModeValue.closedState == ENGINEERINGMODE_ON ) && ( SysAlarmJudge.NonePillCaseJudgeFlag == TASK_FLAG_SET ) && ( motorWorkState == MOTOR_WORK_OFF ) )
  551. {
  552. NonePillCaseHandle();//未装药盒处理
  553. SysAlarmJudge.NonePillCaseJudgeFlag = TASK_FLAG_CLEAR;
  554. }
  555. else if( ( EngineeringModeValue.bubbleAlarm == ENGINEERINGMODE_ON ) && ( SysAlarmJudge.BubbleFaultJudgeFlag == TASK_FLAG_SET ) && ( motorWorkState == MOTOR_WORK_OFF ) )
  556. {
  557. BubbleFaultHandle();//气泡或无液处理
  558. SysAlarmJudge.BubbleFaultJudgeFlag = TASK_FLAG_CLEAR;
  559. }
  560. else if( ( EngineeringModeValue.jamAlarm == ENGINEERINGMODE_ON ) && ( SysAlarmJudge.JamFaultJudgeFlag == TASK_FLAG_SET ) && ( motorWorkState == MOTOR_WORK_OFF ) )
  561. {
  562. JamFaultHandle();//堵塞故障处理
  563. SysAlarmJudge.JamFaultJudgeFlag = TASK_FLAG_CLEAR;
  564. }
  565. //未装药盒
  566. if( sysAlarmFlag.NonePillCase == ALARM_ON )
  567. {
  568. emAlarmRecordPicture = emCurrentPicture;
  569. emAlarmRecordStep = emSysWorkStep;
  570. emSysWorkStep = EnterNonePillCaseFault;
  571. emDisplayPicture = AlarmNonePillCaseDisp;
  572. emPictureRunState = FirstEnter;
  573. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  574. emAlarmRememberPicture = emDisplayPicture;
  575. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  576. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  577. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  578. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  579. alarmRecord.alarmType = 5;
  580. //historyRefreshFlag = 0;//清除历史数据存储刷新标志
  581. Alarm_flag=1;
  582. }
  583. else if( sysAlarmFlag.BubbleFault == ALARM_ON )//气泡或无液
  584. {
  585. emAlarmRecordPicture = emCurrentPicture;
  586. emAlarmRecordStep = emSysWorkStep;
  587. emSysWorkStep = EnterBubbleFault;
  588. emDisplayPicture = AlarmBubbleDisp;
  589. emPictureRunState = FirstEnter;
  590. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  591. emAlarmRememberPicture = emDisplayPicture;
  592. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  593. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  594. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  595. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  596. alarmRecord.alarmType = 4;//气泡或无液
  597. //historyRefreshFlag = 0;//清除历史数据存储刷新标志
  598. Alarm_flag=1;
  599. }
  600. else if( sysAlarmFlag.LineLost == ALARM_ON )//管道脱落
  601. {
  602. emAlarmRecordPicture = emCurrentPicture;
  603. emAlarmRecordStep = emSysWorkStep;
  604. emSysWorkStep = EnterLineLost;
  605. emDisplayPicture = AlarmLineLostDisp;
  606. emPictureRunState = FirstEnter;
  607. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  608. emAlarmRememberPicture = emDisplayPicture;
  609. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  610. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  611. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  612. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  613. alarmRecord.alarmType = 7;//管道脱落
  614. //historyRefreshFlag = 0;//清除历史数据存储刷新标志
  615. Alarm_flag=1;
  616. }
  617. else if( sysAlarmFlag.JamFault == ALARM_ON )//堵塞
  618. {
  619. emAlarmRecordPicture = emCurrentPicture;
  620. emAlarmRecordStep = emSysWorkStep;
  621. emSysWorkStep = EnterJamFault;
  622. emDisplayPicture = AlarmJamDisp;
  623. TaskSchedulerFlag.JamSelfcheckingFlag = TASK_FLAG_SET;//堵塞自检标志置位
  624. emPictureRunState = FirstEnter;
  625. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  626. emAlarmRememberPicture = emDisplayPicture;
  627. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  628. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  629. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  630. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  631. alarmRecord.alarmType = 2;//堵塞
  632. //historyRefreshFlag = 0;//清除历史数据存储刷新标志
  633. Alarm_flag=1;
  634. }
  635. else if( sysAlarmFlag.MaxFault == ALARM_ON )//极限值
  636. {
  637. emAlarmRecordPicture = emCurrentPicture;
  638. emAlarmRecordStep = emSysWorkStep;
  639. emSysWorkStep = EnterMaxFault;
  640. emDisplayPicture = AlarmMaxDisp;
  641. emPictureRunState = FirstEnter;
  642. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  643. emAlarmRememberPicture = emDisplayPicture;
  644. alarmRecord.alarmTimeMonth = displayTimeBuf.month;
  645. alarmRecord.alarmTimeDate = displayTimeBuf.date;
  646. alarmRecord.alarmTimeHour = displayTimeBuf.hour;
  647. alarmRecord.alarmTimeMinute = displayTimeBuf.minute;
  648. alarmRecord.alarmType = 3;//极限值
  649. //historyRefreshFlag = 0;//清除历史数据存储刷新标志
  650. Alarm_flag=1;
  651. }
  652. else if( sysAlarmFlag.InputTotal == ALARM_ON )//输入总量报警
  653. {
  654. emDisplayPicture = Input_total;
  655. emSysWorkStep = EnterInputTotal;
  656. emPictureRunState = FirstEnter;
  657. emAlarmRememberStep = emSysWorkStep;//2019.02.27增加记录报警界面
  658. emAlarmRememberPicture = emDisplayPicture;
  659. }
  660. }
  661. }
  662. }