A PLC is made to be real time capable, so to answer your last question, yes the system is real time capable regardless of the programming language you are using.
When you use the tf1910 extension, code for the Beckhoff runtime is generated in the background, which will run cyclically every x ms depending on your configurations.
Translating the Cycle-Internal operation to a structured language could look like this:
Imagine you have a software-component Motor which extends a software-component StateMachine.
StateMachine defines different (primitive) states like Init, Ready, Busy, Idle, Error etc.
V Boot()
|
|
<Init>
|
|
| Start()
|
|
<Ready> -----------<--------------+-------------<-----------+
| | |
| | |
| Execute() | |
| | |
| | |
| | Reset() |
<Prepare> | |
| | |
| | |
| | |
Wait() | Fault() | |
<Waiting> ---<-------->--- <Busy> ----------->----------- <Error> |
EndWait() | |
| |
| |
| |
| Done() |
| |
| |
| |
<Idle> ---------------------->------------------------------+
As a consequence Motor also inherits those states.
Now, if Motor is in the Init state, calling the Start() method will change the state from Init to Ready.
Depending on the architecture of your program this change can have an immediate effect on the program flow (this means in the current cycle) or in the next cycle.
Let's say, our StateMachine Function Block implements Cycle-Internal as a boolean input variable: bCycleInternal
and it's current state as an enumaration variable: eStateMachine
Let's also say that, depending on the value of eStateMachine (thus the current state of the state machine), StateMachine calls a specific method (e.g. for Init Init(), for Ready Ready() etc.)
When bCycleInternal is true and the Start() method changes the current state from Init to Ready, Ready() is called directly after Init() in the same cycle.
Otherwise, if bCycleInternal is false, when changing the state of the state machine (or the value of eStateMachine) from Init to Ready with the Start() method, Ready() is called not before the next cycle.