//###########################################################################
//
// FILE: P103.c
//
// Function: process Zhuhai Wanlida 103 protocol
//
#include "device.h"
#include "includes.h"
#include "P103.h"
#include "Comtrade.h"
//****************************************************
// 定义变量
//****************************************************
struct P103_GEN_REG SCIA_GEN_REG;
struct P103_GEN_REG SCIB_GEN_REG;
Uint8 P103_Scia_BakRxBuf[256];
Uint8 P103_Scib_BakRxBuf[256];
//static unsigned char SCIA_ResetFlag=1; LZG
static unsigned char SCIB_ResetFlag=1;
// YK, YT constants and variables defination
static unsigned char YkGroup,YkEntry;
Uint16 const P103_SampleNumber[3]={SegA_Num,SegB_Num,SegC_Num}; // A,B,C各段采样点数
Uint16 const P103_SampleINT[3]={ 1666, 1666, 40000 }; // 24 bits can not describe!!!
unsigned short MyMilliSecond,MySecond,MyMinute,MyHour,MyDay,MyMonth,MyYearl;
const float P103_RPV_Data[9]={500,500,500,500,12000,12000,12000,12000,0}; // 额定一次值
const float P103_RSV_Data[9]={5,5,5,5,120,120,120,120,0}; // 额定二次值
const float P103_RFA_Data[9]={30./32767.,30./32767.,30./32767.,30./32767.,1.,1.,1.,1.,0.}; // 参比因子
extern unsigned char P103_SendGenAttr(struct P103_GEN_REG *COMM_GEN_REG, Uint8 *TxBuf);
extern void WLD103_Ext_Read( struct P103_GEN_REG *COMM_GEN_REG, Uint8 *TX_BUF, Uint8 *RX_BUF ); //
extern void WLD103_Ext_Write( struct P103_GEN_REG *COMM_GEN_REG, Uint8 *TX_BUF, Uint8 *RX_BUF );
/************************************************************************************
* 检查接收到的数据包是否有效。
* 返回值:TRUE:有效;FALSE:无效。
************************************************************************************/
Uint16 P103_CheckFrame(struct P103_GEN_REG *COMM_GEN_REG, Uint8 *RxBuf)
{
Uint16 TmpHead,TmpCtrl,TmpAddr,TmpCS,TmpTail,ii,TmpLen,TmpData=0;
TmpHead = RxBuf[0];
if(TmpHead==0x10) // fixed length frame
{
TmpCtrl = RxBuf[1]; // 控制域
TmpAddr = RxBuf[2]; // 装置地址
TmpCS = RxBuf[3]; // 校验
TmpTail = RxBuf[4]; // 结束符
TmpData = TmpCtrl+TmpAddr; // 计算校验和
TmpData &= 0xff;
if( TmpCS != TmpData || TmpTail != 0x16 )
return(FALSE);
}
else if(TmpHead ==0x68) // variable length frame
{
TmpLen = RxBuf[1];
if( TmpLen != RxBuf[2] || TmpHead != RxBuf[3] ) //长度及启动字符非法
return(FALSE);
TmpCtrl = RxBuf[4]; // 控制域
TmpAddr = RxBuf[5]; // 装置地址
TmpCS = RxBuf[TmpLen+6-2]; // 校验和
TmpTail = RxBuf[TmpLen+6-1]; // 结束符
for(ii=0; ii<TmpLen; ii++) // 求校验和
{
TmpData += RxBuf[ii+4];
}
TmpData &= 0xff;
if( TmpCS != TmpData || TmpTail!=0x16) //长度及启动字符非法
return(FALSE);
}
else
return(FALSE);
if( TmpAddr != ComAddr && TmpAddr !=0xFF ) // 通讯地址非法
return(FALSE);
COMM_GEN_REG->CtrlWord = TmpCtrl; // 保存控制字
return(TRUE);
}
/**************************************************************************************
* 计算校验和。
* 返回值:校验和。
***************************************************************************************/
void P103_GetCheckSum( Uint8 *TxBuf )
{
Uint16 ii, TmpLen;
Uint8 TmpCS = 0x00;
if ( TxBuf[0] == 0x10 ) // fixed length frame
{
TxBuf[2] = ComAddr; // 装置地址
TxBuf[3] = TxBuf[1] + TxBuf[2]; // 计算校验和
TxBuf[4] = 0x16;
}
else // 可变长度报文
{
TmpLen = TxBuf[1]; // 数据长度
TxBuf[2] = TmpLen; // 数据长度重复
TxBuf[3] = 0x68; // 可变长度报文标识
TxBuf[5] = ComAddr; // 装置地址
TxBuf[9] = ComAddr; // 装置地址
for(ii=0; ii<TmpLen; ii++) // 求校验和
{
TmpCS += TxBuf[ii+4];
}
TxBuf[TmpLen+4] = TmpCS; // 校验和
TxBuf[TmpLen+5] = 0x16; // 置结束符
}
}
/***************************************************************************************
* 上送固定长度帧。
****************************************************************************************/
void P103_SendFixedFrame(struct P103_GEN_REG *COMM_GEN_REG, Uint8 *TxBuf, Uint16 CtrlWord)
{
TxBuf[0] = 0x10;
TxBuf[1] = CtrlWord;
COMM_GEN_REG->TxBufDataLen=5;
}
/*************************************************************************************************************
* Function: P103_SendASDU5(struct P103_GEN_REG *COMM_GEN_REG,Uint16 *TxBuf, Uint16 CtrlWord, Uint16 WordCOT)
*
* Input:
* CtrlWord: control area byte
* WordCOT: COT byte
* Output:
* prepared data
* Return:
* No
****************************************************************************************************************/
void P103_SendASDU5(struct P103_GEN_REG *COMM_GEN_REG, Uint8 *TxBuf, Uint16 CtrlWord, Uint16 WordCOT)
{
Uint16 TmpLen=21;
char *p1;
p1 = &EditionInform_str[0][5]; // 版本信息
TxBuf[0]=0x68;
TxBuf[1]=TmpLen; // length of ASDU+CTRL+ADDR
TxBuf[4]=CtrlWord; // C
TxBuf[6]=0x05; // TYP
TxBuf[7]=0x81; // VSQ
TxBuf[8]=WordCOT; // COT
TxBuf[10]=FUN_TYPE; // FUN:
TxBuf[11]=WordCOT-1; // INF
// TxBuf[12]=3; // COL
TxBuf[12]=2;
TxBuf[13]='Z';
TxBuf[14]='H';
TxBuf[15]='W';
TxBuf[16]='L';
TxBuf[17]='D';
TxBuf[18]=' ';
TxBuf[19]=' ';
TxBuf[20]=' ';
TxBuf[21]=*p1++; //软件版本号
TxBuf[22]=*p1++;
TxBuf[23]=*p1++;
TxBuf[24]=*p1++;
COMM_GEN_REG->TxBufDataLen=TmpLen+6;
}
/****************************************************************************************
* 修改本地时间。
*****************************************************************************************/
unsigned char P103_SetTimeSync(struct P103_GEN_REG *COMM_GEN_REG, Uint8 *RxBuf, union StatusMark_REG *StatusMark)
{
unsigned short TmpMS,TmpS,TmpMin,TmpH,TmpD,TmpMon,TmpYL;
unsigned char TmpData[12]={31,28,31,30,31,30,31,31,30,31,30,31};
TmpMS=COMM_GEN_REG->BakRxBuf[12]+(COMM_GEN_REG->BakRxBuf[13]<<8);
Clock.MilliSecond=(TmpMS%1000);
TmpS = TmpMS/1000;
Clock.Second=((TmpS/10)<<4)+(TmpS%10);
IEC103.zip_103_103 完整_IEC103_PIC33f_protection relay
版权申诉
5星 · 超过95%的资源 42 浏览量
2022-07-15
12:06:18
上传
评论
收藏 25KB ZIP 举报
我虽横行却不霸道
- 粉丝: 72
- 资源: 1万+
最新资源
- 农村信用社联合社计算机信息系统投产与变更管理办.docx
- 农村信用社联合社计算机信息系统数据管理办法.docx
- 利用SPSS作临床效度分析线上计算网站介绍-医学研究部统计谘.(医学PPT课件).ppt
- 利用Zabbix监控mysqldump定时备份数据库状态.docx
- 利用计算机解决问题的基本过程.doc
- 化工铁路通信工程总结.doc
- 北京大学网络教育软件工程作业.docx
- 医药公司(连锁店)计算机操作规程未新系统的自行按照旧制修改-新系统过制的编号加修模版.doc
- 医药公司(连锁店)计算机系统操作规程模版.doc
- 医药连锁门店计算机系统的操作和管理程序未新系统的自行按照旧制修改-新系统过制的编号加修模版.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论9