Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
ezeio2:expref:start [2019-06-25 19:05] – johpar | ezeio2:expref:start [2022-11-16 23:50] (current) – [Field expressions] andreh | ||
---|---|---|---|
Line 1: | Line 1: | ||
===== Expressions ===== | ===== Expressions ===== | ||
+ | {{indexmenu_n> | ||
Within the configuration of an ezeio, mathematical expressions are used to produce a value/ | Within the configuration of an ezeio, mathematical expressions are used to produce a value/ | ||
Line 7: | Line 8: | ||
** Purpose ** - Show the value of register 8 on device 2: | ** Purpose ** - Show the value of register 8 on device 2: | ||
- | r(2,8) | + | '' |
</ | </ | ||
Line 17: | Line 18: | ||
Enter the following in the " | Enter the following in the " | ||
- | (r(3, | + | '' |
</ | </ | ||
Line 25: | Line 26: | ||
=== Functions & Operators === | === Functions & Operators === | ||
- | Many of the valid functions and operators will be familiar to you, such as +, -, >, <, and =. Others come from advanced mathematics and logic, such as sin(), tan(), ||, and &&. Another category relates specifically to eze System terms and functions, such as Day() and K2F. | + | Many of the valid functions and operators will be familiar to you, such as +, -, >, <, and =. Others come from advanced mathematics and logic, such as sin(), tan(), ||, and &&. Another category relates specifically to eze System terms and functions, such as Day() and K2F(). |
=== Syntax === | === Syntax === | ||
- | The syntax structure of eze System expressions follows | + | The syntax structure of eze System expressions follows |
- | === Rules === | + | For example, 2+3*4 equals 2+(3*4) or 14, since multiplication takes precedence over addition. |
- | The mathematical rules governing eze System expressions follows excepted mathematical and logic standards with the exception of Boolean | + | |
+ | === Boolean | ||
+ | |||
+ | Any value greater than 0 is considered 'true'. | ||
+ | |||
+ | 0 and all negative | ||
+ | |||
+ | The result of a condition, such as (f(1)> | ||
| | ||
+ | ==== Field expressions ==== | ||
+ | |||
+ | The Data Expression box under Field configuration determines the value of the field. | ||
+ | |||
+ | If left blank, the field value is not updated by the system, and will simply remain the same until changed by the user manually or by a script using the SetField function. | ||
+ | |||
+ | The most common field expression simply takes the value of a register and applies it to the field. | ||
+ | <code javascript> | ||
+ | |||
+ | A single expression can reference other fields and registers. | ||
+ | <code javascript> | ||
+ | r(1,1) * 100 - 50 // multiply the value of register 1 on device 1 with 100 and subtract 50 | ||
+ | abs(f(10)-f(12)) | ||
+ | Uptime()/ | ||
+ | </ | ||
+ | |||
+ | The Data Expression is evaluated at a fixed rate of 10 times per second (100ms interval). This can be used to create counters and accumulators. | ||
+ | |||
+ | === Example: Run-time counter === | ||
+ | |||
+ | If our Field #1 monitors the current draw of a device, and the device is considered running if the current exceeds 5A, we can use this expression to count the total run-time in seconds in field #2: | ||
+ | |||
+ | Field #2 Data expression: | ||
+ | <code javascript> | ||
+ | |||
+ | Starting with the condition '' | ||
+ | |||
+ | This way we've implemented a run-time counter. | ||
+ | |||
+ | === Example: Total volume accumulator === | ||
+ | |||
+ | Assume our Field #1 holds the output of a flow sensor, in L/s (Liters per second). | ||
+ | |||
+ | We want out Field #2 to reflect the total amount in Liters. | ||
+ | |||
+ | Field #2 Data expression: | ||
+ | <code javascript> | ||
+ | |||
+ | We simply add 1/10th of the value of the momentary flow to our accumulator f(2). | ||
+ | |||
+ | === Example: kWh from kW === | ||
+ | |||
+ | In this example, field 1 holds our momentary power in kW. We want to accumulate this into energy (kWh) over time. | ||
+ | |||
+ | Field #2 Data expression: | ||
+ | <code javascript> | ||
+ | |||
+ | Since we are looking for kW-hours, we need to divide the momentary power with 36000 (3600 seconds in an hour, and we are re-evaluating 10 times per second). | ||
+ | |||
+ | === Example: Signal filter === | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | <code javascript> | ||
+ | |||
+ | Knowing that the expression evaluated 10 times per second, we are keeping 99% of the value, and adding 1% from the signal every 100ms. Thus the response time for this filter is about 7s for a 3dB (50%) response. | ||
+ | ==== Reverse expressions ==== | ||
+ | |||
+ | The reverse expression on the field is only relevant if the register referenced in the Data Expression is writable. | ||
+ | |||
+ | In most cases, the reverse expression can be left blank, and the ezeio will use the value from the field unchanged to write back to the register. Note also that the " | ||
+ | |||
+ | The reverse expression can be useful if there is math to scale the register value in the Data Expression. For example if we have a read & writable register with a temperature scaled x100 (so 4567 is 45.67 degrees), we would have a data expression like this: | ||
+ | < | ||
+ | Now if the user want to set the temperature, | ||
+ | < | ||
+ | The macro " | ||
+ | |||
+ | === Example: Simple control with Reverse expression === | ||
+ | |||
+ | In combination with the " | ||
+ | |||
+ | When Continuous Write is checked, the reverse expression is evaluated every 100ms (10 times per second). | ||
+ | |||
+ | Assuming the Field is tied to a relay output in the Data Expression, we can use this to implement a simple control function by using the following expression: | ||
+ | < | ||
+ | This expression will look at field #1, and if it's larger than 40, it returns 100. If 40 or less, it returns 0. The result will directly control the relay, actuating it if the value of field 1 exceeds 40. | ||
+ | |||