/**************************************************************************** Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED. This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT be copied by any method or incorporated into another program without the express written consent of Aerospace C.Power. This Information or any portion thereof remains the property of Aerospace C.Power. The Information contained herein is believed to be accurate and Aerospace C.Power assumes no responsibility or liability for its use in any way and conveys no license or title under any patent or copyright and makes no representation or warranty that this Information is free from patent or copyright infringement. ****************************************************************************/ #ifndef PROTO_645_H #define PROTO_645_H #include "os_types_api.h" #include "iot_utils_api.h" #include "iot_pkt_api.h" #include "iot_rtc_api.h" #ifdef __cplusplus extern "C" { #endif /* pack for the structures in the whole file */ #pragma pack(push) /* save the pack status */ #pragma pack(1) /* 1 byte align */ /* unknown protocol ID */ #define PROTO_UNKNOWN_ID 0 /* ID for DL/T 645-1997 */ #define PROTO_645_1997_ID 1 /* ID for DL/T 645-2007 */ #define PROTO_645_2007_ID 2 /* defines bit num per byte in transmission */ #define PROTO_645_BIT_N_PER_BYTE 11 /* frame start char definition */ #define PROTO_645_START_CHAR 0x68 /* frame end char definition */ #define PROTO_645_END_CHAR 0x16 /* preamble char definition */ #define PROTO_645_PREAMBLE_CHAR 0xFE /* define data block separate characters */ #define PROTO_645_DB_SEPARATE_CHAR 0xAA /* preamble code length */ #define PROTO_645_PREAMBLE_LEN 4 /* define data block separate characters */ #define PROTO_645_EVT_SEPARATE_LEN (2) /* data identification length for DL/T 645-1997 */ #define PROTO_645_1997_DI_LEN (2) /* data identification length for DL/T 645-2007 */ #define PROTO_645_2007_DI_LEN (4) /* data passward length for DL/T 645-2007 */ #define PROTO_645_2007_PASSWORD_LEN (4) /* data operator code length for DL/T 645-2007 */ #define PROTO_645_2007_OPERATOR_LEN (4) /* data recording interval time code length for DL/T 645-2007 */ #define PROTO_645_2007_RED_INTER_TM_LEN (2) /* data recording 645 protocol header length */ #define PROTO_645_HEADER_LEN (10) /* data recording 645 protocol end length */ #define PROTO_645_END_LEN (2) /* define the maximum payload len of 645 protocol, excluding head and end */ #define PROTO_645_MAX_DATA_LEN (255) /* define the maximum payload len of 645 protocol, including head and end */ #define PROTO_645_MAX_PKT_LEN PROTO_645_MAX_DATA_LEN + \ PROTO_645_HEADER_LEN + PROTO_645_END_LEN /* read data max length */ #define PROTO_645_READ_DATA_MAX_LEN 200 /* write data max length */ #define PROTO_645_WRITE_DATA_MAX_LEN 50 /* meter read frame length for DL/T 645-1997 */ #define PROTO_645_1997_READ_DATA_PKT_LEN 14 /* default baud rate for DL/T 645-1997 */ #define PROTO_645_1997_DEFAULT_BAUD 1200 /* default baud rate for DL/T 645-2007 */ #define PROTO_645_2007_DEFAULT_BAUD 2400 /* meter address read frame length for DL/T 645-2007 */ #define PROTO_645_2007_READ_ADDR_PKT_LEN 12 /* meter address read frame length for DL/T 645-2007 */ #define PROTO_645_2007_READ_DATA_PKT_LEN 16 /* meter nack frame length for DL/T 645-2007 */ #define PROTO_645_2007_NACK_PKT_LEN 13 /* meter ack frame length for DL/T 645-2007 */ #define PROTO_645_2007_ACK_PKT_LEN 12 /* correct time frame length for DL/T 645 */ #define PROTO_645_CORRECT_DATA_PKT_LEN 18 /* frozen frame length */ #define PROTO_645_2007_FROZEN_DATA_PKT_LEN 16 /* meter protocol version number len */ #define PROTO_645_2007_VER_NUM_LEN 16 /* meter manufacturing date len */ #define PROTO_645_2007_MFG_DATE_LEN 10 /* meter event cnt data length */ #define PROTO_645_2007_DI_CNT_DATE_LEN 3 /* DI: read meter running status word 1, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_RUN_STA_WORD_1 (0x04000501u) /* DI: read meter running status word 7, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_RUN_STA_WORD_7 (0x04000507u) /* DI: Event status word, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_EVENT_STA_WORD (0x04001501u) /* DI: total positive active power, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_FOR_WATTH_T (0x00010000u) /* DI: read meter addr, for see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_R_ADDR (0x04000401u) /* DI: devive asset management code */ #define PROTO_645_2007_DI_AMC (0x04000403u) /* DI: read meter manufacturing date, for see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_R_MFG (0x0400040Cu) /* DI read meter protocol version number, for see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_R_PROTO_VER (0x0400040Du) /* DI: reset active report status word, see standard * extended DL/T 645-2007 */ #define PROTO_645_2007_DI_RESET_EVENT_RPT (0x04001503u) /* DI: read meter time, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_TIME (0x0400010cu) /* DI: read meter time, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_TIME_YMD (0x04000101u) /* DI: read meter time, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_TIME_HMS (0x04000102u) /* DI: read/write demand period, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_DEMAND_PERIOD (0x04000103u) /* DI: read/write demand slide interval, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_DEMAND_SLIDE_INTERVAL (0x04000104u) /* DI: meter baud word, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_BAUD_WORD (0x04000705u) /* DI: read load recording interval time, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_LOAD_INTER_TIME (0x04000A02u) /* DI: first settlement day setting, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_MSD_1 (0x04000B01u) /* DI: second settlement day setting, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_MSD_2 (0x04000B02u) /* DI: third settlement day setting, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_MSD_3 (0x04000B03u) /* DI: module dev id, see standard extended DL/T 645-2007 */ #define PROTO_645_2007_DI_DEV_ID (0x0400140Du) /* DI: the day freeze data, see standard extended DL/T 645-2007. * the last 1st day freeze data DI is PROTO_645_2007_DI_DF + 1. * ...... * the last Nst day freeze data DI is PROTO_645_2007_DI_DF + N. */ #define PROTO_645_2007_DI_DF (0x0506FF00u) /* DI: the hour freeze data, see standard extended DL/T 645-2007 * the last 1st hour freeze data DI is PROTO_645_2007_DI_HF + 1. * ...... * the last Nst hour freeze data DI is PROTO_645_2007_DI_HF + N. */ #define PROTO_645_2007_DI_HF (0x0504FF00u) /* DI: the voltage data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_V_A (0x02010100u) #define PROTO_645_2007_DI_V_B (0x02010200u) #define PROTO_645_2007_DI_V_C (0x02010300u) #define PROTO_645_2007_DI_V_ALL (0x0201FF00u) /* DI: the current data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_I_A (0x02020100u) #define PROTO_645_2007_DI_I_B (0x02020200u) #define PROTO_645_2007_DI_I_C (0x02020300u) #define PROTO_645_2007_DI_I_N (0x02800001u) #define PROTO_645_2007_DI_I_ALL (0x0202FF00u) /* DI: the active power data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_P_T (0x02030000u) #define PROTO_645_2007_DI_P_A (0x02030100u) #define PROTO_645_2007_DI_P_B (0x02030200u) #define PROTO_645_2007_DI_P_C (0x02030300u) #define PROTO_645_2007_DI_P_ALL (0x0203FF00u) /* DI: the reactive power data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_Q_T (0x02040000u) #define PROTO_645_2007_DI_Q_A (0x02040100u) #define PROTO_645_2007_DI_Q_B (0x02040200u) #define PROTO_645_2007_DI_Q_C (0x02040300u) #define PROTO_645_2007_DI_Q_ALL (0x0204FF00u) /* DI: the apparent power, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_S_T (0x02050000u) #define PROTO_645_2007_DI_S_A (0x02050100u) #define PROTO_645_2007_DI_S_B (0x02050200u) #define PROTO_645_2007_DI_S_C (0x02050300u) #define PROTO_645_2007_DI_S_ALL (0x0205FF00u) /* DI: the power factor data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_PF_T (0x02060000u) #define PROTO_645_2007_DI_PF_A (0x02060100u) #define PROTO_645_2007_DI_PF_B (0x02060200u) #define PROTO_645_2007_DI_PF_C (0x02060300u) #define PROTO_645_2007_DI_PF_ALL (0x0206FF00u) /* DI: the phase angle data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_PA_A (0x02070100u) #define PROTO_645_2007_DI_PA_B (0x02070200u) #define PROTO_645_2007_DI_PA_C (0x02070300u) #define PROTO_645_2007_DI_PA_ALL (0x0207FF00u) /* DI: the voltage waveform distortion data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_VW_A (0x02080100u) #define PROTO_645_2007_DI_VW_B (0x02080200u) #define PROTO_645_2007_DI_VW_C (0x02080300u) #define PROTO_645_2007_DI_VW_ALL (0x0208FF00u) /* DI: the current waveform distortion data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_IW_A (0x02090100u) #define PROTO_645_2007_DI_IW_B (0x02090200u) #define PROTO_645_2007_DI_IW_C (0x02090300u) #define PROTO_645_2007_DI_IW_ALL (0x0209FF00u) /* DI: the A phase voltage harmonic content distortion data, * see standard DL/T 645-2007. * the 1st harmonic content data DI is PROTO_645_2007_DI_VHC_A + 1. * ...... * the Nst harmonic content data DI is PROTO_645_2007_DI_VHC_A + N. */ #define PROTO_645_2007_DI_VHC_A (0x020A0100u) /* DI: the B phase voltage harmonic content distortion data, * see standard DL/T 645-2007. * the 1st harmonic content data DI is PROTO_645_2007_DI_VHC_B + 1. * ...... * the Nst harmonic content data DI is PROTO_645_2007_DI_VHC_B + N. */ #define PROTO_645_2007_DI_VHC_B (0x020A0200u) /* DI: the C phase voltage harmonic content distortion data, * see standard DL/T 645-2007. * the 1st harmonic content data DI is PROTO_645_2007_DI_VHC_C + 1. * ...... * the Nst harmonic content data DI is PROTO_645_2007_DI_VHC_C + N. */ #define PROTO_645_2007_DI_VHC_C (0x020A0300u) /* DI: the A phase current harmonic content distortion data, * see standard DL/T 645-2007. * the 1st harmonic content data DI is PROTO_645_2007_DI_IHC_A + 1. * ...... * the Nst harmonic content data DI is PROTO_645_2007_DI_IHC_A + N. */ #define PROTO_645_2007_DI_IHC_A (0x020B0100u) /* DI: the B phase current harmonic content distortion data, * see standard DL/T 645-2007. * the 1st harmonic content data DI is PROTO_645_2007_DI_IHC_B + 1. * ...... * the Nst harmonic content data DI is PROTO_645_2007_DI_IHC_B + N. */ #define PROTO_645_2007_DI_IHC_B (0x020B0200u) /* DI: the C phase current harmonic content distortion data, * see standard DL/T 645-2007. * the 1st harmonic content data DI is PROTO_645_2007_DI_IHC_C + 1. * ...... * the Nst harmonic content data DI is PROTO_645_2007_DI_IHC_C + N. */ #define PROTO_645_2007_DI_IHC_C (0x020B0300u) /* DI: the frequency data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_FREQ (0x02800002u) /* DI: the 1 min average power */ #define PROTO_645_2007_DI_1MIN_AVG_P (0x02800003u) /* DI: the demand data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_EPT_DEMAND (0x02800004u) #define PROTO_645_2007_DI_EQT_DEMAND (0x02800005u) #define PROTO_645_2007_DI_AT_DEMAND (0x02800006u) /* DI: the temperature data, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_TEMP (0x02800007u) /* DI: the interior clock battery voltage */ #define PROTO_645_2007_CLOCK_BATTERY_V (0x02800008u) /* DI: the external meter read battery voltage */ #define PROTO_645_2007_MR_BATTERY_V (0x02800009u) /* DI: the interior battery work time */ #define PROTO_645_2007_INTER_BATTERY_TIME (0x0280000au) /* DI: definition for three-phase electric energy */ #define PROTO_645_2007_DI_EPT_COMP_SUM (0x00000000u) #define PROTO_645_2007_DI_EPT_COMP_RATE1 (0x00000100u) #define PROTO_645_2007_DI_EPT_COMP_RATE2 (0x00000200u) #define PROTO_645_2007_DI_EPT_COMP_RATE3 (0x00000300u) #define PROTO_645_2007_DI_EPT_COMP_RATE4 (0x00000400u) #define PROTO_645_2007_DI_EPT_COMP_ALL (0x0000ff00u) #define PROTO_645_2007_DI_EPT_POS_SUM (0x00010000u) #define PROTO_645_2007_DI_EPT_POS_SUM_LAST1 (0x00010001u) #define PROTO_645_2007_DI_EPT_POS_RATE1 (0x00010100u) #define PROTO_645_2007_DI_EPT_POS_RATE2 (0x00010200u) #define PROTO_645_2007_DI_EPT_POS_RATE3 (0x00010300u) #define PROTO_645_2007_DI_EPT_POS_RATE4 (0x00010400u) #define PROTO_645_2007_DI_EPT_POS_ALL (0x0001ff00u) #define PROTO_645_2007_DI_EPT_POS_ALL_LAST1 (0x0001ff01u) #define PROTO_645_2007_DI_EPT_NEG_SUM (0x00020000u) #define PROTO_645_2007_DI_EPT_NEG_RATE1 (0x00020100u) #define PROTO_645_2007_DI_EPT_NEG_RATE2 (0x00020200u) #define PROTO_645_2007_DI_EPT_NEG_RATE3 (0x00020300u) #define PROTO_645_2007_DI_EPT_NEG_RATE4 (0x00020400u) #define PROTO_645_2007_DI_EPT_NEG_ALL (0x0002ff00u) #define PROTO_645_2007_DI_EQT_POS_SUM (0x00030000u) #define PROTO_645_2007_DI_EQT_POS_RATE1 (0x00030100u) #define PROTO_645_2007_DI_EQT_POS_RATE2 (0x00030200u) #define PROTO_645_2007_DI_EQT_POS_RATE3 (0x00030300u) #define PROTO_645_2007_DI_EQT_POS_RATE4 (0x00030400u) #define PROTO_645_2007_DI_EQT_POS_ALL (0x0003ff00u) #define PROTO_645_2007_DI_EQT_NEG_SUM (0x00040000u) #define PROTO_645_2007_DI_EQT_NEG_RATE1 (0x00040100u) #define PROTO_645_2007_DI_EQT_NEG_RATE2 (0x00040200u) #define PROTO_645_2007_DI_EQT_NEG_RATE3 (0x00040300u) #define PROTO_645_2007_DI_EQT_NEG_RATE4 (0x00040400u) #define PROTO_645_2007_DI_EQT_NEG_ALL (0x0004ff00u) #define PROTO_645_2007_DI_EQT_QRT1_SUM (0x00050000u) #define PROTO_645_2007_DI_EQT_QRT1_RATE1 (0x00050100u) #define PROTO_645_2007_DI_EQT_QRT1_RATE2 (0x00050200u) #define PROTO_645_2007_DI_EQT_QRT1_RATE3 (0x00050300u) #define PROTO_645_2007_DI_EQT_QRT1_RATE4 (0x00050400u) #define PROTO_645_2007_DI_EQT_QRT1_ALL (0x0005ff00u) #define PROTO_645_2007_DI_EQT_QRT2_SUM (0x00060000u) #define PROTO_645_2007_DI_EQT_QRT2_RATE1 (0x00060100u) #define PROTO_645_2007_DI_EQT_QRT2_RATE2 (0x00060200u) #define PROTO_645_2007_DI_EQT_QRT2_RATE3 (0x00060300u) #define PROTO_645_2007_DI_EQT_QRT2_RATE4 (0x00060400u) #define PROTO_645_2007_DI_EQT_QRT2_ALL (0x0006ff00u) #define PROTO_645_2007_DI_EQT_QRT3_SUM (0x00070000u) #define PROTO_645_2007_DI_EQT_QRT3_RATE1 (0x00070100u) #define PROTO_645_2007_DI_EQT_QRT3_RATE2 (0x00070200u) #define PROTO_645_2007_DI_EQT_QRT3_RATE3 (0x00070300u) #define PROTO_645_2007_DI_EQT_QRT3_RATE4 (0x00070400u) #define PROTO_645_2007_DI_EQT_QRT3_ALL (0x0007ff00u) #define PROTO_645_2007_DI_EQT_QRT4_SUM (0x00080000u) #define PROTO_645_2007_DI_EQT_QRT4_RATE1 (0x00080100u) #define PROTO_645_2007_DI_EQT_QRT4_RATE2 (0x00080200u) #define PROTO_645_2007_DI_EQT_QRT4_RATE3 (0x00080300u) #define PROTO_645_2007_DI_EQT_QRT4_RATE4 (0x00080400u) #define PROTO_645_2007_DI_EQT_QRT4_ALL (0x0008ff00u) #define PROTO_645_2007_DI_EST_POS_SUM (0x00090000u) #define PROTO_645_2007_DI_EST_POS_RATE1 (0x00090100u) #define PROTO_645_2007_DI_EST_POS_RATE2 (0x00090200u) #define PROTO_645_2007_DI_EST_POS_RATE3 (0x00090300u) #define PROTO_645_2007_DI_EST_POS_RATE4 (0x00090400u) #define PROTO_645_2007_DI_EST_POS_ALL (0x0009ff00u) #define PROTO_645_2007_DI_EST_NEG_SUM (0x000a0000u) #define PROTO_645_2007_DI_EST_NEG_RATE1 (0x000a0100u) #define PROTO_645_2007_DI_EST_NEG_RATE2 (0x000a0200u) #define PROTO_645_2007_DI_EST_NEG_RATE3 (0x000a0300u) #define PROTO_645_2007_DI_EST_NEG_RATE4 (0x000a0400u) #define PROTO_645_2007_DI_EST_NEG_ALL (0x000aff00u) #define PROTO_645_2007_DI_EPT_POS_A (0x00150000u) #define PROTO_645_2007_DI_EPT_NEG_A (0x00160000u) #define PROTO_645_2007_DI_EPT_POS_B (0x00290000u) #define PROTO_645_2007_DI_EPT_NEG_B (0x002a0000u) #define PROTO_645_2007_DI_EPT_POS_C (0x003d0000u) #define PROTO_645_2007_DI_EPT_NEG_C (0x003e0000u) #define PROTO_645_2007_DI_EPT_POS_DEMAND (0x01010000u) #define PROTO_645_2007_DI_EPT_POS_DEMAND_RATE1 (0x01010100u) #define PROTO_645_2007_DI_EPT_POS_DEMAND_RATE2 (0x01010200u) #define PROTO_645_2007_DI_EPT_POS_DEMAND_RATE3 (0x01010300u) #define PROTO_645_2007_DI_EPT_POS_DEMAND_RATE4 (0x01010400u) #define PROTO_645_2007_DI_EPT_POS_DEMAND_ALL (0x0101ff00u) #define PROTO_645_2007_DI_EPT_NEG_DEMAND (0x01020000u) #define PROTO_645_2007_DI_EPT_NEG_DEMAND_RATE1 (0x01020100u) #define PROTO_645_2007_DI_EPT_NEG_DEMAND_RATE2 (0x01020200u) #define PROTO_645_2007_DI_EPT_NEG_DEMAND_RATE3 (0x01020300u) #define PROTO_645_2007_DI_EPT_NEG_DEMAND_RATE4 (0x01020400u) #define PROTO_645_2007_DI_EPT_NEG_DEMAND_ALL (0x0102ff00u) #define PROTO_645_2007_DI_EQT_POS_DEMAND (0x01030000u) #define PROTO_645_2007_DI_EQT_POS_DEMAND_RATE1 (0x01030100u) #define PROTO_645_2007_DI_EQT_POS_DEMAND_RATE2 (0x01030200u) #define PROTO_645_2007_DI_EQT_POS_DEMAND_RATE3 (0x01030300u) #define PROTO_645_2007_DI_EQT_POS_DEMAND_RATE4 (0x01030400u) #define PROTO_645_2007_DI_EQT_POS_DEMAND_ALL (0x0103ff00u) #define PROTO_645_2007_DI_COM_RE1_DEM_TIME_ALL (0x0103ff00u) #define PROTO_645_2007_DI_EQT_NEG_DEMAND (0x01040000u) #define PROTO_645_2007_DI_EQT_NEG_DEMAND_RATE1 (0x01040100u) #define PROTO_645_2007_DI_EQT_NEG_DEMAND_RATE2 (0x01040200u) #define PROTO_645_2007_DI_EQT_NEG_DEMAND_RATE3 (0x01040300u) #define PROTO_645_2007_DI_EQT_NEG_DEMAND_RATE4 (0x01040400u) #define PROTO_645_2007_DI_EQT_NEG_DEMAND_ALL (0x0104ff00u) #define PROTO_645_2007_DI_COM_RE2_DEM_TIME_ALL (0x0104ff00u) #define PROTO_645_2007_DI_EQT_QUAD1_DEMAND (0x01050000u) #define PROTO_645_2007_DI_EQT_QUAD1_DEMAND_RATE1 (0x01050100u) #define PROTO_645_2007_DI_EQT_QUAD1_DEMAND_RATE2 (0x01050200u) #define PROTO_645_2007_DI_EQT_QUAD1_DEMAND_RATE3 (0x01050300u) #define PROTO_645_2007_DI_EQT_QUAD1_DEMAND_RATE4 (0x01050400u) #define PROTO_645_2007_DI_EQT_QUAD1_DEMAND_ALL (0x0105ff00u) #define PROTO_645_2007_DI_EQT_QUAD2_DEMAND (0x01060000u) #define PROTO_645_2007_DI_EQT_QUAD2_DEMAND_RATE1 (0x01060100u) #define PROTO_645_2007_DI_EQT_QUAD2_DEMAND_RATE2 (0x01060200u) #define PROTO_645_2007_DI_EQT_QUAD2_DEMAND_RATE3 (0x01060300u) #define PROTO_645_2007_DI_EQT_QUAD2_DEMAND_RATE4 (0x01060400u) #define PROTO_645_2007_DI_EQT_QUAD2_DEMAND_ALL (0x0106ff00u) #define PROTO_645_2007_DI_EQT_QUAD3_DEMAND (0x01070000u) #define PROTO_645_2007_DI_EQT_QUAD3_DEMAND_RATE1 (0x01070100u) #define PROTO_645_2007_DI_EQT_QUAD3_DEMAND_RATE2 (0x01070200u) #define PROTO_645_2007_DI_EQT_QUAD3_DEMAND_RATE3 (0x01070300u) #define PROTO_645_2007_DI_EQT_QUAD3_DEMAND_RATE4 (0x01070400u) #define PROTO_645_2007_DI_EQT_QUAD3_DEMAND_ALL (0x0107ff00u) #define PROTO_645_2007_DI_EQT_QUAD4_DEMAND (0x01080000u) #define PROTO_645_2007_DI_EQT_QUAD4_DEMAND_RATE1 (0x01080100u) #define PROTO_645_2007_DI_EQT_QUAD4_DEMAND_RATE2 (0x01080200u) #define PROTO_645_2007_DI_EQT_QUAD4_DEMAND_RATE3 (0x01080300u) #define PROTO_645_2007_DI_EQT_QUAD4_DEMAND_RATE4 (0x01080400u) #define PROTO_645_2007_DI_EQT_QUAD4_DEMAND_ALL (0x0108ff00u) #define PROTO_645_2007_DI_EST_POS_DEMAND (0x01090000u) #define PROTO_645_2007_DI_EST_POS_DEMAND_RATE1 (0x01090100u) #define PROTO_645_2007_DI_EST_POS_DEMAND_RATE2 (0x01090200u) #define PROTO_645_2007_DI_EST_POS_DEMAND_RATE3 (0x01090300u) #define PROTO_645_2007_DI_EST_POS_DEMAND_RATE4 (0x01090400u) #define PROTO_645_2007_DI_EST_POS_DEMAND_ALL (0x0109ff00u) #define PROTO_645_2007_DI_EST_NEG_DEMAND (0x010A0000u) #define PROTO_645_2007_DI_EST_NEG_DEMAND_RATE1 (0x010A0100u) #define PROTO_645_2007_DI_EST_NEG_DEMAND_RATE2 (0x010A0200u) #define PROTO_645_2007_DI_EST_NEG_DEMAND_RATE3 (0x010A0300u) #define PROTO_645_2007_DI_EST_NEG_DEMAND_RATE4 (0x010A0400u) #define PROTO_645_2007_DI_EST_NEG_DEMAND_ALL (0x010AFF00u) #define PROTO_645_2007_DI_EPT_POS_A_DEMAND (0x01150000u) #define PROTO_645_2007_DI_EPT_NEG_A_DEMAND (0x01160000u) #define PROTO_645_2007_DI_EQT_POS_A_DEMAND (0x01170000u) #define PROTO_645_2007_DI_EQT_NEG_A_DEMAND (0x01180000u) #define PROTO_645_2007_DI_EQT_QUAD1_A_DEMAND (0x01190000u) #define PROTO_645_2007_DI_EQT_QUAD2_A_DEMAND (0x011A0000u) #define PROTO_645_2007_DI_EQT_QUAD3_A_DEMAND (0x011B0000u) #define PROTO_645_2007_DI_EQT_QUAD4_A_DEMAND (0x011C0000u) #define PROTO_645_2007_DI_EST_POS_A_DEMAND (0x011D0000u) #define PROTO_645_2007_DI_EST_NEG_A_DEMAND (0x011E0000u) #define PROTO_645_2007_DI_EPT_POS_B_DEMAND (0x01290000u) #define PROTO_645_2007_DI_EPT_NEG_B_DEMAND (0x012A0000u) #define PROTO_645_2007_DI_EQT_POS_B_DEMAND (0x012B0000u) #define PROTO_645_2007_DI_EQT_NEG_B_DEMAND (0x012C0000u) #define PROTO_645_2007_DI_EQT_QUAD1_B_DEMAND (0x012D0000u) #define PROTO_645_2007_DI_EQT_QUAD2_B_DEMAND (0x012E0000u) #define PROTO_645_2007_DI_EQT_QUAD3_B_DEMAND (0x012F0000u) #define PROTO_645_2007_DI_EQT_QUAD4_B_DEMAND (0x01300000u) #define PROTO_645_2007_DI_EST_POS_B_DEMAND (0x01310000u) #define PROTO_645_2007_DI_EST_NEG_B_DEMAND (0x01320000u) #define PROTO_645_2007_DI_EPT_POS_C_DEMAND (0x013D0000u) #define PROTO_645_2007_DI_EPT_NEG_C_DEMAND (0x013E0000u) #define PROTO_645_2007_DI_EQT_POS_C_DEMAND (0x013F0000u) #define PROTO_645_2007_DI_EQT_NEG_C_DEMAND (0x01400000u) #define PROTO_645_2007_DI_EQT_QUAD1_C_DEMAND (0x01410000u) #define PROTO_645_2007_DI_EQT_QUAD2_C_DEMAND (0x01420000u) #define PROTO_645_2007_DI_EQT_QUAD3_C_DEMAND (0x01430000u) #define PROTO_645_2007_DI_EQT_QUAD4_C_DEMAND (0x01440000u) #define PROTO_645_2007_DI_EST_POS_C_DEMAND (0x01450000u) #define PROTO_645_2007_DI_EST_NEG_C_DEMAND (0x01460000u) /* DI definition for single-phase electric energy */ #define PROTO_645_2007_EPA_POS (0x00150000u) #define PROTO_645_2007_EPA_NEG (0x00160000u) #define PROTO_645_2007_EQA_POS (0x00170000u) #define PROTO_645_2007_EQA_NEG (0x00180000u) #define PROTO_645_2007_EQA_QRT1 (0x00190000u) #define PROTO_645_2007_EQA_QRT2 (0x001A0000u) #define PROTO_645_2007_EQA_QRT3 (0x001B0000u) #define PROTO_645_2007_EQA_QRT4 (0x001C0000u) #define PROTO_645_2007_ESA_POS (0x001D0000u) #define PROTO_645_2007_ESA_NEG (0x001E0000u) #define PROTO_645_2007_EPB_POS (0x00290000u) #define PROTO_645_2007_EPB_NEG (0x002A0000u) #define PROTO_645_2007_EQB_POS (0x002B0000u) #define PROTO_645_2007_EQB_NEG (0x002C0000u) #define PROTO_645_2007_EQB_QRT1 (0x002D0000u) #define PROTO_645_2007_EQB_QRT2 (0x002E0000u) #define PROTO_645_2007_EQB_QRT3 (0x002F0000u) #define PROTO_645_2007_EQB_QRT4 (0x00300000u) #define PROTO_645_2007_ESB_POS (0x00310000u) #define PROTO_645_2007_ESB_NEG (0x00320000u) #define PROTO_645_2007_EPC_POS (0x003D0000u) #define PROTO_645_2007_EPC_NEG (0x003E0000u) #define PROTO_645_2007_EQC_POS (0x003F0000u) #define PROTO_645_2007_EQC_NEG (0x00400000u) #define PROTO_645_2007_EQC_QRT1 (0x00410000u) #define PROTO_645_2007_EQC_QRT2 (0x00420000u) #define PROTO_645_2007_EQC_QRT3 (0x00430000u) #define PROTO_645_2007_EQC_QRT4 (0x00440000u) #define PROTO_645_2007_ESC_POS (0x00450000u) #define PROTO_645_2007_ESC_NEG (0x00460000u) /* read current and 12 settlement date energy data blocks of an item */ #define PROTO_645_2007_DI_UNI_ENERGY_RECORD_ALL (0x000000FFu) /* read current and 12 settlement date demand data blocks of an item */ #define PROTO_645_2007_DI_UNI_DEMAND_RECORD_ALL (0x010000FFu) /* write identify cert */ #define PROTO_645_2007_DI_WIC (0x070000FFu) /* DI: the current combined reactive energy data 1, * see standard DL/T 645-2007. */ #define PROTO_645_2007_DI_CRE1 (0x0003FF00u) /* DI: the current combined reactive energy data 2, * see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_CRE2 (0x0004FF00u) /* DI: number of missing voltage record */ #define PROTO_645_2007_DI_MISS_V_NUM (0x03010000u) /* DI: number of voltage reverse phase sequence */ #define PROTO_645_2007_DI_V_RPS_NUM (0x03070000u) /* DI: number of loss current */ #define PROTO_645_2007_DI_MISS_I_NUM (0x030B0000u) /* DI: number of phase disconnection */ #define PROTO_645_2007_DI_PHASE_DISC_NUM (0x03040000u) /* DI: power down record */ #define PROTO_645_2007_DI_PD_TOTAL_NUM (0x03110000u) #define PROTO_645_2007_DI_PD_RECORD_LAST1 (0x03110001u) #define PROTO_645_2007_DI_PD_RECORD_LAST2 (0x03110002u) #define PROTO_645_2007_DI_PD_RECORD_LAST3 (0x03110003u) #define PROTO_645_2007_DI_PD_RECORD_LAST4 (0x03110004u) #define PROTO_645_2007_DI_PD_RECORD_LAST5 (0x03110005u) #define PROTO_645_2007_DI_PD_RECORD_LAST6 (0x03110006u) /* DI: programming record */ #define PROTO_645_2007_DI_PROGRAM_R (0x03300001u) /* DI: number of meter clean */ #define PROTO_645_2007_DI_PM_CLEAE_N (0x03300100u) /* DI: total modification times of monthly settlement date */ #define PROTO_645_2007_DI_MSD_MODIFY_COUNT (0x03300C00u) /* DI: monthly settlement date modification record */ #define PROTO_645_2007_DI_MSD_MODIFY_REC_BASE (0x03300C01u) /* DI: number of Opening covers */ #define PROTO_645_2007_DI_COVER_OPEN_N (0x03300D00u) #define PROTO_645_2007_DI_COVER_OPEN_R (0x03300D01u) /* DI: number of opening button box covers */ #define PROTO_645_2007_DI_BUTTON_OPEN_N (0x03300E00u) /* DI: correcting time record */ #define PROTO_645_2007_DI_CORR_TIME_NUM (0x03300400u) /* DI: the rating current */ #define PROTO_645_2007_DI_RATING_CURRENT (0x04000405u) /* rating current ascii length */ #define PROTO_645_2007_RATING_CUR_LEN (6) /* DI: running status word */ #define PROTO_645_2007_RUN_STATE_WORD_1 (0x04000501u) #define PROTO_645_2007_RUN_STATE_WORD_2 (0x04000502u) #define PROTO_645_2007_RUN_STATE_WORD_3 (0x04000503u) #define PROTO_645_2007_RUN_STATE_WORD_4 (0x04000504u) #define PROTO_645_2007_RUN_STATE_WORD_5 (0x04000505u) #define PROTO_645_2007_RUN_STATE_WORD_6 (0x04000506u) #define PROTO_645_2007_RUN_STATE_WORD_7 (0x04000507u) #define PROTO_645_2007_RUN_STATE_WORD_ALL (0x040005FFu) /* DI: time delta report, see standard extended DL/T 645-2007. * for hlj protocol */ #define PROTO_645_2007_DI_DELTA_RPT (0x04001599u) /* definition of under voltage event threshold, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_THR_UV_VOLTAGE (0x04090201u) #define PROTO_645_2007_DI_THR_UV_TIME (0x04090202u) /* definition of over voltage event threshold, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_THR_OV_VOLTAGE (0x04090301u) #define PROTO_645_2007_DI_THR_OV_TIME (0x04090302u) /* definition of phase failure event threshold, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_THR_PF_VOLTAGE (0x04090401u) #define PROTO_645_2007_DI_THR_PF_CURRENT (0x04090402u) #define PROTO_645_2007_DI_THR_PF_TIME (0x04090403u) /* definition of voltage unbalance event threshold, * see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_THR_UBV_RATE (0x04090501u) #define PROTO_645_2007_DI_THR_UBV_TIME (0x04090502u) /* definition of over current event threshold, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_THR_OI_CURRENT (0x04090801u) #define PROTO_645_2007_DI_THR_OI_TIME (0x04090802u) /* definition of real time frozen data items, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_RT_YMDHMS_BASE 0x05010000 #define PROTO_645_2007_DI_RT_EP_POS_BASE 0x05010100 #define PROTO_645_2007_DI_RT_EP_NEG_BASE 0x05010200 #define PROTO_645_2007_DI_RT_EQ_POS_BASE 0x05010300 #define PROTO_645_2007_DI_RT_EQ_NEG_BASE 0x05010400 #define PROTO_645_2007_DI_RT_VARIABLE_BASE 0x05011000 #define PROTO_645_2007_DI_RT_YMDHMS_LAST1 0x05010001 #define PROTO_645_2007_DI_RT_EP_POS_LAST1 0x05010101 #define PROTO_645_2007_DI_RT_EP_NEG_LAST1 0x05010201 #define PROTO_645_2007_DI_RT_VARIABLE_LAST1 0x05011001 /* definition of hourly frozen data items, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_HF_YMDHMS_BASE 0x05040000 #define PROTO_645_2007_DI_HF_EP_POS_BASE 0x05040100 #define PROTO_645_2007_DI_HF_EP_NEG_BASE 0x05040200 #define PROTO_645_2007_DI_HF_ALL_BASE 0x0504FF00 /* definition of daily frozen data items, see standard DL/T 645-2007 */ #define PROTO_645_2007_DI_DF_YMDHMS_BASE 0x05060000 #define PROTO_645_2007_DI_DF_YMDHMS_LAST1 0x05060001 #define PROTO_645_2007_DI_DF_EP_POS_BASE 0x05060100 #define PROTO_645_2007_DI_DF_EP_POS_LAST1 0x05060101 #define PROTO_645_2007_DI_DF_EP_NEG_BASE 0x05060200 #define PROTO_645_2007_DI_DF_EP_NEG_LAST1 0x05060201 #define PROTO_645_2007_DI_DF_EQ_POS_BASE 0x05060300 #define PROTO_645_2007_DI_DF_EQ_POS_LAST1 0x05060301 #define PROTO_645_2007_DI_DF_EQ_NEG_BASE 0x05060400 #define PROTO_645_2007_DI_DF_EQ_NEG_LAST1 0x05060401 #define PROTO_645_2007_DI_DF_RE_1ST_POWER_LAST1 0x05060501 #define PROTO_645_2007_DI_DF_RE_2ST_POWER_LAST1 0x05060601 #define PROTO_645_2007_DI_DF_RE_3ST_POWER_LAST1 0x05060701 #define PROTO_645_2007_DI_DF_RE_4ST_POWER_LAST1 0x05060801 #define PROTO_645_2007_DI_DF_POS_ACT_DEM_TIME_LAST1 0x05060901 #define PROTO_645_2007_DI_DF_NEG_ACT_DEM_TIME_LAST1 0x05060A01 #define PROTO_645_2007_DI_DF_VARIABLE_LAST1 0x05061001 /* define load curve di*/ /* DI for read curve records at specified times */ #define PROTO_645_2007_DI_CR_ALL_BY_TIME 0x06000001 #define PROTO_645_2007_DI_CR_V_A 0x06100101/* A-phase voltage curve */ #define PROTO_645_2007_DI_CR_V_B 0x06100102/* B-phase voltage curve */ #define PROTO_645_2007_DI_CR_V_C 0x06100103/* B-phase voltage curve */ #define PROTO_645_2007_DI_CR_V_ALL 0x061001ff/* voltage curve block */ #define PROTO_645_2007_DI_CR_I_A 0x06100201/* A-phase current curve */ #define PROTO_645_2007_DI_CR_I_B 0x06100202/* B-phase current curve */ #define PROTO_645_2007_DI_CR_I_C 0x06100203/* C-phase current curve */ #define PROTO_645_2007_DI_CR_I_ALL 0x061002ff/* current curve bloc */ #define PROTO_645_2007_DI_CR_P_T 0x06100300/* T-phase act power curve */ #define PROTO_645_2007_DI_CR_P_A 0x06100301/* A-phase act power curve */ #define PROTO_645_2007_DI_CR_P_B 0x06100302/* A-phase act power curve */ #define PROTO_645_2007_DI_CR_P_C 0x06100303/* A-phase act power curve */ #define PROTO_645_2007_DI_CR_P_ALL 0x061003ff/* act power curve block */ #define PROTO_645_2007_DI_CR_Q_T 0x06100400/* T-phase reac power curve */ #define PROTO_645_2007_DI_CR_Q_A 0x06100401/* A-phase reac power curve */ #define PROTO_645_2007_DI_CR_Q_B 0x06100402/* B-phase reac power curve */ #define PROTO_645_2007_DI_CR_Q_C 0x06100403/* C-phase reac power curve */ #define PROTO_645_2007_DI_CR_Q_ALL 0x061004ff/* reac power curve block */ #define PROTO_645_2007_DI_CR_PF_T 0x06100500/* T-phase power curve */ #define PROTO_645_2007_DI_CR_PF_A 0x06100501/* A-phase power factor curve */ #define PROTO_645_2007_DI_CR_PF_B 0x06100502/* B-phase power factor curve */ #define PROTO_645_2007_DI_CR_PF_C 0x06100503/* C-phase power factor curve */ #define PROTO_645_2007_DI_CR_PF_ALL 0x061005ff/* power factor curve block */ #define PROTO_645_2007_DI_CR_EP_POS 0x06100601/* pos ep curve block */ #define PROTO_645_2007_DI_CR_EP_NEG 0x06100602/* neg ep curve block */ #define PROTO_645_2007_DI_CR_EQ_POS 0x06100603/* pos eq curve block */ #define PROTO_645_2007_DI_CR_EQ_NEG 0x06100604/* neg eq curve block */ #define PROTO_645_2007_DI_CR_EPEQ_ALL 0x061006ff/* all ep/eq curve block */ #define PROTO_645_2007_DI_CR_EQ_QRT1 0x06100701/* eq quad1 curve block */ #define PROTO_645_2007_DI_CR_EQ_QRT2 0x06100702/* eq quad2 curve block */ #define PROTO_645_2007_DI_CR_EQ_QRT3 0x06100703/* eq quad3 curve block */ #define PROTO_645_2007_DI_CR_EQ_QRT4 0x06100704/* eq quad4 curve block */ #define PROTO_645_2007_DI_CR_EQ_QRT_ALL 0x061007ff/* eq all quad curve block */ /* define nw load curve di */ #define PROTO_645_2007_DI_NW_CR_V_A 0x06120101/* A-phase voltage curve */ #define PROTO_645_2007_DI_NW_CR_V_B 0x06120102/* B-phase voltage curve */ #define PROTO_645_2007_DI_NW_CR_V_C 0x06120103/* B-phase voltage curve */ #define PROTO_645_2007_DI_NW_CR_V_ALL 0x061201ff/* voltage curve block */ #define PROTO_645_2007_DI_NW_CR_I_A 0x06120201/* A-phase current curve */ #define PROTO_645_2007_DI_NW_CR_I_B 0x06120202/* B-phase current curve */ #define PROTO_645_2007_DI_NW_CR_I_C 0x06120203/* C-phase current curve */ #define PROTO_645_2007_DI_NW_CR_I_ALL 0x061202ff/* current curve bloc */ #define PROTO_645_2007_DI_NW_CR_P_T 0x06120300/* T-phase act power curve */ #define PROTO_645_2007_DI_NW_CR_P_A 0x06120301/* A-phase act power curve */ #define PROTO_645_2007_DI_NW_CR_P_B 0x06120302/* A-phase act power curve */ #define PROTO_645_2007_DI_NW_CR_P_C 0x06120303/* A-phase act power curve */ #define PROTO_645_2007_DI_NW_CR_P_ALL 0x061203ff/* act power curve block */ #define PROTO_645_2007_DI_NW_CR_Q_T 0x06120400/* T-phase reac power curve */ #define PROTO_645_2007_DI_NW_CR_Q_A 0x06120401/* A-phase reac power curve */ #define PROTO_645_2007_DI_NW_CR_Q_B 0x06120402/* B-phase reac power curve */ #define PROTO_645_2007_DI_NW_CR_Q_C 0x06120403/* C-phase reac power curve */ #define PROTO_645_2007_DI_NW_CR_Q_ALL 0x061204ff/* reac power curve block */ #define PROTO_645_2007_DI_NW_CR_PF_T 0x06120500/* T-phase power curve */ #define PROTO_645_2007_DI_NW_CR_PF_A 0x06120501/* A-phase power factor curve */ #define PROTO_645_2007_DI_NW_CR_PF_B 0x06120502/* B-phase power factor curve */ #define PROTO_645_2007_DI_NW_CR_PF_C 0x06120503/* C-phase power factor curve */ #define PROTO_645_2007_DI_NW_CR_PF_ALL 0x061205ff/* power factor curve block */ #define PROTO_645_2007_DI_NW_CR_EP_POS 0x06120601/* pos ep curve block */ #define PROTO_645_2007_DI_NW_CR_EP_NEG 0x06120602/* neg ep curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_POS 0x06120603/* pos eq curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_NEG 0x06120604/* neg eq curve block */ #define PROTO_645_2007_DI_NW_CR_EPEQ_ALL 0x061206ff/* all ep/eq curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_QRT1 0x06120701/* eq quad1 curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_QRT2 0x06120702/* eq quad2 curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_QRT3 0x06120703/* eq quad3 curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_QRT4 0x06120704/* eq quad4 curve block */ /* eq all quad curve block */ #define PROTO_645_2007_DI_NW_CR_EQ_QRT_ALL 0x061207ff /* ept demand curve block */ #define PROTO_645_2007_DI_NW_CR_EPT_DEMAND 0x06120801 /* eqt demand curve block */ #define PROTO_645_2007_DI_NW_CR_EQT_DEMAND 0x06120802 /* all ept/eqt demand curve block */ #define PROTO_645_2007_DI_NW_CR_DEMAND_ALL 0x061208ff /* GND current curve */ #define PROTO_645_2007_DI_NW_CR_I_N 0x06120900 /* data identification for nw multi di read */ #define PROTO_645_2007_DI_NW_MULTI_READ 0xEEEEEE00 /* data identification for start score */ #define PROTO_645_2007_DI_START_SCORE (0x07070707u) /* Number of phase A overcurrent */ #define PROTO_645_2007_DI_OVER_CUR_A_N (0x19010001u) /* Number of phase B overcurrent */ #define PROTO_645_2007_DI_OVER_CUR_B_N (0x19020001u) /* Number of phase C overcurrent */ #define PROTO_645_2007_DI_OVER_CUR_C_N (0x19030001u) /* data identification for switch band */ #define PROTO_645_2007_DI_BAND_SWITCH (0x7EFF1300u) /* data identification for 698 event report, only for hlj dev test cco mode */ #define PROTO_645_2007_DI_TRIG_698_EVT_RPT (0x7EFF2000u) /* set follow address, only for shandong repeater */ #define PROTO_645_2007_DI_FOLLOW_ADDR_SET (0xA0B0C0D0u) #define PROTO_645_2007_DI_FOLLOW_ADDR_QUERY (0xA0B0C0D1u) /* DI: AI management unit operation command, see standard extended * DL/T 645-2007. only for XIAN AI management unit */ #define PROTO_645_2007_DI_AI_TOPO_START (0xE1100001u) #define PROTO_645_2007_DI_AI_TOPO_QUERY (0xE1100004u) #define PROTO_645_2007_DI_AI_LL_START (0xE1100101u) #define PROTO_645_2007_DI_AI_LL_QUERY (0xE1100104u) /* defines payload data length corresponding to the DI, for * standard DL/T 645-2007. */ #define PROTO_645_2007_DI_FOR_WATTH_T_LEN (4u) #define PROTO_645_2007_DI_R_ADDR_LEN (6u) #define PROTO_645_2007_DI_EVENT_STA_WORD_LEN (10u) /* DI: definition for three-phase electric energy, see standard DL/T 645-1997 */ #define PROTO_645_1997_DI_EPT_POS_SUM (0x9010u) #define PROTO_645_1997_DI_EPT_POS_RATE1 (0x9011u) #define PROTO_645_1997_DI_EPT_POS_RATE2 (0x9012u) #define PROTO_645_1997_DI_EPT_POS_RATE3 (0x9013u) #define PROTO_645_1997_DI_EPT_POS_RATE4 (0x9014u) #define PROTO_645_1997_DI_EPT_POS_ALL (0x901fu) #define PROTO_645_1997_DI_EPT_NEG_SUM (0x9020u) #define PROTO_645_1997_DI_EPT_NEG_RATE1 (0x9021u) #define PROTO_645_1997_DI_EPT_NEG_RATE2 (0x9022u) #define PROTO_645_1997_DI_EPT_NEG_RATE3 (0x9023u) #define PROTO_645_1997_DI_EPT_NEG_RATE4 (0x9024u) #define PROTO_645_1997_DI_EPT_NEG_ALL (0x902fu) #define PROTO_645_1997_DI_EQT_POS_SUM (0x9110u) #define PROTO_645_1997_DI_EQT_POS_RATE1 (0x9111u) #define PROTO_645_1997_DI_EQT_POS_RATE2 (0x9112u) #define PROTO_645_1997_DI_EQT_POS_RATE3 (0x9113u) #define PROTO_645_1997_DI_EQT_POS_RATE4 (0x9114u) #define PROTO_645_1997_DI_EQT_POS_ALL (0x911fu) #define PROTO_645_1997_DI_EQT_NEG_SUM (0x9120u) #define PROTO_645_1997_DI_EQT_NEG_RATE1 (0x9121u) #define PROTO_645_1997_DI_EQT_NEG_RATE2 (0x9122u) #define PROTO_645_1997_DI_EQT_NEG_RATE3 (0x9123u) #define PROTO_645_1997_DI_EQT_NEG_RATE4 (0x9124u) #define PROTO_645_1997_DI_EQT_NEG_ALL (0x912fu) #define PROTO_645_1997_DI_EQT_QRT1_SUM (0x9130u) #define PROTO_645_1997_DI_EQT_QRT1_ALL (0x913fu) #define PROTO_645_1997_DI_EQT_QRT2_SUM (0x9150u) #define PROTO_645_1997_DI_EQT_QRT2_ALL (0x915fu) #define PROTO_645_1997_DI_EQT_QRT3_SUM (0x9160u) #define PROTO_645_1997_DI_EQT_QRT3_ALL (0x916fu) #define PROTO_645_1997_DI_EQT_QRT4_SUM (0x9140u) #define PROTO_645_1997_DI_EQT_QRT4_ALL (0x914fu) /* DI: read meter addr, for see standard DL/T 645-1997 */ #define PROTO_645_1997_DI_R_ADDR (0xC032u) /* DI: read meter time (year, month, data), * see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_TIME_YMD (0xc010u) /* DI: read meter time (hour, minute, second), * see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_TIME_HMS (0xc011u) /* DI: the voltage data, see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_V_A (0xb611u) #define PROTO_645_1997_DI_V_B (0xb612u) #define PROTO_645_1997_DI_V_C (0xb613u) #define PROTO_645_1997_DI_V_ALL (0xb61fu) /* DI: the current data, see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_I_A (0xb621u) #define PROTO_645_1997_DI_I_B (0xb622u) #define PROTO_645_1997_DI_I_C (0xb623u) #define PROTO_645_1997_DI_I_ALL (0xb62fu) /* DI: the active power data, see standard DL/T 645-1997 */ #define PROTO_645_1997_DI_P_T (0xb630u) #define PROTO_645_1997_DI_P_A (0xb631u) #define PROTO_645_1997_DI_P_B (0xb632u) #define PROTO_645_1997_DI_P_C (0xb633u) #define PROTO_645_1997_DI_P_ALL (0xb63fu) /* DI: the reactive power data, see standard DL/T 645-1997 */ #define PROTO_645_1997_DI_Q_T (0xb640u) #define PROTO_645_1997_DI_Q_A (0xb641u) #define PROTO_645_1997_DI_Q_B (0xb642u) #define PROTO_645_1997_DI_Q_C (0xb643u) #define PROTO_645_1997_DI_Q_ALL (0xb64fu) /* DI: the power factor data, see standard DL/T 645-1997 */ #define PROTO_645_1997_DI_PF_T (0xb650u) #define PROTO_645_1997_DI_PF_A (0xb651u) #define PROTO_645_1997_DI_PF_B (0xb652u) #define PROTO_645_1997_DI_PF_C (0xb653u) #define PROTO_645_1997_DI_PF_ALL (0xb65fu) /* DI: the power factor data, see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_PF_ALL (0xb65fu) /* DI: the frequency data, see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_FREQ (0xb664u) /* DI: running state data1, see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_RS1 (0xc020u) /* DI: running state data2, see standard extended DL/T 645-1997 */ #define PROTO_645_1997_DI_RS2 (0xc021u) /* defines payload data length corresponding to the DI, for * standard DL/T 645-1997. */ #define PROTO_645_1997_DI_EPT_POS_SUM_LEN (4u) #define PROTO_645_1997_DI_R_ADDR_LEN (6u) /* Invalid di */ #define PROTO_645_INVALID_DI (0xffffffffu) /* the maximum legal address value defined in the 645 protocol, decimal */ #define PRORO_645_ADDR_DEC_MAX (99) /* the byte of any mac address value defined in the 645 protocol */ #define PRORO_645_ANY_ADDR_BYTE (0xaa) /* Message direction: slave->master */ #define PROTO_645_DIR_SLAVE 1 /* Message direction: master->slave */ #define PROTO_645_DIR_MASTER 0 /* Ack flag: means abnormal ack */ #define PROTO_645_ACK_ABNORMAL 1 /* Ack flag: means normal ack */ #define PROTO_645_ACK_NORMAL 0 /* Follow data flag: means following data available */ #define PROTO_645_FOLLOW_AVAILABLE 1 /* Follow data flag: means no following data */ #define PROTO_645_FOLLOW_INVALID 0 /* control function code definition for DL/T 645-2007 */ #define PROTO_645_2007_FN_SECURITY_CERTIFICATE 0x03 /* only for hunan dev test */ #define PROTO_645_2007_FN_QUERY_TOPO 0x04 #define PROTO_645_2007_FN_CORRECT_TIME 0x08 #define PROTO_645_2007_FN_EVT_RPT 0x09 #define PROTO_645_2007_FN_READ_DATA 0x11 #define PROTO_645_2007_FN_READ_DATA_C 0x12 #define PROTO_645_2007_FN_READ_ADDR 0x13 #define PROTO_645_2007_FN_WRITE_DATA 0x14 #define PROTO_645_2007_FN_WRITE_ADDR 0x15 #define PROTO_645_2007_FN_FROZE 0x16 #define PROTO_645_2007_FN_CHG_RATE 0x17 #define PROTO_645_2007_FN_CHG_PASSWORD 0x18 #define PROTO_645_2007_FN_MAX_REQ_RESET 0x19 #define PROTO_645_2007_FN_PM_RESET 0x1A #define PROTO_645_2007_FN_EVENT_RESET 0x1B #define PROTO_645_2007_FN_COST_CON 0x1C #define PROTO_645_2007_FN_BAND_SWITCH 0x1E /* only for hlj dev test cco mode */ #define PROTO_645_2007_FN_698_EVT_RPT 0x1E #define PROTO_645_2007_FN_CLOCK_SKEW 0x1F /* only for bsrm */ #define PROTO_645_2007_FN_BSRM_EVT_RPT 0x1E /* only for dingxin bsrm set address*/ #define PROTO_645_2007_FN_BSRM_DX_WRITE_ADDR 0x1E /* control function code for AI management unit operation command, * see standard extended DL/T 645-2007. only for XIAN AI management unit */ #define PROTO_645_2007_FN_AI_XIAN 0x1F #define PROTO_645_2007_FN_MAX_REQ_RESET_ACK 0x99 #define PROTO_645_2007_FN_MAX_REQ_RESET_NACK 0xD9 /* control function code definition for DL/T 645-1997 */ #define PROTO_645_1997_FN_READ_DATA 0x01 #define PROTO_645_1997_FN_READ_DATA_C 0x02 #define PROTO_645_1997_FN_REPEAT_READ_DATA 0x03 #define PROTO_645_1997_FN_WRITE_DATA 0x04 #define PROTO_645_1997_FN_CORRECT_TIME 0x08 #define PROTO_645_1997_FN_WRITE_ADDR 0x0A #define PROTO_645_1997_FN_CHG_RATE 0x0C #define PROTO_645_1997_FN_CHG_PASSWORD 0x0F #define PROTO_645_1997_FN_MAX_REQ_RESET 0x10 /* event report status length in Extended DL/T 645-2007 */ #define PROTO_645_2007_EVENT_STATUS_LEN (12) /* password and operator code length for DL/T 645-2007 */ #define PROTO_645_2007_P_C_LEN (8) /* type of error for DL/T 645-2007 */ #define PROTO_645_2007_ERR_OK 0 #define PROTO_645_2007_ERR_OTHER 0x01 #define PROTO_645_2007_ERR_NO_REQ_DATA 0X02 #define PROTO_645_2007_ERR_GO_OUT_FWD 0XFF /* data unit identification, default is 0x82.*/ #define PROTO_645_2007_BSRM_DX_SET_ADDR_IDENT (0x82) /* 645 datagram length define of TSFM second node event report */ /* hunan, sichuan, shanghai, ningxia, liaoning, hubei, jiangxi, henan */ #define PROTO_645_TSFM_LEN (19) /* define 645-07 impedance anomaly time data length */ #define PROTO_645_07_IA_TIME_LEN (6) /* define 645-07 impedance anomaly resistance data length */ #define PROTO_645_07_IA_RES_LEN (3) /* define 645 work time data len */ #define PROTO_645_INTER_BATTERY_TIME_LEN (4) /* define 645 temperature data length */ #define PROTO_645_TEMPERATURE_LEN (2) /* define 645 harmonic content data length */ #define PROTO_645_HARMONIC_CONT_LEN (2) /* define 645 waveform distortion data length */ #define PROTO_645_WAVEFORM_DIS_LEN (2) /* define 645 phase angle data length */ #define PROTO_645_PHASE_ANGLE_LEN (2) /* define 645 voltage data length */ #define PROTO_645_V_LEN (2) /* define 645-07 current data length */ #define PROTO_645_07_A_LEN (3) /* define 645-07 power data length */ #define PROTO_645_07_P_LEN (3) /* define 645-07 power factor data length */ #define PROTO_645_07_PF_LEN (2) /* define 645-07 freq data length */ #define PROTO_645_07_FREQ_LEN (2) /* define 4-digit BCD code length */ #define PROTO_645_DIGIT4_BCD_LEN (2) /* define 2-digit BCD code length */ #define PROTO_645_DIGIT2_BCD_LEN (1) /* define 645-07 temperature data length */ #define PROTO_645_07_TEMP_LEN (2) /* define 645-07 energy data length */ #define PROTO_645_07_ENERGY_DATA_LEN (4) /* define 645-07 current power demand with time length */ #define PROTO_645_07_CURR_PD_LEN (8) /* define 645-07 the max status workds index */ #define PROTO_645_07_MAX_STATUS_WORDS_INDEX (7) /* define 645-07 current data length */ #define PROTO_645_97_A_LEN (2) /* define 645-97 reactive power data length */ #define PROTO_645_97_RP_LEN (2) /* define 645 frequency data length */ #define PROTO_645_FREQ_LEN (2) #define PROTO_645_YYMMDDHHMM_LEN (5) /* define protocol 645 number(NNNNNN) length */ #define PROTO_645_NUM_LEN (3) /* define protocol 645 qeidian data length */ #define PROTO_645_YYMMDDHHMMSS_LEN (6) /* define protocol 645 current threshold for over current data length */ #define PROTO_645_THR_OI_A_LEN (2) /* define protocol 645-2007 rate threshold data length for * voltage/current unbalance data. */ #define PROTO_645_07_THR_UNBAL_RATE_LEN (2) /* define 645 harmonic content block unit count */ #define PROTO_645_HC_BLOCK_UNIT_CNT (21) /* define the maximum size of single point curve record transmission */ #define PROTO_645_07_CURVE_REC_MAX_SIZE 103 /* define 645 read load record curve data length */ #define PROTO_645_READ_LR_CURVE_DATA_LEN (10) /* define the max count of voltage load record point */ #define PROTO_645_07_V_LR_POINT_MAX_CNT (123) /* define switch band response data len */ #define PROTO_645_07_BADN_SWITCH_DATA_LEN 8 /* asset management code len */ #define PROTO_645_2007_AMC_LEN 32 /* define 645 curve data freezing density */ #define PROTO_645_CURVE_FREEZ_DENSITY_NO (0) #define PROTO_645_CURVE_FREEZ_DENSITY_15MIN (1) #define PROTO_645_CURVE_FREEZ_DENSITY_30MIN (2) #define PROTO_645_CURVE_FREEZ_DENSITY_60MIN (3) #define PROTO_645_CURVE_FREEZ_DENSITY_5MIN (254) #define PROTO_645_CURVE_FREEZ_DENSITY_1MIN (255) /* define 645 program record data id code count */ #define PROTO_645_PROGRAM_ID_CODE_CNT (10) /* define 645 open coves record total electric energy count */ #define PROTO_645_OC_RECORD_ENERGY_CNT (12) /* define 645 clock skew mode meter time above cctt time */ #define PROTO_645_CS_MODE_METER_ABOVE_CCTT (1) /* define 645 clock skew mode meter time below cctt time */ #define PROTO_645_CS_MODE_METER_BELOW_CCTT (2) /* define 645 clock skew mode meter time below cctt time. for hlj protocol */ #define PROTO_645_CS_MODE_METER_BELOW_CCTT_HLJ (0) /* define 645 clock skew mode meter time above cctt time. for hlj protocol */ #define PROTO_645_CS_MODE_METER_ABOVE_CCTT_HLJ (1) /* days of monthly settlement date, see PROTO645_2007 */ #define PROTO_645_MSD_NUM (3) #define proto_645_2007_di_to_byte(di,ptr) \ do { \ ((uint8_t *)(ptr))[3] = (uint8_t)((di) >> 24); \ ((uint8_t *)(ptr))[2] = (uint8_t)((di) >> 16); \ ((uint8_t *)(ptr))[1] = (uint8_t)((di) >> 8); \ ((uint8_t *)(ptr))[0] = (uint8_t)((di) & 0xff); \ } while(0) #define proto_645_1997_di_to_byte(di,ptr) \ do { \ ((uint8_t *)(ptr))[1] = (uint8_t)((di) >> 8); \ ((uint8_t *)(ptr))[0] = (uint8_t)((di) & 0xff); \ } while(0) typedef struct _proto_645_ctrl { /* function code. see PROTO645_2007(1997)_FN_XXX */ uint8_t fn :5, /* 0 means no following data. 1 means following data available. * see PROTO_645_FOLLOW_XXX */ follow :1, /* 0 means normal ack. 1 means abnormal ack. * see PROTO_645_ACK_XXX */ ack :1, /* direction. 1 means from primary to secondary. 0 means from secondary * to primary,see PROTO_645_DIR_XXX */ dir :1; } proto_645_ctrl_t; typedef struct _proto_645_header { /* start char, see 645_START_CHAR */ uint8_t start_char_1; /* target mac address */ uint8_t addr[IOT_MAC_ADDR_LEN]; /* start char, see 645_START_CHAR */ uint8_t start_char_2; /* control code */ proto_645_ctrl_t control; /* data length */ uint8_t len; /* data */ uint8_t data[0]; } proto_645_header_t; typedef struct _proto_645_write_data_dest { /* di, see DL/T 645-2007 */ uint8_t di[PROTO_645_2007_DI_LEN]; /* password */ uint8_t password[PROTO_645_2007_PASSWORD_LEN]; /* operator code */ uint8_t operator[PROTO_645_2007_OPERATOR_LEN]; /* data */ uint8_t data[0]; } proto_645_write_data_dest_t; /* frozen cmd layout */ typedef struct proto_645_07_frozen_cmd { uint8_t min; uint8_t hour; uint8_t day; uint8_t mon; } proto_645_07_frozen_cmd_t; typedef struct _proto_645_tailer { /* check sum */ uint8_t cs; /* end char. see 645_END_CHAR */ uint8_t end_char; } proto_645_tailer_t; typedef struct _proto_645_time_ymd { uint8_t week; uint8_t day; uint8_t month; uint8_t year; } proto_645_time_ymd_t; typedef struct _proto_645_time_hms { uint8_t second; uint8_t minute; uint8_t hour; } proto_645_time_hms_t; typedef struct _proto_645_07_time { uint8_t second; uint8_t minute; uint8_t hour; uint8_t week; uint8_t day; uint8_t month; uint8_t year; } proto_645_07_time_t; typedef struct _proto_645_corr_time { uint8_t second; uint8_t minute; uint8_t hour; uint8_t day; uint8_t month; uint8_t year; } proto_645_corr_time_t; /* please refer to Dingxin communication topology identification * core board (TY) communication protocol v2 0 section 3.3.2 . */ typedef struct _proto_645_07_dingxin_address { /* data unit identification, default is 0x82, * refer PROTO_645_2007_BSRM_DX_SET_ADDR_IDENT. */ uint8_t ident; /* mac address */ uint8_t addr[IOT_MAC_ADDR_LEN]; } proto_645_07_dingxin_address_t; typedef struct _proto_645_07_frozen_time { uint8_t minute; uint8_t hour; uint8_t day; uint8_t month; uint8_t year; } proto_645_07_frozen_time_t; typedef struct _proto_645_07_energy_data { /* use 4 bytes of BCD code to represent total energy value. for example, * 123456.78KWh uses 4 bytes of BCD code to represent the following * 0x12, 0x34, 0x56, 0x78. */ uint8_t total[PROTO_645_07_ENERGY_DATA_LEN]; /* use 4 bytes of BCD code to represent the rate 1 energy value. for example, * 123456.78KWh uses 4 bytes of BCD code to represent the following * 0x12, 0x34, 0x56, 0x78. */ uint8_t rate_1[PROTO_645_07_ENERGY_DATA_LEN]; /* use 4 bytes of BCD code to represent the rate 2 energy value. for example, * 123456.78KWh uses 4 bytes of BCD code to represent the following * 0x12, 0x34, 0x56, 0x78. */ uint8_t rate_2[PROTO_645_07_ENERGY_DATA_LEN]; /* use 4 bytes of BCD code to represent the rate 3 energy value. for example, * 123456.78KWh uses 4 bytes of BCD code to represent the following * 0x12, 0x34, 0x56, 0x78. */ uint8_t rate_3[PROTO_645_07_ENERGY_DATA_LEN]; /* use 4 bytes of BCD code to represent the rate 4 energy value. for example, * 123456.78KWh uses 4 bytes of BCD code to represent the following * 0x12, 0x34, 0x56, 0x78. */ uint8_t rate_4[PROTO_645_07_ENERGY_DATA_LEN]; } proto_645_07_energy_data_t; typedef struct _proto_645_07_hf_energy { /* use 4 bytes of BCD code to represent the energy value. for example, * 123456.78KWh uses 4 bytes of BCD code to represent the following * 0x12, 0x34, 0x56, 0x78. */ uint8_t energy[PROTO_645_07_ENERGY_DATA_LEN]; } proto_645_07_hf_energy_t; typedef struct _proto_645_07_ia { /* time of impedance anomaly */ uint8_t time[PROTO_645_07_IA_TIME_LEN]; /* phase of impedance anomaly */ uint8_t phase; /* resistance of impedance anomaly.use 3 bytes of BCD code to * represent the resistance. for example, 123.456Ohm uses 3 bytes * of BCD code to represent the following 0x12, 0x34, 0x56. */ uint8_t resistance[PROTO_645_07_IA_RES_LEN]; } proto_645_07_ia_t; typedef struct _proto_645_07_evt_status { /* reserve for future */ uint8_t reserve0_bit0_2 : 3, /* flag of event that battery of clock chip is low voltage. */ clock_battery_low : 1, /* reserve for future */ reserve0_bit4_7 : 4; /* flag of event that battery for meter reading in case of power * failure is low voltage. */ uint8_t battery_low_for_pd : 1, /* reserve for future */ reserve1_bit1 : 1, /* flag of uncap event */ uncap : 1, /* flag of open button cover event */ open_button_cover : 1, /* reserve for future */ reserve1_bit4_7 : 2, /* switch trip successful */ switch_trip : 1, /* switch on successful */ switch_on : 1; /* flag of a phase miss voltage event */ uint8_t a_phase_miss_v : 1, /* reserve for future */ reserve2_bit1_2 : 2, /* flag of a phase loss of current event */ a_phase_miss_i : 1, /* flag of A phase overcurrent event */ a_phase_overcurrent: 1, /* reserve for future */ reserve2_bit5_6 : 2, /* flag of a phase disconnection event */ a_phase_diss : 1; /* reserve for future */ uint8_t reserve3; /* flag of b phase miss voltage event */ uint8_t b_phase_miss_v : 1, /* reserve for future */ reserve4_bit1_2 : 2, /* flag of b phase loss of current event */ b_phase_miss_i : 1, /* flag of b phase overcurrent event */ b_phase_overcurrent: 1, /* reserve for future */ reserve4_bit5_6 : 2, /* flag of b phase disconnection event */ b_phase_diss : 1; /* reserve for future */ uint8_t reserve5; /* flag of c phase miss voltage event */ uint8_t c_phase_miss_v : 1, /* reserve for future */ reserve6_bit1_2 : 2, /* flag of c phase loss of current event */ c_phase_miss_i : 1, /* flag of c phase overcurrent event */ c_phase_overcurrent: 1, /* reserve for future */ reserve6_bit5_6 : 2, /* flag of c phase disconnection event */ c_phase_diss : 1; /* reserve for future */ uint8_t reserve7; /* flag of voltage reverse phase sequence event */ uint8_t v_rps : 1, /* reserve for future */ reserve8_bit1_4 : 4, /* flag of meter power off event */ power_off : 1, /* reserve for future */ reserve8_bit6_7 : 2; /* reserve for future */ uint8_t reserve9; /* reserve for future */ uint8_t reserve10_bit0 : 1, /* flag of meter data clear event */ meter_clear : 1, /* reserve for future */ reserve10_bit2_3 : 2, /* flag of meter correct time event */ corr_time : 1, /* reserve for future */ reserve10_bit5_7 : 3; /* reserve for future */ uint8_t reserve11; } proto_645_07_evt_status_t; /* voltage threshold parameters of under voltage event */ typedef struct _proto_645_uv_voltage_thr { /* voltage threshold for under voltage event, use 2 bytes of BCD code to * represent the voltage. uint is 0.1V */ uint8_t v_thr[PROTO_645_V_LEN]; } proto_645_uv_voltage_thr_t; /* voltage threshold parameters of over voltage event */ typedef struct _proto_645_ov_voltage_thr { /* voltage threshold for over voltage event, use 2 bytes of BCD code to * represent the voltage. uint is 0.1V */ uint8_t v_thr[PROTO_645_V_LEN]; } proto_645_ov_voltage_thr_t; /* voltage threshold parameters of phase failure event */ typedef struct _proto_645_pf_voltage_thr { /* voltage threshold for phase failure event, use 2 bytes of BCD code to * represent the voltage. uint is 0.1V */ uint8_t v_thr[PROTO_645_V_LEN]; } proto_645_pf_voltage_thr_t; /* current threshold parameters of phase failure event */ typedef struct _proto_645_pf_current_thr { /* current threshold for phase failure event, use 3 bytes of BCD code to * represent the current. uint is 0.0001A */ uint8_t i_thr[PROTO_645_07_A_LEN]; } proto_645_pf_current_thr_t; /* current threshold parameters of over current event */ typedef struct _proto_645_oi_current_thr { /* current threshold for over current event, use 2 bytes of BCD code to * represent the current. uint is 0.1A */ uint8_t i_thr[PROTO_645_THR_OI_A_LEN]; } proto_645_oi_current_thr_t; /* rate threshold parameters of voltage/current unbalance event */ typedef struct _proto_645_unbalance_thr { /* rate threshold for voltage/current unbalance event, use 2 bytes of BCD * code to represent the current. uint is 0.01%. */ uint8_t rate_thr[PROTO_645_07_THR_UNBAL_RATE_LEN]; } proto_645_unbal_rate_thr_t; /* time threshold parameter structure for loss of voltage, under voltage, * over voltage, phase failure, unbalance of voltage, unbalance of current, * loss of current, over current, current failure, power reverse, overload, * demind over limit, total power factor ultra-lower limit or * serious unbalance of current event determination delay time threshold, * use 1 byte of BCD code to represent the time. */ typedef struct _proto_645_time_thr { /* time threshold, uint is 1s */ uint8_t time_thr; } proto_645_time_thr_t; typedef struct _proto_645_v { /* A phase voltage.use 2 bytes of BCD code to represent the voltage. * for example, 220.0V uses 2 bytes of BCD code to represent * the following 0x22, 0x00. */ uint8_t a[PROTO_645_V_LEN]; /* B phase voltage.use 2 bytes of BCD code to represent the voltage. * for example, 220.0V uses 2 bytes of BCD code to represent * the following 0x22, 0x00. */ uint8_t b[PROTO_645_V_LEN]; /* C phase voltage.use 2 bytes of BCD code to represent the voltage. * for example, 220.0V uses 2 bytes of BCD code to represent * the following 0x22, 0x00. */ uint8_t c[PROTO_645_V_LEN]; } proto_645_v_t; typedef struct _proto_645_freq { /* frequency. use 2 bytes of BCD code to represent the frequency. * for example, 50.00Hz uses 2 bytes of BCD code to represent * the following 0x50, 0x00. */ uint8_t bcd[PROTO_645_FREQ_LEN]; } proto_645_freq_t; typedef struct _proto_645_07_a { /* A phase current.use 3 bytes of BCD code to represent the current. * for example, 123.456A uses 3 bytes of BCD code to represent * the following 0x12, 0x34, 0x56. */ uint8_t a[PROTO_645_07_A_LEN]; /* B phase current.use 3 bytes of BCD code to represent the current. * for example, 123.456A uses 3 bytes of BCD code to represent * the following 0x12, 0x34, 0x56. */ uint8_t b[PROTO_645_07_A_LEN]; /* C phase current.use 3 bytes of BCD code to represent the current. * for example, 123.456A uses 3 bytes of BCD code to represent * the following 0x12, 0x34, 0x56. */ uint8_t c[PROTO_645_07_A_LEN]; } proto_645_07_a_t; typedef struct _proto_645_97_a { /* A phase current.use 2 bytes of BCD code to represent the current. * for example, 12.34A uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t a[PROTO_645_97_A_LEN]; /* B phase current.use 2 bytes of BCD code to represent the current. * for example, 12.34A uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t b[PROTO_645_97_A_LEN]; /* C phase current.use 2 bytes of BCD code to represent the current. * for example, 12.34A uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t c[PROTO_645_97_A_LEN]; } proto_645_97_a_t; typedef struct _proto_645_07_p { /* total power. use 3 bytes of BCD code to represent the active * power. for example, 12.3456kW uses 3 bytes of BCD code to represent * the following 0x12, 0x34, 0x56. */ uint8_t total[PROTO_645_07_P_LEN]; /* A phase power. use 3 bytes of BCD code to represent the * active power. for example, 12.3456kW uses 3 bytes of BCD code to * represent the following 0x12, 0x34, 0x56. */ uint8_t a[PROTO_645_07_P_LEN]; /* B phase power. use 3 bytes of BCD code to represent the * active power. for example, 12.3456kW uses 3 bytes of BCD code to * represent the following 0x12, 0x34, 0x56. */ uint8_t b[PROTO_645_07_P_LEN]; /* C phase power. use 3 bytes of BCD code to represent the * active power. for example, 12.3456kW uses 3 bytes of BCD code to * represent the following 0x12, 0x34, 0x56. */ uint8_t c[PROTO_645_07_P_LEN]; } proto_645_07_p_t; typedef struct _proto_645_97_rp { /* total power. use 2 bytes of BCD code to represent the reactive * power. for example, 12.34kW uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t total[PROTO_645_97_RP_LEN]; /* A phase power. use 2 bytes of BCD code to represent the reactive * power. for example, 12.34kW uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t a[PROTO_645_97_RP_LEN]; /* B phase power. use 2 bytes of BCD code to represent the reactive * power. for example, 12.34kW uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t b[PROTO_645_97_RP_LEN]; /* C phase power. use 2 bytes of BCD code to represent the reactive * power. for example, 12.34kW uses 2 bytes of BCD code to represent * the following 0x12, 0x34. */ uint8_t c[PROTO_645_97_RP_LEN]; } proto_645_97_rp_t; typedef struct _proto_645_07_pf { /* total power factor.use 2 bytes of BCD code to represent the power * factor. for example, 0.999 uses 2 bytes of BCD code to represent * the following 0x09, 0x99. */ uint8_t total[PROTO_645_07_PF_LEN]; /* A phase power factor.use 2 bytes of BCD code to represent the power * factor. for example, 0.999 uses 2 bytes of BCD code to represent * the following 0x09, 0x99. */ uint8_t a[PROTO_645_07_PF_LEN]; /* B phase power factor.use 2 bytes of BCD code to represent the power * factor. for example, 0.999 uses 2 bytes of BCD code to represent * the following 0x09, 0x99. */ uint8_t b[PROTO_645_07_PF_LEN]; /* C phase power factor.use 2 bytes of BCD code to represent the power * factor. for example, 0.999 uses 2 bytes of BCD code to represent * the following 0x09, 0x99. */ uint8_t c[PROTO_645_07_PF_LEN]; } proto_645_07_pf_t; typedef struct _proto_645_07_time_ymdhms { /* second: BCD code */ uint8_t second; /* minute: BCD code */ uint8_t minute; /* hour: BCD code */ uint8_t hour; /* day: BCD code */ uint8_t day; /* month: BCD code */ uint8_t month; /* year: BCD code */ uint8_t year; } proto_645_07_time_ymdhms_t; typedef struct _proto_645_07_program_record { /* start time */ proto_645_07_time_ymdhms_t start_time; /* operator code */ uint32_t operator_code; /* data identification code */ uint32_t data_id_code[PROTO_645_PROGRAM_ID_CODE_CNT]; } proto_645_07_program_record_t; /* freezing time of settlement date */ typedef struct _proto_645_07_msd_frozen_time { /* hour */ uint8_t hour; /* day */ uint8_t day; } proto_645_07_msd_frozen_time_t; typedef struct _proto_645_07_msd_modify_record { /* modify time */ proto_645_07_time_ymdhms_t ymdhms; /* operator code */ uint32_t operator_code; /* settlement date information that already exists when setting a new * settlement date. */ proto_645_07_msd_frozen_time_t msd[PROTO_645_MSD_NUM]; } proto_645_07_msd_modify_record_t; typedef struct _proto_645_07_power_down_record { /* start time */ proto_645_07_time_ymdhms_t start_time; /* end time */ proto_645_07_time_ymdhms_t end_time; } proto_645_07_power_down_record_t; typedef struct _proto_645_07_open_covers_record { /* start time */ proto_645_07_time_ymdhms_t start_time; /* end time */ proto_645_07_time_ymdhms_t end_time; /* unused total electric energy */ uint8_t total[PROTO_645_OC_RECORD_ENERGY_CNT][PROTO_645_07_ENERGY_DATA_LEN]; } proto_645_07_open_covers_record_t; typedef struct _proto_645_07_rs_word_1 { /* reserve1 for future */ uint16_t reserve1 :1, /* accumulation mode of demand */ demand_mode :1, /* clock battery */ clock_battery :1, /* power down meter reading battery */ pd_mr_battery :1, /* active power direction */ act_power_dir :1, /* reactive power direction */ react_power_dir :1, /* reserve2 for future */ reserve2 :2, /* control loop error */ ctrl_loop :1, /* ESAM error */ esam :1, /* reserve3 for future */ reserve3 :2, /* internal program error */ inter_program :1, /* memory failure or damage */ memory :1, /* overdraft state */ overdraft :1, /* clock failure */ clock_fail :1; } proto_645_07_rs_word_1_t; typedef struct _proto_645_07_rs_word_2 { /* a phase active power direction */ uint16_t a_ap_dir :1, /* b phase active power direction */ b_ap_dir :1, /* c phase active power direction */ c_ap_dir :1, /* reserve for future */ reserve1 :1, /* a phase reactive power direction */ a_rp_dir :1, /* b phase reactive power direction */ b_rp_dir :1, /* c phase reactive power direction */ c_rp_dir :1, /* reserve for future */ reserve2 :9; } proto_645_07_rs_word_2_t; typedef struct _proto_645_07_rs_word_3 { /* current running period */ uint16_t cur_run_period :1, /* power supply mode */ power_sup_mode :2, /* programming permission */ program_per :1, /* relay state */ relay_state :1, /* current running time zone */ cur_run_tz :1, /* relay command state */ relay_com_state :1, /* trip alarm state */ ta_state :1, /* power meter type */ pm_type :2, /* current running rate price */ cur_run_rp :1, /* current ladder */ cur_ladder :1, /* reserve for future */ reserve :4; } proto_645_07_rs_word_3_t; /* proto_645_07_rs_word_4_t represents A phase * proto_645_07_rs_word_5_t represents B phase * proto_645_07_rs_word_6_t represents C phase */ typedef struct _proto_645_07_rs_word_456 { /* a phase miss voltage */ uint16_t miss_v :1, /* a phase under voltage */ under_v :1, /* a phase over voltage */ over_v :1, /* a phase miss current */ miss_i :1, /* a phase over current */ over_i :1, /* a phase overload */ overload :1, /* tide reverse */ tide_reverse :1, /* a phase loss phase */ loss_phase :1, /* a phase cutoff */ cutoff :1, /* reserve for future */ reserve :7; } proto_645_07_rs_word_456_t; typedef struct _proto_645_07_rs_word_7 { /* voltage reverse phase sequence */ uint16_t v_rps :1, /* current reverse phase sequence */ a_rp_seq :1, /* voltage unbalance */ v_unbalance :1, /* current unbalance */ a_unbalance :1, /* auxiliary power loss */ aux_power_loss :1, /* power failure */ power_fail :1, /* excess requirement */ req_excess :1, /* total power factor over lower limit */ tpf_over_lower :1, /* serious current imbalance */ a_ser_imbalance :1, /* reserve for future */ reserve :7; } proto_645_07_rs_word_7_t; /* power meter running state word */ typedef struct _proto_645_97_pm_rs_word { /* meter read */ uint8_t meter_read :1, /* accumulation mode of demand */ demand_mode :1, /* clock battery */ clock_battery :1, /* reserve1 for future */ reserve1 :1, /* active electric energy direction */ act_neg_dir :1, /* reactive electric energy direction */ react_neg_dir :1, /* reserve2 for future */ reserve2 :2; } proto_645_97_pm_rs_word_t; /* power grid running state word */ typedef struct _proto_645_97_pg_rs_word { /* a phase blackout */ uint8_t a_blackout :1, /* b phase blackout */ b_blackout :1, /* c phase blackout */ c_blackout :1, /* reserve1 for future */ reserve1 :1, /* a phase overvoltage */ a_overvoltage :1, /* b phase overvoltage */ b_overvoltage :1, /* c phase overvoltage */ c_overvoltage :1, /* reserve1 for future */ reserve2 :1; } proto_645_97_pg_rs_word_t; /* curve Read Downlink Information descriptor */ typedef struct _proto_645_07_curve_dl { /* curve point num to Read */ uint8_t n; /* the specified time is seconds, minutes, hours, days and years. */ uint8_t min; uint8_t hour; uint8_t mday; uint8_t mon; uint8_t year; } proto_645_07_curve_dl_t; /* curve read uplink Information descriptor */ typedef struct _proto_645_07_curve_ul { /* the specified time is seconds, minutes, hours, days and years. */ uint8_t min; uint8_t hour; uint8_t mday; uint8_t mon; uint8_t year; /* curve data */ uint8_t data[0]; } proto_645_07_curve_ul_t; /* xian curve Read Downlink Information descriptor */ typedef struct _proto_645_07_curve_xian_dl { /* the specified time is seconds, minutes, hours, days and years. */ uint8_t min; uint8_t hour; uint8_t mday; uint8_t mon; uint8_t year; /* curve point num to Read */ uint8_t n; } proto_645_07_curve_xian_dl_t; /* xian curve read uplink Information descriptor */ typedef struct _proto_645_07_curve_xian_ul { /* the specified time is seconds, minutes, hours, days and years. */ uint8_t min; uint8_t hour; uint8_t mday; uint8_t mon; uint8_t year; /* density, uint is 1min */ uint8_t m; /* curve point num to read */ uint8_t n; /* curve data */ uint8_t data[0]; } proto_645_07_curve_xian_ul_t; typedef struct _proto_645_07_frozen_mdhm { /* minute: BCD code */ uint8_t minute; /* hour: BCD code */ uint8_t hour; /* day: BCD code */ uint8_t day; /* month: BCD code */ uint8_t month; } proto_645_07_frozen_mdhm_t; typedef struct _proto_645_07_clock_skew { /* skew mode, see PROTO_645_CS_MODE_METER_XXX_CCTT */ uint8_t mode; /* skew time */ proto_645_07_time_ymdhms_t time; } proto_645_07_clock_skew_t; typedef struct _proto_645_07_err { /* reserve for future */ uint8_t reserve1_bit0 : 1, /* flag that error reason is no request data */ no_req_data : 1, /* reserve for future */ reserve1_bit2_7 : 6; } proto_645_07_err_t; typedef struct _proto_645_07_evt_cnt_with_time { /* evt cnt */ uint8_t evt_cnt[PROTO_645_2007_DI_CNT_DATE_LEN]; /* evt time */ uint8_t evt_time[PROTO_645_2007_DI_CNT_DATE_LEN]; } proto_645_07_evt_cnt_with_time_t; typedef struct _proto_645_07_three_phase_evt_cnt { /* a phase event data */ proto_645_07_evt_cnt_with_time_t a_phase; /* b phase event data */ proto_645_07_evt_cnt_with_time_t b_phase; /* c phase event data */ proto_645_07_evt_cnt_with_time_t c_phase; } proto_645_07_three_phase_evt_cnt_t; /* load record head layout */ typedef struct _proto_645_07_lr_block_hdr { /* start code */ uint8_t start_char[2]; /* load record */ uint8_t len; /* payload */ uint8_t data[0]; } proto_645_07_lr_block_hdr_t; /* load curve time layout */ typedef struct _proto_645_07_lr_ts { /* BCD format */ uint8_t min; /* BCD format */ uint8_t hour; /* BCD format */ uint8_t mday; /* BCD format */ uint8_t mon; /* BCD format */ uint8_t year; } proto_645_07_lr_ts_t; /* class 1 load curve layout */ typedef struct _proto_645_07_lr_type1 { /* Voltage block, XXX.X V */ uint8_t v[3][PROTO_645_V_LEN]; /* current block, XXX.XXX A */ uint8_t i[3][PROTO_645_07_A_LEN]; /* freq, XX.XX HZ */ uint8_t freq[PROTO_645_FREQ_LEN]; } proto_645_07_lr_type1_t; /* class 2 load curve layout */ typedef struct _proto_645_07_lr_type2 { /* total active power, xx.xxxx kW */ uint8_t p_total[PROTO_645_07_P_LEN]; /* phase active power, xx.xxxx kW */ uint8_t p[3][PROTO_645_07_P_LEN]; /* total reactive power, xx.xxxx kvar */ uint8_t q_total[PROTO_645_07_P_LEN]; /* total reactive power, xx.xxxx kvar */ uint8_t q[3][PROTO_645_07_P_LEN]; } proto_645_07_lr_type2_t; /* class 3 load curve layout */ typedef struct _proto_645_07_lr_type3 { /* total power factor, x.xxx */ uint8_t pf_total[PROTO_645_07_PF_LEN]; /* phase power factor, x.xxx */ uint8_t pf[3][PROTO_645_07_PF_LEN]; } proto_645_07_lr_type3_t; /* class 4 load curve layout */ typedef struct _proto_645_07_lr_type4 { /* total electric energy of positive active power, xxxxxx.xx kWh */ uint8_t ept_pos[PROTO_645_07_ENERGY_DATA_LEN]; /* total electric energy of reverse active power, xxxxxxxx.xx kWh */ uint8_t ept_neg[PROTO_645_07_ENERGY_DATA_LEN]; /* total electric energy of positive reactive power, xxxxxx.xx kvarh */ uint8_t eqt_pos[PROTO_645_07_ENERGY_DATA_LEN]; /* total electric energy of reverse reactive power, xxxxxx.xx kvarh */ uint8_t eqt_neg[PROTO_645_07_ENERGY_DATA_LEN]; } proto_645_07_lr_type4_t; /* phase angle */ typedef struct _proto_645_07_phase_angle { /* A phase phase angle.use 2 bytes of BCD code to represent the phase angle. * for example, 90.0° uses 2 bytes of BCD code to represent * the following 0x09, 0x00. */ uint8_t a[PROTO_645_PHASE_ANGLE_LEN]; /* b phase phase angle.use 2 bytes of BCD code to represent the phase angle. * for example, 90.0° uses 2 bytes of BCD code to represent * the following 0x09, 0x00. */ uint8_t b[PROTO_645_PHASE_ANGLE_LEN]; /* c phase phase angle.use 2 bytes of BCD code to represent the phase angle. * for example, 90.0° uses 2 bytes of BCD code to represent * the following 0x09, 0x00. */ uint8_t c[PROTO_645_PHASE_ANGLE_LEN]; } proto_645_07_phase_angle_t; /* waveform distortion */ typedef struct _proto_645_07_waveform_dis { /* A phase waveform distortion.use 2 bytes of BCD code to represent the * waveform distortion. for example, 10.00% uses 2 bytes of BCD code to * represent the following 0x10, 0x00. */ uint8_t a[PROTO_645_WAVEFORM_DIS_LEN]; /* B phase waveform distortion.use 2 bytes of BCD code to represent the * waveform distortion. for example, 10.00% uses 2 bytes of BCD code to * represent the following 0x10, 0x00. */ uint8_t b[PROTO_645_WAVEFORM_DIS_LEN]; /* C phase waveform distortion.use 2 bytes of BCD code to represent the * waveform distortion. for example, 10.00% uses 2 bytes of BCD code to * represent the following 0x10, 0x00. */ uint8_t c[PROTO_645_WAVEFORM_DIS_LEN]; } proto_645_07_waveform_dis_t; /* harmonic content unit */ typedef struct _proto_645_07_harmonic_cont_unit { /* harmonic content. use 2 bytes of BCD code to represent the * harmonic content. for example, 10.00% uses 2 bytes of BCD code to * represent the following 0x10, 0x00. */ uint8_t cont[PROTO_645_HARMONIC_CONT_LEN]; } proto_645_07_harmonic_cont_unit_t; /* harmonic content */ typedef struct _proto_645_07_harmonic_cont { /* harmonic content block */ proto_645_07_harmonic_cont_unit_t hc[PROTO_645_HC_BLOCK_UNIT_CNT]; } proto_645_07_harmonic_cont_t; /* report correct delta time layout, for hlj protocol */ typedef struct _proto_645_07_delta_rpt { /* BCD format */ uint8_t hour_high; /* BCD format */ uint8_t hour_low; /* BCD format */ uint8_t min; /* BCD format */ uint8_t sec; /* time mode */ uint8_t mode; } proto_645_07_delta_rpt_t; /* rating current/base current */ typedef struct _proto_645_07_rating_current { /* ASCII format */ uint8_t value[PROTO_645_2007_RATING_CUR_LEN]; } proto_645_07_rating_current_t; typedef struct _proto_645_07_max_demand { /* max demand value , BCD format, XX.XXXX */ uint8_t max_demand[PROTO_645_07_P_LEN]; /* time, YYMMDDhhmm */ uint8_t tm[PROTO_645_YYMMDDHHMM_LEN]; } proto_645_07_max_demand_t; /* AI management unit operation command data structure, see standard extended * DL/T 645-2007. only for XIAN AI management unit */ typedef struct _proto_645_07_ai_topo_start { /* second of cco time, BCD format */ uint8_t sec; /* minute of cco time, BCD format */ uint8_t min; /* hour of cco time, BCD format */ uint8_t hour; /* day of cco time, BCD format */ uint8_t day; /* month of cco time, BCD format */ uint8_t mon; /* year of cco time, BCD format */ uint8_t year; /* flag of start current cycle */ uint8_t start_flag : 4, /* cycle cnt */ cycle_cnt : 4; /* interval, unit is 1s */ uint8_t interval; /* flag of data */ /* flag of voltage */ uint8_t flag_v : 1, /* flag of current */ flag_i : 1, /* flag of power factor */ flag_pf : 1, /* reserved for future */ rsvd0 : 5; /* reserved for future */ uint8_t rsvd1; /* reserved for future */ uint16_t rsvd2; /* cco ntb */ uint32_t cco_ntb; /* start ntb */ uint32_t start_ntb; } proto_645_07_ai_topo_start_t; typedef struct _proto_645_07_ai_topo_query_dl { /* reserved for future */ uint8_t rsvd0; /* query data point offset, BCD format, in the range of 0-60. * The latest frozen data is read by default this time. */ uint8_t offset; /* reserved for future */ uint32_t rsvd1; /* query di */ uint8_t di[PROTO_645_2007_DI_LEN]; /* query cnt */ uint8_t cnt; /* phase info */ uint8_t phase_info; } proto_645_07_ai_topo_query_dl_t; typedef struct _proto_645_07_ai_topo_query_ul { /* second of start data, BCD format */ uint8_t sec; /* minute of start data, BCD format */ uint8_t min; /* hour of start data, BCD format */ uint8_t hour; /* day of start data, BCD format */ uint8_t day; /* month of start data, BCD format */ uint8_t mon; /* year of start data, BCD format */ uint8_t year; /* response di */ uint8_t di[PROTO_645_2007_DI_LEN]; /* response cnt */ uint8_t cnt; /* phase info */ uint8_t phase_info; /* topo running state, 1 mean running, 0 mean idle */ uint8_t state_topo : 1, /* line lose running state, 1 mean running, 0 mean idle */ state_ll : 1, /* reserved for future */ rsvd0 : 6; /* reserved for future */ uint16_t rsvd1; /* data length */ uint8_t data_len; /* data */ uint8_t data[0]; } proto_645_07_ai_topo_query_ul_t; typedef struct _proto_645_07_ai_ll_start { /* second of cco time, BCD format */ uint8_t sec; /* minute of cco time, BCD format */ uint8_t min; /* hour of cco time, BCD format */ uint8_t hour; /* day of cco time, BCD format */ uint8_t day; /* month of cco time, BCD format */ uint8_t mon; /* year of cco time, BCD format */ uint8_t year; /* flag of start current cycle */ uint8_t start_flag : 4, /* cycle cnt */ cycle_cnt : 4; /* interval, unit is 1 minute */ uint8_t interval; /* flag of data */ /* reserved for future */ uint8_t rsvd0; /* flag of active power */ uint8_t flag_p : 1, /* flag of current */ flag_i : 1, /* flag of gnd current */ flag_gi : 1, /* flag of voltage */ flag_v : 1, /* flag of power factor */ flag_pf : 1, /* flag of positive active electric energy */ flag_pos : 1, /* flag of negative active electric energy */ flag_neg : 1, /* flag of quadrant reactive energy */ flag_qtr : 1; /* reserved for Reverse future */ uint16_t rsvd1; /* cco ntb */ uint32_t cco_ntb; /* start ntb */ uint32_t start_ntb; } proto_645_07_ai_ll_start_t; typedef struct _proto_645_07_ai_ll_query_dl { /* reserved for future */ uint8_t rsvd0; /* query data point offset, BCD format, in the range of 0-95. */ uint8_t offset; /* reserved for future */ uint8_t rsvd1; /* flag of day, 0 mean read frozen data of the previous day. * 1 mean read frozen data of the current day */ uint8_t flag_curr; /* reserved for future */ uint16_t rsvd2; /* query di */ uint8_t di[PROTO_645_2007_DI_LEN]; /* query cnt */ uint8_t cnt; /* phase info */ uint8_t phase_info; } proto_645_07_ai_ll_query_dl_t; typedef struct _proto_645_07_ai_ll_query_ul { /* second of start data, BCD format */ uint8_t sec; /* minute of start data, BCD format */ uint8_t min; /* hour of start data, BCD format */ uint8_t hour; /* day of start data, BCD format */ uint8_t day; /* month of start data, BCD format */ uint8_t mon; /* year of start data, BCD format */ uint8_t year; /* response di */ uint8_t di[PROTO_645_2007_DI_LEN]; /* response cnt */ uint8_t cnt; /* phase info */ uint8_t phase_info; /* topo running state, 1 mean running, 0 mean idle */ uint8_t state_topo : 1, /* line lose running state, 1 mean running, 0 mean idle */ state_ll : 1, /* reserved for future */ rsvd0 : 6; /* reserved for future */ uint16_t rsvd1; /* data length */ uint8_t data_len; /* data */ uint8_t data[0]; } proto_645_07_ai_ll_query_ul_t; typedef struct _proto_645_07_nw_multi_di_read_rsp_unit{ /* current unit data len, di len + di data len */ uint8_t len; /* di */ uint8_t di[PROTO_645_2007_DI_LEN]; /* di data */ uint8_t di_data[0]; } proto_645_07_nw_multi_di_read_rsp_unit_t; #pragma pack(pop) /* restore the pack status */ /* broadcast mac address */ extern uint8_t proto_645_bcast_addr[IOT_MAC_ADDR_LEN]; /* the decimal version of the broadcast address */ extern uint8_t proto_645_bcast_dec_addr[IOT_MAC_ADDR_LEN]; /* any mac address */ extern uint8_t proto_645_any_addr[IOT_MAC_ADDR_LEN]; /* invaild mac address for collector i*/ extern uint8_t proto_645_invaild_addr[IOT_MAC_ADDR_LEN]; /* preamble code */ extern uint8_t proto_645_preamble[PROTO_645_PREAMBLE_LEN]; /* proto_645_calc_cs() - calculate checksum for 645 protocol * @app_id: pointer tothe 645 protocol header * * return * calculated checksum value */ uint8_t proto_645_calc_cs(proto_645_header_t *hdr); /* proto_645_add33_handle() - add 33 for each of the specified memory * @ds: pointer to data buffer * @size: size of buffer * * return * void */ void proto_645_add33_handle(uint8_t *ds, uint32_t size); /* proto_645_sub33_handle() - sub 33 for each of the specified memory * @ds: pointer to data buffer * @size: size of buffer * return * void */ void proto_645_sub33_handle(uint8_t *ds, uint32_t size); /** * @brief proto_645_invert_handle() - data invert for each of the specified * @brief memory * @param ds: pointer to data buffer * @param size: size of buffer */ void proto_645_invert_handle(uint8_t *ds, uint32_t size); /** * @brief proto_645_fill_frame() - fill data in 645 protocol frame. if the data * @brief field exists in 645 protocol frame, it must * @brief be used with the data identifier. * @param frames_filled: pointer to the 645 protocol frame that needs * @param to be filled. * @param protocol_type: type of the 645 protocol frame. * @param addr: destination address. * @param dir: direction, see PROTO_645_DIR_XXX. * @param ack: flag of ack, see PROTO_645_ACK_XXX. * @param follow: flag of follow data, see PROTO_645_FOLLOW_XXX. * @param fn: function code. * @param di: data identification, if is PROTO_645_INVALID_DI, DI info field * will not be filling. * @param payload_len: length of payload, exclude DI. * @param payload: pointer to payload. * @retval: 0 -- fill 645 protocol frame failure * @retval: otherwise -- length of data filled in 645 protocol frame */ uint32_t proto_645_fill_frame(uint8_t *frames_filled, uint8_t protocol_type, uint8_t *addr, uint8_t dir, uint8_t ack, uint8_t follow, uint8_t fn, uint32_t di, uint8_t payload_len, uint8_t *payload); /* proto_645_format_check() - 645 protocol format check * @data: pointer to protocol data buffer * @len: data length * @dir: message direction--see PROTO_645_DIR_XXX * return * NULL -- Incorrect protocol format . * otherwise --pointer to the 645 protocol header */ proto_645_header_t *proto_645_format_check(uint8_t *data, uint32_t len, uint32_t dir); /* proto_645_build_mr_msg() - create a meter reading message for the * 645 protocol * @p_id: style of protocol * @addr: address of meter * @di: data identification * return * NULL -- for failure case. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_build_mr_msg(uint8_t p_id, uint8_t *addr, uint32_t di); /* proto_645_2007_ra_msg() - Creates a read address message for the 645-2007 * protocol * return * NULL -- for failure case. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_2007_build_ra_msg(void); /** * @brief proto_645_2007_build_nack_msg() - creates a nack message. * @param err_code: err code, see PROTO_645_2007_ERR_XXX. * @param addr: address. * @param fn: function code. * return * NULL -- for failure case. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_2007_build_nack_msg(uint8_t err_code, uint8_t *addr, uint8_t fn); /** * @brief proto_645_2007_build_ack_msg() - creates a ack message. * @param addr: address. * @param fn: function code. * return * NULL -- for failure case. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_2007_build_ack_msg(uint8_t *addr, uint8_t fn); /** * @brief proto_645_get_read_rsp_len() - gets the length of the full read * response message for the 645 protocol. * @param p_id: proto id. 1 - for 97, 2- for 07. * @param di: defined DI in 645 protocol. * @retval: len of full read response message. for unsupported DI, * the maximum length is returned. */ uint32_t proto_645_get_read_rsp_len(uint8_t p_id, uint32_t di); /** * @brief: check if a mac is 645 broadcast mac * @param dst: the mac address to be checked * @return 1 is 645 broadcast mac * @return 0 NOT a 645 broadcast mac */ uint8_t proto_645_is_bcast(uint8_t* dst); /** * @brief proto_645_pm_addr_valid() - check the validity of the meter address. * @param addr: meter addr. * @retval: 0 -- address is invalid. * @retval: 1 -- address is valid. */ uint8_t proto_645_pm_addr_valid(uint8_t *addr); /** * @brief proto_645_mac_addr_cmp() - mac address compare * @param dst: pointer to first mac address to compare * @param src: pointer to second mac address to compare * * @return 1 -- if mac address is the same * @return 0 -- otherwise */ uint8_t proto_645_mac_addr_cmp(const uint8_t* dst, const uint8_t* src); static inline uint32_t proto_645_2007_byte_to_di(uint8_t *ptr) { return ((((uint8_t *)(ptr))[3]<<24) |(((uint8_t *)(ptr))[2]<<16) |(((uint8_t *)(ptr))[1]<<8) |((uint8_t *)(ptr))[0]); } static inline uint16_t proto_645_1997_byte_to_di(uint8_t *ptr) { return ((ptr[1]<<8)|ptr[0]); } static inline uint32_t proto_645_byte_to_di(uint8_t p_id, uint8_t *ptr) { IOT_ASSERT(p_id == PROTO_645_1997_ID || p_id == PROTO_645_2007_ID); return (p_id == PROTO_645_1997_ID ? \ (uint32_t)proto_645_1997_byte_to_di(ptr) : \ proto_645_2007_byte_to_di(ptr)); } /** * @brief proto_645_header_init() - initializes the 645 protocol header. * @param hdr: pointer to the 645 protocol header. * @param addr: meter addr. * @param dir: direction, see PROTO_645_DIR_XXX. * @param ack_v: flag of ack, see PROTO_645_ACK_XXX. * @param follow_v: flag of follow data, see PROTO_645_FOLLOW_XXX. */ void proto_645_header_init(proto_645_header_t *hdr, uint8_t *addr, uint8_t fn, uint8_t dir, uint8_t ack_v, uint8_t follow_v); /** * @brief proto_645_tail_init() - initializes the 645 protocol tailer. * @param hdr: pointer to the 645 protocol header. */ void proto_645_tail_init(proto_645_header_t *hdr); /** * @brief proto_645_type_identify() - identifying the type of 645 message, is 97 * or 07. * @param hdr: pointer to the head of the 645 message. * @retval: 0 - cannot identify. * 1 - 1997. * 2 - 2007. */ uint8_t proto_645_type_identify(proto_645_header_t *hdr); /** * @brief proto_645_07_event_validate() - check the event valiate in data field. * @brief only used for DL/T 645-2007. * @param data: pointer to event data field. * @param len: length of event data field. * @retval: 0 -- event is invalid. * @retval: otherwise -- event is valid. */ uint32_t proto_645_07_event_validate(uint8_t *data, uint8_t len); /** * @brief proto_645_get_di_by_sub33() - get di by subtracting 0x33 in the 645 * protocol data field. This function can * only be used when the data field has di. * @param data: pointer to data field. * @param len: length of data field. * @param p_id: proto id. see PROTO_645_XXX_ID. * @param di: pointer to di cache. * @retval: ERR_OK -- get di successfully. * @retval: ERR_FAIL -- get di fail. */ uint32_t proto_645_get_di_by_sub33(uint8_t *data, uint8_t len, uint8_t p_id, uint32_t *di); /** * @brief proto_645_get_di() - get di by subtracting 0x33 in the 645 * protocol data field. * @param data: pointer to data field. * @param len: length of the data field. * @param dir: message direction--see PROTO_645_DIR_XXX * @param di: buffer to store the di after subtracting 0x33 * @param fn: buffer to store the fn * @return: ERR_OK for successful #define, other for failed #define. */ uint32_t proto_645_get_di(uint8_t *data, uint32_t len, uint8_t dir, uint32_t *di, uint8_t *fn); /** * @brief: check if response from PLC matches the corresponding command. * @param data1: up(down) link data from PLC * @param len1: length of data1 * @param data2: down(up) link data from PLC * @param len2: length of data2 * @return: ERR_OK if di and fn are match, ERR_FAIL if not. */ uint32_t proto_645_check_di_fn_match(uint8_t *data1, uint32_t len1, uint8_t *data2, uint32_t len2); /** * @brief proto_645_pkt_check_handle() - check 645 pkt frame. * @param dir: point to the dir of the pkt frame. * @param di: point to the di of the pkt frame. * @retval: ERR_OK will response if pkt is 645 frame. */ uint8_t proto_645_pkt_check_handle(iot_pkt_t *pkt, uint8_t *dir, uint32_t *di); /* proto_645_build_corr_msg() - create a meter correct time message for the * 645 protocol * @addr: target address, if set NULL, use broadcast address. little endian * @time: correct time * return * NULL -- for failure #define. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_build_corr_msg(uint8_t *addr, proto_645_corr_time_t *time); /** * @brief check the pkt if read data pkt. * @param data: 645 pkt data. * @param len: 645 pkt data length. * @return: 0 - is not read data pkt. * @return: 1 - is read data pkt. */ uint8_t proto_645_is_data_read(uint8_t *data, uint16_t len); /** * @brief check the pkt if password cmd. * @param data: 645 pkt data. * @param len: 645 pkt data length. * @return: 0 - is not read data pkt. * @return: 1 - is read data pkt. */ uint8_t proto_645_is_password_cmd(uint8_t *data, uint16_t len); /* proto_645_format_check_ext() - 645 protocol format check extended version, * search the whole buffer to try to * find one 645 format data. * @data: pointer to protocol data buffer * @len: data length * @dir: message direction--see PROTO_645_DIR_XXX * return * NULL -- 645 format data not found. * otherwise -- pointer to the 645 protocol header */ proto_645_header_t *proto_645_format_check_ext(uint8_t *data, uint32_t len, uint32_t dir); /** * @brief proto_645_unsig_to_bcd() - converts unsigned integers to BCD formats * with specified n bytes. * @param v: the value to be converted * @param bcd_byte_n: specifies the number of bytes of BCD code after conversion * @param bcd: converted data output buffer * @retval: -- length of the converted BCD code, uint is byte */ uint8_t proto_645_unsig_to_bcd(uint32_t v, uint8_t bcd_byte_n, uint8_t *bcd); /** * @brief proto_645_unsig_to_bcd() - converts signed integers to BCD formats * with specified n bytes. * @param v: the value to be converted * @param bcd_byte_n: specifies the number of bytes of BCD code after conversion * @param bcd: converted data output buffer * @retval: - length of the converted BCD code, uint is byte */ uint8_t proto_645_sig_to_bcd(int32_t v, uint8_t bcd_byte_n, uint8_t *bcd); /** * @brief proto_645_bcd_to_integer() -converting N-byte BCD code to integer data * @param bcd: BCD code to be converted * @param bcd_byte_n: the number of bytes of BCD code to be converted. * @param is_signed: is it a signed BCD * @retval: - converted integer values */ int32_t proto_645_bcd_to_integer(uint8_t *bcd, uint8_t bcd_byte_n, uint8_t is_signed); /** * @brief proto_645_bcd_data_check() -check if bcd data is valid * @param bcd: BCD code to be converted * @param bcd_byte_n: the number of bytes of BCD code to be converted. * @param is_signed: is it a signed BCD * @retval: - converted integer values */ uint8_t proto_645_bcd_data_check(uint8_t *bcd, uint8_t bcd_byte_n, uint8_t is_signed); /** * @brief proto_645_rtctime_to_YYMMDDhhmm() - converts rtc time to * YYMMDDhhmm formats. * @param tm: pintrer to rtc time. * @param buf: converted data output buffer * @retval: - length of the converted BCD code, uint is byte */ uint8_t proto_645_rtctime_to_YYMMDDhhmm(iot_time_tm_t *tm, uint8_t *buf); /** * @brief proto_645_rtctime_to_YYMMDDhhmmss() - converts rtc time to YYMMDDhhmmss * formats. * @param tm: pintrer to rtc time. * @param buf: converted data output buffer * @retval: - length of the converted BCD code, uint is byte */ uint8_t proto_645_rtctime_to_YYMMDDhhmmss(iot_time_tm_t *tm, uint8_t *buf); /** * @brief proto_645_07_get_curve_point_len() - get the data format length of * load curve points * @param di: DI corresponding to load curve. * @retval: - data format length of load curve points */ uint8_t proto_645_07_get_curve_point_len(uint32_t di); /* @brief proto_645_build_band_switch_rsp() - switch band response msg. * @param addr: big end address. * return rsp pkt packet, not NULL - successful, NULL - fail. */ iot_pkt_t *proto_645_build_band_switch_rsp(const uint8_t *addr); /** * @brief proto_645_2007_build_frozen_msg() - create a meter frozen message * for dl/t645 - 07 protocol * @param addr: meter addr. * @param time: frozen time. * @retval: NULL -- for failure. * @retval: pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_2007_build_frozen_msg(uint8_t *addr, proto_645_07_frozen_mdhm_t *time); /* @brief proto_645_2007_build_mr_rsp() - build 645_07 response msg. * @param addr: little end address. * @param di: 645 proto response di, see PROTO_645_2007_XXX. * @param payload: load data. * @param len: load data len. * @param head_reserved_len: head reserved len. * @retval: NULL -- for failure. * @retval: pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_2007_build_mr_rsp(uint8_t *addr, uint32_t di, uint8_t *payload, uint8_t len, uint8_t head_reserved_len); /* @brief proto_645_1997_build_mr_rsp() - build 645_97 response msg. * @param addr: little end address. * @param di: 645 proto response di, see PROTO_645_1997_XXX. * @param payload: load data. * @param len: load data len. * @param head_reserved_len: head reserved len. * @retval: NULL -- for failure. * @retval: pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_1997_build_mr_rsp(uint8_t *addr, uint32_t di, uint8_t *payload, uint8_t len, uint8_t head_reserved_len); /** * @brief proto_645_2007_build_w_rsp() - build 645_07 write response msg. * @param addr: little end address. * @retval: NULL -- for failure. * @retval: pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_2007_build_w_rsp(uint8_t *addr); /** * @brief proto_645_check_frame_handler() - check whether the frame * is legitimate. * @param buffer: the buffer containing data. * @param buffer_len: len of the buffer. * @param is_frame: false: the frame isn't legitimate. * true: the frame is legitimate. */ void proto_645_check_frame_handler(uint8_t* buffer, uint32_t buffer_len, bool_t* is_frame); /** * @brief proto_645_07_build_mr_lr_msg() - build a 645-07 protocol to read load * record message. * @param addr: specified address, little-endian. * @param di: load record di, see PROTO_645_2007_DI_CR_XXX. * @param n: specified number of points. * @param start_tm: specified start time. * @retval: NULL -- for failure. * @retval: pkt -- returns the pkt containing the message. */ iot_pkt_t *proto_645_07_build_mr_lr_msg(uint8_t *addr, uint32_t di, uint8_t n, iot_time_tm_t *start_tm); /** * @brief proto_645_i_97_to_07() - the i data of 645-97 protocol is converted into * that of 645-07 protocol. * @param i_97: the i data of 645-97 protocol, little-endian. * @param i_07: the i data of 645-07 protocol, little-endian. */ void proto_645_i_97_to_07(uint8_t *i_97, uint8_t *i_07); /** * @brief proto_645_rp_97_to_07() - the reactive power data of 645-97 protocol * is converted into that of 645-07 protocol. * @param i_97: reactive power data of 645-97 protocol, little-endian. * @param i_07: reactive power data of 645-07 protocol, little-endian. */ void proto_645_rp_97_to_07(uint8_t *rp_97, uint8_t *rp_07); /* @brief proto_645_build_mr_msg_with_multi_di() - creating 645 protocol multi * data item meter reading message. * @param p_id: protocol id, see PROTO_645_XXXX_ID. * @param addr: address of meter. * @param di_buf: data item id buffer. * @param cnt: the number of valid DI in di_buf. * @param is_with_preamble: if set, each message created contains a preamble. * otherwise, there is no preamble. * return * NULL -- for failure case. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_build_mr_msg_with_multi_di(uint8_t p_id, uint8_t *addr, uint32_t *di_buf, uint8_t cnt, uint8_t is_with_preamble); /* @brief proto_645_07_build_mr_lr_msg_with_multi_di() - creating 645 protocol multi * data item meter reading message - load record board. * @param p_id: protocol id, see PROTO_645_XXXX_ID. * @param addr: address of meter. * @param di_buf: data item id buffer. * @param cnt: the number of valid DI in di_buf. * @param start_tm: specified start time for load record. * @param n: specified number of points for load record. * @param is_with_preamble: if set, each message created contains a preamble. * otherwise, there is no preamble. * return * NULL -- for failure case. * pkt -- the iot pkt buffer for 645 protocol. */ iot_pkt_t *proto_645_07_build_mr_lr_msg_with_multi_di(uint8_t *addr, uint32_t *di_buf, uint8_t cnt, iot_time_tm_t *start_tm, uint8_t n, uint8_t is_with_preamble); /** * @brief proto_645_corr_msg_check() - 645 protocol correct time format check. * @param data: data. * @param len: data len. * @param addr: 645 header target mac address, little-endian. * @retval: ERR_OK -- check success. * @retval: otherwise -- check false, see ERR_XXX. */ uint32_t proto_645_corr_msg_check(uint8_t *data, uint32_t len, uint8_t *addr); /** * @brief proto_645_build_msg() - creating common 645 protocol message. * @param addr: destination address, little endian. * @param data: pointer to data. * @param len: length of data. * @param di: data identification, if is PROTO_645_INVALID_DI, DI info field * will not be filling. * @param dir: direction, see PROTO_645_DIR_XXX. * @param ack: flag of ack, see PROTO_645_ACK_XXX. * @param fn: function code. * @param p_id: protocol id, see PROTO_645_XXXX_ID. * @param follow: flag of follow data, see PROTO_645_FOLLOW_XXX. * @retval: 0 -- fill 645 protocol frame failure * @retval: otherwise -- length of data filled in 645 protocol frame */ iot_pkt_t *proto_645_build_msg(uint8_t *addr, uint8_t *data, uint8_t len, uint32_t di, uint8_t dir, uint8_t ack, uint8_t fn, uint8_t p_id, uint8_t follow); /** * @brief proto_645_ascii_to_uninteger() - 645 ascii translate to signed int. * @param ascii: ascii data, little-endian. * @param ascii_byte_n: ascii data len. * @retval: signed int value. */ int32_t proto_645_ascii_to_integer(uint8_t *ascii, uint8_t ascii_byte_n); #ifdef __cplusplus } #endif #endif /* PROTO_645_H */