<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Leveraging High-Level Petri Nets for Cyber-Physical Systems Development</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Nuno Fernandes</string-name>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>João-Paulo Barros</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Rogério Campos-Rebelo</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
          <xref ref-type="aff" rid="aff1">1</xref>
          <xref ref-type="aff" rid="aff2">2</xref>
          <xref ref-type="aff" rid="aff3">3</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Center of Technology and Systems (CTS)</institution>
          ,
          <addr-line>UNINOVA</addr-line>
          ,
          <country country="PT">Portugal</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Intelligent Systems Associate Laboratory (LASI)</institution>
          ,
          <country country="PT">Portugal</country>
        </aff>
        <aff id="aff2">
          <label>2</label>
          <institution>Lisbon School of Engineering (ISEL), Polytechnic University of Lisbon</institution>
          ,
          <addr-line>Lisbon</addr-line>
          ,
          <country country="PT">Portugal</country>
        </aff>
        <aff id="aff3">
          <label>3</label>
          <institution>Polytechnic Institute of Beja</institution>
          ,
          <addr-line>Beja</addr-line>
          ,
          <country country="PT">Portugal</country>
        </aff>
      </contrib-group>
      <fpage>155</fpage>
      <lpage>163</lpage>
      <abstract>
        <p>Petri nets are a powerful graphical formalism that is well-suited for modeling and simulating concurrent systems. However, existing solutions for integrating high-level Petri net models with external systems and physical devices are limited, restricting their applicability for developing cyber-physical systems. This paper presents a middleware implementation that bridges this gap by enabling reference nets, a high-level Petri net class supported by the Renew tool, to interface with physical devices. The proposed middleware implementation facilitates Petri net-driven development, where the graphical net model serves as the core specification driving the system's behavior using a low-code, top-down approach. This approach transforms the traditionally autonomous Petri net model into an event-driven, reactive model capable of bidirectional communication with external physical components. The paper demonstrates the middleware's usage through a case study involving a gate and button as physical devices, exemplifying how their states and events can be seamlessly integrated into the high-level Petri net model's execution semantics. This integration empowers the development of sophisticated cyber-physical systems with Petri nets as the central, formal modeling paradigm.</p>
      </abstract>
      <kwd-group>
        <kwd>eol&gt;Reference nets</kwd>
        <kwd>RENEW</kwd>
        <kwd>Cyber-Physical Systems</kwd>
        <kwd>Low-Code</kwd>
        <kwd>Model-Based Engineering</kwd>
        <kwd>Internet of Things</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>1. Introduction</title>
      <p>
        Model-based engineering leverages low-code platforms that employ precise diagrammatic
models to bridge requirements and automated code generation. The rise of user-friendly,
low-code tools not only eases software development but can accelerate time-to-market by
streamlining the model-driven development lifecycle, allowing developers to focus on core
system logic rather than low-level coding. Petri nets ofer a powerful visual formalism with
precise semantics, supporting key concepts adopted by numerous graphical modeling languages.
Unlike some graphical specification languages, Petri nets’ formal rigor enhances efective
communication, system validation, and automated code generation throughout the development
lifecycle. This aligns with low-code approaches (e.g., [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]) but requires models that can interact
with external entities.
      </p>
      <p>
        In this paper, we leverage Reference nets [
        <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
        ], a class of high-level Petri nets supported by a
freely available tool, by presenting a middleware for communication between net models and
physical devices. The middleware includes some net models that act as the first communication
level between the net domain and the physical devices. The presented net models and middleware
are freely available at https://doi.org/10.5281/zenodo.11555310.
      </p>
      <p>The following section surveys relevant related work. Section 3 uses a running example
to describe the proposed system’s components and their behavior. Section 4 delves into the
example Petri net models, including the implementation of the Observer pattern. Finally, Section
5 concludes the paper and outlines future directions.</p>
    </sec>
    <sec id="sec-2">
      <title>2. Related Work</title>
      <p>
        Graphical modeling formalisms, such as Petri nets, are often used to design the system, but also
