/*********************************************************************************************
**********************************************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "Common.h"
#include <eeprom.h>
#include "Main.h"
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void SoftStartCurrent(void);
void PidInit(void);
uint OutCurrentPidControl( int Iref, int Ifb );
void SoftStart(void);
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
/*********************************************************************************************
* 函数名称 :IniData
* 函数功能 :初始化数据
* 入口参数 :无
* 出口参数 :无
**********************************************************************************************/
void IniData(void)
{
uchar i;
uchar cA1,cA2,cA3;
uchar cB[8];
//初始化IO
ALMOVP_IN();
ALMFAN_IN();
FAILHALF_IN();
ALMAC_IN();
PWRON_IN();
TEMPOVP_IN();
CHANGEVEN_IN();
ADDR_IN();
ANTEMP_IN();
ANDI_IN();
ANDV_IN();
SHORTCTR_OUT();
SHORTCTR_L();
DGRST_OUT();
DGRST_H();
FANCTR_OUT();
FANCTR_H();
LEDGOOD_OUT();
LEDGOOD_L();
LEDALM_L();
LEDALM_OUT();
R485EN_OUT();
R485EN_L();
OUTCTR_OUT();
OUTCTR_L();
i=0;
i=BIT(nSwChangeVEn)|BIT(nSwFailHalf)|BIT(nSwAlmAc)|BIT(nSwTempOvp);
sTrSwitchSample.cNewValue=sTrSwitchSample.cOldValue=i;
sTrSwitchSample.cAddrNew=sTrSwitchSample.cAddrOld=0;
sTrSwitchSample.cSampleTime=0;
for(i=0;i<nSwichSampleMax;i++)
{
sTrSwitchSample.cSampleCount[i]=0;
}
iOutV=iOutI=0;
cEnvTemp=0;
sTrAdcTeam.cOverTime=0;
sTrAdcTeam.cSelect=0;
sTrAdcTeam.cCount=0;
for(i=0;i<10;i++)
{
sTrAdcTeam.cBuff[i]=0;
}
cA1=cA2=cA3=0;
while(1)
{
cA1=ADDR0_R();
cA2=ADDR0_R();
cA3=ADDR0_R();
if((cA1!=cA2)||(cA2!=cA3)) continue;
cDevAddress=cA1;
break;
}
// iOutISet = 5000;
// iOutVSet = 4800;
iOutISet = 500; // output current 5A 2010-10-25
iOutVSet = 20000; // output voltage 200V
//cPowerStatus=nPWR_OFF;
cPowerStatus=nPWR_ON; // set power on flag when power on.
cPowerAlarmFlag=0;
iPwrDelay=1500;
iFanOffDelay=0xba98;
iOutDelay=0;
cOutOvpOffDelay=0;
iFanAlarmOffDealy=0;
iOipAlmOnDelay=0;
iOipAlmOffDelay=0;
cReceiveFlag=0;
cRecPoint=0;
cSendPoint=0;
cSendLen=0;
cRecLen=0;
cReceiveOverTime=0;
cSendOverTime=0;
cLicenceFlag=0;
cSendRepeat=0;
cChangeVI=0;
iRemoteOnDelay1=0;
iRemoteOnDelay2=0;
cRemoteOnDelay3=0;
cBroadCastCmd=0;
cFanStatus=nFanOff;
iIopAlmFirstDelay=4500;
iFanAlmCheckDelay=0;
iIopAlmCheckDelay=0;
iIopAlmCheckDelay2=0;
iAdjustA=100; // voltage coeff1 2010-10-25
iAdjustB=0; // voltage coeff2
iAdjustC=100; // current coeff1
iAdjustD=0; // current coeff2
EEPROMReadBytes(0x10,cB,8);
if(!(((cB[0]==0xff)&&(cB[1]==0xff))||((cB[2]==0xff)&&(cB[3]==0xff))))
{
iAdjustA=cB[0]*256+cB[1];
iAdjustB=cB[2]*256+cB[3];
}
if(!(((cB[4]==0xff)&&(cB[5]==0xff))||((cB[6]==0xff)&&(cB[7]==0xff))))
{
iAdjustC=cB[4]*256+cB[5];
iAdjustD=cB[6]*256+cB[7];
}
//cPcChangeParaFlag = 0;//如果上位机SU设置了参数,则下位机PU在改变设置(旋转电流电位器)之前,PU按上位机的设置值。
PidInit();
}
/*********************************************************************************************
* 函数名称 :ReceiveOn
* 函数功能 :置接收状态
* 入口参数 :无
* 出口参数 :无
**********************************************************************************************/
void ReceiveOn()
{
uchar i;
for(i=0;i<40;i++) R485EN_L();
}
/*********************************************************************************************
* 函数名称 :SendOn
* 函数功能 :置发送状态
* 入口参数 :无
* 出口参数 :无
**********************************************************************************************/
void SendOn(void)
{
uchar i;
for(i=0;i<40;i++) R485EN_H();
}
/*********************************************************************************************
* 函数名称 :CompareCommand
* 函数功能 :判断命令、长度是否正确,
* 入口参数 :无
* 出口参数 :正确返回1,不正确返回0
**********************************************************************************************/
uchar CompareCommand(void)
{
if(cRecBuff[3]!=0xc8) return(0); //如果单板类型不是电源盒
switch (cRecBuff[4])
{
case nReplyLicence: //注册响应
if(cRecBuff[2]!=4) return(0);
break;
case nGetVersion: //取版本号
if(cRecBuff[2]!=4) return(0);
break;
case nGetAlarm: //获取告警量
if(cRecBuff[2]!=4) return(0);
break;
case nGetAnalog: //获取模拟量
if(cRecBuff[2]!=4) return(0);
break;
case nOnOff: //控制开关机
if(cRecBuff[2]!=6) return(0);
break;
case nGetBarCode: //获取条形码设置结果
if(cRecBuff[2]!=0x2f)return(0);
break;
case nGetSerialNO: //获取条形码
if(cRecBuff[2]!=4) return(0);
break;
case nGetOutSetRes: //获取输出电压电流设置结果
if(cRecBuff[2]!=8) return(0);
break;
case nGetOutPara: //获取输出电压电流设置参数
if(cRecBuff[2]!=4) return(0);
break;
case nGetMkType: //获取模块型号
if(cRecBuff[2]!=4) return(0);
break;
case nSetAdjustV: //设置校准电压系数
if(cRecBuff[2]!=8) return(0);
break;
case nGetAdjustV: //获取校准电压系数
if(cRecBuff[2]!=4) return(0);
break;
case nSetAdjustI: //设置校准电流系数
if(cRecBuff[2]!=8) return(0);
break;
case nGetAdjustI: //获取校准电流系数
if(cRecBuff[2]!=4) return(0);
break;
default:
return(0);
}
return(1);
}
/*********************************************************************************************
* 函数名称 :CopyToSendBuf
* 函数功能 :复制数据到发送缓冲区
* 入口参数 :无
* 出口参数 :无
**********************************************************************************************/
void CopyToSendBuf(void)
{
uchar j,k;
uchar cAddr;
k = cQcmd&0x80;
cQcmd &= 0x7f;
cAddr = ( cSendRepeat? cDevAddress | 0x20: cDevAddress);
switch (cQcmd)
{
case nReplyLicence: //注册请求未得到响应时
cSendBuff[0]=cAddr;
cSendBuff[1]=0;
cSendBuff[2]=13;
cSendBuff[3]=0xC8;
cSendBuff[4]=0x01;
cSendBuff[5]=0xFF;
cSendBuff[6]=0xFF;
cSendBuff[7]=0;
cSendBuff[8]=0;
cSendBuff[9]=nVerMain;
cSendBuff[10]=nVerSlave;
cSendBuff[11]=nVerPcb;
cSendBuff[12]=nVerLogic;
cSendBuff[13]=nYear;
cSendBuff[14]=nMonth;
cSendBuff[15]=nDay;
cSendBuff[16]=0;
for(j=1;j<16;j++)
{
cSendBuff[16]+=cSendBuff[j];
}
cSendLen=17;
cSendPoint=0;
break;
//-------------------------------------------------------
case nGetVersion: //版本信息入发送缓冲区
cSendBuff[0]=cAddr;
cSendBuff[1]=0;
cSendBuff[2]=0x2c;
cSendBuff[3]=0xC8;
cSendBuff[4]=cQcmd;
cSendBuff[5]=cQhandleH;
cSendBuff[6]=cQhandleL;
cSendBuff[7]=0;
cSendBuff[8]=nVerMain;
cSendBuff[9]=nVerSlave;
cSendBuff[10]=nVerPcb;
cSendBuff[11]=nVerLogic;
cSendBuff[12]=nYear;
cSendBuff[13]=nMonth;
cSendBuff[14]=nDay;
for(j=0;j<32;j++) cSendBuff[15+j]=0xff;
cSendBuff[47]=0;
for(j=1;j<47;j++)
{
cSendBuff[47]+=cSendBuff[j];
}
cSendLen=48;
cSendPoint=0;
break;
//-------------------------------------------------------
case nGetAlarm: //告警量信息入发送缓冲区
cSendBuff[0]=cAddr;
cSendBuff[1]=0;
cSendBuff[2]=0x11;
cSendBuff[