Gw XML setup: Difference between revisions
(52 intermediate revisions by 2 users not shown) | |||
Line 14: | Line 14: | ||
**If more than one '''Device''' element available. This attribute specifies the '''id''' of the '''Device''' to use as current setup. | **If more than one '''Device''' element available. This attribute specifies the '''id''' of the '''Device''' to use as current setup. | ||
<syntaxhighlight lang="xml"> | |||
<Setup device="Telem-Gw6-1"> | <Setup device="Telem-Gw6-1"> | ||
< | <Device id="Telem-Gw6-1" /> | ||
< | <Device id="Gw1" /> | ||
< | <Device id="Gw2" /> | ||
</Setup> | </Setup> | ||
</syntaxhighlight> | |||
== Element: Device == | == Element: Device == | ||
Line 32: | Line 35: | ||
Child elements of Device when used as GW device | Child elements of Device when used as GW device | ||
<syntaxhighlight lang="xml"> | |||
<Device id="Telem-Gw6-1"> | <Device id="Telem-Gw6-1"> | ||
< | <Channel /> | ||
< | <Interfaces /> | ||
</Device> | </Device> | ||
</syntaxhighlight> | |||
Child elements of Device when used as the device we're connecting to. | Child elements of Device when used as the device we're connecting to. | ||
<syntaxhighlight lang="xml"> | |||
<Device id="DI-24T-1"> | <Device id="DI-24T-1"> | ||
< | <Protocol /> | ||
< | <Objects /> | ||
</Device> | </Device> | ||
</syntaxhighlight> | |||
== Element: Channel == | == Element: Channel == | ||
Line 50: | Line 59: | ||
*Element: '''[[Gw_XML_setup#Element:_Objects | Objects]]''' | *Element: '''[[Gw_XML_setup#Element:_Objects | Objects]]''' | ||
<syntaxhighlight lang="xml"> | |||
<Channel id="DI-24T-1"> | <Channel id="DI-24T-1"> | ||
< | <Port /> | ||
< | <Device /> | ||
< | <Objects /> | ||
</Channel> | </Channel> | ||
</syntaxhighlight> | |||
== Element: Protocol == | == Element: Protocol == | ||
<syntaxhighlight lang="xml"> | |||
<Protocol comment="protocol8" id="prot_8_0"> | <Protocol comment="protocol8" id="prot_8_0"> | ||
< | <Address /> | ||
<CommunicationDelay unit="millisecond">0</CommunicationDelay> | <CommunicationDelay unit="millisecond">0</CommunicationDelay> | ||
<PollingTimeout unit="millisecond">500</PollingTimeout> | <PollingTimeout unit="millisecond">500</PollingTimeout> | ||
< | <TimeSync /> | ||
<TimeoutRemoveCount>5</TimeoutRemoveCount> | <TimeoutRemoveCount>5</TimeoutRemoveCount> | ||
<TimeoutRemoveTime unit="second">20</TimeoutRemoveTime> | <TimeoutRemoveTime unit="second">20</TimeoutRemoveTime> | ||
Line 67: | Line 80: | ||
<Type SubVersion="0" isMaster="false">IEC101UnBalanced</Type> | <Type SubVersion="0" isMaster="false">IEC101UnBalanced</Type> | ||
</Protocol> | </Protocol> | ||
</syntaxhighlight> | |||
=== Element: TimeSync === | === Element: TimeSync === | ||
Timesync interval and correction setup | Timesync interval and correction setup | ||
<syntaxhighlight lang="xml"> | |||
<TimeSync isEnabled="true"> | <TimeSync isEnabled="true"> | ||
<Interval unit="second">30</Interval> | <Interval unit="second">30</Interval> | ||
< | <Correction /> | ||
</TimeSync> | </TimeSync> | ||
</syntaxhighlight> | |||
==== Element: Correction ==== | ==== Element: Correction ==== | ||
Possible timesync correction types: | Possible timesync correction types: | ||
Line 81: | Line 96: | ||
**Baudrate based(only when using serial port) | **Baudrate based(only when using serial port) | ||
<syntaxhighlight lang="xml"> | |||
<Correction> | <Correction> | ||
<Absolute enabled="true" unit="millisecond">0</Absolute> | <Absolute enabled="true" unit="millisecond">0</Absolute> | ||
<ConnectionSpeed enabled="true"/> | <ConnectionSpeed enabled="true"/> | ||
</Correction> | </Correction> | ||
</syntaxhighlight> | |||
== Element: Address == | == Element: Address == | ||
Line 91: | Line 109: | ||
This elements contents depend on the protocol selected | This elements contents depend on the protocol selected | ||
==== Iec-10x ==== | ==== Iec-10x ==== | ||
<syntaxhighlight lang="xml"> | |||
<Address> | <Address> | ||
<LinkAddress>1</LinkAddress> | <LinkAddress>1</LinkAddress> | ||
Line 98: | Line 117: | ||
<ObjectAddressLength>2</ObjectAddressLength> | <ObjectAddressLength>2</ObjectAddressLength> | ||
</Address> | </Address> | ||
</syntaxhighlight> | |||
==== MODBUS ==== | ==== MODBUS ==== | ||
Value: ''integer'' | Value: ''integer'' | ||
<Address> | <syntaxhighlight lang="xml"> | ||
<Address>2</Address> | |||
</syntaxhighlight> | |||
==== IEC62056-21 ==== | ==== IEC62056-21 ==== | ||
Value: ''string'' | Value: ''string'' | ||
Can be empty if only one device on channel. | Can be empty if only one device on channel. | ||
<Address id="0.0.0"> | <syntaxhighlight lang="xml"> | ||
<Address id="0.0.0">addr123</Address> | |||
</syntaxhighlight> | |||
If this Address element contains attribute '''id''', It shall be used for device verification. | If this Address element contains attribute '''id''', It shall be used for device verification. | ||
Line 111: | Line 135: | ||
=== Address of object === | === Address of object === | ||
==== Iec- | ==== Iec-101/104 ==== | ||
Value: ''integer'' | Value: ''integer'' | ||
<Address index=" | <syntaxhighlight lang="xml"> | ||
<Address index="0">10</Address> | |||
</syntaxhighlight> | |||
attribute index is unnecessary if value=='''0''' | attribute index is unnecessary if value=='''0''' | ||
==== Iec-103 ==== | |||
<syntaxhighlight lang="xml"> | |||
<Address fnCode="3" infoNr="6"/> | |||
</syntaxhighlight> | |||
==== SPA-Bus ==== | |||
Kas standardis on '''dataType''' või '''dataCode''' vastava välja nimetus? | |||
Väärtuse '''1234''' oleks ka võibolla mõistlik attribuuti '''dataNumber''' tõsta | |||
Kas DI'l index on kasutused? | |||
===== DI ===== | |||
<syntaxhighlight lang="xml"> | |||
<Address index="3" onEvent="6" offEvent="6" channelNumber="6" dataType="I">1234</Address> | |||
</syntaxhighlight> | |||
Alternatiiv: | |||
<syntaxhighlight lang="xml"> | |||
<Address onEvent="6" offEvent="6" channelNumber="6" dataCode="I" dataNumber="1234" /> | |||
</syntaxhighlight> | |||
===== AI ===== | |||
<syntaxhighlight lang="xml"> | |||
<Address channelNumber="6" dataType="I">1234</Address> | |||
</syntaxhighlight> | |||
Alternatiiv: | |||
<syntaxhighlight lang="xml"> | |||
<Address channelNumber="6" dataCode="I" dataNumber="1234" /> | |||
</syntaxhighlight> | |||
===== CN ===== | |||
<syntaxhighlight lang="xml"> | |||
<Address channelNumber="6" dataType="I">1234</Address> | |||
</syntaxhighlight> | |||
Alternatiiv: | |||
<syntaxhighlight lang="xml"> | |||
<Address channelNumber="6" dataCode="I" dataNumber="1234" /> | |||
</syntaxhighlight> | |||
==== IEC61580/IEC62056-21 ==== | ==== IEC61580/IEC62056-21 ==== | ||
Value: ''string'' | Value: ''string'' | ||
<Address> | <syntaxhighlight lang="xml"> | ||
<Address>5.3.5</Address> | |||
</syntaxhighlight> | |||
==== Other ==== | ==== Other ==== | ||
Line 125: | Line 199: | ||
== Element: Port == | == Element: Port == | ||
<syntaxhighlight lang="xml"> | |||
<Port> | <Port> | ||
< | <Buffer id="inBuffer"/> | ||
< | <Buffer id="outBuffer"/> | ||
<IoBuffer in="inBuffer" out="outBuffer"/> | <IoBuffer in="inBuffer" out="outBuffer"/> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
=== Port data forwarding === | === Port data forwarding === | ||
It is possible to send data from one port to another. | It is possible to send data from one port to another. | ||
To do that, port1's input buffer is the same as port2's outputbuffer and vice versa. | To do that, port1's input buffer is the same as port2's outputbuffer and vice versa. | ||
<syntaxhighlight lang="xml"> | |||
<Port id="port1"> | <Port id="port1"> | ||
<Buffer id="portBufferIn"/> | <Buffer id="portBufferIn"/> | ||
Line 145: | Line 219: | ||
<IoBuffer in="portBufferOut" out="portBufferIn"/> | <IoBuffer in="portBufferOut" out="portBufferIn"/> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
The same method allows creation of a local loopback. | The same method allows creation of a local loopback. | ||
<syntaxhighlight lang="xml"> | |||
<Port id="portLoopback"> | <Port id="portLoopback"> | ||
<Buffer id="portBuffer"/> | <Buffer id="portBuffer"/> | ||
<IoBuffer in="portBuffer" out="portBuffer"/> | <IoBuffer in="portBuffer" out="portBuffer"/> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
=== Serial port === | === Serial port === | ||
<syntaxhighlight lang="xml"> | |||
<Port class="SerialPortSetup"> | <Port class="SerialPortSetup"> | ||
<BaudRate>9600</BaudRate> | <BaudRate>9600</BaudRate> | ||
Line 161: | Line 238: | ||
<FlowControl>none</FlowControl> | <FlowControl>none</FlowControl> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
=== TCP/IP server === | === TCP/IP server === | ||
<syntaxhighlight lang="xml"> | |||
<Port class="TcpIpServerSetup"> | <Port class="TcpIpServerSetup"> | ||
<PortNumber>80</PortNumber> | <PortNumber>80</PortNumber> | ||
Line 167: | Line 246: | ||
<Interface>eth0</Interface> | <Interface>eth0</Interface> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
==== Element: ClientIpMask ==== | ==== Element: ClientIpMask ==== | ||
Line 174: | Line 254: | ||
=== TCP/IP client === | === TCP/IP client === | ||
<syntaxhighlight lang="xml"> | |||
<Port class="TcpIpClientSetup" name="16"> | <Port class="TcpIpClientSetup" name="16"> | ||
<PortNumber>502</PortNumber> | <PortNumber>502</PortNumber> | ||
Line 179: | Line 260: | ||
<Interface>eth0</Interface> | <Interface>eth0</Interface> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
=== Virtual port === | === Virtual port === | ||
They are ports 3-5 on GW6. | They are ports 3-5 on GW6. | ||
<syntaxhighlight lang="xml"> | |||
<Port class="VirtualPortSetup"> | <Port class="VirtualPortSetup"> | ||
<Port class="SerialPortSetup"> | <Port class="SerialPortSetup"> | ||
Line 190: | Line 273: | ||
</Port> | </Port> | ||
</Port> | </Port> | ||
</syntaxhighlight> | |||
== Element: Objects == | == Element: Objects == | ||
Line 217: | Line 301: | ||
Child elements define default value, flags and time tag. | Child elements define default value, flags and time tag. | ||
<syntaxhighlight lang="xml"> | |||
<MxValue id="DI_6_value"> | <MxValue id="DI_6_value"> | ||
<Value>0</Value> | <Value>0</Value> | ||
Line 225: | Line 310: | ||
</MxValue> | </MxValue> | ||
</syntaxhighlight> | |||
==== Element: Filter ==== | ==== Element: Filter ==== | ||
Line 233: | Line 319: | ||
When an event is received, it is sent to it's filter. After the filter does what it's supposed to do, it will pass the event to the '''Next''' Filter | When an event is received, it is sent to it's filter. After the filter does what it's supposed to do, it will pass the event to the '''Next''' Filter | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="Change"> | <Filter class="Change"> | ||
<Filter class="Proxy" /> | <Filter class="Proxy" /> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
===== AddToBuffer ===== | ===== AddToBuffer ===== | ||
Line 242: | Line 330: | ||
'''Target''' is a Buffer object. | '''Target''' is a Buffer object. | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="AddToBuffer"> | <Filter class="AddToBuffer"> | ||
<Target ref="DI_0_7_buf"/> | <Target ref="DI_0_7_buf"/> | ||
Line 249: | Line 338: | ||
<Target ref="DI_4_7_buf"/> | <Target ref="DI_4_7_buf"/> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
===== Assert ===== | ===== Assert ===== | ||
Passes event to the next filter only if specified target('''[[Gw_XML_setup#Element:_MxValue |MxValue]]''') '''==''' false. | Passes event to the next filter only if specified target('''[[Gw_XML_setup#Element:_MxValue |MxValue]]''') '''==''' false. | ||
Possible use cases: | |||
* Respond negatively to control commands | |||
* Signal blocking | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="Assert"> | <Filter class="Assert"> | ||
< | <Ref>DI_7_value<Ref/> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
===== Change ===== | ===== Change ===== | ||
Line 260: | Line 357: | ||
===== Deadband ===== | ===== Deadband ===== | ||
Used to detect change in analog and counter values | Used to detect change in analog and counter values | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="Deadband"> | <Filter class="Deadband"> | ||
<Type>X</Type> | <Type>X</Type> | ||
[...] | |||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
* Type | |||
** Default is Deadband1, if Deadband1 then element Type is unnecessary | |||
====== Integral ====== | ====== Integral ====== | ||
Line 270: | Line 373: | ||
This deadband is used for counter values. | This deadband is used for counter values. | ||
f=abs(new_value- | f = abs( new_value - current_value ) > Threshold | ||
====== Deadband1 ====== | |||
* Threshold | |||
** Integer value | |||
** If value=0; then no need for filter | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="Deadband"> | |||
<Type>Absolute</Type> | |||
<Threshold>X</Threshold> | |||
</Filter> | |||
</syntaxhighlight> | |||
====== Deadband1/Legacy ====== | |||
This is the legacy GW6 deadband mode | |||
This deadband is used for analog values. | This deadband is used for analog values. | ||
if( (new_value < Critical.min) || (new_value > Critical.max) ) | |||
{ | |||
current_threshold = Threshold.db2 | |||
} | |||
else | |||
{ | |||
current_threshold = Threshold.db1 | |||
} | |||
if ( new_value.is_normalized ) | |||
calculated_threshold = current_threshold / 100 | |||
else | |||
calculated_threshold = (Scale.max - Scale.min) * current_threshold / 100 | |||
f = abs( new_value - current_value ) > calculated_threshold | |||
* If Threshold.db1=0 and Threshold.db2=0, do not add Deadband filter. | |||
* Element Scale | |||
** Unneccessary when Scale.min=0 and Scale.max=0 | |||
* If Critical.min=0 and Critical.max=0, following elements/attrbutes are not neccessary | |||
** Element Critical | |||
** Attribute "db2" of element "Threshold" | |||
<big>Example 1</big> | |||
Both '''DB1''' and '''DB2''' active | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="Deadband"> | |||
<Scale min="1" max="4" /> | |||
<Threshold db1="2" db2="2" /> | |||
<Critical min="2" max="3" /> | |||
</Filter> | |||
</syntaxhighlight> | |||
<big>Example 2</big> | |||
Works only on '''normalized''' values ( no element Scale ) | |||
'''DB2''' inactive | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="Deadband"> | |||
<Threshold db1="2"/> | |||
</Filter> | |||
</syntaxhighlight> | |||
<big>Example 3</big> | |||
Works on '''normalized''' and '''floating point''' values | |||
'''DB2''' inactive | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="Deadband"> | |||
<Scale min="1" max="4" /> | |||
<Threshold db1="2"/> | |||
</Filter> | |||
</syntaxhighlight> | |||
===== Fallback ===== | ===== Fallback ===== | ||
Line 281: | Line 455: | ||
This filter works only on floating point values. Normalized values shall be passed on without change | This filter works only on floating point values. Normalized values shall be passed on without change | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="Normalize"> | <Filter class="Normalize"> | ||
<To>-1...1</To> | <To>-1...1</To> | ||
Line 286: | Line 461: | ||
<Min>10</Min> | <Min>10</Min> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
Element '''To''' has two possible value: '''-1...1''' or '''0...1''' and this selects the formula and overflow conditions being used. | Element '''To''' has two possible value: '''-1...1''' or '''0...1''' and this selects the formula and overflow conditions being used. | ||
Line 302: | Line 478: | ||
===== Inversion ===== | ===== Inversion ===== | ||
Inverts the passed digital value. | Inverts the passed digital value.. | ||
===== If-else ===== | |||
Input: digital value | |||
This is not final! | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="IfElse"> | |||
<True> | |||
<Filter class="AddToBuffer"> | |||
<Target ref="DO_device_output1_buf"/> | |||
</Filter> | |||
</True> | |||
<False> | |||
<Filter class="AddToBuffer"> | |||
<Target ref="DO_device_output2_buf"/> | |||
</Filter> | |||
</False> | |||
</Filter> | |||
</syntaxhighlight> | |||
===== OutputController ===== | |||
This filter is used with Formulas when output controlling is needed. | |||
* Count | |||
** Default value if count not specified, '''1''' | |||
** Number of output commands | |||
** Integer: '''1...X''' ( X = uint32_t ) | |||
** String: '''inf''' ( infinity, if Count is not convertable to integer, then inifinity is used) | |||
* Retry | |||
** time to wait before retry/next command | |||
** default value if not specified, 5 seconds | |||
* FirstControl | |||
** Defines if first control operation is allowed | |||
<syntaxhighlight lang="xml"> | |||
<Filter class="OutputController"> | |||
<Count>1</Count> | |||
<Retry unit="second">5</Retry> | |||
<FirstControl>1</FirstControl> | |||
<Filter class="Assert"> | |||
<Ref>DO_device_status</Ref> | |||
<Filter class="AddToBuffer"> | |||
<Target ref="DO_device_output1_buf"/> | |||
</Filter> | |||
</Filter> | |||
</Filter> | |||
</syntaxhighlight> | |||
===== Proxy ===== | ===== Proxy ===== | ||
'''Proxy''' may have more than one next '''Filter'''. | '''Proxy''' may have more than one next '''Filter'''. | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="Proxy"> | <Filter class="Proxy"> | ||
<Filter class="AddToBuffer" /> | <Filter class="AddToBuffer" /> | ||
Line 311: | Line 536: | ||
<Filter class="Fallback" /> | <Filter class="Fallback" /> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
===== Scale ===== | ===== Scale ===== | ||
This filter works only on normalized values. Non-normalized(floating point) values shall be passed on without change | This filter works only on normalized values. Non-normalized(floating point) values shall be passed on without change | ||
scaled_value=normalized_value*(Max-Min)+Min | scaled_value=normalized_value*(Max-Min)+Min | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="Scale"> | <Filter class="Scale"> | ||
<Max>100</Max> | <Max>100</Max> | ||
<Min>10</Min> | <Min>10</Min> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
If element '''Min'''=0 then no need to define that element, value 0 is used as default for Min. | If element '''Min'''=0 then no need to define that element, value 0 is used as default for Min. | ||
Line 329: | Line 557: | ||
'''Target''' is a MxValue object. | '''Target''' is a MxValue object. | ||
<syntaxhighlight lang="xml"> | |||
<Filter class="UpdateValue"> | <Filter class="UpdateValue"> | ||
<Target ref="DI_7_value"/> | <Target ref="DI_7_value"/> | ||
</Filter> | </Filter> | ||
</syntaxhighlight> | |||
===== Square ===== | |||
===== SquareRoot ===== | |||
===== Sine ===== | |||
===== Cosine ===== | |||
===== Tangent ===== | |||
===== Cotangent ===== | |||
f = 1 / tan(x) | |||
===== Secant ===== | |||
f = 1 / cos(x) | |||
===== Cosecant ===== | |||
f = 1 / sin(x) | |||
===== log ===== | |||
===== log10 ===== | |||
===== exp ===== | |||
==== Element: Buffer ==== | ==== Element: Buffer ==== | ||
Defines a buffer object, with depth. | Defines a buffer object, with depth. | ||
<syntaxhighlight lang="xml"> | |||
<Buffer id="DI_8_0_buf"> | <Buffer id="DI_8_0_buf"> | ||
<Depth>10</Depth> | <Depth>10</Depth> | ||
</Buffer> | </Buffer> | ||
</syntaxhighlight> | |||
=== Element: Formula === | === Element: Formula === | ||
Line 344: | Line 591: | ||
*'''[[Gw_XML_setup#Element:_Buffer | Buffer]]''' | *'''[[Gw_XML_setup#Element:_Buffer | Buffer]]''' | ||
*'''[[Gw_XML_setup#Element:_MxValue | MxValue]]''' | *'''[[Gw_XML_setup#Element:_MxValue | MxValue]]''' | ||
*'''[[Gw_XML_setup#Element:_Filter | Filter]]''' | |||
*'''[[Gw_XML_setup#Element:_Expression | Expression]]''' | |||
Attribute: type - This defines the result type of formula. Possible choices DI, AI, CN | Attribute: type - This defines the result type of formula. Possible choices DI, AI, CN | ||
==== Element: Expression ==== | |||
Element name '''Expression''' may be abbreviated as '''Exp''' | |||
Element name '''Operation''' may be abbreviated as '''O''' | |||
Elements '''a''' and '''b''' are current expressions inputs. | |||
{| class="wikitable sortable" | |||
|- | |||
! Operation !! operand count !! example !! description | |||
|- | |||
| and || ∞, a<sub>1</sub> a<sub>2</sub> ... a<sub>n</sub> || a<sub>1</sub> ∧ a<sub>2</sub> ∧ a<sub>n</sub> | |||
|- | |||
| or || ∞, a<sub>1</sub> a<sub>2</sub> ... a<sub>n</sub> || a<sub>1</sub> ∨ a<sub>2</sub> ∨ a<sub>n</sub> | |||
|- | |||
| add || ∞, a<sub>1</sub> a<sub>2</sub> ... a<sub>n</sub> || a<sub>1</sub> + a<sub>2</sub> + a<sub>n</sub> | |||
|- | |||
| sub || ∞, a<sub>1</sub> a<sub>2</sub> ... a<sub>n</sub> || a<sub>1</sub> − a<sub>2</sub> − a<sub>n</sub> | |||
|- | |||
| not || 1, a || !a | |||
|- | |||
| sqr || 1, a || a² | |||
|- | |||
| sqrt || 1, a || √a | |||
|- | |||
| sin || 1, a || sin(a) | |||
|- | |||
| cos || 1, a || cos(a) | |||
|- | |||
| tan || 1, a || tan(a) | |||
|- | |||
| arcsin || 1, a || arcsin(a) | |||
|- | |||
| arccos || 1, a || arccos(a) | |||
|- | |||
| arctan || 1, a || arctan(a) | |||
|- | |||
| sec || 1, a || 1 / cos(a) | |||
|- | |||
| cosec || 1, a || 1 / sin(a) | |||
|- | |||
| cotan || 1, a || 1 / tan(a) | |||
|- | |||
| log || 1, a || log<sub>e</sub>(a) || The natural logarithm is the base-e logarithm, the inverse of the natural exponential function (exp) | |||
|- | |||
| log10 || 1, a || log<sub>10</sub>(a) || Returns the common (base-10) logarithm of x | |||
|- | |||
| exp || 1, a || exp(a) || Returns the base-e exponential function of x, which is the '''e''' number raised to the power x. | |||
|- | |||
| mul || 2, a b || a*b | |||
|- | |||
| div || 2, a b || a/b | |||
|- | |||
| pow || 2, a b || a^b | |||
|- | |||
| xor || 2, a b || a⊕b | |||
|- | |||
| eq || 2, a b || a = b || Check equality | |||
|- | |||
| lt || 2, a b || a < b || Less than | |||
|- | |||
| gt || 2, a b || a > b || Greater than | |||
|} | |||
===== example 1: or ===== | |||
f = a<sub>1</sub> ∨ a<sub>2</sub> | |||
<syntaxhighlight lang="xml"> | |||
<Expression> | |||
<Operation>or<Operation/> | |||
<a>Buffer</a> | |||
<a>MxValue</a> | |||
<Filter /> | |||
</Expression> | |||
</syntaxhighlight> | |||
===== example 2: power ===== | |||
f = a^b | |||
<syntaxhighlight lang="xml"> | |||
<Expression> | |||
<Operation>pow<Operation/> | |||
<a>Buffer</a> | |||
<b>Buffer</b> | |||
<Filter/> | |||
</Expression> | |||
</syntaxhighlight> | |||
==== Formula example 1 ==== | ==== Formula example 1 ==== | ||
f = @1 or @2 | f = @1 or @2 | ||
<syntaxhighlight lang="xml"> | |||
<Formula type="DI" id="DI_f0" comment="Virtual1 OK"> | |||
<MxValue id="DI_f0_value"/> | <MxValue id="DI_f0_value"/> | ||
<Buffer id="DI_f0_0_0_buf" | <Buffer id="DI_f0_0_0_buf" /> <!-- @1 --> | ||
<Buffer id="DI_f0_0_1_buf" /> <!-- @2 --> | |||
<Expression> <!-- @1 or @2 --> | |||
<Buffer id="DI_f0_0_1_buf"> | |||
< | |||
<O>or<O/> | <O>or<O/> | ||
<a>DI_f0_0_0_buf<a | <a>DI_f0_0_0_buf</a> | ||
<a>DI_f0_0_1_buf<a/> | <a>DI_f0_0_1_buf</a> | ||
<Filter ref="DI_f0_filter" /> | |||
</Expression> | |||
<Filter id="DI_f0_filter" class="Change"> <!-- result filter --> | |||
<Filter class="UpdateValue"> | |||
<Target ref="DI_f0_value"/> | |||
<Filter class="AddToBuffer" /> | |||
</Filter> | </Filter> | ||
</Filter> | </Filter> | ||
</Formula> | |||
</syntaxhighlight> | |||
'''DI_f0_0_0_buf''' and '''DI_f0_0_1_buf''' are inputs to formula. | '''DI_f0_0_0_buf''' and '''DI_f0_0_1_buf''' are inputs to formula. | ||
Line 378: | Line 711: | ||
f = (@1 + @2) / (@3 + @4) | f = (@1 + @2) / (@3 + @4) | ||
<Formula type="DI" id="DI_f0" comment="formula example f = (@1 + @2) / (@3 + @4)"> | <syntaxhighlight lang="xml"> | ||
<MxValue id="DI_f0_value"/> | <Formula type="DI" id="DI_f0" comment="formula example 2, f = (@1 + @2) / (@3 + @4)"> | ||
<MxValue id="DI_f0_value"/> <!-- This variable holds the latest value of formula --> | |||
<Buffer id="DI_f0_1_buf" /> <!-- @1 --> | <Buffer id="DI_f0_1_buf" /> <!-- @1 --> | ||
<Buffer id="DI_f0_2_buf" /> <!-- @2 --> | <Buffer id="DI_f0_2_buf" /> <!-- @2 --> | ||
Line 386: | Line 720: | ||
<Buffer id="DI_f0_t1_buf" /> <!-- temporary result of @1 + @2 --> | <Buffer id="DI_f0_t1_buf" /> <!-- temporary result of @1 + @2 --> | ||
<Buffer id="DI_f0_t2_buf" /> <!-- temporary result of @2 + @3 --> | <Buffer id="DI_f0_t2_buf" /> <!-- temporary result of @2 + @3 --> | ||
< | <Expression> <!-- @1 + @2 --> | ||
<O>add</O> | <O>add</O> | ||
<a>DI_f0_1_buf</a> <!-- @1 --> | <a>DI_f0_1_buf</a> <!-- @1 --> | ||
Line 393: | Line 727: | ||
<Target ref="DI_f0_t1_buf"/> | <Target ref="DI_f0_t1_buf"/> | ||
</Filter> | </Filter> | ||
</ | </Expression> | ||
< | <Expression> <!-- @3 + @4 --> | ||
<O>add</O> | <O>add</O> | ||
<a>DI_f0_3_buf</a> <!-- @3 --> | <a>DI_f0_3_buf</a> <!-- @3 --> | ||
Line 401: | Line 735: | ||
<Target ref="DI_f0_t2_buf"/> | <Target ref="DI_f0_t2_buf"/> | ||
</Filter> | </Filter> | ||
</ | </Expression> | ||
< | <Expression> <!-- f = (@1 + @2) / (@3 + @4) --> | ||
<O>div</O> | <O>div</O> | ||
<a>DI_f0_t1_buf</a> <!-- @1 + @2 --> | <a>DI_f0_t1_buf</a> <!-- @1 + @2 --> | ||
<a>DI_f0_t2_buf</a> <!-- @3 + @4 --> | <a>DI_f0_t2_buf</a> <!-- @3 + @4 --> | ||
<Filter ref=" | <Filter ref="di_f0_filter" /> | ||
</ | </Expression> | ||
<Filter id=" | <Filter id="di_f0_filter" class="AddToBuffer"> <!-- result filter --> | ||
<Target ref=" | <Target ref="DI_SCADA_buf"/> | ||
</Filter> | </Filter> | ||
</Formula> | </Formula> | ||
</syntaxhighlight> | |||
==== Formula example 3 ==== | |||
Comparison with constant | |||
f = @1 < 3,5 | |||
<syntaxhighlight lang="xml"> | |||
<Formula type="DI" id="DI_f0" comment="Formula example 3, constant, f = @1 < 3,5"> | |||
<MxValue id="DI_f0_value"/> <!-- latest value of formula --> | |||
<Buffer id="AI_f0_0_0_buf" /> <!-- @1 --> | |||
<Expression> <!-- @1 < 3,5 --> | |||
<O>lt<O/> | |||
<a>AI_f0_0_0_buf</a> | |||
<b><MxValue>3.5</MxValue></b> | |||
<Filter ref="DI_f0_filter" /> | |||
</Expression> | |||
<Filter id="DI_f0_filter" class="Change"> <!-- result filter --> | |||
<Filter class="UpdateValue"> | |||
<Target ref="DI_f0_value"/> | |||
<Filter class="AddToBuffer" /> | |||
</Filter> | |||
</Filter> | |||
</Formula> | |||
</syntaxhighlight> | |||
== Element: Interfaces == | == Element: Interfaces == | ||
Line 417: | Line 777: | ||
Has at least one '''Interface''' element. | Has at least one '''Interface''' element. | ||
<syntaxhighlight lang="xml"> | |||
< | <Interface name="eth0"> | ||
<IpAddress>192.168.0.111</IpAddress> | |||
<Netmask>255.255.255.0</Netmask> | |||
<Gateway>192.168.0.1</Gateway> | |||
</ | </Interface> | ||
</syntaxhighlight> | |||
=== VLAN === | === VLAN === | ||
Example with required elements. | Example with required elements. | ||
< | <syntaxhighlight lang="xml"> | ||
<VlanId> | <Vlan interface="eth0"> | ||
<VlanIngressQos> | <VlanId>10</VlanId> | ||
<VlanEgressQos> | <VlanIngressQos>4</VlanIngressQos> | ||
<IpIngressQos> | <VlanEgressQos>4</VlanEgressQos> | ||
<IpEgressQos> | <IpIngressQos>0</IpIngressQos> | ||
</ | <IpEgressQos>0</IpEgressQos> | ||
</Vlan> | |||
</syntaxhighlight> | |||
Example with additional elements from '''Interface''' | Example with additional elements from '''Interface''' | ||
< | <syntaxhighlight lang="xml"> | ||
<VlanId> | <Vlan interface="eth0"> | ||
<VlanIngressQos> | <VlanId>131</VlanId> | ||
<VlanEgressQos> | <VlanIngressQos>4</VlanIngressQos> | ||
<IpIngressQos> | <VlanEgressQos>4</VlanEgressQos> | ||
<IpEgressQos> | <IpIngressQos>0</IpIngressQos> | ||
<IpAddress> | <IpEgressQos>0</IpEgressQos> | ||
<Netmask> | <IpAddress>172.18.0.11</IpAddress> | ||
<Gateway> | <Netmask>255.255.255.0</Netmask> | ||
</ | <Gateway>172.18.0.254</Gateway> | ||
</Vlan> | |||
</syntaxhighlight> |
Latest revision as of 11:09, 31 August 2012
Element: Setup
The XML setup starts with the tag Setup. The entire setup is contained in this element.
All id attributes must be unique!
This element contains:
- Element: Device
- At least one element of this type.
- Attribute: device
- If more than one Device element available. This attribute specifies the id of the Device to use as current setup.
<Setup device="Telem-Gw6-1">
<Device id="Telem-Gw6-1" />
<Device id="Gw1" />
<Device id="Gw2" />
</Setup>
Element: Device
This element contains setup for a specific device. This might be Gw itself or some substation device or SCADA device.
This element contains:
- Element: Channel
- Element: Protocol
- Element: Objects
- Element: Interfaces
- Attribute: id
- Used for element identification
Child elements of Device when used as GW device
<Device id="Telem-Gw6-1">
<Channel />
<Interfaces />
</Device>
Child elements of Device when used as the device we're connecting to.
<Device id="DI-24T-1">
<Protocol />
<Objects />
</Device>
Element: Channel
This element contains:
- Element: Port
- If more than one Port is specified, they are for redundancy.
- Element: Device
- Element: Objects
<Channel id="DI-24T-1">
<Port />
<Device />
<Objects />
</Channel>
Element: Protocol
<Protocol comment="protocol8" id="prot_8_0">
<Address />
<CommunicationDelay unit="millisecond">0</CommunicationDelay>
<PollingTimeout unit="millisecond">500</PollingTimeout>
<TimeSync />
<TimeoutRemoveCount>5</TimeoutRemoveCount>
<TimeoutRemoveTime unit="second">20</TimeoutRemoveTime>
<ReplaceTime>false</ReplaceTime>
<GeneralInterrogationForwarding>false</GeneralInterrogationForwarding>
<Type SubVersion="0" isMaster="false">IEC101UnBalanced</Type>
</Protocol>
Element: TimeSync
Timesync interval and correction setup
<TimeSync isEnabled="true">
<Interval unit="second">30</Interval>
<Correction />
</TimeSync>
Element: Correction
Possible timesync correction types:
- Absolute
- Timesync message shall always be modified by this amount.
- ConnectionSpeed
- Baudrate based(only when using serial port)
<Correction>
<Absolute enabled="true" unit="millisecond">0</Absolute>
<ConnectionSpeed enabled="true"/>
</Correction>
Element: Address
This element can refer to protocol address or some specific object address.
Address for protocol
This elements contents depend on the protocol selected
Iec-10x
<Address>
<LinkAddress>1</LinkAddress>
<LinkAddressLength>1</LinkAddressLength>
<AsduAddress>1</AsduAddress>
<AsduAddressLength>2</AsduAddressLength>
<ObjectAddressLength>2</ObjectAddressLength>
</Address>
MODBUS
Value: integer
<Address>2</Address>
IEC62056-21
Value: string
Can be empty if only one device on channel.
<Address id="0.0.0">addr123</Address>
If this Address element contains attribute id, It shall be used for device verification.
Address of object
Iec-101/104
Value: integer
<Address index="0">10</Address>
attribute index is unnecessary if value==0
Iec-103
<Address fnCode="3" infoNr="6"/>
SPA-Bus
Kas standardis on dataType või dataCode vastava välja nimetus?
Väärtuse 1234 oleks ka võibolla mõistlik attribuuti dataNumber tõsta
Kas DI'l index on kasutused?
DI
<Address index="3" onEvent="6" offEvent="6" channelNumber="6" dataType="I">1234</Address>
Alternatiiv:
<Address onEvent="6" offEvent="6" channelNumber="6" dataCode="I" dataNumber="1234" />
AI
<Address channelNumber="6" dataType="I">1234</Address>
Alternatiiv:
<Address channelNumber="6" dataCode="I" dataNumber="1234" />
CN
<Address channelNumber="6" dataType="I">1234</Address>
Alternatiiv:
<Address channelNumber="6" dataCode="I" dataNumber="1234" />
IEC61580/IEC62056-21
Value: string
<Address>5.3.5</Address>
Other
Other protocols might have additional fields.
Element: Port
<Port>
<Buffer id="inBuffer"/>
<Buffer id="outBuffer"/>
<IoBuffer in="inBuffer" out="outBuffer"/>
</Port>
Port data forwarding
It is possible to send data from one port to another.
To do that, port1's input buffer is the same as port2's outputbuffer and vice versa.
<Port id="port1">
<Buffer id="portBufferIn"/>
<Buffer id="portBufferOut"/>
<IoBuffer in="portBufferIn" out="portBufferOut"/>
</Port>
<Port id="port2">
<IoBuffer in="portBufferOut" out="portBufferIn"/>
</Port>
The same method allows creation of a local loopback.
<Port id="portLoopback">
<Buffer id="portBuffer"/>
<IoBuffer in="portBuffer" out="portBuffer"/>
</Port>
Serial port
<Port class="SerialPortSetup">
<BaudRate>9600</BaudRate>
<DataBits>8</DataBits>
<StopBits>1</StopBits>
<Parity>none</Parity>
<FlowControl>none</FlowControl>
</Port>
TCP/IP server
<Port class="TcpIpServerSetup">
<PortNumber>80</PortNumber>
<ClientIpMask>0.0.0.0</ClientIpMask>
<Interface>eth0</Interface>
</Port>
Element: ClientIpMask
Defines who is allowed to connect with us. More than one possible.
TCP/IP client
<Port class="TcpIpClientSetup" name="16">
<PortNumber>502</PortNumber>
<IpAddress>10.0.0.89</IpAddress>
<Interface>eth0</Interface>
</Port>
Virtual port
They are ports 3-5 on GW6.
<Port class="VirtualPortSetup">
<Port class="SerialPortSetup">
<BaudRate>9600</BaudRate>
<DataBits>8</DataBits>
<StopBits>1</StopBits>
<Parity>none</Parity>
<FlowControl>none</FlowControl>
</Port>
</Port>
Element: Objects
Element: Object
Depending on protocol the object belongs to (master/slave), has different child elements.
Possible child elements:
Attribute: type
Defines object type.
Possible values:
- DI
- AI
- CN
- DO
- AO
Element: MxValue
Defines the object for current/latest value.
Child elements define default value, flags and time tag.
<MxValue id="DI_6_value">
<Value>0</Value>
<BitMask>
<Bit>Invalid</Bit>
<Bit>NotTopical</Bit>
</BitMask>
</MxValue>
Element: Filter
Defines what is going to happen to the incoming measured value.
Filters can be daisy chained. To achieve different outcomes.
When an event is received, it is sent to it's filter. After the filter does what it's supposed to do, it will pass the event to the Next Filter
<Filter class="Change">
<Filter class="Proxy" />
</Filter>
AddToBuffer
AddToBuffer may have more than one Target.
Target is a Buffer object.
<Filter class="AddToBuffer">
<Target ref="DI_0_7_buf"/>
<Target ref="DI_1_7_buf"/>
<Target ref="DI_2_7_buf"/>
<Target ref="DI_3_7_buf"/>
<Target ref="DI_4_7_buf"/>
</Filter>
Assert
Passes event to the next filter only if specified target(MxValue) == false.
Possible use cases:
- Respond negatively to control commands
- Signal blocking
<Filter class="Assert">
<Ref>DI_7_value<Ref/>
</Filter>
Change
Detects change in Digital measurments value and status bits.
Deadband
Used to detect change in analog and counter values
<Filter class="Deadband">
<Type>X</Type>
[...]
</Filter>
- Type
- Default is Deadband1, if Deadband1 then element Type is unnecessary
Integral
New deadband type, not implemented.
Absolute
This deadband is used for counter values.
f = abs( new_value - current_value ) > Threshold
- Threshold
- Integer value
- If value=0; then no need for filter
<Filter class="Deadband">
<Type>Absolute</Type>
<Threshold>X</Threshold>
</Filter>
Deadband1/Legacy
This is the legacy GW6 deadband mode This deadband is used for analog values.
if( (new_value < Critical.min) || (new_value > Critical.max) ) { current_threshold = Threshold.db2 } else { current_threshold = Threshold.db1 } if ( new_value.is_normalized ) calculated_threshold = current_threshold / 100 else calculated_threshold = (Scale.max - Scale.min) * current_threshold / 100 f = abs( new_value - current_value ) > calculated_threshold
- If Threshold.db1=0 and Threshold.db2=0, do not add Deadband filter.
- Element Scale
- Unneccessary when Scale.min=0 and Scale.max=0
- If Critical.min=0 and Critical.max=0, following elements/attrbutes are not neccessary
- Element Critical
- Attribute "db2" of element "Threshold"
Example 1
Both DB1 and DB2 active
<Filter class="Deadband">
<Scale min="1" max="4" />
<Threshold db1="2" db2="2" />
<Critical min="2" max="3" />
</Filter>
Example 2
Works only on normalized values ( no element Scale )
DB2 inactive
<Filter class="Deadband">
<Threshold db1="2"/>
</Filter>
Example 3
Works on normalized and floating point values
DB2 inactive
<Filter class="Deadband">
<Scale min="1" max="4" />
<Threshold db1="2"/>
</Filter>
Fallback
Falls back to specified value.
Normalize
This filter is used for converting floating point value to normalized value.
This filter works only on floating point values. Normalized values shall be passed on without change
<Filter class="Normalize">
<To>-1...1</To>
<Max>100</Max>
<Min>10</Min>
</Filter>
Element To has two possible value: -1...1 or 0...1 and this selects the formula and overflow conditions being used.
Range -1...1
normalized_value=float_value/Max
overflow is set when normalized_value < -1 && normalized_value > 1
No element Min for this range
Range 0...1
normalized_value=(float_value-Min)/(Max-Min)
overflow is set when normalized_value < 0 && normalized_value > 1
Inversion
Inverts the passed digital value..
If-else
Input: digital value
This is not final!
<Filter class="IfElse">
<True>
<Filter class="AddToBuffer">
<Target ref="DO_device_output1_buf"/>
</Filter>
</True>
<False>
<Filter class="AddToBuffer">
<Target ref="DO_device_output2_buf"/>
</Filter>
</False>
</Filter>
OutputController
This filter is used with Formulas when output controlling is needed.
- Count
- Default value if count not specified, 1
- Number of output commands
- Integer: 1...X ( X = uint32_t )
- String: inf ( infinity, if Count is not convertable to integer, then inifinity is used)
- Retry
- time to wait before retry/next command
- default value if not specified, 5 seconds
- FirstControl
- Defines if first control operation is allowed
<Filter class="OutputController">
<Count>1</Count>
<Retry unit="second">5</Retry>
<FirstControl>1</FirstControl>
<Filter class="Assert">
<Ref>DO_device_status</Ref>
<Filter class="AddToBuffer">
<Target ref="DO_device_output1_buf"/>
</Filter>
</Filter>
</Filter>
Proxy
Proxy may have more than one next Filter.
<Filter class="Proxy">
<Filter class="AddToBuffer" />
<Filter class="AddToBuffer" />
<Filter class="Fallback" />
</Filter>
Scale
This filter works only on normalized values. Non-normalized(floating point) values shall be passed on without change
scaled_value=normalized_value*(Max-Min)+Min
<Filter class="Scale">
<Max>100</Max>
<Min>10</Min>
</Filter>
If element Min=0 then no need to define that element, value 0 is used as default for Min. Element Max must always exist. Element To is not used.
CsvLogger
??? kas teha filtrina või mõni muu lahendus?
UpdateValue
Target is a MxValue object.
<Filter class="UpdateValue">
<Target ref="DI_7_value"/>
</Filter>
Square
SquareRoot
Sine
Cosine
Tangent
Cotangent
f = 1 / tan(x)
Secant
f = 1 / cos(x)
Cosecant
f = 1 / sin(x)
log
log10
exp
Element: Buffer
Defines a buffer object, with depth.
<Buffer id="DI_8_0_buf">
<Depth>10</Depth>
</Buffer>
Element: Formula
Possible child elements:
Attribute: type - This defines the result type of formula. Possible choices DI, AI, CN
Element: Expression
Element name Expression may be abbreviated as Exp
Element name Operation may be abbreviated as O
Elements a and b are current expressions inputs.
Operation | operand count | example | description |
---|---|---|---|
and | ∞, a1 a2 ... an | a1 ∧ a2 ∧ an | |
or | ∞, a1 a2 ... an | a1 ∨ a2 ∨ an | |
add | ∞, a1 a2 ... an | a1 + a2 + an | |
sub | ∞, a1 a2 ... an | a1 − a2 − an | |
not | 1, a | !a | |
sqr | 1, a | a² | |
sqrt | 1, a | √a | |
sin | 1, a | sin(a) | |
cos | 1, a | cos(a) | |
tan | 1, a | tan(a) | |
arcsin | 1, a | arcsin(a) | |
arccos | 1, a | arccos(a) | |
arctan | 1, a | arctan(a) | |
sec | 1, a | 1 / cos(a) | |
cosec | 1, a | 1 / sin(a) | |
cotan | 1, a | 1 / tan(a) | |
log | 1, a | loge(a) | The natural logarithm is the base-e logarithm, the inverse of the natural exponential function (exp) |
log10 | 1, a | log10(a) | Returns the common (base-10) logarithm of x |
exp | 1, a | exp(a) | Returns the base-e exponential function of x, which is the e number raised to the power x. |
mul | 2, a b | a*b | |
div | 2, a b | a/b | |
pow | 2, a b | a^b | |
xor | 2, a b | a⊕b | |
eq | 2, a b | a = b | Check equality |
lt | 2, a b | a < b | Less than |
gt | 2, a b | a > b | Greater than |
example 1: or
f = a1 ∨ a2
<Expression>
<Operation>or<Operation/>
<a>Buffer</a>
<a>MxValue</a>
<Filter />
</Expression>
example 2: power
f = a^b
<Expression>
<Operation>pow<Operation/>
<a>Buffer</a>
<b>Buffer</b>
<Filter/>
</Expression>
Formula example 1
f = @1 or @2
<Formula type="DI" id="DI_f0" comment="Virtual1 OK">
<MxValue id="DI_f0_value"/>
<Buffer id="DI_f0_0_0_buf" /> <!-- @1 -->
<Buffer id="DI_f0_0_1_buf" /> <!-- @2 -->
<Expression> <!-- @1 or @2 -->
<O>or<O/>
<a>DI_f0_0_0_buf</a>
<a>DI_f0_0_1_buf</a>
<Filter ref="DI_f0_filter" />
</Expression>
<Filter id="DI_f0_filter" class="Change"> <!-- result filter -->
<Filter class="UpdateValue">
<Target ref="DI_f0_value"/>
<Filter class="AddToBuffer" />
</Filter>
</Filter>
</Formula>
DI_f0_0_0_buf and DI_f0_0_1_buf are inputs to formula.
Formula example 2
f = (@1 + @2) / (@3 + @4)
<Formula type="DI" id="DI_f0" comment="formula example 2, f = (@1 + @2) / (@3 + @4)">
<MxValue id="DI_f0_value"/> <!-- This variable holds the latest value of formula -->
<Buffer id="DI_f0_1_buf" /> <!-- @1 -->
<Buffer id="DI_f0_2_buf" /> <!-- @2 -->
<Buffer id="DI_f0_3_buf" /> <!-- @3 -->
<Buffer id="DI_f0_4_buf" /> <!-- @4 -->
<Buffer id="DI_f0_t1_buf" /> <!-- temporary result of @1 + @2 -->
<Buffer id="DI_f0_t2_buf" /> <!-- temporary result of @2 + @3 -->
<Expression> <!-- @1 + @2 -->
<O>add</O>
<a>DI_f0_1_buf</a> <!-- @1 -->
<a>DI_f0_2_buf</a> <!-- @2 -->
<Filter class="AddToBuffer">
<Target ref="DI_f0_t1_buf"/>
</Filter>
</Expression>
<Expression> <!-- @3 + @4 -->
<O>add</O>
<a>DI_f0_3_buf</a> <!-- @3 -->
<a>DI_f0_4_buf</a> <!-- @4 -->
<Filter class="AddToBuffer">
<Target ref="DI_f0_t2_buf"/>
</Filter>
</Expression>
<Expression> <!-- f = (@1 + @2) / (@3 + @4) -->
<O>div</O>
<a>DI_f0_t1_buf</a> <!-- @1 + @2 -->
<a>DI_f0_t2_buf</a> <!-- @3 + @4 -->
<Filter ref="di_f0_filter" />
</Expression>
<Filter id="di_f0_filter" class="AddToBuffer"> <!-- result filter -->
<Target ref="DI_SCADA_buf"/>
</Filter>
</Formula>
Formula example 3
Comparison with constant
f = @1 < 3,5
<Formula type="DI" id="DI_f0" comment="Formula example 3, constant, f = @1 < 3,5">
<MxValue id="DI_f0_value"/> <!-- latest value of formula -->
<Buffer id="AI_f0_0_0_buf" /> <!-- @1 -->
<Expression> <!-- @1 < 3,5 -->
<O>lt<O/>
<a>AI_f0_0_0_buf</a>
<b><MxValue>3.5</MxValue></b>
<Filter ref="DI_f0_filter" />
</Expression>
<Filter id="DI_f0_filter" class="Change"> <!-- result filter -->
<Filter class="UpdateValue">
<Target ref="DI_f0_value"/>
<Filter class="AddToBuffer" />
</Filter>
</Filter>
</Formula>
Element: Interfaces
Network setup
Has at least one Interface element.
<Interface name="eth0">
<IpAddress>192.168.0.111</IpAddress>
<Netmask>255.255.255.0</Netmask>
<Gateway>192.168.0.1</Gateway>
</Interface>
VLAN
Example with required elements.
<Vlan interface="eth0">
<VlanId>10</VlanId>
<VlanIngressQos>4</VlanIngressQos>
<VlanEgressQos>4</VlanEgressQos>
<IpIngressQos>0</IpIngressQos>
<IpEgressQos>0</IpEgressQos>
</Vlan>
Example with additional elements from Interface
<Vlan interface="eth0">
<VlanId>131</VlanId>
<VlanIngressQos>4</VlanIngressQos>
<VlanEgressQos>4</VlanEgressQos>
<IpIngressQos>0</IpIngressQos>
<IpEgressQos>0</IpEgressQos>
<IpAddress>172.18.0.11</IpAddress>
<Netmask>255.255.255.0</Netmask>
<Gateway>172.18.0.254</Gateway>
</Vlan>