JMRI is...


Adding signals to your layout with JMRI.

General Tools

JMRI provides powerful tools for working with your layout.

Layout Automation

JMRI can be used to automate parts of your layout, from simply controlling a crossing gate to running trains in the background.

JMRI: Signaling

Modeling railroad signaling on a layout can be done many different ways, ranging from "stoplights" to complete emulation of a particular prototype's signaling logic.

Elmer McKay has provided a very nice discussion of how to get started with signals on your layout.

JMRI provides several different things that can help with this:

  1. The JMRI "Signal Head Table" tool lets you control the appearance of individual signal heads on your layout. This can be useful for debugging, for example.
  2. The JMRI "Simple Signal Logic" tool can provide simple versions of block and interlocking signaling.
  3. The JMRI "Logix" tools are basic logical building blocks for controlling parts of the layout. They can be used to configure custom signaling logic by filling out forms, without writing any code.
  4. JMRI scripting provides a comprehensive programming capability for controlling signals exactly as you'd like.
  5. The JMRI Automation classes makes it easy to code your own signal logic into the program. This is how Nick Kulp's Cornwall Railroad was signalled.
  6. JMRI provides a complete toolkit to make it easy to do any kind of automation on your layout by writing a new program of your own.

There's more information on each of these below. As you move down that list, the task becomes more and more technical, but you have more freedom to model exactly what you want.

In addition, there are people working on more advanced signaling capabilities within the JMRI project. Although it's too early to talk in detail, the idea is to provide ways of driving prototypical signaling based on aspects and appearances along with CTC dispatching and interlocking, without requiring the user to write any scripting or Java code. The jmriusers discussion group will have more info on this as it becomes available.


The documentation below describes Signaling with JMRI, and discusses how to set up the basic signal situations. The documentation is divided into sections; click below for easy access to a listed section. If you prefer to try before reading much, read Introduction to SSL, then click Getting Started and follow those instructions. Return here to read about what you did.


Some basic signal terms:

Some JMRI specific SSL and Signal terms:

Signal Head Table

All the signal heads that JMRI knows about can be referenced using the "Signal Head Table" tool in the Tools menu of most JMRI programs. There are five columns in the table: Simple Signal Logic panel figure

To define a new signal head, click on the Add New Signal Head button. It will prompt you for the signal head type (controlled by turnout outputs; SE8c; etc), and whatever setup information is needed for your choice.

This information is saved with the configuration in an XML file, along with control panel setup, Logix, Routes, and similar stuff. For more information on creating and displaying panels, including how to show signal heads on your panels, please see the Panels help page and the web pages on the Cornwall Railroad control panel.

Introduction to Simple Signal Logic

Simple Signal Logic (SSL) is a JMRI tool to enable the rapid setup of basic ABS style signaling. The SSL user interface is designed to be user friendly to all users with basic familiarity with JMRI. SSL provides a means for setting up basic signaling in an intuitive manner, without the user having to be familiar with all of the logic necessary to account for the different aspects. For more complex operations beyond the capability of SSL refer to the section on Logix. Simple Signal Logic panel figure Much of basic ABS signaling can be boiled down to "a signal head goes red when a train can't safely enter the block it protects; it goes yellow when the block following the protected block can't be entered". Although that's a simplication, it can serve as a powerful starting point for understanding signaling logic.

The Simple Signal Logic tool allows you to configure JMRI to use this basic ABS type of logic to set the appearance of a signal head. Using the panel, you enter information on:

The case of a facing point turnout which leads to two different "Protected Signal Heads" is also covered although the above figure doesn't show it. If a single signal head is used to control both branches, then choose "On Facing-Point Turnout". If a different head will control each route, then simply choose "Main" or "Diverging" leg of turnout, as required for each one.

Pause your mouse over any entry or item in the SSL creation window for a brief "tooltip" help reminder.

It's clear that this won't cover complicated interlockings nor will it cover the speed-signaling seen on some prototypes. For those situations use a combination of Logix and Routes. Logix cover the conditions, and Routes control the actions to be taken.

However, when combined with the logic capabilities of JMRI Routes and Logix units, SSL can be used to create a CTC panel, as Bob Bucklew shows on his web site.

Getting Started with Simple Signal Logic

Follow the following steps to create a signal and become familiar with how the SSL user interface works.

  1. Select Turnout Table in the Tools menu.
  2. Check to be sure that the output lines (turnouts) that will control your signal are in the table. If not, click the Add button at the bottom of the Turnout Table.
  3. In the Add New Turnout window that appears, enter a system name, (E.g. LT1) and "test" for user name, then click OK. Note: System names must start with CT, IT, LT, NT, XT, etc. and be followed by the actual hardware number of the turnout.
  4. Clicking on the correct Closed/Thrown entries in the Turnout Table should now cause your signal to change.
  5. Next select Signal Head Table in the Tools menu.
  6. In the Signal Head Table window that appears, click Add to begin defining a new signal head.
  7. In the Add New Signal window that appears choose the correct signal type to match your hardware. The required item boxes will appear.
  8. Enter a system name. For example LH152. Note: System names must start with CH, IH, LH, NH, XH, etc. and be followed by the number of this head.
  9. Next enter one or more turnout numbers that will control this signal. Note: In the case of SE8c style signals just enter the first turnout number of each pair. The second is automatically known.
  10. Click OK to enter this head into the Signal Head Table.
  11. Enter all the signal heads that you will be using for this test.
  12. Now select Simple Signal Logic in the Tools menu.
  13. Fill in the various entries to match your signals requirements as previously shown in the SSL section.
  14. Click Apply to make this entry active.
  15. Be sure to save your work.

You have just created an SSL entry to control a signal head. It's as simple as that. It took you more time to read this tutorial than to create the SSL entry.

A worked-out example is also available.

Signal Support in Logix

A JMRI Logix provides logic and control capabilities for JMRI objects, including signals. A user defines "Conditional" logic and the "Actions" that take place depending on the state of the logic. The following sub-sections talk about how Logix can examine and control signals.

Available Signal State Variables in Logix

State variables related to signals that are currently available for use in Logix Conditionals are listed below, along with information on each. State variables must always evaluate to either true or false. The condition resulting in true is given for each. If the condition is not met, the state variable evaluates to false. When a Logix is active, the states of entities (sensor, turnout, signal red, etc.) specified in state variables in its Conditionals are monitored. A calculation of all Conditionals in the Logix is triggered when any monitored state changes as noted below (if not obvious). Note: Not all possible Logix conditionals are listed here.

Available Signal Actions in Logix

Actions related to signals that are currently available for use in Logix Conditionals are listed below along with information on each. Note: Not all possible Logix actions are included here.

Automation classes

JMRI provides classes to help you write Java code to control your layout. The most powerful of these are aimed at general automation; see the automation web page. The "Siglet" class and it's kin are meant to make it easy to write signal logic; a varient of these was used for the Cornwall Railroad.

Although these require writing code, instead of just filling out a GUI form, the program handles all of the details of reading status changes from the layout, writing desired aspect changes back to the layout, and even the details of "which outputs do I have to set to get signal Apple Siding East to show yellow?". You can concentrate on just the signal logic in the code you write.


The entire JMRI toolkit is available for use if you really want to do something in detail. JMRI provides control of most DCC and C/MRI systems, with useful tools for manipulating turnouts, sensors, signals, locomotives, etc as well as powerful tools for working on the user screen.

For more information on signaling

There are a lot of excellent sources of information on prototype signaling. For information on the specifics of the technology: