设为首页收藏本站

腾控科技论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4542|回复: 8

HB70X HJ212协议实现

[复制链接]
steelen 发表于 2015-1-27 12:22:56 | 显示全部楼层 |阅读模式
在一个仅有8K RAM的16为单片机上实现的HJ212协议
而且得到过非常广泛的应用,下面把代码贴出来,供大家参考这是2007年的产品,好像现在也没有什么用途了



腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:26:03 | 显示全部楼层
#include "cpu.h"
#include "types.h"
#include "const.h"
#include "var.h"
#include "sub.h"
#include <ctype.h>
#include <stdio.h>
#include <string.h>


#define LOGIN_TMR       900


void sio1_led_on(void);
INT16U  seek_day(INT16U year,INT16U day );
INT16U  seek_time (INT16U tmp_pos,INT16U day,INT16U min);

INT16U  cmp_str(INT8U *buf,INT8U *dest, INT16U lenth );
INT16U  read_int ( INT8U *buf,INT8U lenth );
INT16U  read_hex ( INT8U *buf,INT8U lenth );
INT16U  write_int (INT8U *buf,INT16U tmp_data );
INT16U  write_int5(INT8U *buf,INT16U tmp_data );
INT16U write_int3 (INT8U *buf,INT16U tmp_data );
INT16U  write_lenth (INT8U *buf,INT16U tmp_data );
INT16U  write_hex (INT8U *buf,INT16U tmp_data );
FP32 asc_read_float(INT8U *p );
INT8U at45db_rd (INT16U page_adr,\
                 INT16U in_page_adr,\
                 INT8U *buf,\
                 INT16U lenth );
void dc_get_avr( INT8U type );

const INT8U *syscode_tab[]=
{
  "ST=21;",
  "ST=22;",
  "ST=23;",
  "ST=31;",
  "ST=32;",
  "ST=33;",
  "ST=34;",
  "ST=35;",
  "ST=36;",
  "ST=37;",
  "ST=38;",
  "ST=41;",
  "ST=91;"
};
const INT8U *polution_tab[]=
{
"B03",  //0  噪声  单位 DB  N3.1
"L10",  //1  噪声  单位 DB  N3.1
"L5",   //2  噪声  单位 DB  N3.1
"L50",  //3  噪声  单位 DB  N3.1
"L90",  //4  噪声  单位 DB  N3.1
"L95",  //5  噪声  单位 DB  N3.1
"Ld",   //6  噪声  单位 DB  N3.1
"Ldn",  //7  噪声  单位 DB  N3.1
"Leq",  //8  噪声  单位 DB  N3.1
"LMn",  //9  噪声  单位 DB  N3.1
"LMx",  //10 噪声  单位 DB  N3.1
"Ln",   //11 噪声  单位 DB  N3.1
//---------------------------
"S01",  //12  O2含量   废气  %  N3.1
"S02",  //13  烟气流速 米/秒    N5.2
"S03",  //14  烟气温度 摄氏度   N3.1
"S04",  //15  烟气动压 MPa      N4.2
"S05",  //16  烟气湿度  %       N3.1
"S06",  //17  制冷温度  摄氏度   N3.1
"S07",  //18  烟道截面积  M2     N4.2
"S08",  //19   烟气压力   MPa      N4.2
"B02",  //20
//---------------------------
"01",   //21   烟尘      mg/M3    N5.2
"02",   //22   二氧化硫  mg/M3    N5.2
"03",   //23   氮氧化物  mg/M3    N5.3
"04",   //24   一氧化碳  mg/M3    N2.3
"05",   //25   硫化氢    mg/M3    N3.2
"06",   //26   氟化物    mg/M3    N2.3
"07",   //27   氰化物(含氰化氢) mg/M3   N3.3
"08",   //28   氯化氢    mg/M3    N4.3
"09",   //29   沥青烟    mg/M3    N4.3
"10",   //30   氨        mg/M3    N4.3
"11",   //31   氯气      mg/M3    N4.3
"12",   //32   二硫化碳  mg/M3    N4.3
"13",   //33   硫醇      mg/M3    N4.3
"14",   //34   硫酸雾    mg/M3    N4.3
"15",   //35   铬酸雾    mg/M3    N2.4
"16",   //36   苯系物    mg/M3    N4.2
"17",   //37   甲苯      mg/M3    N4.2
"18",   //38   二甲苯    mg/M3    N4.2
"19",   //39   甲醛      mg/M3    N3.3
"20",   //40   苯并(a)芘 mg/M3    N3.6
"21",   //41   苯氨类    mg/M3    N4.3
"22",   //42   硝基苯类  mg/M3    N3.4
"23",   //43   氯苯类    mg/M3    N4.3
"24",   //44   光气      mg/M3    N3.3
"25",   //45   碳氢化合物(含非甲烷总烃) mg/M3   N5.2
"26",   //46   乙醛      mg/M3    N4.3
"27",   //47   酚类      mg/M3    N3.3
"28",   //48   甲醇      mg/M3    N5.2
"29",   //49   氯乙烯    mg/M3    N4.3
"30",   //50   二氧化碳  mg/M3    N4.3
//-------------------------------------------------
"31",   //51   汞及其化合物 mg/M3   N4.4
"32",   //52   铅及其化合物 mg/M3   N2.4
"33",   //53   镉及其化合物 mg/M3   N3.4
"34",   //54   锡及其化合物 mg/M3   N4.3
"35",   //55   镍及其化合物 mg/M3   N3.3
"36",   //56   铍及其化合物 mg/M3   N4.4
"37",   //57   林格曼黑度           N1
"99",   //58   其他污染物
//---------------------------------------------------
"B01",  //59   污水
"001",  //60   PH值                 N2.1
"002",  //61   色度       色度单位  N5.1
"003",  //62   悬浮物     mg/l     N5.1
"010",  //63   生化需氧量(BOD5)   mg/l  N5.1
"011",  //64   化学需氧量(CODcr)  mg/l  N6.1
"015",  //65   总有机碳     mg/l    N3.2
"020",  //66   总汞         mg/l    N2.3
"021",  //67   烷基汞       mg/l    N2.1
"022",  //68   总镉         mg/l    N2.2
"023",  //69   总铬         mg/l    N3.2
"024",  //70   六价铬   mg/l    N2.2
"025",  //71   三价铬   mg/l    N3.2
"026",  //72   总砷     mg/l    N2.2
"027",  //73   总铅     mg/l    N3.2
"028",  //74   总镍     mg/l    N3.2
"029",  //75   总铜     mg/l    N3.2
"030",  //76   总锌     mg/l    N3.2
"031",  //77   总锰     mg/l    N3.2
"032",  //78   总铁     mg/l    N3.2
"033",  //79   总银     mg/l    N2.2
"034",  //80   总铍     mg/l    N2.3
"035",  //81   总硒     mg/l    N2.2
"036",  //82   锡       mg/l    N3.6
"037",  //83   硼       mg/l    N3.6
"038",  //84   钼       mg/l    N3.6
"039",  //85   钡       mg/l    N3.6
"040",  //86   钴       mg/l    N3.6
"041",  //87   铊       mg/l    N3.6
"060",  //88   氨氮     mg/l    N2.3
"061",  //89   有机氮   mg/l    N3.2
"065",  //90   总氮     mg/l    N3.2
"080",  //91   石油类   mg/l    N3.2
"101",  //92   总磷     mg/l    N3.2

"P1",   //93   模拟量1
"P2",   //94   模拟量2
"P3",   //95   模拟量3
"P4",   //96   模拟量4
"P5",   //97   模拟量5
"P6",   //98   模拟量6
"P7",   //99   模拟量7
"P8",   //100   模拟量8
"P9",   //101   模拟量 9
"P10",  //102   模拟量 9
"P11",  //103   模拟量 9
"P12",  //104   模拟量 9
"Pfk",  //105
"###"
};
const INT8U *ext_tab[]=
{
  "-Rtd",
  "-Min",
  "-Avg",
  "-MAx",
  "-ZsRtd",
  "-ZsMax",
  "-ZsAvg",
  "-ZsMax",
  "-Flag",
  "-Cou",
  "SBx-RS",
  "SBx-RT",
  "-Ala",
  "-UpValue",
  "-LowValue",
  "-Data",
  "-DayData",
  "-NightData",
  "-Data"


};

const INT8U *CMD_TAB[]=
{
"ERR",   //0
"QN",    //1
"PNUM",   //2
"PNO",   //3
"ST",    //4
"CN",    //5
"PW",    //6
"MN",    //7
"CP",    //8
"QnRtn",  //9
"Logon",  //10
"ExxRtd",  //11
"RtdInterval",//12
"AlarmTime",  //13
"AlarmType", //14
"ReportTarget",  //15
"PolId",         //16
"BeginTime",     //17
"EndTime",       //18
"DataTime",      //19
"ReportTime",    //20
"DayStdValue",   //21
"NightStdValue",  //22
"Flag",           //23
"OverTime",       //24
"ReCount",        //25
"WarTime",        //26
"CTime",          //27
"NOEXIST"         //28
};


const INT8U mn_number[]=
{
  "MN=73510493500001;"
};
const  INT8U start[]=
{
  "##0000"
};
const INT8U log_on_pack1[]=
{
  "ST=91;CN=9021;"
};
const INT8U log_on_pack2[]=
{
  "Flag=1;CP=&&&&"
};




INT8U  pass_word[11]={"PW=123456;"};

struct {
        INT16U pack_lenth;
        INT8U  qn[25];
        INT8U  mn[20];
        INT16U  st_num;
        INT8U   st[7];
        INT8U  passwd[11];
        INT16U cn_num;
        INT16U flag;
        INT8U  *data;
       } hj212_cmd;

INT16U  hj212_avr_tmr,hj212_real_tmr;
INT16U  hj212_tmr;
INT16U  hj212_di_old;
INT16U  hj212_alt_tmr;
INT8U   hj212_send_state;
INT8U   hj212_logon_cnt;
INT16U  hj212_st_year,hj212_st_day,hj212_st_min;
INT16U  hj212_end_year,hj212_end_day,hj212_end_min;

INT16U tmp_pos, tmp_inpage_adr;
INT16U tmp_end_pos,tmp_end_padr;
INT16U pnum,pno;
INT16U  exe_result;
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:26:32 | 显示全部楼层