to simulate it, as in the work presented in [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ]. The authors present an approach to integrate
a Petri net simulator, using the Renew tool, into a service-oriented simulation architecture in
order to provide on-demand simulation as a service. However, the proposal does not provide
an explicit support for communication between the model and physical devices. The focus is
primarily on the integration of Petri net simulation into a service-oriented architecture,
reflective simulation, remote simulation capabilities, and model manipulation within a distributed
simulation environment.
      </p>
      <p>
        The work [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] presents a set of tools, based on the IOPT-Nets class, an non-autonomous
low-level net class. The tools allow modeling, simulation, verification, debugging, and code
generation for discrete-event controllers.
      </p>
      <p>
        The work presented in [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ] presents a symmetric Petri net model with publish-subscribe
middleware and a generic component abstraction that captures the flow of events, without
modeling event data, providing a useful abstraction for viewing a system composed of
distributed components. Hanisch and Lüder [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] present a signal extension for low-level Petri Nets
emphasizing the separation between the controller and the plant and a modular approach. They
conclude that the resulting models are valid, but the models are no longer Petri Nets.
      </p>
      <p>Although there have been many studies and projects involving Petri nets, it is rare to come
across the use of high-level Petri nets as a foundation for implementing systems using a
lowcode, model-driven approach. The use of Petri nets in systems implementation seems mostly
restricted to the areas of design and simulation. The following section, presents the use of the
developed middleware through an example of a simple cyber-physical system.</p>
    </sec>
    <sec id="sec-3">
      <title>3. System components and behaviour</title>
      <p>
        As a running example, we considered a prototype for a Cyber-Physical System (CPS) comprising
two physical devices: a gate and a button. The system is loosely based on the one presented by
Jackson [
        <xref ref-type="bibr" rid="ref8">8</xref>
        ]. In our system, a gate can open or close based on an external timer that commands it.
If a human operator presses a button, the gate stops moving and can then resume its movement
or returned to its previous position based on the command received from the external timer.
      </p>
      <p>
        Each communication between the Physical Device and the net model is supported by two
main components: (1) one implemented in C++ and running on each of the external devices
(Arduinos, in our prototype), and (2) a logical component, developed in Kotlin and reference
nets models, running on the Renew tool. These two components communicate bidirectionally
via the MQTT (Message Queuing Telemetry Transport) protocol, a well-known protocol that
requires minimal resources [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ]. The prototype uses the MQTT Quality of Service Level 0 (QoS0)
with default specifications.
      </p>
      <p>The gate behavior and the interaction between the model and the Physical devices (the gate
and button) take place on a reference net named Controller, later presented in Section 4.1.
This net models the gate behavior and can be seen as its controller model. It creates instances of
Gate nets, presented in Section 4.2, that handle the MQTT messages to and from the physical
devices.</p>
      <sec id="sec-3-1">
        <title>3.1. Physical Component</title>
        <p>The Physical Component is supported by C++ code running on, or directly connected to, a
physical device, and has two tasks: (1) receive, read, and execute the actions from the logical
component (the reference net); (2) send messages to the logical component allowing its update
and state synchronization. The messages are exchanged using the MQTT protocol.</p>
      </sec>
      <sec id="sec-3-2">
        <title>3.2. Logical Component (Kotlin and Petri Nets)</title>
        <p>The Logical Component is the software that initiates communication with a physical device.
It is written in the Kotlin programming language, chosen for its seamless integration with
Java, which the Renew tool uses. The Logical Component also encompasses Petri Nets-based
modeling to represent and control the system’s states and transitions.</p>
      </sec>
      <sec id="sec-3-3">
        <title>3.3. The MQTT protocol</title>
        <p>The MQTT protocol supports the bidirectional communication between each physical device
and the Logical Component. MQTT enables the two system parts to communicate efectively
and dependably, even in unstable network conditions or with constrained bandwidth.</p>
      </sec>
      <sec id="sec-3-4">
        <title>3.4. Model description</title>
        <p>The MQTT server acts as a communication intermediary between each physical device and
the Logical Component. It is hosted in the cloud. It allows the connected devices (in this case,
the physical device in an Arduino and the server running the Logical Component) to post
messages on specific topics and subscribe to receive messages of interest. This cloud server
ofers scalability, availability and security for communication between the system’s components,
allowing them to communicate reliably on a global scale.</p>
      </sec>
      <sec id="sec-3-5">
        <title>3.5. Asynchronous execution environment</title>
        <p>The Logical Component operates in a computing environment distinct from that of the Physical
