Hi Tim,

welcome to this coolest mailing-list the Apache Software Foundation has :-)

Just let me sum up how I understood your question:
- You wanted to know opinions on how a frontend should communicate with the 
matching backend?

I have to admit that I would sort of expect the backend and frontend for a 
simulation module to be very tightly coupled.

Why not let the implementor(s) decide how to do it? 
Probably it would be good to have a standard rest API for manipulating the 
context of a simulation module, but ho that module's UI interacts with the 
backend, I wouldn't want to enforce anything here.

Using a universal simulation context (memory & IO slots) would provide a 
universal rest API, but I doubt that it is necessary to force anyone to do it 
in a certain way as the universal context API could nicely Co-Exist with any 
other API.
UI developers could either just use that universal API or provide a custom one, 
if this is more convenient for them.

So from my side, I'd suggest you do what you think is better.

Thank you for contributing :-)

Chris


Am 15.10.19, 13:21 schrieb "Tim Kläsener" <tim.klaese...@codecentric.de>:

    Hi everyone,
    
    I'm currently working on creating a frontend and REST interface for
    the PLC Simulator to control the different simulation modules for
    testing and presentation purposes.
    One question came up this morning with Chris about whether the backend
    should be more low level or high level.
    To clarify, the simulated PLC modules are basically just some objects
    with metadata (name etc.), some properties (basically a map with
    key/value pairs) and optionally some business logic and the question
    asked is how to best interact with them.
    
    Let me explain the question by the example of a simplified water tank
    with the following three properties:
    
    - VALVE_IN (boolean: true = open)
    - VALVE_OUT (boolean: true = open)
    - FILL_LEVEL (int: 0-100 percent)
    
    High-level API
    -------------------
    The high-level API would allow the simulation modules to expose the
    actions or states to be performed with them, e.g. you would call a
    REST endpoint like "PUT /simulator/water_tank_1/state/fill" and then
    the internal logic of the simulation module would change the
    properties of the water tank accordingly over time.
    
    Advantages:
    - Communication with the simulation modules via a defined set of
    actions, therefore the frontend wouldn't have to understand the
    meaning of individual properties.
    - Business logic in the simulation modules is based on defined set of
    actions, i.e. they don't have to look at all the different properties
    to derive how to properly simulate the real PLC's behaviour.
    
    Disadvantages:
    - Level of abstraction over the raw values, harder to simulate
    specific or even 'dangerous' states.
    
    
    Low-level API
    ------------------
    The low-level API would modify the properties of the water tank
    directly, e.g. you would call a REST endpoint like "PUT
    /simulator/water_tank_1" with a payload of
    "{
    VALVE_IN: false,
    VALVE_OUT: true,
    FILL_LEVEL: 50
    }"
    (or only some of the values).
    
    Advantages:
    - All properties are exposed: You could interact with everything and
    also construct potential invalid combinations to cover more cases.
    - Probably closest to how interfaces interact with real PLCs.
    
    Disadvantages:
    - To create complex business logic, any user of the API/the frontend
    would have to know how a business flow (e.g. "Fill water tank until
    it's full") translates into changes of the individual properties over
    time.
    - Alternatively, the simulation backend would have to react to any
    combination of the property values to figure out what to do.
    
    
    Personally, I would go for a combination of the two approaches, i.e.
    allow the mutation of the raw values from the low-level approach to be
    able to create the full set of valid and invalid states in the
    simulator - BUT this does not trigger any business logic (like setting
    VALVE_IN to true slowly raising the FILL_LEVEL). The complex business
    logic should only be triggered via a higher-level API to keep the
    complexity in the front-end low.
    
    Any opinions on the matter?
    
    Cheers and nice to digitally meet you all
    
    Tim
    (sorry, another one ;-) )
    

Reply via email to