void hj212_init( void)
{

  hj212_avr_tmr=  hld_reg[IEC_AVR_TMR];
  hj212_real_tmr =  hld_reg[IEC_REAL_TMR];
  hj212_tmr=60;
  hj212_di_old= di[1];
  hj212_di_old = hj212_di_old *256 +di[0];
  hj212_alt_tmr=0;
  hj212_send_state=0;
}

void set_do ( INT8U *tmp,INT8U num,INT8U value)
{
    switch ( num)
    {
      case '1':
       if ( value ) *tmp |=BIT0;
       else         *tmp &=~BIT0;
      break;

      case '2':
       if ( value ) *tmp |=BIT1;
       else         *tmp &=~BIT1;
      break;

      case '3':
       if ( value ) *tmp |=BIT2;
       else         *tmp &=~BIT2;
      break;

      case '4':
       if ( value ) *tmp |=BIT3;
       else         *tmp &=~BIT3;
      break;

      case '5':
       if ( value ) *tmp |=BIT4;
       else         *tmp &=~BIT4;
      break;

      case '6':
       if ( value ) *tmp |=BIT5;
       else         *tmp &=~BIT5;
      break;

      case '7':
       if ( value ) *tmp |=BIT6;
       else         *tmp &=~BIT6;
      break;

      case '8':
       if ( value ) *tmp |=BIT7;
       else         *tmp &=~BIT7;
      break;

    }
}


const INT8U hj212_auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
} ;

const INT8U  hj212_auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
} ;
INT16U hj212_crc(INT8U *puchMsg , INT16U usDataLen)
{
   INT8U uchCRCHi = 0xFF ;     /* high byte of CRC initialized */
   INT8U uchCRCLo = 0xFF ;     /* low byte of CRC initialized */
   INT16U uIndex ;             /* will index into CRC lookup table */
   if ( usDataLen <=6 ) return 0x0000;
   usDataLen -=6;
   while (usDataLen--)                  /* pass through message buffer */
   {
     uIndex = uchCRCHi ^ *puchMsg++ ;   /* calculate the CRC */
     uchCRCHi = uchCRCLo ^ hj212_auchCRCHi[uIndex];
     uchCRCLo = hj212_auchCRCLo[uIndex] ;
   }
  return (uchCRCHi << 8 | uchCRCLo) ;
}

INT16U hj212_crc_judge( INT8U *p )
{
     INT16U  crc_tmp,crc_tmp2;
     INT16U  utmp;
     INT8U   *pu8,*pu82;

     pu8= p+2;

     while (1)
     {
      if isdigit(*pu8) pu8++;
      else  break;
     }
     pu82=pu8;
     utmp=0;
     while (1)
     {
       utmp++;
       if (*pu8 =='&') break;
       pu8++;
       if ( utmp >=1020) break;
     }
     pu8+=2;
     utmp++;

     while (1)
     {
       utmp ++;
       if (*pu8 =='&') break;
       pu8++;
       if ( utmp >=1020) break;
     }
     utmp++;
     pu8 +=2;
    utmp+=6;
    crc_tmp = read_hex( pu8,4);
    crc_tmp2 = hj212_crc( pu82, utmp );
    if ( crc_tmp == crc_tmp2 ) return 0;
    else  return 0x01;

}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:27:49 | 显示全部楼层

INT16U get_pollion( INT8U *tmp_p )
{
  INT8U **p;
  INT16U tmp;
  tmp=0;
  p= polution_tab;
  while  (1)
  {
    if ( **p=='#') return 0xffff;
    if ( strcmp(tmp_p,*p) == 0 ) return tmp;
    else
    {
      tmp++;
      *p++;
    }

  }


}


INT8U gen_mn_num ( INT8U *point)
{
      INT8U *tmp_src;
      INT8U tmp;
switch (sio1_set )
{
    case 3:
      tmp_src =(INT8U*) mn_number;

      for ( tmp=0;tmp< 3;tmp++)
      {
        *point ++ = *tmp_src++;
      }
      write_int ( point,hld_reg[HJ212_MN_1]);
      point +=4;
      tmp+=4;

      write_int5 ( point,hld_reg[HJ212_MN_2]);
      point +=5;
      tmp+=5;

      write_int5 ( point,hld_reg[IEC104_ADR]);
      point +=5;

      *point =';';
      tmp+=6;
      return tmp;
    break;
    case 4:
      tmp_src =(INT8U*) mn_number;

      for ( tmp=0;tmp< 3;tmp++)
      {
        *point ++ = *tmp_src++;
      }
      tmp_src =(INT8U*) &hld_reg[SHANXI_ASET];
      for ( tmp=0;tmp< 7;tmp++)
      {
        *point ++ = hld_reg[SHANXI_ASET+tmp]/256;
        *point ++ = hld_reg[SHANXI_ASET+tmp]&255;
      }

      *point++ =';';
      tmp= 18;
      return tmp;
   break;
}
}
INT8U gen_qn_num( INT8U *point)
{
  // 在给定的指针位置写入 QN=20YYMMHHMMSSZZZ;

   INT8U tmp;

   tmp=0;
   *point++='Q';tmp++;
   *point++='N';tmp++;
   *point++='=';tmp++;
   *point++='2';tmp++;
   *point++='0';tmp++;

   write_hex ( point, hld_reg[H_YEAR]);
   point +=4;tmp+=4;
   write_hex ( point, hld_reg[H_DAY]);
   point +=4;tmp+=4;
   write_hex ( point, hld_reg[H_MIN]);
   point +=4;tmp+=4;

   //----------------------------------

   write_int3( point,hld_reg[TIME_1MS_L]);
   point+=3;tmp+=3;
   *point++ = ';';tmp++;
   return tmp;
}
// HJ212  SEND AVR DATA
void send_hj212_avr_data(void)
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp,tmp_str_lenth;
  INT8U   *tmp_dest,*tmp_src;
  INT32U   send_ctl;

const INT8U send_avr_data[]=
{
  "CN=2051;"
};
const INT8U send_avr_data2[]=
{
  "CP=&&DataTime="
};

const INT8U avr_tab[]=
{
  "-Avg="
};

