📄 main.c
字号:
/*
** Copyright (C)1999 KVASER AB, http://www.kvaser.com
** This code may be freely distrubuted and used if the source is indicated.
**
modi date
增加协议处理 06-10-24
过欠压处理 06-10-24
*/
#ifdef __WIN32__
#include <vcl.h>
#pragma hdrstop
#include <canlib.h>
#include "mainUnit.h"
#include "mcThread.h"
#include "inc\canUnit.h"
#include "util_w32.h"
#include "inc\ad.h"
#else
#include <string.h>
#include "inc\util_mc.h"
#include "inc\spi_mcp.h"
#include "inc\eeprom.h"
#include "inc\ad.h"
#include <pic.h>
#include <stdio.h>
#endif
#include "inc\main.h"
#include "inc\ck.h"
#include "inc\ad.h"
bank1 unsigned char gVoltFilCnt; //电压滤波计数器,用以抑制脉冲电压
bank1 unsigned char gOffLineCnt; //离线计数器,与中心断开的时间
bank1 unsigned char mcptBUF[9];
bank1 unsigned char mcprBUF[9];
////////////////////////////////////
bank1 uchar can_msg[8];
bank1 unsigned int k;
////////////////////////////////
bank1 char gVFilCnt; //电压滤波器均值计数
bank1 unsigned int gVoltsum;//电压10次总和
bank1 float gACaverage; //电压均值
bank1 unsigned int gVolt;//临时电压变量
bank1 unsigned char gVoltSta;//工作状态
void paraProtocol(unsigned char *buf,unsigned char len)
{
//unsigned char command;
int i,j;
//command = buf[0];
//if((command>>4)==0x04)
if((buf[0]>>4)==0x04)
{
switch((buf[0]&0x0f))
{
case 1: //设置过欠压值
{
i = buf[1];
i <<=8;
i |= buf[2];
j = buf[3];
j <<=8;
j |=buf[4];
if((i>220) && (j<220))
set_voltrange(i,j);
}
break;
case 2: //主控取过欠压值命令
{
mcptBUF[0]= C_VOLTRANGE;
mcptBUF[1]= gMax_Volt>>8;
mcptBUF[2]= gMax_Volt;
mcptBUF[3]= gMin_Volt>>8;
mcptBUF[4]= gMin_Volt;
canWrite(MainAddr, mcptBUF, 5, 0);
printf("%x %x\n",gMax_Volt,gMin_Volt);
}
break;
//case 3: //响应主控的取过欠压命令
case 4: //设置温度临界值
{
if(buf[1]>min_deftemp) //温度下限为20度
set_maxtemp(buf[1]);
}
break;
case 5: //取温度临界值
{
mcptBUF[0]= C_MAXTEMP;
mcptBUF[1]= gMax_Temp;
canWrite(MainAddr, mcptBUF, 2, 0);
}
break;
//case 6: //响应主控的取温度临界值信息
case 7: //取当前电压值
{
mcptBUF[0]= C_CURVOLT;
mcptBUF[1]= gCurVolt>>8;
mcptBUF[2]= (unsigned char)gCurVolt;
canWrite(MainAddr, mcptBUF, 3, 0);
}
break;
//case 8: //响应主控的取当前电压值信息
case 9: //取当前的温度值
{
mcptBUF[0]= C_CURTEMP;
mcptBUF[1]= gCurTemp;
canWrite(MainAddr, mcptBUF, 2, 0);
}
break;
//case 0x0A: //响应取当前温度值信息
case 0x0B: //连接帧
{
gOffLineCnt = 0;
if(gVoltSta==0)//处于正常状态
{
ynSWITCH=NORMAL; //切换到正常状态
}
else if(gVoltSta==1)//处于过欠压状态
{
}
}
break;
case 0x0C: //正常黄闪设置命令
{
if(buf[1]==1)
{
gOffLineCnt = 0;
ynSWITCH=NORMAL; //切换到正常状态
}
else
{
gOffLineCnt = 0;
ynSWITCH=YFLASH; //切换到正常黄闪状态
}
}
break;
}
}
buf[0] = 0;
}
/*
* Check if a message is received; if so, act on it.
*/
void checkMsg(void)
{
int id;
unsigned char dlc;
unsigned int flags;
canStatus stat;
stat = canRead(&id, mcprBUF, &dlc, &flags);
if (stat == canOK)
{
printf("\nMessage rcvd: id=%x, dlc=%x, {%x,%x,%x,%x,%x,%x,%x,%x...}\r\n", (int)id, dlc, mcprBUF[0], mcprBUF[1], mcprBUF[2],mcprBUF[3],mcprBUF[4], mcprBUF[5], mcprBUF[6],mcprBUF[7]);
}
//else
// printf("Nothing received by chekMsg\r\n");
paraProtocol(mcprBUF,dlc);
}
/*
The Main program
*/
void main(void)
{
gOffLineCnt = 0; //离线计数超时
gVoltFilCnt = 0;
gVFilCnt = 0;
gVoltsum = 0;
gCurVolt = 220;
gVoltSta = 0; //工作状态为正常
setupModule();
printf("setupModule over\n");
//setLEDs(0);
canSetup();
//ckInit();
adinitial();
para_init();
//mcp_read_all();
//TRISC = 0;
printf("power module start!!!!\n");
//////////////////////////////////////////////////////////
/***********************************************************************
通信处理模块,包括协议解析,处理
************************************************************************/
//canWrite(ulong id, const uchar *msg, unsigned char dlc, unsigned int flag)//
//**********************************************
/*for(k=4;k<8;k++)
can_msg[k]=0;
can_msg[0]=0x53;
can_msg[1]=0x54;
can_msg[2]=0x02;
can_msg[3]=0x03;
for(;;)
{
printf("\n");
if(canWrite(0x02, can_msg,8,0)==canOK)
{
printf("can write OK\n");
DelayF(1000);
checkMsg(); //Check for received CAN message
printf(" ... ");
}
else
printf("can write Error\n");
}
//**********************************************
///////////////////////////////////////////////////////////*/
for (;;)
{
/***********************************************************************
/* 离线检测模块
************************************************************************/
if(gOffLineCnt>=MAX_OFFLINE)
{
ynSWITCH=YFLASH;//如果与主控通信超时,切换到黄闪状态
}
/***********************************************************************
电压检测模块
(Vac*12/220-M)*N*1.54/11.97 = Vdc
M = 整流压降 N = 滤波参数
1.54/11.97 = 电阻分压
************************************************************************/
DelayF(10);
AdcRead(0,&gVolt);
gVFilCnt++;
gVoltsum+=gVolt;
if(gVFilCnt==10)
{
gACaverage=(float)gVoltsum*5/10240;//average浮点型,sum为unsigned int型
gCurVolt=(int)(float)(96.5517*gACaverage)+(float)(13.5173);
gVFilCnt = 0;
gVoltsum = 0;
//printf("volt is %x\n",gCurVolt);
}
if(checkVolt()==0)//正常
{
gVoltSta = 0; //电压正常
if(gOffLineCnt<MAX_OFFLINE)//通信正常的情况
{
//printf("volt is ok\n");
ynSWITCH = NORMAL;
}
gVoltFilCnt = 0;
}
else
{
//printf("volt is err\n");
gVoltFilCnt++;
if(gVoltFilCnt>10) //过滤脉冲电压,如果连续10次都高,则认为电压超出范围
{
gVoltFilCnt = 0;
gVoltSta = 1;//电压不正常标志
if(gOffLineCnt<MAX_OFFLINE)//通信不断掉的情况
{
//上报中心,表示电压故障,并进入黄闪状态
if(ynSWITCH == NORMAL)
{
ynSWITCH=YFLASH;
mcptBUF[0]= C_VOLTERR;
mcptBUF[1]= gCurVolt>>8;
mcptBUF[2]= (unsigned char)gCurVolt;
canWrite(MainAddr, mcptBUF, 3, 0);
}
}
}
}
/***********************************************************************
通信模块
************************************************************************/
checkMsg(); //Check for received CAN message
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -