⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scom.c

📁 空调控制程序
💻 C
字号:
/**************** (c) 2005   佛山菱电 *****************************************
PROJECT  : AUX VRV
COMPILER : AVR GCC/ICC
MODULE   : scom.c
VERSION  : 1.0.0
DATE     : 2006/01/02
AUTHOR   : 朱坤
DESCRIPTION : 与外机通信(T0)

MODIFICATIONS :
******************************************************************************/
#include "scom.h"
#include "ports.h"
#include "main.h"
#include "fan.h"
#include "adc.h"
#include "pzf.h"

#ifndef EnSTYLE5

const u8 SCom_SM_Tab[] ={0x00,0x03,0x01,0x09};

u8 ScSt0Cnt;           /* 低电平计时 */
u8 ScInHiCnt;          /* 高电平计时 */
u8 * ScByteCnt;        /* 字节计数 */
u8 ScBitCnt;           /* 位计数 */
u8 ScFlag;             /* 标志位 */
#define fScRxOk   7
#define fScTxRxSc 6
#define fScTx     5          /* 1: Tx, 0: Rx  */
#define fScTxLo   4          /* 1: 高电平标志 */

u8 ScBufAdr[14];       /* 缓冲区(14字节) */

/* 发送监控计时, 若内机处于发送状态超时,强制为接收状态 */
u8 ScComTm;
/* 外机通信故障计时 */
u8 ScMonCnt;

/*-----------------------------------------------------------------------------
ROUTINE NAME : TIMB_Int
INPUT/OUTPUT : None

DESCRIPTION  : timer B Interrupt Service Routine

COMMENTS     : 外机收发 0.256mS
-----------------------------------------------------------------------------*/
#ifdef AVRGCC
SIGNAL(SIG_OUTPUT_COMPARE0)
#else
#pragma interrupt_handler TIMB_Int:iv_TIMER0_COMP
void TIMB_Int(void)
#endif
{                                      /* 三型外机通信处理 */
    if (ValBit(ScFlag,fScTx)){         /* 1: 发送 */
      if (ValBit(ScFlag,fScTxLo)){     /* 1: 高电平标志 */
        ClrBit(ScFlag,fScTxLo);
        SetBit(pTx,pbTx);              /* 低电位 */
        if (ValBit(ScFlag,fScTxRxSc)){
          TBOC1HR += 768/32;           /* 0.768 mS */
        } else {
          TBOC1HR += 6400/32;          /* 6.4 mS */
        }
      } else {
        SetBit(ScFlag,fScTxLo);
        ClrBit(pTx,pbTx);              /* 高电位 */
        if (ValBit(ScFlag,fScTxRxSc)){
          if (ScByteCnt == &ScBufAdr[14]) ScFlag = 0;
          if ((u8)(*ScByteCnt & ScBitCnt) == 0){
            OCR0 += 768/32;            /* 0.768 mS */
          } else {
            OCR0 += 3072/32;           /* 3.072 mS */
          }
          if ((ScBitCnt <<= 1) == 0){
            ScBitCnt = 1;
            ScByteCnt++;
          }
        } else {
          OCR0 += 6400/32;             /* 6.4 mS */
          SetBit(ScFlag,fScTxRxSc);
          ScBitCnt = 1;
          ScByteCnt = ScBufAdr;
          ScComTm = 0;                 /* 监控计时 */
        }
      }
    } else {                           /* 0.256mS 三型外机接收 */
      OCR0 += 256/32;                  /* 0.256 mS */
      if (!ValBit(ScFlag,fScRxOk)){    /* 尚未处理,不接收 */
        ClrBit(pTx,pbTx);              /* 准备接收 */
        if (ValBit(pRx,pbRx)||ValBit(pRx,pbRx)){
          ScSt0Cnt = 0;
          if (++ScInHiCnt == 0) ScFlag = 0;
          //++ScInHiCnt;
        } else {
          if (++ScSt0Cnt > 0x12) ScFlag = 0; /* 4.864mS */
          if (ValBit(ScFlag,fScTxRxSc)){
             /* 0.256mS - 4.608mS  */
             if ((ScInHiCnt != 0) && (ScInHiCnt <= 0x12)){
               /* 1.792mS */
               if (ScInHiCnt > 0x07) *ScByteCnt |= ScBitCnt;
               if ((ScBitCnt<<=1) == 0){
                 ScBitCnt = 1;
                 if (ScByteCnt == &ScBufAdr[5]) { /* 接收6字节 */
                   ScFlag = (u8)(1<<fScRxOk);
                 } else {
                   *++ScByteCnt = 0;     /* 准备接收下一个字节 */
                 }
               }
             }
          } else if ((ScInHiCnt >= 0x10) && (ScInHiCnt < 0x23)){
            /* 6.4mS 引导脉冲 4.096mS - 8.96mS */
            SetBit(ScFlag,fScTxRxSc);
            ScBitCnt = 1;
            ScByteCnt = ScBufAdr;
            ScBufAdr[0] = 0;
            ScComTm = 0;
          }
          ScInHiCnt = 0;
        }
      }
    }
}

