lib60870-C  2.3.2
C source code library for the IEC 60870-5-101/104 protocols
iec60870_common.h
Go to the documentation of this file.
1 /*
2  * Copyright 2016-2022 Michael Zillgith
3  *
4  * This file is part of lib60870-C
5  *
6  * lib60870-C is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * lib60870-C is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with lib60870-C. If not, see <http://www.gnu.org/licenses/>.
18  *
19  * See COPYING file for the complete license text.
20  */
21 
22 #ifndef SRC_INC_IEC60870_COMMON_H_
23 #define SRC_INC_IEC60870_COMMON_H_
24 
25 #include <stdint.h>
26 #include <stdbool.h>
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
45 #define IEC_60870_5_104_DEFAULT_PORT 2404
46 #define IEC_60870_5_104_DEFAULT_TLS_PORT 19998
47 
48 #define LIB60870_VERSION_MAJOR 2
49 #define LIB60870_VERSION_MINOR 3
50 #define LIB60870_VERSION_PATCH 1
51 
55 typedef struct {
56  int major;
57  int minor;
58  int patch;
60 
64 typedef enum {
65  IEC60870_LINK_LAYER_BALANCED = 0,
66  IEC60870_LINK_LAYER_UNBALANCED = 1
68 
70 typedef enum {
73 
76 
79 
83 
91 typedef void (*IEC60870_LinkLayerStateChangedHandler) (void* parameter, int address, LinkLayerState newState);
92 
105 typedef void (*IEC60870_RawMessageHandler) (void* parameter, uint8_t* msg, int msgSize, bool sent);
106 
111 
113  int sizeOfTypeId; /* size of the type id (default = 1 - don't change) */
114  int sizeOfVSQ; /* don't change */
115  int sizeOfCOT; /* size of COT (1/2 - default = 2 -> COT includes OA) */
116  int originatorAddress; /* originator address (OA) to use (0-255) */
117  int sizeOfCA; /* size of common address (CA) of ASDU (1/2 - default = 2) */
118  int sizeOfIOA; /* size of information object address (IOA) (1/2/3 - default = 3) */
119  int maxSizeOfASDU; /* maximum size of the ASDU that is generated - the maximum maximum value is 249 for IEC 104 and 254 for IEC 101 */
120 };
121 
125 typedef enum {
126  M_SP_NA_1 = 1,
127  M_SP_TA_1 = 2,
128  M_DP_NA_1 = 3,
129  M_DP_TA_1 = 4,
130  M_ST_NA_1 = 5,
131  M_ST_TA_1 = 6,
132  M_BO_NA_1 = 7,
133  M_BO_TA_1 = 8,
134  M_ME_NA_1 = 9,
135  M_ME_TA_1 = 10,
136  M_ME_NB_1 = 11,
137  M_ME_TB_1 = 12,
138  M_ME_NC_1 = 13,
139  M_ME_TC_1 = 14,
140  M_IT_NA_1 = 15,
141  M_IT_TA_1 = 16,
142  M_EP_TA_1 = 17,
143  M_EP_TB_1 = 18,
144  M_EP_TC_1 = 19,
145  M_PS_NA_1 = 20,
146  M_ME_ND_1 = 21,
147  M_SP_TB_1 = 30,
148  M_DP_TB_1 = 31,
149  M_ST_TB_1 = 32,
150  M_BO_TB_1 = 33,
151  M_ME_TD_1 = 34,
152  M_ME_TE_1 = 35,
153  M_ME_TF_1 = 36,
154  M_IT_TB_1 = 37,
155  M_EP_TD_1 = 38,
156  M_EP_TE_1 = 39,
157  M_EP_TF_1 = 40,
158  S_IT_TC_1 = 41,
159  C_SC_NA_1 = 45,
160  C_DC_NA_1 = 46,
161  C_RC_NA_1 = 47,
162  C_SE_NA_1 = 48,
163  C_SE_NB_1 = 49,
164  C_SE_NC_1 = 50,
165  C_BO_NA_1 = 51,
166  C_SC_TA_1 = 58,
167  C_DC_TA_1 = 59,
168  C_RC_TA_1 = 60,
169  C_SE_TA_1 = 61,
170  C_SE_TB_1 = 62,
171  C_SE_TC_1 = 63,
172  C_BO_TA_1 = 64,
173  M_EI_NA_1 = 70,
174  S_CH_NA_1 = 81,
175  S_RP_NA_1 = 82,
176  S_AR_NA_1 = 83,
177  S_KR_NA_1 = 84,
178  S_KS_NA_1 = 85,
179  S_KC_NA_1 = 86,
180  S_ER_NA_1 = 87,
181  S_US_NA_1 = 90,
182  S_UQ_NA_1 = 91,
183  S_UR_NA_1 = 92,
184  S_UK_NA_1 = 93,
185  S_UA_NA_1 = 94,
186  S_UC_NA_1 = 95,
187  C_IC_NA_1 = 100,
188  C_CI_NA_1 = 101,
189  C_RD_NA_1 = 102,
190  C_CS_NA_1 = 103,
191  C_TS_NA_1 = 104,
192  C_RP_NA_1 = 105,
193  C_CD_NA_1 = 106,
194  C_TS_TA_1 = 107,
195  P_ME_NA_1 = 110,
196  P_ME_NB_1 = 111,
197  P_ME_NC_1 = 112,
198  P_AC_NA_1 = 113,
199  F_FR_NA_1 = 120,
200  F_SR_NA_1 = 121,
201  F_SC_NA_1 = 122,
202  F_LS_NA_1 = 123,
203  F_AF_NA_1 = 124,
204  F_SG_NA_1 = 125,
205  F_DR_TA_1 = 126,
206  F_SC_NB_1 = 127
208 
209 typedef IEC60870_5_TypeID TypeID;
210 
211 typedef struct sInformationObject* InformationObject;
212 
216 typedef struct sCS101_ASDU* CS101_ASDU;
217 
218 typedef struct {
219  CS101_AppLayerParameters parameters;
220  uint8_t* asdu;
221  int asduHeaderLength;
222  uint8_t* payload;
223  int payloadSize;
224  uint8_t encodedData[256];
226 
228 
229 typedef struct sCP16Time2a* CP16Time2a;
230 
231 struct sCP16Time2a {
232  uint8_t encodedValue[2];
233 };
234 
235 typedef struct sCP24Time2a* CP24Time2a;
236 
237 struct sCP24Time2a {
238  uint8_t encodedValue[3];
239 };
240 
241 typedef struct sCP32Time2a* CP32Time2a;
242 
246 struct sCP32Time2a {
247  uint8_t encodedValue[4];
248 };
249 
253 typedef struct sCP56Time2a* CP56Time2a;
254 
255 struct sCP56Time2a {
256  uint8_t encodedValue[7];
257 };
258 
263 
265  uint8_t encodedValue[5];
266 };
267 
272 
274  int k;
275  int w;
276  int t0;
277  int t1;
278  int t2;
279  int t3;
280 };
281 
283 
284 typedef enum {
285  CS101_COT_PERIODIC = 1,
286  CS101_COT_BACKGROUND_SCAN = 2,
287  CS101_COT_SPONTANEOUS = 3,
288  CS101_COT_INITIALIZED = 4,
289  CS101_COT_REQUEST = 5,
290  CS101_COT_ACTIVATION = 6,
291  CS101_COT_ACTIVATION_CON = 7,
292  CS101_COT_DEACTIVATION = 8,
293  CS101_COT_DEACTIVATION_CON = 9,
294  CS101_COT_ACTIVATION_TERMINATION = 10,
295  CS101_COT_RETURN_INFO_REMOTE = 11,
296  CS101_COT_RETURN_INFO_LOCAL = 12,
297  CS101_COT_FILE_TRANSFER = 13,
298  CS101_COT_AUTHENTICATION = 14,
299  CS101_COT_MAINTENANCE_OF_AUTH_SESSION_KEY = 15,
300  CS101_COT_MAINTENANCE_OF_USER_ROLE_AND_UPDATE_KEY = 16,
301  CS101_COT_INTERROGATED_BY_STATION = 20,
302  CS101_COT_INTERROGATED_BY_GROUP_1 = 21,
303  CS101_COT_INTERROGATED_BY_GROUP_2 = 22,
304  CS101_COT_INTERROGATED_BY_GROUP_3 = 23,
305  CS101_COT_INTERROGATED_BY_GROUP_4 = 24,
306  CS101_COT_INTERROGATED_BY_GROUP_5 = 25,
307  CS101_COT_INTERROGATED_BY_GROUP_6 = 26,
308  CS101_COT_INTERROGATED_BY_GROUP_7 = 27,
309  CS101_COT_INTERROGATED_BY_GROUP_8 = 28,
310  CS101_COT_INTERROGATED_BY_GROUP_9 = 29,
311  CS101_COT_INTERROGATED_BY_GROUP_10 = 30,
312  CS101_COT_INTERROGATED_BY_GROUP_11 = 31,
313  CS101_COT_INTERROGATED_BY_GROUP_12 = 32,
314  CS101_COT_INTERROGATED_BY_GROUP_13 = 33,
315  CS101_COT_INTERROGATED_BY_GROUP_14 = 34,
316  CS101_COT_INTERROGATED_BY_GROUP_15 = 35,
317  CS101_COT_INTERROGATED_BY_GROUP_16 = 36,
318  CS101_COT_REQUESTED_BY_GENERAL_COUNTER = 37,
319  CS101_COT_REQUESTED_BY_GROUP_1_COUNTER = 38,
320  CS101_COT_REQUESTED_BY_GROUP_2_COUNTER = 39,
321  CS101_COT_REQUESTED_BY_GROUP_3_COUNTER = 40,
322  CS101_COT_REQUESTED_BY_GROUP_4_COUNTER = 41,
323  CS101_COT_UNKNOWN_TYPE_ID = 44,
324  CS101_COT_UNKNOWN_COT = 45,
325  CS101_COT_UNKNOWN_CA = 46,
326  CS101_COT_UNKNOWN_IOA = 47
327 } CS101_CauseOfTransmission;
328 
329 const char*
330 CS101_CauseOfTransmission_toString(CS101_CauseOfTransmission self);
331 
332 void
333 Lib60870_enableDebugOutput(bool value);
334 
336 Lib60870_getLibraryVersionInfo(void);
337 
341 bool
343 
347 void
348 CS101_ASDU_setTest(CS101_ASDU self, bool value);
349 
353 bool
355 
359 void
361 
365 int
367 
371 CS101_CauseOfTransmission
373 
377 void
378 CS101_ASDU_setCOT(CS101_ASDU self, CS101_CauseOfTransmission value);
379 
383 int
385 
391 void
393 
394 
402 
412 void
414 
423 bool
425 
434 void
435 CS101_ASDU_setSequence(CS101_ASDU self, bool isSequence);
436 
442 int
444 
454 void
455 CS101_ASDU_setNumberOfElements(CS101_ASDU self, int numberOfElements);
456 
464 InformationObject
466 
475 InformationObject
476 CS101_ASDU_getElementEx(CS101_ASDU self, InformationObject io, int index);
477 
492 CS101_ASDU_create(CS101_AppLayerParameters parameters, bool isSequence, CS101_CauseOfTransmission cot, int oa, int ca,
493  bool isTest, bool isNegative);
494 
512 CS101_ASDU_initializeStatic(CS101_StaticASDU self, CS101_AppLayerParameters parameters, bool isSequence, CS101_CauseOfTransmission cot, int oa, int ca,
513  bool isTest, bool isNegative);
514 
525 
533 uint8_t*
535 
548 bool
549 CS101_ASDU_addPayload(CS101_ASDU self, uint8_t* buffer, int size);
550 
558 int
560 
564 void
566 
577 bool
578 CS101_ASDU_addInformationObject(CS101_ASDU self, InformationObject io);
579 
585 void
587 
591 int
593 
597 void
599 
603 int
605 
609 void
611 
615 int
617 
621 void
623 
627 int
629 
633 void
635 
639 bool
641 
645 void
647 
651 bool
653 
657 void
659 
665 
666 
668 CP32Time2a_create(CP32Time2a self);
669 
670 void
671 CP32Time2a_setFromMsTimestamp(CP32Time2a self, uint64_t timestamp);
672 
673 int
674 CP32Time2a_getMillisecond(const CP32Time2a self);
675 
676 void
677 CP32Time2a_setMillisecond(CP32Time2a self, int value);
678 
679 int
680 CP32Time2a_getSecond(const CP32Time2a self);
681 
682 void
683 CP32Time2a_setSecond(CP32Time2a self, int value);
684 
685 int
686 CP32Time2a_getMinute(const CP32Time2a self);
687 
688 
689 void
690 CP32Time2a_setMinute(CP32Time2a self, int value);
691 
692 bool
693 CP32Time2a_isInvalid(const CP32Time2a self);
694 
695 void
696 CP32Time2a_setInvalid(CP32Time2a self, bool value);
697 
698 bool
699 CP32Time2a_isSubstituted(const CP32Time2a self);
700 
701 void
702 CP32Time2a_setSubstituted(CP32Time2a self, bool value);
703 
704 int
705 CP32Time2a_getHour(const CP32Time2a self);
706 
707 void
708 CP32Time2a_setHour(CP32Time2a self, int value);
709 
710 bool
711 CP32Time2a_isSummerTime(const CP32Time2a self);
712 
713 void
714 CP32Time2a_setSummerTime(CP32Time2a self, bool value);
715 
719 void
720 CP56Time2a_setFromMsTimestamp(CP56Time2a self, uint64_t timestamp);
721 
725 uint64_t
727 
731 int
733 
737 void
739 
740 int
741 CP56Time2a_getSecond(const CP56Time2a self);
742 
743 void
744 CP56Time2a_setSecond(CP56Time2a self, int value);
745 
746 int
747 CP56Time2a_getMinute(const CP56Time2a self);
748 
749 void
750 CP56Time2a_setMinute(CP56Time2a self, int value);
751 
752 int
753 CP56Time2a_getHour(const CP56Time2a self);
754 
755 void
756 CP56Time2a_setHour(CP56Time2a self, int value);
757 
758 int
759 CP56Time2a_getDayOfWeek(const CP56Time2a self);
760 
761 void
762 CP56Time2a_setDayOfWeek(CP56Time2a self, int value);
763 
764 int
765 CP56Time2a_getDayOfMonth(const CP56Time2a self);
766 
767 void
768 CP56Time2a_setDayOfMonth(CP56Time2a self, int value);
769 
775 int
777 
783 void
785 
791 int
793 
799 void
801 
802 bool
803 CP56Time2a_isSummerTime(const CP56Time2a self);
804 
805 void
806 CP56Time2a_setSummerTime(CP56Time2a self, bool value);
807 
808 bool
809 CP56Time2a_isInvalid(const CP56Time2a self);
810 
811 void
812 CP56Time2a_setInvalid(CP56Time2a self, bool value);
813 
814 bool
815 CP56Time2a_isSubstituted(const CP56Time2a self);
816 
817 void
818 CP56Time2a_setSubstituted(CP56Time2a self, bool value);
819 
821 BinaryCounterReading_create(BinaryCounterReading self, int32_t value, int seqNumber,
822  bool hasCarry, bool isAdjusted, bool isInvalid);
823 
824 void
825 BinaryCounterReading_destroy(BinaryCounterReading self);
826 
827 int32_t
828 BinaryCounterReading_getValue(BinaryCounterReading self);
829 
830 void
831 BinaryCounterReading_setValue(BinaryCounterReading self, int32_t value);
832 
833 int
834 BinaryCounterReading_getSequenceNumber(BinaryCounterReading self);
835 
836 bool
837 BinaryCounterReading_hasCarry(BinaryCounterReading self);
838 
839 bool
840 BinaryCounterReading_isAdjusted(BinaryCounterReading self);
841 
842 bool
843 BinaryCounterReading_isInvalid(BinaryCounterReading self);
844 
845 void
846 BinaryCounterReading_setSequenceNumber(BinaryCounterReading self, int value);
847 
848 void
849 BinaryCounterReading_setCarry(BinaryCounterReading self, bool value);
850 
851 void
852 BinaryCounterReading_setAdjusted(BinaryCounterReading self, bool value);
853 
854 void
855 BinaryCounterReading_setInvalid(BinaryCounterReading self, bool value);
856 
861 typedef struct sFrame* Frame;
862 
863 void
864 Frame_destroy(Frame self);
865 
866 void
867 Frame_resetFrame(Frame self);
868 
869 void
870 Frame_setNextByte(Frame self, uint8_t byte);
871 
872 void
873 Frame_appendBytes(Frame self, uint8_t* bytes, int numberOfBytes);
874 
875 int
876 Frame_getMsgSize(Frame self);
877 
878 uint8_t*
879 Frame_getBuffer(Frame self);
880 
881 int
882 Frame_getSpaceLeft(Frame self);
883 
884 #ifdef __cplusplus
885 }
886 #endif
887 
888 #endif /* SRC_INC_IEC60870_COMMON_H_ */
Functions for CS101/CS104 information objects These are the implementation of the different data type...
bool CS101_ASDU_isSequence(CS101_ASDU self)
Check if the ASDU contains a sequence of consecutive information objects.
void CP56Time2a_setFromMsTimestamp(CP56Time2a self, uint64_t timestamp)
Set the time value of a 7 byte time from a UTC ms timestamp.
CS101_ASDU CS101_ASDU_create(CS101_AppLayerParameters parameters, bool isSequence, CS101_CauseOfTransmission cot, int oa, int ca, bool isTest, bool isNegative)
Create a new ASDU. The type ID will be derived from the first InformationObject that will be added.
bool CS101_ASDU_addPayload(CS101_ASDU self, uint8_t *buffer, int size)
Append the provided data to the ASDU payload.
void CP56Time2a_setMonth(CP56Time2a self, int value)
Set the month field of the time.
void CP24Time2a_setSubstituted(CP24Time2a self, bool value)
Set the substituted flag of the time value.
void CS101_ASDU_removeAllElements(CS101_ASDU self)
remove all information elements from the ASDU object
int CP56Time2a_getMillisecond(const CP56Time2a self)
Get the ms part of a time value.
void CP56Time2a_setYear(CP56Time2a self, int value)
Set the year.
void CP24Time2a_setMinute(CP24Time2a self, int value)
Set the minute part of the time value.
void CP24Time2a_setMillisecond(CP24Time2a self, int value)
Set the millisecond part of the time value.
int CP56Time2a_getMonth(const CP56Time2a self)
Get the month field of the time.
void CS101_ASDU_setTest(CS101_ASDU self, bool value)
Set the test flag of the ASDU.
IEC60870_5_TypeID CS101_ASDU_getTypeID(CS101_ASDU self)
Get the type ID of the ASDU.
void CS101_ASDU_setTypeID(CS101_ASDU self, IEC60870_5_TypeID typeId)
Set the type ID of the ASDU.
bool CS101_ASDU_isNegative(CS101_ASDU self)
Check if the negative flag of the ASDU is set.
struct sCS101_ASDU * CS101_ASDU
Application Service Data Unit (ASDU) for the CS101/CS104 application layer.
Definition: iec60870_common.h:216
int CP24Time2a_getSecond(const CP24Time2a self)
Get the second part of the time value.
LinkLayerState
State of the link layer.
Definition: iec60870_common.h:70
InformationObject CS101_ASDU_getElement(CS101_ASDU self, int index)
Get the information object with the given index.
void CS101_ASDU_setSequence(CS101_ASDU self, bool isSequence)
Set the ASDU to represent a sequence of consecutive information objects.
void CP56Time2a_setMillisecond(CP56Time2a self, int value)
Set the ms part of a time value.
void CS101_ASDU_destroy(CS101_ASDU self)
Destroy the ASDU object (release all resources)
CS101_ASDU CS101_ASDU_initializeStatic(CS101_StaticASDU self, CS101_AppLayerParameters parameters, bool isSequence, CS101_CauseOfTransmission cot, int oa, int ca, bool isTest, bool isNegative)
Create a new ASDU and store it in the provided static ASDU structure.
IEC60870_5_TypeID
Message type IDs.
Definition: iec60870_common.h:125
InformationObject CS101_ASDU_getElementEx(CS101_ASDU self, InformationObject io, int index)
Get the information object with the given index and store it in the provided information object insta...
void(* IEC60870_RawMessageHandler)(void *parameter, uint8_t *msg, int msgSize, bool sent)
Callback handler for sent and received messages.
Definition: iec60870_common.h:105
int CS101_ASDU_getNumberOfElements(CS101_ASDU self)
Get the number of information objects (elements) in the ASDU.
void CP24Time2a_setInvalid(CP24Time2a self, bool value)
Set the invalid flag of the time value.
uint64_t CP56Time2a_toMsTimestamp(const CP56Time2a self)
Convert a 7 byte time to a ms timestamp.
CP56Time2a CP56Time2a_createFromMsTimestamp(CP56Time2a self, uint64_t timestamp)
Create a 7 byte time from a UTC ms timestamp.
void(* IEC60870_LinkLayerStateChangedHandler)(void *parameter, int address, LinkLayerState newState)
Callback handler for link layer state changes.
Definition: iec60870_common.h:91
struct sCS101_AppLayerParameters * CS101_AppLayerParameters
Parameters for the CS101/CS104 application layer.
Definition: iec60870_common.h:110
void CS101_ASDU_setNumberOfElements(CS101_ASDU self, int numberOfElements)
Set the number of information objects (elements) in the ASDU.
int CS101_ASDU_getCA(CS101_ASDU self)
Get the common address (CA) of the ASDU.
bool CS101_ASDU_isTest(CS101_ASDU self)
Check if the test flag of the ASDU is set.
void CS101_ASDU_setNegative(CS101_ASDU self, bool value)
Set the negative flag of the ASDU.
uint8_t * CS101_ASDU_getPayload(CS101_ASDU self)
void CP16Time2a_setEplapsedTimeInMs(CP16Time2a self, int value)
set the elapsed time in ms
struct sCP56Time2a * CP56Time2a
7 byte binary time
Definition: iec60870_common.h:253
void CP24Time2a_setSecond(CP24Time2a self, int value)
Set the second part of the time value.
CS101_ASDU CS101_ASDU_clone(CS101_ASDU self, CS101_StaticASDU clone)
Create a new ASDU that is an exact copy of the ASDU.
void CS101_ASDU_setCOT(CS101_ASDU self, CS101_CauseOfTransmission value)
Set the cause of transmission (COT) of the ASDU.
IEC60870_LinkLayerMode
link layer mode for serial link layers
Definition: iec60870_common.h:64
struct sCS104_APCIParameters * CS104_APCIParameters
Parameters for CS104 connections - APCI (application protocol control information)
Definition: iec60870_common.h:271
int CS101_ASDU_getPayloadSize(CS101_ASDU self)
bool CP24Time2a_isInvalid(const CP24Time2a self)
Check if the invalid flag of the time value is set.
int CP24Time2a_getMinute(const CP24Time2a self)
Get the minute part of the time value.
int CP24Time2a_getMillisecond(const CP24Time2a self)
Get the millisecond part of the time value.
bool CS101_ASDU_addInformationObject(CS101_ASDU self, InformationObject io)
add an information object to the ASDU
struct sBinaryCounterReading * BinaryCounterReading
Base type for counter readings.
Definition: iec60870_common.h:262
bool CP24Time2a_isSubstituted(const CP24Time2a self)
Check if the substituted flag of the time value is set.
int CP56Time2a_getYear(const CP56Time2a self)
Get the year (range 0..99)
int CS101_ASDU_getOA(CS101_ASDU self)
get the OA (originator address) of the ASDU.
CS101_CauseOfTransmission CS101_ASDU_getCOT(CS101_ASDU self)
Get the cause of transmission (COT) of the ASDU.
void CS101_ASDU_setCA(CS101_ASDU self, int ca)
Set the common address (CA) of the ASDU.
int CP16Time2a_getEplapsedTimeInMs(const CP16Time2a self)
Get the elapsed time in ms.
@ LL_STATE_BUSY
Definition: iec60870_common.h:78
@ LL_STATE_AVAILABLE
Definition: iec60870_common.h:81
@ LL_STATE_IDLE
Definition: iec60870_common.h:72
@ LL_STATE_ERROR
Definition: iec60870_common.h:75
lib60870 version information
Definition: iec60870_common.h:55
Definition: iec60870_common.h:264
Definition: iec60870_common.h:231
Definition: iec60870_common.h:237
4 byte binary time
Definition: iec60870_common.h:246
Definition: iec60870_common.h:255
Definition: iec60870_common.h:112
Definition: iec60870_common.h:218
Definition: iec60870_common.h:273