const INT8U max_tab[]=
{
  "-Max="
};
const INT8U min_tab[]=
{
  "-Min="
};
const INT8U cou_tab[]=
{
  "-Cou="
};
  dc_get_avr(0);
  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_src = (INT8U*)start;
  for ( tmp=0;tmp <sizeof(start)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }    // "##0000"
  tmp_lenth+=tmp;
  tmp_src = (INT8U *)syscode_tab[hld_reg[HJ212_SYSCODE]];
  tmp_str_lenth =strlen(tmp_src);
  for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
       {
        *tmp_dest++ = *tmp_src++;
       }
       tmp_lenth += tmp;


  tmp_src=(INT8U*)send_avr_data;
  for ( tmp=0;tmp <sizeof(send_avr_data)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }  //"CN=2011;"
  tmp_lenth+=tmp;

  tmp_src= pass_word;
  for ( tmp=0;tmp <sizeof(pass_word)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }  // "PW=123456"
  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest +=tmp;
  tmp_lenth+=tmp;  //"MN=8s8s787000"

  tmp_src=(INT8U*) send_avr_data2;
  for ( tmp=0;tmp <sizeof(send_avr_data2)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }
  tmp_lenth+=tmp;  //"CP=&&DataTime="

   *tmp_dest++='2';tmp_lenth++;
   *tmp_dest++='0';tmp_lenth++;

   write_hex ( tmp_dest, hld_reg[H_YEAR]);
   tmp_dest +=4;tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_DAY]);
   tmp_dest +=4;tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_MIN]);
   tmp_dest +=4;tmp_lenth+=4;
   *tmp_dest++=';'; tmp_lenth++; //"20yymmddhhmmss;"


   send_ctl= hld_reg[IEC_CTL2];
   send_ctl= send_ctl *65536L +hld_reg[IEC_CTL1];


   for ( tmp_crc=0;tmp_crc<32;tmp_crc++ )
   {
     if ( (send_ctl & 1L) && (hld_reg[IEC_SEND_NUM +tmp_crc] & 0x8000)  )
     {
       //--------avr
       if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x800) _NOP();
       else
       {
         tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

         tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)avr_tab;
         for ( tmp=0;tmp <sizeof(avr_tab)-1;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;

         tmp= sprintf(tmp_dest,"%.2f,",avr_data[tmp_crc]);
         tmp_dest  +=tmp;
         tmp_lenth += tmp;
       }
       //-----------------------------max
       if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x2000) _NOP();
       else
       {
          tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

          tmp_str_lenth =strlen(tmp_src);
          for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
           *tmp_dest++ = *tmp_src++;
          }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)max_tab;
         for ( tmp=0;tmp <sizeof(max_tab)-1;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
          }
        tmp_lenth += tmp;

        tmp= sprintf(tmp_dest,"%.2f,",max_data[tmp_crc]);
        tmp_dest  +=tmp;
        tmp_lenth += tmp;
       }
      //--------------------------------min----------
       if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x1000) _NOP();
       else
       {
          tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

          tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
           *tmp_dest++ = *tmp_src++;
          }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)min_tab;
         for ( tmp=0;tmp <sizeof(min_tab)-1;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
        tmp_lenth += tmp;

         tmp= sprintf(tmp_dest,"%.2f,",min_data[tmp_crc]);
         tmp_dest  +=tmp;
         tmp_lenth += tmp;
       }
       //COU------------------------------------------------

        if ( hld_reg[COU1_VAR1+tmp_crc*5]& 0xff00 )
         {
         tmp_src = (INT8U *)(INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];
         tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
         {
        *tmp_dest++ = *tmp_src++;
         }

        tmp_lenth += tmp;

        tmp_src = (INT8U *)cou_tab;
        for ( tmp=0;tmp <sizeof(cou_tab)-1;tmp ++)
         {
        *tmp_dest++ = *tmp_src++;
         }
        tmp_lenth += tmp;

        tmp= sprintf(tmp_dest,"%.2f;",cou_data[tmp_crc]);
        tmp_dest  +=tmp;
        tmp_lenth += tmp;

       }

     }
     *(tmp_dest-1)=';';
     send_ctl >>=1;
   }

   send_ctl= hld_reg[IEC_CTL2];
   send_ctl= send_ctl *65536L +hld_reg[IEC_CTL1];


   for ( tmp_crc=0;tmp_crc<32;tmp_crc++ )
   {
     if ( (send_ctl & 1L)  )
     {
       //--------avr
      if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x8000) _NOP();

      else
      {
       if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x800) _NOP();
       else
       {
         tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

         tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)avr_tab;
         for ( tmp=0;tmp <sizeof(avr_tab)-1;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;

         tmp= sprintf(tmp_dest,"%.2f,",avr_data[tmp_crc]);
         tmp_dest  +=tmp;
         tmp_lenth += tmp;
       }
       //-----------------------------max
       if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x2000) _NOP();
       else
       {
          tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

          tmp_str_lenth =strlen(tmp_src);
          for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
           *tmp_dest++ = *tmp_src++;
          }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)max_tab;
         for ( tmp=0;tmp <sizeof(max_tab)-1;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
          }
        tmp_lenth += tmp;

        tmp= sprintf(tmp_dest,"%.2f,",max_data[tmp_crc]);
        tmp_dest  +=tmp;
        tmp_lenth += tmp;
       }
      //--------------------------------min----------
       if( hld_reg[IEC_SEND_NUM +tmp_crc] & 0x1000) _NOP();
       else
       {
          tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

          tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
           *tmp_dest++ = *tmp_src++;
          }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)min_tab;
         for ( tmp=0;tmp <sizeof(min_tab)-1;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
        tmp_lenth += tmp;

         tmp= sprintf(tmp_dest,"%.2f,",min_data[tmp_crc]);
         tmp_dest  +=tmp;
         tmp_lenth += tmp;
       }
       //COU------------------------------------------------

        if ( hld_reg[COU1_VAR1+tmp_crc*5]& 0xff00 )
         {
         tmp_src = (INT8U *)(INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];
         tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
         {
        *tmp_dest++ = *tmp_src++;
         }

        tmp_lenth += tmp;

        tmp_src = (INT8U *)cou_tab;
        for ( tmp=0;tmp <sizeof(cou_tab)-1;tmp ++)
         {
        *tmp_dest++ = *tmp_src++;
         }
        tmp_lenth += tmp;

        tmp= sprintf(tmp_dest,"%.2f;",cou_data[tmp_crc]);
        tmp_dest  +=tmp;
        tmp_lenth += tmp;

       }
      }
     }
     *(tmp_dest-1)=';';
     send_ctl >>=1;
   }




  *(tmp_dest-1) ='&';
  *tmp_dest++ ='&';tmp_lenth++;

  write_int(  &sio1_buf[2],tmp_lenth-6);
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

  dc_get_avr(0);


}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:28:46 | 显示全部楼层
// HJ212  SEND REAL DATA
void send_hj212_real_data(void)
{

  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp,tmp_str_lenth;
  INT8U   *tmp_dest,*tmp_src;
  INT32U   send_ctl;


const INT8U send_real_data[]=
{
  "CN=2011;"
};
const INT8U send_real_data2[]=
{
  "CP=&&DataTime="
};
const INT8U rtd_tab[]=
{
  "-Rtd="
};

const INT8U flag_tab[]=
{
  "-Flag=N;"
};

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_src = (INT8U*)start;
  for ( tmp=0;tmp <sizeof(start)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }    // "##0000"
  tmp_lenth+=tmp;
  tmp_src = (INT8U *)syscode_tab[hld_reg[HJ212_SYSCODE]];
  tmp_str_lenth =strlen(tmp_src);
  for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
       {
        *tmp_dest++ = *tmp_src++;
       }
       tmp_lenth += tmp;


  tmp_src=(INT8U*)send_real_data;
  for ( tmp=0;tmp <sizeof(send_real_data)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }  //"CN=2011;"
  tmp_lenth+=tmp;

  tmp_src= pass_word;
  for ( tmp=0;tmp <sizeof(pass_word)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }  // "PW=123456"
  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest +=tmp;
  tmp_lenth+=tmp;  //"MN=8s8s787000"

  tmp_src=(INT8U*) send_real_data2;
  for ( tmp=0;tmp <sizeof(send_real_data2)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }
  tmp_lenth+=tmp;  //"CP=&&DataTime="

   *tmp_dest++='2';tmp_lenth++;
   *tmp_dest++='0';tmp_lenth++;

   write_hex ( tmp_dest, hld_reg[H_YEAR]);
   tmp_dest +=4;tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_DAY]);
   tmp_dest +=4;tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_MIN]);
   tmp_dest +=4;tmp_lenth+=4;
   *tmp_dest++=';'; tmp_lenth++; //"20yymmddhhmmss;"


   send_ctl= hld_reg[IEC_CTL2];
   send_ctl= send_ctl *65536L +hld_reg[IEC_CTL1];

   for ( tmp_crc=0;tmp_crc<32;tmp_crc++ )
   {
     if ( send_ctl & 1L )
     {
       //----rtd----

       if ( hld_reg[IEC_SEND_NUM +tmp_crc] &0x8000)

       {
          tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

          tmp_str_lenth =strlen(tmp_src);
          for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
          *tmp_dest++ = *tmp_src++;
           }
           tmp_lenth += tmp;

          tmp_src = (INT8U *)rtd_tab;
          for ( tmp=0;tmp <sizeof(rtd_tab)-1;tmp ++)
            {
            *tmp_dest++ = *tmp_src++;
             }
          tmp_lenth += tmp;

          tmp= sprintf(tmp_dest,"%.2f,",float_data[tmp_crc]);
          tmp_dest  +=tmp;
          tmp_lenth += tmp;

        if (  hld_reg[IEC_SEND_NUM +tmp_crc]  &0x4000) _NOP();
        else
        {
          tmp_src =(INT8U *) polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];
          tmp_str_lenth =strlen(tmp_src);
          for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
          *tmp_dest++ = *tmp_src++;
          }
          tmp_lenth += tmp;
          tmp_src =(INT8U *) flag_tab;
          for ( tmp=0;tmp <sizeof(flag_tab)-1;tmp ++)
          {
          *tmp_dest++ = *tmp_src++;
          }
         tmp_lenth += tmp;
        }
       }
     }
     *(tmp_dest-1) = ';';
     send_ctl >>=1;
   }
   send_ctl= hld_reg[IEC_CTL2];
   send_ctl= send_ctl *65536L +hld_reg[IEC_CTL1];
   for ( tmp_crc=0;tmp_crc<32;tmp_crc++ )
   {
     if ( send_ctl & 1L )
     {
       //----rtd----
       if (hld_reg[IEC_SEND_NUM +tmp_crc]  &0x8000) _NOP();
       else
       {
         tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

         tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
         {
          *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;

         tmp_src = (INT8U *)rtd_tab;
         for ( tmp=0;tmp <sizeof(rtd_tab)-1;tmp ++)
         {
         *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;

         tmp= sprintf(tmp_dest,"%.2f,",float_data[tmp_crc]);
         tmp_dest  +=tmp;
         tmp_lenth += tmp;
       //------------flag
        if (  hld_reg[IEC_SEND_NUM +tmp_crc]  &0x4000) _NOP();
        else
        {
          tmp_src =(INT8U *) polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];
          tmp_str_lenth =strlen(tmp_src);
          for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
          {
          *tmp_dest++ = *tmp_src++;
          }
          tmp_lenth += tmp;
          tmp_src =(INT8U *) flag_tab;
          for ( tmp=0;tmp <sizeof(flag_tab)-1;tmp ++)
          {
          *tmp_dest++ = *tmp_src++;
          }
         tmp_lenth += tmp;
        }
       }
     }
     *(tmp_dest-1) = ';';
     send_ctl >>=1;
   }

  if ( hld_reg[HJ212_DIO_CTL] )
   {
     tmp_crc= di[1];
     tmp_crc = tmp_crc *256 +di[0];
     tmp=sprintf(tmp_dest,"DI=%x;DO=%x;",tmp_crc,do_out[0]);
     tmp_lenth += tmp;
     tmp_dest  += tmp;
   }


  *(tmp_dest-1) ='&';
  *tmp_dest++ ='&';tmp_lenth++;

  write_int(  &sio1_buf[2],tmp_lenth-6 );
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:29:39 | 显示全部楼层
// HJ212 LOGIN
void send_hj212_login(void)
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_src = (INT8U*)start;
  for ( tmp=0;tmp <sizeof(start)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }
  tmp_lenth+=tmp;
  tmp = gen_qn_num( tmp_dest);
  tmp_dest +=tmp;
  tmp_lenth+=tmp;

  tmp_src=(INT8U*)log_on_pack1;
  for ( tmp=0;tmp <sizeof(log_on_pack1)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }
  tmp_lenth+=tmp;

  tmp_src= pass_word;
  for ( tmp=0;tmp <sizeof(pass_word)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }
  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest +=tmp;
  tmp_lenth+=tmp;

  tmp_src=(INT8U*)log_on_pack2;
  for ( tmp=0;tmp <sizeof(log_on_pack2)-1;tmp ++)
  {
    *tmp_dest++ = *tmp_src++;
  }
  tmp_lenth+=tmp;
  write_int(  &sio1_buf[2],tmp_lenth -6);
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

}

// HJ212  exe
void  send_hj212_exe( void)
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"ST=91;CN=9011;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"Flag=0;CP=&&%sQnRtn=1&&",hj212_cmd.qn);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  write_int(  &sio1_buf[2],tmp_lenth-6 );
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];
}

//hj212_result
void send_hj212_result( void)
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"ST=91;CN=9012;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CP=&&%sExeRtn=1&&",hj212_cmd.qn);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  write_int(  &sio1_buf[2],tmp_lenth-6 );
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];
}

void send_hj212err_result( void)
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;

  for(tmp=0;tmp<sizeof(pass_word)-1;tmp++)
  {
    pass_word[tmp]= hj212_cmd.passwd[tmp];
  }
  pass_word[tmp]=0x0;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"ST=91;CN=9012;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CP=&&%sExeRtn=0&&",hj212_cmd.qn);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  write_int(  &sio1_buf[2],tmp_lenth-6 );
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];
}

