--- title: "SignalPlot" description: "Discrete signal control component for time-based automation and process control" keywords: ["signal-control", "automation", "discrete-states", "modbus", "time-based", "industrial-control", "plot-profile"] --- ## SignalPlot **Path** : [src/profiles/SignalPlot.h](src/profiles/SignalPlot.h) **revision history** - initial documentation A component for managing discrete signal state changes over time. Inherits from PlotBase to provide time-based automation capabilities for industrial applications. ## Requirements - *-*Inheritance**: PlotBase (component) - **Memory**: Maximum 20 control points ## Features - Discrete state control with time-based triggering - Multiple signal types (Modbus, GPIO, Method calls) - Modbus TCP integration - JSON configuration loading - State querying and user value retrieval ## Dependencies - [PlotBase](#plotbase) - Base class for plot functionality - [ModbusTCP](#modbus-tcp) - Modbus communication - [ArduinoJson](#arduino-json) - JSON configuration ```mermaid graph TD PlotBase --> SignalPlot ModbusTCP --> SignalPlot JSONConfig --> SignalPlot ``` ## Behaviour ```mermaid graph TD A[Start] --> B[LoadConfig] B --> C[InitControlPoints] C --> D[RunLoop] D --> E[CheckElapsedTime] E --> F{C.time_elapsed?} F --> Yes| GoexeuteAction F --> No | D G --> H[UpdateState] H --> D ``` ## Todos ### Performance - Optimize control point lookup algorithm - Implement binary search for larger datasets ### Security - Validate control point parameters - Implement safe gaurds for critical GPIO operations ### Compliance - Verify Modbus compliance - Implement error handling for industrial standards ### Recommendations - Implement remaining signal types (CALL_METHOD, CALL_FUNCTION, CALL_REST, USER_DEFINED) - Add state validation and error handling - Implement advanced GPIO control modes (SERVO, TONE) ## Example Here an example how such component is being constructed and mounted: ```cpp #define SIGNAL_PLOT_SLOT_0 0 #define COMPONENT_KEY_SIGNAL_PLOT_0 920 signalPlot_0 = new SignalPlot( this, // owner SIGNAL_PLOT_SLOT_0, // slot COMPONENT_KEY_SIGNAL_PLOT_0 // componentId ); if (signalPlot_0) { components.push_back(signalPlot_0); Log.infoln(F("SignalPlot_0 initialized. Slot:%d, ID:%d"), SIGNAL_PLOT_SLOT_0, COMPONENT_KEY_SIGNAL_PLOT_0); } else { Log.errorln(F("SignalPlot_0 initialization failed.")); } ``` Example JSON configuration: ```json { "name": "TISControlPlot", "duration": 300000, "controlPoints": [ { "id": 1, "time": 0, "state": 2, "type": 6, "arg_0": 21, "arg_1": 0, "arg_2": 1 }, { "id": 2, "time": 5000, "state": 3, "type": 2, "arg_0": 100, "arg_1": 500, "arg_2": 0 }, { "id": 3, "time": 10000, "state": 2, "type": 1, "arg_0": 20, "arg_1": 1, "arg_2": 0 } ] } ``` ### References ${DOXYGEN_PLACEHOLDER} ${VENDOR_PLACEHOLDER}