[SCXML] Ways to spawn multiple logical "threads"?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[SCXML] Ways to spawn multiple logical "threads"?

Christofer Dutz
Hi all,

my PLC4X driver using a combination of Apache Commons SCXML (2.0) and Apache Daffodil is doing even better than I imagined, when starting the whole thing.

Right now I’m improving the thing to be more on-par with the existing drivers.

However there are still a few little things bugging me and I’ve spent quite some time working on them.


  1.  Is it possible to spawn multiple execution heads (Similar to threads in Java)?
The reason is that in my protocol state machine, there is a single-threaded connection part (that works fine) … part of this connection process is to negotiate the number of parallel requests the client is allowed to send to the PLC. In my S7-1200 this is usually 3 or so. So I am allowed to send up to 3 requests in parallel … after that, I have to wait with sending the next, till one of these is acknowledged by receiving a response.
Right now I’m serializing everything … but that’s a simplification that greatly impacts the drivers performance. So I know there are parallel executions … but how can I enter multiple instances of “sendRequest” and wait for them to pass “readResponse” … and the number is dynamic.


  1.  Is there a way to pass data with a transition?
As I mentioned, I have a static part of my state machine which ends in a “connected” state. Here is where the driver can branch to process the different types of requests by transitioning to a “sendReadRequest”, “sendWriteRequest”, “sendDisconnectRequest” state. Now my driver programmatically initiates one of these by sending a “read”, “write” or “disconnect” event and I take the _event.data and assign it to a data element in the global datamodel … however this would prevent me from using and form of parallelism … so I guess this is a follow up from question 1: If paralellizm is possible, how can I pass the “readRequest” provided to the “read” event to the “sendReadRequest” state without using a global variable?


Chris
Reply | Threaded
Open this post in threaded view
|

Re: [SCXML] Ways to spawn multiple logical "threads"?

Woonsan Ko-3
On Mon, Feb 11, 2019 at 3:17 AM Christofer Dutz
<[hidden email]> wrote:

>
> Hi all,
>
> my PLC4X driver using a combination of Apache Commons SCXML (2.0) and Apache Daffodil is doing even better than I imagined, when starting the whole thing.
>
> Right now I’m improving the thing to be more on-par with the existing drivers.
>
> However there are still a few little things bugging me and I’ve spent quite some time working on them.
>
>
>   1.  Is it possible to spawn multiple execution heads (Similar to threads in Java)?
> The reason is that in my protocol state machine, there is a single-threaded connection part (that works fine) … part of this connection process is to negotiate the number of parallel requests the client is allowed to send to the PLC. In my S7-1200 this is usually 3 or so. So I am allowed to send up to 3 requests in parallel … after that, I have to wait with sending the next, till one of these is acknowledged by receiving a response.
> Right now I’m serializing everything … but that’s a simplification that greatly impacts the drivers performance. So I know there are parallel executions … but how can I enter multiple instances of “sendRequest” and wait for them to pass “readResponse” … and the number is dynamic.

If <send> used, I think the only option is to inject a custom
org.apache.commons.scxml2.EventDispatcher into your
org.apache.commons.scxml2.SCXMLExecutor to spawn multiple threads.
You could nest N states in <parallel> for each nested state to send,
or you could have a transition with one send transitioning back to
itself again until the number is met, I guess.

>
>
>   1.  Is there a way to pass data with a transition?
> As I mentioned, I have a static part of my state machine which ends in a “connected” state. Here is where the driver can branch to process the different types of requests by transitioning to a “sendReadRequest”, “sendWriteRequest”, “sendDisconnectRequest” state. Now my driver programmatically initiates one of these by sending a “read”, “write” or “disconnect” event and I take the _event.data and assign it to a data element in the global datamodel … however this would prevent me from using and form of parallelism … so I guess this is a follow up from question 1: If paralellizm is possible, how can I pass the “readRequest” provided to the “read” event to the “sendReadRequest” state without using a global variable?

I'd try with a custom action (of
org.apache.commons.scxml2.model.Action), in onentry for instance. The
custom action will probably be able to retrieve the current parent
state and read _event data and set state scope context variable.

Regards,

Woonsan

>
>
> Chris

---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]