void send_time( void )
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;


  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"%s",syscode_tab[hld_reg[HJ212_SYSCODE]]);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CN=1011;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CP=&&%sSystemTime=20",hj212_cmd.qn);
  tmp_dest += tmp;  tmp_lenth+=tmp;

   write_hex ( tmp_dest, hld_reg[H_YEAR]);
   tmp_dest+=4; tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_DAY]);
   tmp_dest+=4; tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_MIN]);
   tmp_dest+=4; tmp_lenth+=4;

   *tmp_dest ++='&'; *tmp_dest ++='&';
   tmp_lenth+=2;

  write_int(  &sio1_buf[2],tmp_lenth-6);
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

}

void send_interval( void )
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;


  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"%s",syscode_tab[hld_reg[HJ212_SYSCODE]]);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CN=1061;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CP=&&%s",hj212_cmd.qn);
  tmp_dest += tmp;  tmp_lenth+=tmp;
  tmp=sprintf(tmp_dest,"RtdInterval=%u",hld_reg[IEC_REAL_TMR]);
  tmp_dest += tmp;  tmp_lenth+=tmp;

   *tmp_dest ++='&'; *tmp_dest ++='&';
   tmp_lenth+=2;

  write_int(  &sio1_buf[2],tmp_lenth-6 );
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

}
//-----------------------------------------------------------


//-----------------------------------------------------------
send_hj212_di_state (void)
{
  INT16U  tmp_lenth,tmp_crc;
  INT16U   tmp;
  INT8U   *tmp_dest,*tmp_src;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_qn_num( tmp_dest );
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp_src = (INT8U *)syscode_tab[hld_reg[HJ212_SYSCODE]];

  tmp=sprintf(tmp_dest,"%sCN=2011;",tmp_src);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"%s",pass_word);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"Flag=0;CP=&&DataTime=");
  tmp_dest += tmp;  tmp_lenth+=tmp;

   *tmp_dest++='2';tmp_lenth++;
   *tmp_dest++='0';tmp_lenth++;

   write_hex ( tmp_dest, hld_reg[H_YEAR]);
   tmp_dest +=4;tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_DAY]);
   tmp_dest +=4;tmp_lenth+=4;
   write_hex ( tmp_dest, hld_reg[H_MIN]);
   tmp_dest +=4;tmp_lenth+=4;
   *tmp_dest++=';'; tmp_lenth++; //"20yymmddhhmmss;"

  tmp=sprintf(tmp_dest,"DI=%x&&",hj212_di_old);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  write_int(  &sio1_buf[2],tmp_lenth -6);
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

}



INT8U send_min_hisdata( void)
{
// INT16U tmp_pos, tmp_inpage_adr;
// INT16U tmp_end_pos,tmp_end_padr;

  INT16U tmp_lenth,tmp,tmp_result,tmp_crc;
  INT32U tmp_32u,send_ctl;
  INT8U  tmp_buf[BYTE_PER_REC+1],tmp_str_lenth;
  INT8U  *tmp_dest,*tmp_src;
  union {
          FP32  fvalue;
          INT8U cvalue[4];
         } value;


  at45db_rd (tmp_pos,tmp_inpage_adr,tmp_buf,BYTE_PER_REC );

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"%s",syscode_tab[hld_reg[HJ212_SYSCODE]]);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CN=2051;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  if ( pnum!=0 )
  {
   tmp=sprintf(tmp_dest,"NO=%dNUM=%d;",pno,pnum);
   tmp_dest += tmp;  tmp_lenth+=tmp;
  }

  tmp=sprintf(tmp_dest,"CP=&&DataTime=20");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp_result = tmp_buf[0];
  tmp_result = tmp_result *256+tmp_buf[1];
  write_hex ( tmp_dest, tmp_result);
  tmp_dest +=4;tmp_lenth+=4;  //year month

  tmp_result = tmp_buf[2];
  tmp_result = tmp_result *256+tmp_buf[3];
  write_hex ( tmp_dest, tmp_result);
  tmp_dest +=4;tmp_lenth+=4;  //day hour

  tmp_result = tmp_buf[4];
  tmp_result = tmp_result *256+tmp_buf[5];
  write_hex ( tmp_dest, tmp_result);
  tmp_dest +=4;tmp_lenth+=4; // min second

  tmp_32u =tmp_buf[8];
  tmp_32u = tmp_32u* 256L+ tmp_buf[7];
  tmp_32u = tmp_32u* 256L+ tmp_buf[6];

  tmp=sprintf(tmp_dest,";DI=%X;DO=%X;",tmp_32u,tmp_buf[9]);
  tmp_dest += tmp;  tmp_lenth+=tmp;


  send_ctl= hld_reg[IEC_CTL2];
  send_ctl= send_ctl *65536L +hld_reg[IEC_CTL1];
  tmp_result =0;

   for ( tmp_crc=0;tmp_crc<32;tmp_crc++ )
   {
     if ( send_ctl & 1L )
     {

       //--------avr
       tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];

       tmp_str_lenth =strlen(tmp_src);
       for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
       {
        *tmp_dest++ = *tmp_src++;
       }
       tmp_lenth += tmp;

       tmp=sprintf(tmp_dest,"-Avg=");
       tmp_dest += tmp;  tmp_lenth+=tmp;

       value.cvalue[0]= tmp_buf[tmp_result*8+10];
       value.cvalue[1]= tmp_buf[tmp_result*8+11];
       value.cvalue[2]= tmp_buf[tmp_result*8+12];
       value.cvalue[3]= tmp_buf[tmp_result*8+13];
       tmp= sprintf(tmp_dest,"%.2f",value.fvalue);
       tmp_dest  +=tmp;
       tmp_lenth += tmp;

      if ( hld_reg[COU1_VAR1+tmp_crc*5]& 0x8000 )
       { *tmp_dest++ =',';
         tmp_lenth++;
         tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +tmp_crc]&0xff];
         tmp_str_lenth =strlen(tmp_src);
         for ( tmp=0;tmp <tmp_str_lenth;tmp ++)
         {
           *tmp_dest++ = *tmp_src++;
         }
         tmp_lenth += tmp;


         tmp=sprintf(tmp_dest,"-Cou=");
         tmp_dest += tmp;  tmp_lenth+=tmp;

         value.cvalue[0]= tmp_buf[tmp_result*8+14];
         value.cvalue[1]= tmp_buf[tmp_result*8+15];
         value.cvalue[2]= tmp_buf[tmp_result*8+16];
         value.cvalue[3]= tmp_buf[tmp_result*8+17];
         tmp= sprintf(tmp_dest,"%.2f;",value.fvalue);
         tmp_dest  +=tmp;
         tmp_lenth += tmp;
      }
      else
      {
         *tmp_dest++ =';';
         tmp_lenth++;
      }
      tmp_result++;
     }
     send_ctl >>=1;

   }

  tmp=sprintf(tmp_dest-1,"&&");
  tmp_dest += (tmp-1);  tmp_lenth+=(tmp-1);

  write_int(  &sio1_buf[2],tmp_lenth -6);
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

  tmp_inpage_adr += BYTE_PER_REC;
  if ( tmp_inpage_adr>=BYTE_PER_PAGE)
  {
    tmp_inpage_adr=0;
    tmp_pos +=1;
  }
  pno++;
  if ( pno> pnum ) return 0xff;
  else return 0;

}