Component. This means that the Logical Component can be on a device such as a personal
computer or a server. At the same time, in our prototype, each Physical Device, is embedded in
an Arduino.</p>
      </sec>
      <sec id="sec-3-6">
        <title>3.6. System behavior</title>
        <p>
          Several components need to interact asynchronously and synchronously to allow
communication between each physical device and the logical component. The sequence diagram in Figure
1 shows two message flows between the various elements, with all the elements to the right
of the MQTT Server forming part of the Logical Component. Message sequence 1 to 5 starts
on the Physical Device, while message sequence 6 to 9 start on the Controller net. Note that
messages up to the Communicator element (1 to 3) are asynchronous, as the communication
between the Java MQTTClient class and the Communicator net uses the Observer Pattern [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ].
This design pattern was used to avoid blocking the execution of the entire model while it waits
for messages. The net model reacts accordingly to the arrival of each diferent message (see
bottom of Fig. 3a).
        </p>
        <p>Physical Device</p>
        <p>MQTT Server</p>
        <p>MQTT Client</p>
        <p>Communicator</p>
        <p>Gate Net</p>
        <p>Controller
1 : Publish Status
2 : Foward to Client
3 : Trans. to Model
4 : Trans.to Net
5 : Update Status
9 : Receive Command 10 : Publish Command 8 : Publish Command 7 : Publish Command 6 : Publish Command</p>
        <p>
          The observer pattern is implemented using a net as an observer. This net uses synchronization
channels (between transitions) in diferent net instances to synchronously pass the message.
The Renew tool provides a specific tool, called stubs [
          <xref ref-type="bibr" rid="ref2 ref3">2, 3</xref>
          ], to ease the integration of nets and
Java code. The integration with Kotlin code was also achieved using this tool.
        </p>
        <p>In summary, the middleware prototype demonstrates bidirectional communication between
an embedded device (Arduino) and a computing environment (PC/server) using MQTT. The
Logical Component (based on Kotlin and Petri Nets) reflects Physical Devices’ status and sends
commands. The Physical Device’s C++ code executes received commands and provides results
to the Logical Component. The cloud MQTT server facilitates message exchange between the
components.</p>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>4. Net models</title>
      <p>In this section, we present the diferent nets that make up the Logical Component. In addition
to demonstrating the system state, we also model the interaction between the gate and button
devices. The observer pattern implementation is presented in Subsection 4.4.</p>
      <sec id="sec-4-1">
        <title>4.1. Net Controller</title>
        <p>The net Controller consists of two subnets (see Fig. 2): (1) the one on the left represents what
state the gate is in, and (2) the one on the right how a stop button interacts with the model
to pause the gate when it is moving: the gate up and down movement is gain modeled, and
a virtual place is used to duplicate place In Move. A virtual place is represented by a double
circle or ellipse and is a reference to a place, thus allowing multiple occurrences of the same
place. On the left, the net state is updated with messages that are sent by physical devices to
instances of the net gate, where each instance models a physical gate.</p>
        <p>
          As usual in high-level nets, tokens in Reference nets can have distinct values. The place num
of gates uses that possibility as the token has de initial value 1 and transition create gate
can remove that token, bind it to variable x and create a new token with value x + 1 using
an output arc expression. Additionally, and very significantly, Reference nets implement the
nets-within-nets paradigm [
          <xref ref-type="bibr" rid="ref11">11</xref>
          ] where a token can be a net. More precisely, a token can be a
