#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_