--
-- Part of the ASN.1-Specification for MMS
-- tries to include only those parts relevant for IEC 61850
-- source: http://www.nettedautomation.com/standardization/iso/tc184/sc5/wg2/mms_syntax/Version1999/mms_syntax.html

ASN1 { iso standard 9506 part(2) mms-general-module-version(2) } DEFINITIONS ::= BEGIN

MMSpdu ::= CHOICE {
    confirmed-RequestPDU    [0]     IMPLICIT Confirmed-RequestPDU,  
    confirmed-ResponsePDU   [1]     IMPLICIT Confirmed-ResponsePDU,
    confirmed-ErrorPDU      [2]     IMPLICIT Confirmed-ErrorPDU,
    unconfirmed-PDU         [3]     IMPLICIT Unconfirmed-PDU,
    rejectPDU               [4]     IMPLICIT RejectPDU,
    initiate-RequestPDU     [8]     IMPLICIT Initiate-RequestPDU,
    initiate-ResponsePDU    [9]     IMPLICIT Initiate-ResponsePDU,
    initiate-ErrorPDU       [10]    IMPLICIT Initiate-ErrorPDU,
    conclude-RequestPDU     [11]    IMPLICIT Conclude-RequestPDU
}

Confirmed-RequestPDU ::= SEQUENCE {
    invokeID Unsigned32,
    service ConfirmedServiceRequest
}

ConfirmedServiceRequest ::= CHOICE {
    getNameList                     [1]     IMPLICIT    GetNameList-Request,
    read                            [4]     IMPLICIT    Read-Request,
    write                           [5]     IMPLICIT    Write-Request,
    getVariableAccessAttributes     [6]                 GetVariableAccessAttributes-Request,
    defineNamedVariableList         [11]    IMPLICIT    DefineNamedVariableList-Request,
    getNamedVariableListAttributes  [12]                GetNamedVariableListAttributes-Request,
    deleteNamedVariableList         [13]    IMPLICIT    DeleteNamedVariableList-Request,
    fileOpen                        [72]    IMPLICIT    FileOpen-Request,
    fileRead                        [73]    IMPLICIT    FileRead-Request,
    fileClose                       [74]    IMPLICIT    FileClose-Request,
    fileDelete                      [76]    IMPLICIT    FileDelete-Request,
    fileDirectory                   [77]    IMPLICIT    FileDirectory-Request
}

Unconfirmed-PDU ::= SEQUENCE {
    service UnconfirmedService
}

UnconfirmedService ::= CHOICE {
    informationReport [0] IMPLICIT InformationReport
}

Confirmed-ResponsePDU ::= SEQUENCE {
    invokeID Unsigned32,
    service ConfirmedServiceResponse
}

ConfirmedServiceResponse ::= CHOICE {
    getNameList                     [1]     IMPLICIT GetNameList-Response,
    read                            [4]     IMPLICIT Read-Response,
    write                           [5]     IMPLICIT Write-Response,
    getVariableAccessAttributes     [6]     IMPLICIT GetVariableAccessAttributes-Response,
    defineNamedVariableList         [11]    IMPLICIT DefineNamedVariableList-Response,
    getNamedVariableListAttributes  [12]    IMPLICIT GetNamedVariableListAttributes-Response,
    deleteNamedVariableList         [13]    IMPLICIT DeleteNamedVariableList-Response,
    fileOpen                        [72]    IMPLICIT FileOpen-Response,
    fileRead                        [73]    IMPLICIT FileRead-Response,
    fileClose                       [74]    IMPLICIT FileClose-Response,
    fileDelete                      [76]    IMPLICIT FileDelete-Response,
    fileDirectory                   [77]    IMPLICIT FileDirectory-Response
}


Confirmed-ErrorPDU ::= SEQUENCE {
    invokeID            [0] IMPLICIT Unsigned32,
    modifierPosition    [1] IMPLICIT Unsigned32 OPTIONAL,
    serviceError        [2] IMPLICIT ServiceError
}


ServiceError ::= SEQUENCE {       
    errorClass      [0] CHOICE { 
        vmd_state       [0] IMPLICIT INTEGER,
--        {       
--            other                                   (0),                           
--            vmd-state-conflict                      (1),            
--            vmd-operational-problem                 (2), 
--            domain-transfer-problem                 (3),    
--            state-machine-id-invalid                (4)     
--        },
        application_reference   [1] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            aplication-unreachable                  (1),
--            connection-lost                         (2),
--            application-reference-invalid           (3),
--            context-unsupported                     (4)
--        },
        definition              [2] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            object-undefined                        (1),
--            invalid-address                         (2),
--            type-unsupported                        (3),
--            type-inconsistent                       (4),
--            object-exists                           (5),
--            object-attribute-inconsistent           (6)
--        },
        resource                [3] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            memory-unavailable                      (1),
--            processor-resource-unavailable          (2),
--            mass-storage-unavailable                (3),
--            capability-unavailable                  (4),
--            capability-unknown                      (5)
--        },
        service                 [4] IMPLICIT INTEGER,
--        {       
--            other                                   (0),
--            primitives-out-of-sequence              (1),
--            object-state-conflict                   (2),
--            pdu-size                                (3),
--            continuation-invalid                    (4),
--            object-constraint-conflict              (5)
--        },
        service_preempt         [5] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            timeout                                 (1),
--            deadlock                                (2),
--            cancel                                  (3)
--        },
        time_resolution         [6] IMPLICIT INTEGER, 
--        {       
--            other                                   (0),
--            unsupportable-time-resolution           (1)
--        },
        access                  [7] IMPLICIT INTEGER, 
--        {
--            other                                   (0),
--            object-access-unsupported               (1),
--            object-non-existent                     (2),
--            object-access-denied                    (3),
--            object-invalidated                      (4)
--        },
        initiate                        [8] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            version-incompatible                    (1),
--            max-segment-insufficient                (2),
--            max-services-outstanding-calling-insufficient (3),
--            max-services-outstanding-called-insufficient  (4),
--            service-CBB-insufficient                (5),
--            parameter-CBB-insufficient              (6),
--            nesting-level-insufficient              (7)
--        },
        conclude                        [9] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            further-communication-required          (1)
--        },
        cancel                          [10] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            invoke-id-unknown                       (1),
--            cancel-not-possible                     (2)
--        },
        file                            [11] IMPLICIT INTEGER,
--        {
--            other                                   (0),
--            filename-ambiguous                      (1),
--            file-busy                               (2),
--            filename-syntax_Error                   (3),
--            content-type-invalid                    (4),
--            position-invalid                        (5),
--            file-acces-denied                       (6),
--            file-non-existent                       (7),
--            duplicate-filename                      (8),
--            insufficient-space-in-filestore         (9)
--        },
        others                          [12] IMPLICIT INTEGER
    },
    additionalCode                  [1] IMPLICIT INTEGER OPTIONAL,
    additionalDescription           [2] IMPLICIT VisibleString OPTIONAL
--      serviceSpecificInformation      [3] CHOICE
--                      {
--                      obtainFile                      [0] IMPLICIT ObtainFile_Error,
--                      start                           [1] IMPLICIT Start_Error,
--                      stop                            [2] IMPLICIT Stop_Error,
--                      resume                          [3] IMPLICIT Resume_Error,
--                      reset                           [4] IMPLICIT Reset_Error,
--                      deleteVariableAccess            [5] IMPLICIT DeleteVariableAccess_Error,
--                      deleteNamedVariableList         [6] IMPLICIT DeleteNamedVariableList_Error,
--                      deleteNamedType                 [7] IMPLICIT DeleteNamedType_Error,
--                      defineEventEnrollment_Error     [8] DefineEventEnrollment_Error,
--                      fileRename                      [9] IMPLICIT FileRename_Error
-- this one is neither in this ASN nor in the IMPORTS
--                      additionalService               [10] AdditionalServiceError
--                      } OPTIONAL
        }


TimeOfDay ::= OCTET STRING (SIZE(4|6))

BasicIdentifier ::= VisibleString ( FROM
("A"|"a"|"B"|"b"|"C"|"c"|"D"|"d"|"E"|"e"|"F"|"f"|
"G"|"g"|"H"|"h"|"I"|"i"|"J"|"j"|"K"|"k"|"L"|"l"|
"M"|"m"|"N"|"n"|"O"|"o"|"P"|"p"|"Q"|"q"|"R"|"r"|
"S"|"s"|"T"|"t"|"U"|"u"|"V"|"v"|"W"|"w"|"X"|"x"|
"Y"|"y"|"Z"|"z"|"$"|"_"|"0"|"1"|"2"|"3"|"4"|"5"|
"6"|"7"|"8"|"9") ) (SIZE(1..32))


Identifier ::= VisibleString

Integer8  ::= INTEGER(-128..127)
Integer16 ::= INTEGER(-32768..32767)
Integer32 ::= INTEGER(-2147483648..2147483647)

Unsigned8  ::= INTEGER(0..255)
Unsigned16 ::= INTEGER(0..65535)
Unsigned32 ::= INTEGER(0..4294967295)

ObjectName ::= CHOICE {
    vmd-specific            [0] IMPLICIT Identifier,
    domain-specific         [1] IMPLICIT SEQUENCE {
        domainID        Identifier,
        itemID          Identifier
    },
    aa-specific             [2] IMPLICIT Identifier
}


ObjectClass ::= CHOICE {
    basicObjectClass [0] IMPLICIT INTEGER 
--    {
--        namedVariable (0),
--        scatteredAccess (1),
--        namedVariableList (2),
--        namedType (3),
--        semaphore (4),
--        eventCondition (5),
--        eventAction (6),
--        eventEnrollment (7),
--        journal (8),
--        domain (9),
--        programInvocation (10),
--        operatorStation (11),
--        dataExchange (12), ---- Shall not appear in minor version 1
--        accessControlList (13) ---- Shall not appear in minor version 1 or 2
--    }
}

MMSString ::= VisibleString


Initiate-RequestPDU ::= SEQUENCE {
    localDetailCalling                  [0] IMPLICIT Integer32 OPTIONAL,
    proposedMaxServOutstandingCalling   [1] IMPLICIT Integer16,
    proposedMaxServOutstandingCalled    [2] IMPLICIT Integer16,
    proposedDataStructureNestingLevel   [3] IMPLICIT Integer8 OPTIONAL,
    initRequestDetail                   [4] IMPLICIT SEQUENCE {
        proposedVersionNumber       [0] IMPLICIT Integer16,
        proposedParameterCBB        [1] IMPLICIT ParameterSupportOptions,
        servicesSupportedCalling    [2] IMPLICIT ServiceSupportOptions
    }
}

Initiate-ResponsePDU ::= SEQUENCE {
    localDetailCalled                   [0] IMPLICIT Integer32 OPTIONAL,
    negotiatedMaxServOutstandingCalling [1] IMPLICIT Integer16,
    negotiatedMaxServOutstandingCalled  [2] IMPLICIT Integer16,
    negotiatedDataStructureNestingLevel [3] IMPLICIT Integer8 OPTIONAL,
    initResponseDetail [4] IMPLICIT SEQUENCE {
        negotiatedVersionNumber [0] IMPLICIT Integer16,
        negotiatedParameterCBB  [1] IMPLICIT ParameterSupportOptions,
        servicesSupportedCalled [2] IMPLICIT ServiceSupportOptions
    }
}

Initiate-ErrorPDU ::= ServiceError

Conclude-RequestPDU ::= NULL


RejectPDU ::= SEQUENCE
{
        originalInvokeID                [0] IMPLICIT Unsigned32 OPTIONAL,
        rejectReason                        CHOICE 
        {
                confirmed-requestPDU            [1] IMPLICIT INTEGER, 
--               {
--                        other                                   (0),
--                        unrecognized-service                    (1),
--                        unrecognized-modifier                   (2),
--                        invalid-invokeID                        (3),
--                        invalid-argument                        (4),
--                        invalid-modifier                        (5),
--                        max-serv-outstanding-exceeded           (6),
--                        max-recursion-exceeded                  (8),
--                        value-out-of-range                      (9)
--                },

                confirmed-responsePDU           [2] IMPLICIT INTEGER, 
--                {
--                        other                                   (0),
--                        unrecognized-service                    (1),
--                        invalid-invokeID                        (2),
--                        invalid-result                          (3),
--                        max-recursion-exceeded                  (5),
--                        value-out-of-range                      (6)     
--                },      
                
                confirmed-errorPDU              [3] IMPLICIT INTEGER, 
--                {
--                        other                                   (0),
--                        unrecognized-service                    (1),
--                        invalid-invokeID                        (2),
--                        invalid-serviceError                    (3),
--                        value-out-of-range                      (4)      
--                } ,                     
                        
                unconfirmedPDU                  [4] IMPLICIT INTEGER,
--                {
--                        other                                   (0),
--                        unrecognized-service                    (1),
--                        invalid-argument                        (2),
--                        max-recursion-exceeded                  (3),
--                        value-out-of-range                      (4)     
--                },

                pdu-error                       [5] IMPLICIT INTEGER,
--                {
--                        unknown-pdu-type                        (0),
--                        invalid-pdu                             (1),
--                        illegal-acse-mapping                    (2)
--                },

                cancel-requestPDU               [6] IMPLICIT INTEGER,
--                {
--                        other                                   (0),
--                        invalid-invokeID                        (1)     
--                },      

                cancel-responsePDU              [7] IMPLICIT INTEGER,
--                {
--                        other                                   (0),
--                        invalid-invokeID                        (1)     
--                },

                cancel-errorPDU                 [8] IMPLICIT INTEGER,
--                {
--                        other                                   (0),
--                        invalid-invokeID                        (1),
--                        invalid-serviceError                    (2),
--                        value-out-of-range                      (3)     
--                },

                conclude-requestPDU             [9] IMPLICIT INTEGER,
--                {
--                        other                                   (0),
--                        invalid-argument                        (1)     
--                },      

                conclude-responsePDU            [10] IMPLICIT INTEGER,
--                {
--                        other                                   (0),
--                        invalid-result                          (1)     
--                },

                conclude-errorPDU               [11] IMPLICIT INTEGER
--                {
--                        other                                   (0),
--                        invalid-serviceError                    (1),
--                        value-out-of-range                      (2)     
--                }
        }
}


GetNameList-Request ::= SEQUENCE {
    objectClass [0] ObjectClass,
    objectScope             [1] CHOICE {
        vmdSpecific             [0] IMPLICIT NULL,
        domainSpecific          [1] IMPLICIT Identifier,
        aaSpecific              [2] IMPLICIT NULL
    },
    continueAfter   [2] IMPLICIT Identifier OPTIONAL
}


GetNameList-Response ::= SEQUENCE {
    listOfIdentifier        [0] IMPLICIT SEQUENCE OF Identifier,
    moreFollows             [1] IMPLICIT BOOLEAN DEFAULT TRUE
}


TypeSpecification ::= CHOICE {
--    typeName        [0] ObjectName,
    typeDescription     TypeDescription
}

AlternateAccess ::= SEQUENCE OF CHOICE {
    unnamed                 AlternateAccessSelection
--  named   [5] IMPLICIT    SEQUENCE {
--      componentName   [0] CHOICE {
--          basic BasicIdentifier,
--          extended ExtendedIdentifier
--      },
--      access AlternateAccessSelection
--  }
}

AlternateAccessSelection ::= CHOICE {

    selectAlternateAccess [0] IMPLICIT SEQUENCE {
        accessSelection CHOICE {
            component   [0] CHOICE {
                basic BasicIdentifier --,
                --extended ExtendedIdentifier
            },         -- component
            index       [1] IMPLICIT Unsigned32, -- 1 array element
            indexRange  [2] IMPLICIT SEQUENCE { -- array elements
                lowIndex            [0] IMPLICIT Unsigned32,
                numberOfElements    [1] IMPLICIT Unsigned32
            },
            allElements [3] IMPLICIT NULL -- all array elements
        },
        alternateAccess AlternateAccess
    },
    selectAccess CHOICE {
        component   [1] CHOICE {
            basic BasicIdentifier --,
            --extended ExtendedIdentifier
        },         -- component
        index       [2] IMPLICIT Unsigned32, -- 1 array element
        indexRange  [3] IMPLICIT SEQUENCE { -- array elements
            lowIndex            [0] IMPLICIT Unsigned32,
            numberOfElements    [1] IMPLICIT Unsigned32
        },
        allElements [4] IMPLICIT NULL -- all array elements
    }
}

