📄 sample.c
字号:
#include "sample.h"
//#include "curdata.h"
INT8U _jiaocai_addr[6]={0x47,0x10,0x07,0x00,0x00,0x00};
//INT8U _jiaocai_addr[6]={0x00,0x91,0x78,0x56,0x34,0x12};
INT8U _houxu_Frame_flag = 0;
/*********************************************************************************************************
** 函数名称: get_jiaocai_add
** 功能描述: 读取交采的地址
** 输 入: 无
** 输 出: 无
********************************************************************************************************/
void get_jiaocai_add(void)
{
INT32S reply;
INT8U Sendbuf[6],j=0;
INT16U i;
// INT8S p;
Sendbuf[0] = 0xAA;
Sendbuf[1] = 0xAA;
Sendbuf[2] = 0xAA;
Sendbuf[3] = 0xAA;
Sendbuf[4] = 0xAA;
Sendbuf[5] = 0xAA;
// p = fill_down_send_q();
// Down_Send_ok = down_send(Sendbuf,0x01,0x34,0xC0);
for(i=0;i<3;i++)
{
Down_Send_ok = down_send(Sendbuf,0x01,0x34,0xC0);
reply = ReadCommMs(4,Down_Revbuf,20,200,500);
if(reply>0) break;
}
if(i>=3) ; //交采采集的串口有问题,告警;
while(Down_Revbuf[j] != 0x68) //取出接收缓冲区的一帧数据的帧头;
{
j++;
// OSTimeDly(1);
if(j>=300) break; //退出,没有采集到正确数据;
}
for(i=0;i<6;i++) _jiaocai_addr[i] = Down_Revbuf[i+j+1];//保存交采的地址;
}
/*********************************************************************************************************
** 函数名称: sample_data
** 功能描述: 下行交采发送读命令串
** 输 入: buf,接收数据缓冲区指针
** 输 出: >=0 :返回实际写入的字节数。
** < 0 : 函数调用失败。
********************************************************************************************************/
INT32S sample_data(void)
{
INT16U j,len0=0,m=0;
// INT8U * pointer;
INT32S rep = -2,repp;
INT8U i,len,frame_flag = 0; //此长度为从接收缓冲开始到有效数据开始之间的长度,有效数据包括数据标识码;
// pointer = Down_Revbuf;
for(i=0;i<3;i++)
{
for(j=0;j<300;j++)
{
Down_Revbuf[j] = 0;
First_Revbuf[j] = 0;
}
len0 = 0;
down_send(_jiaocai_addr,0x01,0x1F,0xE9);
m = 0;
while(!frame_flag)
{
rep = ReadCommMs(4,First_Revbuf,300,50,500);
if(rep>0)
{
for(j=0;j<rep;j++) Down_Revbuf[len0+j] = First_Revbuf[j];
len0 = rep+len0;
j=0;
while(First_Revbuf[j] != 0x16)
{
j++;
if(j>300) break;
}
if(j<300) frame_flag = 1;
}
m++;
if(m>300) break;
}
frame_flag = 0;
if(j<300)
{
repp = crc_process(Down_Revbuf,&len);
if(repp<0)
return (-2);
else
{
//调用读取数据函数;
down_data_E91F(Down_Revbuf+len+3);
if(_houxu_Frame_flag)
{
_houxu_Frame_flag = 0;
//发送读后续帧数据命令;
}
}
break;
}
}
if(i>=3) ; //交采采集的串口有问题,告警;
for(i=0;i<3;i++)
{
for(j=0;j<300;j++)
{
Down_Revbuf[j] = 0;
First_Revbuf[j] = 0;
}
len0 = 0;
down_send(_jiaocai_addr,0x01,0x2F,0xE9);
m = 0;
while(!frame_flag)
{
rep = ReadCommMs(4,First_Revbuf,300,50,500);
if(rep>0)
{
for(j=0;j<rep;j++) Down_Revbuf[len0+j] = First_Revbuf[j];
len0 = rep+len0;
j=0;
while(First_Revbuf[j] != 0x16)
{
j++;
if(j>300) break;
}
if(j<300) frame_flag = 1;
}
m++;
if(m>300) break;
}
frame_flag = 0;
if(j<300)
{
repp = crc_process(Down_Revbuf,&len);
if(repp<0)
return (-2);
else
{
//调用读取数据函数;
down_data_E92F(Down_Revbuf+len+3);
if(_houxu_Frame_flag)
{
_houxu_Frame_flag = 0;
//发送读后续帧数据命令;
}
}
break;
}
}
if(i>=3) ; //交采采集的串口有问题,告警;
return 0;
}
/*********************************************************************************************************
** 函数名称: down_send
** 功能描述: 下行交采发送读命令
** 输 入: add:交采地址,6个字节;
** control:控制操作码;
** data0:数据0+33H
** data1:数据1+33H
** 输 出: >=0 :返回实际写入的字节数。
** < 0 : 函数调用失败。
********************************************************************************************************/
INT32S down_send(INT8U *add,INT8U control,INT8U data0,INT8U data1)
{
INT8U i,crc = 0;
INT32S reply;
Down_Sendbuf[0] = 0x68;
Down_Sendbuf[1] = *add;
Down_Sendbuf[2] = *(add+1);
Down_Sendbuf[3] = *(add+2);
Down_Sendbuf[4] = *(add+3);
Down_Sendbuf[5] = *(add+4);
Down_Sendbuf[6] = *(add+5);
Down_Sendbuf[7] = 0x68;
Down_Sendbuf[8] = control;
Down_Sendbuf[9] = 0x02;
Down_Sendbuf[10] = data0+0x33;
Down_Sendbuf[11] = data1+0x33;
for(i=0;i<12;i++)
{
crc = Down_Sendbuf[i]+crc;
}
//crc = crc%256;
Down_Sendbuf[12] = crc;
Down_Sendbuf[13] = 0x16;
reply = WriteComm(4,Down_Sendbuf,14);
return reply;
}
/*********************************************************************************************************
** 函数名称: down_data_E91F
** 功能描述: 处理下行接收数据
** 输 入: buf,处理数据的起始地址;
** 输 出: 无
********************************************************************************************************/
void down_data_E91F(INT8U *buf)
{
INT8U i,pow[3],buf_v[6];
INT32U cur_a,cur_b,cur_c,vol_a,vol_b,vol_c,pow_a,pow_b,pow_c,pow_total,temp;
evaluate(cur_data[0].X9010,buf,4,5); // (当前)正向有功电能数据块
evaluate(cur_data[0].X9020,buf+20,4,5); // (当前)正向无功电能数据块
evaluate(cur_data[0].X9110,buf+40,4,5); // (当前)正向无功电能数据块
evaluate(cur_data[0].X9120,buf+80,4,5); // (当前)反向无功电能数据块
evaluate(cur_data[0].X9130,buf+100,4,5); // (当前)一象限无功电能数据块
evaluate(cur_data[0].X9150,buf+120,4,5); // (当前)二象限无功电能数据块
evaluate(cur_data[0].X9160,buf+140,4,5); // (当前)三象限无功电能数据块
buf_v[0] = (((*(buf+161)-0x33)<<4)+((*(buf+160)-0x33)>>4))+0x33;
buf_v[1] = ((*(buf+161)-0x33)>>4)+0x33;
buf_v[2] = (((*(buf+163)-0x33)<<4)+((*(buf+162)-0x33)>>4))+0x33;
buf_v[3] = ((*(buf+163)-0x33)>>4)+0x33;
buf_v[4] = (((*(buf+165)-0x33)<<4)+((*(buf+164)-0x33)>>4))+0x33;
buf_v[5] = ((*(buf+165)-0x33)>>4)+0x33;
evaluate(cur_data[0].XB611,buf_v,2,3); // 电压数据块
temp = (((INT32U)cur_data[0].XB611[1])<<8)+(INT32U)cur_data[0].XB611[0];
vol_c = bcd_hex(temp);
temp = (((INT32U)cur_data[0].XB612[1])<<8)+(INT32U)cur_data[0].XB612[0];
vol_b = bcd_hex(temp);
temp = (((INT32U)cur_data[0].XB613[1])<<8)+(INT32U)cur_data[0].XB613[0];
vol_a = bcd_hex(temp);
evaluate(cur_data[0].XB621,buf+166,2,3); // 电流数据块
temp = (((INT32U)cur_data[0].XB621[1])<<8)+(INT32U)cur_data[0].XB621[0];
cur_c = bcd_hex(temp);
temp = (((INT32U)cur_data[0].XB622[1])<<8)+(INT32U)cur_data[0].XB622[0];
cur_b = bcd_hex(temp);
temp = (((INT32U)cur_data[0].XB623[1])<<8)+(INT32U)cur_data[0].XB623[0];
cur_a = bcd_hex(temp);
temp = vol_c*cur_c;
pow_total = temp;
pow_c = hex_bcd(temp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -