diff --git a/docs/FunctionBlocks/FB_INPUT_PUSHBUTTON_DIMMER_MQTT.md b/docs/FunctionBlocks/FB_INPUT_PUSHBUTTON_DIMMER_MQTT.md index 776153f..a902ff4 100644 --- a/docs/FunctionBlocks/FB_INPUT_PUSHBUTTON_DIMMER_MQTT.md +++ b/docs/FunctionBlocks/FB_INPUT_PUSHBUTTON_DIMMER_MQTT.md @@ -30,7 +30,7 @@ METHOD(S) - `Qos_Dimm`: datatype *SD_MQTT.QoS*, MQTT QoS of the DIM MQTT events. - `Delta_Dimm`: datatype *INT*, resolution of the MQTT DIM events. For example: specifying value *5* will configure the FB to only emit an MQTT event when the DIM output differs *5* or more than its previous value. Note that the last value of output DIM (when input `PB` becomes low again) is always published. Even if the resolution delta hasn't been reached yet. This way the last DIM value published through MQTT is always synchronized with the DIM output of the FB. -- ConfigureDimmer: configures the dimmer with your prefered configurations, an overview of the parameters and their default values: +- ConfigureFunctionBlock: configures the dimmer with your prefered configurations, an overview of the parameters and their default values: - `T_Debounce`: debounce time for input PB, defaults to 10ms. - `T_Reconfig`: reconfiguration time, defaults to 10S. - `T_On_Max`: start limitation, defaults to 0ms. diff --git a/docs/FunctionBlocks/FB_OUTPUT_DIMMER_MQTT.md b/docs/FunctionBlocks/FB_OUTPUT_DIMMER_MQTT.md index 65d66a7..c63c8ed 100644 --- a/docs/FunctionBlocks/FB_OUTPUT_DIMMER_MQTT.md +++ b/docs/FunctionBlocks/FB_OUTPUT_DIMMER_MQTT.md @@ -1,7 +1,7 @@ ## FB_OUTPUT_DIMMER_MQTT ### __General__ -Can be controlled using pulses from [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md), maintains output state through powercycles. +Can be controlled using pulses from [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md), maintains output state through powercycles. Takes a 0-255 byte value as input -as FB input or MQTT value-. Byte input value is linearly scaled to a word datatype value with a range from 0-32767. Output linear scaled range can be configured to be different from 0-32767 if desired. ### __Block diagram__ @@ -9,7 +9,6 @@ Can be controlled using pulses from [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBU INPUT(S) - SINGLE: input to connect to one or multiple `SINGLE` from one or multiple [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md). -- DOUBLE: input to connect to one or multiple `DOUBLE` from one or multiple [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md). - LONG: input to connect to one or multiple `LONG` from one or multiple [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md). - P_LONG: input to connect to one or multiple `P_LONG` from one or multiple [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md). - PRIO_HIGH: when high the output `Q` is set to high with a maximum brightness, has priority over the other inputs. @@ -18,12 +17,10 @@ INPUT(S) - SET: input for switching output DIM to input VAL value. - RST: input to switch of the output. -INPUT/OUTPUT(S) -- OUT: dimmer value, byte datatype. - OUTPUT(S) -- Q: output. -- DBL: double-click output. +- Q: output, bool datatype. +- OUT: dimmer value, word datatype. +- Q_OUT: follows 'OUT' when Q is high. Equal to 0 when Q is low. METHOD(S) - InitMQTT: enables MQTT events on the FB, an overview of the parameters: @@ -34,7 +31,7 @@ METHOD(S) - `Qos_Dimm`: datatype *SD_MQTT.QoS*, MQTT QoS of the DIM MQTT events. - `Delta_Dimm`: datatype *INT*, resolution of the MQTT OUT events. For example: specifying value *5* will configure the FB to only emit an MQTT event when the OUT output differs *5* or more than its previous value. Note that the last value of output OUT (when input `P_LONG` becomes low again) is always published. Even if the resolution delta hasn't been reached yet. This way the last OUT value published through MQTT is always synchronized with the OUT output of the FB. -- ConfigureDimmer: configures the dimmer with your prefered configurations, an overview of the parameters and their default values: +- ConfigureFunctionBlock: configures the dimmer with your prefered configurations, an overview of the parameters and their default values: - `T_Debounce`: debounce time for input PB, defaults to 10ms. - `T_Reconfig`: reconfiguration time, defaults to 10S. - `T_On_Max`: start limitation, defaults to 0ms. @@ -42,21 +39,21 @@ METHOD(S) - `T_Dimm`: time for a dimming ramps, defaults to 3s. - `Min_On`: minimum value of output OUT at startup, defaults to 50. - `Max_On`: maximum value of output OUT at startup, defaults to 255. - - `Soft_Dimm`: if TRUE dimming begins after ON and at 0. - - `Dbl_Toggle`: if TRUE the output DBL is inverted at each double-click, defaults to FALSE. + - `Soft_Dimm`: if TRUE dimming begins after ON and at 0, defaults to TRUE. - `Rst_Out`: if input Rst is TRUE, ouput OUT is set to 0, defaults to FALSE. + - `OUT_LinearScaleMin`: Lower bound value used for linear scaleout output OUT from datatype byte to word. Defaults to 0. + - `OUT_LinearScaleMax`: Upper bound value used for linear scaleout output OUT from datatype byte to word. Defaults to 32767. - PublishReceived: callback method called by the callbackcollector when a message is received on the subscribed topic by the callbackcollector. ### __Function Block Behaviour__ The following table shows the operating status of the dimmer: -| SINGLE/DOUBLE/LONG/P_LONG | SET | RST | Q | DIR (*) | DBL | OUT | -|:-------------|:------------------|:------------------|:------------------|:------------------|:------------------|:------------------| -| SINGLE | 0 | 0 | NOT Q | OUT < 127 | - | LIMIT(MIN_ON,OUT,MAX_ON) -| DOUBLE | 0 | 0 | - | - | TOG PULSE | -| LONG/P_LONG | 0 | 0 | ON | NOT DIR | - | Ramp up or down depending on DIR, start at 0 when soft_dimm = TRUE and Q = 0, reverse direction if 0 or 255 is reached -| 0 | 1 | 0 | ON | OUT < 127 | - | VAL -| 0 | 0 | 1 | OFF | UP | OFF | 0 when RST_OUT = TRUE +| SINGLE/LONG/P_LONG | SET | RST | Q | DIR (*) | OUT | Q_OUT | +|:-------------|:------------------|:------------------|:------------------|:------------------|:---------------------------------------|:------------------| +| SINGLE | 0 | 0 | NOT Q | OUT < 127 | LIMIT(MIN_ON,OUT,MAX_ON) | Q * OUT +| LONG/P_LONG | 0 | 0 | ON | NOT DIR | Ramp up or down depending on DIR, start at 0 when soft_dimm = TRUE and Q = 0, reverse direction if 0 or 255 is reached | OUT +| 0 | 1 | 0 | ON | OUT < 127 | VAL | OUT +| 0 | 0 | 1 | OFF | UP | 0 when RST_OUT = TRUE | 0 (*): DIR refers to the direction of the dimmer output `OUT`, indicating whether the dimmer output value changes up-or downwards. @@ -68,7 +65,6 @@ Requires method call `InitMQTT` to enable MQTT capabilities. | Event | Description | MQTT payload | QoS | Retain flag | Published on startup | |:-------------|:------------------|:------------------|:------------------|:--------------------------|:--------------------------| | **Output changes: Q** | A change is detected on output `Q`. (*) | `TRUE/FALSE` | 2 | `TRUE` | no -| **Output changes: DBL** | A change is detected on output `DBL`. (*) | `TRUE/FALSE` | 2 | `TRUE` | no | **Output changes: OUT** | A change is detected on output `OUT`. (*) | `0-255` | configured in method call `InitMQTT` | `TRUE` | no (*): MQTT publish topic is a concatenation of the publish prefix variable, the function block name and the name of the output. @@ -108,17 +104,48 @@ FB_AO_DIMMER_001.InitMQTT(MQTTPublishPrefix:= ADR(MqttPubDimmerPrefix), (* p ``` The MQTT publish topic in this code example will be `WAGO-PFC200/Out/Dimmers/FB_AO_DIMMER_001` (MQTTPubSwitchPrefix variable + function block name). The subscription topic will be `WAGO-PFC200/In/Dimmers/FB_AO_DIMMER_001` (MQTTSubSwitchPrefix variable + function block name). -- checking for events to switch the digital output (cyclic): +- ConfigureFunctionBlock (called once during startup): +``` +FB_AO_DIMMER_001.ConfigureFunctionBlock( + T_Debounce:=T#10MS, + T_Reconfig:=T#10S, + T_On_Max:=T#0S, + T_Dimm_Start:=T#400MS, + T_Dimm:=T#3S, + Min_On:=50, + Max_On:=255, + Soft_Dimm:=TRUE, + Rst_Out:=FALSE, + OUT_LinearScaleMin:=11000, + OUT_LinearScaleMax:=32767 +); +``` +The dimmer behavior in the example above is adjusted to start dimming from '11000' instead of the default '0' value. This can be important as different dimming devices will have different lower bound 'on' voltages. In addition, depending on your PLC device, the maximum out value will differ. Note that this method only requires a call when it's desired to change the default behavior characteristics. + +- checking for events to switch the digital output (cyclic), example 1: ``` FB_AO_DIMMER_001(SINGLE:= FB_DI_PB_041.SINGLE, (* for toggling the output Q *) - DOUBLE:= FB_DI_PB_041.DOUBLE, (* for controlling the output DBL *) LONG:= FB_DI_PB_041.LONG, (* for controlling the dimmer output OUT *) P_LONG:= FB_DI_PB_041.P_LONG, (* for controlling the dimmer output OUT *) Q=> DO_001, (* couple the function block to the physical digital output *) - OUT:= AO_001 (* couple the function block to the physical anolog output *) + OUT:= AO_001, (* couple the function block to the physical anolog output *) + VAL:= 255, (* value to set on output OUT when input SET is high *) + SET:= FB_DI_PB_041.DOUBLE (* when high, VAL is set on output OUT *) +); +``` +The above illustrates an integration with [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md). The dimmer module in this example has a 'on/off' digital input that is wired to the 'Q' output of the dimmer & a 0/1-10V analog input that is wired to the 'OUT' output of the dimmer. + +- checking for events to switch the digital output (cyclic), example 2: +``` +FB_AO_DIMMER_001(SINGLE:= FB_DI_PB_041.SINGLE, (* for toggling the output Q *) + LONG:= FB_DI_PB_041.LONG, (* for controlling the dimmer output OUT *) + P_LONG:= FB_DI_PB_041.P_LONG, (* for controlling the dimmer output OUT *) + Q_OUT:= AO_001, (* couple the function block to the physical anolog output *) + VAL:= 255, (* value to set on output OUT when input SET is high *) + SET:= FB_DI_PB_041.DOUBLE (* when high, VAL is set on output OUT *) ); ``` -The above illustrates an integration with [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md) as well. +The above illustrates an integration with [FB_INPUT_PUSHBUTTON_MQTT](./FB_INPUT_PUSHBUTTON_MQTT.md). The dimmer module in this example has a 0/1-10V analog input that is wired to the 'Q_OUT' output of the dimmer. ### __Home Assistant YAML__ To integrate with Home Assistant use the YAML code below in your [MQTT lights](https://www.home-assistant.io/components/light.mqtt/) config: diff --git a/docs/FunctionBlocks/FB_RS485_BUSCONTROLLER.md b/docs/FunctionBlocks/FB_RS485_BUSCONTROLLER.md index 600e865..9808312 100644 --- a/docs/FunctionBlocks/FB_RS485_BUSCONTROLLER.md +++ b/docs/FunctionBlocks/FB_RS485_BUSCONTROLLER.md @@ -14,8 +14,8 @@ METHOD(S) - Init: configures the buscontroller, an overview of the parameters: - `StartupDelay`: datatype *TIME*, amount of time that should be waited on PLC startup before using the RS485 bus, can prevent errors due to RS485 devices not booted up yet. - `SilenceTime`: datatype *TIME*, the silence time between two requests. Typically 10-20ms. -- SetBusOccupied: can be called by any RS485 to indicate that it is using the RS485 bus. -- ReleaseBus: can be called by any RS485 to indicate that it is done using the RS485 bus. +- SetBusOccupied: can be called by any RS485 function block to indicate that it is using the RS485 bus. +- ReleaseBus: can be called by any RS485 function block to indicate that it is done using the RS485 bus. ### __Code example__ diff --git a/docs/_drawio/FB_OUTPUT_DIMMER_MQTT.drawio b/docs/_drawio/FB_OUTPUT_DIMMER_MQTT.drawio index 8a135f4..81517f5 100644 --- a/docs/_drawio/FB_OUTPUT_DIMMER_MQTT.drawio +++ b/docs/_drawio/FB_OUTPUT_DIMMER_MQTT.drawio @@ -1 +1 @@ -7Vpbd6I6FP41PnqWEOLl0Vtt17TTdtqemc6LiyVROSLYgLf59ScJCQQSV9UR2jXMk/DtsBO//e2wk1AD/eVuhO3V/C5wkFczG86uBgY10zQapkV+KLKPEdgxY2CGXYc3SoEn9xcST3J07ToozDSMgsCL3FUWnAS+jyZRBrMxDrbZZtPAy/a6smdIAZ4mtqei310nmsdoGzZS/Bq5s7no2Whwy9IWjTkQzm0n2EoQGNZAHwdBFF8td33kUfIEL/FzVwesycAw8qNjHlj+bIy+3Cybwx/3Y/jfAo4XJqxzLxvbW/M/zAcb7QUD27kboaeVPaH3WxLlGujNo6VH7gxyaYermPepu0Okq546LtEJwhHaSRAf5wgFSxThPWkirIIzLhpTkLpNQ2AJbC7Rn4A2D/ss8Z0yQy44OScQZSpEXfXG9y/PDy/P48HN3d3w2/ju8flZYY/84yhHmOfOfHI9IfwgTIBp4Edc+Aa4DIGm0foHvkuh2YAqhaAoBsH7UkO+06U5S+78wEdZ3o6mCTmZlFZJkiiAGhEJDCPPjtxNdiLQ0cJ7eAhcMpLDIrZyzIbBGk8Qf0pO3Jyj9jt+IhvPUKT4IUzae6nZijYITx9vGvPYY6qAhNLzRWEponi6+Tq6HR6RR2GEgwXqB16AU71MXc/LQSLfPDSlHmgSuWR+73J46ToO7aSnm+dwsPYdOqsNGsUkqkI6UNO0rdGoWVSWwoplKVQC0BEz56l5CpvvurpQqh4edKHJ2qy6NtpnzuCKMvKOitJFu4QpvK2o4rGA2RvH0f1k07dlfbLpu6NJ0aZHiXPcTSYmzbc1XXn0aGjqnOUuzRk2ysRMrmb8l7kJV7YvsEHvVsBksLJFglm/Aq2qLFofLAuxmi5HF2RZ9FcXx+gCGOXpIgp/XLVnjzv8/Au0kNH1Hus/K1/tgTyz577RFUcnv9EzcTzttawNrTbl/+TYKkup1tmVfH7FrXoqas3dunQhr9eGuuyuljaAcSltaDwVpI20p2K1UbV3gsIzvJg2VE9FaQOWow11B+Df7q0ij4rs1VklVvX6cLSUcDwNjzmC+CPDAT+6mDbUnRC2EqpoOGB54bDc3aZzh9fd0Stc4E3wdr1YVP68STkLPfMtpvgp6B0m+rnUG0wriqoXvtaFDiEVP0WJ4sKHkFpRVL3itc4918iLoqBjjUPjLVQUaqk7uH/p0ZNpecNTs3FK1VCf2kvX28c7p8RkL1dMFwBYVDrI2yD66lYsrHVf94yNXds73D60/bAeIuxOKcQMbBwhkyUdRWO1S0ysQKiHcYVAjX7AygTN7i7Mf9sFCYcUZR8uJXeCU8hYJciAXtPRQUojJLF6r62RtBWpc5YbM3UTxy6xiC8LhDkOXWJmdRm5izObwga7laszirL8p4a0QsvAcZVGIVanUShbqVETr9WoUarWqCUOBEwrNgo24g7FPMMGBxgm/du4VDuGz8SUUJnOQZCmXdpS4r6xl1gGEh7PWomtLZn47JU+J9lI+if4TOo/H2h2m0RbBrMa5O0UsR44iahmWV7mUZR2XlXXrLf3X0dVDUeZJ0DacKhr1odxpQPy0ctW3Ql+PhSkFvBnBzmTQnQJgmD2Q1IImwpBhoYgoyiCjjnYKpUhq5VlCIgt9BIYam3BZDTtvUad9WtrY03fOr32MR91n7GeyS1eNKR9lvVMcjj7m+sZxU9B6xnRz6XWM1pRmFUXxblH/XlR/PZJ/2njLVQU6h7pw7ebe1IAfFen1E/7/ldm6qNUeGhvocQv+LQhUXcoWUiub0bXVY0J6BQWkxpfREpZlS4fwfB/ \ No newline at end of file +7Vpbd6I6FP41PvYsIKD4qK1V19S2Vntm2hcXSyIyIrExXjq/foImckm6vAyhc8p5Ej7CTvz2t3d2Eirger5tY2cx7SEXBhVDc7cVcFMxDN2wNfoTIe8M0UF9j3jYdxkWAwP/F2Qge9Fb+S5cphoShALiL9LgGIUhHJMU5mCMNulmExSke104HhSAwdgJRPS775LpHrUtLcY70PemvGddY0/mDm/MgOXUcdEmAYFWBVxjhMj+ar69hkHEHudl/97tB08PA8MwJKe8MH/V2t+682rrx8PI+jmzRjPDumJW1k6wYn+YDZa8cwY2U5/AwcIZR/cb6uYKaE7JPKB3Or10los97xN/C2lXTXFcvBOICdwmIDbONkRzSPA7bXLQDeOMqcbgpG5iF4Aqw6YJ+g+gw9zuHWzHzNALRs4ZRBkCUbfN0cPz8PF5OLrp9nqtp1GvPxwK7NF/TDKEBb4X0usx5QdiCkxQSJjwdZAPgYZe+8c6SqGhWRIKVTEIjksNhm4jill6F6IQpnk7mSbopkJaJClBgSUREccwDBzir9OJQEYL6+ER+XQkH4vYzDC7RCs8huytZOBmDNlH7BAHe5AIdiiTznui2SJqsDx/vLHP9xZjBRwovVwUpiCKQfe+fdc6IY6WBKMZvEYBwrFeJn4QZCAebwGcRBaiIPJpfm8weO67btRJU5bnMFqFbpTVbjQ1gSqQDsQwtSUaNVRFqVWyKDWz0cXrk3Oj1BI8mTGUU5h+NGClYWoLqugriFC89+5fFqKm9peFKC+NUzFaDSLmXH+dckr1bRWVl83IN1eM5kYUNLthHh7TK4/97swsF07IsX5U5fAHdLzJZwl41zNHy6qMWnHKIMsft7bX3+LhL1CDeiPoX73+n7xrdV72/nH6Fk2dncBTvjwvC0vdq4vV0tf2r1Ad2TmV0Fk7qkpoO98SWq6KskV9lmWgX1iy2UfsKFIF70etKqqCKv5t3CmYmv8TyyqzwJpN7o6a4I5B65Tdoq/pjs8ulHRxQbOrcsvpDksvzh2mv13Xe3jVaL9YM7xGb53ZrPRbg8C6uG7NzmGiJVWz2KGnvOYxqTTKXvIe1ph/KAzBjiJZ8H6UiqLsFa8J8soXEkuqhAEKyRdinXX3cN8u68xe5I6U1B1infU4KrNDwGeXWvXjqZNg3wm9DzlLuCgPgqz0ObXFF64JgnQJQboqgqS765/JkAnSDAG+4VMAQ7UNGLcnzRdSX73U1ubkrd60T/lm5GvPvpfvMmdn3xw2mc8dc16zr1QaRsmlYWXz9oXCEOwokgXvR6koxNX941P3gZYB38XEWpIqoF5cFSB1ibiq3rmk0213SusTqzifaKBrfnvu3P20PLN1/zq7n5In6bSq7FT/K5/pCxqQKOXkM/0iC3apLNRMqZn58ySGPudMH1w6pWZP9AVDCs/z6W38Yfe+efx9PGj9Bg== \ No newline at end of file diff --git a/docs/_img/FB_OUTPUT_DIMMER_MQTT.svg b/docs/_img/FB_OUTPUT_DIMMER_MQTT.svg index 4bcafcd..71be6ea 100644 --- a/docs/_img/FB_OUTPUT_DIMMER_MQTT.svg +++ b/docs/_img/FB_OUTPUT_DIMMER_MQTT.svg @@ -1,3 +1,3 @@ -
FB_OUTPUT_DIMMER_MQTT
FB_OUTPUT_DIMMER_MQTT
SINGLE
SINGLE
Q
Q
DBL
[Not supported by viewer]
OUT
[Not supported by viewer]
VAL
VAL
SET
SET
OUT
OUT
DOUBLE%3CmxGraphModel%3E%3Croot%3E%3CmxCell%20id%3D%220%22%2F%3E%3CmxCell%20id%3D%221%22%20parent%3D%220%22%2F%3E%3CmxCell%20id%3D%222%22%20value%3D%22SINGLE%22%20style%3D%22text%3Bhtml%3D1%3BstrokeColor%3Dnone%3BfillColor%3Dnone%3Balign%3Dleft%3BverticalAlign%3Dmiddle%3BwhiteSpace%3Dwrap%3Brounded%3D0%3BfontSize%3D13%3B%22%20vertex%3D%221%22%20parent%3D%221%22%3E%3CmxGeometry%20x%3D%22120%22%20y%3D%22230%22%20width%3D%2280%22%20height%3D%2220%22%20as%3D%22geometry%22%2F%3E%3C%2FmxCell%3E%3C%2Froot%3E%3C%2FmxGraphModel%3E
[Not supported by viewer]
LONG
LONG
P_LONG
P_LONG
PRIO_LOW
PRIO_LOW
PRIO_HIGH
PRIO_HIGH
\ No newline at end of file +
FB_OUTPUT_DIMMER_MQTT
FB_OUTPUT_DIMMER_MQTT
SINGLE
SINGLE
Q
Q
Q_OUT
[Not supported by viewer]
VAL
VAL
SET
SET
OUT
OUT
LONG
LONG
P_LONG
P_LONG
PRIO_LOW
PRIO_LOW
PRIO_HIGH
PRIO_HIGH
OUT
[Not supported by viewer]
\ No newline at end of file diff --git a/src/CODESYSV3Export/HomeAutomation.export b/src/CODESYSV3Export/HomeAutomation.export index 0ee5066..1289960 100644 --- a/src/CODESYSV3Export/HomeAutomation.export +++ b/src/CODESYSV3Export/HomeAutomation.export @@ -1,7 +1,7 @@ - AAEAAAD/////AQAAAAAAAAAMAgAAAD1Db3JlLCBWZXJzaW9uPTMuNS4xNC4xMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAjXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLlByb2ZpbGUDAAAAHl9wbHVnSW5HdWlkVG9WZXJzaW9uQ29uc3RyYWludBZfcGx1Z0luR3VpZFRvRXh0ZW5zaW9uGl9wbHVnSW5HdWlkVG9FeHRlbnNpb25MaXN0BAQEPV8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9WZXJzaW9uQ29uc3RyYWludERpY3Rpb25hcnkCAAAAMF8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9Cb29sRGljdGlvbmFyeQIAAABAXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1Byb2ZpbGVFeHRlbnNpb25MaXN0RGljdGlvbmFyeQIAAAACAAAACQMAAAAJBAAAAAkFAAAABQMAAAA9XzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1ZlcnNpb25Db25zdHJhaW50RGljdGlvbmFyeQEAAAAYRGljdGlvbmFyeUJhc2UraGFzaHRhYmxlAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkGAAAABQQAAAAwXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb0Jvb2xEaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQcAAAAFBQAAAEBfM1MuQ29EZVN5cy5Db3JlLkNvbXBvbmVudHMuR3VpZFRvUHJvZmlsZUV4dGVuc2lvbkxpc3REaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQgAAAAEBgAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/OA8AAAoKCQIAAAkJAAAACQoAAAABBwAAAAYAAADsUTg/CAAAAAoKCwAAAAkLAAAACQwAAAABCAAAAAYAAADsUTg/FAAAAAoKEQAAAAkNAAAACQ4AAAAQCQAAAKkAAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAAJFQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJGwAAAAkcAAAACR0AAAAJHgAAAAkfAAAACSAAAAAJIQAAAAkiAAAACSMAAAAJJAAAAAklAAAACSYAAAAJJwAAAAkoAAAACSkAAAAJKgAAAAkrAAAACSwAAAAJLQAAAAkuAAAACS8AAAAJMAAAAAkxAAAACTIAAAAJMwAAAAk0AAAACTUAAAAJNgAAAAk3AAAACTgAAAAJOQAAAAk6AAAACTsAAAAJPAAAAAk9AAAACT4AAAAJPwAAAAlAAAAACUEAAAAJQgAAAAlDAAAACUQAAAAJRQAAAAlGAAAACUcAAAAJSAAAAAlJAAAACUoAAAAJSwAAAAlMAAAACU0AAAAJTgAAAAlPAAAACVAAAAAJUQAAAAlSAAAACVMAAAAJVAAAAAlVAAAACVYAAAAJVwAAAAlYAAAACVkAAAAJWgAAAAlbAAAACVwAAAAJXQAAAAleAAAACV8AAAAJYAAAAAlhAAAACWIAAAAJYwAAAAlkAAAACWUAAAAJZgAAAAlnAAAACWgAAAAJaQAAAAlqAAAACWsAAAAJbAAAAAltAAAACW4AAAAJbwAAAAlwAAAACXEAAAAJcgAAAAlzAAAACXQAAAAJdQAAAAl2AAAACXcAAAAJeAAAAAl5AAAACXoAAAAJewAAAAl8AAAACX0AAAAJfgAAAAl/AAAACYAAAAAJgQAAAAmCAAAACYMAAAAJhAAAAAmFAAAACYYAAAAJhwAAAAmIAAAACYkAAAAJigAAAAmLAAAACYwAAAAJjQAAAAmOAAAACY8AAAAJkAAAAAmRAAAACZIAAAAJkwAAAAmUAAAACZUAAAAJlgAAAAmXAAAACZgAAAAJmQAAAAmaAAAACZsAAAAJnAAAAAmdAAAACZ4AAAAJnwAAAAmgAAAACaEAAAAJogAAAAmjAAAACaQAAAAJpQAAAAmmAAAACacAAAAJqAAAAAmpAAAACaoAAAAJqwAAAAmsAAAACa0AAAAJrgAAAAmvAAAACbAAAAAJsQAAAAmyAAAACbMAAAAJtAAAAAm1AAAACbYAAAAJtwAAABAKAAAAqQAAAAm4AAAACbkAAAAJugAAAAm6AAAACbsAAAAJvAAAAAm9AAAACb4AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnAAAAACcEAAAAJwgAAAAnDAAAACcQAAAAJugAAAAm6AAAACcYAAAAJugAAAAnIAAAACboAAAAJugAAAAnKAAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnMAAAACboAAAAJugAAAAnOAAAACc8AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnRAAAACdIAAAAJugAAAAm6AAAACboAAAAJugAAAAnUAAAACboAAAAJugAAAAnWAAAACboAAAAJugAAAAm6AAAACboAAAAJ2AAAAAnZAAAACdoAAAAJ2wAAAAncAAAACd0AAAAJugAAAAm6AAAACd8AAAAJugAAAAnhAAAACboAAAAJugAAAAm6AAAACeMAAAAJ5AAAAAm6AAAACboAAAAJugAAAAnmAAAACboAAAAJ6AAAAAm6AAAACeoAAAAJugAAAAm6AAAACewAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACe4AAAAJ7wAAAAm6AAAACboAAAAJ8QAAAAnyAAAACfMAAAAJ9AAAAAm6AAAACfYAAAAJ9wAAAAn4AAAACboAAAAJ+gAAAAm6AAAACboAAAAJugAAAAm6AAAACfwAAAAJ/QAAAAn+AAAACf8AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACQEBAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJAwEAAAm6AAAACQUBAAAJBgEAAAm6AAAACQgBAAAJugAAAAkKAQAACQsBAAAJugAAAAm6AAAACboAAAAJugAAAAkNAQAACboAAAAJugAAAAm6AAAACQ8BAAAJEAEAAAm6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AAAOAAAAHgAAAAE9AQAAIAEAAAMAAAAFAAAADgAAAB4AAAABPgEAACABAAADAAAABQAAAA4AAAAKAAAAAT8BAAAgAQAAAwAAAAUAAAAOAAAAAAAAAAFAAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABQQEAACABAAADAAAABQAAAA4AAAAeAAAAAUIBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFDAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABRAEAACABAAADAAAABQAAAA4AAAAKAAAAAUUBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFGAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABRwEAACABAAADAAAABQAAAA4AAAAKAAAAAUgBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFJAQAAIAEAAAMAAAAFAAAADgAAABQAAAABSgEAACABAAADAAAABQAAAA4AAAAeAAAAAUsBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFMAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABTQEAACABAAADAAAABQAAAA4AAAAKAAAAAU4BAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFPAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABUAEAACABAAADAAAABQAAAA4AAAAeAAAAAVEBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFSAQAAIAEAAAMAAAAFAAAADgAAABQAAAABUwEAACABAAADAAAABQAAAA4AAAAeAAAAAVQBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFVAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABVgEAACABAAADAAAABQAAAA4AAAAeAAAAAVcBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFYAQAAIAEAAAMAAAAFAAAADgAAABQAAAABWQEAACABAAADAAAABQAAAA4AAAAAAAAAAVoBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFbAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXAEAACABAAADAAAABQAAAA4AAAAeAAAAAV0BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFeAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXwEAACABAAADAAAABQAAAA4AAAAKAAAAAWABAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFhAQAAIAEAAAMAAAAFAAAADgAAABQAAAABYgEAACABAAADAAAABQAAAA4AAAAUAAAACw== + AAEAAAD/////AQAAAAAAAAAMAgAAAD1Db3JlLCBWZXJzaW9uPTMuNS4xNC4xMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAjXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLlByb2ZpbGUDAAAAHl9wbHVnSW5HdWlkVG9WZXJzaW9uQ29uc3RyYWludBZfcGx1Z0luR3VpZFRvRXh0ZW5zaW9uGl9wbHVnSW5HdWlkVG9FeHRlbnNpb25MaXN0BAQEPV8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9WZXJzaW9uQ29uc3RyYWludERpY3Rpb25hcnkCAAAAMF8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9Cb29sRGljdGlvbmFyeQIAAABAXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1Byb2ZpbGVFeHRlbnNpb25MaXN0RGljdGlvbmFyeQIAAAACAAAACQMAAAAJBAAAAAkFAAAABQMAAAA9XzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1ZlcnNpb25Db25zdHJhaW50RGljdGlvbmFyeQEAAAAYRGljdGlvbmFyeUJhc2UraGFzaHRhYmxlAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkGAAAABQQAAAAwXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb0Jvb2xEaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQcAAAAFBQAAAEBfM1MuQ29EZVN5cy5Db3JlLkNvbXBvbmVudHMuR3VpZFRvUHJvZmlsZUV4dGVuc2lvbkxpc3REaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQgAAAAEBgAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghI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AAAOAAAAHgAAAAE9AQAAIAEAAAMAAAAFAAAADgAAAB4AAAABPgEAACABAAADAAAABQAAAA4AAAAeAAAAAT8BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFAAQAAIAEAAAMAAAAFAAAADgAAAAAAAAABQQEAACABAAADAAAABQAAAA4AAAAeAAAAAUIBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFDAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABRAEAACABAAADAAAABQAAAA4AAAAKAAAAAUUBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFGAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABRwEAACABAAADAAAABQAAAA4AAAAKAAAAAUgBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFJAQAAIAEAAAMAAAAFAAAADgAAABQAAAABSgEAACABAAADAAAABQAAAA4AAAAeAAAAAUsBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFMAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABTQEAACABAAADAAAABQAAAA4AAAAKAAAAAU4BAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFPAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABUAEAACABAAADAAAABQAAAA4AAAAeAAAAAVEBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFSAQAAIAEAAAMAAAAFAAAADgAAABQAAAABUwEAACABAAADAAAABQAAAA4AAAAeAAAAAVQBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFVAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABVgEAACABAAADAAAABQAAAA4AAAAeAAAAAVcBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFYAQAAIAEAAAMAAAAFAAAADgAAABQAAAABWQEAACABAAADAAAABQAAAA4AAAAAAAAAAVoBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFbAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXAEAACABAAADAAAABQAAAA4AAAAeAAAAAV0BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFeAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXwEAACABAAADAAAABQAAAA4AAAAKAAAAAWABAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFhAQAAIAEAAAMAAAAFAAAADgAAABQAAAABYgEAACABAAADAAAABQAAAA4AAAAUAAAACw== True @@ -2901,7 +2901,7 @@ a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc - 637399350613762212 + 637406310018538402 None @@ -2923,11 +2923,6 @@ Q := PreviousQ; - - 339 - - DBL := PreviousDBL; - 334 @@ -2946,7 +2941,7 @@ 331 - IF rst_out THEN out := 0; END_IF; + IF rst_out THEN OUT_Internal := 0; END_IF; 332 @@ -2956,7 +2951,7 @@ 229 - dir := out > 127; + dir := OUT_Internal > 127; 323 @@ -2971,7 +2966,7 @@ 399 - OUT := 255; + OUT_Internal := 255; 325 @@ -3031,7 +3026,7 @@ 231 - out := val; + OUT_Internal := val; 232 @@ -3046,7 +3041,7 @@ 234 - dir := out > 127; + dir := OUT_Internal > 127; 235 @@ -3071,7 +3066,7 @@ 239 - IF Q THEN out := LIMIT(MAX(MIN_ON,1), out, MAX_ON); END_IF; + IF Q THEN OUT_Internal := LIMIT(MAX(OUT_Internal,1), OUT_Internal, MAX_ON); END_IF; 240 @@ -3081,7 +3076,7 @@ 241 - dir := out > 127; + dir := OUT_Internal > 127; 242 @@ -3101,7 +3096,7 @@ 245 - OUT := 1; + OUT_Internal := 1; 246 @@ -3116,12 +3111,12 @@ 248 - OUT := LIMIT(MAX(MIN_ON,1), out, MAX_ON); + OUT_Internal := LIMIT(MAX(MIN_ON,1), OUT_Internal, MAX_ON); 249 - DIR := out < 127; + DIR := OUT_Internal < 127; 250 @@ -3158,25 +3153,10 @@ END_IF; - - 257 - - - - - 258 - - (* set the double click output *) - 259 - IF NOT dbl_toggle THEN dbl := FALSE; END_IF; - - - 260 - - IF DOUBLE THEN dbl := NOT dbl; END_IF; + 261 @@ -3191,7 +3171,7 @@ 263 - dim(DIR := dir, e := P_LONG AND Q, TR := T_DIMM, rmp := out); + dim(DIR := dir, e := P_LONG AND Q, TR := T_DIMM, rmp := OUT_Internal); 264 @@ -3206,7 +3186,7 @@ 266 - IF out = 0 THEN + IF OUT_Internal = 0 THEN 267 @@ -3216,7 +3196,7 @@ 268 - ELSIF out = 255 THEN + ELSIF OUT_Internal = 255 THEN 269 @@ -3259,152 +3239,177 @@ END_IF; - 43 + 404 - 45 + 403 - IF ((ABS(BYTE_TO_INT(PreviousOUT) - BYTE_TO_INT(OUT)) >= Delta_Dimm) OR Startup AND OUT <> PreviousOUT OR Startup AND OutputDimmer) AND InitMqttDone THEN + (* Scale the internal OUT to the actual OUT *) - 52 + 406 - PreviousOUT:=OUT; + LIN_TRAFO( - 46 + 407 - pMqttPublishQueue^.AddMessage( + IN:= OUT_Internal, - 47 + 408 - Payload := BYTE_TO_STRING(OUT), + IN_MIN:= 0, - 48 + 409 - Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/OUT'), + IN_MAX:= 255, - 49 + 410 - Qos := SD_MQTT.QoS.ExactlyOnce, + OUT_MIN:=OUT_LinearScaleMin, - 50 + 411 - MqttRetain := TRUE + OUT_MAX:=OUT_LinearScaleMax - 51 + 405 ); - 44 + 412 + + OUT:= REAL_TO_WORD(LIN_TRAFO.OUT); + + + 420 + + IF Q THEN + + + 421 + + Q_OUT:= OUT; + + + 423 + + ELSE + + + 424 + + Q_OUT:= 0; + + + 422 END_IF - 54 + 43 - 55 + 45 - IF (Q <> PreviousQ OR Startup) AND InitMqttDone THEN + IF ((ABS(BYTE_TO_INT(PreviousOUT) - BYTE_TO_INT(OUT_Internal)) >= Delta_Dimm) OR Startup AND OUT_Internal <> PreviousOUT OR Startup AND OutputDimmer) AND InitMqttDone THEN - 56 + 52 - PreviousQ:=Q; + PreviousOUT:=OUT_Internal; - 57 + 46 - pMqttPublishQueue^.AddMessage( + pMqttPublishQueue^.AddMessage( - 58 + 47 - Payload := BOOL_TO_STRING(Q), + Payload := BYTE_TO_STRING(OUT_Internal), - 59 + 48 - Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/Q'), + Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/OUT'), - 60 + 49 - Qos := Qos_Dimm, + Qos := SD_MQTT.QoS.ExactlyOnce, - 61 + 50 MqttRetain := TRUE - 62 + 51 ); - 53 + 44 END_IF - 64 + 54 - 65 + 55 - IF (DBL <> PreviousDBL OR Startup) AND InitMqttDone THEN + IF (Q <> PreviousQ OR Startup) AND InitMqttDone THEN - 66 + 56 - PreviousDBL:=DBL; + PreviousQ:=Q; - 67 + 57 pMqttPublishQueue^.AddMessage( - 68 + 58 - Payload := BOOL_TO_STRING(DBL), + Payload := BOOL_TO_STRING(Q), - 69 + 59 - Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/DBL'), + Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/Q'), - 70 + 60 - Qos := SD_MQTT.QoS.ExactlyOnce, + Qos := Qos_Dimm, - 71 + 61 MqttRetain := TRUE - 72 + 62 ); - 63 + 53 END_IF @@ -3454,18 +3459,13 @@ SINGLE :BOOL; - - 314 - - DOUBLE :BOOL; - 316 LONG :BOOL; - 315 + 417 P_LONG :BOOL; @@ -3505,14 +3505,19 @@ VAR_OUTPUT - 173 + 217 - DBL :BOOL; + Q :BOOL; - 217 + 418 - Q :BOOL; + Q_OUT :WORD; + + + 425 + + OUT :WORD; 179 @@ -3524,11 +3529,6 @@ VAR_IN_OUT - - 219 - - OUT :BYTE; - 220 @@ -3554,6 +3554,31 @@ dir :BOOL; + + 402 + + OUT_Internal :BYTE; + + + 415 + + LIN_TRAFO :Util.LIN_TRAFO; + + + 416 + + OUT_LinearScaleMin :INT := 0; + + + 413 + + OUT_LinearScaleMax :INT := 32767; + + + 401 + + + 181 @@ -3669,11 +3694,6 @@ Soft_Dimm :BOOL:=TRUE; - - 211 - - Dbl_Toggle :BOOL:=FALSE; - 212 @@ -3724,11 +3744,6 @@ PreviousQ :BOOL; (* To retain output state through powercycles*) - - 355 - - PreviousDBL :BOOL; (* To retain output state through powercycles*) - 351 @@ -3737,7 +3752,7 @@ - 399 + 425 Standard False @@ -10868,7 +10883,7 @@ a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc - 637127811741201547 + 637402484223914936 @@ -10909,6 +10924,26 @@ THIS^.Max_On:=Max_On; + + 46 + + THIS^.Soft_Dimm:=Soft_Dimm; + + + 47 + + THIS^.Rst_Out:=Rst_Out; + + + 44 + + THIS^.OUT_LinearScaleMin:=OUT_LinearScaleMin; + + + 45 + + THIS^.OUT_LinearScaleMax:=OUT_LinearScaleMax; + @@ -10971,14 +11006,19 @@ Soft_Dimm :BOOL; - 41 + 37 - Dbl_Toggle :BOOL; + Rst_Out :BOOL; - 37 + 43 - Rst_Out :BOOL; + OUT_LinearScaleMin :INT; + + + 42 + + OUT_LinearScaleMax :INT; 38 @@ -11012,7 +11052,7 @@ a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc - 637138980861231760 + 637400791941182597 @@ -11186,7 +11226,7 @@ a9ed5b7e-75c5-4651-af16-d2c27e98cb94 3b83b776-fb25-43b8-99f2-3c507c9143fc - 637228862479365235 + 637400795071017330 @@ -11265,7 +11305,7 @@ 32 - THIS^.OUT:=STRING_TO_BYTE(Data.PayloadString^); + THIS^.OUT_Internal:=STRING_TO_BYTE(Data.PayloadString^); 34 @@ -15552,7 +15592,7 @@ - AAEAAAD/////AQAAAAAAAAAMAgAAAD1Db3JlLCBWZXJzaW9uPTMuNS4xNC4xMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAjXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLlByb2ZpbGUDAAAAHl9wbHVnSW5HdWlkVG9WZXJzaW9uQ29uc3RyYWludBZfcGx1Z0luR3VpZFRvRXh0ZW5zaW9uGl9wbHVnSW5HdWlkVG9FeHRlbnNpb25MaXN0BAQEPV8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9WZXJzaW9uQ29uc3RyYWludERpY3Rpb25hcnkCAAAAMF8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9Cb29sRGljdGlvbmFyeQIAAABAXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1Byb2ZpbGVFeHRlbnNpb25MaXN0RGljdGlvbmFyeQIAAAACAAAACQMAAAAJBAAAAAkFAAAABQMAAAA9XzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1ZlcnNpb25Db25zdHJhaW50RGljdGlvbmFyeQEAAAAYRGljdGlvbmFyeUJhc2UraGFzaHRhYmxlAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkGAAAABQQAAAAwXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb0Jvb2xEaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQcAAAAFBQAAAEBfM1MuQ29EZVN5cy5Db3JlLkNvbXBvbmVudHMuR3VpZFRvUHJvZmlsZUV4dGVuc2lvbkxpc3REaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQgAAAAEBgAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/OA8AAAoKCQIAAAkJAAAACQoAAAABBwAAAAYAAADsUTg/CAAAAAoKCwAAAAkLAAAACQwAAAABCAAAAAYAAADsUTg/FAAAAAoKEQAAAAkNAAAACQ4AAAAQCQAAAKkAAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAAJFQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJGwAAAAkcAAAACR0AAAAJHgAAAAkfAAAACSAAAAAJIQAAAAkiAAAACSMAAAAJJAAAAAklAAAACSYAAAAJJwAAAAkoAAAACSkAAAAJKgAAAAkrAAAACSwAAAAJLQAAAAkuAAAACS8AAAAJMAAAAAkxAAAACTIAAAAJMwAAAAk0AAAACTUAAAAJNgAAAAk3AAAACTgAAAAJOQAAAAk6AAAACTsAAAAJPAAAAAk9AAAACT4AAAAJPwAAAAlAAAAACUEAAAAJQgAAAAlDAAAACUQAAAAJRQAAAAlGAAAACUcAAAAJSAAAAAlJAAAACUoAAAAJSwAAAAlMAAAACU0AAAAJTgAAAAlPAAAACVAAAAAJUQAAAAlSAAAACVMAAAAJVAAAAAlVAAAACVYAAAAJVwAAAAlYAAAACVkAAAAJWgAAAAlbAAAACVwAAAAJXQAAAAleAAAACV8AAAAJYAAAAAlhAAAACWIAAAAJYwAAAAlkAAAACWUAAAAJZgAAAAlnAAAACWgAAAAJaQAAAAlqAAAACWsAAAAJbAAAAAltAAAACW4AAAAJbwAAAAlwAAAACXEAAAAJcgAAAAlzAAAACXQAAAAJdQAAAAl2AAAACXcAAAAJeAAAAAl5AAAACXoAAAAJewAAAAl8AAAACX0AAAAJfgAAAAl/AAAACYAAAAAJgQAAAAmCAAAACYMAAAAJhAAAAAmFAAAACYYAAAAJhwAAAAmIAAAACYkAAAAJigAAAAmLAAAACYwAAAAJjQAAAAmOAAAACY8AAAAJkAAAAAmRAAAACZIAAAAJkwAAAAmUAAAACZUAAAAJlgAAAAmXAAAACZgAAAAJmQAAAAmaAAAACZsAAAAJnAAAAAmdAAAACZ4AAAAJnwAAAAmgAAAACaEAAAAJogAAAAmjAAAACaQAAAAJpQAAAAmmAAAACacAAAAJqAAAAAmpAAAACaoAAAAJqwAAAAmsAAAACa0AAAAJrgAAAAmvAAAACbAAAAAJsQAAAAmyAAAACbMAAAAJtAAAAAm1AAAACbYAAAAJtwAAABAKAAAAqQAAAAm4AAAACbkAAAAJugAAAAm6AAAACbsAAAAJvAAAAAm9AAAACb4AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnAAAAACcEAAAAJwgAAAAnDAAAACcQAAAAJugAAAAm6AAAACcYAAAAJugAAAAnIAAAACboAAAAJugAAAAnKAAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnMAAAACboAAAAJugAAAAnOAAAACc8AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnRAAAACdIAAAAJugAAAAm6AAAACboAAAAJugAAAAnUAAAACboAAAAJugAAAAnWAAAACboAAAAJugAAAAm6AAAACboAAAAJ2AAAAAnZAAAACdoAAAAJ2wAAAAncAAAACd0AAAAJugAAAAm6AAAACd8AAAAJugAAAAnhAAAACboAAAAJugAAAAm6AAAACeMAAAAJ5AAAAAm6AAAACboAAAAJugAAAAnmAAAACboAAAAJ6AAAAAm6AAAACeoAAAAJugAAAAm6AAAACewAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACe4AAAAJ7wAAAAm6AAAACboAAAAJ8QAAAAnyAAAACfMAAAAJ9AAAAAm6AAAACfYAAAAJ9wAAAAn4AAAACboAAAAJ+gAAAAm6AAAACboAAAAJugAAAAm6AAAACfwAAAAJ/QAAAAn+AAAACf8AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACQEBAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJAwEAAAm6AAAACQUBAAAJBgEAAAm6AAAACQgBAAAJugAAAAkKAQAACQsBAAAJugAAAAm6AAAACboAAAAJugAAAAkNAQAACboAAAAJugAAAAm6AAAACQ8BAAAJEAEAAAm6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AAAOAAAAHgAAAAE9AQAAIAEAAAMAAAAFAAAADgAAAB4AAAABPgEAACABAAADAAAABQAAAA4AAAAKAAAAAT8BAAAgAQAAAwAAAAUAAAAOAAAAAAAAAAFAAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABQQEAACABAAADAAAABQAAAA4AAAAeAAAAAUIBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFDAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABRAEAACABAAADAAAABQAAAA4AAAAKAAAAAUUBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFGAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABRwEAACABAAADAAAABQAAAA4AAAAKAAAAAUgBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFJAQAAIAEAAAMAAAAFAAAADgAAABQAAAABSgEAACABAAADAAAABQAAAA4AAAAeAAAAAUsBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFMAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABTQEAACABAAADAAAABQAAAA4AAAAKAAAAAU4BAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFPAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABUAEAACABAAADAAAABQAAAA4AAAAeAAAAAVEBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFSAQAAIAEAAAMAAAAFAAAADgAAABQAAAABUwEAACABAAADAAAABQAAAA4AAAAeAAAAAVQBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFVAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABVgEAACABAAADAAAABQAAAA4AAAAeAAAAAVcBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFYAQAAIAEAAAMAAAAFAAAADgAAABQAAAABWQEAACABAAADAAAABQAAAA4AAAAAAAAAAVoBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFbAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXAEAACABAAADAAAABQAAAA4AAAAeAAAAAV0BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFeAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXwEAACABAAADAAAABQAAAA4AAAAKAAAAAWABAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFhAQAAIAEAAAMAAAAFAAAADgAAABQAAAABYgEAACABAAADAAAABQAAAA4AAAAUAAAACw== + AAEAAAD/////AQAAAAAAAAAMAgAAAD1Db3JlLCBWZXJzaW9uPTMuNS4xNC4xMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsBQEAAAAjXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLlByb2ZpbGUDAAAAHl9wbHVnSW5HdWlkVG9WZXJzaW9uQ29uc3RyYWludBZfcGx1Z0luR3VpZFRvRXh0ZW5zaW9uGl9wbHVnSW5HdWlkVG9FeHRlbnNpb25MaXN0BAQEPV8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9WZXJzaW9uQ29uc3RyYWludERpY3Rpb25hcnkCAAAAMF8zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5HdWlkVG9Cb29sRGljdGlvbmFyeQIAAABAXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1Byb2ZpbGVFeHRlbnNpb25MaXN0RGljdGlvbmFyeQIAAAACAAAACQMAAAAJBAAAAAkFAAAABQMAAAA9XzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb1ZlcnNpb25Db25zdHJhaW50RGljdGlvbmFyeQEAAAAYRGljdGlvbmFyeUJhc2UraGFzaHRhYmxlAxxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlAgAAAAkGAAAABQQAAAAwXzNTLkNvRGVTeXMuQ29yZS5Db21wb25lbnRzLkd1aWRUb0Jvb2xEaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQcAAAAFBQAAAEBfM1MuQ29EZVN5cy5Db3JlLkNvbXBvbmVudHMuR3VpZFRvUHJvZmlsZUV4dGVuc2lvbkxpc3REaWN0aW9uYXJ5AQAAABhEaWN0aW9uYXJ5QmFzZStoYXNodGFibGUDHFN5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGUCAAAACQgAAAAEBgAAABxTeXN0ZW0uQ29sbGVjdGlvbnMuSGFzaHRhYmxlBwAAAApMb2FkRmFjdG9yB1ZlcnNpb24IQ29tcGFyZXIQSGFzaENvZGVQcm92aWRlcghIYXNoU2l6ZQRLZXlzBlZhbHVlcwAAAwMABQULCBxTeXN0ZW0uQ29sbGVjdGlvbnMuSUNvbXBhcmVyJFN5c3RlbS5Db2xsZWN0aW9ucy5JSGFzaENvZGVQcm92aWRlcgjsUTg/OA8AAAoKCQIAAAkJAAAACQoAAAABBwAAAAYAAADsUTg/CAAAAAoKCwAAAAkLAAAACQwAAAABCAAAAAYAAADsUTg/FAAAAAoKEQAAAAkNAAAACQ4AAAAQCQAAAKkAAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAAJFQAAAAkWAAAACRcAAAAJGAAAAAkZAAAACRoAAAAJGwAAAAkcAAAACR0AAAAJHgAAAAkfAAAACSAAAAAJIQAAAAkiAAAACSMAAAAJJAAAAAklAAAACSYAAAAJJwAAAAkoAAAACSkAAAAJKgAAAAkrAAAACSwAAAAJLQAAAAkuAAAACS8AAAAJMAAAAAkxAAAACTIAAAAJMwAAAAk0AAAACTUAAAAJNgAAAAk3AAAACTgAAAAJOQAAAAk6AAAACTsAAAAJPAAAAAk9AAAACT4AAAAJPwAAAAlAAAAACUEAAAAJQgAAAAlDAAAACUQAAAAJRQAAAAlGAAAACUcAAAAJSAAAAAlJAAAACUoAAAAJSwAAAAlMAAAACU0AAAAJTgAAAAlPAAAACVAAAAAJUQAAAAlSAAAACVMAAAAJVAAAAAlVAAAACVYAAAAJVwAAAAlYAAAACVkAAAAJWgAAAAlbAAAACVwAAAAJXQAAAAleAAAACV8AAAAJYAAAAAlhAAAACWIAAAAJYwAAAAlkAAAACWUAAAAJZgAAAAlnAAAACWgAAAAJaQAAAAlqAAAACWsAAAAJbAAAAAltAAAACW4AAAAJbwAAAAlwAAAACXEAAAAJcgAAAAlzAAAACXQAAAAJdQAAAAl2AAAACXcAAAAJeAAAAAl5AAAACXoAAAAJewAAAAl8AAAACX0AAAAJfgAAAAl/AAAACYAAAAAJgQAAAAmCAAAACYMAAAAJhAAAAAmFAAAACYYAAAAJhwAAAAmIAAAACYkAAAAJigAAAAmLAAAACYwAAAAJjQAAAAmOAAAACY8AAAAJkAAAAAmRAAAACZIAAAAJkwAAAAmUAAAACZUAAAAJlgAAAAmXAAAACZgAAAAJmQAAAAmaAAAACZsAAAAJnAAAAAmdAAAACZ4AAAAJnwAAAAmgAAAACaEAAAAJogAAAAmjAAAACaQAAAAJpQAAAAmmAAAACacAAAAJqAAAAAmpAAAACaoAAAAJqwAAAAmsAAAACa0AAAAJrgAAAAmvAAAACbAAAAAJsQAAAAmyAAAACbMAAAAJtAAAAAm1AAAACbYAAAAJtwAAABAKAAAAqQAAAAm4AAAACbkAAAAJugAAAAm6AAAACbsAAAAJvAAAAAm9AAAACb4AAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAnAAAAACcEAAAAJwgAAAAnDAAAACcQAAAAJugAAAAnGAAAACboAAAAJyAAAAAm6AAAACcoAAAAJugAAAAm6AAAACcwAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACc4AAAAJugAAAAm6AAAACdAAAAAJ0QAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACdMAAAAJ1AAAAAm6AAAACboAAAAJugAAAAm6AAAACdYAAAAJugAAAAm6AAAACdgAAAAJugAAAAm6AAAACboAAAAJugAAAAnaAAAACdsAAAAJ3AAAAAndAAAACd4AAAAJ3wAAAAm6AAAACboAAAAJ4QAAAAm6AAAACeMAAAAJugAAAAm6AAAACboAAAAJ5QAAAAnmAAAACboAAAAJugAAAAm6AAAACegAAAAJugAAAAnqAAAACboAAAAJugAAAAm6AAAACboAAAAJ7AAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJ7gAAAAnvAAAACboAAAAJugAAAAnxAAAACfIAAAAJ8wAAAAn0AAAACboAAAAJ9gAAAAn3AAAACfgAAAAJugAAAAn6AAAACboAAAAJugAAAAm6AAAACboAAAAJ/AAAAAn9AAAACf4AAAAJ/wAAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJAQEAAAm6AAAACboAAAAJugAAAAm6AAAACboAAAAJugAAAAkDAQAACboAAAAJBQEAAAkGAQAACboAAAAJCAEAAAm6AAAACQoBAAAJCwEAAAm6AAAACboAAAAJugAAAAm6AAAACQ0BAAAJugAAAAm6AAAACboAAAAJDwEAAAkQAQAACboAAAAJEgEAAAm6AAAACboAAAAJFAEAAAkVAQAACRYBAAAJFwEAAAkYAQAACRkBAAAJGgEAAAkbAQAACboAAAAJHQEAAAm6AAAACboAAAAJugAAAAkfAQAAEAsAAAAAAAAAEAwAAAAAAAAAEA0AAAAAAAAAEA4AAAAAAAAABA8AAAALU3lzdGVtLkd1aWQLAAAAAl9hAl9iAl9jAl9kAl9lAl9mAl9nAl9oAl9pAl9qAl9rAAAAAAAAAAAAAAAIBwcCAgICAgICAkuli1Y4RtFKrxzdkgmpOf0BEAAAAA8AAADYHs3vt46STYUdRf4aRVt5AREAAAAPAAAAIXtqzCJz90eYFCHdSOGDvwESAAAADwAAAHXZ+y8yIDdHhO+tzzd/mboBEwAAAA8AAABdtgWP4cW4SpnS3w6epD9VARQAAAAPAAAArzjaVYrnrkaRW3aGZX9vrAEVAAAADwAAABRpvKWLVuxKiP1TqVUWp5sBFgAAAA8AAAC+0STHEHc0SJRqdhGJ6s+hARcAAAAPAAAAh6R6eiig+kOJSPX3s2B8VAEYAAAADwAAAOCHP5IfzMlOp1kLvqFayHsBGQAAAA8AAAAm/gYb0VP0RLV4Rzc+s+sbARoAAAAPAAAAu9b7MNETfECYXt8J3XMZQQEbAAAADwAAANb/6KOM5O1FmESB2V9x3wYBHAAAAA8AAACmGGtTndySRrlj7hn1c9mEAR0AAAAPAAAARbMwrsuqpEOP3kIUzFdiEQEeAAAADwAAAApa4BIm8WBKmHb6PANuaEEBHwAAAA8AAACWv41EsofDQZI8+wHpxU0OASAAAAAPAAAA4NfVXbOXrku+4kyJG3IcWwEhAAAADwAAAK8HyKwQpERGttE7gAIkvMkBIgAAAA8AAACoc9CJAYJiQb9Mf1/Vfq6sASMAAAAPAAAARvL3D3g7DEqdwZQQXd1WOwEkAAAADwAAAPfmkzRXXGZCqLBDhiwJMy8BJQAAAA8AAADuMM5rqsgUSZsZsAGZmV8lASYAAAAPAAAAy4t0EKH58U+lNEbnPM/phAEnAAAADwAAAFrslK+S/Y5Bp5G5e1inKgcBKAAAAA8AAACjUmovD/BYTYdJUXQjM1K0ASkAAAAPAAAAvuAhDVu2BUmCN/XWPsribwEqAAAADwAAADpHCGzJY1JJkqb/BpKJfekBKwAAAA8AAABtWngqRvXRR5EHa8qg8jLPASwAAAAPAAAABYPSXidBQEC/DoT/OEPdUAEtAAAADwAAABfSgSBpudFAsbsyEbMCQ5UBLgAAAA8AAAAD8LiIQnjPQ5Y1edtW5hTfAS8AAAAPAAAAIawFwRm1U0eZgrVBvLackQEwAAAADwAAAMWZJ0nG5xhDp5zHT8urVBkBMQAAAA8AAACiHYAijBBjRLbnQQy16GlXATIAAAAPAAAA+yn3tHxGOE2M63Cf0mK03gEzAAAADwAAAMofvqfA8SBOnTfFVe9hvRYBNAAAAA8AAAB+EuN+u2blRoc0MHZ8HimWATUAAAAPAAAAqbYUigpbQESIC6rR8KpkeAE2AAAADwAAABYlZYFnSYpPn/U24xUMYi0BNwAAAA8AAABBiEB5f0/0TpE/Y+ZNkp48ATgAAAAPAAAAxyjdQhaiqUGX5baKKM6i6wE5AAAADwAAAIL1Lul3Wq9DhfweaUn2nbMBOgAAAA8AAABT9V+nHp+YQrjXzaoD7QZlATsAAAAPAAAAC9Bk1ogeLEi/Gzn1BdwS1AE8AAAADwAAAJpFH7lMw0NBs/JFMeUdjBABPQAAAA8AAAB/3q+T4voESYE6w9JS0CaZAT4AAAAPAAAATGl03eQbgkSIqhfOYsuqygE/AAAADwAAAKOknxG6jZVFmG2qu6hwBSQBQAAAAA8AAADcfOTjvW4vR5CQgEEQTxXGAUEAAAAPAAAA0vnXkMkniUeCUGwYJitKDgFCAAAADwAAAGdfazO18hFMk9/YolvrsqgBQwAAAA8AAAAFdLXtFCRaTbn+klitTq4KAUQAAAAPAAAAiTY0fl+aqka/VlkDxO/sWQFFAAAADwAAANT/u7IHoVhKo9ucePUT2ckBRgAAAA8AAAA4Syrfz1bbT5svH0YRQx3RAUcAAAAPAAAANXW1wbfwn0Gbdkak+DC3cAFIAAAADwAAAAQo9GZPa1dEm8Pc5wnC+3IBSQAAAA8AAAA17NZjrDbGQrfN5GWu0kxRAUoAAAAPAAAAoFEPntrRzEKrcAlDWNuqgQFLAAAADwAAAMCiJTp5XDtIjJwMflp6B10BTAAAAA8AAACdVnsQw8ngTqJr9bW3LKh4AU0AAAAPAAAAxiH7prHvh0mmvPLcF1LCVAFOAAAADwAAAFetem2aFkJJvONaMNIFeuwBTwAAAA8AAABGVM2vFEnnT7t4m//rcP0XAVAAAAAPAAAA8R6IQvQjlEOBhjYX2xAyrAFRAAAADwAAAJOCos90zKdAvf3dJMH69dkBUgAAAA8AAACwi6thbesIQL3mG8U4fhZUAVMAAAAPAAAAPWmx8MpY806nn9PLkj/wMAFUAAAADwAAAMFQzGO/qqhMllSzgiwjESYBVQAAAA8AAAAY1n5wEwfmSabWu9KH/riOAVYAAAAPAAAA4muOv6hDoUWKJFN3bi081AFXAAAADwAAAER+gHokGvFJl5kVTdJTrI4BWAAAAA8AAAAvRYAmQ8QIQoiTBrbFrcVbAVkAAAAPAAAAnkOrNyOEKEiflhtZhJwkmwFaAAAADwAAAIZ56O00ja9LhlMqjTEnCIkBWwAAAA8AAACtAd9BUlipRaRyPJ26X8M9AVwAAAAPAAAAeC+n0RNIoUiG0JEzSGXwTwFdAAAADwAAAFTFaVet5v5BqvyqciscjhMBXgAAAA8AAAB7yohcoAZlTLyOoleMF+g5AV8AAAAPAAAAbbU7rphbBkeMtlv+qgCt4AFgAAAADwAAACVdycBZfR5DqfQsrrlh+BIBYQAAAA8AAACzvpnL1EE2RqPcdFymwIvMAWIAAAAPAAAAidIy2QpPdk+w520D96fndgFjAAAADwAAAI76W05I1RJAti5zn7+0uecBZAAAAA8AAABytpA8zmWYSbTRn1yjrPQeAWUAAAAPAAAAUi1b1RwP2k6hCewZolRJeAFmAAAADwAAAPw05f4FrX1FgY0BTNJZxA8BZwAAAA8AAACDaDxBP/QgSKOyNmMHN1JSAWgAAAAPAAAAh7EXXWcjE0iJr6MIkEh7OwFpAAAADwAAAPX1wbBabiRJkreVuOCVOykBagAAAA8AAADuvP2Xqa9/QoU+D6/s20eLAWsAAAAPAAAAFaSOt3l0S0q9Dw1PfRDPrQFsAAAADwAAAIgl7QcVAcNHr/rrYZJtm04BbQAAAA8AAACyByWwMVJUR6FGeJV9mfYEAW4AAAAPAAAASwa99JJSPUWGMsP1xEjOpwFvAAAADwAAADXat+Hbe9RBgrVOU4wbHIIBcAAAAA8AAACOf63gy/QeTLv/e5cv4YVRAXEAAAAPAAAAvOO2xawVeEqLizvtZBs5jQFyAAAADwAAADUrn6ccOSxBuAOh0uTVcToBcwAAAA8AAADBMrYK4ILOQ7AUIw5pjRWAAXQAAAAPAAAAaus4puPnsU+ElsA0OUP/wgF1AAAADwAAAGW6+fU402dErsSMlSnUI8cBdgAAAA8AAAAEGdv2gFI9Sqq0EUkb3HHqAXcAAAAPAAAAu5CiMMkBz0OP0YwRF3t04QF4AAAADwAAAFC3KKKVna9DtqeCjv/09zgBeQAAAA8AAACjT0Cjn1WzT57WNtKhlfw2AXoAAAAPAAAAStu8AYXKh0ejiYGFZT23BgF7AAAADwAAAK46HQA2OpVCsa+b+PrqUR0BfAAAAA8AAABwO7mslkuaQ6oGS+d9y94bAX0AAAAPAAAAsp2XMAWiZ0CAscmbHD378wF+AAAADwAAALLobAGNwXhPrsxvO899iqUBfwAAAA8AAAC6Gdb1N5I1RZ6PblzmHyWbAYAAAAAPAAAAxSU31rO8+Uuy0PONTVJAhQGBAAAADwAAACAcr7o4BnxEmC9n/6W+SrMBggAAAA8AAABS4zmu4eAxTrlUhlUjjbGQAYMAAAAPAAAAesKR0pSnDEqVgNTTr6TXPQGEAAAADwAAAMvwyrEYzBBHtKO1Tt/EjlIBhQAAAA8AAAAKuUgXxCgfR7DylEbQYKBZAYYAAAAPAAAAuw/N+hCryE+QV48CKw8KPgGHAAAADwAAAEQZTBpUDpdEjr8KTU+dY+cBiAAAAA8AAAAPL0L/d5BNRYOs8IlYRJ11AYkAAAAPAAAAFQybxBztm02EMv67gLv2ywGKAAAADwAAAKvptFwYfVJMrcdC/pz1IioBiwAAAA8AAABjNzyVSqxIS6bKLiLDoKmSAYwAAAAPAAAAw4pexixsxkm3crsxsrHyoAGNAAAADwAAAFwd6Zb7YDFGk/SPZ+AkPcYBjgAAAA8AAAAYfJPc8OlNQ4W3G49JnjeKAY8AAAAPAAAAi0Uzj1S350q4BX6EHCN4GgGQAAAADwAAAKOwCgOmutRFvFAYHasWy/QBkQAAAA8AAAAUS/MppeClT4c3yLrvIBtqAZIAAAAPAAAAqA1K2NCAIkaB5yWw8DYLQgGTAAAADwAAAGceXtP7ad9JhNZNW0ZFOt8BlAAAAA8AAAA2/OdqR2EFTKHLp5m1GBV1AZUAAAAPAAAARRDVcWZjVUGh9fChpLYjCgGWAAAADwAAAJlael58qCZBhK5o4qRFtt8BlwAAAA8AAADNgr4HgDbLS6lXXplXCEPXAZgAAAAPAAAAIocbrfVDoEq123XzL2CrjgGZAAAADwAAAHMunt8V9jdMtQ1nmtKjpDMBmgAAAA8AAABcrtkpmpn3SpaTZNZEsjJKAZsAAAAPAAAA1M/PQLr7pE+LS23sntl0BAGcAAAADwAAAHG2bF0/oe5Fg69jeRITNwQBnQAAAA8AAAC+mlRNL0NaT5pjyZnggYSxAZ4AAAAPAAAA+AyJXAUcJUOQuDzD6F5UygGfAAAADwAAAJw+aKCCM3hKodri5FahN7UBoAAAAA8AAAA2WqxlnAkAR7UB5W8T4LTTAaEAAAAPAAAAQXkz/w43dkGz0cZNIk6xZgGiAAAADwAAAHSJjhBqJwxPmGUoDlKZkIMBowAAAA8AAADeSU1VBdtXQ7RxHJ7FHNwEAaQAAAAPAAAAJ6Huy6UqYkGF2+JicgMO6QGlAAAADwAAAAaQcVaB2t1FjtvA25kXjzgBpgAAAA8AAAAN3YarkCowTpDpos/3BsJFAacAAAAPAAAAKTT3BiOnPE+bSRuM5SoEhgGoAAAADwAAAKouPwpkKY1Kjfn2gAVLyeABqQAAAA8AAAA5YYcG15EGTJHMonuFZhnFAaoAAAAPAAAA9X+azcE+9kWlsKUzGr4tHQGrAAAADwAAAOAysMvDdblLvN62yf8dbdYBrAAAAA8AAAAuf0DUeZMbTIiEu6el6BhfAa0AAAAPAAAArwghf20dxkaBBnvRGQu5agGuAAAADwAAAEI40ybzJBFMpU9yOIlu6ZsBrwAAAA8AAAC70DTQQnV5QYSXhTBSvNtbAbAAAAAPAAAALiHAw70VHUeX8y0BQfj+1wGxAAAADwAAAMcxvr3XC5pKpBf1Ez6PzWkBsgAAAA8AAAAOkOivU/DOToOqkyqEsASwAbMAAAAPAAAAfE8YVixxykmyPMuF816MVAG0AAAADwAAAE+1jcvoAHpKik23jL7qYUMBtQAAAA8AAACD0dwGNSdHTaYScrYHApcUAbYAAAAPAAAAHL3Pn1Kx2EuLwpdzu1ZghAG3AAAADwAAAHsvn7MMbgJJqxSyuFoBYNsFuAAAADJfM1MuQ29EZVN5cy5Db3JlLkNvbXBvbmVudHMuRXhhY3RWZXJzaW9uQ29uc3RyYWludAEAAAAIX3ZlcnNpb24DDlN5c3RlbS5WZXJzaW9uAgAAAAkgAQAAAbkAAAC4AAAACSEBAAABugAAALgAAAAJIgEAAAG7AAAAuAAAAAkjAQAAAbwAAAC4AAAACSQBAAABvQAAALgAAAAJJQEAAAG+AAAAuAAAAAkmAQAAAcAAAAC4AAAACScBAAABwQAAALgAAAAJKAEAAAXCAAAAM18zUy5Db0RlU3lzLkNvcmUuQ29tcG9uZW50cy5OZXdlc3RWZXJzaW9uQ29uc3RyYWludAAAAAACAAAAAcMAAAC4AAAACSkBAAABxAAAALgAAAAJKgEAAAHGAAAAuAAAAAkrAQAAAcgAAAC4AAAACSwBAAABygAAALgAAAAJLQEAAAHMAAAAuAAAAAkuAQAAAc4AAAC4AAAACS8BAAAB0AAAALgAAAAJMAEAAAHRAAAAuAAAAAkxAQAAAdMAAAC4AAAACTIBAAAB1AAAALgAAAAJMwEAAAHWAAAAwgAAAAHYAAAAuAAAAAk0AQAAAdoAAAC4AAAACTUBAAAB2wAAALgAAAAJNgEAAAHcAAAAuAAAAAk3AQAAAd0AAAC4AAAACTgBAAAB3gAAALgAAAAJOQEAAAHfAAAAuAAAAAk6AQAAAeEAAAC4AAAACTsBAAAB4wAAALgAAAAJPAEAAAHlAAAAuAAAAAk9AQAAAeYAAAC4AAAACT4BAAAB6AAAALgAAAAJPwEAAAHqAAAAuAAAAAlAAQAAAewAAAC4AAAACUEBAAAB7gAAALgAAAAJQgEAAAHvAAAAuAAAAAlDAQAAAfEAAAC4AAAACUQBAAAB8gAAALgAAAAJRQEAAAHzAAAAuAAAAAlGAQAAAfQAAAC4AAAACUcBAAAB9gAAALgAAAAJSAEAAAH3AAAAuAAAAAlJAQAAAfgAAAC4AAAACUoBAAAB+gAAALgAAAAJSwEAAAH8AAAAuAAAAAlMAQAAAf0AAAC4AAAACU0BAAAB/gAAALgAAAAJTgEAAAH/AAAAuAAAAAlPAQAAAQEBAAC4AAAACVABAAABAwEAALgAAAAJUQEAAAEFAQAAuAAAAAlSAQAAAQYBAAC4AAAACVMBAAABCAEAAMIAAAABCgEAAMIAAAABCwEAALgAAAAJVAEAAAENAQAAuAAAAAlVAQAAAQ8BAAC4AAAACVYBAAABEAEAALgAAAAJVwEAAAESAQAAuAAAAAlYAQAAARQBAAC4AAAACVkBAAABFQEAALgAAAAJWgEAAAEWAQAAuAAAAAlbAQAAARcBAAC4AAAACVwBAAABGAEAALgAAAAJXQEAAAEZAQAAuAAAAAleAQAAARoBAAC4AAAACV8BAAABGwEAALgAAAAJYAEAAAEdAQAAuAAAAAlhAQAAAR8BAAC4AAAACWIBAAAEIAEAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgDAAAABQAAAA4AAAAKAAAAASEBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAEiAQAAIAEAAAMAAAAFAAAADgAAAAAAAAABIwEAACABAAADAAAABQAAAA4AAAAUAAAAASQBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAElAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABJgEAACABAAADAAAABQAAAA4AAAAKAAAAAScBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAEoAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABKQEAACABAAADAAAABQAAAA4AAAAUAAAAASoBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAErAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABLAEAACABAAADAAAABQAAAA4AAAAeAAAAAS0BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAEuAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABLwEAACABAAADAAAABQAAAA4AAAAKAAAAATABAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAExAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABMgEAACABAAADAAAABQAAAA4AAAAKAAAAATMBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAE0AQAAIAEAAAMAAAAFAAAADgAAAAAAAAABNQEAACABAAADAAAABQAAAA4AAAAKAAAAATYBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAE3AQAAIAEAAAMAAAAFAAAADgAAAAoAAAABOAEAACABAAADAAAABQAAAA4AAAAeAAAAATkBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAE6AQAAIAEAAAMAAAAFAAAADgAAAB4AAAABOwEAACABAAADAAAABQAAAA4AAAAKAAAAATwBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAE9AQAAIAEAAAMAAAAFAAAADgAAAB4AAAABPgEAACABAAADAAAABQAAAA4AAAAeAAAAAT8BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFAAQAAIAEAAAMAAAAFAAAADgAAAAAAAAABQQEAACABAAADAAAABQAAAA4AAAAeAAAAAUIBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFDAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABRAEAACABAAADAAAABQAAAA4AAAAKAAAAAUUBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFGAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABRwEAACABAAADAAAABQAAAA4AAAAKAAAAAUgBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFJAQAAIAEAAAMAAAAFAAAADgAAABQAAAABSgEAACABAAADAAAABQAAAA4AAAAeAAAAAUsBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFMAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABTQEAACABAAADAAAABQAAAA4AAAAKAAAAAU4BAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFPAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABUAEAACABAAADAAAABQAAAA4AAAAeAAAAAVEBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFSAQAAIAEAAAMAAAAFAAAADgAAABQAAAABUwEAACABAAADAAAABQAAAA4AAAAeAAAAAVQBAAAgAQAAAwAAAAUAAAAOAAAAFAAAAAFVAQAAIAEAAAMAAAAFAAAADgAAAB4AAAABVgEAACABAAADAAAABQAAAA4AAAAeAAAAAVcBAAAgAQAAAwAAAAUAAAAOAAAAHgAAAAFYAQAAIAEAAAMAAAAFAAAADgAAABQAAAABWQEAACABAAADAAAABQAAAA4AAAAAAAAAAVoBAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFbAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXAEAACABAAADAAAABQAAAA4AAAAeAAAAAV0BAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFeAQAAIAEAAAMAAAAFAAAADgAAAAoAAAABXwEAACABAAADAAAABQAAAA4AAAAKAAAAAWABAAAgAQAAAwAAAAUAAAAOAAAACgAAAAFhAQAAIAEAAAMAAAAFAAAADgAAABQAAAABYgEAACABAAADAAAABQAAAA4AAAAUAAAACw== True @@ -15741,7 +15781,7 @@ adb5cb65-8e1d-4a00-b70a-375ea27582f3 - 637186830922670840 + 637406306923744358 @@ -16144,6 +16184,31 @@ False False + + False + + + IBLOCKSIZE + + + 5910974510923778 + + 22800 + AnyInt + False + AnyInt + + + + Util, 3.5.14.0 (System) + 2567479411 + Util + False + False + False + False + False + @@ -16188,10 +16253,10 @@ - CAA Callback + WagoSysStandard - CAA Callback Extern, 3.5.11.0 (CAA Technical Workgroup) + WagoSysStandard, 1.6.1.0 (WAGO) @@ -16236,18 +16301,18 @@ - WagoSysTypedefs_Debugging + SD_MQTT - WagoSysTypedefs_Debugging, 1.0.3.0 (WAGO) + MQTT, 1.1.0.0 (Stefan Dreyer) - SD_MQTT + CmpBinTagUtilIec - MQTT, 1.1.0.0 (Stefan Dreyer) + CmpBinTagUtilIec, 3.5.5.0 (System) @@ -16274,6 +16339,14 @@ SysSocket23, 3.5.13.0 (System) + + + CAA DTUtility + + + CAA DTUtil Extern, 3.5.12.0 (CAA Technical Workgroup) + + WagoTypesErrorBase @@ -16284,10 +16357,10 @@ - WagoSysStandard + WagoSysVirtualBuffer - WagoSysStandard, 1.6.1.0 (WAGO) + WagoSysVirtualBuffer, 1.6.1.0 (WAGO) @@ -16316,26 +16389,26 @@ - WagoSysBaseItf + SysTimeCore - WagoSysBaseItf, 1.5.2.0 (WAGO) + SysTimeCore, 3.5.5.0 (System) - CAA Storage + WagoSysBaseItf - CAA Storage, 3.5.13.0 (CAA Technical Workgroup) + WagoSysBaseItf, 1.5.2.0 (WAGO) - WagoSysAsync + CAA Storage - WagoSysAsync, 1.6.2.0 (WAGO) + CAA Storage, 3.5.13.0 (CAA Technical Workgroup) @@ -16356,18 +16429,10 @@ - WagoSysVirtualBuffer - - - WagoSysVirtualBuffer, 1.6.1.0 (WAGO) - - - - - WagoSysPlainMem + SysCpuHandling - WagoSysPlainMem, 1.5.2.0 (WAGO) + SysCpuHandling, 3.5.13.0 (System) @@ -16380,10 +16445,10 @@ - WagoTypesCom + WagoSysPlainMem - WagoTypesCom, 1.6.1.0 (WAGO) + WagoSysPlainMem, 1.5.2.0 (WAGO) @@ -16412,10 +16477,10 @@ - WagoTypesModbus + CBML - WagoTypesModbus, 1.6.1.0 (WAGO) + Common Behaviour Model, 3.5.13.0 (3S - Smart Software Solutions GmbH) @@ -16452,26 +16517,18 @@ - CmpBinTagUtilIec - - - CmpBinTagUtilIec, 3.5.5.0 (System) - - - - - SysTime + WagoTypesModbus - SysTime, 3.5.9.0 (System) + WagoTypesModbus, 1.6.1.0 (WAGO) - WagoSysErrorBase + WagoSysAsync - WagoSysErrorBase, 1.6.1.0 (WAGO) + WagoSysAsync, 1.6.2.0 (WAGO) @@ -16484,18 +16541,18 @@ - SysTimeCore + CAA Callback - SysTimeCore, 3.5.5.0 (System) + CAA Callback Extern, 3.5.11.0 (CAA Technical Workgroup) - SysCpuHandling + SysTime - SysCpuHandling, 3.5.13.0 (System) + SysTime, 3.5.9.0 (System) @@ -16514,6 +16571,14 @@ WagoTypesAppLED, 1.5.2.0 (WAGO) + + + WagoSysTypedefs_Debugging + + + WagoSysTypedefs_Debugging, 1.0.3.0 (WAGO) + + Component Manager @@ -16524,10 +16589,10 @@ - WagoAppPlcModbus + CAA TickUtil - WagoAppPlcModbus, 1.1.2.5 (WAGO) + CAA TickUtil Extern, 3.5.7.0 (CAA Technical Workgroup) @@ -16540,10 +16605,18 @@ - CAA DTUtility + WagoSysErrorBase - CAA DTUtil Extern, 3.5.12.0 (CAA Technical Workgroup) + WagoSysErrorBase, 1.6.1.0 (WAGO) + + + + + WagoAppPlcModbus + + + WagoAppPlcModbus, 1.1.2.5 (WAGO) @@ -16556,10 +16629,10 @@ - CAA TickUtil + WagoTypesCom - CAA TickUtil Extern, 3.5.7.0 (CAA Technical Workgroup) + WagoTypesCom, 1.6.1.0 (WAGO) @@ -16655,7 +16728,7 @@ a9ed5b7e-75c5-4651-af16-d2c27e98cb94 - 637136422683486903 + 637402492225250657 @@ -17047,20 +17120,10 @@ // Generated instance path of persistent variable - - 98 - - PLC_PRG_MAIN.FB_AO_DIMMER_001.PreviousQ: BOOL; - - - 99 - - // Generated instance path of persistent variable - 100 - PLC_PRG_MAIN.FB_AO_DIMMER_001.PreviousDBL: BOOL; + PLC_PRG_MAIN.FB_AO_DIMMER_001.PreviousQ: BOOL; 1 @@ -17288,7 +17351,7 @@ a9ed5b7e-75c5-4651-af16-d2c27e98cb94 74f81948-1328-492c-b6c1-a9ea72048b28 - 637245203380156001 + 637399364356369587 None @@ -18883,7 +18946,7 @@ 303 - TestOUT :BYTE; + TestOUT :WORD; 282 @@ -22015,7 +22078,7 @@ 3b83b776-fb25-43b8-99f2-3c507c9143fc - 637245204430489749 + 637402492344796291 @@ -22139,7 +22202,7 @@ 464 - MQTTSubscribePrefix:= ADR(MqttSubDimmerPrefix), + MQTTSubscribePrefix:= ADR(MqttSubDimmerPrefix), (* pointer to string prefix for the MQTT subscribe topic *) 459 @@ -22164,13 +22227,93 @@ 462 - 5 (* specify the resolution for the dimmer mqtt events *) + 5 (* specify the resolution for the dimmer mqtt events *) 452 ); + + 483 + + + + + 484 + + (* ALTER THE DIMMER OUTPUT DEFAULT BEHAVIOR *) + + + 492 + + FB_AO_DIMMER_001.ConfigureFunctionBlock( + + + 494 + + T_Debounce:=T#10MS, + + + 495 + + T_Reconfig:=T#10S, + + + 496 + + T_On_Max:=T#0S, + + + 497 + + T_Dimm_Start:=T#400MS, + + + 498 + + T_Dimm:=T#3S, + + + 499 + + Min_On:=50, + + + 500 + + Max_On:=255, + + + 501 + + Soft_Dimm:=TRUE, + + + 503 + + Rst_Out:=FALSE, + + + 504 + + OUT_LinearScaleMin:=11000, + + + 493 + + OUT_LinearScaleMax:=32767 + + + 505 + + ); + + + 482 + + + 453 @@ -22659,7 +22802,7 @@ - 480 + 505 98c8b3af-823f-460e-96b4-4a3a11616ef1 @@ -23073,7 +23216,7 @@ 3b83b776-fb25-43b8-99f2-3c507c9143fc - 637245203590486021 + 637406310338544421 @@ -23255,22 +23398,57 @@ FB_DO_SW_030(OUT => DO_030 ,PRIO_HIGH:=FALSE ,PRIO_LOW:=FALSE ,TOGGLE:=FALSE ); - 72 + 83 - 73 + 84 71 - FB_AO_DIMMER_001(SINGLE:=FB_DI_PB_041.SINGLE, DOUBLE:=FB_DI_PB_041.DOUBLE, LONG:=FB_DI_PB_041.LONG, P_LONG:=FB_DI_PB_041.P_LONG, OUT := TestOUT); + FB_AO_DIMMER_001( - 75 + 76 + + SINGLE:=FB_DI_PB_041.SINGLE, + + + 77 + + LONG:=FB_DI_PB_041.LONG, + + + 78 + + P_LONG:=FB_DI_PB_041.P_LONG, + + + 79 + + Q_OUT => TestOUT, + + + 82 + + SET:= FB_DI_PB_041.DOUBLE, + + + 89 + + VAL:=125 + + + 80 + + ); + + + 91 @@ -23282,7 +23460,7 @@ - 75 + 91 98c8b3af-823f-460e-96b4-4a3a11616ef1 diff --git a/src/HomeAutomation.ecp b/src/HomeAutomation.ecp index 8791bb6..31fc1b2 100644 Binary files a/src/HomeAutomation.ecp and b/src/HomeAutomation.ecp differ diff --git a/src/PLCopen/HomeAutomation.xml b/src/PLCopen/HomeAutomation.xml index f5f592a..c93e103 100644 --- a/src/PLCopen/HomeAutomation.xml +++ b/src/PLCopen/HomeAutomation.xml @@ -1,7 +1,7 @@  - - + + @@ -2670,11 +2670,6 @@ THIS^.T_UD:=T_UD; - - - - - @@ -2718,24 +2713,22 @@ THIS^.T_UD:=T_UD; - + - + - + - - - + - + @@ -2752,6 +2745,32 @@ THIS^.T_UD:=T_UD; + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2891,14 +2910,6 @@ THIS^.T_UD:=T_UD; - - - - - - - - @@ -2935,14 +2946,6 @@ THIS^.T_UD:=T_UD; To retain output state through powercycles - - - - - - To retain output state through powercycles - - @@ -2962,16 +2965,15 @@ THIS^.T_UD:=T_UD; IF Startup THEN OUT := PreviousOUT; Q := PreviousQ; - DBL := PreviousDBL; END_IF IF RST THEN - IF rst_out THEN out := 0; END_IF; + IF rst_out THEN OUT_Internal := 0; END_IF; Q := FALSE; - dir := out > 127; + dir := OUT_Internal > 127; ELSIF PRIO_HIGH THEN Q := TRUE; - OUT := 255; + OUT_Internal := 255; ELSIF PRIO_LOW THEN Q := FALSE; ELSIF MqttHighRequest THEN @@ -2983,25 +2985,25 @@ ELSIF MqttLowRequest THEN MqttHighRequest := FALSE; MqttLowRequest := FALSE; ELSIF set THEN - out := val; + OUT_Internal := val; Q := TRUE; (* set direction to up when value < 127 otherwise set dir down dir is reversed because next action will reverse again *) - dir := out > 127; + dir := OUT_Internal > 127; ELSIF SINGLE THEN (* a single click reverses output Q *) Q := NOT Q; (* when dimmer is turned on we need to limit out to min and max limits *) - IF Q THEN out := LIMIT(MAX(MIN_ON,1), out, MAX_ON); END_IF; + IF Q THEN OUT_Internal := LIMIT(MAX(OUT_Internal,1), OUT_Internal, MAX_ON); END_IF; (* set the appropriate direction of dimmer dir is reversed because next action will reverse again *) - dir := out > 127; + dir := OUT_Internal > 127; ELSIF LONG THEN IF NOT Q THEN IF SOFT_DIMM THEN - OUT := 1; + OUT_Internal := 1; dir := TRUE; ELSE - OUT := LIMIT(MAX(MIN_ON,1), out, MAX_ON); - DIR := out < 127; + OUT_Internal := LIMIT(MAX(MIN_ON,1), OUT_Internal, MAX_ON); + DIR := OUT_Internal < 127; END_IF; Q := TRUE; ELSE @@ -3010,17 +3012,14 @@ ELSIF LONG THEN END_IF; END_IF; -(* set the double click output *) -IF NOT dbl_toggle THEN dbl := FALSE; END_IF; -IF DOUBLE THEN dbl := NOT dbl; END_IF; (* while dimming is active ramp the output out up or down *) -dim(DIR := dir, e := P_LONG AND Q, TR := T_DIMM, rmp := out); +dim(DIR := dir, e := P_LONG AND Q, TR := T_DIMM, rmp := OUT_Internal); (* reverse direction when limits are reached *) -IF out = 0 THEN +IF OUT_Internal = 0 THEN dir := TRUE; -ELSIF out = 255 THEN +ELSIF OUT_Internal = 255 THEN dir := FALSE; END_IF; @@ -3030,10 +3029,25 @@ IF t_ON_MAX > t#0s THEN Q := Q XOR t3.Q; END_IF; -IF ((ABS(BYTE_TO_INT(PreviousOUT) - BYTE_TO_INT(OUT)) >= Delta_Dimm) OR Startup AND OUT <> PreviousOUT OR Startup AND OutputDimmer) AND InitMqttDone THEN - PreviousOUT:=OUT; +(* Scale the internal OUT to the actual OUT *) +LIN_TRAFO( + IN:= OUT_Internal, + IN_MIN:= 0, + IN_MAX:= 255, + OUT_MIN:=OUT_LinearScaleMin, + OUT_MAX:=OUT_LinearScaleMax + ); +OUT:= REAL_TO_WORD(LIN_TRAFO.OUT); +IF Q THEN + Q_OUT:= OUT; +ELSE + Q_OUT:= 0; +END_IF + +IF ((ABS(BYTE_TO_INT(PreviousOUT) - BYTE_TO_INT(OUT_Internal)) >= Delta_Dimm) OR Startup AND OUT_Internal <> PreviousOUT OR Startup AND OutputDimmer) AND InitMqttDone THEN + PreviousOUT:=OUT_Internal; pMqttPublishQueue^.AddMessage( - Payload := BYTE_TO_STRING(OUT), + Payload := BYTE_TO_STRING(OUT_Internal), Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/OUT'), Qos := SD_MQTT.QoS.ExactlyOnce, MqttRetain := TRUE @@ -3050,16 +3064,6 @@ IF (Q <> PreviousQ OR Startup) AND InitMqttDone THEN ); END_IF -IF (DBL <> PreviousDBL OR Startup) AND InitMqttDone THEN - PreviousDBL:=DBL; - pMqttPublishQueue^.AddMessage( - Payload := BOOL_TO_STRING(DBL), - Topic := CONCAT(CONCAT(MqttPublishTopicPrefix^, MqttPublishTopicSuffix), '/DBL'), - Qos := SD_MQTT.QoS.ExactlyOnce, - MqttRetain := TRUE - ); -END_IF - Startup:=FALSE; @@ -3203,14 +3207,19 @@ InitMqttDone := TRUE; - + - + - + + + + + + @@ -3223,7 +3232,11 @@ THIS^.T_On_Max:=T_On_Max; THIS^.T_Dimm_Start:=T_Dimm_Start; THIS^.T_Dimm:=T_Dimm; THIS^.Min_On:=Min_On; -THIS^.Max_On:=Max_On; +THIS^.Max_On:=Max_On; +THIS^.Soft_Dimm:=Soft_Dimm; +THIS^.Rst_Out:=Rst_Out; +THIS^.OUT_LinearScaleMin:=OUT_LinearScaleMin; +THIS^.OUT_LinearScaleMax:=OUT_LinearScaleMax; @@ -3262,7 +3275,7 @@ ELSIF CommonTypesAndFunctions.StrEquals(str1:= ADR(MQTTSubscribeTopic), str2:= D ELSIF CommonTypesAndFunctions.StrEquals(str1:= Data.PayloadString, str2:= ADR('FALSE')) THEN MqttLowRequest := TRUE; ELSIF OSCAT_BASIC.IS_CC(str:= Data.PayloadString^,cmp:='0123456789.') AND THIS^.PRIO_HIGH = FALSE THEN - THIS^.OUT:=STRING_TO_BYTE(Data.PayloadString^); + THIS^.OUT_Internal:=STRING_TO_BYTE(Data.PayloadString^); END_IF END_IF @@ -6345,7 +6358,7 @@ SwapWordsToReal := pt_REAL^; - + @@ -6841,7 +6854,7 @@ SwapWordsToReal := pt_REAL^; - + @@ -6981,7 +6994,14 @@ FB_DO_SW_029(OUT => DO_029 ,PRIO_HIGH:=FALSE ,PRIO_LOW:=FALSE ,TOGGLE:= FB_DO_SW_030(OUT => DO_030 ,PRIO_HIGH:=FALSE ,PRIO_LOW:=FALSE ,TOGGLE:=FALSE ); -FB_AO_DIMMER_001(SINGLE:=FB_DI_PB_041.SINGLE, DOUBLE:=FB_DI_PB_041.DOUBLE, LONG:=FB_DI_PB_041.LONG, P_LONG:=FB_DI_PB_041.P_LONG, OUT := TestOUT); +FB_AO_DIMMER_001( + SINGLE:=FB_DI_PB_041.SINGLE, + LONG:=FB_DI_PB_041.LONG, + P_LONG:=FB_DI_PB_041.P_LONG, + Q_OUT => TestOUT, + SET:= FB_DI_PB_041.DOUBLE, + VAL:=125 +); FB_DO_BISTABLE_001(); @@ -7014,14 +7034,30 @@ FB_DI_PB_041.InitMqtt(MQTTPublishPrefix:= ADR(MqttPushbuttonPrefix), pMqttPublis (* INIT DIMMER OUTPUT STUFF *) FB_AO_DIMMER_001.InitMQTT(MQTTPublishPrefix:= ADR(MqttPubDimmerPrefix), (* pointer to string prefix for the MQTT publish topic *) - MQTTSubscribePrefix:= ADR(MqttSubDimmerPrefix), + MQTTSubscribePrefix:= ADR(MqttSubDimmerPrefix), (* pointer to string prefix for the MQTT subscribe topic *) pMQTTPublishQueue := ADR(MQTTVariables.fbMQTTPublishQueue), (* pointer to MQTTPublishQueue to send a new MQTT event *) pMqttCallbackCollector := ADR(MqttVariables.collector_FB_DIMMER_MQTT), (* pointer to CallbackCollector to receive Mqtt subscription events *) TRUE, (* specify whether dimmer value should be outputted on MQTT topic *) SD_MQTT.QoS.ExactlyOnce, (* specify the QoS for the dimmer mqtt events (values 0-255) *) - 5 (* specify the resolution for the dimmer mqtt events *) + 5 (* specify the resolution for the dimmer mqtt events *) +); + +(* ALTER THE DIMMER OUTPUT DEFAULT BEHAVIOR *) +FB_AO_DIMMER_001.ConfigureFunctionBlock( + T_Debounce:=T#10MS, + T_Reconfig:=T#10S, + T_On_Max:=T#0S, + T_Dimm_Start:=T#400MS, + T_Dimm:=T#3S, + Min_On:=50, + Max_On:=255, + Soft_Dimm:=TRUE, + Rst_Out:=FALSE, + OUT_LinearScaleMin:=11000, + OUT_LinearScaleMax:=32767 ); + (* INIT DIGITAL OUTPUT STUFF *) FB_DO_SW_001.InitMqtt(MQTTPublishPrefix:= ADR(MqttPubSwitchPrefix), (* pointer to string prefix for the mqtt publish topic *) MQTTSubscribePrefix:= ADR(MqttSubSwitchPrefix), (* pointer to string prefix for the mqtt subscribe topic *) @@ -8383,6 +8419,11 @@ FB_RS485_EASTRON_SDM220_1.InitMqtt( + + + + +