AccessResult ::= CHOICE {
    failure [0] IMPLICIT    DataAccessError,
    success                 Data
}


Data ::= CHOICE {
    -- context tag 0 is reserved for AccessResult
    array               [1]     IMPLICIT SEQUENCE OF Data,
    structure           [2]     IMPLICIT SEQUENCE OF Data,
    --boolean           [3]     IMPLICIT BOOLEAN,
    bool                [3]     IMPLICIT BOOLEAN,
    bit-string          [4]     IMPLICIT BIT STRING,
    integer             [5]     IMPLICIT INTEGER,
    unsigned            [6]     IMPLICIT INTEGER, -- shall not be negative
    floating-point      [7]     IMPLICIT FloatingPoint,
    -- [8] is reserved
    octet-string        [9]     IMPLICIT OCTET STRING,
    visible-string      [10]    IMPLICIT VisibleString,
    --generalized-time  [11]    IMPLICIT GeneralizedTime,
    binary-time         [12]    IMPLICIT TimeOfDay,
    --bcd               [13]    IMPLICIT INTEGER, ---- shall not be negative
    --booleanArray      [14]    IMPLICIT BIT STRING,
    --objId             [15]    IMPLICIT OBJECT IDENTIFIER,
    --...,
    mMSString            [16]   IMPLICIT MMSString,
    utc-time             [17]   IMPLICIT UtcTime -- added by IEC61850 8.1 G3
}


FloatingPoint ::= OCTET STRING

DataAccessError ::= INTEGER 
--{
--    object-invalidated (0),
--    hardware-fault (1),
--    temporarily-unavailable (2),
--    object-access-denied (3),
--    object-undefined (4),
--    invalid-address (5),
--    type-unsupported (6),
--    type-inconsistent (7),
--    object-attribute-inconsistent (8),
--    object-access-unsupported (9),
--    object-non-existent (10),
--    object-value-invalid (11)
--}


VariableAccessSpecification ::= CHOICE {
    listOfVariable      [0] IMPLICIT VariableDefs,
    variableListName    [1] ObjectName
}

VariableDefs ::= SEQUENCE OF SEQUENCE {
    variableSpecification                   VariableSpecification,
    alternateAccess         [5] IMPLICIT    AlternateAccess OPTIONAL
}

VariableSpecification ::= CHOICE {
    name [0] ObjectName
--    address [1] Address,
--    variableDescription [2] IMPLICIT SEQUENCE {
--        address Address,
--        typeSpecificationTypeSpecification
--    },

-- the following element is present only to support the services
-- defined in annex E
--    scatteredAccessDescription [3] IMPLICIT ScatteredAccessDescription,
--    invalidated [4] IMPLICIT NULL
}

Read-Request ::= SEQUENCE {
    specificationWithResult     [0] IMPLICIT BOOLEAN DEFAULT FALSE,
    variableAccessSpecification [1] VariableAccessSpecification
}

Read-Response ::= SEQUENCE {
    variableAccessSpecification [0] VariableAccessSpecification OPTIONAL,
    listOfAccessResult [1] IMPLICIT SEQUENCE OF AccessResult
}

Write-Request ::= SEQUENCE {
    variableAccessSpecification VariableAccessSpecification,
    listOfData [0] IMPLICIT SEQUENCE OF Data
}

Write-Response ::= SEQUENCE OF CHOICE {
    failure [0] IMPLICIT DataAccessError,
    success [1] IMPLICIT NULL
}

InformationReport ::= SEQUENCE {
    variableAccessSpecification     VariableAccessSpecification,
    listOfAccessResult [0] IMPLICIT SEQUENCE OF AccessResult
}

GetVariableAccessAttributes-Request ::= CHOICE {
    name    [0] ObjectName
--    address [1] Address
}

GetVariableAccessAttributes-Response ::= SEQUENCE {
    mmsDeletable [0] IMPLICIT BOOLEAN,
--    address [1] Address OPTIONAL,
    typeDescription [2] TypeDescription
--    accessControlList [3] CHOICE {
--        basic BasicIdentifier,
--       extended ExtendedIdentifier
--    } OPTIONAL,
--    meaning [4] ObjectName OPTIONAL
}

DefineNamedVariableList-Request ::= SEQUENCE {
    variableListName ObjectName,
    listOfVariable [0] IMPLICIT VariableDefs
}

DefineNamedVariableList-Response ::= NULL

GetNamedVariableListAttributes-Request ::= ObjectName -- VariableListName

GetNamedVariableListAttributes-Response ::= SEQUENCE {
    mmsDeletable    [0] IMPLICIT BOOLEAN,
    listOfVariable  [1] IMPLICIT VariableDefs
--    accessControlList [2] CHOICE {
--        basic BasicIdentifier,
--        extended ExtendedIdentifier
--    } OPTIONAL
}


DeleteNamedVariableList-Request ::= SEQUENCE {
    scopeOfDelete [0] IMPLICIT INTEGER DEFAULT 0, 
--    {
--        specific (0),
--        aa-specific (1),
--        domain (2),
--        vmd (3)
--    } DEFAULT specific,
    listOfVariableListName [1] IMPLICIT SEQUENCE OF ObjectName OPTIONAL,
    domainName [2] CHOICE {
        basic BasicIdentifier --,
        --extended ExtendedIdentifier
    } OPTIONAL
}

DeleteNamedVariableList-Response ::= SEQUENCE {
    numberMatched [0] IMPLICIT Unsigned32,
    numberDeleted [1] IMPLICIT Unsigned32
}

FileOpen-Request ::= SEQUENCE {
    fileName [0] IMPLICIT FileName,
    initialPosition [1] IMPLICIT Unsigned32
}

FileOpen-Response ::= SEQUENCE {
    frsmID [0] IMPLICIT Integer32,
    fileAttributes [1] IMPLICIT FileAttributes
}

FileRead-Request ::= Integer32 -- FRSM ID

FileRead-Response ::= SEQUENCE {
    fileData [0] IMPLICIT OCTET STRING,
    moreFollows [1] IMPLICIT BOOLEAN DEFAULT TRUE
}

FileClose-Request ::= Integer32 -- FRSM ID

FileClose-Response ::= NULL

FileDelete-Request ::= FileName

FileDelete-Response ::= NULL

FileDirectory-Request ::= SEQUENCE {
    fileSpecification [0] IMPLICIT FileName OPTIONAL,
    continueAfter [1] IMPLICIT FileName OPTIONAL
}

FileDirectory-Response ::= SEQUENCE {
    listOfDirectoryEntry [0] SEQUENCE OF DirectoryEntry,
    moreFollows [1] IMPLICIT BOOLEAN DEFAULT FALSE
}

DirectoryEntry ::= SEQUENCE {
    fileName [0] IMPLICIT FileName,
    fileAttributes [1] IMPLICIT FileAttributes
}

FileAttributes ::= SEQUENCE {
    sizeOfFile [0] IMPLICIT Unsigned32, -- in octets
    lastModified [1] IMPLICIT GeneralizedTime OPTIONAL
}

FileName ::= SEQUENCE OF GraphicString

TypeDescription ::= CHOICE {
    array [1] IMPLICIT SEQUENCE {
        packed [0] IMPLICIT BOOLEAN DEFAULT FALSE,
        numberOfElements [1] IMPLICIT Unsigned32,
        elementType [2] TypeSpecification
    },
    structure [2] IMPLICIT SEQUENCE {
        packed      [0] IMPLICIT BOOLEAN DEFAULT FALSE,
        components  [1] IMPLICIT SEQUENCE OF SEQUENCE {
            componentName [0] IMPLICIT Identifier OPTIONAL,
            componentType [1] TypeSpecification
        }
    },

    -- Simple Size Class
    --boolean [3] IMPLICIT NULL,
    bool [3] IMPLICIT NULL,
    bit-string [4] IMPLICIT Integer32, -- BIT-STRING
    integer [5] IMPLICIT Unsigned8, -- INTEGER
    unsigned [6] IMPLICIT Unsigned8, -- UNSIGNED
    floating-point [7] IMPLICIT SEQUENCE {
        format-width Unsigned8, -- number of bits of
        -- floating point value
        -- including sign, exponent,
        -- and fraction
        exponent-width Unsigned8 -- size of exponent in bits
        },

    -- [8] is reserved
    octet-string [9] IMPLICIT Integer32, -- OCTET-STRING
    visible-string [10] IMPLICIT Integer32, -- VISIBLE-STRING
 --   generalized-time [11] IMPLICIT NULL, ---- GENERALIZED-TIME
    binary-time [12] IMPLICIT BOOLEAN, -- BINARY-TIME
 --   bcd [13] IMPLICIT Unsigned8, ---- BCD
 --   objId [15] IMPLICIT NULL,
    --...,
    mMSString         [16] IMPLICIT Integer32, -- MMS String
    utc-time          [17] IMPLICIT NULL -- from  IEC61850 8.1 G.2
 }

