You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

312 lines
12 KiB
C

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/************************************************************************************
*
* Copyright (C) 2004-2005 SCADA Control Technology Co., Ltd.
* All rights reserved.
*
* 文件名称buban101.h
* 文件标识部颁101规约
* 摘 要101规约的处理的结构、宏还有函数定义
*
* 当前版本1.0
* 作 者aaawen
* 完成日期2005/09/08
*
* 取代版本1.0
* 原作者
* 完成日期:
*
* 说 明:数据定义规则
* u8 --- BYTE(usigned char)
* ch --- char
* w --- WORD(u_short, usigned short)
* sh --- short
* b --- BOOL(bool)
* i --- int
* l --- long
* u32 --- u_32
* ui --- unsigned int(u_int)
* ul --- unsigned long(u_long)
* f --- float
* db --- double
* c --- class
* s --- struct
* sta --- static
* g --- 全局变量
* Array --- 数组
* a --- 数组
* m_ --- 数据成员
* p --- 指针
* str --- 字符串
* 全部大写 --- 常量
* 首字节必须大写--- 类名称,结构,函数
**************************************************************************************/
// buban101.h: interface for the buban101 class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(_BUBAN101_H_200509081012__INCLUDED_)
#define _BUBAN101_H_200509081012__INCLUDED_
#ifdef OS_LINUX
#include "baohulib/common.h"
#else
#include "common.h"
#endif
//////////////////////////////////////////////////////////////////////////
// 宏定义 //
// WEN 2005.09.08 //
//////////////////////////////////////////////////////////////////////////
//信息体地址
#define INFO_DI_BASEADDR 0x001 // 单,双点遥信量
#define INFO_PROTECT_BASEADDR 0x401 // 保护单个事件信息
#define INFO_PROTECT_STARTBASEADDR 0x501 // 保护启动事件
#define INFO_PROTECT_GROUPBASEADDR 0x601 // 保护成组输出电路信息
#define INFO_AI_BASEADDR 0x701 // 遥测量
#define INFO_PARA_BASEADDR 0x901 // 参数地址,和遥测量一一对应
#define INFO_YKYT_BASEADDR 0xB01 // 遥控、遥调
#define INFO_SET_BASEADDR 0xB81 // 设定地址范围
#define INFO_PI_BASEADDR 0xC01 // 电度量
#define INFO_STEP_BASEADDR 0xC81 // 步长量(如:变压器分接头)
#define INFO_BIN_BASEADDR 0xCA1 // 二进制状态信息
#define INFO_BCD_BASEADDR 0xCC1 // BCD码(水位,频率)
#define INFO_STATUS_BASEADDR 0xCE9 // 子站远东终端状态
#define INFO_FILE_BASEADDR 0xCEA // 文件传输
//一组中的个类型数据最大个数
#define MAX_GROUP_AINUM 128
//#define MAX_GROUP_FLOATAINUM 128
#define MAX_GROUP_DINUM 128
#define MAX_GROUP_PINUM 32
//转发各种类型的数据的最大数量
#define MAX_AINUM 120
#define MAX_FLOATAINUM 9
#define MAX_DINUM 127
#define MAX_PINUM 35
#define MAX_POLL_CMD_BUF_NUM 32 // 最大命令缓冲区数目
// 命令类型定义
#define ASK_LINK 0 // 请求链路
#define RST_LINK 1 // 复位链路
#define RTU_TIME 2 // 对时时间
#define ASK_DI_DATA 3 // 召唤2 级数据YX
#define ASK_AI_DATA 4 // 召唤2 级数据YC
#define ASK_PI_DATA 5 // 召唤2 级数据YM
#define ASK_ALL_DATA 6 // 初始化总召唤
#define ASK_FIRST_DATA 7 // 召唤1 级数据
#define ASK_SECOND_DATA 8 // 召唤2 级数据
#define ACK 9 // 确认回答
#define ANS_LINK 10 // 链路回答
#define ASK_PI 11 // 召唤数据YM
#define ASK_DATA_NO 12 // 无所请求的数据
#define ASK_ALLDATA_END 13 // 召唤数据结束(用于总召唤和电度召唤)
//#define ASK_ALLDATA_ACK 14 // 召唤数据确认(用于总召唤和电度召唤)
// 定时召唤命令及命令名称
#define BUBAN101_TIMER_CMD_NUM 2 // 最大命令数目
#define MAX_POLLCMD_BUF_LEN 320 // 最大命令缓冲区数目
// 控制模式
#define CONTROL_DOUBLE 0 // 双点控制
#define CONTROL_SINGAL 1 // 单点控制
#define CONTROL_DIRECT 2 // 直接控制
// 规约版本号
#define VER_BUBAN_101 0 // 部颁101
#define VER_IEC870_5_101 1 // IEC101
/////////////////////////////结构定义/////////////////////////////////
typedef struct
{
long CmdTimerCnt;
long CmdTimerConst;
} BUBAN101CMDDEF;
typedef struct tagBUBAN101PORTPARAM
{
BOOL RstLinkOk; // 初始化时FALSE
BOOL LinkOk; // 主站初始化标志 1:ok; 0:no 初始化时FALSE
BOOL Initdata; // 初始化总召唤标志 TRUE收到总召唤结束帧
// FALSE未收到总召唤结束帧
// 召唤电度标志 TRUE收到召唤结束帧
// FALSE未收到召唤结束帧
BYTE LinkAddr; // 地址域
BYTE CtlByte; // 控制信息
long LinkOkCnt;
long lTimeOutConst; // 超时时间间隔
short RtuVersion; // 版本号
short BalanceOrNot; //是否平衡式 =1:ok; =0:no
short CurCmdIdx;
short YkMode; // 遥控方式(=0双点遥控=1单点遥控=2直控方式)
// wen 2005.01.15 修改数据信息体起始地址
int iAiBaseAddr; //遥测起始地址
int iDiBaseAddr; //遥信起始地址
int iPiBaseAddr; //遥脉起始地址
int iYkBaseAddr; //遥控起始地址
BYTE m_au8RecvBuf[300];
int m_iRecvLen;
BUBAN101CMDDEF CmdTime[BUBAN101_TIMER_CMD_NUM];
SIO_PARAM_BAOHU_DEF *m_psBaoHu; // 该规约的端口数据指针
} BUBAN101PORTPARAM, *pBUBAN101PORTPARAM;
/////////////////////////以下为通用函数接口///////////////////////////
/*!
\brief 读取配置函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban101ReadConfig(int commid); // 初始化处理
/*!
\brief 读取端口数据函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
\param buf -- 数据源缓冲区指针
\param len -- 数据源长度
*/
void Buban101RecvData(int commid, u_char *buf, int len);// 规约读数据处理
/*!
\brief 规约数据处理定时器函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban101Timer(int commid); // 定时器处理
/*!
\brief 遥控遥调数据处理函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
\param buf -- 数据源缓冲区指针
\param len -- 数据源长度
*/
void Buban101YkYtProcess(int commid, u_char *buf, int len); // 遥控遥调处理
/*!
\brief 系统下发对时函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban101SendSystemTime(int commid); // 系统对时
/*!
\brief 系统退出时规约处理函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban101Exit(int commid); // 规约退出
/*!
\brief 保护命令处理函数
\param commid -- 端口号
\param rtumsg -- 下发的保护命令指针
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban101BaoHuCmdProcess(int commid, RTUMSG *rtumsg, BOOL bUpData);
/*!
\brief 取保护数据库指针函数
\param commid -- 端口号
\param iProvAddr -- 统一编排的保护转发地址
\param ppBaoHuDB -- 存放保护数据指针的指针
\retval -- 返回该装置保护数据组数
*/
int Buban101GetBaohuDataBase(int commid, int iProvAddr, GROUPDEF **ppBaoHuDB);
/////////////////////////通用函数接口结束///////////////////////////////
/////////////////////////buban101公共函数接口///////////////////////////
// 校验数据帧是否正确
BOOL Buban101Check(u_char* msg, int len);
//计算 Buban101 累加和检验码
u_char CalBuban101Lpc(u_char* msg, int len);
//指令缓冲区初始化
void InitBuban101CommandBuffer(int commid);
/////////////////////////buban101公共函数接口结束///////////////////////
/////////////////////////以下为通用函数支持接口/////////////////////////
void Buban101ProvMakeYkYtCommand(int commid, u_char *buf, int len);
/////////////////////////通用函数支持接口结束///////////////////////////
///////////////////////////以下为指令生成函数///////////////////////////
//生成 Buban101 命令?
void MakeBuban101Command(u_32 commid, u_char cmdidx);
//生成遥控遥调指令
void MakeBuBan101YkYtCommand(u_32 commid, u_char *buf, int len);
///////////////////////////指令生成函数结束/////////////////////////////
/////////////////////以下为POLLING规约常规函数接口//////////////////////
void Buban101FindNextCmd(int commid);
BOOL Buban101FindNextCmdEx(int commid);
void Buban101SendCmdFormPollCmdBuf(int commid);
//////////////////////POLLING规约常规函数接口结束///////////////////////
///////////////////////以下为规约处理函数接口///////////////////////////
//======================以下为主站数据处理============================
void Buban101ProcessData(u_32 commid, BUBAN101PORTPARAM *psPortParam, BOOL bProcess);
void Buban101shortprocess(RTUMSG *rtumsg);
void Buban101longprocess(RTUMSG *rtumsg);
void Buban101NoChanged(RTUMSG * rtumsg);
//Buban101 初始化数据处理
void Buban101InitdataProecss(RTUMSG * rtumsg);
//电度结束帧
void Buban101PidataEnd(RTUMSG * rtumsg);
//设定确认
void Buban101SetAck(RTUMSG *rtumsg);
//Buban101 遥控遥调返校程序
void Buban101YkYtAck(RTUMSG * rtumsg);
//Buban101 对时程序
void Buban101SynTime(RTUMSG * rtumsg);
// 子站主动传送遥信变位帧
void Buban101AutoSendDiProcess(RTUMSG *rtumsg);
void Buban101AiWithPzDataProcess(RTUMSG *, int);
void Buban101AllAiDataProcess(RTUMSG *rtumsg);
void Buban101DiDataProcess(RTUMSG *rtumsg, int);
void Buban101SoeDataProcess(RTUMSG *rtumsg, int);
void Buban101PiDataProcess(RTUMSG * rtumsg);
void Buban101PiWithTimeDataProcess(RTUMSG *rtumsg);
//保护数据处理
void Buban101BaoHuDataProcess(RTUMSG *rtumsg);
void Buban101DefaultBaoHuDataProcess(RTUMSG *rtumsg);
// 新增函数,含有 7 BYTE 的时标
void Buban101SoeDataProcessWithCP56Time2a(RTUMSG *rtumsg, int flag);
void Buban101AiWithDataProcessWithM_ME_TD_1(RTUMSG * rtumsg);
void Buban101AiWithDataProcessWithM_ME_TE_1(RTUMSG * rtumsg);
void Buban101AiWithDataProcessWithM_ME_TF_1(RTUMSG * rtumsg);
void Buban101PiWithTimeDataProcessWithM_IT_TB_1(RTUMSG *rtumsg);
//======================以下为子站数据处理============================
void ProvBuban101dataProcess(int commid, RTUMSG *rtumsg);
void ProvBuban101shortprocess(int commid, RTUMSG * rtumsg);
void ProvBuban101longprocess(int commid, RTUMSG * rtumsg);
void ProvBuban101SendAllData(int commid, RTUMSG * rtumsg);
void ProvBuban101SendPIData(int commid, RTUMSG * rtumsg);
void ProvBuban101ProcessTime(int commid, RTUMSG *rtumsg);
//iGroupNo=0为响应总召唤
void ProvBuban101SendPI(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban101SendAI(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban101SendDI(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban101YkYtData(int commid, RTUMSG *rtumsg);
void MakeProvBuban101YkYtAckMsg(int commid, int pnt, int op, int step);
void ProvBuban101SendClass1(int commid);
void ProvBuban101SendClass2(int commid);
void ProvMakeBuban101Command(int commid, u_char cmdidx);
/////////////////////////规约处理函数接口结束///////////////////////////
#endif // !defined(_BUBAN101_H_200509081012__INCLUDED_)