void Init_TIMB(void)
{
   /* FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 */
   TCCR0 = 0x05;       /* Normal, OC0 Disconnected, 1:256 */
   OCR0 = (u8)(256/32);/* 设置下一次中断时间 0.256 */
   TCNT0 = 0x00;
   //ScFlag = 0;       /* 清除所有标志 */
   UCSRB = 0x00;       /* 禁止 SCI */

   //TIFR = 0x0FF;     /* 清除所有中断 */
   //TIMSK &= (u8)(1 << TOIE0);
   TIMSK |= (u8)(1 << OCIE0);
   //ClrBit(pTx,pbTx); /* 准备接收 */
}

/*-----------------------------------------------------------------------------
;① 室外机→室内机
;室外机给室内机发送3个字节的数据,加反码共6个字节。
;第一字节:室外机故障标志反码;第二字节:室外机故障标志正码
; D0   室外机压缩机排气温度过高   (=0 正常;=1 故障)
; D1   缺氟或换向阀故障           (=0 正常;=1 故障)
; D2   室外机交流输入电流过大     (=0 正常;=1 故障)
; D3   室外机交流输入电流采样异常 (=0 正常;=1 异常)
; D4   室外机直流母线电压异常     (=0 正常;=1 异常)
; D5   室内机总功率过大           (=0 无效;=1 有效)
; D6   室外机传感器故障           (=0 正常;=1 故障)
; D7   室外机变频器模块保护故障   (=0 正常;=1 故障)
;第三字节:室外机状态及故障标志反码,第四字节:室外机状态及故障标志正码
; D0   制热除霜工作状态位       1= 除霜状态    0= 非除霜状态
; D1   制热工作状态             1= 有效        0= 无效
; D2   压缩机启停状态位         1= 启动        0= 停止
; D3   室外风机启停状态位       1= 启动        0= 停止
; D4   允许室内机启动位         1= 允许启动    0= 不允许启动
; D5   保留
; D6   该通道不存在或通讯故障   1= 不存在或故障; 0= 正常
; D7   室外机三次故障停机       1= 故障           0= 正常
;第五字节:膨胀阀开度反码,第六字节:膨胀阀开度正码。
;② 室内机→室外机
;室内机给室外机发送7个字节的数据,加反码共为14个字节。
;第一字节:设定室内温度正码;      第二字节:设定室内温度反码;
;第三字节:实测室内环境温度正码;  第四字节:实测室内环境温度反码;
;第五字节:实测室内机盘管温度正码;第六字节:实测室内机盘管温度反码
;第七字节:命令状态字节正码;      第八字节:命令状态字节反码
;命令状态字内容:
;  D1、D0 = 00  通风或待机状态
; 01  制冷
; 10  保留
; 11  制热
; D2  保留
; D3:除湿状态位 "1"要求除湿,"0" 不要求除湿
; D7、D6、D5、D4  = 1111 系统进入商检状态
;  = 1100 系统进入柜机抽检状态
;  = 1101 系统进入挂机抽检状态
;  = 0001 微风
;  = 0010 低风
;  = 0100 中风
;  = 1000 高风
;第九字节:  实测室内盘管细管温度正码;  第十字节:  实测室内盘管细管温度反码;
;第十一字节:实测室内盘管粗管温度正码;  第十二字节:实测室内盘管粗管温度反码;
;第十三字节:室内机功率(匹)正码;      第十四字节:室内机功率反码。
-----------------------------------------------------------------------------*/
void ScCom_Sub(void)
{
   if (ScMonCnt > 60){              /* 外机通信故障监控计时(秒) */
     SetBit(Errorflg,fSComErr);     /* 外机通信故障 */
     OutSideValve = 0;              /* 关阀 */
   }
   if (ScComTm == 255){             /* 外机通信监控计时 */
     ScFlag = 0;                    /* 清除所有标志 */
     ScComTm = 0;
     ClrBit(pTx,pbTx);              /* 准备接收 */
   }

   if (ValBit(ScFlag,fScRxOk)){     /* 1: 接收Ok */
      if (((ScBufAdr[0]|ScBufAdr[1]) == 0x0FF) &&
          ((ScBufAdr[2]|ScBufAdr[3]) == 0x0FF) &&
          ((ScBufAdr[4]|ScBufAdr[5]) == 0x0FF)){
        ScMonCnt = 0;                /* 与外机通信故障计时 */
        ClrBit(Errorflg,fSComErr);   /* 1:与外机通信故障  */
        OutSideErr[0] = ScBufAdr[1]; /* 外机故障 */
        OutDevStu[0] = ScBufAdr[3];  /* 外机状态 */
        /* 膨胀阀开度 */
        OutSideValve =(u16)(((ScBufAdr[5] > (PZFMAX >> 1))? (PZFMAX >> 1): ScBufAdr[5]) << 1);

        /* 在模式没有发送到外机之前,先清除允许标志 */
        if (!ValBit(Sysflag,fModeflag)){
          ClrBit(OutDevStu[0],fRunEnable);
          ClrBit(OutDevStu[0],fOutDeforst);
        }
        if (ValBit(OutDevStu[0],fRunEnable)) ClrBit(Sysflag2,fRequest);

        ScComTx_Sub();                    /* 准备发送数据 */

        OCR0 += (u8)(0x0FF);             /* 间隔时间(15.3mS) */
        ClrBit(pTx,pbTx);                 /* 发送准备 */
        ScFlag = (1<<fScTx)|(1<<fScTxLo); /* 清除所有标志 */
      }
      ClrBit(ScFlag,fScRxOk);             /* 清除标志 */
   }
}

