map/das-dn/inc/iec104.h
2024-07-08 10:27:17 +08:00

286 lines
18 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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 call_type;
BOOLEAN interrogation_start; //总召启动
BOOLEAN interrogation_yx_fin; //遥信发送完毕
BOOLEAN interrogation_yc_fin; //遥测发送完毕
BOOLEAN interrogation_finish; //总召唤结束
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_