UtcTime ::= OCTET STRING (SIZE (8))


ParameterSupportOptions ::= BIT STRING
--{
--        str1 (0), str2 (1), vnam (2), valt (3), vadr (4), vsca (5), tpy  (6), vlis (7), real (8), cei  (10)
--}

ServiceSupportOptions ::= BIT STRING
--        {
--        status                                  (0),
--        getNameList                             (1),
--        identify                                (2),
--        rename                                  (3),
--        read                                    (4),
--        write                                   (5),
--        getVariableAccessAttributes             (6),
--        defineNamedVariable                     (7),
--        defineScatteredAccess                   (8),
--        getScatteredAccessAttributes            (9),
--        deleteVariableAccess                    (10),
--        defineNamedVariableList                 (11),
--        getNamedVariableListAttributes          (12),
--        deleteNamedVariableList                 (13),
--        defineNamedType                         (14),
--        getNamedTypeAttributes                  (15),
--        deleteNamedType                         (16),
--        input                                   (17),
--        output                                  (18),
--        takeControl                             (19),
--        relinquishControl                       (20),
--        defineSemaphore                         (21),
--        deleteSemaphore                         (22),
--        reportSemaphoreStatus                   (23),
--        reportPoolSemaphoreStatus               (24),
--        reportSemaphoreEntryStatus              (25),
--        initiateDownloadSequence                (26),
--        downloadSegment                         (27),
--        terminateDownloadSequence               (28),
--        initiateUploadSequence                  (29),
--        uploadSegment                           (30),
--        terminateUploadSequence                 (31),
--        requestDomainDownload                   (32),
--        requestDomainUpload                     (33),
--        loadDomainContent                       (34),
--        storeDomainContent                      (35),
--        deleteDomain                            (36),
--        getDomainAttributes                     (37),
--        createProgramInvocation                 (38),
--        deleteProgramInvocation                 (39),
--        start                                   (40),
--        stop                                    (41),
--        resume                                  (42),
--        reset                                   (43),
--        kill                                    (44),
--        getProgramInvocationAttributes          (45),
--        obtainFile                              (46),
--        defineEventCondition                    (47),
--        deleteEventCondition                    (48),
--        getEventConditionAttributes             (49),
--        reportEventConditionStatus              (50),
--        alterEventConditionMonitoring           (51),
--        triggerEvent                            (52),
--        defineEventAction                       (53),
--        deleteEventAction                       (54),
--        getEventActionAttributes                (55),
--        reportEventActionStatus                 (56),
--        defineEventEnrollment                   (57),
--        deleteEventEnrollment                   (58),
--        alterEventEnrollment                    (59),
--        reportEventEnrollmentStatus             (60),
--        getEventEnrollmentAttributes            (61),
--        acknowledgeEventNotification            (62),
--        getAlarmSummary                         (63),
--        getAlarmEnrollmentSummary               (64),
--        readJournal                             (65),
--        writeJournal                            (66),
--        initializeJournal                       (67),
--        reportJournalStatus                     (68),
--        createJournal                           (69),
--        deleteJournal                           (70),
--        getCapabilityList                       (71),
--        fileOpen                                (72),
--        fileRead                                (73),
--        fileClose                               (74),
--        fileRename                              (75),
--        fileDelete                              (76),
--        fileDirectory                           (77),
--        unsolicitedStatus                       (78),
--        informationReport                       (79),
--        eventNotification                       (80),
--        attachToEventCondition                  (81),
--        attachToSemaphore                       (82),
--        conclude                                (83),
--        cancel                                  (84)
--        }



END