reference to a net instance mimicking class-based object-oriented programming languages: nets
are classes from which executable net instances are created. In net Controller, transition
create gate creates an instance of net Gate, with an identifier as an argument, and assigns
the instance to variable g (g: new gate(holonid), which becomes a token in place Gate
Open. Hence, a running net Gate instance (see Fig. 3a) is created in net Controller and the
g token is added to the place that represents the state of the physical gate.
        </p>
        <p>Like the net Gate, an instance of net Button is also created, represented by variable bt (top
right in Fig 2. If there is a g token in the In Move virtual place, the transition button stop is
enabled. The stop button sends a message to the gate instance (g:publish("stopMotor"))
to make the physical system stop, but only if an "s" message has been received in net Button
allowing the bottom transition in Fig. 3 to fire. This is achieved using synchronous channels, a
type of transition fusion inspired by method calling in object-oriented programming languages:
one side uses the notation netInstance:message() and the other :message(). When
transition button stop fires, the g token is placed in place Gate stop. After, the gate
movement can continue up or down.</p>
        <sec id="sec-4-1-1">
          <title>4.2. Net Gate and net Button</title>
          <p>When the net Controller is instantiated, a unique net identifier is obtained ( holonId).
This identifier is sent to the created net Gate instance (g: new gate(holonId)), which
passes it to the new instance of net Communicator, that is stored in variable hc (:new(id);
hc: new communicator(id)) (see top of Fig. 3a). The following transition (in net Gate)
subscribes to the "toNet" topic, receiving messages sent by the physical device. This net
allows messages to be published to the "toPhysicalSystem" topic, which is subscribed to by the
physical counterpart, and to receive messages. Whenever the Communicator net instance, in
hc, receives a message (hc:onMessage(message)), the transition fires: the hc token is not
consumed, and the message is put in place incoming message to be consumed by one of the
following transitions. Guards are used to translate from the text message to the respective
transition to be fired, thus establishing synchronous communication between this net and the
net where the message is relevant to fire the intended transition.</p>
          <p>The net Button is analogous to the net Gate, with the primary distinction being its inability
to publish messages. Instead, it only receives a message indicating the intention to stop.</p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>4.3. Net Communicator</title>
        <p>The net Communicator (see Fig. 4a) is responsible for instantiating the Kotlin class
MqttClient, responsible for communication via the MQTT protocol and identified as "client",
and for creating an instance of net MqttMessageReceiver (see Fig. 4b), identified as "receiver",
which is then passed on to the "client".</p>
        <p>
          Whenever the "client" instance receives a message, it is passed to the "receiver" net
instance by a "stub" code built according to the Renew tool requirements [
          <xref ref-type="bibr" rid="ref2">2</xref>
          ]. The "receiver"
instance uses transition synchronization to pass the message to the net Communicator. The
net Communicator also uses synchronization between transitions to enable the message to be
transmitted to the network in which it was instantiated: the Gate or Button network.
        </p>
        <p>The listing below shows the stub code used to enable communication between the
mqtt_message_receiver network, represented in Figure 4b, and the Kotlin MqttClient class.
class MqttMessageReceiver for net mqtt_message_receiver
implements pt.nfriacowboy.presib.hermes.communication.IMessageProcessor
{
break void messageReceived(org.eclipse.paho.mqttv5.common.MqttMessage arg0) {
this:incomingMessage(arg0);
}
}</p>
        <p>Although the code is very similar, it is worth noting the line in the class declaration with the
reserved word sequence "for net". Renew uses these words to identify which network the stub is
applied to. The stub is used by the Java class as if it were another Java class. When it receives a
message, the stub’s "message received" method is invoked, and a MqttMessage object is passed.
The method MessageReceived contains code that is interpreted by renew: the "this" refers to
the net instance defined by the "for net" in the stub’s class declaration followed by the transition
that is to be fired, in this case, incomingMessage. The MQTT message is passed from one net
instance to the other through synchronous channels between transitions.</p>
        <sec id="sec-4-2-1">
          <title>4.4. Observer Pattern</title>
          <p>
            The MqttClient class implements the observer pattern [
            <xref ref-type="bibr" rid="ref10">10</xref>
            ]. The respective code is partially
presented in the listing below. When a topic is subscribed to, an observer is created. When that
topic receives a message, the message received method of the stub is executed, and the message
is passed as a parameter to the method. This triggers the sequence that sends the messages to
the net model. The Kotlin code used in this model is provided by the PRESIB architecture [
            <xref ref-type="bibr" rid="ref12">12</xref>
            ].
class MqttClient(netID: String) : ICommunicationClient {
...
override fun connect() {...}
override fun sendMessage(topic: String, message: String) {
          </p>
          <p>mqttService.sendMesssage(topic, message)
}
override fun subscribe(topic: String) {
subscribersObservers.getOrPut(topic, ::mutableListOf).add {</p>
          <p>result: ReceivedMessage -&gt; this.processor.messageReceived(result.message)
}
mqttService.subscribe(topic)
}
override fun messageProcessor(processor: IMessageProcessor) { ... }
}</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>5. Conclusions</title>
      <p>The presented functional example provides a method and software to support the use of a
high-level Petri Net model as the central component of a CPS implementation. This provides a
low-code approach, where the Petri Net models’ precise semantics is used to define the systems’
behavior and the interaction between the diferent devices. This approach ofers practical
benefits, as the nets used for simulation and analyzed for correctness can be directly applied in
implementation. In fact, the nets become part of the implementation, which not only reduces
development time but also minimizes errors, enhancing the eficiency and reliability of the CPS
implementation process.</p>
      <p>The use of bidirectional asynchronous communication provides added value as it makes the
system reactive and dependent on incoming messages. This makes the net model evolution
non-autonomous, as needed for proper synchronization with external devices. Moreover, the
proposed approach facilitates the integration of external systems with minimal modifications to
the physical components themselves. For instance, it paves the way for seamless integration
with artificial intelligence-based systems, which can be leveraged to dynamically condition
the execution semantics of the Petri net models. Another future step will be the net model
deployment outside the Renew tool, which will allow for autonomous and lighter execution.
However, using Java with garbage collection still deserves further testing as it will still be a
limitation in critical systems.</p>
    </sec>
    <sec id="sec-6">
      <title>Acknowledgments</title>
      <p>This work was financed by Portuguese Agency FCT – Fundação para a Ciência e Tecnologia, in
the framework of project UIDB/00066/2020.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>A.</given-names>
            <surname>Bucaioni</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Cicchetti</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Ciccozzi</surname>
          </string-name>
          ,
          <article-title>Modelling in low-code development: a multi-vocal systematic review</article-title>
          ,
          <source>Software and Systems Modeling</source>
          <volume>21</volume>
          (
          <year>2022</year>
          )
          <fpage>1959</fpage>
          -
          <lpage>1981</lpage>
          . URL: [https:// doi.org/10.1007/s10270-021-00964-0](https://doi.org/10.1007/s10270-021-00964-0).
          <source>doi:10. 1007/s10270-021-00964-0.</source>
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <given-names>O.</given-names>
            <surname>Kummer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Wienberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Duvigneau</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Cabac</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Haustermann</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Mosteller</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D. M.</given-names>
            <surname>Arbeitsbereich</surname>
          </string-name>
          , Renew User Guide,
          <source>Technical Report</source>
          , University of Hamburg,Department for Informatics, Theoretical Foundations Group,
          <year>2022</year>
          . Available online: https://www2. informatik.uni-hamburg.de/TGI/renew/4.0/renew4.0.
          <source>pdf (accessed on 2022-11-23).</source>
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>O.</given-names>
            <surname>Kummer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Wienberg</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Duvigneau</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Schumacher</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Köhler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Moldt</surname>
          </string-name>
          ,
          <string-name>
            <given-names>H.</given-names>
            <surname>Rölke</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Valk</surname>
          </string-name>
          ,
          <article-title>An extensible editor and simulation engine for Petri nets: Renew</article-title>
          , in: J.
          <string-name>
            <surname>Cortadella</surname>
          </string-name>
          , W. Reisig (Eds.),
          <source>Applications and Theory of Petri Nets</source>
          <year>2004</year>
          . 25th International Conference,
          <string-name>
            <surname>ICATPN</surname>
          </string-name>
          <year>2004</year>
          , Bologna, Italy,
          <year>June 2004</year>
          . Proceedings, volume
          <volume>3099</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2004</year>
          , pp.
          <fpage>484</fpage>
          -
          <lpage>493</lpage>
          . URL: http://dx.doi.org/10.1007/978-3-
          <fpage>540</fpage>
          -27793-4_
          <fpage>29</fpage>
          . doi:
          <volume>10</volume>
          .1007/ 978-3-
          <fpage>540</fpage>
          -27793-4_
          <fpage>29</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>P.</given-names>
            <surname>Polasek</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Janousek</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Ceska</surname>
          </string-name>
          ,
          <article-title>Petri net simulation as a service</article-title>
          .,
          <source>PNSE@ Petri Nets</source>
          <volume>1160</volume>
          (
          <year>2014</year>
          ).
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>F.</given-names>
            <surname>Pereira</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            <surname>Moutinho</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Costa</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.-P.</given-names>
            <surname>Barros</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Campos-Rebelo</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L.</given-names>
            <surname>Gomes</surname>
          </string-name>
          ,
          <article-title>Iopt-tools - from executable models to automatic code generation for embedded controllers development</article-title>
          , in: L.
          <string-name>
            <surname>Bernardinello</surname>
          </string-name>
          , L. Petrucci (Eds.),
          <source>Application and Theory of Petri Nets and Concurrency</source>
          , Springer International Publishing, Cham,
          <year>2022</year>
          , pp.
          <fpage>127</fpage>
          -
          <lpage>138</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>T.</given-names>
            <surname>Meyer</surname>
          </string-name>
          ,
          <article-title>A symmetric petri net model of generic publish-subscribe systems for verification and business process conformance checking</article-title>
          , in: PNSE'23: International Workshop on Petri Nets and
          <string-name>
            <given-names>Software</given-names>
            <surname>Engineering</surname>
          </string-name>
          , June 26-27,
          <year>2023</year>
          , Lisbon, Portugal, volume
          <volume>3430</volume>
          ,
          <year>2023</year>
          , pp.
          <fpage>88</fpage>
          -
          <lpage>109</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [7]
          <string-name>
            <surname>H.-M. Hanisch</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          <string-name>
            <surname>Lüder</surname>
          </string-name>
          ,
          <article-title>A signal extension for petri nets and its use in controller design</article-title>
          ,
          <source>Fundamenta informaticae 41</source>
          (
          <year>2000</year>
          )
          <fpage>415</fpage>
          -
          <lpage>431</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>M.</given-names>
            <surname>Jackson</surname>
          </string-name>
          ,
          <article-title>Problem frames: analyzing and structuring software development problems, Addison-Wesley Longman Publishing Co</article-title>
          ., Inc., USA,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9] MQTT.org,
          <source>MQTT Specification</source>
          ,
          <year>2024</year>
          . URL: https://mqtt.org/mqtt-specification.
          <source>Accessed on</source>
          <year>2024</year>
          /04/30.
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>E.</given-names>
            <surname>Gamma</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Helm</surname>
          </string-name>
          ,
          <string-name>
            <given-names>R.</given-names>
            <surname>Johnson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. M.</given-names>
            <surname>Vlissides</surname>
          </string-name>
          , Design Patterns:
          <article-title>Elements of Reusable Object-Oriented Software, 1 ed</article-title>
          .,
          <string-name>
            <surname>Addison-Wesley Professional</surname>
          </string-name>
          ,
          <year>1994</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11]
          <string-name>
            <given-names>R.</given-names>
            <surname>Valk</surname>
          </string-name>
          ,
          <article-title>Object Petri Nets - Using the Nets-within-Nets Paradigm</article-title>
          , in: J.
          <string-name>
            <surname>Desel</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          <string-name>
            <surname>Reisig</surname>
          </string-name>
          , G. Rozenberg (Eds.),
          <source>Advances in Petri Nets: Lectures on Concurrency and Petri Nets</source>
          , volume
          <volume>3098</volume>
          <source>of LNCS</source>
          , Springer,
          <year>2004</year>
          , pp.
          <fpage>819</fpage>
          -
          <lpage>848</lpage>
          . URL: http://dx.doi.org/10.1007/ 978-3-
          <fpage>540</fpage>
          -27755-2_
          <fpage>23</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>N.</given-names>
            <surname>Fernandes</surname>
          </string-name>
          ,
          <article-title>Modelo gráfico para simulação e controlo do chão de fábrica no contexto da indústria 5.0, 2022</article-title>
          .
          <article-title>Master's thesis (in portuguese), Polythecnic Institute of Beja</article-title>
          . URL: https://hdl.handle.
          <source>net/20.500</source>
          .12207/5792.
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>