void hj212_alarm(void)
{
   INT8U cnt,alarm_tmp;
   INT32U send_ctl;
   FP32  ftmp;
   INT16U  tmp_lenth,tmp_crc;
   INT16U   tmp;
   INT8U   *tmp_dest,*tmp_src;

   send_ctl= hld_reg[IEC_CTL2];
   send_ctl= send_ctl *65536L +hld_reg[IEC_CTL1];
   alarm_tmp=0;

   for ( cnt=0;cnt<32;cnt++ )
   {
     if ( (send_ctl & 1L)&&(  hld_reg[ALARM1+3*cnt] & BITF) )
     {
        switch (  hld_reg[ALARM1+3*cnt] & 0x000f)
        {
          case 0:
            alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
            ftmp= hld_reg[ALARM1_DOWN+3*cnt];
            if (  float_data[cnt] < ftmp)  hld_reg[ALARM1+3*cnt]+=1;
            ftmp= hld_reg[ALARM1_UP+3*cnt];
            if ( float_data[cnt] > ftmp)  hld_reg[ALARM1+3*cnt] +=8;
          break;

          case 1:
            ftmp= hld_reg[ALARM1_DOWN+3*cnt];
            if (  float_data[cnt] < ftmp)
             {
               if ( alarm_tmr[cnt]==1)
               {
                 alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
                 hld_reg[ALARM1+3*cnt]+=1; alarm_tmp=1;
               }
               else alarm_tmr[cnt]--;
             }
            else hld_reg[ALARM1+3*cnt] &=0xfff0;
          break;

        case 2:     //这个状态是等待状态,只有等到发送报警事件才改变
            _NOP();  //低限报警触发
            alarm_tmp=1;
        break;

        case 3:
            ftmp= hld_reg[ALARM1_DOWN+3*cnt];
            if (  float_data[cnt] > ftmp)
             {
                 alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
                 hld_reg[ALARM1+3*cnt]+=1;
              }


        break;

        case 4:
           ftmp= hld_reg[ALARM1_DOWN+3*cnt];
            if (  float_data[cnt] > ftmp)
             {
               if ( alarm_tmr[cnt]==1)
               {
                 alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
                 hld_reg[ALARM1+3*cnt]+=1; alarm_tmp=1;
               }
               else alarm_tmr[cnt]--;
             }
            else alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
        break;

        case 5://这个状态是等待状态,只有等到发送报警事件才改变
          _NOP();   //低限报警恢复
          alarm_tmp=1;
        break;

        case 6:
           alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
           hld_reg[ALARM1+3*cnt] &=0xfff0;
        break;

        case 8:
          ftmp= hld_reg[ALARM1_UP+3*cnt];
            if (  float_data[cnt] > ftmp)
             {
               if ( alarm_tmr[cnt]==1)
               {
                 alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
                 hld_reg[ALARM1+3*cnt]+=1; alarm_tmp=1;
               }
               else alarm_tmr[cnt]--;
             }
            else hld_reg[ALARM1+3*cnt] &=0xfff0;
        break;

        case 9://这个状态是等待状态,只有等到发送报警事件才改变
          _NOP();// 高限报警触发
          alarm_tmp=1;
        break;

        case 10:
           ftmp= hld_reg[ALARM1_UP+3*cnt];
           if (  float_data[cnt] < ftmp)
             {
                 alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
                 hld_reg[ALARM1+3*cnt]+=1;
              }
        break;

        case 11:
          ftmp= hld_reg[ALARM1_UP+3*cnt];
          if (  float_data[cnt] < ftmp)
           {
               if ( alarm_tmr[cnt]==1)
               {
                 alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
                 hld_reg[ALARM1+3*cnt]+=1; alarm_tmp=1;
               }
               else alarm_tmr[cnt]--;
          }
          else alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
        break;

        case 12://这个状态是等待状态,只有等到发送报警事件才改变
        _NOP();  //高限报警恢复
        alarm_tmp=1;
          break;

        case 13:
           alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
           hld_reg[ALARM1+3*cnt] &=0xfff0;
        break;

        default:
          alarm_tmr[cnt]= hld_reg[HJ212_ALARM_TMR];
          hld_reg[ALARM1+3*cnt] &=0xfff0;
        break;
        }
     }

     send_ctl >>=1;
   }

if ( alarm_tmp &&hj212_alt_tmr==0)
{
       //发送报警数据
      hj212_alt_tmr +=3;

      tmp_lenth =0;
      tmp_dest=sio1_buf;

      tmp=sprintf(tmp_dest,"##0000");
      tmp_dest += tmp;  tmp_lenth+=tmp;

      tmp = gen_qn_num( tmp_dest );
      tmp_dest += tmp;  tmp_lenth+=tmp;

      tmp_src = (INT8U *)syscode_tab[hld_reg[HJ212_SYSCODE]];

      tmp=sprintf(tmp_dest,"%sCN=2072;",tmp_src);
      tmp_dest += tmp;  tmp_lenth+=tmp;

      tmp=sprintf(tmp_dest,"%s",pass_word);
      tmp_dest += tmp;  tmp_lenth+=tmp;

      tmp = gen_mn_num( tmp_dest);
      tmp_dest += tmp;  tmp_lenth+=tmp;

     tmp=sprintf(tmp_dest,"Flag=0;CP=&&AlarmTime=");
     tmp_dest += tmp;  tmp_lenth+=tmp;

     *tmp_dest++='2';tmp_lenth++;
     *tmp_dest++='0';tmp_lenth++;

     write_hex ( tmp_dest, hld_reg[H_YEAR]);
     tmp_dest +=4;tmp_lenth+=4;
     write_hex ( tmp_dest, hld_reg[H_DAY]);
     tmp_dest +=4;tmp_lenth+=4;
     write_hex ( tmp_dest, hld_reg[H_MIN]);
     tmp_dest +=4;tmp_lenth+=4;
     *tmp_dest++=';'; tmp_lenth++; //"20yymmddhhmmss;"

      for ( cnt=0;cnt<32;cnt++ )
      {
         switch ( hld_reg[ALARM1+3*cnt] &0xf)
         {
          case 2:
            tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +cnt]&0xff];
            tmp=sprintf(tmp_dest,"%s-Ala=%.2f,AlarmType=1;",tmp_src,float_data[cnt]);
            tmp_dest += tmp;  tmp_lenth+=tmp;
            hld_reg[ALARM1+3*cnt]+=1;
          break;

          case 5:
            tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +cnt]&0xff];
            tmp=sprintf(tmp_dest,"%s-Ala=%.2f,AlarmType=0;",tmp_src,float_data[cnt]);
            tmp_dest += tmp;  tmp_lenth+=tmp;
            hld_reg[ALARM1+3*cnt]+=1;
          break;

          case 9:
            tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +cnt]&0xff];
            tmp=sprintf(tmp_dest,"%s-Ala=%.2f,AlarmType=1;",tmp_src,float_data[cnt]);
            tmp_dest += tmp;  tmp_lenth+=tmp;
            hld_reg[ALARM1+3*cnt]+=1;
          break;

          case 12:
             tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +cnt]&0xff];
            tmp=sprintf(tmp_dest,"%s-Ala=%.2f,AlarmType=0;",tmp_src,float_data[cnt]);
            tmp_dest += tmp;  tmp_lenth+=tmp;
            hld_reg[ALARM1+3*cnt]+=1;
          break;

         }


      }

  *(tmp_dest-1) ='&';
  *tmp_dest++ ='&';tmp_lenth++;

  write_int(  &sio1_buf[2],tmp_lenth -6);
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];
  }
}
void hj212_send_limit(void)
{
   FP32  ftmp;
   INT16U  tmp_lenth,tmp_crc;
   INT16U   tmp;
   INT8U   *tmp_dest,*tmp_src,cnt;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp_lenth =0;
  tmp_dest=sio1_buf;

  tmp=sprintf(tmp_dest,"##0000");
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"%s",syscode_tab[hld_reg[HJ212_SYSCODE]]);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CN=1021;%s",pass_word);
   tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp = gen_mn_num( tmp_dest);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  tmp=sprintf(tmp_dest,"CP=&&%s",hj212_cmd.qn);
  tmp_dest += tmp;  tmp_lenth+=tmp;

  for (cnt=0;cnt<32;cnt++)
  {
      if ( hld_reg[ALARM1+3*cnt] &BIT4 )
      {
        hld_reg[ALARM1+3*cnt] &=~BIT4;
        tmp_src = (INT8U *)polution_tab[hld_reg[IEC_SEND_NUM +cnt]&0xff];

        ftmp= hld_reg[ALARM1_DOWN+3*cnt];
        tmp= sprintf(tmp_dest,"%s-LowValue=%.2f,",tmp_src,ftmp);
        tmp_dest += tmp;  tmp_lenth+=tmp;

        ftmp= hld_reg[ALARM1_UP+3*cnt];
        tmp= sprintf(tmp_dest,"%s-UpValue=%.2f;",tmp_src,ftmp);
        tmp_dest += tmp;  tmp_lenth+=tmp;
      }
  }

   *(tmp_dest-1)='&'; *tmp_dest ++='&';
   tmp_lenth+=1;

  write_int(  &sio1_buf[2],tmp_lenth-6 );
  tmp_crc=hj212_crc ( &sio1_buf[6],tmp_lenth );
  write_hex( tmp_dest,tmp_crc);
  tmp_dest+=4;
  *tmp_dest++ =0x0d;
  *tmp_dest =0x0a;
  com1_tr();
  sio1_led_on();
  sio1_tx_lenth =0;
  sio1_tx_lenth2=tmp_lenth +6;
  UCA0TXBUF= sio1_buf[0];

}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:30:49 | 显示全部楼层

