Power monitor apparatus and method with object oriented structure5650936Abstract An object oriented architecture is used within individual monitoring units. The monitoring devices include circuitry which receives an electrical signal and generates at least one digital signal representing the electrical signal. Objects within such individual monitoring units include modules which perform a function and registers which contain the inputs, outputs and setup information for the modules. Methods can be invoked on all objects to change or query the operation or configuration of the device. At least one of the modules receives the digital signal as an input and uses the signal to generate measured parameters. Additional modules take measured parameters as input and generate additional parameters therefrom. The module may be linked in an arbitrary manner to form arbitrary functional blocks. Claims We claim: Description This application is related to U.S. patent application Ser. No. 08/367,534 filed concurrently with this application and entitled "High Accuracy Power Monitor and Method".
TABLE A
__________________________________________________________________________
The Types describe the semantics for passing information to and from
modules and registers.
Type Name Type equivalence Restrictions
Description
__________________________________________________________________________
VoidType fundamental Type Has no semantic
value.
SignedType fundamental Type Maximum size =
Defines a signed
32 bits. value.
UnsignedType fundamental Type Maximum size =
Defines an
32 bits unsigned value.
CharType fundamental Type Maximum size =
Defines a
32 bits. character value.
Supports wide
characters as
well as ASCII.
BooleanType fundamental Type Size = 1 bit.
Defines a
Boolean value.
Value may be
TRUE or FALSE.
FixedPointType
fundamental Type Maximum size =
Defines a fixed
64 bits. point value.
FloatType fundamental Type Size = 32, 64, or
Defines a floating
80 bits. point value.
ComplexType fundamental Type Maximum size =
Defines a
TBA. complex value.
DeltaType fundamental Type Size = 0 bits.
The value
represents a
delta-function
pulse.
RealType define union RealType = Defines a real
SignedType.linevert split. value.
UnsignedType.linevert split.
CharType.linevert split.
BooleanType.linevert split.
FloatType.linevert split.
FixedPointType.
NumericType define union Defines a
NumericType = numeric value.
RealType.linevert split.
ComplexType.
SignedArrayType
define array Defines an array of
SignedArrayType = signed values.
{SignedType
`value.sub.i `}.
UnsignedArrayType
define array Defines an array of
UnsignedArrayType = unsigned values.
{UnsignedType `value.sub.i `}.
CharArrayType
define array CharArrayType = Defines an array of
{CharType `char.sub.i `}. characters.
BooleanArrayType
define array Defines an array of
BooleanArrayType = Boolean values.
{BooleanType `value.sub.i `}.
FixedPointArrayType
define array Defines an array of
FixedPointArrayType = fixed point values.
{FixedPointType `value.sub.i `}.
FloatArrayType
define array FloatArrayType = Defines an array of
{FloatType `value.sub.i `}. floating point values.
ComplexArrayType
define array Defines an array of
ComplexArrayType = complex values.
{ComplexType `value.sub.i `}.
NumericArrayType
define union Defines an array of
NumericArrayType = numeric values.
SignedArrayType.linevert split.
UnsignedArrayType.linevert split.
CharArrayType.linevert split.
BooleanArrayType.linevert split.
FixedPointArrayType.linevert split.
FloatPointArrayType.linevert split.
ComplexArrayType.
ArrayUnsignedArray
define structure Structure defines an
Type ArrayUnsignedArrayType = array of
{UnsignedArrayType UnsignedArrayTypes.
`us.sub.-- array.sub.i `}.
StringType define StringType =
must be null terminated.
Defines a character
CharArrayType. string (null-terminated).
StringArrayType
define structure Defines an array of
StringArrayType = strings.
{CharArrayType `string.sub.i `}.
SizeType define SizeType = An unsigned integral
UnsignedType. value which is used for
defining a size
parameter (e.g. size of
array, #records).
CounterType define CounterType = An unsigned integral
UnsignedType. value which can be
incremented (by 1 or
more), decremented (by
1 or more), and cleared
to 0.
IndexType define IndexType = An unsigned integral
UnsignedType. value which is used to
index arrays.
TimeType define TimeType = Universal Time (GMT) in
NumericType. seconds.
ReasonType define ReasonType = The reason for an
CharArrayType. exception.
ExceptionType
define structure ExceptionType =
An exception returns a
UnsignedType code and value. A
`exception.sub.-- cause. reason string is
Type opitonal.
`exception.sub.-- value` The valid codes are:
[ReasonType `reason`]. 0 = underflow
1 = overflow
2 = not.sub.-- valid
3 = not.sub.-- supported
4 = not.sub.-- available
5 = invalid.sub.-- method
6 = loss.sub.-- of.sub.--
precision.
7 = internal.sub.-- error
MethodType define The value represents
MethodType=UnsignedType. (numerically) the
particular method of an
Object.
ClassType define ClassType = The value represents
UnsignedType. (numerically) a particular
class (such as Numeric
Register of PowerMeter
Module).
NodeHandleType
define union NodeHandleType = An address to a remote
StringType.linevert split. IED site.
UnsignedType.
ExtendedHandleType
define structure Defines a handle used
ExtendedHandleType = to a reference an object
[NodeHandleType`node`] on another IED.
UnsignedType `handle`.
HandleType define union HandleType = The value represents
UnsignedType.linevert split. the address of an
ExtendedHandleType. object.
ExtendedHandle
define structure array The value is an array of
ArrayType ExtendedHandleArrayType = Extended Handles.
{ExtendedHandle `value.sub.i `}.
HandleArrayType
define union HandleArrayType =
The value is an array of
ExtendedHandleArrayType.linevert split.
handle values.
UnsignedArrayType.
PriorityType define Priorities range from 0
The value represents an
PriorityType = UnsignedType.
to 255 priority. Guidelines for
priorities are as follows:
Urgent
192 to 255
High
128 to 191
Medium 64 to 127
Low 0
to 63
RangeType define structure RangeType = defines a range of
IndexType values that starts at
`range.sub.-- start` index range.sub.-- start and
IndexType ends at index
`range.sub.-- end`. range.sub.-- end. This is
useful in log situations.
EventType define structure EventType = Defines a structure for
PriorityType `priority` an event.
UnsignedType Values for event.sub.-- state
`event.sub.-- state` are:
HandleType 0 = unary state event.
`cause.sub.-- handle` 1 = Active transition
IONType for bi-state event.
`cause.sub.-- value` 2 = Inactive transition
HandleType for bi-state event.
`effect.sub.-- handle` 3 = Label change
IONType event.
`effect.sub.-- value`.
LogHeaderType
define Structure defines the
LogHeaderType = header for a general
HandleArrayType purpose log record.
LogRecordType
define structure LogRecordType =
Structure defines the
IndexType `position` data values in a general
TimeType purpose log record.
`timestamp`
{Type `value.sub.i `}.
LogArrayType define structure.sub.-- array Array of log records.
LogArrayType =
{LogRecordType `logrec.sub.i `}.
WaveformType define structure Defines a structure for
WaveformType = a waveform.
NumericType Note:
`sampling.sub.-- frequency` plotted value =
NumericType `offset` (data point +
NumericType `scale` offset) * scale.
TimeType
`time.sub.-- of.sub.-- first.sub.-- point`.
NumericArray `points`.
AlarmType define structure AlarmType = Structure for alarms:
HandleType When parameter
`effect.sub.-- handle` Transitions is odd the
CounterType alarm is active.
`transitions`.
PriorityType `priority`.
AlarmArrayType
define structure.sub.-- array Array of alarms.
AlarmArrayType =
{AlarmType `alarm.sub.i `}.
SecurityType define Value represents a
SecurityType = UnsignedTypes.
Table 1 lists a set of methods which are presently defined for the base class. All of these base class methods are inherited by the registers and modules.
TABLE 1
__________________________________________________________________________
# Method Return-type
Description
__________________________________________________________________________
1 read.sub.-- class( )
ClassType
Causes a manager, module or register to return
a
number indicating what type of manager, module
or
register it is.
2 read.sub.-- name ( )
StringType
Causes a manager, module or register to return
a
string containing the name of the manager,
module or
register.
3 read.sub.-- label ( )
StringType
Causes a manager, module or register to return
a
string containing the label for the manager,
module or
register. A label differs from a name in that it
can
be programmed by executing a Write Label method
on
the manager, module or register. If no label is
programmed the object name will be returned.
128
write.sub.-- label(StringType)
BooleanType
Write the programmable object label. If a
null-string is
written, the Label is destroyed.
129
read.sub.-- security.sub.-- level(
SecurityType
Is executed to determine whether a method can
be
MethodType) executed on a particular manager, module or
register.
Not all methods are available on all devices.
The
master device can determine whether it will
receive a
valid result by first executing this method.
Another
method, Read All Security Levels returns a list
which
corresponds to the security levels of all the
methods
that can be executed on a manager or module.
130
read.sub.-- all.sub.-- security.sub.-- levels( )
MethodSecurity
Read the security levels for all methods of a
given
ArrayType
object. Only methods valid for the object's
class are
included.
131
read.sub.-- parent.sub.-- handle
HandleType
Returns a handle of the parent of a manager,
module
or register. For instance, executing this method
on an
analog output module will return the handle of
the
analog output manager. Executing this method on
the
analog output manager will return a handle to
the
feature manager. Executing this method on an
analog
output's output register returns the analog
output
module.
132
read.sub.-- owners( )
HandleArray
Returns a list of handles for all the modluels
that own
Type the object this method is executed on. This
will
include a list of modules if the method is
invoked on a
register or a manager if it is invoked on a
module.
133
IsA(ClassType)
BooleanType
Returns a value indicating whether or not and
object is
derived from the class given as an argument.
134
check.sub.-- sanity( )
BooleanType
Checks to see if the manager, module or register
is
operating correctly. i.e., determines whether
the
software that implements the object is
operating
correctly. Returns True if object is
__________________________________________________________________________
sane.
If a method invocation is unsuccessful, an ExceptionType will be returned rather than the normal Return-type. In the current implementation a module performs a function using registers. Input registers provide the information a module is operating on. Setup registers permit modification of the operation of the module. Output registers contain the results of the module's operation. The output registers of one module can be used as input registers for another. The module keeps track of which registers are to be used for its input, output and setup. The links to the input registers can be modified, but those to the output and setup registers are fixed. A module is said to "own" all the registers it is linked to. Methods may also be executed on registers once the handle to a register is known. The handle of a register or module is a number which is unique for each register and module on a device. When a method is invoked, a handle is supplied which indicates which module or register the method is to be invoked upon. In most instances, the methods that can be invoked on the different types of registers depend on what type of register is involved. Table 2 lists a set of methods which are presently defined for all registers (all register classes are inherited from the register class).
TABLE 2
______________________________________
Register Class (R) - class = 20
# Method Return-type
Description
______________________________________
20 read.sub.-- time( )
TimeType Read the time of last
update.
21 read.sub.-- value( )
VoidType Read the value of the
object
22 write.sub.-- value(VoidType)
BooleanType
Write the value of the
object
______________________________________
TABLES 3-19 list methods which are supported for the indicated register classes. (In Tables 3-19, "*" indicates that the method is inherited from the parent class and "+" indicates that the method is re-defined from the parent class.)
TABLE 3
__________________________________________________________________________
BooleanVariableRegister (BVR) - class = 21
This class defines a Boolean variable storage location.
# Method Return-type
Description
__________________________________________________________________________
20 read.sub.-- time( )*
TimeType
Read the time of last update
21 read.sub.-- value( )+
BooleanType
Read the value of the register.
22 write.sub.-- value(BooleanType)+
BooleanType
Write the value of the register
30 read.sub.-- ON.sub.-- label( )
StringType
Read the ON label.
500
write.sub.-- ON.sub.-- label(StringType)
BooleanType
Write the ON label.
31 read.sub.-- OFF.sub.-- label( )
StringType
Read the OFF label.
501
write.sub.-- OFF.sub.-- label(StringType)
BooleanType
Write the OFF label.
32 read.sub.-- current.sub.-- state.sub.-- label( )
StringType
Returns the ON label if register value =
True and OFF label if register value =
False.
__________________________________________________________________________
It is also contemplated that a TableRegisterClass will be defined. The TableRegisterClass represents a database table, rows of data organized into distinct columns. It is presently envisioned that the database tables will not be accessible using methods. These registers may be used permanently as inputs to specialized modules that allow indirect access to the tables. Registers operate only as servers in the architecture. In other words they only respond to method invocations. Some of the most commonly used registers in the preferred embodiment are boolean registers, enumerated registers, numeric registers and numeric bounded registers. A flow chart for the server operation of a boolean register is shown in FIGS. 20A-20C. A flow chart for the server operation of an enumerated register is shown in FIGS. 21A-21B. A flow chart for the server operation of a numeric register is shown in FIGS. 22A-22B. A flow chart for the server operation of a numeric bounded register is shown in FIGS. 23A-23B. It will be recognized by those skilled in the art that the registers' functionality can be embedded within the modules. The modules provide the IED the functionality in the architecture. FIG. 11 schematically illustrates a preferred embodiment of the properties of the modules. The modules can be considered as "black boxes" that read data at the inputs, manipulate the data in some fashion, and write the result to outputs. Input data is read from registers and output data is written to registers. For all types of modules, the links to input registers can be programmed, but the links to output registers are fixed. Most modules have links to registers which contain setup information--these links are also fixed, and the module can only read them. FIG. 12 illustrates the data flow for a module. A module 61 is linked to input registers 63a-63n through programmable links 69a-69n. Setup registers 67a-67n are linked to module 61 through links 72a-72n which are not programmable. Output registers 64a-64n are linked to module 61 through links 70a-70n which also are not programmable. In the preferred embodiment, the modules have the following properties An array of handles (input handles) point to the input registers. The module has shared ownership of these registers. The module reads a register using the Read.sub.-- Value method. Module setup data (such as scaling information) is stored in registers. An array of handles (setup handles) point to these Registers. There is one exception: For a manager module these Handles point to other modules rather than registers. The module has shared ownership of these objects. The module uses the input data and setup data to produce output data according to the function of the module which is described by the module behavior. An array of handles (output handles) point to the output registers. The module has shared ownership of these registers. A module writes these registers using the Write.sub.-- Value method. UpdatePeriod contains the period at which the module updates the output registers. ModuleSecurity contains the security level which the module uses when invoking methods on other objects. The module has a class which is unique to that type of module. (e.g. All setpoint modules would have the same class). The module has a name. This name is fixed (read only) and is different in every module. The module has a label which can be programmed. A method security level is defined for every method which can be invoked on a module. Thus, there is a security parameter for every method which can be invoked on the module. The module has owners which are listed in an array of Handles. This array lists all the module(s) that have shared ownership of the module. A module is created by a manager using the Create.sub.-- Module() method. When the module is created all output registers and setup registers are also created. However, input registers are not created when a module is created. Often, a manager will have a fixed number of modules and the Create.sub.-- Module() method will not be supported. The module class (class=500) is derived from the base class. The methods listed below in Table 20 are common to all module classes (all module classes are inherited from this module class).
TABLE 20
__________________________________________________________________________
# Method Return-type
Description
__________________________________________________________________________
1000
read.sub.-- input.sub.-- handles( )
HandleArray
Returns a list of the handles to the
registers
Type that are connected as inputs to the manager
or module. (In the current embodiment,
managers do not have inputs.)
1001
write.sub.-- input.sub.-- handles(HandleArrayType)
BooleanType
Accepts a list of handles and attempts to
link
a module or manager to these input
registers.
(In the current embodiment, managers do not
have inputs.) The handle order is defined in
the module definitions. If one of the
handles
is incorrect the method will fail and NO
handles will be written (i.e. all or
nothing).
1002
read.sub.-- input.sub.-- classes( )
ArrayUnsigned
Reads the allowed register classes for the
ArrayType
write.sub.-- input.sub.-- handles method. The
returned
array has the same number of elements as
the HandleArray used in the
write.sub.-- input.sub.-- handles method. If
the returned
array has an element that contains a Null
rather than a class this indicates that this
input element cannot be programmed.
1003
read.sub.-- output.sub.-- handles( )
HandleArray
Returns a list of handles to the output
Type registers of a module or manager. (In the
current embodiment, managers do not have
outputs.) The handle order is defined in the
module definitions.
1004
read.sub.-- setup.sub.-- handles( )
HandleArray
Returns a list of handles to the setup
register
Type of a module or a list of handles to modules
for a manager. The handle order is defined
in
the module definitions.
80 read.sub.-- setup.sub.-- counter( )
CounterType
Returns a number indicating how many times
the module or manager has had its
configuration changed. A master device can
keep a local copy of this number. If another
master device changes the setup of the slave
device, the first manager can detect the
change by comparing its count with the
current count.
81 read.sub.-- update.sub.-- counter( )
CounterType
Returns a number indicating how many times
the module or manager has successfully
invoked a method to write a new value to its
output registers. A master device can then
determine if it is necessary to read the
output
from the module or manager. (In the current
embodiment, managers have no outputs.)
1005
read.sub.-- update.sub.-- period( )
StringType
Returns a number indicating the minimum
amount of time there will between the module
or manager updating its output registers.
(In
the current embodiment, managers have no
outputs.)
Typical response is one of:
"one cycle"
"one second"
"two cycles"
1006
read.sub.-- module.sub.-- security( )
SecurityType
Returns a numbers indicating the security
access a module has. Other modules or
registers may refuse to execute a method
invoked by a module which does not have a
high enough security level.
__________________________________________________________________________
Table 21 below lists the behavior details for the module parameters.
TABLE 21
______________________________________
Module Parameter
Behavior
______________________________________
update.sub.-- counter
will be incremented every time a write.sub.-- value( )
method is successfully invoked on one of the
registers identified by the output handles.
Note: by default the update counter will be incre-
mented every time an module writes an event
register.
setup.sub.-- counter
will be incremented every time a write.sub.-- value( )
method is successfully invoked on one of the sys-
tem registers identified by the setup handles and
every time the write.sub.-- input.sub.-- handles( )
method is successfully invoked.
______________________________________
Table 22 below provides a list of the modules (including the corresponding input, output and setup registers) presently supported by the presently preferred embodiment.
TABLE 22
__________________________________________________________________________
# Module Name
Input Registers
Output Registers
Setup Registers
Module Description
__________________________________________________________________________
501
Power Meter
V1(NAR) Vabc*(NVR).sup.1
ode(ENR) Basic 3-phase power met
V2(NAR) Vllabc*(NVR)
PT Pri Volts(NBR)
met meter.
V3(NAR) labc*(NVR) PT Sec Volts(NBR)
PhaseOrder:
l1(NAR) KWabc*(NVR)
CT Pri (NMR)
"ABC"
l2(NAR) KVARabc*(NVR)
CT Sec l(NBR)
"ACB"
l3(NAR) KVAabe*(NVR)
14 CT Pri l(NBR)
NormFreq:
l4(NAR) PFSIGNabc*(NVR)
14 CT Sec l(NBR)
"50"
PFLEADabc*(NVR)
l1 Polarity(ENR)
"60"
PFLAGabc*)NVR)
l2 Polarity(ENR)
"400"
Vunbal(NVR)
l3 Polarity(ENR)
PhaseLabels:
lunbal(NVR)
PhaseOrder(ENR)
"ABC"
l4(NVR) NormFreq(ENR)
"RST"
Iresidual(NVR)
PhaseLabels
"XYZ"
PhaseRev(BVR)
(ENR) "RYB"
LineFreq(NVR)
Event(ER)
502
Analog Input ScaledAnalog(NVR)
Zero Scale(NBR)
Analog Input function.
Event(ER) Full Scale(NBR)
Port indicates H/W input
Port(ENR)
port.
503
Analog Output
Source(NVR)
State(NVR) Zero Scale(NBR)
Analog Output function.
Event(ER) Full Scale(NBR)
OutputState gives present
OutputMode
output value as a % of
(ENR) output full scale.
Port(ENR)
OutputMode:
"0-20ma"
"4-20ma"
note: OutputMode is not
supported for all devices.
Port indicates H/W output
port.
504
Digital Input State(BVR) InputMode (ENR)
Processes raw digital
Trigger(DR)
EvLogMode
signals received from H/W
Event(ER) (ENR) digital input channel.
InPolarity(ENR)
Trigger on valid state
Debounce(NBR)
changes.
Port(ENR)
InputMode:
"Pulse"
"KYZ"
EvLogMode:
"Log Off"
"Log On"
InPolarity:
"non-inverting"
"inverting"
Debounce in ms.
Port indicates H/W input
port.
505
Digital Output
Source(BVR)
State(BVR) EvLogMode
Provides raw bit pattern
ForceOn(DR)
Mode(BVR) (ENR) for H/W digital output
ForceOff(DR)
Event(ER) OutPolarity(ENR)
channel.
Normal(DR) PulseWidth(NBR)
EvLogMode:
Port(ENR)
"Log Off"
"Log On"
OutPolarity:
"non-inverting"
"inverting"
PulseWidth:
0 = continuous output.
not 0 = pulse width in
ms.
Port indicates H/W output
port.
506
Pulser Source(DR)
Event(ER) PulseWidth(NBR)
Proves pulse output (e.g.
OutputMode
for Kwh pulsing). Output
(ENR) Port is pulsed every time
OutPolarity(ENR)
a pulse is received at the
Port(ENR)
Source input.
PulseWidth specified in
ms.
OutputMode:
"Pulse"
"KYZ"
OutPolarity:
"non-inverting"
"inverting"
Port indicates H/W output
port.
508
SWD Source(NVR)
SWD(NVR) Period(NBR)
Provides SWD on source
Sync(DR) Prediction(NVR)
#Periods(NBR)
input.
Reset(DR) Event(ER) SyncMode(ENR)
Period in minutes.
PredictSpeed
SyncMode:
(NBR) "internal"
"external"
Sync input is used in
external sync mode,
otherwise un-used.
PredictSpeed from 0-99
(99 = fast response).
509
TD Source(NVR)
TD(NVR) Period(NBR)
Provides Thermal Demand
Reset(DR) Event(ER) TimeConstant
calculation on a single
(NBR) source input.
Period in minutes.
TimeConstant is a
percentage of the Period.
510
Integrator
Integrand(NVR)
Result(NVR)
Divisor(NBR)
Provides integration
Enable(BVR)
Pulse(DR) IntMode(ENR)
function.
Reset(DR) Event(ER) PulseSize(NBR)
Enable allows gating
Divisor in seconds (for
Kwh the Divisor would be
3600)
IntMode:
"forward"
"reverse"
"absolute"
"net"
The Pulse output will be
pulsed when the Result
output changes by the
amount specified in
PulseSize setup . . .
511
Min Source(NVR)
Min(NVR) Scans Source register for
Enable(BVR)
Trigger(DR) Event(ER)
new minimum values.
Reset(DR) Enable allows gating for
every new minimum the
Min and Trigger registers
are updated.
512
Max Source(NVR)
Max(NVR) Scans Source register for
Enable(BVR)
Trigger(DR) Event(ER)
new maximum values.
Reset(DR) Enable allows gating for
every new maximum the
Max and Trigger registers
are updated.
513
Setpoint
Source(NVR/BVR)
Status(BVR)
HiLim(NBR)
Provides hysteric
Enable(BVR)
Trigger(DR)
LoLim(NBR)
setpoint function on
Reset(DR) Event(ER) TDOperate(NBR)
numberic of loolean value.
TDRelease(NBR)
Enable allows gating.
InputMode(ENR)
Trigger on setpoint going
EvaluateMode
ACTIVE.
(ENR) TDOperate and TDRelease
EventPri(NBR)
in ms.
InputMode:
"Signed"
"Absolute"
EvaluateMode:
"GreaterThan"
"LessThan"
514
FFT Source(NAR)
FFT(NAR) Performs FFT calculations
Enable(BVR)
Event(ER) on input source array and
generates an array of
complex numbers.
515
Harmonics
Source(NAR)
HD1(NVR) Performs harmonics
| ||||||
