📄 ldfxmain.lst
字号:
210 ** 日 期:
211 **-------------------------------------------------------------------------------------------------------
212 *********************************************************************************************************/
213 void TaskWorkStep(void)
214 {
215 1 uint8 i;
216 1 OSSemCreate(IICSem,1); //实现IIC总线的互斥
217 1 OSSemCreate(StartWorkStepSem,0); //工步执行报文下发与工步执行同步
218 1 OSSemCreate(StopWorkStepSem, 0); //工步停止报文下发与工步停止同步
219 1 OSSemCreate(StartCellCheckSem,0);//对点执行报文下发与对点执行同步
220 1 OSSemCreate(StopCellCheckSem, 0);// 报文下发与对点停止同步
221 1 while (1)
222 1 {
223 2 TaskWorkStepBegin:
224 2 if(CurrentWorkStep == 0)//CurrentWorkStep==0表示停止
225 2 {
226 3 OSSemPend(StartWorkStepSem,0);
227 3 for(i=0;i<156;i++)//清空平台电压时间数据
228 3 {
229 4 OSSemPend(IICSem,0);
230 4 EepromWriteWord(ReferenceUIICBase + i*2, 0);
231 4 EepromWriteWord(ReferenceUIICBase + 312 + i*2, 0);
232 4 OSSemPost(IICSem);
233 4 }
234 3 }
235 2 for(;CurrentWorkStep <= SumWorkStep; CurrentWorkStep++)
236 2 {
237 3 switch(WorkStep[CurrentWorkStep].type)
238 3 {
239 4 case 0://停止
240 4 {
C51 COMPILER V7.06 LDFXMAIN 11/19/2004 13:36:18 PAGE 5
241 5 da(0,0);
242 5 da(0,1);
243 5 P4 |=0xFF;
244 5 P5 |=0x0F;
245 5 P2 |=0xF0;
246 5 P1 |=0xFF;//所有DA_EN脚均为1,使所有398处于采样状态,把所有DA清为0
247 5 JDQ = 1;
248 5 CurrentWorkStep = 0;
249 5 WorkStepInit(STOP);
250 5 goto TaskWorkStepBegin;
251 5 }break;
252 4 case 1://静置
253 4 {
254 5 da(0,0);
255 5 da(0,1);
256 5 P4 |=0xFF;
257 5 P5 |=0x0F;
258 5 P2 |=0xF0;
259 5 P1 |=0xFF;//所有DA_EN脚均为1,使所有398处于采样状态,把所有DA清为0
260 5 JDQ = 0;
261 5 WorkStepInit(HALT);
262 5 while(WorkStep[CurrentWorkStep].t > Second)
263 5 {
264 6 if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
265 6 {
266 7 CurrentWorkStep = SumWorkStep - 1;
267 7 break;
268 7 }
269 6 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
270 6 }
271 5 }break;
272 4 case 2://充电
273 4 {
274 5 bit all_cell_full=0;
275 5 ClearDA();//
276 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
277 5 JDQ = 0;
278 5 WorkStepInit(CHARGE);
279 5 SetupDA();
280 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
281 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
282 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
283 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
284 5 while(all_cell_full==0)//等所有电池充满或超时
285 5 {
286 6 if(DaParaChanged)
287 6 {
288 7 SetupDA();
289 7 DaParaChanged=0;
290 7 }
291 6 if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
292 6 {
293 7 CurrentWorkStep = SumWorkStep - 1;
294 7 break;
295 7 }
296 6 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
297 6 all_cell_full=1;
298 6 for(i=0;i<24;i++)
299 6 {
300 7 if(Cell[i].s == CHARGE)
301 7 {
302 8 all_cell_full=0;
C51 COMPILER V7.06 LDFXMAIN 11/19/2004 13:36:18 PAGE 6
303 8 }
304 7 if(Cell[i].i < WorkStep[CurrentWorkStep].limit)
305 7 {
306 8 //DAIBuf[i] = 0;//先充完的继续恒压充等时间到或所有都充完
307 8 Cell[i].s = CURRENTOVER;//当前工步完成
308 8 Cell[i].t = 0;
309 8 }
310 7 }
311 6 if(WorkStep[CurrentWorkStep].t < Second)
312 6 {
313 7 ClearDA();
314 7 all_cell_full = 1;
315 7 }
316 6 }//while(all_cell_full==0)//等所有电池充满或超时
317 5 }break;//case 2://充电
318 4 case 3://放电
319 4 {
320 5 bit all_cell_over=0;
321 5 ClearDA();
322 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
323 5 JDQ = 1;
324 5 WorkStepInit(DISCHARGE);
325 5 SetupDA();
326 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
327 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
328 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
329 5 OSWait(K_TMO,(500*OS_TICKS_PER_SEC)/1000);
330 5 while(all_cell_over==0)//等所有电池放干或超时
331 5 {
332 6 if(DaParaChanged)
333 6 {
334 7 SetupDA();
335 7 DaParaChanged=0;
336 7 }
337 6 if(OSSemAccept(StopWorkStepSem)==OS_SEM_OK)//如果急停
338 6 {
339 7 CurrentWorkStep = SumWorkStep - 1;
340 7 break;
341 7 }
342 6 OSWait(K_TMO,(50*OS_TICKS_PER_SEC)/1000);
343 6 all_cell_over=1;
344 6 for(i=0;i<24;i++)
345 6 {
346 7 if(Cell[i].s == DISCHARGE)
347 7 {
348 8 all_cell_over=0;
349 8 }
350 7 else if(Cell[i].s == CURRENTOVER)
351 7 {
352 8 DAIBuf[i] = 0;
353 8 DAUBuf[i] = 0;
354 8 }
355 7 if(Cell[i].u < WorkStep[CurrentWorkStep].limit)
356 7 {
357 8 Cell[i].s = CURRENTOVER;
358 8 Cell[i].t = 0;
359 8 }
360 7 }
361 6 if(WorkStep[CurrentWorkStep].t < Second)
362 6 {
363 7 ClearDA();
364 7 all_cell_over = 1;
C51 COMPILER V7.06 LDFXMAIN 11/19/2004 13:36:18 PAGE 7
365 7 }
366 6 }//while(all_cell_over==0)//等所有电池放干或超时
367 5 }break;//case 3://放电
368 4 }//switch(WorkStep[i].type)
369 3 }//for(i=0;i<SumStep;i++)
370 2 }//while(1)
371 1 }//void TaskWorkStep(void)
372 /*********************************************************************************************************
373 ** 函数名称: TaskCalcCapa
374 ** 功能描述: 容量积分,每秒钟处理一次,同时将每只电池当前状态持续时间加1,
375 在放电过程中,将每只电池每隔100mV电压变化的时间存入F24C16
376 ** 输 入: 无
377 ** 输 出: 无
378 ** 全局变量: Cell[i].c Cell[i].i
379 ** 调用模块: OSWait
380 **
381 ** 作 者: 刘宝贵
382 ** 日 期: 2004年4月29日22:07
383 **-------------------------------------------------------------------------------------------------------
384 ** 修改人: 刘宝贵
385 ** 日 期: 2004年10月25日16:00
386 ** 内 容:在电池放电过程中,电池电压每下降100mV记录一次到达这个电压值的时间
387 **-------------------------------------------------------------------------------------------------------
388 *********************************************************************************************************/
389 void TaskCalcCapa(void)
390 {
391 1 uint8 data i;
392 1 uint8 xdata count = 0;
393 1 while (1)
394 1 {
395 2 OSWait(K_SIG,0);//等一秒
396 2 Address = P7 & 0x7F;//读本机地址
397 2 if(CommCounter<255)
398 2 CommCounter++;
399 2 if(CommCounter>240 && CurrentWorkStep != 0)
400 2 OSSemPost(StopWorkStepSem);
401 2 for(i=0;i<24;i++)
402 2 {
403 3 OS_ENTER_CRITICAL();
404 3 Cell[i].c+=Cell[i].i;
405 3 Cell[i].t++;
406 3 OS_EXIT_CRITICAL();
407 3 }
408 2 OSSemPend(IICSem,0);
409 2 EepromWriteByte(SecondIICBase,(uint8)(Second>>8));
410 2 EepromWriteByte(SecondIICBase+1,(uint8)(Second));
411 2
412 2 EepromWriteByte(CurrentWorkStepIICBase,CurrentWorkStep);
413 2 OSSemPost(IICSem);
414 2 for(i=0;i<24;i++)
415 2 {
416 3 OSSemPend(IICSem,0);
417 3
418 3 EepromWriteWord(Cell_CIICBase+i*4+0,(uint16)(Cell[i].c>>16));
419 3 EepromWriteWord(Cell_CIICBase+i*4+2,(uint16)(Cell[i].c));
420 3
421 3 EepromWriteWord(Cell_TIICBase + i*2, Cell[i].t);
422 3
423 3 EepromWriteByte(Cell_SIICBase + i, Cell[i].s);
424 3
425 3 OSSemPost(IICSem);
426 3 }//for(i=0;i<24;i++)
C51 COMPILER V7.06 LDFXMAIN 11/19/2004 13:36:18 PAGE 8
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -