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.

292 lines
11 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.
*
* 文件名称buban104.h
* 文件标识部颁104规约
* 摘 要104规约的处理的结构、宏还有函数定义
*
* 当前版本1.0
* 作 者aaawen
* 完成日期2005/09/14
*
* 取代版本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 --- 字符串
* 全部大写 --- 常量
* 首字节必须大写--- 类名称,结构,函数
**************************************************************************************/
// buban104.h: interface for the buban104 class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(_BUBAN104_H_200509141152__INCLUDED_)
#define _BUBAN104_H_200509141152__INCLUDED_
#ifdef OS_LINUX
#include "baohulib/common.h"
#else
#include "common.h"
#endif
//////////////////////////////////////////////////////////////////////////
// 宏定义 //
// WEN 2005.09.08 //
//////////////////////////////////////////////////////////////////////////
#define MAX_104_PINUM 30
#define FORMAT_I 14 // I-格式
#define FORMAT_S 15 // S-格式
#define FORMAT_U_START_ACT 16 // U-格式启动
#define FORMAT_U_START_CON 17 // U-格式启动应答
#define FORMAT_U_STOP_ACT 18 // U-格式停止
#define FORMAT_U_STOP_CON 19 // U-格式停止应答
#define FORMAT_U_TEST_ACT 20 // U-格式测试
#define FORMAT_U_TEST_CON 21 // U-格式测试应答
// 定时召唤命令及命令名称
#define BUBAN104_TIMER_CMD_NUM 3 // 最大命令数目
#define MAX_SEQUENCE 0x7fff // 最大帧计数
#define MAX_FRAMEMATCHING_SIZE 2 // 帧序匹配最大尺寸
// 规约版本号
#define VER_BUBAN_104 0 // 部颁104
#define VER_IEC870_5_104 1 // IEC104
/////////////////////////////结构定义/////////////////////////////////
typedef struct
{
long CmdTimerCnt;
long CmdTimerConst;
} BUBAN104CMDDEF;
typedef struct tagBUBAN104PORTPARAM
{
BOOL LinkOk; // 主站初始化标志 1:ok; 0:no 初始化时FALSE
BOOL Initdata; // 初始化总召唤标志 TRUE收到总召唤结束帧
// FALSE未收到总召唤结束帧
// 召唤电度标志 TRUE收到召唤结束帧
// FALSE未收到召唤结束帧
WORD wLinkAddr; // 地址域
WORD wSendSequence; // 发送帧计数
WORD wRecvSequence; // 接收帧计数
WORD wAckSequence; // 应答帧计数
BOOL bAckRight; // 应答帧是否同步 (子站端有效)
BOOL bStopComm; // 通讯停止
BOOL bSendFormatI;
BYTE ProvAckOrNot; // 转发是否要求应答
long lTimeOutSendTest;// 超时发送测试帧
long lTimeOutConst; // 超时时间间隔
long lTimeOutCnt; // 超时时间计数
long lYkYtAckTimeConst;// 返校超时时间间隔
long lYkYtAckTime; // 返校超时时间计数
BOOL bCloseSocket; // 关闭socket端口
char YkCmdBuf[32]; // 遥控延迟发送返校缓冲区
long lYkCmdBuflen; // 遥控延迟发送返校缓冲区数据长
long m_lNoDataCnt; // 无数据时间,超过超时时间发送测试帧
short RtuVersion; // 版本号
int m_iPublishYear; // 发布时间(缺省为2000版)
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;
int m_iFrameSize; // 帧序应答尺寸
BYTE m_bProvAiType; // 转发遥测类型标识
BUBAN104CMDDEF CmdTime[BUBAN104_TIMER_CMD_NUM];
SIO_PARAM_BAOHU_DEF *m_psBaoHu; // 该规约的端口数据指针
} BUBAN104PORTPARAM, *pBUBAN104PORTPARAM;
/////////////////////////以下为通用函数接口///////////////////////////
/*!
\brief 读取配置函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban104ReadConfig(int commid); // 初始化处理
/*!
\brief 读取端口数据函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
\param buf -- 数据源缓冲区指针
\param len -- 数据源长度
*/
void Buban104RecvData(int commid, u_char *buf, int len);// 规约读数据处理
/*!
\brief 规约数据处理定时器函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban104Timer(int commid); // 定时器处理
/*!
\brief 遥控遥调数据处理函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
\param buf -- 数据源缓冲区指针
\param len -- 数据源长度
*/
void Buban104YkYtProcess(int commid, u_char *buf, int len); // 遥控遥调处理
/*!
\brief 系统下发对时函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban104SendSystemTime(int commid); // 系统对时
/*!
\brief 系统退出时规约处理函数
\param commid -- 端口号
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban104Exit(int commid); // 规约退出
/*!
\brief 保护命令处理函数
\param commid -- 端口号
\param rtumsg -- 下发的保护命令指针
\note
取值范围0 -- MaxSerialPortNum + MaxNetPortNum -1\n
*/
void Buban104BaoHuCmdProcess(int commid, RTUMSG *rtumsg, BOOL bUpData);
/*!
\brief 取保护数据库指针函数
\param commid -- 端口号
\param iProvAddr -- 统一编排的保护转发地址
\param ppBaoHuDB -- 存放保护数据指针的指针
\retval -- 返回该装置保护数据组数
*/
int Buban104GetBaohuDataBase(int commid, int iProvAddr, GROUPDEF **ppBaoHuDB);
/////////////////////////通用函数接口结束///////////////////////////////
/////////////////////////buban104公共函数接口///////////////////////////
//指令缓冲区初始化
void InitBuban104CommandBuffer(int commid);
//关闭socket通讯
void Buban104CloseSocket(u_32 commid);
/////////////////////////buban104公共函数接口结束///////////////////////
/////////////////////////以下为通用函数支持接口/////////////////////////
void Buban104ProvMakeYkYtCommand(int commid, u_char *buf, int len);
/////////////////////////通用函数支持接口结束///////////////////////////
///////////////////////////以下为指令生成函数///////////////////////////
//生成 Buban104 命令?
void MakeBuban104Command(u_32 commid, u_char cmdidx);
//生成遥控遥调指令
void MakeBuBan104YkYtCommand(u_32 commid, u_char *buf, int len);
///////////////////////////指令生成函数结束/////////////////////////////
/////////////////////以下为POLLING规约常规函数接口//////////////////////
void Buban104FindNextCmd(int commid);
void Buban104FindNextProvCmd(int commid);
void Buban104SendCmdFormPollCmdBuf(int commid);
//////////////////////POLLING规约常规函数接口结束///////////////////////
///////////////////////以下为规约处理函数接口///////////////////////////
//======================以下为主站数据处理============================
void Buban104ProcessData(u_32 commid, BUBAN104PORTPARAM *psPortParam, BOOL bProcess);
//处理数据格式I
void Buban104FormatI(RTUMSG *rtumsg);
//处理数据格式U
void Buban104FormatU(RTUMSG *rtumsg);
//Buban104 初始化数据处理
void Buban104InitdataProecss(RTUMSG * rtumsg);
//电度结束帧
void Buban104PidataEnd(RTUMSG * rtumsg);
//设定确认
void Buban104SetAck(RTUMSG *rtumsg);
//Buban104 遥控遥调返校程序
void Buban104YkYtAck(RTUMSG * rtumsg);
//Buban104 对时程序
void Buban104SynTime(RTUMSG * rtumsg);
// 子站主动传送遥信变位帧
void Buban104AutoSendDiProcess(RTUMSG *rtumsg);
void Buban104AiWithPzDataProcess(RTUMSG *, int);
void Buban104AllAiDataProcess(RTUMSG *rtumsg);
void Buban104AllFloatAiDataProcess(RTUMSG *rtumsg);
void Buban104DiDataProcess(RTUMSG *rtumsg, int);
void Buban104SoeDataProcess(RTUMSG *rtumsg, int);
void Buban104PiDataProcess(RTUMSG * rtumsg);
void Buban104PiWithTimeDataProcess(RTUMSG *rtumsg);
//保护数据处理
void Buban104BaoHuDataProcess(RTUMSG *rtumsg);
void Buban104DefaultBaoHuDataProcess(RTUMSG *rtumsg);
// 新增函数,含有 7 BYTE 的时标
void Buban104SoeDataProcessWithCP56Time2a(RTUMSG *rtumsg, int flag);
void Buban104AiWithDataProcessWithM_ME_TD_1(RTUMSG * rtumsg);
void Buban104AiWithDataProcessWithM_ME_TE_1(RTUMSG * rtumsg);
void Buban104AiWithDataProcessWithM_ME_TF_1(RTUMSG * rtumsg);
void Buban104PiWithTimeDataProcessWithM_IT_TB_1(RTUMSG *rtumsg);
//======================以下为子站数据处理============================
void ProvBuban104dataProcess(int commid, RTUMSG *rtumsg);
void ProvBuban104FormatI(int commid, RTUMSG *rtumsg);
void ProvBuban104FormatU(int commid, RTUMSG *rtumsg);
void ProvBuban104FormatS(int commid, RTUMSG *rtumsg);
void ProvBuban104SendAllData(int commid, RTUMSG *rtumsg);
void ProvBuban104SendPIData(int commid, RTUMSG *rtumsg);
void ProvBuban104ProcessTime(int commid, RTUMSG *rtumsg);
//iGroupNo=0为响应总召唤
void ProvBuban104SendPI(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban104SendAI(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban104SendDI(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban104SendSoe(int commid);
void ProvBuban104YkYtData(int commid, RTUMSG *rtumsg);
void MakeProvBuban104YkYtAckMsg(int commid, int pnt, int op, int step);
void ProvBuban104SendClass1(int commid);
void ProvBuban104SendClass2(int commid);
void ProvMakeBuban104Command(int commid, u_char cmdidx);
void ProvBuban104SendAIwithFloat(int commid, RTUMSG *rtumsg, int iGroupNo);
void ProvBuban104SendClass2withFloat(int commid);
/////////////////////////规约处理函数接口结束///////////////////////////
#endif // !defined(_BUBAN104_H_200509141152__INCLUDED_)