void  hj212_tmr_proc(void)
{
  static  INT16U ts1_tmr =0;
  static  INT8U  di_cnt=5;

  INT16U    tmp_val;
  INT8U     tmp;
  if (  protocol_tmr )
  { _DINT();
    tmp_val=protocol_tmr;
    protocol_tmr=0;
   _EINT();
   ts1_tmr += tmp_val;
  }

  if ( ts1_tmr >=100)
  {  ts1_tmr -=100;

     if ( hj212_avr_tmr )
     {
       hj212_avr_tmr --;
     }

     if ( hj212_real_tmr )
     {
        hj212_real_tmr --;
     }

     if ( hj212_tmr )
     {
       hj212_tmr--;
     }
     else hj212_tmr=LOGIN_TMR;

     if ( hj212_alt_tmr )
     {
       hj212_alt_tmr--;
     }



#define HJ212_INIT    0

#define HJ212_COMMON  1

#define HJ212_SET_PASSWD 10
#define HJ212_RD_TIME    20
#define HJ212_SET_TIME   30
#define HJ212_SEND_REALDATA 40
#define HJ212_SEND_AVRDATA  50
#define  HJ212_RD_INTERVAL  60
#define  HJ212_SET_INTERVAL 70

#define HJ212_SEND1_HISDATA     80
#define HJ212_SENDMIN_HISDATA   90
#define HJ212_SENDHOUR_HISDATA  100
#define HJ212_SENDDAY_HISDATA   110
#define HJ212_SEND_3012         120

#define HJ212_WARN_TIME         130
#define HJ212_RD_LIMIT          140

#define HJ212_SET_DO            150

  switch ( hj212_send_state)
     {
       case HJ212_INIT:
       hj212_di_old= di[1];
       hj212_di_old = hj212_di_old *256 +di[0];
       if ( hj212_alt_tmr ==0 && hj212_tmr ==0 )
        {
         hj212_alt_tmr +=2;
         hj212_send_state=HJ212_COMMON;
         send_hj212_login();
         hj212_logon_cnt=0;
         hj212_tmr = LOGIN_TMR;
        }
       break;

     case HJ212_COMMON:
       tmp_val= di[1];
       tmp_val =tmp_val *256 +di[0];

      if ( tmp_val ^  hj212_di_old)
      {
         if ( hj212_alt_tmr==0  )
         {
           if (di_cnt==0)
           {
              hj212_di_old=tmp_val;
              di_cnt =2;
              hj212_alt_tmr +=2;
              if ( hld_reg[HJ212_DIO_CTL] )
                   send_hj212_di_state();
              else _NOP();
           }
           else di_cnt --;
         }
      }

      if ( hj212_real_tmr == 0 &&  hj212_alt_tmr==0)
      {

         hj212_real_tmr=hld_reg[IEC_REAL_TMR];
         send_hj212_real_data();
         hj212_alt_tmr +=3;
      }

      if ( hj212_alt_tmr ==0 && hj212_avr_tmr==0)
      {
        hj212_avr_tmr=hld_reg[IEC_AVR_TMR];
        send_hj212_avr_data();
        hj212_alt_tmr +=3;
      }

      if ( hj212_alt_tmr ==0 && hj212_tmr ==0 )
        {
         hj212_alt_tmr +=3;
         hj212_logon_cnt ++;
         send_hj212_login();
        }

      hj212_alarm();
     // hj212_trans();
     break;

     case HJ212_SET_PASSWD:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_PASSWD+1:
       if ( hj212_alt_tmr == 0)
       {
        for(tmp=0;tmp<sizeof(pass_word)-2;tmp++)
            {
             pass_word[tmp]= hj212_cmd.passwd[tmp];
            }
        pass_word[tmp++]=';';
        pass_word[tmp]=0x0;
        send_hj212_result();

        hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_RD_TIME:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_RD_TIME+1:
       if ( hj212_alt_tmr == 0)
       {
         send_time();
         hj212_send_state++;
         hj212_alt_tmr +=3;
       }
     break;

      case HJ212_RD_TIME+2:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_TIME:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SET_TIME+1:
       if ( hj212_alt_tmr == 0)
       {
        send_hj212_result();
        hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SEND_REALDATA:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SEND_REALDATA+1:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_real_data();
         hj212_alt_tmr +=3;
         hj212_send_state=HJ212_COMMON;
       }
      break;

       case HJ212_SEND_AVRDATA:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SEND_AVRDATA+1:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_avr_data();
         hj212_alt_tmr +=3;
         hj212_send_state=HJ212_COMMON;
       }
      break;

     case HJ212_RD_INTERVAL:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
      break;

     case HJ212_RD_INTERVAL+1:
      if ( hj212_alt_tmr == 0)
       {
         send_interval();
         hj212_send_state++;
         hj212_alt_tmr +=3;
       }
     break;

      case HJ212_RD_INTERVAL+2:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SET_INTERVAL:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;
     case HJ212_SET_INTERVAL+1:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
       break;


     case HJ212_SENDMIN_HISDATA:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;


     case HJ212_SENDMIN_HISDATA+1:
       if ( hj212_alt_tmr == 0)
       {
          if ( send_min_hisdata()!=0 )
          {
             hj212_send_state ++;
             hj212_alt_tmr +=3;
          }
          else
          {
             hj212_alt_tmr +=3;
          }

       }
     break;

     case HJ212_SENDMIN_HISDATA+2:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SENDHOUR_HISDATA:
     break;

     case HJ212_SENDHOUR_HISDATA+1:
     break;

     case HJ212_SENDHOUR_HISDATA+2:
     break;

     case HJ212_SENDDAY_HISDATA:
     break;

     case HJ212_SENDDAY_HISDATA+1:
     break;

     case HJ212_SENDDAY_HISDATA+2:
     break;

     case HJ212_SEND_3012:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;
     case HJ212_SEND_3012+1:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;


     case HJ212_WARN_TIME:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_WARN_TIME+1:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;
     case HJ212_RD_LIMIT:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;
     case HJ212_RD_LIMIT+1:
        if ( hj212_alt_tmr == 0)
        {
          hj212_send_limit();
          hj212_send_state ++;
          hj212_alt_tmr +=3;
        }
     break;

     case HJ212_RD_LIMIT+2:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_DO:
       if ( hj212_alt_tmr == 0)
       {
         if ( exe_result ==0x20 )
         {
          if ( (di[1] & 0xc0)==0x40)
          {
            exe_result =0;
            do_out[0] &=~BIT4;
          }
          else
          {
            do_out[0] &=~BIT4;
            exe_result =0xff;
          }
         }
         else if (  exe_result ==0x10 )
         {
           if ( (di[1] & 0xc0)==0x80)
           {
            exe_result =0;
            do_out[0] &=~BIT5;
           }
           else
           {
             do_out[0] &=~BIT5;
             exe_result =0xff;
           }
         }
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_DO+1:
       if ( hj212_alt_tmr == 0)
       {
         if ( exe_result ) send_hj212err_result();
         else  send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     default:
       hj212_send_state=HJ212_COMMON;
     break;

     }

  }
}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:30:54 | 显示全部楼层

void  hj212_tmr_proc(void)
{
  static  INT16U ts1_tmr =0;
  static  INT8U  di_cnt=5;

  INT16U    tmp_val;
  INT8U     tmp;
  if (  protocol_tmr )
  { _DINT();
    tmp_val=protocol_tmr;
    protocol_tmr=0;
   _EINT();
   ts1_tmr += tmp_val;
  }

  if ( ts1_tmr >=100)
  {  ts1_tmr -=100;

     if ( hj212_avr_tmr )
     {
       hj212_avr_tmr --;
     }

     if ( hj212_real_tmr )
     {
        hj212_real_tmr --;
     }

     if ( hj212_tmr )
     {
       hj212_tmr--;
     }
     else hj212_tmr=LOGIN_TMR;

     if ( hj212_alt_tmr )
     {
       hj212_alt_tmr--;
     }



#define HJ212_INIT    0

#define HJ212_COMMON  1

#define HJ212_SET_PASSWD 10
#define HJ212_RD_TIME    20
#define HJ212_SET_TIME   30
#define HJ212_SEND_REALDATA 40
#define HJ212_SEND_AVRDATA  50
#define  HJ212_RD_INTERVAL  60
#define  HJ212_SET_INTERVAL 70

#define HJ212_SEND1_HISDATA     80
#define HJ212_SENDMIN_HISDATA   90
#define HJ212_SENDHOUR_HISDATA  100
#define HJ212_SENDDAY_HISDATA   110
#define HJ212_SEND_3012         120

#define HJ212_WARN_TIME         130
#define HJ212_RD_LIMIT          140

#define HJ212_SET_DO            150

  switch ( hj212_send_state)
     {
       case HJ212_INIT:
       hj212_di_old= di[1];
       hj212_di_old = hj212_di_old *256 +di[0];
       if ( hj212_alt_tmr ==0 && hj212_tmr ==0 )
        {
         hj212_alt_tmr +=2;
         hj212_send_state=HJ212_COMMON;
         send_hj212_login();
         hj212_logon_cnt=0;
         hj212_tmr = LOGIN_TMR;
        }
       break;

     case HJ212_COMMON:
       tmp_val= di[1];
       tmp_val =tmp_val *256 +di[0];

      if ( tmp_val ^  hj212_di_old)
      {
         if ( hj212_alt_tmr==0  )
         {
           if (di_cnt==0)
           {
              hj212_di_old=tmp_val;
              di_cnt =2;
              hj212_alt_tmr +=2;
              if ( hld_reg[HJ212_DIO_CTL] )
                   send_hj212_di_state();
              else _NOP();
           }
           else di_cnt --;
         }
      }

      if ( hj212_real_tmr == 0 &&  hj212_alt_tmr==0)
      {

         hj212_real_tmr=hld_reg[IEC_REAL_TMR];
         send_hj212_real_data();
         hj212_alt_tmr +=3;
      }

      if ( hj212_alt_tmr ==0 && hj212_avr_tmr==0)
      {
        hj212_avr_tmr=hld_reg[IEC_AVR_TMR];
        send_hj212_avr_data();
        hj212_alt_tmr +=3;
      }

      if ( hj212_alt_tmr ==0 && hj212_tmr ==0 )
        {
         hj212_alt_tmr +=3;
         hj212_logon_cnt ++;
         send_hj212_login();
        }

      hj212_alarm();
     // hj212_trans();
     break;

     case HJ212_SET_PASSWD:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_PASSWD+1:
       if ( hj212_alt_tmr == 0)
       {
        for(tmp=0;tmp<sizeof(pass_word)-2;tmp++)
            {
             pass_word[tmp]= hj212_cmd.passwd[tmp];
            }
        pass_word[tmp++]=';';
        pass_word[tmp]=0x0;
        send_hj212_result();

        hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_RD_TIME:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_RD_TIME+1:
       if ( hj212_alt_tmr == 0)
       {
         send_time();
         hj212_send_state++;
         hj212_alt_tmr +=3;
       }
     break;

      case HJ212_RD_TIME+2:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_TIME:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SET_TIME+1:
       if ( hj212_alt_tmr == 0)
       {
        send_hj212_result();
        hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SEND_REALDATA:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SEND_REALDATA+1:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_real_data();
         hj212_alt_tmr +=3;
         hj212_send_state=HJ212_COMMON;
       }
      break;

       case HJ212_SEND_AVRDATA:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SEND_AVRDATA+1:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_avr_data();
         hj212_alt_tmr +=3;
         hj212_send_state=HJ212_COMMON;
       }
      break;

     case HJ212_RD_INTERVAL:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
      break;

     case HJ212_RD_INTERVAL+1:
      if ( hj212_alt_tmr == 0)
       {
         send_interval();
         hj212_send_state++;
         hj212_alt_tmr +=3;
       }
     break;

      case HJ212_RD_INTERVAL+2:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
       break;

     case HJ212_SET_INTERVAL:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
       break;
     case HJ212_SET_INTERVAL+1:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
       break;


     case HJ212_SENDMIN_HISDATA:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;


     case HJ212_SENDMIN_HISDATA+1:
       if ( hj212_alt_tmr == 0)
       {
          if ( send_min_hisdata()!=0 )
          {
             hj212_send_state ++;
             hj212_alt_tmr +=3;
          }
          else
          {
             hj212_alt_tmr +=3;
          }

       }
     break;

     case HJ212_SENDMIN_HISDATA+2:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SENDHOUR_HISDATA:
     break;

     case HJ212_SENDHOUR_HISDATA+1:
     break;

     case HJ212_SENDHOUR_HISDATA+2:
     break;

     case HJ212_SENDDAY_HISDATA:
     break;

     case HJ212_SENDDAY_HISDATA+1:
     break;

     case HJ212_SENDDAY_HISDATA+2:
     break;

     case HJ212_SEND_3012:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;
     case HJ212_SEND_3012+1:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;


     case HJ212_WARN_TIME:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_WARN_TIME+1:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;
     case HJ212_RD_LIMIT:
       if ( hj212_alt_tmr == 0)
       {
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;
     case HJ212_RD_LIMIT+1:
        if ( hj212_alt_tmr == 0)
        {
          hj212_send_limit();
          hj212_send_state ++;
          hj212_alt_tmr +=3;
        }
     break;

     case HJ212_RD_LIMIT+2:
      if ( hj212_alt_tmr == 0)
       {
         send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_DO:
       if ( hj212_alt_tmr == 0)
       {
         if ( exe_result ==0x20 )
         {
          if ( (di[1] & 0xc0)==0x40)
          {
            exe_result =0;
            do_out[0] &=~BIT4;
          }
          else
          {
            do_out[0] &=~BIT4;
            exe_result =0xff;
          }
         }
         else if (  exe_result ==0x10 )
         {
           if ( (di[1] & 0xc0)==0x80)
           {
            exe_result =0;
            do_out[0] &=~BIT5;
           }
           else
           {
             do_out[0] &=~BIT5;
             exe_result =0xff;
           }
         }
         send_hj212_exe();
         hj212_send_state ++;
         hj212_alt_tmr +=3;
       }
     break;

     case HJ212_SET_DO+1:
       if ( hj212_alt_tmr == 0)
       {
         if ( exe_result ) send_hj212err_result();
         else  send_hj212_result();
         hj212_send_state=HJ212_COMMON;
         hj212_alt_tmr +=3;
       }
     break;

     default:
       hj212_send_state=HJ212_COMMON;
     break;

     }

  }
}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
 楼主| steelen 发表于 2015-1-27 12:31:53 | 显示全部楼层
INT16U get_token_lenth(INT8U *buf)
{
  INT8U tmp;
  tmp =0;
  while ( 1)
  {
   tmp ++;
   if ( *buf ==';' )  return tmp;
   if ( *buf =='&' )  return 65535;
   if ( *buf ==0x0d ) return 65535;
   buf ++;

  }
}

INT16U  get_token(INT8U *buf, INT16U lenth )
{
  INT8U tmp;
  INT16U tmp_result;
   for ( tmp=0;tmp <=27; tmp++ )
   {
     tmp_result = cmp_str ( buf,(INT8U*)CMD_TAB[tmp],strlen(CMD_TAB[tmp]));
     if ( tmp_result == 0 ) break;
   }

   return tmp;

}

//struct {
//        INT16U pack_lenth;
//        INT8U  qn[20];
//        INT16U st_num;
//       INT16U cn_num;
//        INT16U flag;
//        INT8U  *data;
//       } hj212_cmd;



#define  ERR_CMD  0
#define  QN_CMD   1
#define  PNUM_CMD 2
#define  PNO_CMD  3
#define  ST_CMD   4
#define  CN_CMD   5
#define  PW_CMD   6
#define  MN_CMD   7
#define  CP_CMD   8
#define  QNRTN_CMD  9
#define  LOGON_CMD 10
#define  EXX_CMD   11
#define  RTD_CMD   12
#define  FLAG_CMD  23

INT8U *get_tok(INT8U *src,INT8U *dest,INT8U lenth)
{
INT16U  tmp,tmp_len,tmp_len2;
tmp_len = strlen(dest);
tmp_len2 =strlen(src);
tmp=0;
  while (tmp_len2--)
   {
     if ( lenth-- ==0 ) break;
     if ( *(src+tmp) !=*(dest+tmp) )
      {
        src++;
        tmp =0;
      }
     else
      {
        tmp++;
      }
     if ( tmp == tmp_len ) return src;
   }
  return NULL;
}
INT8U  get_address (INT16U tmp)
{
  INT8U  cnt;

  for ( cnt=0;cnt <MAX_FLOAT;cnt++)
  {
      if ( hld_reg[cnt+IEC_SEND_NUM]== tmp) return cnt;
  }
  return 31;
}

INT8U *get_one_token(INT8U *src,INT8U *dest)
{
INT16U  tmp,tmp_len,tmp_len2;
tmp_len = strlen(dest);
tmp_len2 =strlen(src);
tmp=0;
  while (tmp_len2--)
   {
     if ( *(src+tmp) !=*(dest+tmp) )
      {
        src++;
        tmp =0;
      }
     else
      {
        tmp++;
      }
     if ( tmp == tmp_len ) return src;
   }
  return NULL;
}

INT16U parse_hj212(INT8U *point)
{
  INT16U tmp_lenth ,tmp;
  INT16U  tmp_token;
  INT8U * tmp_point;

  if ( *point++ !='#' ) return 65535;
  if ( *point++ !='#' ) return 65535;

  hj212_cmd.pack_lenth=read_int ( point,4 );
  point +=4;


  while (1)
  {
   hj212_cmd.data= point;
   tmp_lenth = get_token_lenth( point );
   if ( tmp_lenth == 65535 ) break;
   tmp_token = get_token ( point,tmp_lenth);
   switch (tmp_token)
    {

     case QN_CMD:
       for ( tmp=0;tmp<tmp_lenth;tmp++)
       {
        hj212_cmd.qn[tmp]=*(point+tmp);
       }
       hj212_cmd.qn[tmp]=0x0;
     break;

    case ST_CMD:
      hj212_cmd.st_num=read_int(point+3,2);
      for ( tmp=0;tmp<tmp_lenth;tmp++)
      {
        hj212_cmd.st[tmp]=*(point+tmp);
      }
      hj212_cmd.st[tmp]=0x0;
    break;

    case CN_CMD:
      hj212_cmd.cn_num=read_int(point+3,4);
      break;
    case PW_CMD:
      for ( tmp=0;tmp<tmp_lenth;tmp++)
      {  hj212_cmd.passwd[tmp]=*(point+tmp);
      }
       hj212_cmd.passwd[tmp]=0x0;
    break;

     case MN_CMD:
      for ( tmp=0;tmp<tmp_lenth;tmp++)
      {  hj212_cmd.mn[tmp]=*(point+tmp);
      }
       hj212_cmd.mn[tmp]=0x0;
    break;

    case FLAG_CMD:
      hj212_cmd.flag=read_int(point+5,1);
     break;

    }
   point += tmp_lenth;
  }

  return 0;

}

void sio1_hj212_proc(void)
{
  INT8U tmp,tmp2;
  INT8U *tmp_point,*tmp_p;
  INT8U tmp_pollution[20];
  INT16U  tmp_result;
  INT16U  *tmp_p_16;
  FP32 ftmp_max,ftmp_min,ftmp_rangemax,ftmp_rangemin;
  SIO *sio_p;

  sio1_led_on();
  hj212_cmd.cn_num=0x0;
  hj212_cmd.st_num=0x0;
  hj212_cmd.flag  =0x0;
  tmp=parse_hj212(sio1_buf);
  if ( tmp!=0 )
  { //报文错误
    return;
  }

  switch ( hj212_cmd.cn_num )
  {
    case 9022:  //test ok
      hj212_send_state=HJ212_COMMON;
      hj212_logon_cnt =0;
    break;

    case 9018:  //do out ctl
      exe_result=0;
      gen_mn_num ( tmp_pollution );
      exe_result=cmp_str ( tmp_pollution, hj212_cmd.mn,17);
       if ( exe_result ) break;
      exe_result = hj212_crc_judge( sio1_buf );
       if ( exe_result ) break;
      tmp_point= hj212_cmd.data;
      while (1)
      {
       tmp_point= get_one_token(tmp_point,"SB");
       if ( tmp_point !=NULL)
       {
         tmp_point +=2;
         tmp=*tmp_point;
         tmp_point++;
         if (*tmp_point == '=')
         {
          tmp_point++;
          if ( *tmp_point =='1')
           {
             if ( tmp=='5' )
             {
                if ( (di[1] &0xc0)==0x80 )
                {
                   set_do ( do_out,tmp,1);
                   hj212_send_state=HJ212_SET_DO;
                   exe_result =0x20;
                   hj212_alt_tmr +=2;
                }
                else
                {
                  exe_result =0xff;
                  hj212_send_state=HJ212_SET_DO;
                }
             }
             else if ( tmp=='6')
             {
               if ( (di[1] &0xc0)==0x40 )
                {
                   set_do ( do_out,tmp,1);
                   hj212_send_state=HJ212_SET_DO;
                   exe_result =0x10;
                   hj212_alt_tmr +=2;
                }
               else
               {
                 exe_result =0xff;
                 hj212_send_state=HJ212_SET_DO;
               }
             }
             else
              {
               set_do ( do_out,tmp,1);
               hj212_send_state=HJ212_SET_TIME;
              }
           }
          else if (*tmp_point =='0')
          {
            set_do ( do_out,tmp,0);
            hj212_send_state=HJ212_SET_TIME;
          }
          else _NOP();
         }
       }
       else break;
      }
    break;

    case 9019:  //ao out ctl

    break;

    case 1001: // 报警时间定值
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"WarnTime");
       if ( tmp_point !=NULL)
       {
         tmp_point +=8;
         tmp=*tmp_point;

         if (*tmp_point == '=')
         {
          tmp2=0;
          tmp_point++;
          if ( isdigit(*tmp_point)) tmp2=*tmp_point-'0';
          tmp_point++;
          if (isdigit(*tmp_point)) tmp2=tmp2 *10+ *tmp_point-'0';
          hld_reg[HJ212_ALARM_TMR]=tmp2;
         }
       }


      hj212_send_state=HJ212_WARN_TIME;

    break;

    case 1011:  //test ok
      hj212_send_state=HJ212_RD_TIME;
    break;

    case 1012: //test ok
       hj212_send_state=HJ212_SET_TIME;
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"SystemTime=");
       if ( tmp_point !=NULL)
       {
        tmp_result=read_hex( tmp_point+13,4);
        write_hldreg( H_YEAR,tmp_result);
        tmp_result=read_hex( tmp_point+17,4);
        write_hldreg( H_DAY,tmp_result);
        tmp_result=read_hex( tmp_point+21,4);
        write_hldreg( H_MIN,tmp_result);
        hj212_send_state=HJ212_SET_TIME;
       }
    break;

    case 1021:
       tmp_point= hj212_cmd.data;
       tmp_point+=5;
       while (1)
       {
         tmp_p= get_tok(tmp_point,"PolId=",10);
         if ( tmp_p==NULL) break;
         tmp=0;
         tmp_p+=6;
         for ( ; ;)
         {
           if ( *tmp_p ==';') break;
           if ( *tmp_p =='&') break;
           tmp_pollution[tmp++]=*tmp_p++;
         }
         tmp_pollution[tmp]=0;
         tmp_result=get_pollion( tmp_pollution );
         tmp_result=get_address(tmp_result);
         hld_reg[ALARM1+3*tmp_result]|=BIT4;
         tmp_point= tmp_p;
       }
       hj212_send_state=HJ212_RD_LIMIT;
    break;

    case 1022:
       tmp_point= hj212_cmd.data;
       tmp_point+=5;
       while(1)
       {
        tmp=0;
        for ( ;*tmp_point !='-';)
         {
           tmp_pollution[tmp++]=*tmp_point++;
         }
        tmp_pollution[tmp]=0;
        tmp_result=get_pollion( tmp_pollution );
        tmp_result= get_address( tmp_result);
        tmp_point++;
        tmp_p= get_tok(tmp_point,"LowValue=",10);
        if ( tmp_p!=NULL)
        {
          tmp_p+=9;
          hld_reg[ALARM1_DOWN+3*tmp_result]= read_int(tmp_p,4);
          hld_reg[ALARM1+3*tmp_result]|=0x8000;
        }
       else
       {  tmp_p= get_tok(tmp_point,"UpValue=",10);
          if ( tmp_p!=NULL)
          {
           tmp_p+=8;
           hld_reg[ALARM1_UP+3*tmp_result]= read_int(tmp_p,4);
           hld_reg[ALARM1+3*tmp_result]|=0x8000;
          }
       }
       while ( 1)
        {
          if ( *tmp_point=='&') break;
          if ( *tmp_point==',') break;
          if ( *tmp_point==';') break;
          tmp_point++;
        }
        tmp_point++;
        if (*tmp_point=='&') break;
      }
      hj212_send_state=HJ212_SET_INTERVAL;
    break;

    case 1061:
       hj212_send_state=HJ212_RD_INTERVAL;
    break;

    case 1062:
      tmp_point= hj212_cmd.data;
      tmp_point= get_one_token(tmp_point,"RtdInterval=");
      if ( tmp_point !=NULL)
      {
        tmp_point +=12;
        tmp_result=0;
        while ( isdigit(*tmp_point))
         {
         tmp_result=tmp_result*10+*tmp_point++ -'0';
         }
        hld_reg[IEC_REAL_TMR]=tmp_result;
        hj212_send_state=HJ212_SET_INTERVAL;
      }
    break;

    case 1072:   //test ok
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"PW=");
       if ( tmp_point !=NULL)
       {
        for ( tmp=0;tmp<sizeof(pass_word);tmp++)
         {
           hj212_cmd.passwd[tmp]=*tmp_point++;
         }
        hj212_send_state=HJ212_SET_PASSWD;
       }
    break;

     case 1073:   //test ok
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"MininuteInterval=");
       if ( tmp_point !=NULL)
       {
        tmp_point += 17;
        hld_reg[IEC_AVR_TMR] =  read_int( tmp_point,4 );
        hj212_send_state=HJ212_SET_PASSWD;
       }
    break;

    case 1074:   //test ok


    break;

    case 2011:  //test ok
      hj212_send_state=HJ212_SEND_REALDATA;
    break;

    case 2041:
    break;

    case 2051: //test ok
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"BeginTime=");
       tmp=0;
       if ( tmp_point !=NULL)
       {
         tmp_point +=12;

         hj212_st_year =  read_hex ( tmp_point,4 );
         tmp_point +=4;
         hj212_st_day =  read_hex ( tmp_point,4 );
         tmp_point +=4;
         hj212_st_min =  read_hex ( tmp_point,4 );
         tmp_point +=4;

         tmp_point= get_one_token(tmp_point,"EndTime=");
         if ( tmp_point !=NULL)
         {
           tmp_point +=10;

           hj212_end_year = read_hex ( tmp_point,4 );
           tmp_point +=4;
           hj212_end_day =  read_hex ( tmp_point,4 );
           tmp_point +=4;
           hj212_end_min =  read_hex ( tmp_point,4 );
           tmp_point +=4;

           hj212_send_state=HJ212_SENDMIN_HISDATA;
           //发送分钟数据

         }
         else
         {  //发送一条历史记录
            hj212_end_year=0;
            hj212_end_day =0;
            hj212_end_min =0;
            hj212_send_state=HJ212_SENDMIN_HISDATA;
         }

          tmp_pos = seek_day ( hj212_st_year,hj212_st_day );
          if ( tmp_pos == 0xffff) tmp |=BIT0;

          tmp_inpage_adr = seek_time (tmp_pos, hj212_st_day,hj212_st_min);
          if ( tmp_pos == 0xffff)  tmp |=BIT1;

         tmp_end_pos=seek_day ( hj212_end_year,hj212_end_day );
         if ( tmp_end_pos !=0xffff )
         tmp_end_padr = seek_time (tmp_end_pos, hj212_end_day,hj212_end_min);

         pnum= tmp_end_padr-tmp_inpage_adr;
         pno=1;

         tmp_pos = tmp_pos+tmp_inpage_adr /REC_PER_PAGE;
         tmp_inpage_adr = tmp_inpage_adr %REC_PER_PAGE;
         tmp_inpage_adr *=BYTE_PER_REC;

         tmp_end_pos = tmp_end_pos+tmp_end_padr /REC_PER_PAGE;
         tmp_end_padr = tmp_end_padr %REC_PER_PAGE;
         tmp_end_padr *=BYTE_PER_REC;
       }
       else
       { //发送当前的平均值数据
         hj212_send_state=HJ212_SEND_AVRDATA;
       }
    break;

    case 2061: //test ok
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"BeginTime=");

       if ( tmp_point !=NULL)
       {
         tmp_point +=12;

         hj212_st_year =  read_hex ( tmp_point,4 );
         tmp_point +=4;
         hj212_st_day =  read_hex ( tmp_point,4 );
         tmp_point +=4;
         hj212_st_min =  read_hex ( tmp_point,4 );
         tmp_point +=4;

         tmp_point= get_one_token(tmp_point,"EndTime=");
         if ( tmp_point !=NULL)
         {
           tmp_point +=10;

           hj212_end_year = read_hex ( tmp_point,4 );
           tmp_point +=4;
           hj212_end_day =  read_hex ( tmp_point,4 );
           tmp_point +=4;
           hj212_end_min =  read_hex ( tmp_point,4 );
           tmp_point +=4;

           hj212_send_state=HJ212_SENDHOUR_HISDATA;
           //发送分钟数据

         }
         else
         {  //发送一条历史记录
            hj212_end_year=0;
            hj212_end_day =0;
            hj212_end_min =0;
            hj212_send_state=HJ212_SENDHOUR_HISDATA;
         }
       }

    break;

    case 3012:  //反控命令
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"PolID=");
        if ( tmp_point !=NULL)
        {
          tmp_point +=6;
          for ( tmp=0;tmp<8;tmp++)
          {
             if ( *tmp_point !='&'&& *tmp_point !=',')
             {
               tmp_pollution[tmp]=*tmp_point++;
             }
             else break;
          }
          tmp_pollution[tmp]=0;
          tmp_result=get_pollion( tmp_pollution );
          sio_p=  (SIO *) &sio_tab[1];
          for ( tmp=0;tmp<6;tmp++)
           {
             if ( tmp_result == *sio_p->sio_tmr7 )
             {
               *sio_p->sio_tmr4=0xffff;
               hj212_send_state=HJ212_SEND_3012;


             }
             sio_p++;
           }

        }
    break;

    case 3014:  //反控命令
       tmp_point= hj212_cmd.data;
       tmp_point= get_one_token(tmp_point,"PolID=");
        if ( tmp_point !=NULL)
        {
          tmp_point +=6;
          for ( tmp=0;tmp<8;tmp++)
          {
             if ( *tmp_point !='&'&& *tmp_point !=',')
             {
               tmp_pollution[tmp]=*tmp_point++;

             }
             else break;
          }
          tmp_pollution[tmp]=0;
          tmp_result=get_pollion( tmp_pollution );
          sio_p=  (SIO *) &sio_tab[1];


          for ( tmp=0;tmp<6;tmp++)
           {
             if ( tmp_result == *sio_p->sio_tmr7 )
             {
               tmp_p_16= sio_p->sio_set1;
               for ( tmp2 =0;tmp2<5;tmp2++)
               {
                 tmp_point= get_one_token(tmp_point,"CTime=");
                 if (tmp_point!=NULL)
                 {
                    tmp_point+=6;
                    tmp_result=read_hex( tmp_point,2);
                    *tmp_p_16 = 0x100+ tmp_result;
                    tmp_p_16++;
                 }
                 else break;
               }
               hj212_send_state=HJ212_SEND_3012;
             }
             sio_p++;
           }

        }
    break;

   case 3099:    //透明传输
       tmp_point= hj212_cmd.data;
       tmp_point= get_tok(tmp_point,"COM=",10);
       if ( tmp_point!=NULL)
        {
           tmp_point+=4;
           if ( isdigit( *tmp_point) )
            {
              tmp=*tmp_point-'2';
              sio_p=(SIO *) &sio_tab[tmp];
              tmp_point= get_tok(tmp_point,"MODE=",10);
              tmp=0;
              if ( tmp_point!=NULL)
              {
                tmp_point+=5;
                if ( isdigit( *tmp_point) ) tmp=*tmp_point-'0';
                *sio_p->sio_set4=tmp;
              }
              tmp_point= get_tok(tmp_point,"CONTENT=",10);
              if ( tmp_point!=NULL)
              {
                tmp_point+=8;
                if ( tmp ==0 )
                {
                  tmp=0;
                  while ( *tmp_point!='&')
                  {
                    *( sio_p->sio_buf + tmp)=*tmp_point++;
                    tmp ++;
                  }
                  *sio_p->sio_tx_lenth=0;
                  *sio_p->sio_tx_lenth2=tmp;
                   hj212_send_state=HJ212_SET_PASSWD;
                }
                else
                {

                  tmp=0;
                  while ( *tmp_point!='&')
                  {
                    *( sio_p->sio_buf + tmp)= read_hex(tmp_point,2);
                    tmp ++;
                    tmp_point +=2;
                  }
                  *sio_p->sio_tx_lenth=0;
                  *sio_p->sio_tx_lenth2=tmp;
                   hj212_send_state=HJ212_SET_PASSWD;
                }
              }
            }

           else break;
        }

   break;

  }

}
腾控T919宽温以太网PLC上市,集成4路热电阻(PT100),同时集成8路DI,4路DO(晶体管输出),8路AI,3个串口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

产品样机试用申请

QQ|小黑屋|手机版|Archiver|腾控科技|腾控科技 ( 京ICP备09109731号  

GMT+8, 2020-10-25 07:38 , Processed in 0.139024 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表