28#ifndef PROTOCORE_IEC60870_H
29#define PROTOCORE_IEC60870_H
38#define IEC_START_104 0x68u
39#define IEC_START_FIXED 0x10u
41#define IEC104_APCI_LEN 6u
44#define IEC104_STARTDT_ACT 0x07u
45#define IEC104_STARTDT_CON 0x0Bu
46#define IEC104_STOPDT_ACT 0x13u
47#define IEC104_STOPDT_CON 0x23u
48#define IEC104_TESTFR_ACT 0x43u
49#define IEC104_TESTFR_CON 0x83u
52#define IEC_TYPE_M_SP_NA_1 1
53#define IEC_TYPE_M_DP_NA_1 3
54#define IEC_TYPE_M_ME_NA_1 9
55#define IEC_TYPE_M_ME_NB_1 11
56#define IEC_TYPE_M_ME_NC_1 13
57#define IEC_TYPE_M_IT_NA_1 15
58#define IEC_TYPE_C_SC_NA_1 45
59#define IEC_TYPE_C_DC_NA_1 46
60#define IEC_TYPE_M_EI_NA_1 70
61#define IEC_TYPE_C_IC_NA_1 100
62#define IEC_TYPE_C_CS_NA_1 103
65#define IEC_COT_PERIODIC 1
66#define IEC_COT_SPONTANEOUS 3
67#define IEC_COT_REQUEST 5
68#define IEC_COT_ACTIVATION 6
69#define IEC_COT_ACT_CON 7
70#define IEC_COT_DEACTIVATION 8
71#define IEC_COT_ACT_TERM 10
72#define IEC_COT_INTERROGATED 20
75#define IEC_FC_RESET_LINK 0x00
76#define IEC_FC_TEST_LINK 0x02
77#define IEC_FC_USER_DATA_CONFIRM 0x03
78#define IEC_FC_USER_DATA_NOREPLY 0x04
79#define IEC_FC_REQUEST_CLASS1 0x0A
80#define IEC_FC_REQUEST_CLASS2 0x0B
83enum class Iec104Format : uint8_t
111 uint16_t common_addr;
117size_t pc_iec104_build_i(uint8_t *buf,
size_t cap, uint16_t ns, uint16_t nr,
const uint8_t *asdu,
size_t asdu_len);
120size_t pc_iec104_build_s(uint8_t *buf,
size_t cap, uint16_t nr);
123size_t pc_iec104_build_u(uint8_t *buf,
size_t cap, uint8_t u_cmd);
126bool pc_iec104_parse(
const uint8_t *buf,
size_t len, Iec104Apci *out,
size_t *consumed);
131size_t pc_iec_asdu_build_header(uint8_t *buf,
size_t cap,
const IecAsduHeader *h);
134bool pc_iec_asdu_parse_header(
const uint8_t *buf,
size_t len, IecAsduHeader *out,
size_t *consumed);
137size_t pc_iec_put_ioa(uint8_t *buf,
size_t cap, uint32_t ioa);
140uint32_t pc_iec_get_ioa(
const uint8_t *p);
148#define IEC_QUAL_OV 0x01u
149#define IEC_QUAL_BL 0x10u
150#define IEC_QUAL_SB 0x20u
151#define IEC_QUAL_NT 0x40u
152#define IEC_QUAL_IV 0x80u
153#define IEC_SCO_ON 0x01u
154#define IEC_SCO_SE 0x80u
157#define IEC_DP_INDETERMINATE 0u
160#define IEC_DP_INDETERMINATE_3 3u
161#define IEC_DP_MASK 0x03u
162#define IEC_DCO_SE 0x80u
163#define IEC_DCO_QU_SHIFT 2u
164#define IEC_DCO_QU_MASK 0x1Fu
167#define IEC_BCR_SQ_MASK 0x1Fu
168#define IEC_BCR_CY 0x20u
169#define IEC_BCR_CA 0x40u
170#define IEC_BCR_IV 0x80u
178size_t pc_iec_io_build_sp(uint8_t *buf,
size_t cap, uint32_t ioa,
bool on, uint8_t quality);
181bool pc_iec_io_parse_sp(
const uint8_t *buf,
size_t len, uint32_t *ioa,
bool *on, uint8_t *quality);
187size_t pc_iec_io_build_float(uint8_t *buf,
size_t cap, uint32_t ioa,
float value, uint8_t qds);
190bool pc_iec_io_parse_float(
const uint8_t *buf,
size_t len, uint32_t *ioa,
float *value, uint8_t *qds);
197size_t pc_iec_io_build_scaled(uint8_t *buf,
size_t cap, uint32_t ioa, int16_t value, uint8_t qds);
200bool pc_iec_io_parse_scaled(
const uint8_t *buf,
size_t len, uint32_t *ioa, int16_t *value, uint8_t *qds);
208size_t pc_iec_io_build_normalized(uint8_t *buf,
size_t cap, uint32_t ioa,
float value, uint8_t qds);
212bool pc_iec_io_parse_normalized(
const uint8_t *buf,
size_t len, uint32_t *ioa,
float *value, uint8_t *qds);
221size_t pc_iec_io_build_counter(uint8_t *buf,
size_t cap, uint32_t ioa, int32_t value, uint8_t seq);
225bool pc_iec_io_parse_counter(
const uint8_t *buf,
size_t len, uint32_t *ioa, int32_t *value, uint8_t *seq);
233size_t pc_iec_io_build_sc(uint8_t *buf,
size_t cap, uint32_t ioa,
bool on,
bool select);
236bool pc_iec_io_parse_sc(
const uint8_t *buf,
size_t len, uint32_t *ioa,
bool *on,
bool *select);
244size_t pc_iec_io_build_dp(uint8_t *buf,
size_t cap, uint32_t ioa, uint8_t dpi, uint8_t quality);
247bool pc_iec_io_parse_dp(
const uint8_t *buf,
size_t len, uint32_t *ioa, uint8_t *dpi, uint8_t *quality);
256size_t pc_iec_io_build_dc(uint8_t *buf,
size_t cap, uint32_t ioa, uint8_t dcs, uint8_t qu,
bool select);
259bool pc_iec_io_parse_dc(
const uint8_t *buf,
size_t len, uint32_t *ioa, uint8_t *dcs, uint8_t *qu,
bool *select);
264size_t pc_iec101_build_fixed(uint8_t *buf,
size_t cap, uint8_t control, uint8_t addr);
267size_t pc_iec101_build_variable(uint8_t *buf,
size_t cap, uint8_t control, uint8_t addr,
const uint8_t *asdu,
281bool pc_iec101_parse(
const uint8_t *buf,
size_t len, Iec101Frame *out,
size_t *consumed);
User-facing configuration for ProtoCore.