diff --git a/changelog.md b/changelog.md index 13723f03..9c767706 100644 --- a/changelog.md +++ b/changelog.md @@ -2,15 +2,38 @@ ## [0.33.0] - UNRELEASED ### Breaking Changes * Removed the `ProcessingPaused` current state status response due to pause/resume support being dropped. +* Corrected `AcLineSegment.perLengthSequenceImpedanceMRID` to `AcLineSegment.perLengthImpedanceMRID`. ### New Features -* None. +* Added New Classes + * `StaticVarCompensator`: A facility for providing variable and controllable shunt reactive power. The SVC typically consists of a stepdown transformer, + filter, thyristor-controlled reactor, and thyristor-switched capacitor arms. The SVC may operate in fixed MVar output mode or in voltage control mode. + When in voltage control mode, the output of the SVC will be proportional to the deviation of voltage at the controlled bus from the voltage setpoint. + The SVC characteristic slope defines the proportion. If the voltage at the controlled bus is equal to the voltage setpoint, the SVC MVar output is zero. + * `SVCControlMode`: Static VAr Compensator control mode. + * `EndDeviceFunction`: Function performed by an end device such as a meter, communication equipment, controllers, etc. + * `PanDemandResponseFunction`: PAN function that an end device supports, distinguished by 'kind'. + * `ControlledAppliance`: Appliance controlled with a PAN device control. + * `EndDeviceFunctionKind`: Kind of end device function. + * `AssetFunction`: Function performed by an asset. + * `BatteryControl`: Describes behaviour specific to controlling batteries. + * `PerLengthPhaseImpedance`: Impedance and admittance parameters per unit length for n-wire unbalanced lines, in matrix form. + * `PhaseImpedanceData`: Impedance and conductance matrix element values. The diagonal elements are described by the elements having the same toPhase and fromPhase value an the off diagonal elements have different toPhase and fromPhase values. ### Enhancements * State update batches that are skipped/ignored because they have already been processed in the backlog processing can now return `BatchNotProcessed`. * Added `StateEventFailure.message` to provide a descriptive message of the failure. * Added new event failure type `StateEventUnsupportedMrid`, which can be used to indicate a valid element was found, but the operation isn't supported by the server. e.g. As of writing, you can't operate switches at the EHV level. +* Added new attributes to `RegulatingControl` + * `ctPrimary`: Current rating of the CT, expressed in terms of the current (in Amperes) that flows in the Primary where the 'Primary' is the conductor being monitored. + It ensures proper operation of the regulating equipment by providing the necessary current references for control actions. An important side effect of this + current value is that it also defines the current value at which the full LDC R and X voltages are applied by the controller, where enabled. + * `minTargetDeadband`: This is the minimum allowable range for discrete control in regulating devices, used to prevent frequent control actions and promote + operational stability. This attribute sets a baseline range within which no adjustments are made, applicable across various devices like voltage regulators, + shunt compensators, or battery units. +* Added repeated attribute of `batteryControls` to `BatteryUnit`. +* Added repeated attribute of `endDeviceFunctions` to `EndDevice`. ### Fixes * None. diff --git a/proto/zepben/proto.lock b/proto/zepben/proto.lock index f5a1b602..8f8fbf03 100644 --- a/proto/zepben/proto.lock +++ b/proto/zepben/proto.lock @@ -264,6 +264,188 @@ ] } }, + { + "protopath": "protobuf:/:cim:/:extensions:/:iec61968:/:metering:/:PanDemandResponseFunction.proto", + "def": { + "messages": [ + { + "name": "PanDemandResponseFunction", + "fields": [ + { + "id": 1, + "name": "edf", + "type": "cim.iec61968.metering.EndDeviceFunction" + }, + { + "id": 2, + "name": "kind", + "type": "cim.iec61968.metering.EndDeviceFunctionKind" + }, + { + "id": 3, + "name": "appliance", + "type": "int32" + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61968/metering/EndDeviceFunction.proto" + }, + { + "path": "zepben/protobuf/cim/iec61968/metering/EndDeviceFunctionKind.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.extensions.iec61968.metering" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.extensions.iec61968.metering" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.Extensions.IEC61968.Metering" + } + ] + } + }, + { + "protopath": "protobuf:/:cim:/:extensions:/:iec61970:/:base:/:wires:/:BatteryControl.proto", + "def": { + "messages": [ + { + "name": "BatteryControl", + "fields": [ + { + "id": 1, + "name": "rc", + "type": "cim.iec61970.base.wires.RegulatingControl" + }, + { + "id": 2, + "name": "chargingRate", + "type": "double" + }, + { + "id": 3, + "name": "dischargingRate", + "type": "double" + }, + { + "id": 4, + "name": "reservePercent", + "type": "double" + }, + { + "id": 5, + "name": "controlMode", + "type": "BatteryControlMode" + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61970/base/wires/RegulatingControl.proto" + }, + { + "path": "zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControlMode.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.extensions.iec61970.base.wires" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.extensions.iec61970.base.wires" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.Extensions.IEC61970.Base.Wires" + } + ] + } + }, + { + "protopath": "protobuf:/:cim:/:extensions:/:iec61970:/:base:/:wires:/:BatteryControlMode.proto", + "def": { + "enums": [ + { + "name": "BatteryControlMode", + "enum_fields": [ + { + "name": "UNKNOWN" + }, + { + "name": "peakShaveDischarge", + "integer": 1 + }, + { + "name": "currentPeakShaveDischarge", + "integer": 2 + }, + { + "name": "following", + "integer": 3 + }, + { + "name": "support", + "integer": 4 + }, + { + "name": "schedule", + "integer": 5 + }, + { + "name": "peakShaveCharge", + "integer": 6 + }, + { + "name": "currentPeakShaveCharge", + "integer": 7 + }, + { + "name": "time", + "integer": 8 + }, + { + "name": "profile", + "integer": 9 + } + ] + } + ], + "package": { + "name": "zepben.protobuf.cim.extensions.iec61970.base.wires" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.extensions.iec61970.base.wires" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.Extensions.IEC61970.Base.Wires" + } + ] + } + }, { "protopath": "protobuf:/:cim:/:iec61968:/:assetinfo:/:CableInfo.proto", "def": { @@ -1145,6 +1327,45 @@ ] } }, + { + "protopath": "protobuf:/:cim:/:iec61968:/:assets:/:AssetFunction.proto", + "def": { + "messages": [ + { + "name": "AssetFunction", + "fields": [ + { + "id": 1, + "name": "io", + "type": "iec61970.base.core.IdentifiedObject" + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61970/base/core/IdentifiedObject.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61968.assets" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61968.assets" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61968.Assets" + } + ] + } + }, { "protopath": "protobuf:/:cim:/:iec61968:/:assets:/:AssetInfo.proto", "def": { @@ -2633,29 +2854,153 @@ "type": "assets.AssetContainer" }, { - "id": 2, - "name": "usagePointMRIDs", - "type": "string", - "is_repeated": true + "id": 2, + "name": "usagePointMRIDs", + "type": "string", + "is_repeated": true + }, + { + "id": 3, + "name": "customerMRID", + "type": "string" + }, + { + "id": 4, + "name": "serviceLocationMRID", + "type": "string" + }, + { + "id": 5, + "name": "endDeviceFunctionMRIDs", + "type": "string", + "is_repeated": true + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61968/assets/AssetContainer.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61968.metering" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61968.metering" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61968.Metering" + } + ] + } + }, + { + "protopath": "protobuf:/:cim:/:iec61968:/:metering:/:EndDeviceFunction.proto", + "def": { + "messages": [ + { + "name": "EndDeviceFunction", + "fields": [ + { + "id": 1, + "name": "af", + "type": "iec61968.assets.AssetFunction" + }, + { + "id": 2, + "name": "enabledNull", + "type": "google.protobuf.NullValue", + "oneof_parent": "enabled" + }, + { + "id": 3, + "name": "enabledSet", + "type": "bool", + "oneof_parent": "enabled" + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61968/assets/AssetFunction.proto" + }, + { + "path": "google/protobuf/struct.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61968.metering" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61968.metering" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61968.Metering" + } + ] + } + }, + { + "protopath": "protobuf:/:cim:/:iec61968:/:metering:/:EndDeviceFunctionKind.proto", + "def": { + "enums": [ + { + "name": "EndDeviceFunctionKind", + "enum_fields": [ + { + "name": "UNKNOWN" + }, + { + "name": "autonomousDst", + "integer": 1 + }, + { + "name": "demandResponse", + "integer": 2 + }, + { + "name": "electricMetering", + "integer": 3 + }, + { + "name": "metrology", + "integer": 4 + }, + { + "name": "onRequestRead", + "integer": 5 + }, + { + "name": "outageHistory", + "integer": 6 }, { - "id": 3, - "name": "customerMRID", - "type": "string" + "name": "relaysProgramming", + "integer": 7 }, { - "id": 4, - "name": "serviceLocationMRID", - "type": "string" + "name": "reverseFlow", + "integer": 8 } ] } ], - "imports": [ - { - "path": "zepben/protobuf/cim/iec61968/assets/AssetContainer.proto" - } - ], "package": { "name": "zepben.protobuf.cim.iec61968.metering" }, @@ -6356,7 +6701,7 @@ }, { "id": 3, - "name": "perLengthSequenceImpedanceMRID", + "name": "perLengthImpedanceMRID", "type": "string" } ] @@ -7520,6 +7865,54 @@ ] } }, + { + "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:PerLengthPhaseImpedance.proto", + "def": { + "messages": [ + { + "name": "PerLengthPhaseImpedance", + "fields": [ + { + "id": 1, + "name": "pli", + "type": "PerLengthImpedance" + }, + { + "id": 2, + "name": "phaseImpedanceData", + "type": "PhaseImpedanceData", + "is_repeated": true + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61970/base/wires/PerLengthImpedance.proto" + }, + { + "path": "zepben/protobuf/cim/iec61970/base/wires/PhaseImpedanceData.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61970.base.wires" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61970.base.wires" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61970.Base.Wires" + } + ] + } + }, { "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:PerLengthSequenceImpedance.proto", "def": { @@ -7643,6 +8036,70 @@ ] } }, + { + "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:PhaseImpedanceData.proto", + "def": { + "messages": [ + { + "name": "PhaseImpedanceData", + "fields": [ + { + "id": 1, + "name": "b", + "type": "double" + }, + { + "id": 2, + "name": "fromPhase", + "type": "SinglePhaseKind" + }, + { + "id": 3, + "name": "toPhase", + "type": "SinglePhaseKind" + }, + { + "id": 4, + "name": "g", + "type": "double" + }, + { + "id": 5, + "name": "r", + "type": "double" + }, + { + "id": 6, + "name": "x", + "type": "double" + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61970/base/wires/SinglePhaseKind.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61970.base.wires" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61970.base.wires" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61970.Base.Wires" + } + ] + } + }, { "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:PhaseShuntConnectionKind.proto", "def": { @@ -8489,6 +8946,16 @@ "id": 14, "name": "ratedCurrent", "type": "double" + }, + { + "id": 15, + "name": "ctPrimary", + "type": "double" + }, + { + "id": 16, + "name": "minTargetDeadband", + "type": "double" } ] } @@ -8654,6 +9121,51 @@ ] } }, + { + "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:SVCControlMode.proto", + "def": { + "enums": [ + { + "name": "SVCControlMode.Enum", + "enum_fields": [ + { + "name": "UNKNOWN" + }, + { + "name": "reactivePower", + "integer": 1 + }, + { + "name": "voltage", + "integer": 2 + } + ] + } + ], + "messages": [ + { + "name": "SVCControlMode" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61970.base.wires" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61970.base.wires" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61970.Base.Wires" + } + ] + } + }, { "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:SeriesCompensator.proto", "def": { @@ -8853,6 +9365,73 @@ ] } }, + { + "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:StaticVarCompensator.proto", + "def": { + "messages": [ + { + "name": "StaticVarCompensator", + "fields": [ + { + "id": 1, + "name": "rce", + "type": "RegulatingCondEq" + }, + { + "id": 2, + "name": "capacitiveRating", + "type": "double" + }, + { + "id": 3, + "name": "inductiveRating", + "type": "double" + }, + { + "id": 4, + "name": "q", + "type": "double" + }, + { + "id": 5, + "name": "svcControlMode", + "type": "SVCControlMode.Enum" + }, + { + "id": 6, + "name": "voltageSetPoint", + "type": "int32" + } + ] + } + ], + "imports": [ + { + "path": "zepben/protobuf/cim/iec61970/base/wires/RegulatingCondEq.proto" + }, + { + "path": "zepben/protobuf/cim/iec61970/base/wires/SVCControlMode.proto" + } + ], + "package": { + "name": "zepben.protobuf.cim.iec61970.base.wires" + }, + "options": [ + { + "name": "java_multiple_files", + "value": "true" + }, + { + "name": "java_package", + "value": "com.zepben.protobuf.cim.iec61970.base.wires" + }, + { + "name": "csharp_namespace", + "value": "Zepben.Protobuf.CIM.IEC61970.Base.Wires" + } + ] + } + }, { "protopath": "protobuf:/:cim:/:iec61970:/:base:/:wires:/:Switch.proto", "def": { @@ -10069,6 +10648,12 @@ "id": 4, "name": "storedE", "type": "int64" + }, + { + "id": 5, + "name": "batteryControlMRIDs", + "type": "string", + "is_repeated": true } ] } @@ -13526,6 +14111,30 @@ "type": "zepben.protobuf.cim.iec61970.base.wires.PetersenCoil", "oneof_parent": "identifiedObject" }, + { + "id": 82, + "name": "staticVarCompensator", + "type": "zepben.protobuf.cim.iec61970.base.wires.StaticVarCompensator", + "oneof_parent": "identifiedObject" + }, + { + "id": 83, + "name": "panDemandResponseFunction", + "type": "zepben.protobuf.cim.extensions.iec61968.metering.PanDemandResponseFunction", + "oneof_parent": "identifiedObject" + }, + { + "id": 84, + "name": "batteryControl", + "type": "zepben.protobuf.cim.extensions.iec61970.base.wires.BatteryControl", + "oneof_parent": "identifiedObject" + }, + { + "id": 85, + "name": "perLengthPhaseImpedance", + "type": "zepben.protobuf.cim.iec61970.base.wires.PerLengthPhaseImpedance", + "oneof_parent": "identifiedObject" + }, { "id": 999, "name": "other", @@ -13668,6 +14277,9 @@ { "path": "zepben/protobuf/cim/iec61970/base/wires/LinearShuntCompensator.proto" }, + { + "path": "zepben/protobuf/cim/iec61970/base/wires/PerLengthPhaseImpedance.proto" + }, { "path": "zepben/protobuf/cim/iec61970/base/wires/PerLengthSequenceImpedance.proto" }, @@ -13778,6 +14390,15 @@ }, { "path": "zepben/protobuf/cim/iec61970/base/wires/PetersenCoil.proto" + }, + { + "path": "zepben/protobuf/cim/iec61970/base/wires/StaticVarCompensator.proto" + }, + { + "path": "zepben/protobuf/cim/extensions/iec61968/metering/PanDemandResponseFunction.proto" + }, + { + "path": "zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControl.proto" } ], "package": { diff --git a/proto/zepben/protobuf/cim/extensions/iec61968/metering/PanDemandResponseFunction.proto b/proto/zepben/protobuf/cim/extensions/iec61968/metering/PanDemandResponseFunction.proto new file mode 100644 index 00000000..963679c6 --- /dev/null +++ b/proto/zepben/protobuf/cim/extensions/iec61968/metering/PanDemandResponseFunction.proto @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.extensions.iec61968.metering"; +option csharp_namespace = "Zepben.Protobuf.CIM.Extensions.IEC61968.Metering"; +package zepben.protobuf.cim.extensions.iec61968.metering; + +import "zepben/protobuf/cim/iec61968/metering/EndDeviceFunction.proto"; +import "zepben/protobuf/cim/iec61968/metering/EndDeviceFunctionKind.proto"; + +/** + * [ZBEX] PAN function that an end device supports, distinguished by 'kind'. + */ +message PanDemandResponseFunction { + + /** + * The EndDeviceFunction fields for this PanDemandResponseFunction. + */ + cim.iec61968.metering.EndDeviceFunction edf = 1; + + /** + * [ZBEX] Kind of this function. + */ + cim.iec61968.metering.EndDeviceFunctionKind kind = 2; + + /** + * [ZBEX] Appliance being controlled. + * Storing a 12 bit mask that represents a specific set of configuration for ControlledAppliance + */ + int32 appliance = 3; + +} diff --git a/proto/zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControl.proto b/proto/zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControl.proto new file mode 100644 index 00000000..737731e0 --- /dev/null +++ b/proto/zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControl.proto @@ -0,0 +1,51 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.extensions.iec61970.base.wires"; +option csharp_namespace = "Zepben.Protobuf.CIM.Extensions.IEC61970.Base.Wires"; +package zepben.protobuf.cim.extensions.iec61970.base.wires; + +import "zepben/protobuf/cim/iec61970/base/wires/RegulatingControl.proto"; +import "zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControlMode.proto"; + + +/** + * [ZBEX] Describes behaviour specific to controlling batteries. + */ +message BatteryControl { + + /** + * The RegulatingControl fields for this BatteryControl. + */ + cim.iec61970.base.wires.RegulatingControl rc = 1; + + /** + * [ZBEX] Charging rate (input power) in percentage of maxP. (Unit: PerCent) + */ + double chargingRate = 2; + + /** + * [ZBEX] Discharge rate (output power) in percentage of maxP. (Unit: PerCent) + */ + double dischargingRate = 3; + + /** + * [ZBEX] Percentage of the rated storage capacity that should be reserved during normal operations. This reserve acts as a safeguard, preventing the energy level + * from dropping below this threshold under standard conditions. The field must be set to a non-negative value between 0 and 1. (Unit: PerCent) + */ + double reservePercent = 4; + + /** + * [ZBEX] Mode of operation for the dispatch (charging/discharging) function of BatteryControl. + */ + BatteryControlMode controlMode = 5; + +} diff --git a/proto/zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControlMode.proto b/proto/zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControlMode.proto new file mode 100644 index 00000000..81e70185 --- /dev/null +++ b/proto/zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControlMode.proto @@ -0,0 +1,79 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.extensions.iec61970.base.wires"; +option csharp_namespace = "Zepben.Protobuf.CIM.Extensions.IEC61970.Base.Wires"; +package zepben.protobuf.cim.extensions.iec61970.base.wires; + +/** + * [ZBEX] Kind of battery control. + */ +enum BatteryControlMode { + + /** + * [ZBEX] Unknown control mode. + */ + UNKNOWN = 0; + + /** + * [ZBEX] This mode directs the BatteryUnit to discharge as needed to maintain the power level of the monitored element within a defined range + * (specified by targetDeadband) or to keep it at or below the value specified by maxAllowedTargetValue. This mode helps prevent power spikes by discharging + * the BatteryUnit to manage peak demand effectively. + */ + peakShaveDischarge = 1; + + /** + * [ZBEX] This mode directs the BatteryUnit to discharge as needed to maintain the current (in amps) at a monitored element below a specified target. Similar + * to peakShaveDischarge, this mode aims to reduce demand peaks, focusing specifically on current levels to manage capacity and enhance system stability where + * current control is essential. + */ + currentPeakShaveDischarge = 2; + + /** + * [ZBEX] The control is triggered by time and resets the targetValue property to the present monitored element power. + */ + following = 3; + + /** + * [ZBEX] This is essentially the opposite of peakShave modes. The fleet is dispatched to keep the power in the monitored terminal at or above targetValue. + */ + support = 4; + + /** + * [ZBEX] In Schedule mode, a trapezoidal-shaped discharge schedule is specified through Tup (up ramp duration), TFlat (at duration), + * and Tdn (down ramp duration) properties. + */ + schedule = 5; + + /** + * [ZBEX] This mode directs the BatteryUnit to initiate charging when the power level at a monitored element falls below a specified threshold (minAllowedTargetValue). + * This mode supports demand leveling by charging the BatteryUnit during low-demand periods, optimizing overall power management. + */ + peakShaveCharge = 6; + + /** + * [ZBEX] This mode initiates charging when the current (in Amps) at a monitored element falls below a specified threshold (minAllowedTargetValue). + * Similar to peakShaveCharge, this mode aims to manage demand effectively, but it operates based on current levels rather than power, providing finer + * control in systems where current management is prioritized. + */ + currentPeakShaveCharge = 7; + + /** + * [ZBEX] In Time mode all storage elements are set to discharge when in the course of simulation the time of day passes the specified hour of day by the + * TimeDisChargeTrigger property (hour is a decimal value, e.g., 10.5 = 1030) + */ + time = 8; + + /** + * [ZBEX] In this mode both discharging and charging precisely follow a per-unit curve. + */ + profile = 9; + +} diff --git a/proto/zepben/protobuf/cim/iec61968/assets/AssetFunction.proto b/proto/zepben/protobuf/cim/iec61968/assets/AssetFunction.proto new file mode 100644 index 00000000..828392fd --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61968/assets/AssetFunction.proto @@ -0,0 +1,28 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61968.assets"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61968.Assets"; +package zepben.protobuf.cim.iec61968.assets; + +import "zepben/protobuf/cim/iec61970/base/core/IdentifiedObject.proto"; + +/** + * Function performed by an asset. + */ +message AssetFunction { + + /** + * The IdentifiedObject fields for this AssetFunction. + */ + iec61970.base.core.IdentifiedObject io = 1; + +} diff --git a/proto/zepben/protobuf/cim/iec61968/metering/EndDevice.proto b/proto/zepben/protobuf/cim/iec61968/metering/EndDevice.proto index 73431464..312c4a10 100755 --- a/proto/zepben/protobuf/cim/iec61968/metering/EndDevice.proto +++ b/proto/zepben/protobuf/cim/iec61968/metering/EndDevice.proto @@ -49,4 +49,9 @@ message EndDevice { */ string serviceLocationMRID = 4; + /** + * All end device functions this end device performs. + */ + repeated string endDeviceFunctionMRIDs = 5; + } diff --git a/proto/zepben/protobuf/cim/iec61968/metering/EndDeviceFunction.proto b/proto/zepben/protobuf/cim/iec61968/metering/EndDeviceFunction.proto new file mode 100644 index 00000000..992ee279 --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61968/metering/EndDeviceFunction.proto @@ -0,0 +1,37 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61968.metering"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61968.Metering"; +package zepben.protobuf.cim.iec61968.metering; + +import "zepben/protobuf/cim/iec61968/assets/AssetFunction.proto"; +import "google/protobuf/struct.proto"; + +/** + * Function performed by an end device such as a meter, communication equipment, controllers, etc. + */ +message EndDeviceFunction { + + /** + * The AssetFunction fields for this EndDeviceFunction. + */ + iec61968.assets.AssetFunction af = 1; + + /** + * True if the function is enabled. + */ + oneof enabled { + google.protobuf.NullValue enabledNull = 2; + bool enabledSet = 3; + } + +} diff --git a/proto/zepben/protobuf/cim/iec61968/metering/EndDeviceFunctionKind.proto b/proto/zepben/protobuf/cim/iec61968/metering/EndDeviceFunctionKind.proto new file mode 100644 index 00000000..08d07087 --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61968/metering/EndDeviceFunctionKind.proto @@ -0,0 +1,65 @@ +/* + * Copyright 2020 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61968.metering"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61968.Metering"; +package zepben.protobuf.cim.iec61968.metering; + +/** + * Kind of end device function. + */ +enum EndDeviceFunctionKind { + + /** + * Unknown function kind. + */ + UNKNOWN = 0; + + /** + * Autonomous application of daylight saving time (DST). + */ + autonomousDst = 1; + + /** + * Demand response functions. + */ + demandResponse = 2; + + /** + * Electricity metering. + */ + electricMetering = 3; + + /** + * Presentation of metered values to a user or another system (always a function of a meter, but might not be supported by a load control unit). + */ + metrology = 4; + + /** + * On-request reads. + */ + onRequestRead = 5; + + /** + * Reporting historical power interruption data. + */ + outageHistory = 6; + + /** + * Support for one or more relays that may be programmable in the meter (and tied to TOU, time pulse, load control or other functions). + */ + relaysProgramming = 7; + + /** + * Detection and monitoring of reverse flow. + */ + reverseFlow = 8; + +} diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/AcLineSegment.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/AcLineSegment.proto index 8dc2a0b1..0d6948ce 100644 --- a/proto/zepben/protobuf/cim/iec61970/base/wires/AcLineSegment.proto +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/AcLineSegment.proto @@ -35,6 +35,6 @@ message AcLineSegment { /** * mRID reference to per-length impedance of this line segment. */ - string perLengthSequenceImpedanceMRID = 3; + string perLengthImpedanceMRID = 3; } diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/PerLengthPhaseImpedance.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/PerLengthPhaseImpedance.proto new file mode 100644 index 00000000..9499f094 --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/PerLengthPhaseImpedance.proto @@ -0,0 +1,34 @@ +/* + * Copyright 2020 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61970.base.wires"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61970.Base.Wires"; +package zepben.protobuf.cim.iec61970.base.wires; + +import "zepben/protobuf/cim/iec61970/base/wires/PerLengthImpedance.proto"; +import "zepben/protobuf/cim/iec61970/base/wires/PhaseImpedanceData.proto"; + +/** + * Impedance and admittance parameters per unit length for n-wire unbalanced lines, in matrix form. + */ +message PerLengthPhaseImpedance { + + /** + * PerLengthImpedance fields for this PerLengthPhaseImpedance. + */ + PerLengthImpedance pli = 1; + + /** + * All data that belong to this conductor phase impedance. + */ + repeated PhaseImpedanceData phaseImpedanceData = 2; + +} diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/PhaseImpedanceData.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/PhaseImpedanceData.proto new file mode 100644 index 00000000..a4119ad1 --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/PhaseImpedanceData.proto @@ -0,0 +1,55 @@ +/* + * Copyright 2022 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61970.base.wires"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61970.Base.Wires"; +package zepben.protobuf.cim.iec61970.base.wires; + +import "zepben/protobuf/cim/iec61970/base/wires/SinglePhaseKind.proto"; + +/** + * Impedance and conductance matrix element values. The diagonal elements are described by the elements having the same toPhase and fromPhase value and + * the off diagonal elements have different toPhase and fromPhase values. + */ +message PhaseImpedanceData { + + /** + * Susceptance matrix element value, per length of unit. + */ + double b = 1; + + /** + * Refer to the class description. + */ + SinglePhaseKind fromPhase = 2; + + /** + * Refer to the class description. + */ + SinglePhaseKind toPhase = 3; + + /** + * Conductance matrix element value, per length of unit. + */ + double g = 4; + + + /** + * Resistance matrix element value, per length of unit. + */ + double r = 5; + + /** + * Reactance matrix element value, per length of unit. + */ + double x = 6; + +} diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/RegulatingControl.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/RegulatingControl.proto index 70415b18..c529dd85 100644 --- a/proto/zepben/protobuf/cim/iec61970/base/wires/RegulatingControl.proto +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/RegulatingControl.proto @@ -108,4 +108,17 @@ message RegulatingControl { */ double ratedCurrent = 14; + /** + * [ZBEX] Current rating of the CT, expressed in terms of the current (in Amperes) that flows in the Primary where the 'Primary' is the conductor being monitored. + * It ensures proper operation of the regulating equipment by providing the necessary current references for control actions. An important side effect of + * this current value is that it also defines the current value at which the full LDC R and X voltages are applied by the controller, where enabled. + */ + double ctPrimary = 15; + + /** + * [ZBEX] This is the minimum allowable range for discrete control in regulating devices, used to prevent frequent control actions and promote operational stability. + * This attribute sets a baseline range within which no adjustments are made, applicable across various devices like voltage regulators, shunt compensators, or battery units. + */ + double minTargetDeadband = 16; + } diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/SVCControlMode.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/SVCControlMode.proto new file mode 100644 index 00000000..3f008937 --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/SVCControlMode.proto @@ -0,0 +1,41 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61970.base.wires"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61970.Base.Wires"; +package zepben.protobuf.cim.iec61970.base.wires; + +/** + * Static VAr Compensator control mode. + */ +message SVCControlMode { + + /** + * NOTE: This enum is wrapped in a message due to a c98 naming conflict with RegulatingControlModeKind + */ + enum Enum { + + /** + * [ZBEX] Unknown control. + */ + UNKNOWN = 0; + + /** + * Reactive power control. + */ + reactivePower = 1; + + /** + * Voltage control. + */ + voltage = 2; + } + +} diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/StaticVarCompensator.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/StaticVarCompensator.proto new file mode 100644 index 00000000..37576b03 --- /dev/null +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/StaticVarCompensator.proto @@ -0,0 +1,59 @@ +/* + * Copyright 2024 Zeppelin Bend Pty Ltd + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ + + +syntax = "proto3"; +option java_multiple_files = true; +option java_package = "com.zepben.protobuf.cim.iec61970.base.wires"; +option csharp_namespace = "Zepben.Protobuf.CIM.IEC61970.Base.Wires"; +package zepben.protobuf.cim.iec61970.base.wires; + +import "zepben/protobuf/cim/iec61970/base/wires/RegulatingCondEq.proto"; +import "zepben/protobuf/cim/iec61970/base/wires/SVCControlMode.proto"; + +/** + * A facility for providing variable and controllable shunt reactive power. + * The SVC typically consists of a step-down transformer, filter, thyristor-controlled reactor, + * and thyristor-switched capacitor arms. The SVC may operate in fixed MVar output mode or in voltage control mode. + * When in voltage control mode, the output of the SVC will be proportional to the deviation of voltage at the + * controlled bus from the voltage set-point. The SVC characteristic slope defines the proportion. + * If the voltage at the controlled bus is equal to the voltage set-point, the SVC MVar output is zero. + */ +message StaticVarCompensator { + + /** + * The RegulatingCondEq fields for this StaticVarCompensator. + */ + RegulatingCondEq rce = 1; + + /** + * Capacitive reactance in Ohms at maximum capacitive reactive power. Shall always be positive. + */ + double capacitiveRating = 2; + + /** + * Inductive reactance in Ohms at maximum inductive reactive power. Shall always be negative. + */ + double inductiveRating = 3; + + /** + * Reactive power injection in VAr. Load sign convention is used, i.e. positive sign means flow out from a node. Starting value for a steady state solution. + */ + double q = 4; + + /** + * SVC control mode. + */ + SVCControlMode.Enum svcControlMode = 5; + + /** + * The reactive power output of the SVC is proportional to the difference between the voltage at the regulated bus and the voltage setpoint. + * When the regulated bus voltage is equal to the voltage set-point, the reactive power output is zero. Must be in volts. + */ + int32 voltageSetPoint = 6; +} diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/TapChanger.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/TapChanger.proto index ac4408c9..5cfa887a 100755 --- a/proto/zepben/protobuf/cim/iec61970/base/wires/TapChanger.proto +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/TapChanger.proto @@ -27,11 +27,13 @@ message TapChanger { /** * Highest possible tap step position, advance from neutral. * The attribute shall be greater than lowStep. + * This tap position results in the maximum voltage boost on secondary winding(s). */ int32 highStep = 2; /** - * Lowest possible tap step position, retard from neutral + * Lowest possible tap step position, retard from neutral. + * This tap position results in the maximum voltage buck on secondary winding(s). */ int32 lowStep = 3; diff --git a/proto/zepben/protobuf/cim/iec61970/base/wires/generation/production/BatteryUnit.proto b/proto/zepben/protobuf/cim/iec61970/base/wires/generation/production/BatteryUnit.proto index 82787c81..8e87cf58 100644 --- a/proto/zepben/protobuf/cim/iec61970/base/wires/generation/production/BatteryUnit.proto +++ b/proto/zepben/protobuf/cim/iec61970/base/wires/generation/production/BatteryUnit.proto @@ -42,4 +42,9 @@ message BatteryUnit { */ int64 storedE = 4; + /** + * [ZBEX] All controls present on this battery. + */ + repeated string batteryControlMRIDs = 5; + } diff --git a/proto/zepben/protobuf/nc/nc-data.proto b/proto/zepben/protobuf/nc/nc-data.proto index ffe55bd9..08abf50f 100644 --- a/proto/zepben/protobuf/nc/nc-data.proto +++ b/proto/zepben/protobuf/nc/nc-data.proto @@ -56,6 +56,7 @@ import "zepben/protobuf/cim/iec61970/base/wires/Fuse.proto"; import "zepben/protobuf/cim/iec61970/base/wires/Jumper.proto"; import "zepben/protobuf/cim/iec61970/base/wires/Junction.proto"; import "zepben/protobuf/cim/iec61970/base/wires/LinearShuntCompensator.proto"; +import "zepben/protobuf/cim/iec61970/base/wires/PerLengthPhaseImpedance.proto"; import "zepben/protobuf/cim/iec61970/base/wires/PerLengthSequenceImpedance.proto"; import "zepben/protobuf/cim/iec61970/base/wires/PowerTransformer.proto"; import "zepben/protobuf/cim/iec61970/base/wires/PowerTransformerEnd.proto"; @@ -93,6 +94,9 @@ import "zepben/protobuf/cim/iec61970/base/wires/SynchronousMachine.proto"; import "zepben/protobuf/cim/iec61970/base/wires/ReactiveCapabilityCurve.proto"; import "zepben/protobuf/cim/iec61970/base/wires/GroundingImpedance.proto"; import "zepben/protobuf/cim/iec61970/base/wires/PetersenCoil.proto"; +import "zepben/protobuf/cim/iec61970/base/wires/StaticVarCompensator.proto"; +import "zepben/protobuf/cim/extensions/iec61968/metering/PanDemandResponseFunction.proto"; +import "zepben/protobuf/cim/extensions/iec61970/base/wires/BatteryControl.proto"; @@ -179,6 +183,10 @@ message NetworkIdentifiedObject { zepben.protobuf.cim.iec61970.base.wires.ReactiveCapabilityCurve reactiveCapabilityCurve = 79; zepben.protobuf.cim.iec61970.base.wires.GroundingImpedance groundingImpedance = 80; zepben.protobuf.cim.iec61970.base.wires.PetersenCoil petersenCoil = 81; + zepben.protobuf.cim.iec61970.base.wires.StaticVarCompensator staticVarCompensator = 82; + zepben.protobuf.cim.extensions.iec61968.metering.PanDemandResponseFunction panDemandResponseFunction = 83; + zepben.protobuf.cim.extensions.iec61970.base.wires.BatteryControl batteryControl = 84; + zepben.protobuf.cim.iec61970.base.wires.PerLengthPhaseImpedance perLengthPhaseImpedance = 85; google.protobuf.Any other = 999; diff --git a/spec/ewb/IEC61968/Assets/AssetFunction.yaml b/spec/ewb/IEC61968/Assets/AssetFunction.yaml new file mode 100644 index 00000000..9f0afe88 --- /dev/null +++ b/spec/ewb/IEC61968/Assets/AssetFunction.yaml @@ -0,0 +1,6 @@ +name: AssetFunction +description: Function performed by an asset. +ancestors: +- IdentifiedObject +descendants: +- EndDeviceFunction diff --git a/spec/ewb/IEC61968/Metering/ControlledAppliance.yaml b/spec/ewb/IEC61968/Metering/ControlledAppliance.yaml new file mode 100644 index 00000000..38f06d29 --- /dev/null +++ b/spec/ewb/IEC61968/Metering/ControlledAppliance.yaml @@ -0,0 +1,39 @@ +name: ControlledAppliance +description: Appliance controlled with a PAN device control. +attributes: +- name: isElectricVehicle + type: Boolean + description: True if the appliance is an electric vehicle. +- name: isExteriorLighting + type: Boolean + description: True if the appliance is exterior lighting. +- name: isGenerationSystem + type: Boolean + description: True if the appliance is a generation system. +- name: isHvacCompressorOrFurnace + type: Boolean + description: True if the appliance is HVAC compressor or furnace. +- name: isInteriorLighting + type: Boolean + description: True if the appliance is interior lighting. +- name: isIrrigationPump + type: Boolean + description: True if the appliance is an irrigation pump. +- name: isManagedCommercialIndustrialLoad + type: Boolean + description: True if the appliance is managed commercial or industrial load. +- name: isPoolPumpSpaJacuzzi + type: Boolean + description: True if the appliance is a pool, pump, spa or jacuzzi. +- name: isSimpleMiscLoad + type: Boolean + description: True if the appliance is a simple miscellaneous load. +- name: isSmartAppliance + type: Boolean + description: True if the appliance is a smart appliance. +- name: isStripAndBaseboardHeater + type: Boolean + description: True if the appliance is a strip or baseboard heater. +- name: isWaterHeater + type: Boolean + description: True if the appliance is a water heater. diff --git a/spec/ewb/IEC61968/Metering/EndDevice.yaml b/spec/ewb/IEC61968/Metering/EndDevice.yaml index cf326d90..6030f746 100644 --- a/spec/ewb/IEC61968/Metering/EndDevice.yaml +++ b/spec/ewb/IEC61968/Metering/EndDevice.yaml @@ -26,3 +26,8 @@ associations: targetCardinality: All end devices that measure the service delivered to this service location. targetName: Location targetDescription: Service location whose service delivery is measured by this end device. +- source: EndDevice + target: EndDeviceFunction + targetCardinality: 0..* + targetName: EndDeviceFunctions + targetDescription: All end device functions this end device performs. diff --git a/spec/ewb/IEC61968/Metering/EndDeviceFunction.yaml b/spec/ewb/IEC61968/Metering/EndDeviceFunction.yaml new file mode 100644 index 00000000..d00ae8ee --- /dev/null +++ b/spec/ewb/IEC61968/Metering/EndDeviceFunction.yaml @@ -0,0 +1,10 @@ +name: EndDeviceFunction +description: Function performed by an end device such as a meter, communication equipment, controllers, etc. +attributes: +- name: enabled + type: Boolean + description: True if the function is enabled. +ancestors: +- AssetFunction +descendants: +- PanDemandResponseFunction diff --git a/spec/ewb/IEC61968/Metering/EndDeviceFunctionKind.yaml b/spec/ewb/IEC61968/Metering/EndDeviceFunctionKind.yaml new file mode 100644 index 00000000..0a620e7b --- /dev/null +++ b/spec/ewb/IEC61968/Metering/EndDeviceFunctionKind.yaml @@ -0,0 +1,21 @@ +name: EndDeviceFunctionKind +description: Kind of end device function. +attributes: +- name: UNKNOWN + description: Unknown function kind. +- name: reverseFlow + description: Detection and monitoring of reverse flow. +- name: demandResponse + description: Demand response functions. +- name: metrology + description: Presentation of metered values to a user or another system (always a function of a meter, but might not be supported by a load control unit). +- name: outageHistory + description: Reporting historical power interruption data. +- name: relaysProgramming + description: Support for one or more relays that may be programmable in the meter (and tied to TOU, time pulse, load control or other functions). +- name: onRequestRead + description: On-request reads. +- name: autonomousDst + description: Autonomous application of daylight saving time (DST). +- name: electricMetering + description: Electricity metering. diff --git a/spec/ewb/IEC61970/Base/Generation/Production/BatteryUnit.yaml b/spec/ewb/IEC61970/Base/Generation/Production/BatteryUnit.yaml index 508d4d2c..8be77af9 100644 --- a/spec/ewb/IEC61970/Base/Generation/Production/BatteryUnit.yaml +++ b/spec/ewb/IEC61970/Base/Generation/Production/BatteryUnit.yaml @@ -11,4 +11,10 @@ attributes: type: RealEnergy description: Amount of energy currently stored. The attribute shall be a positive value or zero and lower than BatteryUnit.ratedE. ancestors: -- PowerElectronicsUnit \ No newline at end of file +- PowerElectronicsUnit +associations: +- source: BatteryUnit + target: BatteryControl + targetCardinality: 0..* + targetName: BatteryControls + targetDescription: All controls present on this battery. diff --git a/spec/ewb/IEC61970/Base/Wires/ACLineSegment.yaml b/spec/ewb/IEC61970/Base/Wires/ACLineSegment.yaml index 878d3e0a..19196bb1 100644 --- a/spec/ewb/IEC61970/Base/Wires/ACLineSegment.yaml +++ b/spec/ewb/IEC61970/Base/Wires/ACLineSegment.yaml @@ -7,7 +7,7 @@ ancestors: - Conductor associations: - source: ACLineSegment - target: PerLengthSequenceImpedance + target: PerLengthImpedance targetCardinality: 0..1 - targetName: PerLengthSequenceImpedance - targetDescription: Per-length impedance of this line segment. \ No newline at end of file + targetName: PerLengthImpedance + targetDescription: Per-length impedance of this line segment. diff --git a/spec/ewb/IEC61970/Base/Wires/PerLengthPhaseImpedance.yaml b/spec/ewb/IEC61970/Base/Wires/PerLengthPhaseImpedance.yaml new file mode 100644 index 00000000..6181b62e --- /dev/null +++ b/spec/ewb/IEC61970/Base/Wires/PerLengthPhaseImpedance.yaml @@ -0,0 +1,18 @@ +name: PerLengthPhaseImpedance +description: Impedance and admittance parameters per unit length for n-wire unbalanced lines, in matrix form. +attributes: +- name: conductorCount + type: Integer + description: Number of phase, neutral, and other wires retained. Constrains the number of matrix elements and the phase + codes that can be used with this matrix. +ancestors: +- PerLengthImpedance +associations: +- source: PerLengthPhaseImpedance + target: PhaseImpedanceData + sourceCardinality: "1" + sourceName: PhaseImpedance + sourceDescription: Conductor phase impedance to which this data belongs. + targetCardinality: 1..* + targetName: PhaseImpedanceData + targetDescription: All data that belong to this conductor phase impedance. diff --git a/spec/ewb/IEC61970/Base/Wires/PhaseImpedanceData.yaml b/spec/ewb/IEC61970/Base/Wires/PhaseImpedanceData.yaml new file mode 100644 index 00000000..5c92b5d6 --- /dev/null +++ b/spec/ewb/IEC61970/Base/Wires/PhaseImpedanceData.yaml @@ -0,0 +1,40 @@ +name: PhaseImpedanceData +description: "Impedance and conductance matrix element values. \nThe diagonal elements are described by the elements having\ + \ the same toPhase and fromPhase value and the off diagonal elements have different toPhase and fromPhase values. The matrix\ + \ can also be stored in symmetric lower triangular format using the row and column attributes, which map to ACLineSegmentPhase.sequenceNumber." +attributes: +- name: b + type: SusceptancePerLength + description: Susceptance matrix element value, per length of unit. +- name: r + type: ResistancePerLength + description: Resistance matrix element value, per length of unit. +- name: x + type: ReactancePerLength + description: Reactance matrix element value, per length of unit. +- name: g + type: ConductancePerLength + description: Conductance matrix element value, per length of unit. +- name: fromPhase + type: SinglePhaseKind + description: Refer to the class description. +- name: toPhase + type: SinglePhaseKind + description: Refer to the class description. +- name: row + type: Integer + description: The matrix element’s row number, in the range 1 to PerLengthPhaseImpedance.conductorCount. Only the lower triangle + needs to be stored. This row number matches ACLineSegmentPhase.sequenceNumber. +- name: column + type: Integer + description: The matrix element's column number, in the range 1 to row. Only the lower triangle needs to be stored. This + column number matches ACLineSegmentPhase.sequenceNumber. +associations: +- source: PhaseImpedanceData + target: PerLengthPhaseImpedance + sourceCardinality: 1..* + sourceName: PhaseImpedanceData + sourceDescription: All data that belong to this conductor phase impedance. + targetCardinality: "1" + targetName: PhaseImpedance + targetDescription: Conductor phase impedance to which this data belongs. diff --git a/spec/ewb/IEC61970/Base/Wires/RegulatingControl.yaml b/spec/ewb/IEC61970/Base/Wires/RegulatingControl.yaml index 31e406a0..b527d648 100644 --- a/spec/ewb/IEC61970/Base/Wires/RegulatingControl.yaml +++ b/spec/ewb/IEC61970/Base/Wires/RegulatingControl.yaml @@ -49,6 +49,16 @@ attributes: type: Float description: The rated current of associated CT in amps for this RegulatingControl. Forms the base used to convert Line Drop Compensation settings from ohms to voltage. +- name: ctPrimary + type: Double + description: \[ZBEX\] Current rating of the CT, expressed in terms of the current (in Amperes) that flows in the Primary where the 'Primary' is the conductor + being monitored. It ensures proper operation of the regulating equipment by providing the necessary current references for control actions. + An important side effect of this current value is that it also defines the current value at which the full LDC R and X voltages are applied by the controller, where enabled. +- name: minTargetDeadband + type: Double + description: \[ZBEX\] This is the minimum allowable range for discrete control in regulating devices, used to prevent frequent control actions and promote + operational stability. This attribute sets a baseline range within which no adjustments are made, applicable across various devices like voltage regulators, + shunt compensators, or battery units. ancestors: - PowerSystemResource descendants: diff --git a/spec/ewb/IEC61970/Base/Wires/SVCControlMode.yaml b/spec/ewb/IEC61970/Base/Wires/SVCControlMode.yaml new file mode 100644 index 00000000..d852807b --- /dev/null +++ b/spec/ewb/IEC61970/Base/Wires/SVCControlMode.yaml @@ -0,0 +1,9 @@ +name: SVCControlMode +description: Static VAr Compensator control mode. +attributes: +- name: unknown + description: unknown control. +- name: reactivePower + description: Reactive power control. +- name: voltage + description: Voltage control. diff --git a/spec/ewb/IEC61970/Base/Wires/StaticVarCompensator.yaml b/spec/ewb/IEC61970/Base/Wires/StaticVarCompensator.yaml new file mode 100644 index 00000000..12b25adb --- /dev/null +++ b/spec/ewb/IEC61970/Base/Wires/StaticVarCompensator.yaml @@ -0,0 +1,27 @@ +name: StaticVarCompensator +description: |- + A facility for providing variable and controllable shunt reactive power. The SVC typically consists of a step-down transformer, filter, thyristor-controlled reactor, and thyristor-switched capacitor arms. + + The SVC may operate in fixed MVar output mode or in voltage control mode. When in voltage control mode, the output of the SVC will be proportional to the deviation of voltage at the controlled bus from the voltage setpoint. The SVC characteristic slope defines the proportion. If the voltage at the controlled bus is equal to the voltage setpoint, the SVC MVar output is zero. +attributes: + - name: capacitiveRating + type: Reactance + description: Capacitive reactance in Ohms at maximum capacitive reactive power. Shall always be positive. + - name: inductiveRating + type: Reactance + description: Inductive reactance in Ohms at maximum inductive reactive power. Shall always be negative. + - name: sVCControlMode + type: SVCControlMode + description: SVC control mode. + - name: voltageSetPoint + type: Voltage + description: The reactive power output of the SVC is proportional to the difference between the voltage at the regulated + bus and the voltage set-point. When the regulated bus voltage is equal to the voltage set-point, the reactive power output + is zero. Must be in volts. + - name: q + type: ReactivePower + description: |- + Reactive power injection in VAr. Load sign convention is used, i.e. positive sign means flow out from a node. + Starting value for a steady state solution. +ancestors: + - RegulatingCondEq diff --git a/spec/ewb/extensions/IEC61968/Metering/PanDemandResponseFunction.yaml b/spec/ewb/extensions/IEC61968/Metering/PanDemandResponseFunction.yaml new file mode 100644 index 00000000..f380b410 --- /dev/null +++ b/spec/ewb/extensions/IEC61968/Metering/PanDemandResponseFunction.yaml @@ -0,0 +1,11 @@ +name: PanDemandResponseFunction +description: \[ZBEX\] PAN function that an end device supports, distinguished by 'kind'. +attributes: +- name: kind + type: EndDeviceFunctionKind + description: \[ZBEX\] Kind of this function. +- name: appliance + type: ControlledAppliance + description: \[ZBEX\] Appliance being controlled. +ancestors: +- EndDeviceFunction diff --git a/spec/ewb/extensions/IEC61970/Base/Wires/BatteryControl.yaml b/spec/ewb/extensions/IEC61970/Base/Wires/BatteryControl.yaml new file mode 100644 index 00000000..79eb6d14 --- /dev/null +++ b/spec/ewb/extensions/IEC61970/Base/Wires/BatteryControl.yaml @@ -0,0 +1,18 @@ +name: BatteryControl +description: \[ZBEX\] Describes behaviour specific to controlling batteries. +attributes: + - name: chargingRate + type: PerCent + description: \[ZBEX\] Charging rate (input power) in percentage of maxP. (Unit - Percent) + - name: dischargingRate + type: PerCent + description: \[ZBEX\] Discharge rate (output power) in percentage of maxP. (Unit - Percent) + - name: reservePercent + type: PerCent + description: \[ZBEX\] Percentage of the rated storage capacity that should be reserved during normal operations. This reserve acts as a safeguard, preventing the energy level + from dropping below this threshold under standard conditions. The field must be set to a non-negative value between 0 and 1. (Unit - Percent) + - name: controlMode + type: BatteryControlMode + description: \[ZBEX\] Mode of operation for the dispatch (charging/discharging) function of BatteryControl. +ancestors: +- RegulatingControl diff --git a/spec/ewb/extensions/IEC61970/Base/Wires/BatteryControlMode.yaml b/spec/ewb/extensions/IEC61970/Base/Wires/BatteryControlMode.yaml new file mode 100644 index 00000000..a9273ecd --- /dev/null +++ b/spec/ewb/extensions/IEC61970/Base/Wires/BatteryControlMode.yaml @@ -0,0 +1,31 @@ +name: BatteryControlMode +description: \[ZBEX\] Kind of battery control. +attributes: + - name: UNKNOWN + description: \[ZBEX\] Unknown control mode. + - name: peakShaveDischarge + description: \[ZBEX\] This mode directs the BatteryUnit to discharge as needed to maintain the power level of the monitored element within a defined range + (specified by targetDeadband) or to keep it at or below the value specified by maxAllowedTargetValue. This mode helps prevent power spikes by discharging + the BatteryUnit to manage peak demand effectively. + - name: currentPeakShaveDischarge + description: \[ZBEX\] This mode directs the BatteryUnit to discharge as needed to maintain the current (in amps) at a monitored element below a specified target. Similar to + peakShaveDischarge, this mode aims to reduce demand peaks, focusing specifically on current levels to manage capacity and enhance system stability where + current control is essential. + - name: following + description: \[ZBEX\] The control is triggered by time and resets the targetValue property to the present monitored element power. + - name: support + description: \[ZBEX\] This is essentially the opposite of peakShave modes. The fleet is dispatched to keep the power in the monitored terminal at or above targetValue. + - name: schedule + description: \[ZBEX\] In Schedule mode, a trapezoidal-shaped discharge schedule is specified through Tup (up ramp duration), TFlat (at duration), and Tdn (down ramp duration) properties. + - name: peakShaveCharge + description: \[ZBEX\] This mode directs the BatteryUnit to initiate charging when the power level at a monitored element falls below a specified threshold (minAllowedTargetValue). + This mode supports demand leveling by charging the BatteryUnit during low-demand periods, optimizing overall power management. + - name: currentPeakShaveCharge + description: \[ZBEX\] This mode initiates charging when the current (in Amps) at a monitored element falls below a specified threshold (minAllowedTargetValue). + Similar to peakShaveCharge, this mode aims to manage demand effectively, but it operates based on current levels rather than power, providing finer + control in systems where current management is prioritized. + - name: time + description: \[ZBEX\] In Time mode all storage elements are set to discharge when in the course of simulation the time of day passes the specified hour of day by the + TimeDisChargeTrigger property (hour is a decimal value, e.g., 10.5 = 1030) + - name: profile + description: \[ZBEX\] In this mode both discharging and charging precisely follow a per-unit curve.