287 lines
18 KiB
C++
287 lines
18 KiB
C++
#ifndef _ZJD_IEC104_PROCESS_H_
|
||
#define _ZJD_IEC104_PROCESS_H_
|
||
|
||
#include "netproc.h"
|
||
#include "iec_101_104_lib.h"
|
||
|
||
class CIEC104ProcessItem : public CNetProcessItem
|
||
{
|
||
public:
|
||
WORD apdu_addr; //公共地址
|
||
BOOLEAN apdu_setup; //链路启动
|
||
BOOLEAN apdu_setup_sent; //链路启动是否发送
|
||
WORD apdu_ns; //发送寄存器
|
||
WORD apdu_nr; //接收寄存器
|
||
WORD apdu_ack; //应答寄存器
|
||
|
||
BOOLEAN end_of_initialisation; //初始化结束
|
||
BOOLEAN clock_synchronized_start; //时钟同步开始
|
||
BOOLEAN clock_synchronized_finish; //时钟同步结束
|
||
|
||
DWORD apdu_t0_begin;
|
||
DWORD apdu_t1_begin; //t1的计时开始值(每次发送I帧时更新,按最早的未确认I帧发送时间计;若发送U测试帧亦启动t1计时)
|
||
DWORD apdu_t2_begin; //t2的计时开始值(每次接收到I帧时更新,超时后发送S确认帧;等于0代表没有该计时器运行)
|
||
DWORD apdu_t3_begin; //t3的计时开始值(每次接收到的发送计数器和寄存器一致时启动,当发送I帧时停止计时器;等于0代表没有该计时器运行)
|
||
|
||
BOOLEAN apdu_wait_test; //是否在等待测试确认
|
||
|
||
int apdu_k_max; //k的最大值(k表示在某一特定的时间内未被DTE确认(即不被承认)的连续编号的I格式APDU的最大数目)
|
||
APDUBuffer *apdu_i_buffer; //APDU的I帧缓冲(最大k_max)
|
||
int *apdu_unack; //未确认的APDU索引列表(最大k_max)
|
||
int apdu_k; //未确认的k值
|
||
|
||
int apdu_w_max; //w的最大值
|
||
int apdu_w; //未确认的w值
|
||
|
||
int interrogation_type;
|
||
BOOLEAN interrogation_start; //总召启动
|
||
BOOLEAN interrogation_yx_fin; //遥信发送完毕
|
||
BOOLEAN interrogation_yc_fin; //遥测发送完毕
|
||
BOOLEAN interrogation_finish; //总召唤结束
|
||
|
||
int pulse_type;
|
||
BOOLEAN pulse_start; //脉冲量召唤开始
|
||
BOOLEAN pulse_fin; //脉冲量召唤结束
|
||
|
||
BOOLEAN supplement_start; //补召启动
|
||
BOOLEAN supplement_yx_fin; //遥信发送完毕
|
||
BOOLEAN supplement_yc_fin; //遥测发送完毕
|
||
BOOLEAN supplement_finish; //补召结束
|
||
BOOLEAN supplement_pulse_start; //脉冲量补召开始
|
||
BOOLEAN supplement_pulse_fin; //脉冲量补召结束
|
||
DWORD supplement_interval; //补召间隔
|
||
DWORD supplement_start_time; //补召开始时间
|
||
DWORD supplement_finish_time; //补召结束时间
|
||
|
||
DWORD apdu_t4_begin;
|
||
DWORD apdu_t5_begin; //
|
||
DWORD background_scan_begin; //背景扫描开始时间
|
||
|
||
int total_yx;
|
||
int total_yc;
|
||
int total_ym;
|
||
int total_yk;
|
||
int yx_pos;
|
||
int yc_pos;
|
||
int ym_pos;
|
||
|
||
BYTE yk_value;
|
||
|
||
YCBWBuffer ycbws;
|
||
YXBWBuffer yxbws;
|
||
EventBuffer events;
|
||
|
||
char deviceId[MAX_ID_LENGTH]; //设备ID
|
||
|
||
public:
|
||
CIEC104ProcessItem();
|
||
virtual ~CIEC104ProcessItem();
|
||
|
||
void Attach(int uid, int sock, DWORD peer_addr, WORD peer_port);
|
||
void Release(void);
|
||
};
|
||
|
||
class CIEC104Process : public CNetProcess
|
||
{
|
||
public:
|
||
CIEC104Process();
|
||
virtual ~CIEC104Process();
|
||
time_t last_sec;
|
||
struIEC104Option m_nOption;
|
||
BYTE max_frame;
|
||
|
||
int asdu_addr_length;
|
||
int cot_length;
|
||
int info_addr_length;
|
||
|
||
int apdu_t0_max; //t0的最大值(设定)
|
||
int apdu_t1_max; //t1的最大值(设定)
|
||
int apdu_t2_max; //t2的最大值(设定)
|
||
int apdu_t3_max; //t3的最大值(设定)
|
||
int apdu_t4_max; //t4的最大值(设定)
|
||
int apdu_t5_max; //t5的最大值(设定)
|
||
int background_scan_cycle; //背景扫描时间
|
||
BOOLEAN use_cycle_interrogation_command; //使用循环总召唤
|
||
|
||
BOOLEAN send_start_dt; //发送启动帧
|
||
BOOLEAN use_send_test; //使用发送测试帧
|
||
BYTE send_test_type; //发送测试帧类型
|
||
BOOLEAN use_send_end_of_initialisation;
|
||
|
||
BOOLEAN use_ns_nr_check; //使用nsnr检查
|
||
|
||
|
||
int m_yx_start_address;
|
||
int m_yc_start_address;
|
||
int m_ym_start_address;
|
||
|
||
virtual void GetItemYXBWs(CIEC104ProcessItem* pItem);
|
||
virtual void GetItemEvents(CIEC104ProcessItem* pItem);
|
||
void GetItemYCBWs(CIEC104ProcessItem* pItem);
|
||
|
||
public:
|
||
inline BOOLEAN IsClient(void)
|
||
{
|
||
return (m_nOption.net.bind_port == 0 ? TRUE : FALSE);
|
||
}
|
||
|
||
inline WORD GetCOT(BYTE* pBuf)
|
||
{
|
||
return MAKEWORD(pBuf[0], pBuf[1]);
|
||
}
|
||
|
||
inline WORD GetAsduAddr(BYTE* pBuf)
|
||
{
|
||
return MAKEWORD(pBuf[0], pBuf[1]);
|
||
}
|
||
|
||
inline DWORD GetInformationAddr(BYTE* pBuf)
|
||
{
|
||
return MAKEDWORD(MAKEWORD(pBuf[0], pBuf[1]), MAKEWORD(pBuf[2], 0));
|
||
}
|
||
|
||
void SetCOT(BYTE* pBuf, const WORD COT)
|
||
{
|
||
for (int i = 0; i < cot_length; i++)
|
||
{
|
||
pBuf[i] = COT >> (i << 3) & 0xff;
|
||
}
|
||
}
|
||
|
||
void SetAsduAddr(BYTE* pBuf, const WORD addr)
|
||
{
|
||
for (int i = 0; i < asdu_addr_length; i++)
|
||
{
|
||
pBuf[i] = addr >> (i << 3) & 0xff;
|
||
}
|
||
}
|
||
|
||
void SetInformationAddr(BYTE* pBuf, const DWORD IOA)
|
||
{
|
||
for (int i = 0; i < info_addr_length; i++)
|
||
{
|
||
pBuf[i] = IOA >> (i << 3) & 0xff;
|
||
}
|
||
};
|
||
#if 0
|
||
WORD GetCOT(BYTE* pBuf)
|
||
{
|
||
WORD COT = 0;
|
||
memcpy(&COT, pBuf, cot_length);
|
||
return (HTONS(COT));
|
||
};
|
||
WORD GetAsduAddr(BYTE* pBuf)
|
||
{
|
||
WORD asdu_addr = 0;
|
||
memcpy(&asdu_addr, pBuf, asdu_addr_length);
|
||
return (HTONS(asdu_addr));
|
||
};
|
||
DWORD GetInformationAddr(BYTE* pBuf)
|
||
{
|
||
DWORD IOA = 0;
|
||
memcpy(&IOA, pBuf, info_addr_length);
|
||
return (HTONL(IOA));
|
||
};
|
||
void SetCOT(BYTE* pBuf, const WORD COT)
|
||
{
|
||
WORD cause_of_transmission = HTONS(COT);
|
||
memcpy(pBuf, &cause_of_transmission, cot_length);
|
||
};
|
||
void SetAsduAddr(BYTE* pBuf, const WORD addr)
|
||
{
|
||
WORD asdu = HTONS(addr);
|
||
memcpy(pBuf, &asdu, asdu_addr_length);
|
||
};
|
||
void SetInformationAddr(BYTE* pBuf, const DWORD IOA)
|
||
{
|
||
DWORD info = HTONL(IOA);
|
||
memcpy(pBuf, &info, info_addr_length);
|
||
};
|
||
#endif
|
||
public:
|
||
CNetProcessItem *CreateItem(int ord);
|
||
void DestroyItem(int ord, BOOLEAN bDeleted = FALSE);
|
||
BOOLEAN OnPreCreate(int id);
|
||
|
||
virtual int OnPackageReceived(BYTE* pBuf, int count, int ord = -1);
|
||
BOOLEAN OnDealWithPeerNS(CIEC104ProcessItem* pItem, WORD ns);
|
||
BOOLEAN OnDealWithPeerNR(CIEC104ProcessItem* pItem, WORD nr);
|
||
|
||
virtual BOOLEAN OnSFrameReceived(WORD nr, int ord);
|
||
virtual BOOLEAN OnIFrameReceived(WORD ns, WORD nr, BYTE* pBuf, int count, int ord);
|
||
virtual BOOLEAN OnUFrameReceived(BOOLEAN STARTDT_ACT, BOOLEAN STARTDT_CON, BOOLEAN STOPDT_ACT, BOOLEAN STOPDT_CON, BOOLEAN TESTFR_ACT, BOOLEAN TESTFR_CON, int ord);
|
||
|
||
virtual BOOLEAN SendUFrame(BOOLEAN STARTDT_ACT, BOOLEAN STARTDT_CON, BOOLEAN STOPDT_ACT, BOOLEAN STOPDT_CON, BOOLEAN TESTFR_ACT, BOOLEAN TESTFR_CON, int ord);
|
||
virtual BOOLEAN SendIFrame(BYTE *pBuf, int len, int ord);
|
||
virtual BOOLEAN SendSFrame(int ord);
|
||
inline BOOLEAN SendRawFrame(BYTE* pBuf, int len, int ord)
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
BOOLEAN OnReceiveSingle_point_information(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //单点遥信
|
||
BOOLEAN OnReceiveSingle_point_information_with_time_tag(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带时标的单点遥信
|
||
BOOLEAN OnReceiveSingle_point_information_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带CP56Time2a时标的单点信息
|
||
BOOLEAN OnReceiveDouble_point_information(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //双点遥信
|
||
BOOLEAN OnReceiveDouble_point_information_with_time_tag(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带时标的双点遥信
|
||
BOOLEAN OnReceiveDouble_point_information_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带CP56Time2a时标的双点信息
|
||
BOOLEAN OnReceiveMeasured_value_normalised(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //测量值,归一化值
|
||
BOOLEAN OnReceiveMeasured_value_scaled(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //测量值,标度化值
|
||
BOOLEAN OnReceiveMeasured_value_short_floating_point(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //测量值,短浮点数
|
||
BOOLEAN OnReceiveMeasured_value_normalised_without_quality(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //测量值,不带品质描述的归一化测量值
|
||
BOOLEAN OnReceiveMeasured_value_normalised_with_time_tag(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带时标的遥测量,归一化值
|
||
BOOLEAN OnReceiveMeasured_value_scaled_with_time_tag(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带时标的遥测量,标度化值
|
||
BOOLEAN OnReceiveMeasured_value_short_floating_point_with_time_tag(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带时标的遥测量值,短浮点数
|
||
BOOLEAN OnReceiveMeasured_value_normalised_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带CP56Time2a时标的遥测量,归一化值
|
||
BOOLEAN OnReceiveMeasured_value_scaled_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带CP56Time2a时标的遥测量,标度化值
|
||
BOOLEAN OnReceiveMeasured_value_short_floating_point_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //带CP56Time2a时标的遥测量值,短浮点数
|
||
BOOLEAN OnReceiveIntegrated_totals(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //累积量
|
||
BOOLEAN OnReceiveInterrogation_command(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //总召唤
|
||
BOOLEAN OnReceiveClock_synchronisation_command(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //时钟同步
|
||
BOOLEAN OnReceiveCounter_Interrogation_command(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //召唤电度量
|
||
BOOLEAN OnReceiveSingle_command(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //单点遥控
|
||
BOOLEAN OnReceiveDouble_command(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //单点遥控
|
||
BOOLEAN OnReceiveSet_point_command_normalized(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //设定归一化值命令
|
||
BOOLEAN OnReceiveSet_point_command_scaled(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //设定标度化值命令
|
||
BOOLEAN OnReceiveSet_point_command_short_floating(CIEC104ProcessItem* pItem, int uid, BYTE* pBuf, BOOLEAN sq, BOOLEAN pn, BOOLEAN test, BYTE num, WORD cot); //设定短浮点值命令
|
||
BOOLEAN GetYKFrame(CIEC104ProcessItem* pItem, int ord); //遥控报文
|
||
BOOLEAN GetYTFrame(CIEC104ProcessItem* pItem, int ord); //遥设报文
|
||
BOOLEAN SendInterrogation_command(CIEC104ProcessItem* pItem, int ord); //总召唤
|
||
BOOLEAN SendClock_synchronisation_command(CIEC104ProcessItem* pItem, int ord); //时钟同步
|
||
BOOLEAN SendCounter_Interrogation_command(CIEC104ProcessItem* pItem, int ord); //召唤电度量
|
||
|
||
virtual int MakeYKFrame(CIEC104ProcessItem* pItem, int ord);
|
||
virtual int MakeYTFrame(CIEC104ProcessItem* pItem, int ord);
|
||
int Receive_Interrogation_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //总召唤
|
||
int Receive_Clock_synchronisation_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //时钟同步
|
||
int Receive_Counter_interrogation_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //累积量
|
||
int Receive_Reset_process_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //复位进程
|
||
virtual int Receive_Single_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //单点令
|
||
virtual int Receive_Double_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //单点令
|
||
virtual int Receive_Set_point_command_normalized(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //设定规一化值命令
|
||
virtual int Receive_Set_point_command_scaled(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //设定标度化值命令
|
||
virtual int Receive_Set_point_command_short_floating(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //设定短浮点值命令
|
||
int Receive_HisDataRequest_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE* pTarget, int& count); //补录数据
|
||
int Receive_His_Interrogation_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE VSQ, BYTE* pTarget, int& count); //补录数据
|
||
int Receive_His_Counter_Interrogation_command(CIEC104ProcessItem* pItem, const BYTE* pBuf, BYTE cause_of_transmission, BYTE VSQ, BYTE* pTarget, int& count); //补录数据
|
||
|
||
int Send_End_of_initialisation(CIEC104ProcessItem* pItem, int ord);
|
||
int Send_Single_point_information(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Single_point_information_with_time_tag(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Single_point_information_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Double_point_information(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Double_point_information_with_time_tag(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Double_point_information_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Measured_value_normalised(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Measured_value_scaled(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Measured_value_short_floating_point(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Measured_value_normalised_without_quality(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_Integrated_totals(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_SPONT);
|
||
int Send_FrameInterrogation(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_ACTTREM);
|
||
int Send_FrameCounterInterrogation(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_ACTTREM);
|
||
|
||
int Send_Test_command(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_ACTTREM);
|
||
int Send_Test_command_with_time_tag_cp56time2a(CIEC104ProcessItem* pItem, int ord, BYTE cause_of_transimission = IEC_101_104_COT_ACTTREM);
|
||
};
|
||
#endif //_ZJD_IEC104_PROCESS_H_
|