ezeio2:scriptref:start

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revisionBoth sides next revision
ezeio2:scriptref:start [2019-09-02 20:51] andrehezeio2:scriptref:start [2019-11-19 01:51] andreh
Line 37: Line 37:
 This means that you should avoid long-running loops, and instead make use of blocking calls or system callbacks provided in the function library. This means that you should avoid long-running loops, and instead make use of blocking calls or system callbacks provided in the function library.
  
-The following calls are blocking:+The following calls are blocking and are allowed in 'superloops':
  
 | ''ModbusRead()'' | Read a register block from a Modbus RTU device | | ''ModbusRead()'' | Read a register block from a Modbus RTU device |
Line 45: Line 45:
 | ''ModbusTCP()'' | Send & Receive Modbus commands on the Ethernet port | | ''ModbusTCP()'' | Send & Receive Modbus commands on the Ethernet port |
 | ''sleep()'' | Suspend the script for a short time (process events immediately) | | ''sleep()'' | Suspend the script for a short time (process events immediately) |
-| ''msSleep()'' | Suspend the script for a short time (not processing events - DEPRECIATED) | 
 | ''MBRTU_Read()'' | Read a register from a Modbus RTU device | | ''MBRTU_Read()'' | Read a register from a Modbus RTU device |
 | ''MBRTU_Write()'' | Write to a register on a Modbus RTU device | | ''MBRTU_Write()'' | Write to a register on a Modbus RTU device |
Line 57: Line 56:
  
 | ''@Tick'' | Called at a regular interval, set by SetTickInterval() | | ''@Tick'' | Called at a regular interval, set by SetTickInterval() |
-| ''@Timer'' | Called when one of the four millisecond timers expire, see SetTimer() |+| ''@Timer'' | Called when one of the millisecond timers expire, see SetTimer() |
 | ''@Action'' | Called when an action is triggered due to an alarm event | | ''@Action'' | Called when an action is triggered due to an alarm event |
 | ''@Key'' | Called when a button is pressed on a connected terminal device | | ''@Key'' | Called when a button is pressed on a connected terminal device |
Line 63: Line 62:
 | ''@J1939'' | Called when a J1939 packet is received | | ''@J1939'' | Called when a J1939 packet is received |
  
 +=== State machines ===
 +
 +A common programming pattern in control applications is to use state machines. PAWN and the ezeio implements strong support for state machines. The following is a typical pattern showing the startup sequence of an engine. Note that there are three @Tick handlers; one for each state. Also note the "entry" and "exit" functions. For more detail, refer to the PAWN language guide.
 +
 +<code javascript>
 +
 +  new count = 0;
 +
 +  main()
 +  {
 +    SetTickInterval(100);   // set tick interval to 100ms (0.1s)
 +    state WAITING;          // start in the waiting mode
 +  }
 +  
 +  @Tick(uptime) <WAITING>
 +  {
 +     if( GetField(1) < 100 )  // condition to start up the process
 +        state IGNITION;
 +  }
 +  
 +// ***** the IGNITION state
 +
 +  entry() <IGNITION>
 +  {
 +     SetOutput(1, 100);       // Turn on the ignition switch
 +     count = 0;
 +  }
 +  
 +  @Tick(uptime) <IGNITION>
 +  {
 +     if( GetField(2) > 100 )  // Did the engine start?
 +        state RUNNING;        // yes - we're running
 +
 +     if(count++ > 50)
 +        state WAITING;        // didn't start in 5s? Give up and go back to waiting.
 +  }
 +  
 +  exit() <IGNITION>
 +  {
 +     SetOutput(1, 0);         // Turn the ignition switch off
 +  }
 +  
 +// ***** the RUNNING state
 +
 +  @Tick(uptime) <RUNNING>
 +  {
 +     if( GetField(2) < 100 )  // Check if the engine stopped
 +        state WAITING;        // ..go back to waiting
 +  }
 +  
 +</code>
  
  • ezeio2/scriptref/start.txt
  • Last modified: 2024-03-01 17:24
  • by andreh