void ScComTx_Sub(void)                    /* 准备发送数据 */
{
   ScBufAdr[0] =(u8)(SetupTp - 0x80);     /* Ts */

   if (ValBit(Errorflg,fAmbientErr)){
     ScBufAdr[2] = 0x80;                  /* Tr */
   } else {
#ifdef ChigoXG1
     if ((RunMode & MODEMASK) == MODEHEAT){
#ifdef ChigoXG1Set
       ScBufAdr[2] = (u8)(AmbientTp - ChigoXG1Set);
#else
       ScBufAdr[2] = (u8)(AmbientTp - SetOffset);
#endif
     } else {
       ScBufAdr[2] = (u8)(AmbientTp - 0x80);
     }
#else
     ScBufAdr[2] = (u8)(AmbientTp - 0x80);
#endif

     /* 强制运行时,修改设定温度,不处理补偿温度 */
     if (ValBit(Sysflag,fContinue)){
       if ((RunMode & MODEMASK) == MODEHEAT){
         if (AmbientTp > 0x7B){
           ScBufAdr[0] = (u8)(AmbientTp + 0x85);
         } else {
           ScBufAdr[0] = 0x00;    /* Ts = Tr+5 */
         }
       } else if (((RunMode & MODEMASK) == MODECOOL)||
                  ((RunMode & MODEMASK) == MODEDRY)){
         if (AmbientTp > 0x85){
           ScBufAdr[0] = (u8)(AmbientTp + 0x7B);
         } else {
           ScBufAdr[0] = 0x00;    /* Ts = Tr-5 */
           ScBufAdr[2] = 0x05;
         }
       }     }
   }

   /* 盘管中点温度 */
   ScBufAdr[4] = (u8)(ValBit(Errorflg,fTubeMidErr)? 0x80 : TubeMidTp - 0x80);

   /* 内机模式 - 不开机,不发送模式 */
   SetBit(Sysflag,fModeflag);      /* 模式发送标志 */
   ScBufAdr[6] = (u8)(ValBit(RunMode,fSysOn)? SCom_SM_Tab[RunMode & 0x03] : 0);

   /* 盘管入口/出口温度 */
   ScBufAdr[8] = (u8)(ValBit(Errorflg,fTubeInErr)? 0x80 : TubeInTp - 0x80);
   ScBufAdr[10] = (u8)(ValBit(Errorflg,fTubeOutErr)? 0x80 : TubeOutTp - 0x80);

   /* 内机功率 */
   ScBufAdr[12] = (u8)(ValBit(Sysflag,fPower) ? PowerConst : 0);
   if (ValBit(RunMode,fSysOn) && ValBit(Sysflag2,fRequest)){
     ScBufAdr[12] = PowerConst;
     if ((RunMode & MODEMASK) == MODEHEAT){
       ScBufAdr[2] = (u8)(ScBufAdr[0] - 1);   /* Tr = Ts-1 */
     } else if (((RunMode & MODEMASK) == MODECOOL)||
                ((RunMode & MODEMASK) == MODEDRY)){
       ScBufAdr[2] = (u8)(ScBufAdr[0] + 1);   /* Tr = Ts+1 */
     }
   }

   /* 设置反码 */
   ScBufAdr[1] = (u8)(255 - ScBufAdr[0]);
   ScBufAdr[3] = (u8)(255 - ScBufAdr[2]);
   ScBufAdr[5] = (u8)(255 - ScBufAdr[4]);
   ScBufAdr[7] = (u8)(255 - ScBufAdr[6]);
   ScBufAdr[9] = (u8)(255 - ScBufAdr[8]);
   ScBufAdr[11] = (u8)(255 - ScBufAdr[10]);
   ScBufAdr[13] = (u8)(255 - ScBufAdr[12]);
}

#endif

/*** (c) 2005  佛山菱电 **************************** END OF FILE *************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -