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

📄 vfdb.c

📁 该工程是通过RS485方式控制远程变频器实例
💻 C
字号:
 /****************************************
*名称:vfdb.c
*功能:
****************************************/
#include "includes.h"

/*address*/
# define    BROADCAST   0x00
/*starting address*/
# define    TEL_ADDR    0x0900      //通讯地址
/*function*/
# define    READREG     0x03        //读出寄存器内容
# define    WRITEONE    0x06        //写入一笔资料至寄存器
# define    WRITECHECK  0x08        //回路侦测
# define    WRITEMORE   0x10        //写入多笔资料至寄存器

# define    STX         0x3A        
# define    CR          0x0D
# define    LF          0x0A
/****************************************
*名称:Send_datatrans()
*功能:发送前将输入数据转换成相应HEX格式,例如将0(0x00)-->'0'(0x30),A(0x0a)-->'A'(0x41)
*说明:输入数据必须要在0~F(HEX)之间
*入口函数:
*出口函数:
****************************************/
static UINT8 Send_datatrans(UINT8 t_data)
{
  UINT8 r_data;
  if(( t_data >= 0 )&&( t_data <= 9 ))  r_data = t_data + 0x30;
  else if(( t_data >=10 )&&( t_data <= 15 ))    r_data =  t_data + 0x37;
  else r_data = 0;

  return r_data;

}

 /****************************************
*名称:Send_vfdbbyte()
*功能:
****************************************/
static void send_vfdbbyte( UINT8 s_data)
{
  Sendbyte(Send_datatrans(s_data>>4));
  Sendbyte(Send_datatrans(s_data & 0x0f));
}
 /****************************************
*名称:Send_vfdbword()
*功能:
****************************************/
static void send_vfdbword( UINT16 s_data)
{
  Sendbyte(Send_datatrans((UINT8)(s_data>>12)));
  Sendbyte(Send_datatrans((UINT8)((s_data & 0x0f00)>>8)));
  Sendbyte(Send_datatrans((UINT8)((s_data & 0x00f0)>>4)));
  Sendbyte(Send_datatrans((UINT8)(s_data & 0x000f)));
}

/****************************************
*名称:Send_readreg()
*功能:完成读出寄存器数据发送指令
*说明:

STX---Address---Function---Starting Address---Number of data(count by word)---LRC Check---END

*入口函数:addr:通讯地址;s_addr:操作起始地址;num:操作数据笔数(word)
*出口函数:
****************************************/
void Send_readreg(UINT8 addr, UINT16 s_addr,UINT16 num)
{
  UINT8 lrc_data;
  //lrc_data = 0xff - (addr + READREG + (UINT8)(s_addr>>8) + (UINT8)(s_addr&0x00ff) + (UINT8)(num>>8) + (UINT8)(num&0x00ff));
  
	lrc_data = ~(addr + READREG + (UINT8)(s_addr>>8) + (UINT8)(s_addr&0x00ff) + (UINT8)(num>>8) + (UINT8)(num&0x00ff)) + 1;

//  lrc_data =0xd7;

  /*START*/
  Sendbyte(STX);
  /*address*/
  send_vfdbbyte(addr);
  /*function*/
  send_vfdbbyte(READREG);
  /*starting address*/
  send_vfdbword(s_addr);
  /*number of data (count by word)*/
  send_vfdbword(num);
  /*LRC check*/
  send_vfdbbyte(lrc_data);
  /*END*/
  Sendbyte(CR); 
  Sendbyte(LF); 
}
/****************************************
*名称:Send_writeone()
*功能:完成发送一笔数据到固定地址
*说明:

STX---Address---Function---Data Address---Data content---LRC Check---END

*入口函数:addr:通讯地址;d_addr:写入数据起始地址;w_data:写入数据
*出口函数:
****************************************/
void Send_writeone(UINT8 addr,UINT16 d_addr,volatile UINT16 w_data)
{
  UINT8 lrc_data;
  lrc_data = ~(addr + WRITEONE + (UINT8)(d_addr>>8) + (UINT8)(d_addr&0x00ff) + (UINT8)(w_data>>8) + (UINT8)(w_data&0x00ff)) + 1;
  /*START*/
  Sendbyte(STX);
  /*address*/
  send_vfdbbyte(addr);
  /*function*/
  send_vfdbbyte(WRITEONE);
  /*data address*/
  send_vfdbword(d_addr);
  /*data content*/
  send_vfdbword(w_data);
  /*LRC check*/
  send_vfdbbyte(lrc_data);
  /*END*/
  Sendbyte(CR); 
  Sendbyte(LF); 
}
/****************************************
*名称:Send_writecheck()
*功能:完成一次数据发送,回路侦测
*说明:

STX---Address---Function---Starting Address---Number of data(count by word)---LRC Check---END

*入口函数:addr:通讯地址;d_addr:写入数据起始地址;w_data:写入数据
*出口函数:
****************************************/
void Send_writecheck(UINT8 addr,UINT16 d_addr,volatile UINT16 w_data)
{
  UINT8 lrc_data;
  lrc_data = ~(addr + WRITECHECK + (UINT8)(d_addr>>8) + (UINT8)(d_addr&0x00ff) + (UINT8)(w_data>>8) + (UINT8)(w_data&0x00ff)) + 1;
  /*START*/
  Sendbyte(STX);
  /*address*/
  send_vfdbbyte(addr);
  /*function*/
  send_vfdbbyte(WRITECHECK);
  /*data address*/
  send_vfdbword(d_addr);
  /*data content*/
  send_vfdbword(w_data);
  /*LRC check*/
  send_vfdbbyte(lrc_data);
  /*END*/
  Sendbyte(CR); 
  Sendbyte(LF); 
}
/****************************************
*名称:Send_writemore()
*功能:完成发送一笔数据到固定地址
*说明:

STX---Address---Function---Data Address---Data content---LRC Check---END

*入口函数:addr:通讯地址;d_addr:写入数据起始地址;w_data:写入数据地址
*出口函数:
****************************************/
void Send_writemore(UINT8 addr,UINT16 d_addr, UINT16 num,volatile UINT16 *w_data)
{
  UINT8 lrc_data;
  UINT8 num_byte;
  volatile  UINT16 i,w_datareg;

  num_byte = (UINT8)num*2;

  lrc_data = addr + WRITEMORE + (UINT8)(d_addr>>8) + (UINT8)(d_addr&0x00ff) + (UINT8)(num>>8) + (UINT8)(num&0x00ff);
  /*START*/
  Sendbyte(STX);
  /*address*/
  send_vfdbbyte(addr);
  /*function*/
  send_vfdbbyte(WRITEMORE);
  /*data address*/
  send_vfdbword(d_addr);
  /*number of data(word)*/
  send_vfdbword(num);
  /*number of data(byte)*/
  send_vfdbbyte(num_byte);
  for(i=0;i<num;i++)
  {
  	w_datareg = *w_data;
	lrc_data += ((UINT8)(w_datareg>>8) + (UINT8)(w_datareg&0x00ff));
	w_data++;
  	/*data content*/
  	send_vfdbword(w_datareg);
  }
  /*LRC check*/
  lrc_data = ~lrc_data + 1; 
  send_vfdbbyte(lrc_data);
  /*END*/
  Sendbyte(CR); 
  Sendbyte(LF); 
}




/****************************************
*名称:Send_testbyte()
*功能:测试函数,测试接收后的函数发送出去,数据以字节格式提供
****************************************/
void Send_testbyte(UINT8 *p_data,UINT8 num) 
{
  UINT8 i;
  UINT8 test_data;
  UINT8 *p_datareg;

  p_datareg = p_data;

  for(i=0;i<num;i++)
  {
  	test_data = *p_datareg;
  	send_vfdbbyte(test_data);
	p_datareg++;
  }

  Sendbyte(CR); 
  Sendbyte(LF); 

}
/****************************************
*名称:Send_testword()
*功能:测试函数,测试接收后的函数发送出去,数据以字节格式提供
****************************************/
void Send_testword(UINT16 *p_data,UINT8 num) 
{
  UINT8 i;
  UINT16 test_data;
  UINT16 *p_datareg;

  p_datareg = p_data;

  for(i=0;i<num;i++)
  {
  	test_data = *p_datareg;
  	send_vfdbbyte((UINT8)(test_data>>8));
  	send_vfdbbyte((UINT8)test_data);
	p_datareg++;
  }

  Sendbyte(CR); 
  Sendbyte(LF); 

}

/****************************************
*
*Broadcast all and get the Address
*****************************************/
void Broadcast (void)
{
  Send_readreg(BROADCAST,TEL_ADDR,1);
}

⌨️ 快捷键说明

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