map/das-dn/inc/iec104.h

286 lines
18 KiB
C
Raw Normal View History

2024-07-08 10:27:17 +08:00
#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_