<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docdepot.railrsm.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DGast</id>
	<title>DocDepot - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docdepot.railrsm.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=DGast"/>
	<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php/Special:Contributions/DGast"/>
	<updated>2026-09-09T20:23:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Setting_Up_Reports_with_SFTP&amp;diff=2656</id>
		<title>Setting Up Reports with SFTP</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Setting_Up_Reports_with_SFTP&amp;diff=2656"/>
		<updated>2026-09-08T19:58:28Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Preparation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;The Secure File Transfer Protocol (SFTP) is used to manage files over a remote connection. At Comet, one way SFTP is used is to send reports from the APU. Configuration is available on the APU to support both consist reports and maintenance reports.&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
[[Media:SFTPConsist.zip|Consist Sample Files]]&lt;br /&gt;
&lt;br /&gt;
[[Media:SFTPMaint.zip|Maintenance Sample Files]]&lt;br /&gt;
&lt;br /&gt;
SFTP can be setup and deployed by Comet Support if we have access to the site.&lt;br /&gt;
#In the case that we don’t have access to the site:&lt;br /&gt;
##A Telnet session that supports Zmodem(Hyper Terminal, Tera Term, Secure CRT) will be used.&lt;br /&gt;
##Files used in the process will be sent with a .txt extension as most email firewalls will block .ACC and .BAT files. Download these files and change the extensions back to .ACC and .BAT as directed.&lt;br /&gt;
##Two different files, an .ACC and a .BAT, will be needed. The .ACC file will point to the .BAT file. Both can be obtained by contacting Comet Support. If setting up for Consist &#039;&#039;and&#039;&#039; Maintenance Reporting via SFTP, four different files will be needed.&lt;br /&gt;
#For SFTP to be setup, the following information Is needed:&lt;br /&gt;
##Username&lt;br /&gt;
##Password&lt;br /&gt;
##URL&lt;br /&gt;
&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;Send this information to Comet Support if Support will be setting up SFTP.&amp;lt;/p&amp;gt;&lt;br /&gt;
We highly recommend using names for the files that indicate Consist or Maintenance. It is recommended to name these files based on the name of the railroad the site belongs to, as well. Using a unique name is important, as the same file name being used elsewhere can cause issues.&lt;br /&gt;
#For example, if the railroad is CSX:&amp;lt;br&amp;gt;When naming a consist file, the name “CCSXSFTP.ACC/.BAT” would be used.&amp;lt;br&amp;gt;When naming a maintenance file, the name “MCSXSFTP.ACC/.BAT” would be used.&lt;br /&gt;
&lt;br /&gt;
= Editing The Files =&lt;br /&gt;
&amp;lt;p&amp;gt;Be very careful when editing the files. A simple deletion of a symbol like % or = could result in SFTP failure. The only files that will need editing are the .BAT files. The .ACC files should not be edited.&amp;lt;/p&amp;gt;&lt;br /&gt;
#To edit the .BAT file, simply right-click on the file and select Edit from the right-click menu.&lt;br /&gt;
#There will be a section that lists the username, password, and URL to be used. Change these values to match the information noted previously.&amp;lt;br&amp;gt;&lt;br /&gt;
#Make sure to save the file after any changes have been made when editing.&lt;br /&gt;
&lt;br /&gt;
= Uploading the Files =&lt;br /&gt;
&lt;br /&gt;
#Login to the supervisory menu of the APU.&lt;br /&gt;
#Enter the &amp;amp;lt;zrec&amp;amp;gt; command, this should prompt a pop-up to begin the file transfer. What the pop-up looks like depending on what Telnet terminal is being used. Some require you to type the file and location of the file.&lt;br /&gt;
#Using &amp;amp;lt;zrec&amp;amp;gt;, upload all of the edited .ACC and .BAT files.&lt;br /&gt;
#After the files have been uploaded, check if they are present using the &amp;amp;lt;dir&amp;amp;gt; command. To do so, enter &amp;amp;lt;dir [filename]&amp;amp;gt;, replacing filename with the appropriate .ACC or .BAT filename.&lt;br /&gt;
##For example, &amp;amp;lt;dir CCSXFTP.ACC&amp;amp;gt; would search for the CCSXFTP.ACC file.&lt;br /&gt;
&lt;br /&gt;
= Changing the Parameters =&lt;br /&gt;
&lt;br /&gt;
#Login to the supervisory menu of the APU.&lt;br /&gt;
#Enter the &amp;amp;lt;ep&amp;amp;gt; command to open the edit parameters menu.&lt;br /&gt;
#Navigate to Session 1 in the edit parameters menu.&lt;br /&gt;
#Enter &amp;quot;3&amp;quot; to access AEI Report Connect. This submenu contains the information required to establish an SFTP connection is stored. This allows the APU to send consist reports. See below for an example of what this menu looks like.&amp;lt;br&amp;gt;[[image:img1737423083070.png|287px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
#Enter the filename of the .ACC file used for consist reports created earlier in the AccessFilename parameter.&lt;br /&gt;
#Navigate back to Session 1 by pressing &amp;amp;lt;esc&amp;amp;gt; or &amp;amp;lt;x&amp;amp;gt;.&lt;br /&gt;
#Enter “2” to access AEI Report Opts. This submenu configures how the APU reports its data. See below for an example of what this menu looks like.&amp;lt;br&amp;gt;[[image:img1737464403104.png|289px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
#Set the HostReportingOption parameter to 1 to enable reporting.&lt;br /&gt;
#If setting up Maintenance reports, repeat this process for the Maintenance Reports. Option 4 will access the Maintenance Report Options submenu, and option 5 will access the Maintenance Report Connect submenu.&amp;lt;br&amp;gt;&lt;br /&gt;
#Once all the files and parameters have been changed, perform a full reboot using the &amp;amp;lt;r&amp;amp;gt; command. This will ensure the changes made will take effect.&lt;br /&gt;
#To test the SFTP setup for consist reports, type in, HR,NOW at the supervisory menu. This will force the APU to send consist reports.&lt;br /&gt;
#To test the maintenance reports, enter the &amp;amp;lt;sm&amp;amp;gt; command to simulate maintenance. Wait a few minutes for everything to send.&lt;br /&gt;
#At the Supervisory menu, enter &amp;amp;lt;sys&amp;amp;gt; to access the system log. Select 101 for reporting and c for continuous. To check if the report settings are correct, the filename chosen previously for the .ACC file(s) should now be reflected in the log. The file transfer log should also report messages similar to the following:&amp;lt;br&amp;gt;[[image:img1737465999134.png|448px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This indicates that the files have been successfully reported.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&amp;lt;p&amp;gt;If issues reporting are still present after setup:&amp;lt;/p&amp;gt;&lt;br /&gt;
#Ensure the DNS settings are correct. Check if the IPs in the DNS file can be successfully pinged.&lt;br /&gt;
#Check filenames and match them with the parameters.&lt;br /&gt;
#Ensure a full reboot has been performed.&lt;br /&gt;
#Check the passwords in the SFTP file.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Setting_Up_Reports_with_SFTP&amp;diff=2655</id>
		<title>Setting Up Reports with SFTP</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Setting_Up_Reports_with_SFTP&amp;diff=2655"/>
		<updated>2026-09-08T19:58:00Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Preparation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;The Secure File Transfer Protocol (SFTP) is used to manage files over a remote connection. At Comet, one way SFTP is used is to send reports from the APU. Configuration is available on the APU to support both consist reports and maintenance reports.&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
[[media:sFTPConsist.zip|Consist Sample Files]]&lt;br /&gt;
&lt;br /&gt;
[[media:sFTPMaint.zip|Maintenance Sample Files]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SFTP can be setup and deployed by Comet Support if we have access to the site.&lt;br /&gt;
#In the case that we don’t have access to the site:&lt;br /&gt;
##A Telnet session that supports Zmodem(Hyper Terminal, Tera Term, Secure CRT) will be used.&lt;br /&gt;
##Files used in the process will be sent with a .txt extension as most email firewalls will block .ACC and .BAT files. Download these files and change the extensions back to .ACC and .BAT as directed.&lt;br /&gt;
##Two different files, an .ACC and a .BAT, will be needed. The .ACC file will point to the .BAT file. Both can be obtained by contacting Comet Support. If setting up for Consist &#039;&#039;and&#039;&#039; Maintenance Reporting via SFTP, four different files will be needed.&lt;br /&gt;
#For SFTP to be setup, the following information Is needed:&lt;br /&gt;
##Username&lt;br /&gt;
##Password&lt;br /&gt;
##URL&lt;br /&gt;
&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;Send this information to Comet Support if Support will be setting up SFTP.&amp;lt;/p&amp;gt;&lt;br /&gt;
We highly recommend using names for the files that indicate Consist or Maintenance. It is recommended to name these files based on the name of the railroad the site belongs to, as well. Using a unique name is important, as the same file name being used elsewhere can cause issues.&lt;br /&gt;
#For example, if the railroad is CSX:&amp;lt;br&amp;gt;When naming a consist file, the name “CCSXSFTP.ACC/.BAT” would be used.&amp;lt;br&amp;gt;When naming a maintenance file, the name “MCSXSFTP.ACC/.BAT” would be used.&lt;br /&gt;
&lt;br /&gt;
= Editing The Files =&lt;br /&gt;
&amp;lt;p&amp;gt;Be very careful when editing the files. A simple deletion of a symbol like % or = could result in SFTP failure. The only files that will need editing are the .BAT files. The .ACC files should not be edited.&amp;lt;/p&amp;gt;&lt;br /&gt;
#To edit the .BAT file, simply right-click on the file and select Edit from the right-click menu.&lt;br /&gt;
#There will be a section that lists the username, password, and URL to be used. Change these values to match the information noted previously.&amp;lt;br&amp;gt;&lt;br /&gt;
#Make sure to save the file after any changes have been made when editing.&lt;br /&gt;
&lt;br /&gt;
= Uploading the Files =&lt;br /&gt;
&lt;br /&gt;
#Login to the supervisory menu of the APU.&lt;br /&gt;
#Enter the &amp;amp;lt;zrec&amp;amp;gt; command, this should prompt a pop-up to begin the file transfer. What the pop-up looks like depending on what Telnet terminal is being used. Some require you to type the file and location of the file.&lt;br /&gt;
#Using &amp;amp;lt;zrec&amp;amp;gt;, upload all of the edited .ACC and .BAT files.&lt;br /&gt;
#After the files have been uploaded, check if they are present using the &amp;amp;lt;dir&amp;amp;gt; command. To do so, enter &amp;amp;lt;dir [filename]&amp;amp;gt;, replacing filename with the appropriate .ACC or .BAT filename.&lt;br /&gt;
##For example, &amp;amp;lt;dir CCSXFTP.ACC&amp;amp;gt; would search for the CCSXFTP.ACC file.&lt;br /&gt;
&lt;br /&gt;
= Changing the Parameters =&lt;br /&gt;
&lt;br /&gt;
#Login to the supervisory menu of the APU.&lt;br /&gt;
#Enter the &amp;amp;lt;ep&amp;amp;gt; command to open the edit parameters menu.&lt;br /&gt;
#Navigate to Session 1 in the edit parameters menu.&lt;br /&gt;
#Enter &amp;quot;3&amp;quot; to access AEI Report Connect. This submenu contains the information required to establish an SFTP connection is stored. This allows the APU to send consist reports. See below for an example of what this menu looks like.&amp;lt;br&amp;gt;[[image:img1737423083070.png|287px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
#Enter the filename of the .ACC file used for consist reports created earlier in the AccessFilename parameter.&lt;br /&gt;
#Navigate back to Session 1 by pressing &amp;amp;lt;esc&amp;amp;gt; or &amp;amp;lt;x&amp;amp;gt;.&lt;br /&gt;
#Enter “2” to access AEI Report Opts. This submenu configures how the APU reports its data. See below for an example of what this menu looks like.&amp;lt;br&amp;gt;[[image:img1737464403104.png|289px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
#Set the HostReportingOption parameter to 1 to enable reporting.&lt;br /&gt;
#If setting up Maintenance reports, repeat this process for the Maintenance Reports. Option 4 will access the Maintenance Report Options submenu, and option 5 will access the Maintenance Report Connect submenu.&amp;lt;br&amp;gt;&lt;br /&gt;
#Once all the files and parameters have been changed, perform a full reboot using the &amp;amp;lt;r&amp;amp;gt; command. This will ensure the changes made will take effect.&lt;br /&gt;
#To test the SFTP setup for consist reports, type in, HR,NOW at the supervisory menu. This will force the APU to send consist reports.&lt;br /&gt;
#To test the maintenance reports, enter the &amp;amp;lt;sm&amp;amp;gt; command to simulate maintenance. Wait a few minutes for everything to send.&lt;br /&gt;
#At the Supervisory menu, enter &amp;amp;lt;sys&amp;amp;gt; to access the system log. Select 101 for reporting and c for continuous. To check if the report settings are correct, the filename chosen previously for the .ACC file(s) should now be reflected in the log. The file transfer log should also report messages similar to the following:&amp;lt;br&amp;gt;[[image:img1737465999134.png|448px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This indicates that the files have been successfully reported.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&amp;lt;p&amp;gt;If issues reporting are still present after setup:&amp;lt;/p&amp;gt;&lt;br /&gt;
#Ensure the DNS settings are correct. Check if the IPs in the DNS file can be successfully pinged.&lt;br /&gt;
#Check filenames and match them with the parameters.&lt;br /&gt;
#Ensure a full reboot has been performed.&lt;br /&gt;
#Check the passwords in the SFTP file.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:SFTPMaint.zip&amp;diff=2654</id>
		<title>File:SFTPMaint.zip</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:SFTPMaint.zip&amp;diff=2654"/>
		<updated>2026-09-08T19:54:24Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:SFTPConsist.zip&amp;diff=2653</id>
		<title>File:SFTPConsist.zip</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:SFTPConsist.zip&amp;diff=2653"/>
		<updated>2026-09-08T19:54:03Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Setting_Up_Reports_with_SFTP&amp;diff=2652</id>
		<title>Setting Up Reports with SFTP</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Setting_Up_Reports_with_SFTP&amp;diff=2652"/>
		<updated>2026-09-08T19:53:28Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Preparation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;The Secure File Transfer Protocol (SFTP) is used to manage files over a remote connection. At Comet, one way SFTP is used is to send reports from the APU. Configuration is available on the APU to support both consist reports and maintenance reports.&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
= Preparation =&lt;br /&gt;
&lt;br /&gt;
[[file:sFTPConsist.zip|Consist Sample Files]]&lt;br /&gt;
&lt;br /&gt;
[[file:sFTPMaint.zip|Maintenance Sample Files]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SFTP can be setup and deployed by Comet Support if we have access to the site.&lt;br /&gt;
#In the case that we don’t have access to the site:&lt;br /&gt;
##A Telnet session that supports Zmodem(Hyper Terminal, Tera Term, Secure CRT) will be used.&lt;br /&gt;
##Files used in the process will be sent with a .txt extension as most email firewalls will block .ACC and .BAT files. Download these files and change the extensions back to .ACC and .BAT as directed.&lt;br /&gt;
##Two different files, an .ACC and a .BAT, will be needed. The .ACC file will point to the .BAT file. Both can be obtained by contacting Comet Support. If setting up for Consist &#039;&#039;and&#039;&#039; Maintenance Reporting via SFTP, four different files will be needed.&lt;br /&gt;
#For SFTP to be setup, the following information Is needed:&lt;br /&gt;
##Username&lt;br /&gt;
##Password&lt;br /&gt;
##URL&lt;br /&gt;
&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;Send this information to Comet Support if Support will be setting up SFTP.&amp;lt;/p&amp;gt;&lt;br /&gt;
We highly recommend using names for the files that indicate Consist or Maintenance. It is recommended to name these files based on the name of the railroad the site belongs to, as well. Using a unique name is important, as the same file name being used elsewhere can cause issues.&lt;br /&gt;
#For example, if the railroad is CSX:&amp;lt;br&amp;gt;When naming a consist file, the name “CCSXSFTP.ACC/.BAT” would be used.&amp;lt;br&amp;gt;When naming a maintenance file, the name “MCSXSFTP.ACC/.BAT” would be used.&lt;br /&gt;
&lt;br /&gt;
= Editing The Files =&lt;br /&gt;
&amp;lt;p&amp;gt;Be very careful when editing the files. A simple deletion of a symbol like % or = could result in SFTP failure. The only files that will need editing are the .BAT files. The .ACC files should not be edited.&amp;lt;/p&amp;gt;&lt;br /&gt;
#To edit the .BAT file, simply right-click on the file and select Edit from the right-click menu.&lt;br /&gt;
#There will be a section that lists the username, password, and URL to be used. Change these values to match the information noted previously.&amp;lt;br&amp;gt;&lt;br /&gt;
#Make sure to save the file after any changes have been made when editing.&lt;br /&gt;
&lt;br /&gt;
= Uploading the Files =&lt;br /&gt;
&lt;br /&gt;
#Login to the supervisory menu of the APU.&lt;br /&gt;
#Enter the &amp;amp;lt;zrec&amp;amp;gt; command, this should prompt a pop-up to begin the file transfer. What the pop-up looks like depending on what Telnet terminal is being used. Some require you to type the file and location of the file.&lt;br /&gt;
#Using &amp;amp;lt;zrec&amp;amp;gt;, upload all of the edited .ACC and .BAT files.&lt;br /&gt;
#After the files have been uploaded, check if they are present using the &amp;amp;lt;dir&amp;amp;gt; command. To do so, enter &amp;amp;lt;dir [filename]&amp;amp;gt;, replacing filename with the appropriate .ACC or .BAT filename.&lt;br /&gt;
##For example, &amp;amp;lt;dir CCSXFTP.ACC&amp;amp;gt; would search for the CCSXFTP.ACC file.&lt;br /&gt;
&lt;br /&gt;
= Changing the Parameters =&lt;br /&gt;
&lt;br /&gt;
#Login to the supervisory menu of the APU.&lt;br /&gt;
#Enter the &amp;amp;lt;ep&amp;amp;gt; command to open the edit parameters menu.&lt;br /&gt;
#Navigate to Session 1 in the edit parameters menu.&lt;br /&gt;
#Enter &amp;quot;3&amp;quot; to access AEI Report Connect. This submenu contains the information required to establish an SFTP connection is stored. This allows the APU to send consist reports. See below for an example of what this menu looks like.&amp;lt;br&amp;gt;[[image:img1737423083070.png|287px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
#Enter the filename of the .ACC file used for consist reports created earlier in the AccessFilename parameter.&lt;br /&gt;
#Navigate back to Session 1 by pressing &amp;amp;lt;esc&amp;amp;gt; or &amp;amp;lt;x&amp;amp;gt;.&lt;br /&gt;
#Enter “2” to access AEI Report Opts. This submenu configures how the APU reports its data. See below for an example of what this menu looks like.&amp;lt;br&amp;gt;[[image:img1737464403104.png|289px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
#Set the HostReportingOption parameter to 1 to enable reporting.&lt;br /&gt;
#If setting up Maintenance reports, repeat this process for the Maintenance Reports. Option 4 will access the Maintenance Report Options submenu, and option 5 will access the Maintenance Report Connect submenu.&amp;lt;br&amp;gt;&lt;br /&gt;
#Once all the files and parameters have been changed, perform a full reboot using the &amp;amp;lt;r&amp;amp;gt; command. This will ensure the changes made will take effect.&lt;br /&gt;
#To test the SFTP setup for consist reports, type in, HR,NOW at the supervisory menu. This will force the APU to send consist reports.&lt;br /&gt;
#To test the maintenance reports, enter the &amp;amp;lt;sm&amp;amp;gt; command to simulate maintenance. Wait a few minutes for everything to send.&lt;br /&gt;
#At the Supervisory menu, enter &amp;amp;lt;sys&amp;amp;gt; to access the system log. Select 101 for reporting and c for continuous. To check if the report settings are correct, the filename chosen previously for the .ACC file(s) should now be reflected in the log. The file transfer log should also report messages similar to the following:&amp;lt;br&amp;gt;[[image:img1737465999134.png|448px|center|frameless]]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This indicates that the files have been successfully reported.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
&amp;lt;p&amp;gt;If issues reporting are still present after setup:&amp;lt;/p&amp;gt;&lt;br /&gt;
#Ensure the DNS settings are correct. Check if the IPs in the DNS file can be successfully pinged.&lt;br /&gt;
#Check filenames and match them with the parameters.&lt;br /&gt;
#Ensure a full reboot has been performed.&lt;br /&gt;
#Check the passwords in the SFTP file.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=SFTP_Feature_Product_Bulletin&amp;diff=2647</id>
		<title>SFTP Feature Product Bulletin</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=SFTP_Feature_Product_Bulletin&amp;diff=2647"/>
		<updated>2026-09-08T13:10:19Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Supported Hardware */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div&amp;gt;&amp;lt;p&amp;gt;SFTP (Secure File Transfer Protocol) feature is an optional module that provides encrypted consist and maintenance transport from the APU102 to a host system.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This document describes the installation and configuration of the SFTP client feature.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The described procedures are “generic”. Customer-specific procedures are described elsewhere.&lt;br /&gt;
==== Supported Hardware ====&lt;br /&gt;
The SFTP feature requires the T10 or LX800 processor module; the LPM-TX processor is not supported.&lt;br /&gt;
==== Contents ====&lt;br /&gt;
&amp;lt;p&amp;gt;This document covers installation of the SFTP update and describes authentication (login) to an SFTP server.&amp;lt;/p&amp;gt;&lt;br /&gt;
==== See Also ====&lt;br /&gt;
&amp;lt;p&amp;gt;To use public-private key authentication, see provided [[#Sample BAT File|Sample BAT File]].&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
&amp;lt;p&amp;gt;The update payload is large so a fast and reliable link is required for installation.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; width: 850px; margin-left: auto; margin-right: auto;&amp;quot; border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;4px&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 1113.27px; background-color: rgb(241, 196, 15);&amp;quot; | &amp;lt;p style=&amp;quot;text-align: left;&amp;quot; &amp;gt;&#039;&#039;&#039;Disclaimer&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 1113.27px;&amp;quot; | &amp;lt;p&amp;gt;Comet Electronics makes no guarantees whatsoever regarding the suitability or security of any third-party software such as WinSCP, PuTTY, or TeraTerm. &#039;&#039;&#039;Use at your own risk.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;It is up to the user to establish that software is genuine, properly licensed, and compliant with any company Information Technology (IT) policies.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;Contact your IT department for guidance.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; width: 850px; margin-left: auto; margin-right: auto;&amp;quot; border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;4px&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 838.268px; background-color: rgb(53, 152, 219);&amp;quot; | &amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(255, 255, 255);&amp;quot; &amp;gt;&#039;&#039;&#039;File Transfers Using ZMODEM over SSH&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 838.268px;&amp;quot; | &amp;lt;p&amp;gt;This note applies only if communications with the APU102 is by SSH. Plain Telnet connections are not affected.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;In the current version of the SSH (Secure SHell) feature, ZMODEM transfer to send/receive file is not reliable.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;As an alternative, SCP is supported (and is easier to use than ZMODEM). FTP may also be available (depending on APU102 settings).&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
===== Installation Details =====&lt;br /&gt;
&amp;lt;p&amp;gt;Installation involves two steps: uploading the update payload (the three files noted earlier) and rebooting the APU102 to complete installation. The following shows step-by-step instructions for each of the supported upload methods.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Three files are sent to the APU102:&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot; &amp;gt;INSTSFTP.EXE&amp;lt;br&amp;gt;F.BAT&amp;lt;br&amp;gt;ZIP.PSP&amp;lt;/p&amp;gt;&lt;br /&gt;
====== Telnet ======&lt;br /&gt;
&amp;lt;p&amp;gt;If Telnet connections are permitted, the ZREC command may be used to upload the update payload. (Note: ZMODEM over SSH is not reliable in the current software.)&amp;lt;/p&amp;gt;&lt;br /&gt;
#Connect to the APU102 using a Telnet client such as Tera Term.&lt;br /&gt;
#Login to Session #1 and use the C command to enter Change mode.&lt;br /&gt;
#For each of the three files, use the ZREC command and then send the file using ZMODEM transfer&lt;br /&gt;
#Reboot the APU102 (R command).&lt;br /&gt;
====== FTP ======&lt;br /&gt;
&amp;lt;p&amp;gt;If the FTP server on the APU102 is enabled, an FTP client such as WinSCP or FileZilla may be used to send the update.&amp;lt;/p&amp;gt;&lt;br /&gt;
#Open an FTP session using the IP address for the APU102 being updated.&lt;br /&gt;
#Login using credentials provided by Comet.&lt;br /&gt;
#Navigate to the D:\AEI directory.&lt;br /&gt;
#Upload three update files.&lt;br /&gt;
#Close FTP session.&lt;br /&gt;
#Connect to the APU102 using a Telnet client or SSH client (if SSH is enabled).&lt;br /&gt;
#Login to Session #1 and use the C command to enter Change mode.&lt;br /&gt;
#Reboot the APU102 (R command).&lt;br /&gt;
====== SCP ======&lt;br /&gt;
&amp;lt;p&amp;gt;If SSH is enabled, an SCP client such as WinSCP may be used to upload the update payload.&amp;lt;/p&amp;gt;&lt;br /&gt;
#Open an SCP session using the IP address for the APU102 being updated.&lt;br /&gt;
#Login using credentials provided by Comet.&lt;br /&gt;
#Navigate to the D:\AEI directory.&lt;br /&gt;
#Upload three update files.&lt;br /&gt;
#Close SCP session.&lt;br /&gt;
#Connect to the APU102 using a Telnet client or SSH client (if SSH is enabled).&lt;br /&gt;
#Login to Session #1 and use the C command to enter Change mode.&lt;br /&gt;
#Reboot the APU102 (R command).&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&amp;lt;p&amp;gt;Configuration is customer specific. Consult Comet for guidance.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In general, configuration consists of installing appropriate access (ACC) files describe how the APU102 is to deliver consist and maintenance reports to a server. Parameters for report delivery are changed to specify the appropriate SFTP ACC files (AEIReportConnect and MaintReportConnect settings accessed using the EP command).&amp;lt;p&amp;gt;In the case of SFTP, the ACC file specifies that the APU executes a BAT (batch) file which consists of a list of Windows commands to prepare and deliver the report payload.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;These BAT files are customized to meet each customer’s requirements. See [[#Sample BAT File|Sample BAT File]] for an example.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
====== Testing ======&lt;br /&gt;
&lt;br /&gt;
#When the unit is running, connect again (don’t need Change mode at this point) and run the ST (Simulate Train) and SM (Simulate Maintenance event) to trigger reporting.&lt;br /&gt;
#Verify that the events are correctly reported to the railroad host system.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Procedure Complete.&lt;br /&gt;
= Description of Changes =&lt;br /&gt;
&amp;lt;p&amp;gt;This update includes:&amp;lt;/p&amp;gt;&lt;br /&gt;
*- Updated “curl.exe” package&lt;br /&gt;
*- Updated report delivery scripts (ACC files). The names of these files are the same is in previous configurations. The new scripts refer to BAT files that contain the commands using curl.exe to send files using SFTP protocol.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Using WinSCP =&lt;br /&gt;
&amp;lt;p&amp;gt;WinSCP is available for download on the internet:&amp;lt;/p&amp;gt;&lt;br /&gt;
:[https://winscp.net/eng/index.php https://winscp.net/eng/index.php]&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; width: 821px; margin-left: auto; margin-right: auto;&amp;quot; border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;4px&amp;quot;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width: 811.266px; background-color: rgb(241, 196, 15);&amp;quot; | &amp;lt;p&amp;gt;&#039;&#039;&#039;Disclaimer&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;width: 811.266px;&amp;quot; | &amp;lt;p&amp;gt;Comet Electronics makes no guarantees whatsoever regarding the suitability or security of any third-party software such as WinSCP, PuTTY, or TeraTerm. &#039;&#039;&#039;Use at your own risk.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;It is up to the user to establish that software is genuine, properly licensed, and compliant with any company Information Technology (IT) policies.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Contact your IT department for guidance.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;WinSCP provides a graphical interface showing files on your PC and files on the remote system. Refer to WinSCP website for documentation. When uploading files to the APU102, ensure that /d/aei is the current directory (see illustration).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;To connect with an APU102, you will need to know which protocols are supported: SCP, FTP, or both. Note: is it possible for an APU102 to be configured such that neither transfer protocol is supported.&amp;lt;/p&amp;gt;&lt;br /&gt;
[[image:img1738315039976.png|653px|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
= Authentication =&lt;br /&gt;
&amp;lt;p&amp;gt;When connecting to an SFTP server, the APU102 (the client) is required to provide a username and either a password or private key.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;If a key is to be used, the private key is installed on the APU102 and specified in the BAT file.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;The corresponding public key is installed on the server in the “authorized_keys” file. This is server-specific (e.g. OpenSSH configuration may not be the same as other server software).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sample BAT File =&lt;br /&gt;
&amp;lt;p&amp;gt;A sample BAT file is shown:&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(22, 145, 121);&amp;quot; &amp;gt;REM 1 - site index&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(22, 145, 121);&amp;quot; &amp;gt;REM 2 - filename&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(22, 145, 121);&amp;quot; &amp;gt;REM 3 - site name&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;set OUTPUT=MYRR2CN.%1.TXT&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;set OUTPUT2=MYRR 2CN.2.%1.TXT&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;set OUTLOG=MYRR 2CN.%1.LOG&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;del %OUTPUT%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;del %OUTPUT2%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;del %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(22, 145, 121);&amp;quot; &amp;gt;REM be sure to keep the trailing &#039;/&#039; on the URL if specifying a directory!&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;curl -k -u someuser:somepassword -T %2 sftp://10.1.3.200/MYRR_TO_CNRR/ 1&amp;amp;gt; %OUTPUT% 2&amp;amp;gt; %OUTPUT2%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(22, 145, 121);&amp;quot; &amp;gt;REM check error level&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;if NOT %ERRORLEVEL% == 0 goto Failure&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(22, 145, 121);&amp;quot; &amp;gt;REM create log file&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(186, 55, 42);&amp;quot; &amp;gt;:Success&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Status:success &amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Supporting info: &amp;amp;gt;&amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo curl completed successfully &amp;amp;gt;&amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;goto End&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(186, 55, 42);&amp;quot; &amp;gt;:Failure&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(186, 55, 42);&amp;quot; &amp;gt;:CurlFailure&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Status:failure &amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Supporting info: &amp;amp;gt;&amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;strfunc -sf &amp;quot;curl:&amp;quot; %OUTPUT2%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;if %ERRORLEVEL% == 1 goto UnknownFailure&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;strfunc -sf &amp;quot;curl:&amp;quot; %OUTPUT2% &amp;amp;gt;&amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;goto End&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(186, 55, 42);&amp;quot; &amp;gt;:UnknownFailure&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Status:failure &amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Supporting info: &amp;amp;gt;&amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;echo Curl had unexpected failure, check log file &amp;amp;gt;&amp;amp;gt; %OUTLOG%&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: rgb(186, 55, 42);&amp;quot; &amp;gt;:End&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;The name of the BAT file must agree with the name of the ACC file. In other words, if the ACC file is called AEICRR1.ACC, the corresponding BAT file must be called AEICRR1.BAT. By convention, the log files (specified in the three set statements at the top of the BAT file have the same base filename (e.g.&amp;amp;nbsp; AEICRR1) as the ACC file.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;If a key file is used in place of a password, the “curl” command should look like this:&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p class=&amp;quot;mwt-heading&amp;quot; style=&amp;quot;margin-left: 25px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(35, 111, 161);&amp;quot; &amp;gt;curl -k –key keyfilename.key -T %2 sftp://username@10.1.3.200/MYRR_TO_CNRR/ 1&amp;amp;gt; %OUTPUT% 2&amp;amp;gt; %OUTPUT2%&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Converting PuTTY Key to OpenSSH =&lt;br /&gt;
&amp;lt;p&amp;gt;If a public-private key pair is creating using PuTTY, the private key file must be converted to a format usable to OpenSSH before installing on the APU102.&amp;lt;/p&amp;gt;&lt;br /&gt;
[[image:img1738340988024.png|250px|left|frameless|Figure 1]]&lt;br /&gt;
&amp;lt;p&amp;gt;PuTTY includes a utility called PuTTYgen to perform this function. This utility may be found in the PuTTY folder in the Windows Start menu (Figure 1).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The procedure may be used to convert a previously created private key file (.PPK).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Procedure ==&lt;br /&gt;
[[image:img1738344171249.png|492px|left|frameless|Figure 2]]&lt;br /&gt;
&amp;lt;p&amp;gt;After starting the PuTTYgen utility, load the private key (.PPK) file by clicking the “Load” button (Figure 2).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Once the file is loaded, select “Export OpenSSH Key” from the Conversions menu (Figure 3):&amp;lt;/p&amp;gt;&lt;br /&gt;
[[image:img1738248864418.png|492px|left|frameless|Figure 3]][[image:img1738308929553.png|321px|left|frameless|Figure 4]]&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If prompted to save the key without a passphrase, click “Yes” (Figure 4).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;Once the file is saved, it is uploaded to the APU102. The BAT file on the APU102 used to send reports using SFTP need to be edited to specify the appropriate key file (see provided [[#Sample BAT File|Sample BAT File]]).&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;nbsp;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&amp;amp;nbsp;&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====== Open Source Licenses ======&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;CURL.EXE&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;COPYRIGHT AND PERMISSION NOTICE&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Copyright (c) 1996 - 2010, Daniel Stenberg, &amp;amp;lt;daniel@haxx.se&amp;amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;All rights reserved.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Permission to use, copy, modify, and distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;THE SOFTWARE IS PROVIDED &amp;quot;AS IS&amp;quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Except as contained in this notice, the name of a copyright holder shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization of the copyright holder.&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:481503.pdf&amp;diff=2524</id>
		<title>File:481503.pdf</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:481503.pdf&amp;diff=2524"/>
		<updated>2026-07-30T19:06:01Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Field_Installation_Reference_Drawings&amp;diff=2523</id>
		<title>Field Installation Reference Drawings</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Field_Installation_Reference_Drawings&amp;diff=2523"/>
		<updated>2026-07-30T19:05:49Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Media:481500.pdf|481500 Grounding Install]]&lt;br /&gt;
&lt;br /&gt;
[[Media:481501.pdf|481501 Loop Mounting Install]]&lt;br /&gt;
&lt;br /&gt;
[[Media:481503.pdf|481503 Network Comm Install]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Main_Page&amp;diff=2522</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Main_Page&amp;diff=2522"/>
		<updated>2026-07-30T18:55:44Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Installation and Operations Guides */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Comet Support == &lt;br /&gt;
[[Comet Support | Contact Comet Support]]&lt;br /&gt;
&lt;br /&gt;
== RailNET Software ==&lt;br /&gt;
[[RailNET Software]]&lt;br /&gt;
&lt;br /&gt;
== RailNet Reference Materials ==&lt;br /&gt;
&lt;br /&gt;
=== Documentation Packet ===&lt;br /&gt;
[[RailNET Full System Documentation Packet (2024)]]&lt;br /&gt;
&lt;br /&gt;
=== Installation and Operations Guides ===&lt;br /&gt;
* [[RailNet AEI System – Operations Manual]]&lt;br /&gt;
* [[Railnet AEI System Site Installation Manual]]&lt;br /&gt;
* [[RailNET In a NEMA Enclosure Installation Manual]]&lt;br /&gt;
* [[Field Installation Reference Drawings]]&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Guidance ===&lt;br /&gt;
[[RailNET Upgrade Guidance]]&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
[[S9203 Site to Host Consist Report Decoder Reference]]&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
[[Troubleshooting Index]]&lt;br /&gt;
&lt;br /&gt;
== Cinq Edge ==&lt;br /&gt;
* [[CINQ Edge User Quick Start Guide|Cinq Edge User Quick Start Guide]]&lt;br /&gt;
* [[CINQ Edge Installation Manual|Cinq Edge Installation Manual]]&lt;br /&gt;
&lt;br /&gt;
== Distribution ==&lt;br /&gt;
[[Transcore]]&lt;br /&gt;
&lt;br /&gt;
== Bulletins ==&lt;br /&gt;
* [[Product Bulletins]]&lt;br /&gt;
* [[Service Bulletins]]&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
[[Basic Networking]]&lt;br /&gt;
&lt;br /&gt;
== Legal ==&lt;br /&gt;
* [[Privacy Policy]]&lt;br /&gt;
* [[Cookie Policy]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:481501.pdf&amp;diff=2521</id>
		<title>File:481501.pdf</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:481501.pdf&amp;diff=2521"/>
		<updated>2026-07-30T18:53:44Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:481500.pdf&amp;diff=2520</id>
		<title>File:481500.pdf</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:481500.pdf&amp;diff=2520"/>
		<updated>2026-07-30T18:53:31Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Field_Installation_Reference_Drawings&amp;diff=2519</id>
		<title>Field Installation Reference Drawings</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Field_Installation_Reference_Drawings&amp;diff=2519"/>
		<updated>2026-07-30T18:53:20Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[media:481500.pdf|481500 Grounding Install]]&lt;br /&gt;
&lt;br /&gt;
[[media:481501.pdf|481501 Loop Mounting Install]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Field_Installation_Reference_Drawings&amp;diff=2518</id>
		<title>Field Installation Reference Drawings</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Field_Installation_Reference_Drawings&amp;diff=2518"/>
		<updated>2026-07-30T18:53:10Z</updated>

		<summary type="html">&lt;p&gt;DGast: Created page with &amp;quot;481500 Grounding Install 481501 Loop Mounting Install&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[media:481500.pdf|481500 Grounding Install]]&lt;br /&gt;
[[media:481501.pdf|481501 Loop Mounting Install]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2517</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2517"/>
		<updated>2026-07-30T13:08:09Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope:&#039;&#039;&#039;  Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message.&lt;br /&gt;
&lt;br /&gt;
=== Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;This page is an implementation summary. The AAR MSRP is licensed, copyrighted material&amp;lt;/big&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2516</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2516"/>
		<updated>2026-07-30T13:07:32Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message.&lt;br /&gt;
&lt;br /&gt;
=== Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;This page is an implementation summary. The AAR MSRP is licensed, copyrighted material&amp;lt;/big&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2515</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2515"/>
		<updated>2026-07-29T22:01:04Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2514</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2514"/>
		<updated>2026-07-29T22:00:27Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* 8. Open Items */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2513</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2513"/>
		<updated>2026-07-29T21:58:29Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2512</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2512"/>
		<updated>2026-07-29T21:56:38Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2511</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2511"/>
		<updated>2026-07-29T21:55:55Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[Media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2510</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2510"/>
		<updated>2026-07-29T21:50:38Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions, and before publishing anything customer-facing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[media:ConsistExamples.zip|Example Consists]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:ConsistExamples.zip&amp;diff=2509</id>
		<title>File:ConsistExamples.zip</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:ConsistExamples.zip&amp;diff=2509"/>
		<updated>2026-07-29T21:49:51Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2508</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2508"/>
		<updated>2026-07-29T21:49:40Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions, and before publishing anything customer-facing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[file:ConsistExamples.zip]]&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2507</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2507"/>
		<updated>2026-07-29T21:47:20Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Examples */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions, and before publishing anything customer-facing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
[[file:ConsistExample1.rp2]]&lt;br /&gt;
&lt;br /&gt;
[[media:ConsistExample2.rp4]]&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2506</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2506"/>
		<updated>2026-07-29T21:46:37Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions, and before publishing anything customer-facing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[[file:ConsistExample1.rp2]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;[[media:ConsistExample2.rp4]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Main_Page&amp;diff=2505</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Main_Page&amp;diff=2505"/>
		<updated>2026-07-29T16:44:26Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Reporting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Comet Support == &lt;br /&gt;
[[Comet Support | Contact Comet Support]]&lt;br /&gt;
&lt;br /&gt;
== RailNET Software ==&lt;br /&gt;
[[RailNET Software]]&lt;br /&gt;
&lt;br /&gt;
== RailNet Reference Materials ==&lt;br /&gt;
&lt;br /&gt;
=== Documentation Packet ===&lt;br /&gt;
[[RailNET Full System Documentation Packet (2024)]]&lt;br /&gt;
&lt;br /&gt;
=== Installation and Operations Guides ===&lt;br /&gt;
* [[RailNet AEI System – Operations Manual]]&lt;br /&gt;
* [[Railnet AEI System Site Installation Manual]]&lt;br /&gt;
* [[RailNET In a NEMA Enclosure Installation Manual]]&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Guidance ===&lt;br /&gt;
[[RailNET Upgrade Guidance]]&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
[[S9203 Site to Host Consist Report Decoder Reference]]&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
[[Troubleshooting Index]]&lt;br /&gt;
&lt;br /&gt;
== Cinq Edge ==&lt;br /&gt;
* [[CINQ Edge User Quick Start Guide|Cinq Edge User Quick Start Guide]]&lt;br /&gt;
* [[CINQ Edge Installation Manual|Cinq Edge Installation Manual]]&lt;br /&gt;
&lt;br /&gt;
== Distribution ==&lt;br /&gt;
[[Transcore]]&lt;br /&gt;
&lt;br /&gt;
== Bulletins ==&lt;br /&gt;
* [[Product Bulletins]]&lt;br /&gt;
* [[Service Bulletins]]&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
[[Basic Networking]]&lt;br /&gt;
&lt;br /&gt;
== Legal ==&lt;br /&gt;
* [[Privacy Policy]]&lt;br /&gt;
* [[Cookie Policy]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2504</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2504"/>
		<updated>2026-07-29T16:29:32Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions, and before publishing anything customer-facing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory for Class 1 in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material &lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2503</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2503"/>
		<updated>2026-07-29T16:25:03Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:AEI Site-to-Host Consist Report (T-94) — Decoder Reference}}&lt;br /&gt;
&lt;br /&gt;
Implementation notes for parsing &#039;&#039;&#039;AAR MSRP Standard S-9203A.V1.1&#039;&#039;&#039; consist reports (&amp;quot;T-94&amp;quot;). Covers the four segments required to walk a file end to end: &#039;&#039;&#039;AEM&#039;&#039;&#039;, &#039;&#039;&#039;RRE&#039;&#039;&#039;, &#039;&#039;&#039;EOT&#039;&#039;&#039;, and &#039;&#039;&#039;EOC&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Scope&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only. Refer to the controlling AAR standard for authoritative definitions, and before publishing anything customer-facing.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. File Model ==&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AEM&#039;&#039;&#039; — one per consist, always first. Train-level header.&lt;br /&gt;
* &#039;&#039;&#039;DCL&#039;&#039;&#039; — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* &#039;&#039;&#039;RRE&#039;&#039;&#039; — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* &#039;&#039;&#039;EOC&#039;&#039;&#039; — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
=== 1.1 Encoding Variants — Detect Before Parsing ===&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mode !! Field widths !! Delimiter !! Parse strategy&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fixed || None || Slice by offset table&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Fixed || Present (space or &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt;) || Slice by offset, skip 1 delimiter char between fields&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Variable || Present || Split on delimiter, index by position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Detection heuristic&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3.&lt;br /&gt;
&lt;br /&gt;
Sample the &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; character explicitly — V1.1 examples for DCL and TDM use asterisk delimiting, while older examples use space.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Elements and whole segments may be turned off&#039;&#039;&#039; by site configuration, and turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. AEM — Consist Header ==&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== 2.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;78 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;AEM&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || AN || AAR Billing Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;8&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || AN || Site ID&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || N || Event Start Date (YYMMDD)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Start Time (HHMM, local)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Event Stop Time (HHMM)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;29&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Time Zone offset from GMT&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Daylight Savings Time Indicator (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Data Format Version Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Train Sequence Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;40&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Locomotive Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;41&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Railcar Conversion Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;42&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Direction of Travel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;43&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || N || Switch / Direction Indicator&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;44&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Units of Measure (E/M)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM15&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;45&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Maximum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM16&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;48&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Minimum Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM17&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;51&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Average Speed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM18&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;54&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Movement Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM19&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;55&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Termination Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM20&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;56&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Transmission Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;57&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Adjacent Track Occupied (Y/N)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;58&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5&amp;lt;/code&amp;gt; || N || Train Length&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;63&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Equipment Status Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;64&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotive Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;66&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Locomotives Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;68&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcar Count&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM27&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;71&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Railcars Tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;74&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || N || Total Axle Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Implied Decimals ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AEM06  Time Zone       &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                       5 = Eastern   6 = Central   7 = Mountain   8 = Pacific&lt;br /&gt;
&lt;br /&gt;
AEM08  Format Version  &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                       digit 1 = breaking change&lt;br /&gt;
                       digit 2 = backward-compatible enhancement&lt;br /&gt;
                       digit 3 = processing upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== 2.3 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM10 / AEM11 — Conversion Status (consist confidence level)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — no significant problems&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || At least one questionable axle pattern was found&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Excessive disqualifiers — 25% or more show tag/axle inconsistency&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple inconsistencies (both A and D)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM12 — Direction of Travel:&#039;&#039;&#039; N, S, E, W&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM13 — Switch / Direction Indicator:&#039;&#039;&#039; 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM14 — Units of Measure:&#039;&#039;&#039; E = English, M = Metric. Applies to the &#039;&#039;&#039;entire report&#039;&#039;&#039;. Latch this value and use it for all downstream unit conversions (see [[#6. Units of Measure|Section 6]]).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM18 — Movement Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Through movement, over 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Through movement, under 5 mph&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Through movement, stop and go&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Through movement, switching (direction changes detected)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Simulation (software-generated train)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Reverse exit (pull by)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Arrival listing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #3e7d45; background:#eef6ef; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Filter &#039;&#039;&#039;E&#039;&#039;&#039; (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM19 — Termination Status&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || Normal || Accept&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Time-out; train stopped, partial consist reported || Hold as fragment; expect an appended retransmission&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Presence forcibly cleared (failed presence circuit) || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Processing limitation || Accept, flag data quality&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Accept, flag&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM20 — Transmission Type&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning !! Decoder action&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || First transmission || Insert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Retransmission || Idempotent upsert on consist key&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Summary || Upsert&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Appended || &#039;&#039;&#039;Replace&#039;&#039;&#039; the prior fragment entirely&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Log&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Time-out / append pairing — the main state-machine trap&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When AEM19 = &#039;&#039;&#039;T&#039;&#039;&#039;, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying &#039;&#039;&#039;the same train sequence number and the same start date/time&#039;&#039;&#039; as the original, and AEM20 = &#039;&#039;&#039;A&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The appended report &#039;&#039;&#039;replaces&#039;&#039;&#039; the earlier fragment — it is not a delta. Key idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AEM23 — Equipment Status Code (site health)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Condition !! Severity&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || No problems detected || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Antenna warning — low tag count on one or more antennas || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || Antenna fatal — at least one antenna no longer reading || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;C&amp;lt;/code&amp;gt; || Communication error with external components || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || Intertrack communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt; || Intertrack communication fatal — cannot reach external processor || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Power supply warning — charger temporarily lost power || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;I&amp;lt;/code&amp;gt; || Power supply fatal — charger lost power || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || Software setup failure — parameter set inaccurately || Error&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple problems || &#039;&#039;&#039;Escalate&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;P&amp;lt;/code&amp;gt; || Presence circuit warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Q&amp;lt;/code&amp;gt; || Presence circuit fatal — no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Reader / RF warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;S&amp;lt;/code&amp;gt; || Reader / RF fatal — at least one reader no longer functional || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; || Wheel transducer warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Wheel transducer fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;V&amp;lt;/code&amp;gt; || No wheel transducer input || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || External detector trigger (hut door, thermocouple) || Info&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; || External processor communication warning (recovered) || Warning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Y&amp;lt;/code&amp;gt; || External processor communication fatal || &#039;&#039;&#039;Fatal&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Z&amp;lt;/code&amp;gt; || Security — excessive failed logon attempts || Security&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other || Warning&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in &amp;lt;code&amp;gt;{B, F, I, Q, S, U, V, M}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 2.4 Derived Read-Rate Metrics ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24     (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26     (Railcars Tagged / Railcar Count)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== 3. RRE — Rail Equipment ==&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== 3.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;38 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;RRE&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number (standing order, 1 = first)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Orientation&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;22&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || AN || Reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Axle Conversion Code&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE08&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;24&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE09&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;26&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;28&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE12&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;30&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Speed of Vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE13&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;33&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Axles counted by wheel sensor&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE14&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;36&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Platform Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 3.2 Code Lookups ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE02 — Equipment Group Code:&#039;&#039;&#039; D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE05 — Orientation (which end faces forward)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Railcar !! Locomotive&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || &amp;quot;A&amp;quot; end || &amp;quot;F&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;B&amp;lt;/code&amp;gt; || &amp;quot;B&amp;quot; end (also called the brake end) || &amp;quot;R&amp;quot; end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; || Unknown / not determined || Unknown / not determined&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE07 — Axle Conversion Code:&#039;&#039;&#039; G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE08 — Tag Status (placement and read completeness)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;G&amp;lt;/code&amp;gt; || Good — both right and left tags read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Mismatched identification — owner code and equipment number differ between tags&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Left tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R&amp;lt;/code&amp;gt; || Right tag missing&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; || No tag read&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RRE09 — Tag Detail Status (tag content and programming)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;A&amp;lt;/code&amp;gt; || Axle error — tag axle count differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;E&amp;lt;/code&amp;gt; || EGC error — tag equipment group code differs from axle pattern&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;L&amp;lt;/code&amp;gt; || Length error — tag length differs from axle pattern by more than 15%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;O&amp;lt;/code&amp;gt; || Placement error — tag applied on wrong side or wrong end&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;D&amp;lt;/code&amp;gt; || Unused tag read on equipment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag outside the AAR acceptable application window&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; || Multiple errors&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;RRE09 = &amp;quot;M&amp;quot; triggers a required TDM segment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When Tag Detail Status is &#039;&#039;&#039;M&#039;&#039;&#039;, the RRE is followed by a &#039;&#039;&#039;TDM&#039;&#039;&#039; segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Note also that a TDM is unconditionally required directly after the &#039;&#039;&#039;first&#039;&#039;&#039; RRE in every consist. That one declares which cross-checks the site is capable of measuring at all, so parse it before interpreting any RRE09 value.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.3 The Duplicate-Sequence Rule ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Sequence Number is not a unique key.&#039;&#039;&#039; When two tags are found on one vehicle with differing IDs (an ID mismatch), &#039;&#039;&#039;two RRE segments are emitted with the same RRE01&#039;&#039;&#039;, both carrying RRE08 = &amp;quot;M&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3.4 Field Handling Notes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RRE03 (Owner Code)&#039;&#039;&#039; — 4 characters, space-padded SCAC. &#039;&#039;&#039;Blank if not tagged.&#039;&#039;&#039; Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* &#039;&#039;&#039;RRE04 (Equipment Number)&#039;&#039;&#039; — 10 digits with leading zeros. &#039;&#039;&#039;Zero if not tagged.&#039;&#039;&#039; Store as a string if you need exact round-tripping; convert to integer only for matching.&lt;br /&gt;
* &#039;&#039;&#039;RRE10 / RRE11 (Handshakes)&#039;&#039;&#039; — 2 digits, saturating: &#039;&#039;&#039;99 means &amp;quot;99 or more,&amp;quot;&#039;&#039;&#039; not literally 99. Do not average across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left or right tag.&lt;br /&gt;
* &#039;&#039;&#039;RRE14 (Platform Count)&#039;&#039;&#039; — always 1 for non-articulated cars. A value greater than 1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero equipment number, and RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
== 4. EOT — End of Train Device ==&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but it can appear on any vehicle (for example, dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
=== 4.1 Offset Table ===&lt;br /&gt;
&lt;br /&gt;
Mode 1 (fixed width, no delimiters), 0-based offsets, total &#039;&#039;&#039;26 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOT&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || N || Sequence Number of the carrying vehicle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT02&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;6&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT03&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;7&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;4&amp;lt;/code&amp;gt; || A || Owner Code (SCAC)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT04&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;11&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Owner Equipment Number&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT05&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;21&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 0&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT06&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;23&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; || N || Handshakes Antenna 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT07&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;25&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; || A || Tag Detail Status&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 EOT07 — Tag Detail Status ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Code !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;K&amp;lt;/code&amp;gt; || OK&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;H&amp;lt;/code&amp;gt; || Performance — low handshakes&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;W&amp;lt;/code&amp;gt; || Window violation — tag in wrong location&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;?&amp;lt;/code&amp;gt; || Other&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is &#039;&#039;&#039;always &amp;quot;K&amp;quot;&#039;&#039;&#039; in practice, with all other fields complete. Treat a non-K value as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maximum occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, and do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
== 5. EOC — End of Consist ==&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report. Total &#039;&#039;&#039;13 bytes&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ref !! Off !! Len !! Type !! Field&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC00&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || AN || Segment ID = &amp;quot;EOC&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC01&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;10&amp;lt;/code&amp;gt; || N || Total Byte Count&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Byte count semantics&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
EOC01 counts &#039;&#039;&#039;from the consist header (AEM) up to but not including the EOC segment itself&#039;&#039;&#039;. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
observed = byte_length(bytes from start of AEM through end of&lt;br /&gt;
                       the segment immediately preceding EOC)&lt;br /&gt;
&lt;br /&gt;
if observed != int(EOC01):&lt;br /&gt;
    quarantine(consist)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Recommended rollout:&#039;&#039;&#039; log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission. Quarantine the consist; do not partially commit.&lt;br /&gt;
&lt;br /&gt;
== 6. Units of Measure ==&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Field !! E (English) !! M (Metric)&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Maximum / Minimum / Average Speed || miles per hour || kilometers per hour&lt;br /&gt;
|-&lt;br /&gt;
| AEM || Train Length || feet || decimeters&lt;br /&gt;
|-&lt;br /&gt;
| RRE || Speed || miles per hour || kilometers per hour&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #c77c1e; background:#fdf3e3; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
Metric train length is in &#039;&#039;&#039;decimeters&#039;&#039;&#039;, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gallons / 100 liters) and cumulative energy (100 HP-hours / 100 kW-hours).&lt;br /&gt;
&lt;br /&gt;
== 7. Parser Contract ==&lt;br /&gt;
&lt;br /&gt;
=== 7.1 Ordering and Looping ===&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Segment !! Loop L1 !! Loop L2 !! Status !! Max Occurs&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;AEM&amp;lt;/code&amp;gt; || 1 || 1 || Required || 1&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DCL&amp;lt;/code&amp;gt; || 1 || 1 || Optional loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RRE&amp;lt;/code&amp;gt; || 2 || 1 || Optional — begins RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TDM&amp;lt;/code&amp;gt; || 2 || 1 || Required after RRE01 / conditional || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOT&amp;lt;/code&amp;gt; || 2 || 2 || Optional || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RTD&amp;lt;/code&amp;gt; || 2 || 6 || Mandatory in V1.1 || 99&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CEQ&amp;lt;/code&amp;gt; || 2 || 13 || Optional — begins CEQ loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MMR&amp;lt;/code&amp;gt; || 2 || 14 || Optional — begins MMR loop inside RRE loop || 999&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;EOC&amp;lt;/code&amp;gt; || 3 || 1 || Required || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries, and CEQ and MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
=== 7.2 Recommended State Machine ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM    : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
              site health(AEM23); start byte counter&lt;br /&gt;
&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*   : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE    : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE    : close prior vehicle, open new.&lt;br /&gt;
              if RRE01 == previous RRE01&lt;br /&gt;
                  -&amp;gt; ID-mismatch pair, SAME vehicle&lt;br /&gt;
  -&amp;gt; TDM    : cross-check detail (required when prior RRE09 == &amp;quot;M&amp;quot;)&lt;br /&gt;
  -&amp;gt; RTD    : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
              : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC    : close vehicle, validate byte count, emit consist&lt;br /&gt;
&lt;br /&gt;
DONE&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7.3 Defensive Rules ===&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Dispatch on segment ID, never on line position.&#039;&#039;&#039; Any segment may be disabled at the site.&lt;br /&gt;
# &#039;&#039;&#039;Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.&#039;&#039;&#039; It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# &#039;&#039;&#039;Preserve raw lines.&#039;&#039;&#039; Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# &#039;&#039;&#039;Never reject a consist over an unknown code value.&#039;&#039;&#039; Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# &#039;&#039;&#039;Idempotency key:&#039;&#039;&#039; (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps from 9999 back to 1 and zero is invalid, so sequence alone is not unique across a long feed.&lt;br /&gt;
# &#039;&#039;&#039;Timestamps are local time.&#039;&#039;&#039; AEM03 and AEM04 plus the AEM06 offset plus the AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# &#039;&#039;&#039;Fixed-width examples in the standard are not perfectly consistent&#039;&#039;&#039; in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# &#039;&#039;&#039;Numeric fields are zero-padded strings.&#039;&#039;&#039; Strip leading zeros only at the point of use. Equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
=== 7.4 Validation Checklist per Consist ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Check !! Source !! On failure&lt;br /&gt;
|-&lt;br /&gt;
| Segment ID recognized || 3-char prefix || Log and skip segment, continue&lt;br /&gt;
|-&lt;br /&gt;
| AEM present and first || State machine || Reject consist&lt;br /&gt;
|-&lt;br /&gt;
| EOC present and last || State machine || Quarantine as truncated&lt;br /&gt;
|-&lt;br /&gt;
| Byte count matches || EOC01 || Advisory, then reject once convention confirmed&lt;br /&gt;
|-&lt;br /&gt;
| Format version major digit supported || AEM08 digit 1 || Route to quarantine for review&lt;br /&gt;
|-&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 || Counts || Data-quality flag, do not reject&lt;br /&gt;
|-&lt;br /&gt;
| Tagged counts do not exceed total counts || AEM24/25, AEM26/27 || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Site health nominal || AEM23 || Raise maintenance alert on fatal codes&lt;br /&gt;
|-&lt;br /&gt;
| Every RRE01 within 1..AEM24+AEM26 || Sequence || Data-quality flag&lt;br /&gt;
|-&lt;br /&gt;
| Duplicate RRE01 also carries RRE08 = M || Mismatch rule || Log unexpected duplicate&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8. Open Items ==&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit the V1.1-mandatory RTD and TDM segments, or legacy output without them. This determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs asterisk) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked &#039;&#039;&#039;Proposed&#039;&#039;&#039; in the standard while RTD is mandatory in V1.1. Verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== 9. References ==&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard &#039;&#039;&#039;S-9203A.V1.1&#039;&#039;&#039; — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard &#039;&#039;&#039;S-9203&#039;&#039;&#039; (latest version) — tag data formats. Appendices A and B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A, Section 1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #2e5c8a; background:#eef3f9; padding:0.6em 1em; margin:1em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Do not host the standard on this wiki&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material — link to the controlled copy rather than attaching or transcribing the source document.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:AEI]]&lt;br /&gt;
[[Category:Standards]]&lt;br /&gt;
[[Category:Software Development]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2502</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2502"/>
		<updated>2026-07-29T16:14:33Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Implementation notes for parsing AAR MSRP Standard S-9203A.V1.1 consist reports (&amp;quot;T-94&amp;quot;). Covers the four segments required to walk a file end to end: *AEM*, *RRE*, *EOT*, *EOC*.&lt;br /&gt;
&lt;br /&gt;
Field semantics are summarized for implementation only refer to the controlling AAR standard for authoritative definitions and before publishing.&lt;br /&gt;
&lt;br /&gt;
== File Model ==&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.  This guide covers the basic consist level segments.  For a full implementation, refer to AAR S9203.&lt;br /&gt;
&lt;br /&gt;
* *AEM* — one per consist, always first. Train-level header.&lt;br /&gt;
* *RRE* — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* *EOC* — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
== Encoding Variants — Detect Before Parsing ==&lt;br /&gt;
Three output modes are user-selectable at the reader, Comet will set up the delimiter character as a default.&lt;br /&gt;
&lt;br /&gt;
|| Mode || Field widths || Delimiter || Parse strategy ||&lt;br /&gt;
| 1 | Fixed | none | Slice by offset table |&lt;br /&gt;
| 2 | Fixed | present (space or {{*}}) | Slice by offset, skip 1 delimiter char between fields |&lt;br /&gt;
| 3 | Variable | present | Split on delimiter, index by position |&lt;br /&gt;
&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3. Sample the {{*}} character explicitly.&lt;br /&gt;
&lt;br /&gt;
{note}&lt;br /&gt;
*Elements and whole segments may be turned off* by site configuration. Turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
{note}&lt;br /&gt;
&lt;br /&gt;
== AEM — Consist Header ==&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table (Mode 1, 0-based, total 78 bytes) ===&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| AEM00 | 0 | 3 | AN | Segment ID = &amp;quot;AEM&amp;quot; |&lt;br /&gt;
| AEM01 | 3 | 5 | AN | AAR Billing Code |&lt;br /&gt;
| AEM02 | 8 | 7 | AN | Site ID |&lt;br /&gt;
| AEM03 | 15 | 6 | N | Event Start Date (YYMMDD) |&lt;br /&gt;
| AEM04 | 21 | 4 | N | Event Start Time (HHMM, local) |&lt;br /&gt;
| AEM05 | 25 | 4 | N | Event Stop Time (HHMM) |&lt;br /&gt;
| AEM06 | 29 | 3 | N | Time Zone offset from GMT |&lt;br /&gt;
| AEM07 | 32 | 1 | A | DST Indicator (Y/N) |&lt;br /&gt;
| AEM08 | 33 | 3 | AN | Data Format Version |&lt;br /&gt;
| AEM09 | 36 | 4 | N | Train Sequence Number |&lt;br /&gt;
| AEM10 | 40 | 1 | AN | Locomotive Conversion Status |&lt;br /&gt;
| AEM11 | 41 | 1 | AN | Railcar Conversion Status |&lt;br /&gt;
| AEM12 | 42 | 1 | A | Direction of Travel |&lt;br /&gt;
| AEM13 | 43 | 1 | N | Switch / Direction Indicator |&lt;br /&gt;
| AEM14 | 44 | 1 | A | Units of Measure (E/M) |&lt;br /&gt;
| AEM15 | 45 | 3 | N | Maximum Speed |&lt;br /&gt;
| AEM16 | 48 | 3 | N | Minimum Speed |&lt;br /&gt;
| AEM17 | 51 | 3 | N | Average Speed |&lt;br /&gt;
| AEM18 | 54 | 1 | AN | Movement Status |&lt;br /&gt;
| AEM19 | 55 | 1 | AN | Termination Status |&lt;br /&gt;
| AEM20 | 56 | 1 | AN | Transmission Type |&lt;br /&gt;
| AEM21 | 57 | 1 | AN | Adjacent Track Occupied (Y/N) |&lt;br /&gt;
| AEM22 | 58 | 5 | N | Train Length |&lt;br /&gt;
| AEM23 | 63 | 1 | AN | Equipment Status Code |&lt;br /&gt;
| AEM24 | 64 | 2 | N | Locomotive Count |&lt;br /&gt;
| AEM25 | 66 | 2 | N | Locomotives Tagged |&lt;br /&gt;
| AEM26 | 68 | 3 | N | Railcar Count |&lt;br /&gt;
| AEM27 | 71 | 3 | N | Railcars Tagged |&lt;br /&gt;
| AEM28 | 74 | 4 | N | Total Axle Count |&lt;br /&gt;
&lt;br /&gt;
=== Implied Decimals ===&lt;br /&gt;
{code}&lt;br /&gt;
AEM06  Time Zone      &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                      5=Eastern 6=Central 7=Mountain 8=Pacific&lt;br /&gt;
AEM08  Format Version &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                      digit1 = breaking change, digit2 = compatible enhancement,&lt;br /&gt;
                      digit3 = processing upgrade&lt;br /&gt;
{code}&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
=== Code Lookups ===&lt;br /&gt;
*AEM10 / AEM11 — Conversion Status (confidence)*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| G | Good, no significant problems |&lt;br /&gt;
| A | At least one questionable axle pattern |&lt;br /&gt;
| D | Excessive disqualifiers (≥25% tag/axle inconsistency) |&lt;br /&gt;
| M | Both A and D |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
*AEM12 — Direction of Travel:* N, S, E, W&lt;br /&gt;
&lt;br /&gt;
*AEM13 — Switch / Direction Indicator:* 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
*AEM14 — Units of Measure:* E = English, M = Metric. Applies to the *entire report*. Latch this value and use it for all downstream unit conversions (see §6).&lt;br /&gt;
&lt;br /&gt;
*AEM18 — Movement Status*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| A | Through movement, over 5 mph |&lt;br /&gt;
| B | Through movement, under 5 mph |&lt;br /&gt;
| C | Through movement, stop and go |&lt;br /&gt;
| D | Through movement, switching (direction changes detected) |&lt;br /&gt;
| E | Simulation (software-generated train) |&lt;br /&gt;
| F | Reverse exit (pull by) |&lt;br /&gt;
| R | Arrival listing |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
{tip}&lt;br /&gt;
Filter *E* (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
{tip}&lt;br /&gt;
&lt;br /&gt;
*AEM19 — Termination Status*&lt;br /&gt;
|| Code || Meaning || Decoder action ||&lt;br /&gt;
| N | Normal | Accept |&lt;br /&gt;
| T | Time-out; train stopped, partial consist reported | Hold as fragment; expect an appended retransmission |&lt;br /&gt;
| O | Presence forcibly cleared (failed presence circuit) | Accept, flag data quality |&lt;br /&gt;
| P | Processing limitation | Accept, flag data quality |&lt;br /&gt;
| ? | Other | Accept, flag |&lt;br /&gt;
&lt;br /&gt;
*AEM20 — Transmission Type*&lt;br /&gt;
|| Code || Meaning || Decoder action ||&lt;br /&gt;
| F | First transmission | Insert |&lt;br /&gt;
| R | Retransmission | Idempotent upsert on (Billing Code, Site ID, Sequence, Start Date/Time) |&lt;br /&gt;
| S | Summary | Upsert |&lt;br /&gt;
| A | Appended | *Replace* the prior fragment entirely |&lt;br /&gt;
| ? | Other | Log |&lt;br /&gt;
&lt;br /&gt;
{warning:title=Time-out / append pairing — the main state-machine trap}&lt;br /&gt;
When AEM19 = *T*, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying *the same train sequence number and the same start date/time* as the original, and AEM20 = *A*. The appended report *replaces* the earlier fragment — it is not a delta. Key your idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
*AEM23 — Equipment Status Code (site health)*&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
|| Code || Condition || Severity ||&lt;br /&gt;
| G | No problems detected | OK |&lt;br /&gt;
| A | Antenna warning — low tag count on ≥1 antenna | Warning |&lt;br /&gt;
| B | Antenna fatal — ≥1 antenna no longer reading | Fatal |&lt;br /&gt;
| C | Communication error with external components | Error |&lt;br /&gt;
| E | Intertrack comms warning (recovered) | Warning |&lt;br /&gt;
| F | Intertrack comms fatal — cannot reach external processor | Fatal |&lt;br /&gt;
| H | Power supply warning — charger temporarily lost power | Warning |&lt;br /&gt;
| I | Power supply fatal — charger lost power | Fatal |&lt;br /&gt;
| K | Software setup failure — parameter set inaccurately | Error |&lt;br /&gt;
| P | Presence circuit warning (recovered) | Warning |&lt;br /&gt;
| Q | Presence circuit fatal — no longer functional | Fatal |&lt;br /&gt;
| R | Reader / RF warning (recovered) | Warning |&lt;br /&gt;
| S | Reader / RF fatal — ≥1 reader no longer functional | Fatal |&lt;br /&gt;
| T | Wheel transducer warning (recovered) | Warning |&lt;br /&gt;
| U | Wheel transducer fatal | Fatal |&lt;br /&gt;
| V | No wheel transducer input | Fatal |&lt;br /&gt;
| W | External detector trigger (hut door, thermocouple) | Info |&lt;br /&gt;
| X | External processor comms warning (recovered) | Warning |&lt;br /&gt;
| Y | External processor comms fatal | Fatal |&lt;br /&gt;
| Z | Security — excessive failed logon attempts | Security |&lt;br /&gt;
| M | Multiple problems | Escalate |&lt;br /&gt;
| ? | Other | Warning |&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in {B, F, I, Q, S, U, V, M}.&lt;br /&gt;
&lt;br /&gt;
=== Derived Read-Rate Metrics ===&lt;br /&gt;
{code}&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24      (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26      (Railcars Tagged / Railcar Count)&lt;br /&gt;
{code}&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
== RRE — Rail Equipment ==&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
=== Offset Table (Mode 1, 0-based, total 38 bytes) ===&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| RRE00 | 0 | 3 | AN | Segment ID = &amp;quot;RRE&amp;quot; |&lt;br /&gt;
| RRE01 | 3 | 3 | N | Sequence Number (standing order, 1 = first) |&lt;br /&gt;
| RRE02 | 6 | 1 | A | Equipment Group Code |&lt;br /&gt;
| RRE03 | 7 | 4 | A | Owner Code (SCAC) |&lt;br /&gt;
| RRE04 | 11 | 10 | N | Owner Equipment Number |&lt;br /&gt;
| RRE05 | 21 | 1 | A | Orientation |&lt;br /&gt;
| RRE06 | 22 | 1 | AN | Reserved |&lt;br /&gt;
| RRE07 | 23 | 1 | A | Axle Conversion Code |&lt;br /&gt;
| RRE08 | 24 | 1 | A | Tag Status |&lt;br /&gt;
| RRE09 | 25 | 1 | A | Tag Detail Status |&lt;br /&gt;
| RRE10 | 26 | 2 | N | Handshakes Antenna 0 |&lt;br /&gt;
| RRE11 | 28 | 2 | N | Handshakes Antenna 1 |&lt;br /&gt;
| RRE12 | 30 | 3 | N | Speed of Vehicle |&lt;br /&gt;
| RRE13 | 33 | 3 | N | Axles counted by wheel sensor |&lt;br /&gt;
| RRE14 | 36 | 2 | N | Platform Count |&lt;br /&gt;
&lt;br /&gt;
=== Code Lookups ===&lt;br /&gt;
*RRE02 — Equipment Group Code:* D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
*RRE05 — Orientation (which end faces forward)*&lt;br /&gt;
|| Code || Railcar || Locomotive ||&lt;br /&gt;
| A | &amp;quot;A&amp;quot; end | &amp;quot;F&amp;quot; end |&lt;br /&gt;
| B | &amp;quot;B&amp;quot; (brake) end | &amp;quot;R&amp;quot; end |&lt;br /&gt;
| U | Unknown / not determined | Unknown |&lt;br /&gt;
&lt;br /&gt;
*RRE07 — Axle Conversion Code:* G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
*RRE08 — Tag Status (placement / read completeness)*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| G | Good — both right and left tags read |&lt;br /&gt;
| M | Mismatched identification (owner code + equipment number differ between tags) |&lt;br /&gt;
| L | Left tag missing |&lt;br /&gt;
| R | Right tag missing |&lt;br /&gt;
| N | No tag read |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
*RRE09 — Tag Detail Status (tag content / programming)*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| K | OK |&lt;br /&gt;
| A | Axle error — tag axle count differs from axle pattern |&lt;br /&gt;
| E | EGC error — tag EGC differs from axle pattern |&lt;br /&gt;
| L | Length error — tag length differs from axle pattern by &amp;gt;15% |&lt;br /&gt;
| O | Placement error — wrong side or wrong end |&lt;br /&gt;
| D | Unused tag read on equipment |&lt;br /&gt;
| W | Window violation — tag outside the AAR acceptable application window |&lt;br /&gt;
| M | Multiple errors |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
{warning:title=RRE09 = &amp;quot;M&amp;quot; triggers a required TDM}&lt;br /&gt;
When Tag Detail Status is *M*, the RRE is followed by a *TDM* segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;. Also note a TDM is unconditionally required directly after the *first* RRE in every consist, which declares which cross-checks the site is capable of measuring at all — parse it before interpreting any RRE09 value.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
=== The Duplicate-Sequence Rule ===&lt;br /&gt;
{warning}&lt;br /&gt;
*Sequence Number is not a unique key.* When two tags are found on one vehicle with differing IDs (an ID mismatch), *two RRE segments are emitted with the same RRE01*, both carrying RRE08 = &amp;quot;M&amp;quot;. The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
h3. 3.4 Field Handling Notes&lt;br /&gt;
&lt;br /&gt;
* *RRE03 (Owner Code)* — 4 chars, *space-padded* SCAC (&amp;quot;SP&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;). *Blank if not tagged.* Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* *RRE04 (Equipment Number)* — 10 digits, leading zeros. *Zero if not tagged.* Store as string if you need to round-trip exactly; convert to integer only for matching.&lt;br /&gt;
* *RRE10 / RRE11 (Handshakes)* — 2 digits, saturating: *99 means &amp;quot;99 or more&amp;quot;*, not literally 99. Do not compute averages across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left/right tag.&lt;br /&gt;
* *RRE14 (Platform Count)* — always 1 for non-articulated cars; &amp;gt;1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero number, RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
h2. 4. EOT — End of Train Device&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but can appear on any vehicle (e.g. dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
h3. 4.1 Offset Table (Mode 1, 0-based, total 26 bytes)&lt;br /&gt;
&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| EOT00 | 0 | 3 | AN | Segment ID = &amp;quot;EOT&amp;quot; |&lt;br /&gt;
| EOT01 | 3 | 3 | N | Sequence Number of the *carrying vehicle* |&lt;br /&gt;
| EOT02 | 6 | 1 | A | Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table) |&lt;br /&gt;
| EOT03 | 7 | 4 | A | Owner Code (SCAC) |&lt;br /&gt;
| EOT04 | 11 | 10 | N | Owner Equipment Number |&lt;br /&gt;
| EOT05 | 21 | 2 | N | Handshakes Antenna 0 |&lt;br /&gt;
| EOT06 | 23 | 2 | N | Handshakes Antenna 1 |&lt;br /&gt;
| EOT07 | 25 | 1 | A | Tag Detail Status |&lt;br /&gt;
&lt;br /&gt;
h3. 4.2 EOT07 — Tag Detail Status&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| K | OK |&lt;br /&gt;
| H | Performance — low handshakes |&lt;br /&gt;
| W | Window violation — tag in wrong location |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
{note}&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is *always &amp;quot;K&amp;quot;* in practice; all other fields are complete. Treat non-K as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
{note}&lt;br /&gt;
&lt;br /&gt;
Max occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
h2. 5. EOC — End of Consist&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report.&lt;br /&gt;
&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| EOC00 | 0 | 3 | AN | Segment ID = &amp;quot;EOC&amp;quot; |&lt;br /&gt;
| EOC01 | 3 | 10 | N | Total Byte Count |&lt;br /&gt;
&lt;br /&gt;
Total: 13 bytes.&lt;br /&gt;
&lt;br /&gt;
{warning:title=Byte count semantics}&lt;br /&gt;
EOC01 counts *from the consist header (AEM) up to but not including the EOC segment itself*. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
{code}&lt;br /&gt;
observed = byte_length(all bytes from start of AEM through end of segment preceding EOC)&lt;br /&gt;
if observed != int(EOC01): reject_or_quarantine(consist)&lt;br /&gt;
{code}&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation. Recommended rollout: log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission — quarantine, do not partially commit.&lt;br /&gt;
&lt;br /&gt;
h2. 6. Units of Measure&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
|| Segment || Field || E (English) || M (Metric) ||&lt;br /&gt;
| AEM | Max / Min / Avg Speed | mph | kph |&lt;br /&gt;
| AEM | Train Length | feet | decimeters |&lt;br /&gt;
| RRE | Speed | mph | kph |&lt;br /&gt;
&lt;br /&gt;
{warning}&lt;br /&gt;
Metric train length is in *decimeters*, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gal / 100 L) and cumulative energy (100 HP-hr / 100 kW-hr).&lt;br /&gt;
&lt;br /&gt;
h2. 7. Parser Contract&lt;br /&gt;
&lt;br /&gt;
h3. 7.1 Ordering and Looping&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
|| Segment || Loop L1 || Loop L2 || Status || Max Occurs ||&lt;br /&gt;
| AEM | 1 | 1 | Required | 1 |&lt;br /&gt;
| DCL | 1 | 1 | Optional loop | 999 |&lt;br /&gt;
| RRE | 2 | 1 | Optional — begins RRE loop | 999 |&lt;br /&gt;
| TDM | 2 | 1 | Required after RRE01 / conditional | — |&lt;br /&gt;
| EOT | 2 | 2 | Optional | 99 |&lt;br /&gt;
| RTD | 2 | 6 | Mandatory in V1.1 | 99 |&lt;br /&gt;
| CEQ | 2 | 13 | Optional — begins CEQ loop inside RRE loop | 999 |&lt;br /&gt;
| MMR | 2 | 14 | Optional — begins MMR loop inside RRE loop | 999 |&lt;br /&gt;
| EOC | 3 | 1 | Required | 1 |&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries and CEQ / MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
h3. 7.2 Recommended State Machine&lt;br /&gt;
&lt;br /&gt;
{code}&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM              : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
                        site health(AEM23); start byte counter&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*             : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE              : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE              : close prior vehicle, open new.&lt;br /&gt;
                        If RRE01 == previous RRE01 -&amp;gt; ID-mismatch pair, same vehicle&lt;br /&gt;
  -&amp;gt; TDM              : cross-check detail (required when prior RRE09 == &#039;M&#039;)&lt;br /&gt;
  -&amp;gt; RTD              : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
                      : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC              : close vehicle, validate byte count, emit consist&lt;br /&gt;
DONE&lt;br /&gt;
{code}&lt;br /&gt;
&lt;br /&gt;
h3. 7.3 Defensive Rules&lt;br /&gt;
&lt;br /&gt;
# *Dispatch on segment ID, never on line position.* Any segment may be disabled at the site.&lt;br /&gt;
# *Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.* It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# *Preserve raw lines.* Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# *Never reject a consist over an unknown code value.* Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# *Idempotency key:* (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps 9999 → 1, and zero is invalid — sequence alone is not unique across a long feed.&lt;br /&gt;
# *Timestamps are local time.* AEM03/AEM04 plus AEM06 offset plus AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# *Fixed-width examples in the standard are not perfectly consistent* in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# *Numeric fields are zero-padded strings.* Strip leading zeros only at the point of use; equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
h3. 7.4 Validation Checklist per Consist&lt;br /&gt;
&lt;br /&gt;
|| Check || Source || On failure ||&lt;br /&gt;
| Segment ID recognized | 3-char prefix | Log + skip segment, continue |&lt;br /&gt;
| AEM present and first | State machine | Reject consist |&lt;br /&gt;
| EOC present and last | State machine | Quarantine as truncated |&lt;br /&gt;
| Byte count matches | EOC01 | Advisory, then reject once convention confirmed |&lt;br /&gt;
| Format version major digit supported | AEM08 digit 1 | Route to quarantine for review |&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 | Counts | Data-quality flag, do not reject |&lt;br /&gt;
| Tagged counts ≤ total counts | AEM24/25, AEM26/27 | Data-quality flag |&lt;br /&gt;
| Site health nominal | AEM23 | Raise maintenance alert on fatal codes |&lt;br /&gt;
| Every RRE01 in 1..AEM24+AEM26 | Sequence | Data-quality flag |&lt;br /&gt;
| Duplicate RRE01 also has RRE08 = M | Mismatch rule | Log unexpected duplicate |&lt;br /&gt;
&lt;br /&gt;
h2. 8. Open Items&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit V1.1 mandatory RTD and TDM segments, or legacy output without them — this determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs {{*}}) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked *Proposed* in the standard while RTD is mandatory in V1.1; verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard *S-9203A.V1.1* — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard *S-9203* (latest version) — tag data formats. Appendix A/B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A §1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
 This page is an implementation summary. The AAR MSRP is licensed, copyrighted material — link to the controlled copy rather than attaching or transcribing the source document into the wiki.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2501</id>
		<title>S9203 Site to Host Consist Report Decoder Reference</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=S9203_Site_to_Host_Consist_Report_Decoder_Reference&amp;diff=2501"/>
		<updated>2026-07-29T16:02:33Z</updated>

		<summary type="html">&lt;p&gt;DGast: Created page with &amp;quot;Implementation notes for parsing AAR MSRP Standard S-9203A.V1.1 consist reports (&amp;quot;T-94&amp;quot;). Covers the four segments required to walk a file end to end: *AEM*, *RRE*, *EOT*, *EOC*. Field semantics are summarized for implementation only — refer to the controlling AAR standard for authoritative definitions and before publishing.  h2. 1. File Model  A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.  * *AEM*...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Implementation notes for parsing AAR MSRP Standard S-9203A.V1.1 consist reports (&amp;quot;T-94&amp;quot;). Covers the four segments required to walk a file end to end: *AEM*, *RRE*, *EOT*, *EOC*.&lt;br /&gt;
Field semantics are summarized for implementation only — refer to the controlling AAR standard for authoritative definitions and before publishing.&lt;br /&gt;
&lt;br /&gt;
h2. 1. File Model&lt;br /&gt;
&lt;br /&gt;
A T-94 file is a sequence of fixed-order, line-oriented segments. Each segment begins with a 3-character segment ID.&lt;br /&gt;
&lt;br /&gt;
* *AEM* — one per consist, always first. Train-level header.&lt;br /&gt;
* *DCL* — zero or more, immediately after AEM (GPS / site asset inventory). At least one required in V1.1.&lt;br /&gt;
* *RRE* — one per rail vehicle, always the first segment for that vehicle. Opens the per-vehicle loop.&lt;br /&gt;
* Per-vehicle children (TDM, RTD, CEQ, EOT, XSC, THI, HAT, DYx, GEN, ALM, MMR, TST) follow their RRE.&lt;br /&gt;
* *EOC* — one per consist, always last. Carries the byte count.&lt;br /&gt;
&lt;br /&gt;
Maintenance reports (AMH / MTS / EMS) are a separate message that may arrive attached to the consist or standalone.&lt;br /&gt;
&lt;br /&gt;
h3. 1.1 Encoding Variants — Detect Before Parsing&lt;br /&gt;
&lt;br /&gt;
Three output modes are user-selectable at the reader, so a decoder must handle all three:&lt;br /&gt;
&lt;br /&gt;
|| Mode || Field widths || Delimiter || Parse strategy ||&lt;br /&gt;
| 1 | Fixed | none | Slice by offset table |&lt;br /&gt;
| 2 | Fixed | present (space or {{*}}) | Slice by offset, skip 1 delimiter char between fields |&lt;br /&gt;
| 3 | Variable | present | Split on delimiter, index by position |&lt;br /&gt;
&lt;br /&gt;
{warning:title=Detection heuristic}&lt;br /&gt;
Read the first line. If characters 4 and 10 (1-based) are the delimiter candidate and total line length equals the fixed-width sum plus delimiter count, treat as Mode 2. If total length equals the bare fixed-width sum, Mode 1. Otherwise Mode 3. Sample the {{*}} character explicitly — V1.1 examples for DCL/TDM use asterisk delimiting, older examples use space.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
{note}&lt;br /&gt;
*Elements and whole segments may be turned off* by site configuration. Turning off elements forces a delimited format. Never assume a fixed line length without validating it; treat a short line as &amp;quot;elements suppressed,&amp;quot; not as corrupt data.&lt;br /&gt;
{note}&lt;br /&gt;
&lt;br /&gt;
h2. 2. AEM — Consist Header&lt;br /&gt;
&lt;br /&gt;
One per consist. Establishes reporting site, timestamp, direction, speeds, counts, and site health.&lt;br /&gt;
&lt;br /&gt;
h3. 2.1 Offset Table (Mode 1, 0-based, total 78 bytes)&lt;br /&gt;
&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| AEM00 | 0 | 3 | AN | Segment ID = &amp;quot;AEM&amp;quot; |&lt;br /&gt;
| AEM01 | 3 | 5 | AN | AAR Billing Code |&lt;br /&gt;
| AEM02 | 8 | 7 | AN | Site ID |&lt;br /&gt;
| AEM03 | 15 | 6 | N | Event Start Date (YYMMDD) |&lt;br /&gt;
| AEM04 | 21 | 4 | N | Event Start Time (HHMM, local) |&lt;br /&gt;
| AEM05 | 25 | 4 | N | Event Stop Time (HHMM) |&lt;br /&gt;
| AEM06 | 29 | 3 | N | Time Zone offset from GMT |&lt;br /&gt;
| AEM07 | 32 | 1 | A | DST Indicator (Y/N) |&lt;br /&gt;
| AEM08 | 33 | 3 | AN | Data Format Version |&lt;br /&gt;
| AEM09 | 36 | 4 | N | Train Sequence Number |&lt;br /&gt;
| AEM10 | 40 | 1 | AN | Locomotive Conversion Status |&lt;br /&gt;
| AEM11 | 41 | 1 | AN | Railcar Conversion Status |&lt;br /&gt;
| AEM12 | 42 | 1 | A | Direction of Travel |&lt;br /&gt;
| AEM13 | 43 | 1 | N | Switch / Direction Indicator |&lt;br /&gt;
| AEM14 | 44 | 1 | A | Units of Measure (E/M) |&lt;br /&gt;
| AEM15 | 45 | 3 | N | Maximum Speed |&lt;br /&gt;
| AEM16 | 48 | 3 | N | Minimum Speed |&lt;br /&gt;
| AEM17 | 51 | 3 | N | Average Speed |&lt;br /&gt;
| AEM18 | 54 | 1 | AN | Movement Status |&lt;br /&gt;
| AEM19 | 55 | 1 | AN | Termination Status |&lt;br /&gt;
| AEM20 | 56 | 1 | AN | Transmission Type |&lt;br /&gt;
| AEM21 | 57 | 1 | AN | Adjacent Track Occupied (Y/N) |&lt;br /&gt;
| AEM22 | 58 | 5 | N | Train Length |&lt;br /&gt;
| AEM23 | 63 | 1 | AN | Equipment Status Code |&lt;br /&gt;
| AEM24 | 64 | 2 | N | Locomotive Count |&lt;br /&gt;
| AEM25 | 66 | 2 | N | Locomotives Tagged |&lt;br /&gt;
| AEM26 | 68 | 3 | N | Railcar Count |&lt;br /&gt;
| AEM27 | 71 | 3 | N | Railcars Tagged |&lt;br /&gt;
| AEM28 | 74 | 4 | N | Total Axle Count |&lt;br /&gt;
&lt;br /&gt;
h3. 2.2 Implied Decimals&lt;br /&gt;
&lt;br /&gt;
{code}&lt;br /&gt;
AEM06  Time Zone      &amp;quot;##.#&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;080&amp;quot; = 8.0 hrs west of GMT&lt;br /&gt;
                      5=Eastern 6=Central 7=Mountain 8=Pacific&lt;br /&gt;
AEM08  Format Version &amp;quot;#.##&amp;quot; decimal assumed  -&amp;gt;  &amp;quot;400&amp;quot; = 4.00&lt;br /&gt;
                      digit1 = breaking change, digit2 = compatible enhancement,&lt;br /&gt;
                      digit3 = processing upgrade&lt;br /&gt;
{code}&lt;br /&gt;
&lt;br /&gt;
Gate version-specific parsing on digit 1 of AEM08. A change in digit 1 may not be backward compatible; digits 2 and 3 are safe to ignore.&lt;br /&gt;
&lt;br /&gt;
h3. 2.3 Code Lookups&lt;br /&gt;
&lt;br /&gt;
*AEM10 / AEM11 — Conversion Status (confidence)*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| G | Good, no significant problems |&lt;br /&gt;
| A | At least one questionable axle pattern |&lt;br /&gt;
| D | Excessive disqualifiers (≥25% tag/axle inconsistency) |&lt;br /&gt;
| M | Both A and D |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
*AEM12 — Direction of Travel:* N, S, E, W&lt;br /&gt;
&lt;br /&gt;
*AEM13 — Switch / Direction Indicator:* 0–9, owner-defined. Reflects local switch position so the host can infer route where multiple routes exist. Do not hardcode meanings; make it a per-site lookup.&lt;br /&gt;
&lt;br /&gt;
*AEM14 — Units of Measure:* E = English, M = Metric. Applies to the *entire report*. Latch this value and use it for all downstream unit conversions (see §6).&lt;br /&gt;
&lt;br /&gt;
*AEM18 — Movement Status*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| A | Through movement, over 5 mph |&lt;br /&gt;
| B | Through movement, under 5 mph |&lt;br /&gt;
| C | Through movement, stop and go |&lt;br /&gt;
| D | Through movement, switching (direction changes detected) |&lt;br /&gt;
| E | Simulation (software-generated train) |&lt;br /&gt;
| F | Reverse exit (pull by) |&lt;br /&gt;
| R | Arrival listing |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
{tip}&lt;br /&gt;
Filter *E* (simulation) out of production analytics. It is a software-generated train, not traffic.&lt;br /&gt;
{tip}&lt;br /&gt;
&lt;br /&gt;
*AEM19 — Termination Status*&lt;br /&gt;
|| Code || Meaning || Decoder action ||&lt;br /&gt;
| N | Normal | Accept |&lt;br /&gt;
| T | Time-out; train stopped, partial consist reported | Hold as fragment; expect an appended retransmission |&lt;br /&gt;
| O | Presence forcibly cleared (failed presence circuit) | Accept, flag data quality |&lt;br /&gt;
| P | Processing limitation | Accept, flag data quality |&lt;br /&gt;
| ? | Other | Accept, flag |&lt;br /&gt;
&lt;br /&gt;
*AEM20 — Transmission Type*&lt;br /&gt;
|| Code || Meaning || Decoder action ||&lt;br /&gt;
| F | First transmission | Insert |&lt;br /&gt;
| R | Retransmission | Idempotent upsert on (Billing Code, Site ID, Sequence, Start Date/Time) |&lt;br /&gt;
| S | Summary | Upsert |&lt;br /&gt;
| A | Appended | *Replace* the prior fragment entirely |&lt;br /&gt;
| ? | Other | Log |&lt;br /&gt;
&lt;br /&gt;
{warning:title=Time-out / append pairing — the main state-machine trap}&lt;br /&gt;
When AEM19 = *T*, the site reports a partial train. When movement resumes the train is reported again with the new cars appended, carrying *the same train sequence number and the same start date/time* as the original, and AEM20 = *A*. The appended report *replaces* the earlier fragment — it is not a delta. Key your idempotency on (AEM01, AEM02, AEM09, AEM03, AEM04) and overwrite rather than merge.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
*AEM23 — Equipment Status Code (site health)*&lt;br /&gt;
Reflects abnormal site activity during or before this train. Detail lives in the maintenance report.&lt;br /&gt;
&lt;br /&gt;
|| Code || Condition || Severity ||&lt;br /&gt;
| G | No problems detected | OK |&lt;br /&gt;
| A | Antenna warning — low tag count on ≥1 antenna | Warning |&lt;br /&gt;
| B | Antenna fatal — ≥1 antenna no longer reading | Fatal |&lt;br /&gt;
| C | Communication error with external components | Error |&lt;br /&gt;
| E | Intertrack comms warning (recovered) | Warning |&lt;br /&gt;
| F | Intertrack comms fatal — cannot reach external processor | Fatal |&lt;br /&gt;
| H | Power supply warning — charger temporarily lost power | Warning |&lt;br /&gt;
| I | Power supply fatal — charger lost power | Fatal |&lt;br /&gt;
| K | Software setup failure — parameter set inaccurately | Error |&lt;br /&gt;
| P | Presence circuit warning (recovered) | Warning |&lt;br /&gt;
| Q | Presence circuit fatal — no longer functional | Fatal |&lt;br /&gt;
| R | Reader / RF warning (recovered) | Warning |&lt;br /&gt;
| S | Reader / RF fatal — ≥1 reader no longer functional | Fatal |&lt;br /&gt;
| T | Wheel transducer warning (recovered) | Warning |&lt;br /&gt;
| U | Wheel transducer fatal | Fatal |&lt;br /&gt;
| V | No wheel transducer input | Fatal |&lt;br /&gt;
| W | External detector trigger (hut door, thermocouple) | Info |&lt;br /&gt;
| X | External processor comms warning (recovered) | Warning |&lt;br /&gt;
| Y | External processor comms fatal | Fatal |&lt;br /&gt;
| Z | Security — excessive failed logon attempts | Security |&lt;br /&gt;
| M | Multiple problems | Escalate |&lt;br /&gt;
| ? | Other | Warning |&lt;br /&gt;
&lt;br /&gt;
This field is the natural hook for automated site-health alerting: map to a severity enum on ingest and raise on anything in {B, F, I, Q, S, U, V, M}.&lt;br /&gt;
&lt;br /&gt;
h3. 2.4 Derived Read-Rate Metrics&lt;br /&gt;
&lt;br /&gt;
{code}&lt;br /&gt;
loco_read_rate    = AEM25 / AEM24      (Locomotives Tagged / Locomotive Count)&lt;br /&gt;
railcar_read_rate = AEM27 / AEM26      (Railcars Tagged / Railcar Count)&lt;br /&gt;
{code}&lt;br /&gt;
Counts include untagged equipment; &amp;quot;Tagged&amp;quot; counts only valid tags. Guard against divide-by-zero — a locomotive-only or railcar-only consist yields a zero denominator on the other pair.&lt;br /&gt;
&lt;br /&gt;
h2. 3. RRE — Rail Equipment&lt;br /&gt;
&lt;br /&gt;
Opens the per-vehicle loop. At least one RRE per rail vehicle, tagged or not. Always the first segment reported for a vehicle.&lt;br /&gt;
&lt;br /&gt;
h3. 3.1 Offset Table (Mode 1, 0-based, total 38 bytes)&lt;br /&gt;
&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| RRE00 | 0 | 3 | AN | Segment ID = &amp;quot;RRE&amp;quot; |&lt;br /&gt;
| RRE01 | 3 | 3 | N | Sequence Number (standing order, 1 = first) |&lt;br /&gt;
| RRE02 | 6 | 1 | A | Equipment Group Code |&lt;br /&gt;
| RRE03 | 7 | 4 | A | Owner Code (SCAC) |&lt;br /&gt;
| RRE04 | 11 | 10 | N | Owner Equipment Number |&lt;br /&gt;
| RRE05 | 21 | 1 | A | Orientation |&lt;br /&gt;
| RRE06 | 22 | 1 | AN | Reserved |&lt;br /&gt;
| RRE07 | 23 | 1 | A | Axle Conversion Code |&lt;br /&gt;
| RRE08 | 24 | 1 | A | Tag Status |&lt;br /&gt;
| RRE09 | 25 | 1 | A | Tag Detail Status |&lt;br /&gt;
| RRE10 | 26 | 2 | N | Handshakes Antenna 0 |&lt;br /&gt;
| RRE11 | 28 | 2 | N | Handshakes Antenna 1 |&lt;br /&gt;
| RRE12 | 30 | 3 | N | Speed of Vehicle |&lt;br /&gt;
| RRE13 | 33 | 3 | N | Axles counted by wheel sensor |&lt;br /&gt;
| RRE14 | 36 | 2 | N | Platform Count |&lt;br /&gt;
&lt;br /&gt;
h3. 3.2 Code Lookups&lt;br /&gt;
&lt;br /&gt;
*RRE02 — Equipment Group Code:* D = Locomotive, R = Railcar (includes former non-revenue rail), ? = Unknown. Derived from axle pattern when the vehicle is untagged.&lt;br /&gt;
&lt;br /&gt;
*RRE05 — Orientation (which end faces forward)*&lt;br /&gt;
|| Code || Railcar || Locomotive ||&lt;br /&gt;
| A | &amp;quot;A&amp;quot; end | &amp;quot;F&amp;quot; end |&lt;br /&gt;
| B | &amp;quot;B&amp;quot; (brake) end | &amp;quot;R&amp;quot; end |&lt;br /&gt;
| U | Unknown / not determined | Unknown |&lt;br /&gt;
&lt;br /&gt;
*RRE07 — Axle Conversion Code:* G = good, no problem determining vehicles from axle input. B = bad, axle data may have created a phantom vehicle. S = sequence logically correct but software cannot determine vehicle type.&lt;br /&gt;
&lt;br /&gt;
*RRE08 — Tag Status (placement / read completeness)*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| G | Good — both right and left tags read |&lt;br /&gt;
| M | Mismatched identification (owner code + equipment number differ between tags) |&lt;br /&gt;
| L | Left tag missing |&lt;br /&gt;
| R | Right tag missing |&lt;br /&gt;
| N | No tag read |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
*RRE09 — Tag Detail Status (tag content / programming)*&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| K | OK |&lt;br /&gt;
| A | Axle error — tag axle count differs from axle pattern |&lt;br /&gt;
| E | EGC error — tag EGC differs from axle pattern |&lt;br /&gt;
| L | Length error — tag length differs from axle pattern by &amp;gt;15% |&lt;br /&gt;
| O | Placement error — wrong side or wrong end |&lt;br /&gt;
| D | Unused tag read on equipment |&lt;br /&gt;
| W | Window violation — tag outside the AAR acceptable application window |&lt;br /&gt;
| M | Multiple errors |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
{warning:title=RRE09 = &amp;quot;M&amp;quot; triggers a required TDM}&lt;br /&gt;
When Tag Detail Status is *M*, the RRE is followed by a *TDM* segment enumerating exactly which cross-checks failed. A decoder that ignores TDM loses all detail behind an &amp;quot;M&amp;quot;. Also note a TDM is unconditionally required directly after the *first* RRE in every consist, which declares which cross-checks the site is capable of measuring at all — parse it before interpreting any RRE09 value.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
h3. 3.3 The Duplicate-Sequence Rule&lt;br /&gt;
&lt;br /&gt;
{warning}&lt;br /&gt;
*Sequence Number is not a unique key.* When two tags are found on one vehicle with differing IDs (an ID mismatch), *two RRE segments are emitted with the same RRE01*, both carrying RRE08 = &amp;quot;M&amp;quot;. The primary key for a vehicle row must be (consist key, RRE01, occurrence) — or (consist key, RRE01, RRE03, RRE04). A naive upsert on sequence number silently drops the second tag and destroys the mismatch evidence.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
h3. 3.4 Field Handling Notes&lt;br /&gt;
&lt;br /&gt;
* *RRE03 (Owner Code)* — 4 chars, *space-padded* SCAC (&amp;quot;SP&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot;). *Blank if not tagged.* Trim on read; distinguish blank-because-untagged from blank-because-suppressed by checking RRE08 = N.&lt;br /&gt;
* *RRE04 (Equipment Number)* — 10 digits, leading zeros. *Zero if not tagged.* Store as string if you need to round-trip exactly; convert to integer only for matching.&lt;br /&gt;
* *RRE10 / RRE11 (Handshakes)* — 2 digits, saturating: *99 means &amp;quot;99 or more&amp;quot;*, not literally 99. Do not compute averages across a saturated field without flagging. A zero on one antenna alongside a healthy count on the other is the normal signature of a missing left/right tag.&lt;br /&gt;
* *RRE14 (Platform Count)* — always 1 for non-articulated cars; &amp;gt;1 indicates an articulated multi-platform car, which is what CEQ platform codes hang off.&lt;br /&gt;
* Untagged vehicles still produce an RRE derived purely from axle pattern. Expect blank SCAC, zero number, RRE08 = N.&lt;br /&gt;
&lt;br /&gt;
h2. 4. EOT — End of Train Device&lt;br /&gt;
&lt;br /&gt;
One per EOT tag read. Usually the last tag in the consist, but can appear on any vehicle (e.g. dead-headed on a locomotive), so do not use EOT position as an end-of-train marker.&lt;br /&gt;
&lt;br /&gt;
h3. 4.1 Offset Table (Mode 1, 0-based, total 26 bytes)&lt;br /&gt;
&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| EOT00 | 0 | 3 | AN | Segment ID = &amp;quot;EOT&amp;quot; |&lt;br /&gt;
| EOT01 | 3 | 3 | N | Sequence Number of the *carrying vehicle* |&lt;br /&gt;
| EOT02 | 6 | 1 | A | Equipment Group Code (from tag; &amp;quot;E&amp;quot; per EGC table) |&lt;br /&gt;
| EOT03 | 7 | 4 | A | Owner Code (SCAC) |&lt;br /&gt;
| EOT04 | 11 | 10 | N | Owner Equipment Number |&lt;br /&gt;
| EOT05 | 21 | 2 | N | Handshakes Antenna 0 |&lt;br /&gt;
| EOT06 | 23 | 2 | N | Handshakes Antenna 1 |&lt;br /&gt;
| EOT07 | 25 | 1 | A | Tag Detail Status |&lt;br /&gt;
&lt;br /&gt;
h3. 4.2 EOT07 — Tag Detail Status&lt;br /&gt;
|| Code || Meaning ||&lt;br /&gt;
| K | OK |&lt;br /&gt;
| H | Performance — low handshakes |&lt;br /&gt;
| W | Window violation — tag in wrong location |&lt;br /&gt;
| ? | Other |&lt;br /&gt;
&lt;br /&gt;
{note}&lt;br /&gt;
Per the implementation-status notes in the standard, EOT Tag Detail Status is *always &amp;quot;K&amp;quot;* in practice; all other fields are complete. Treat non-K as an anomaly worth logging rather than a routine branch.&lt;br /&gt;
{note}&lt;br /&gt;
&lt;br /&gt;
Max occurrences per RRE loop: 99. EOT01 associates the device to its carrier — join on sequence number, do not assume the EOT belongs to the highest-numbered vehicle.&lt;br /&gt;
&lt;br /&gt;
h2. 5. EOC — End of Consist&lt;br /&gt;
&lt;br /&gt;
Mandatory terminating segment. Always the last segment of the consist report.&lt;br /&gt;
&lt;br /&gt;
|| Ref || Off || Len || Type || Field ||&lt;br /&gt;
| EOC00 | 0 | 3 | AN | Segment ID = &amp;quot;EOC&amp;quot; |&lt;br /&gt;
| EOC01 | 3 | 10 | N | Total Byte Count |&lt;br /&gt;
&lt;br /&gt;
Total: 13 bytes.&lt;br /&gt;
&lt;br /&gt;
{warning:title=Byte count semantics}&lt;br /&gt;
EOC01 counts *from the consist header (AEM) up to but not including the EOC segment itself*. Use it as the integrity check on every consist:&lt;br /&gt;
&lt;br /&gt;
{code}&lt;br /&gt;
observed = byte_length(all bytes from start of AEM through end of segment preceding EOC)&lt;br /&gt;
if observed != int(EOC01): reject_or_quarantine(consist)&lt;br /&gt;
{code}&lt;br /&gt;
&lt;br /&gt;
Two things to pin down against live data from each site before enabling hard rejection: whether line terminators (CR/LF) are included in the count, and whether trailing delimiters are counted. These vary by vendor implementation. Recommended rollout: log the delta in advisory mode first, then enforce once the per-vendor convention is confirmed.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
Absence of EOC means a truncated transmission — quarantine, do not partially commit.&lt;br /&gt;
&lt;br /&gt;
h2. 6. Units of Measure&lt;br /&gt;
&lt;br /&gt;
AEM14 governs the whole report. Fields affected across the four segments in scope:&lt;br /&gt;
&lt;br /&gt;
|| Segment || Field || E (English) || M (Metric) ||&lt;br /&gt;
| AEM | Max / Min / Avg Speed | mph | kph |&lt;br /&gt;
| AEM | Train Length | feet | decimeters |&lt;br /&gt;
| RRE | Speed | mph | kph |&lt;br /&gt;
&lt;br /&gt;
{warning}&lt;br /&gt;
Metric train length is in *decimeters*, not meters. This is a frequent off-by-10 source. Normalize to a single internal unit at ingest and store the original AEM14 value alongside it for audit.&lt;br /&gt;
{warning}&lt;br /&gt;
&lt;br /&gt;
Out of scope here but on the same latch: CEQ length (feet / decimeters), XSC weight (pounds / kilograms), DYL fuel volume (100 gal / 100 L) and cumulative energy (100 HP-hr / 100 kW-hr).&lt;br /&gt;
&lt;br /&gt;
h2. 7. Parser Contract&lt;br /&gt;
&lt;br /&gt;
h3. 7.1 Ordering and Looping&lt;br /&gt;
&lt;br /&gt;
Segments must be transmitted in the standard T-94 sequence. Relevant structure for the segments in scope:&lt;br /&gt;
&lt;br /&gt;
|| Segment || Loop L1 || Loop L2 || Status || Max Occurs ||&lt;br /&gt;
| AEM | 1 | 1 | Required | 1 |&lt;br /&gt;
| DCL | 1 | 1 | Optional loop | 999 |&lt;br /&gt;
| RRE | 2 | 1 | Optional — begins RRE loop | 999 |&lt;br /&gt;
| TDM | 2 | 1 | Required after RRE01 / conditional | — |&lt;br /&gt;
| EOT | 2 | 2 | Optional | 99 |&lt;br /&gt;
| RTD | 2 | 6 | Mandatory in V1.1 | 99 |&lt;br /&gt;
| CEQ | 2 | 13 | Optional — begins CEQ loop inside RRE loop | 999 |&lt;br /&gt;
| MMR | 2 | 14 | Optional — begins MMR loop inside RRE loop | 999 |&lt;br /&gt;
| EOC | 3 | 1 | Required | 1 |&lt;br /&gt;
&lt;br /&gt;
Loop mechanics: the first segment of a loop appears exactly once per occurrence and never again inside that loop, so RRE reliably delimits vehicle boundaries and CEQ / MMR reliably delimit their nested occurrences.&lt;br /&gt;
&lt;br /&gt;
h3. 7.2 Recommended State Machine&lt;br /&gt;
&lt;br /&gt;
{code}&lt;br /&gt;
EXPECT_AEM&lt;br /&gt;
  -&amp;gt; AEM              : latch units(AEM14), version(AEM08), consist key,&lt;br /&gt;
                        site health(AEM23); start byte counter&lt;br /&gt;
EXPECT_DCL_OR_RRE&lt;br /&gt;
  -&amp;gt; DCL*             : accumulate site asset inventory&lt;br /&gt;
  -&amp;gt; RRE              : first RRE -&amp;gt; next segment MUST be TDM (capability decl.)&lt;br /&gt;
IN_VEHICLE&lt;br /&gt;
  -&amp;gt; RRE              : close prior vehicle, open new.&lt;br /&gt;
                        If RRE01 == previous RRE01 -&amp;gt; ID-mismatch pair, same vehicle&lt;br /&gt;
  -&amp;gt; TDM              : cross-check detail (required when prior RRE09 == &#039;M&#039;)&lt;br /&gt;
  -&amp;gt; RTD              : raw tag hex, 0..99 per vehicle&lt;br /&gt;
  -&amp;gt; EOT | CEQ | XSC | THI | HAT | DYx | GEN | ALM | MMR | TST&lt;br /&gt;
                      : attach to current RRE01&lt;br /&gt;
  -&amp;gt; EOC              : close vehicle, validate byte count, emit consist&lt;br /&gt;
DONE&lt;br /&gt;
{code}&lt;br /&gt;
&lt;br /&gt;
h3. 7.3 Defensive Rules&lt;br /&gt;
&lt;br /&gt;
# *Dispatch on segment ID, never on line position.* Any segment may be disabled at the site.&lt;br /&gt;
# *Treat &amp;quot;?&amp;quot; as a first-class value in every enumerated field.* It means &amp;quot;other,&amp;quot; not &amp;quot;invalid.&amp;quot; Never throw on it.&lt;br /&gt;
# *Preserve raw lines.* Store the original segment text alongside the parsed row for the retention window. Reprocessing beats re-requesting from a Class I host.&lt;br /&gt;
# *Never reject a consist over an unknown code value.* Log unknown enum values and pass the record through with a data-quality flag. New codes get added to the standard.&lt;br /&gt;
# *Idempotency key:* (AEM01 Billing Code, AEM02 Site ID, AEM09 Sequence, AEM03 Start Date, AEM04 Start Time). AEM09 wraps 9999 → 1, and zero is invalid — sequence alone is not unique across a long feed.&lt;br /&gt;
# *Timestamps are local time.* AEM03/AEM04 plus AEM06 offset plus AEM07 DST flag. Convert to UTC on ingest and retain the original triple. Do not infer DST from the date; trust AEM07.&lt;br /&gt;
# *Fixed-width examples in the standard are not perfectly consistent* in their spacing. Build the parser off the field-size tables, not off the printed examples, and be tolerant of stray whitespace.&lt;br /&gt;
# *Numeric fields are zero-padded strings.* Strip leading zeros only at the point of use; equipment numbers in particular should round-trip as strings.&lt;br /&gt;
&lt;br /&gt;
h3. 7.4 Validation Checklist per Consist&lt;br /&gt;
&lt;br /&gt;
|| Check || Source || On failure ||&lt;br /&gt;
| Segment ID recognized | 3-char prefix | Log + skip segment, continue |&lt;br /&gt;
| AEM present and first | State machine | Reject consist |&lt;br /&gt;
| EOC present and last | State machine | Quarantine as truncated |&lt;br /&gt;
| Byte count matches | EOC01 | Advisory, then reject once convention confirmed |&lt;br /&gt;
| Format version major digit supported | AEM08 digit 1 | Route to quarantine for review |&lt;br /&gt;
| RRE count reconciles to AEM24 + AEM26 | Counts | Data-quality flag, do not reject |&lt;br /&gt;
| Tagged counts ≤ total counts | AEM24/25, AEM26/27 | Data-quality flag |&lt;br /&gt;
| Site health nominal | AEM23 | Raise maintenance alert on fatal codes |&lt;br /&gt;
| Every RRE01 in 1..AEM24+AEM26 | Sequence | Data-quality flag |&lt;br /&gt;
| Duplicate RRE01 also has RRE08 = M | Mismatch rule | Log unexpected duplicate |&lt;br /&gt;
&lt;br /&gt;
h2. 8. Open Items&lt;br /&gt;
&lt;br /&gt;
* Confirm per-vendor CR/LF and trailing-delimiter treatment in the EOC01 byte count before enforcing rejection.&lt;br /&gt;
* Confirm whether source sites emit V1.1 mandatory RTD and TDM segments, or legacy output without them — this determines whether their absence is an error or an expected legacy condition.&lt;br /&gt;
* Register the delimiter character actually used per site (space vs {{*}}) in site configuration rather than detecting it per file.&lt;br /&gt;
* DCL and TDM are marked *Proposed* in the standard while RTD is mandatory in V1.1; verify current adoption state against the latest published revision before treating any of the three as guaranteed.&lt;br /&gt;
&lt;br /&gt;
h2. 9. References&lt;br /&gt;
&lt;br /&gt;
* AAR Manual of Standards and Recommended Practices, Standard *S-9203A.V1.1* — AEI Site-to-Host Consist Report Format (formerly S-918A). Adopted 2003, revised 2020.&lt;br /&gt;
* AAR MSRP Standard *S-9203* (latest version) — tag data formats. Appendix A/B for RRE, Appendix E for EOT, Appendix P for raw reader-to-processor data (RTD).&lt;br /&gt;
* Appendix A §1.0 of S-9203A — Equipment Group Code values.&lt;br /&gt;
&lt;br /&gt;
{note:title=Do not host the standard here}&lt;br /&gt;
This page is an implementation summary. The AAR MSRP is licensed, copyrighted material — link to the controlled copy rather than attaching or transcribing the source document into the wiki.&lt;br /&gt;
{note}&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2494</id>
		<title>CINQ Edge User Quick Start Guide</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2494"/>
		<updated>2026-07-08T20:12:14Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-size: 18pt;&amp;quot;&amp;gt;Connecting to Cinq Edge&amp;lt;/span&amp;gt;&#039;&#039;&#039; ==&lt;br /&gt;
Welcome to Cinq, your gateway to smarter rail monitoring and connected performance. By providing both historical and real-time insights, Cinq lets you know exactly what&#039;s on your sites and in motion to help your organization move from reactive problem solving to predictive planning.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Terminology&#039;&#039;&#039; ===&lt;br /&gt;
Before you connect to Cinq Edge, it is important to understand the following terminology:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Cinq:&#039;&#039;&#039; The system where you view site activity, device data, and organizational settings. Cinq provides features to monitor communication status, review movement history, and manage your sites.&lt;br /&gt;
* CINQ Edge&#039;&#039;&#039;:&#039;&#039;&#039; The hardware installed at the site (available in either solar or commercial-powered versions). The CINQ Edge device collects and sends movement, location, and communication data to the dashboard.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Initial orientation&#039;&#039;&#039; ===&lt;br /&gt;
As part of the installation and onboarding process for Cinq Edge, COMET Electronics assigns and configures each device before shipment. When your equipment arrives, it already is paired to your site and ready to activate.&lt;br /&gt;
&lt;br /&gt;
Look for your welcome email from COMET Electronics that contains your company administrator username, temporary password, sign‑in link, and MFA (multifactor authentication) setup instructions.&amp;lt;blockquote&amp;gt;Contact [[Comet Support]] if you do not receive your welcome email within 24 hours of initiating your subscription.&amp;lt;/blockquote&amp;gt;The company administrator role manages user accounts, assigns user roles and permissions, and maintains access for your organization. During onboarding, the company administrator assigns a site name to each Cinq Edge site. The company administrator also configures directional movement indicators may to match your operational terminology (for example, Inbound/Outbound, North/South, East/West). Once onboarding is complete, your organization is responsible for managing users in Cinq.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Cinq Edge Power and Startup Behavior&#039;&#039;&#039; ===&lt;br /&gt;
Your Cinq Edge’s startup behavior will differ based on its power type:&lt;br /&gt;
&lt;br /&gt;
* Commercial‑powered: Activates immediately once powered.&lt;br /&gt;
* Solar‑powered: May need between two and 10 hours of direct sunlight to fully charge and establish connectivity. While Cinq Edge is charging, movement activity, communication status, and GPS location do not appear in Cinq. These details populate in Cinq automatically once Cinq Edge is fully powered and communication and GPS signals are established.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;If Cinq fails to display GPS data for two days after initial startup of Cinq Edge, contact [[Comet Support]] for assistance.&amp;lt;/blockquote&amp;gt;For complete details on how to install Cinq Edge, see the [[CINQ Edge Installation Manual]] topic.&lt;br /&gt;
&lt;br /&gt;
== Viewing Your Cinq Edge sites ==&lt;br /&gt;
After you sign in, Cinq displays the Cinq Edge sites associated with your company account.&lt;br /&gt;
&lt;br /&gt;
To ensure that your dashboard is functioning as expected, verify that the following details are displayed:&lt;br /&gt;
&lt;br /&gt;
* Your Cinq Edge site(s).&lt;br /&gt;
* Site details and movement activity.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;Contact your company administrator if your assigned site or permissions appear incorrect.&amp;lt;/blockquote&amp;gt;The map view displays color-coded icons based on your site type to indicate live status and operational activity:&lt;br /&gt;
&lt;br /&gt;
* Cinq Edge: Sites are displayed using grey icons.&lt;br /&gt;
* Full-Scale RailNet AEI&#039;&#039;&#039;:&#039;&#039;&#039; Sites are displayed as green, yellow, orange, or red icons based on current site status and activity levels. &lt;br /&gt;
&lt;br /&gt;
[[file:CEwidedashboard.png|500px|center|thumb|Grey icons designate Cinq Edge sites.]]&lt;br /&gt;
&lt;br /&gt;
== Viewing Site Details ==&lt;br /&gt;
Select CINQ Edge on the left navigation pane to access the list of your Cinq Edge device(s). &lt;br /&gt;
[[File:Screenshot 2026-04-06 105441.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Selecting a device allows you to:&lt;br /&gt;
&lt;br /&gt;
* Review equipment moves.&lt;br /&gt;
* View site details and configuration information.&lt;br /&gt;
* Monitor messages sent from Cinq Edge.&lt;br /&gt;
* View site naming and directional movement configuration.&lt;br /&gt;
* You can also open your Cinq Edge sites by selecting &#039;&#039;&#039;Cinq Edge&#039;&#039;&#039; from the left navigation menu.&lt;br /&gt;
&lt;br /&gt;
== Monitoring Railroad Equipment ==&lt;br /&gt;
Select Railroad Equipment on the left navigation pane to view railroad equipment activity for your Cinq Edge site(s).&lt;br /&gt;
&lt;br /&gt;
From this view you can:&lt;br /&gt;
&lt;br /&gt;
* See equipment movements detected at the site.&lt;br /&gt;
* Review equipment activity and movement history.&lt;br /&gt;
&lt;br /&gt;
* Export movement records to Excel for operational analysis and reporting.&lt;br /&gt;
&lt;br /&gt;
Movement records populate automatically as railroad equipment passes the Cinq Edge site. During initial startup and activation, movement activity may take time to appear.&lt;br /&gt;
&lt;br /&gt;
Your company administrator can customize movement directions to align with your operational terminology, such as:&lt;br /&gt;
&lt;br /&gt;
* Inbound/Outbound&lt;br /&gt;
* North/South&lt;br /&gt;
* East/West&lt;br /&gt;
&lt;br /&gt;
Movement history and equipment visibility will continue to increase over time as Cinq Edge detects and transmits activity to Cinq.[[File:Screenshot 2026-04-06 105644.png|center|800x800px|border]]&lt;br /&gt;
[[File:Screenshot 2026-04-06 105757.png|center|border|800x800px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Track Zones ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039; Track Zones are optional and not configured for all Cinq Edge deployments.&amp;lt;/blockquote&amp;gt;Track Zones allow your organization to group and monitor specific operational areas for:&lt;br /&gt;
&lt;br /&gt;
* Movement tracking.&lt;br /&gt;
* Inventory visibility.&lt;br /&gt;
* Operational monitoring.&lt;br /&gt;
&lt;br /&gt;
If track zones are configured for your Cinq Edge site, select &#039;&#039;&#039;Track Zones&#039;&#039;&#039; from the left navigation pane to view the zones.&lt;br /&gt;
&lt;br /&gt;
Select a track zone name to view:&lt;br /&gt;
&lt;br /&gt;
* Track zone movements.&lt;br /&gt;
* Track Zone inventory.&lt;br /&gt;
* Movement history associated with the selected zone.&lt;br /&gt;
Movement and inventory information are updated automatically when Cinq Edge detects activity and transmits it to the Cinq.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-04-06 105853.png|center|border|800x800px]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Main_Page&amp;diff=2483</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Main_Page&amp;diff=2483"/>
		<updated>2026-07-02T15:23:52Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Comet Support == &lt;br /&gt;
[[Comet Support | Contact Comet Support]]&lt;br /&gt;
&lt;br /&gt;
== RailNET Software ==&lt;br /&gt;
[[RailNET Software]]&lt;br /&gt;
&lt;br /&gt;
== RailNet Reference Materials ==&lt;br /&gt;
&lt;br /&gt;
=== Documentation Packet ===&lt;br /&gt;
[[RailNET Full System Documentation Packet (2024)]]&lt;br /&gt;
&lt;br /&gt;
=== Installation and Operations Guides ===&lt;br /&gt;
* [[RailNet AEI System – Operations Manual]]&lt;br /&gt;
* [[Railnet AEI System Site Installation Manual]]&lt;br /&gt;
* [[RailNET In a NEMA Enclosure Installation Manual]]&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Guidance ===&lt;br /&gt;
[[RailNET Upgrade Guidance]]&lt;br /&gt;
&lt;br /&gt;
=== Reporting ===&lt;br /&gt;
&lt;br /&gt;
=== Troubleshooting ===&lt;br /&gt;
[[Troubleshooting Index]]&lt;br /&gt;
&lt;br /&gt;
== Cinq Edge ==&lt;br /&gt;
* [[CINQ Edge User Quick Start Guide|Cinq Edge User Quick Start Guide]]&lt;br /&gt;
* [[CINQ Edge Installation Manual|Cinq Edge Installation Manual]]&lt;br /&gt;
&lt;br /&gt;
== Distribution ==&lt;br /&gt;
[[Transcore]]&lt;br /&gt;
&lt;br /&gt;
== Bulletins ==&lt;br /&gt;
* [[Product Bulletins]]&lt;br /&gt;
* [[Service Bulletins]]&lt;br /&gt;
&lt;br /&gt;
== Education ==&lt;br /&gt;
[[Basic Networking]]&lt;br /&gt;
&lt;br /&gt;
== Legal ==&lt;br /&gt;
* [[Privacy Policy]]&lt;br /&gt;
* [[Cookie Policy]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Resistance_ARC_Welding_in_Proximity_to_AEI_Equipment&amp;diff=2480</id>
		<title>Resistance ARC Welding in Proximity to AEI Equipment</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Resistance_ARC_Welding_in_Proximity_to_AEI_Equipment&amp;diff=2480"/>
		<updated>2026-06-04T18:12:30Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Resistance ARC welding on or near the rail presents electrical and thermal hazards to AEI equipment and associated wiring. Comet Electronics&#039; position on welding operations in the vicinity of AEI installations is as follows:&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
All AEI equipment and associated wiring must be positioned outside the spark zone established for the welding operation. Personnel must take precautions to ensure that spatter, hot metal fragments, or slag do not contact equipment housings, cable runs, connectors, or any other wiring associated with the AEI installation.&lt;br /&gt;
&lt;br /&gt;
=== Track Circuit ===&lt;br /&gt;
Where AEI equipment is integrated with a track circuit, the track circuit must be disconnected and electrically isolated prior to any welding activity on the rail in proximity of the AEI site. Work should not commence until isolation is confirmed.  Proximity is defined as less than 30 ft from track circuit connection.&lt;br /&gt;
&lt;br /&gt;
These requirements apply regardless of welding duration or perceived proximity.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Resistance_ARC_Welding_in_Proximity_to_AEI_Equipment&amp;diff=2479</id>
		<title>Resistance ARC Welding in Proximity to AEI Equipment</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Resistance_ARC_Welding_in_Proximity_to_AEI_Equipment&amp;diff=2479"/>
		<updated>2026-06-04T18:07:39Z</updated>

		<summary type="html">&lt;p&gt;DGast: Created page with &amp;quot;Resistance ARC welding on or near the rail presents electrical and thermal hazards to AEI equipment and associated wiring. Comet Electronics&amp;#039; position on welding operations in the vicinity of AEI installations is as follows:  Where AEI equipment is integrated with a track circuit, the track circuit must be disconnected and electrically isolated prior to any welding activity on the rail. Work should not commence until isolation is confirmed.  All AEI equipment and associa...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Resistance ARC welding on or near the rail presents electrical and thermal hazards to AEI equipment and associated wiring. Comet Electronics&#039; position on welding operations in the vicinity of AEI installations is as follows:&lt;br /&gt;
&lt;br /&gt;
Where AEI equipment is integrated with a track circuit, the track circuit must be disconnected and electrically isolated prior to any welding activity on the rail. Work should not commence until isolation is confirmed.&lt;br /&gt;
&lt;br /&gt;
All AEI equipment and associated wiring must be positioned outside the spark zone established for the welding operation. Personnel must take precautions to ensure that spatter, hot metal fragments, or slag do not contact equipment housings, cable runs, connectors, or any other wiring associated with the AEI installation.&lt;br /&gt;
&lt;br /&gt;
These requirements apply regardless of welding duration or perceived proximity.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:TGEN701D.zip&amp;diff=2473</id>
		<title>File:TGEN701D.zip</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:TGEN701D.zip&amp;diff=2473"/>
		<updated>2026-05-12T20:20:53Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Development_Release_TGEN701&amp;diff=2472</id>
		<title>Development Release TGEN701</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Development_Release_TGEN701&amp;diff=2472"/>
		<updated>2026-05-12T20:19:19Z</updated>

		<summary type="html">&lt;p&gt;DGast: Created page with &amp;quot;Development release of TGEN train processor for improved processing of Acella trains and passenger cars.  file:TGEN701D.zip&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Development release of TGEN train processor for improved processing of Acella trains and passenger cars.&lt;br /&gt;
&lt;br /&gt;
[[file:TGEN701D.zip]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Upgrade_AEI_Site_with_Multiplexed_AI1200/AR2200_to_MPRX&amp;diff=2432</id>
		<title>Upgrade AEI Site with Multiplexed AI1200/AR2200 to MPRX</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Upgrade_AEI_Site_with_Multiplexed_AI1200/AR2200_to_MPRX&amp;diff=2432"/>
		<updated>2026-04-14T19:04:47Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| style=&amp;quot;border-collapse: collapse; margin-left: auto; margin-right: auto;&amp;quot; &lt;br /&gt;
|- style=&amp;quot;height: 345px; text-align: center;&amp;quot; &lt;br /&gt;
| style=&amp;quot;width: 100%; height: 345px;&amp;quot; | [[image:img1742593256961.png|600px|center|frameless]]&lt;br /&gt;
|- style=&amp;quot;height: 23px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 100%; height: 23px; text-align: center;&amp;quot; | Figure 1&lt;br /&gt;
|}&lt;br /&gt;
Transcore has sunset the AI1200/AR2200 RFID subsystem components utilized in Comet Electronics’ Railnet AEI system. Transcore has developed the MPRX, Multiprotocol Reader Extreme as replacement. The MPRX is a next-generation RFID reader that supports Association of American Railroads (AAR) formatted tags. &amp;amp;nbsp;&amp;lt;br&amp;gt;Comet Electronics has designed an interface card to make the MPRX seamless to the AI1200/AR2200 installation.&amp;amp;nbsp;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In a low-medium speed sites (unrestricted up to 60 mph, restricted 40 mph), installation will be similar to a single AI1200/AR2200 installation (multiplexed RF). It will use a single MPASS/MPRX, with connections to antenna ports 0 &amp;amp; 1.&amp;amp;nbsp;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In a high speed site (unrestricted up to 130 mph), installation will be similar to a dual AI1200/AR2200 installation (dedicated RF). It will use dual&amp;amp;nbsp;&amp;lt;br&amp;gt;MPASS/MPRX, with connections to antenna port 0 on both units. Refer to [[Upgrade AEI Site with Dedicated AI1200/AR2200 to MPRX]] for detailed installation procedure.&amp;amp;nbsp;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For detailed specifications of the MPRX, refer to Transcore’s document, 16-0079-001, MPRX User Guide.&amp;amp;nbsp;&amp;lt;p&amp;gt;&#039;&#039;&#039;Requirements:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;Minimum AEI software version for standard multiplexed operation&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 25px;&amp;quot;&amp;gt;&#039;&#039;&#039;5.2.0.16&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;/blockquote&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;Materials Required:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;&#039;&#039;&#039;Single/Multiplexed RF site:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;1&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; [[402173]]&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; MPRX, Multiprotocol RFID Reader&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;1&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; [[400183]]&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; MPASS Interface Card&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;1&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; [[402180]]&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; APU102 to MPRX Cable Assembly&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;2&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; [[400647]]&amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; &amp;amp;nbsp; 50Ω, 2W Dummy load&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;Misc. Required:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
*Laptop computer with serial port or USB to Serial adapter&lt;br /&gt;
*Communication program such as TeraTerm, HyperTerminal, etc.&lt;br /&gt;
*Null modem cable or modem cable with null adapter (25-pin DB male on APU-102 end)&lt;br /&gt;
*MPRX specific INI files (may be preloaded to APU102)&lt;br /&gt;
*Antistatic (ESD) wrist strap&lt;br /&gt;
*Pre-programmed Test tag mounted on backing plate.&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;&amp;amp;nbsp;&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&#039;&#039;&#039;Optional&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
*APU102 System Operations and Installation Manuals&lt;br /&gt;
*Communications program users guide&lt;br /&gt;
&lt;br /&gt;
= Upgrade Procedure =&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; width: 60%; margin-left: auto; margin-right: auto;&amp;quot; border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;4px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 12.8988%; background-color: rgb(230, 126, 35);&amp;quot; | &amp;lt;p style=&amp;quot;text-align: center;&amp;quot; &amp;gt;&#039;&#039;&#039;ATTENTION:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 85.7143%;&amp;quot; | &amp;lt;p&amp;gt;The user is responsible for obtaining the appropriate radio transmitter license. In the United States, the authorized continuous wave (AAR-formatted operation) frequency band for this product is 902.25 to 903.75 MHz and 910.00 to 921.50 MHz. RF power output is rated for 2 watts. Users in all other countries should check with the appropriate authorities for licensing requirements.&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Determine RF frequency currently in use/licensed for site ==&lt;br /&gt;
&amp;lt;p&amp;gt;If current license is for specific frequency, the MPRX can be set to the same frequency if in the currently allowable bands. Review your license documents or check the existing RF unit frequency. To view/verify the current frequency, examine the “toe-tag” or printed label on the RF module (inside the enclosure). The Version 1 RF module will have the label on the right side. The Version 2 RF module will have a small label viewable through the Antenna one opening.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; margin-left: auto; margin-right: auto; width: 599px;&amp;quot; border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;4px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 51.6722px; background-color: rgb(53, 152, 219);&amp;quot; | &amp;lt;p&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 528.433px;&amp;quot; | &amp;lt;p&amp;gt;Multiple RF sources in close proximity (&amp;amp;lt; 1000’) must have minimum 1.5 MHz separation&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
== Files and Parameters Relative to the MPRX: ==&lt;br /&gt;
&amp;lt;p&amp;gt;Steps 1-4 can be done remotely, prior to site visit.&amp;lt;/p&amp;gt;&lt;br /&gt;
#Connect the laptop to the APU102’s local port.&lt;br /&gt;
#Log into the APU102 to the Supervisory level (Change Prompt)&lt;br /&gt;
#Verify minimum software requirement (&#039;&#039;&#039;/ &#039;&#039;&#039;Slash command). Upgrade first if necessary.&lt;br /&gt;
#Verify if the MPRX files are preloaded&lt;br /&gt;
&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;Enter the command: &#039;&#039;&#039;DIR MPRX*.*&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; margin-left: auto; margin-right: auto;&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 100%;&amp;quot; | &amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 278 MPRX9115.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 278 MPRX9150.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 278 MPRX9185.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 302 MPRX9215.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 26 MPRXMD0.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 26 MPRXMD1.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 32 MPRXMD2.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 32 MPRXMD3.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;01/12/2021&amp;amp;nbsp; 10:43 AM&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 34 MPRXMD4.INI&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 9 File(s)&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 1,286 bytes&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 0 Dir(s)&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; 15,755,264 bytes free&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Sample Directory (there may be more frequency specific files loaded)&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:5. If not present, upload the MPRX INI files using the &#039;&#039;&#039;ZREC&#039;&#039;&#039;&#039;&#039;&#039; &#039;&#039;&#039;command&lt;br /&gt;
&lt;br /&gt;
:6. Enter the Parameter Editor (&#039;&#039;&#039;EP&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
:7. Navigate to appropriate parameters listed below and enter as necessary.&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Ports.AVI1PORT.BaudRate=&amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45); text-decoration: underline;&amp;quot; &amp;gt;&#039;&#039;&#039;5&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Ports.AVI2PORT.BaudRate=&amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45); text-decoration: underline;&amp;quot; &amp;gt;&#039;&#039;&#039;5&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Acquisition.Reader1.PortFile=AVI1PORT.DAT&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Acquisition.Reader1.IniFilename=&amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45); text-decoration: underline;&amp;quot; &amp;gt;&#039;&#039;&#039;MPRX****.INI&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;**** is desired frequency. File must be present on APU. Default for Reader 1 is MPRX9115.INI (911.5 MHz). See sample directory above.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Acquisition.Reader1.AntennaAssignment=&amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45); text-decoration: underline;&amp;quot; &amp;gt;&#039;&#039;&#039;2&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt; &amp;amp;nbsp;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;(this should not change from current configuration)&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;2: Reader services both antennas (multiplexed-one on each side of track)&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Acquisition.Reader1.Ant0PassiveLobe=&amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45); text-decoration: underline;&amp;quot; &amp;gt;&#039;&#039;&#039;16&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Field measurement required. Will be determined after installation is complete.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Acquisition.Reader1.Ant1PassiveLobe=&amp;lt;span style=&amp;quot;text-decoration: underline;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45); text-decoration: underline;&amp;quot; &amp;gt;&#039;&#039;&#039;16&#039;&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Field measurement required. Will be determined after installation is complete.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;color: rgb(224, 62, 45);&amp;quot; &amp;gt;&#039;&#039;&#039;****&#039;&#039;&#039;&amp;lt;/span&amp;gt; Other frequencies are available and may require additional INI files to be loaded.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Exit the parameter editor and log off of the APU102.&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Install the MPASS Card ==&lt;br /&gt;
&lt;br /&gt;
#Open the lid of the APU102 and power it off.&lt;br /&gt;
#Put ESD wrist strap on wrist and connect to ground lug on outside-bottom of APU102.&lt;br /&gt;
#Loosen the screws on the reader board card cage retainer.&#039;&#039;&#039; DO NOT REMOVE SCREWS.&#039;&#039;&#039;&lt;br /&gt;
#Slide the retainer down.&lt;br /&gt;
#Remove the cables from the AI1200 Reader card.&lt;br /&gt;
#Remove the AI1200 Reader card from the reader card cage.&lt;br /&gt;
#Install the MPASS interface card in the reader card cage.&lt;br /&gt;
#Connect the cables to the MPASS card, edge position.&lt;br /&gt;
#Slide retainer up and secure.&lt;br /&gt;
&lt;br /&gt;
== Install the MPRX Single/Multiplexed RF ==&lt;br /&gt;
&lt;br /&gt;
#Remove the umbilical cable between the APU102 and AR2200 RF Unit.&lt;br /&gt;
#Label the antenna connections on the coax cables connecting to the AR2200 RF Unit.&lt;br /&gt;
#Remove the coax cables.&lt;br /&gt;
#If installed, remove the checktag cable from the RF unit.&lt;br /&gt;
#Remove the ground connection on the RF unit.&lt;br /&gt;
#Remove the RF Unit from the wall.&lt;br /&gt;
#Mount the MPRX in place of the RF unit. It may be necessary to relocate other components, wiring channels, etc.&lt;br /&gt;
#Connect the ground cable to the MPRX.&lt;br /&gt;
#Examine the MPRX end of the umbilical cables if not labeled. One connector has pin contacts, one has socket contacts. Connect the one with pins to the Sense port and the one with sockets to the Host Port. The connectors are keyed and require minimal effort to fully seat. Align the “arrows” of the connectors as shown in Figure 2, carefully insert connector and turn the knurled collar clockwise to seat completely (several revolutions).[[image:img1742595583337.png|500px|center|thumb|Figure 2]]&lt;br /&gt;
#If existing site used checktag, connect the checktag connector to the one extending from the Sense connector.&lt;br /&gt;
#Connect the CPC16 connector to the APU102, RF1 connection.&lt;br /&gt;
#Connect the coax cables to the MPRX antenna ports per the labels.&lt;br /&gt;
#Install dummy loads on all unused antenna ports.&lt;br /&gt;
&lt;br /&gt;
== Initialize the MPRX ==&lt;br /&gt;
&lt;br /&gt;
#Power on the APU102.&lt;br /&gt;
#Set/Verify power supply output to Reader(s) is 13VDC.&lt;br /&gt;
#Log onto the APU102 supervisory level (Change Prompt)&lt;br /&gt;
#Initialize all MPRXs with &#039;&#039;&#039;IR,*&#039;&#039;&#039; command. The APU will reply with initialization status. &amp;lt;p style=&amp;quot;margin-left: 100px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Reader #0 initialization complete.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 100px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Reader #1 is not in current configuration.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 100px;&amp;quot; &amp;gt;&amp;lt;span style=&amp;quot;font-family: &amp;amp;quot;courier new&amp;amp;quot;, courier;&amp;quot; &amp;gt;Reader #2 is not in current configuration.&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 75px;&amp;quot; &amp;gt;Sample Reader initialization reply (single MPRX installation)&amp;lt;/p&amp;gt;&lt;br /&gt;
# If a failure is indicated, verify the files are present as in [[#Files and Parameters Relative to the MPRX|Files and Parameters Relative to the MPRX]], step 4 and parameters are correct as in [[#Files and Parameters Relative to the MPRX|Files and Parameters Relative to the MPRX]], step 7. Verify boards are installed and everything is cabled correctly. Verify Reader power is present. Correct as necessary (reboot required for changes to Ports.AVx1PORT.BaudRate) and reinitialize the MPRXs.&lt;br /&gt;
&lt;br /&gt;
= Optimization Checks =&lt;br /&gt;
&amp;lt;p&amp;gt;RF power checks and Checktag operations can be run if desired. Wattmeter connections and command sequences are the same as the AI1200/AR2200 configuration.&amp;lt;/p&amp;gt;&lt;br /&gt;
=== Measuring the Horizontal Read Lobe (Window) ===&lt;br /&gt;
#Set the Sonalert selector switch on the interconnect board in the bottom of the APU102 to the left.&lt;br /&gt;
#Activate the MPRX with the command &#039;&#039;&#039;RFON,0,*&#039;&#039;&#039;&lt;br /&gt;
#Measure the horizontal read window for antenna 0. &amp;lt;p style=&amp;quot;margin-left: 75px;&amp;quot; &amp;gt;At the edge of tie facing antenna 0 (typically the hut side of the track), hold the test tag horizontally at 42” above top of rail. You should hear the Sonalert chatter (not a solid tone). Keeping the tag steady, move slowly to the right until the sonalert tone stops. Mark this position on the tie. Now, move to the left, holding the tag as before. The Sonalert will sound again. Continue moving until it stops. Mark this position on the tie. Measure and record the distance between the marks (Round up to next foot). This value will be entered into Acquisition.Reader1.Ant0PassiveLobe.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&amp;lt;div&amp;gt;&lt;br /&gt;
{| style=&amp;quot;border-collapse: collapse; width: 60%; margin-left: auto; margin-right: auto;&amp;quot; border=&amp;quot;1px&amp;quot; cellpadding=&amp;quot;4px&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width: 7.4896%; background-color: rgb(53, 152, 219);&amp;quot; | &amp;lt;p&amp;gt;&#039;&#039;&#039;NOTE:&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 91.2621%;&amp;quot; | &amp;lt;p&amp;gt;The extra data coming from the MPRX may cause the RFON command to exit. If you lose the tone, check your laptop and re-enter the RFON command if necessary.&amp;lt;/p&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
#Measure the horizontal read window for antenna 1. &amp;lt;p style=&amp;quot;margin-left: 75px;&amp;quot; &amp;gt;Face antenna 1 and repeat measurement as above. Its value will be recorded in Acquisition.Reader1.Ant1PassiveLobe. Press &#039;&#039;&#039;&amp;amp;lt;ENTER&amp;amp;gt;&#039;&#039;&#039; to cancel the RFON command.&amp;lt;/p&amp;gt;&lt;br /&gt;
#Enter read lobe parameters in the parameter editor if changed from original values.&lt;br /&gt;
#Perform a fast reboot with &#039;&#039;&#039;R,F&#039;&#039;&#039; command and confirm so changes will take effect.&lt;br /&gt;
#Set the Sonalert selector switch to the center position (off).&lt;br /&gt;
&lt;br /&gt;
= Housekeeping =&lt;br /&gt;
&amp;lt;p&amp;gt;Optional (5.2 AEI Software only)-Use the NOTE command to add a login notice regarding the MPRX installation.&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 50px;&amp;quot; &amp;gt;e.g., &amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp; &#039;&#039;&#039;NOTE A MPRX installed, 04/15/2021 09:30&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;p style=&amp;quot;margin-left: 100px;&amp;quot; &amp;gt;&#039;&#039;&#039;NOTE L&#039;&#039;&#039;&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Perform the parameter backup (&#039;&#039;&#039;BP&#039;&#039;&#039;)&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Recommended: Update the mirror image (&#039;&#039;&#039;SHELL IBACKUP &#039;&#039;&#039;and Full reboot)&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;Correct any site deficiencies.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;{{Comet Service Contact}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Procedures]]&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Privacy_Policy&amp;diff=2431</id>
		<title>Privacy Policy</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Privacy_Policy&amp;diff=2431"/>
		<updated>2026-04-06T16:17:55Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;h1 class=&amp;quot;mwt-heading&amp;quot; &amp;gt;Introduction&amp;lt;/h1&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;This Privacy Notice for Comet Electronics LLC (&#039;&#039;&#039;&amp;quot;we&amp;quot;&#039;&#039;&#039;, &#039;&#039;&#039;&amp;quot;us&amp;quot;&#039;&#039;&#039;, or &#039;&#039;&#039;&amp;quot;our&amp;quot;&#039;&#039;&#039;), describes how and why we might access, collect, store, use, and/or share (&#039;&#039;&#039;&amp;quot;process&amp;quot;&#039;&#039;&#039;) your personal information when you use our services (&#039;&#039;&#039;&amp;quot;Services&amp;quot;&#039;&#039;&#039;), including when you:&amp;lt;/p&amp;gt;&lt;br /&gt;
*Visit our website at railrsm.com, or any website of ours that links to this Privacy Notice&lt;br /&gt;
*Download and use our mobile application (CINQ app), or any other application of ours that links to this Privacy Notice&lt;br /&gt;
*Engage with us in other related ways, including any sales, marketing, or events&amp;lt;p&amp;gt;&#039;&#039;&#039;Questions or concerns?&#039;&#039;&#039; Reading this Privacy Notice will help you understand your privacy rights and choices. We are responsible for making decisions about how your personal information is processed. It you do not agree with our policies and practices, please do not use our Services. If you still have any questions or concerns, please contact us at support@cometind.com.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Summary of Key Points =&lt;br /&gt;
&amp;lt;p&amp;gt;This summary provides key points from our Privacy Notice, but you can find out more details about any of these topics by using our table of contents to find the section you are looking for.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;What personal information do we process?&#039;&#039;&#039; When you visit, use, or navigate our Services, we may process personal information depending on now you interact with us and the Services, the choices you make, and the products and features you use. Learn more about personal information you disclose to us.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Do we process any sensitive personal information?&#039;&#039;&#039; Some of the information may be considered &amp;quot;special&amp;quot; or &amp;quot;sensitive&amp;quot; in certain jurisdictions, for example your racial or ethnic origins, sexual orientation, and religious beliefs. We do not process sensitive personal information.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Do we collect any information from third parties?&#039;&#039;&#039; We do not collect any information from third parties.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;How do we process your information? &#039;&#039;&#039;We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent. We process your information only when we have a valid legal reason to do so. Learn more about how we process your information.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In what situations and with which parties do we share personal information?&#039;&#039;&#039; We may share information in specific situations and with specific third parties. Learn more about when and with whom we share your personal information.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;How do we keep your information safe?&#039;&#039;&#039; We have adequate organizational and technical processes and procedures in place to protect your personal information.&amp;amp;nbsp;However, no electronic transmission over the internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other unauthorized third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. Learn more about how we keep your information safe.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;What are your rights?&#039;&#039;&#039; Depending on where you are located geographically, the applicable privacy law may mean you have certain rights regarding your personal information. Learn more about your privacy rights.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;How do you exercise your rights? &#039;&#039;&#039;The easiest way to exercise your rights is by visiting support@cometind.com, or by contacting us. We will consider and act upon any request in accordance with applicable data protection laws.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Want to learn more about what we do with any information we collect? Review the Privacy Notice in full.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= What Information Do We Collect  =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We collect persona/ information that you provide to us.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;We collect personal information that you voluntarily provide to us when you register on the Services, express an interest in obtaining information about us or our products and Services, when you participate in activities on the Services, or othewise when you contact us.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Personal Information Provided by You&#039;&#039;&#039;. The personal information that we collect depends on the context of your interactions with us and the Services, the choices you make, and the products and features you use. The personal information we collect may include the following:&amp;lt;/p&amp;gt;&lt;br /&gt;
*names&lt;br /&gt;
*phone numbers&lt;br /&gt;
*email addresses&lt;br /&gt;
*usernames&lt;br /&gt;
*passwords&lt;br /&gt;
*contact preferences&lt;br /&gt;
&#039;&#039;&#039;Sensitive Information.&#039;&#039;&#039; We do not process sensitive information.&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Application Data.&#039;&#039;&#039; If you use our application(s), we also may collect the following information if you choose to provide us with access or permission:&amp;lt;/p&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;Push Notifications&#039;&#039;&#039;. We may request to send you push notifications regarding your account or certain features of the application(s). If you wish to opt out from receiving these types of communications, you may turn them off in your device&#039;s settings.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;p&amp;gt;This information is primarily needed to maintain the security and operation of our application(s), for troubleshooting, and tor our internal analytics and reporting purposes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;All personal information that you provide to us must be true, complete, and accurate, and you must notify us of any changes to such personal information.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Google API&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Our use of information received from Google APIs will adhere to [https://developers.google.com/terms/api-services-user-data-policy Google API Services user Data Policy], including the [https://developers.google.com/terms/api-services-user-data-policy#limited-use Limited use requirements.]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How Do We Process Your Information? =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We process your personal information for a variety of reasons, depending on how you interact with our Services, including:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;To facilitate account creation and authentication and otherwise manage user accounts.&#039;&#039;&#039; We may process your information so you can create and log in to your account, as well as keep your account in working order.&lt;br /&gt;
*&#039;&#039;&#039;To deliver and facilitate delivery of services to the user.&#039;&#039;&#039; We may process your information to provide you with the requested service.&lt;br /&gt;
*&#039;&#039;&#039;To send administrative information to you.&#039;&#039;&#039; We may process your information to send you details about our products and services, changes to our terms and&lt;br /&gt;
&amp;lt;li&amp;gt;policies, and other similar information.&amp;lt;/li&amp;gt;&lt;br /&gt;
*&#039;&#039;&#039;To request feedback.&#039;&#039;&#039; We may process your information when necessary to request feedback and to contact you about your use of our Services.&lt;br /&gt;
*&#039;&#039;&#039;To evaluate and improve our Services, products, marketing, and your experience.&#039;&#039;&#039; We may process your information when we believe it is necessary to identify usage trends, determine the effectiveness of our promotional campaigns, and to evaluate and improve our Services, products, marketing, and your experience.&lt;br /&gt;
*&#039;&#039;&#039;To identify usage trends.&#039;&#039;&#039; We may process information about how you use our Services to better understand how tney are being used so we can improve them.&lt;br /&gt;
&lt;br /&gt;
= What Legal Basis Do We Rely on to Process Your Information =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We only process your persona/ information when we believe it is necessary and we have a valid legal reason (i.e., legal basis) to do so under applicable law,&amp;amp;nbsp;like with your consent, to comply with laws or to provide you with services to enter into or fulfill our contractual obligations, to protect your rights, or to fulfill our legitimate business interests.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;If you are located in Canada, this section applies to you.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;We may process your information if you have given us specific permission (i.e., express consent) to use your personal information for a specific purpose, or in situations where your permission can be inferred (i.e., implied consent). You can withdraw your consent at any time.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;In some exceptional cases, we may be legally permitted under applicable law to process your information without your consent, including, for example:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*If collection is clearly in the interests of an individual and consent cannot be obtained in a timely way.&lt;br /&gt;
*For investigations and fraud detection and prevention.&lt;br /&gt;
*For business transactions provided certain conditions are met.&lt;br /&gt;
*If it is contained in a witness statement and the collection is necessary to assess, process, or settle an insurance claim.&lt;br /&gt;
*For identifying injured, ill, or deceased persons and communicating with next of kin.&lt;br /&gt;
*It we have reasonable grounds to believe an individual has been, is, or may be victim of financial abuse.&lt;br /&gt;
*If it is reasonable to expect collection and use with consent would compromise the availability or the accuracy of the information and the collection is reasonable. For purposes related to investigating a breach of an agreement or a contravention of the laws of Canada or a province&lt;br /&gt;
*If disclosure is required to comply with a subpoena, warrant, court order, or rules of the court relating to the production of records&lt;br /&gt;
*If it was produced by an individual in the course of their employment, business, or profession and the collection is consistent with the purposes for which the information was produced.&lt;br /&gt;
*It the collection is solely for journalistic, artistic, or literary purposes.&lt;br /&gt;
*If the information is publicly available and is specified by the regulations.&lt;br /&gt;
&lt;br /&gt;
= When and With Whom Do We Share Your Personal Information? =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We may share information in specific situations described in this section and/or with the following third parties.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We may need to share your personal information in the following situations:&amp;lt;/p&amp;gt;&lt;br /&gt;
:&#039;&#039;&#039;Business Transfers.&#039;&#039;&#039; We may share or transfer your information in connection with, or during negotiations of, any merger, sale of company assets, financing, or acquisition of all or a portion of our business to another company.&lt;br /&gt;
&lt;br /&gt;
= How Long Do We Keep Your Information? =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We keep your information for as long as necessary to fulfill the purposes outlined in this Privacy Notice unless otherwise required by law.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We will only keep your personal information for as long as it is necessary for the purposes set out in this Privacy Notice, unless a longer retention period is required or permitted by law (such as tax, accounting, or other legal requirements). No purpose in this notice will require us keeping your personal information for longer than forty eight (48) months past the termination of the users account.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;When we have no ongoing legitimate business need to process your personal information, we will either delete or anonymize such information, or, it this is not possible (for example, because your personal information has been stored in backup archives), then we will securely store your personal information and isolate it from any further&amp;amp;nbsp;processing until deletion is possible.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How Do We Keep Your Information Safe? =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We aim to protect your personal information through a system of organizational and technical security measures.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We have implemented appropriate and reasonable technical and organizational security measures designed to protect the security of any personal information we process. However, despite our safeguards and efforts to secure your information, no electronic transmission over the Internet or information storage technology can be&amp;amp;nbsp;guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other unauthorized third parties will not be able to defeat our security and improperly collect, access, steal, or modify your information. Although we will do our best to protect your personal information, transmission of personal information to and from our Services is at your own risk. You should only access the Services within a secure environment.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Do We Collect Information From Minors =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; We do not knowingly collect data from or market to children under f 8 years of age.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We do not knowingly collect, solicit data from, or market to children under 18 years of age, nor do we knowingly sell such personal information. By using the Services, you represent that you are at least 18 or that you are the parent or guardian of such a minor and consent to such minor dependent&#039;s use of the Services. If we learn&amp;amp;nbsp;that personal information from users less than 18 years of age has been collected, we will deactivate the account and take reasonable measures to promptly delete such data from our records. If you become aware of any data we may have collected from children under age 18, please contact us at support@cometind.com.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= What Are Your Privacy Rights? =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; Depending on your state of residence in the US or in some regions, such as Canada, you have rights that allow you greater access to and control over your personal information. You may review, change, or terminate your account at any time, depending on your country, province, or state of residence.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;In some regions (like Canada), you have certain rights under applicable data protection laws. These may include the right (i) to request access and obtain a copy of your personal information, (ii) to request rectification or erasure; (iii) to restrict the processing of your personal information; (iv) if applicable, to data portability; and (v) not to be subject to automated decision-making. In certain circumstances, you may also have the right to Object to the processing of your personal information. You can make such a request by contacting us by using the contact details provided in the section &amp;quot;How Can You Contact Us About This Notice&amp;quot; below.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We will consider and act upon any request in accordance with applicable data protection laws.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Withdrawing your consent:&#039;&#039;&#039; If we are relying on your consent to process your personal information, which may be express and/or implied consent depending on the&amp;amp;nbsp;applicable law, you have the right to withdraw your consent at any time. You can withdraw your consent at any time by contacting us by using the contact details&amp;amp;nbsp;provided in the section &amp;quot;How Can You Contact Us About This Notice&amp;quot; below.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;However, please note that this will not affect the lawfulness of the processing before its withdrawal nor, when applicable law allows, will it affect the processing of your personal information conducted in reliance on lawful processing grounds other than consent.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Account Information&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;If you would at any time like to review or change the information in your account or terminate your account, you can:&amp;lt;/p&amp;gt;&lt;br /&gt;
*Log in to your account settings and update your user account.&lt;br /&gt;
Upon your request to terminate your account, we will deactivate or delete your account and information from our active databases. However, we may retain some information in our files to prevent fraud, troubleshoot problems, assist with any investigations, enforce our legal terms and/or comply with applicable legal requirements.&lt;br /&gt;
&amp;lt;p&amp;gt;It you have questions or comments about your privacy rights, you may email us at support@cometind.com.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Controls for Do Not Track Feature =&lt;br /&gt;
&amp;lt;p&amp;gt;Most web browsers and some mobile operating systems and mobile applications include a Do-Not-Track (&amp;quot;DNT&amp;quot;) feature or setting you can activate to signal your privacy preference not to have data about your online browsing activities monitored and collected. At this stage, no uniform technology standard for recognizing and implementing DNT signals has been finalized. As such, we do not currently respond to DNT browser signals or any other mechanism that automatically communicates your choice not to be tracked online. If a standard for online tracking is adopted that we must follow in the future, we will inform you about that practice in a revised version of this Privacy Notice.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;California law requires us to let you know how we respond to web browser DNT signals. Because there currently is not an industry or legal standard for recognizing or honoring DNT signals, we do not respond to them at this time.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Do United States Residents Have Specific Privacy Rights? =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short:&#039;&#039;&#039; If you are a resident of California, Colorado, Connecticut, Delaware, Florida, Indiana, Iowa, Kentucky, Montana, New Hampshire, New Jersey Oregon, Tennessee, Texas, Utah, or Virginia, you may nave the right to request access to and receive details about the personal information we maintain about you and how we have processed it, correct inaccuracies, get a copy of, or delete your personal information. You may also have the right to withdraw your consent to our processing of your personal information. These rights may be limited in some circumstances by applicable law. More information is provided below.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Categories of Personal Information We Collect&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;We have collected the following categories of personal information in the past twelve (12) months:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;border-collapse: collapse; width: 100%; height: 532px;&amp;quot; border=&amp;quot;2&amp;quot;&lt;br /&gt;
|- style=&amp;quot;height: 23px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 23px;&amp;quot; | &#039;&#039;&#039;Category&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 23px;&amp;quot; | Examples&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 23px;&amp;quot; | Collected&lt;br /&gt;
|- style=&amp;quot;height: 28px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 28px;&amp;quot; |&lt;br /&gt;
Identifiers&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 28px;&amp;quot; | &amp;lt;p&amp;gt;Contact details, such as real name, alias, postal address, telephone or mobile contact number, unique personal identifier, online identifier, Internet Protocol address, email address, and account name&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 28px;&amp;quot; | Yes&lt;br /&gt;
|- style=&amp;quot;height: 51px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 51px;&amp;quot; |&lt;br /&gt;
Personal information as defined in the California Customer Records statute&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 51px;&amp;quot; | &amp;lt;p&amp;gt;Name, contact information, education, employment, employment history, and financial information&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 51px;&amp;quot; | Yes&lt;br /&gt;
|- style=&amp;quot;height: 51px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 51px;&amp;quot; |&lt;br /&gt;
Protected classification characteristics under state or federal law&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 51px;&amp;quot; | &amp;lt;p&amp;gt;Gender, age, date of birth, race and ethnicity, national origin, marital status, and other demographic data&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 51px;&amp;quot; | &amp;amp;nbsp;No&lt;br /&gt;
|- style=&amp;quot;height: 57px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 57px;&amp;quot; |&lt;br /&gt;
Commercial information&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 57px;&amp;quot; | Transaction information, purchase history, financial details, and payment information&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 57px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 28px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 28px;&amp;quot; |&lt;br /&gt;
Biometric information&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 28px;&amp;quot; | Fingerprints and voiceprints&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 28px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 28px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 28px;&amp;quot; |&lt;br /&gt;
Internet or other similar network activity&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 28px;&amp;quot; | &amp;lt;p&amp;gt;Browsing history, search history, online behavior, interest data, and interactions with our and other websites, applications, systems, and advertisements&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 28px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 28px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 28px;&amp;quot; |&lt;br /&gt;
Geolocation data&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 28px;&amp;quot; | Device Location&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 28px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 51px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 51px;&amp;quot; |&lt;br /&gt;
Audio, electronic, sensory, or similar information&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 51px;&amp;quot; | &amp;lt;p&amp;gt;Images and audio, video or call recordings created in connection with our business activities&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 51px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 51px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 51px;&amp;quot; |&lt;br /&gt;
Professional or employment-related information&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 51px;&amp;quot; | &amp;lt;p&amp;gt;Business contact details in order to provide you our Services at a business level or job title, work history, and professional qualifications if you apply for a job with us&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 51px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 28px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 28px;&amp;quot; |&lt;br /&gt;
Education Information&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 28px;&amp;quot; | Student records and directory information&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 28px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 51px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 51px;&amp;quot; |&lt;br /&gt;
Inferences drawn from collected personal information&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 51px;&amp;quot; | &amp;lt;p&amp;gt;Inferences drawn from any of the collected personal information listed above to create a profile or summary about, for example, an individual&#039;s preferences and characteristics&amp;lt;/p&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 51px;&amp;quot; | No&lt;br /&gt;
|- style=&amp;quot;height: 57px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33.3333%; height: 57px;&amp;quot; |&lt;br /&gt;
Inferences drawn from collected personal&lt;br /&gt;
&lt;br /&gt;
information&lt;br /&gt;
| style=&amp;quot;width: 53.8779%; height: 57px;&amp;quot; |&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
| style=&amp;quot;width: 12.7887%; height: 57px;&amp;quot; | No&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We may also collect other personal information outside of these categories through instances where you interact with us in person, online, or by phone or mail in the context of:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Receiving help through our customer support channels;&lt;br /&gt;
*Participation in customer surveys or contests; and&lt;br /&gt;
*Facilitation in the delivery of our Services and to respond to your inquiries.&lt;br /&gt;
*&lt;br /&gt;
&amp;lt;p&amp;gt;We will use and retain the collected personal information as needed to provide the Services or for:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Category A -As long as the user has an account with us&lt;br /&gt;
*Category B -As long as the user has an account with us&lt;br /&gt;
*Category H -As long as the user has an account with us&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Sources of Personal Information&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Learn more about the sources of personal information we collect in &#039;What Information Do We Collect&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;How We Use and Share Personal Information&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Learn about how we use your personal information in the section, &amp;quot;How Do We Process Your Information&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Will your information be shared with anyone else?&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;We may disclose your personal information with our service providers pursuant to a written contract between us and each service provider. Learn more about how we disclose personal information to in the section, &amp;quot;When and With Whom Do We Share Your Personal Information&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We may use your personal information for our own business purposes, such as tor undertaking internal research for technological development and demonstration. This is not considered to be &amp;quot;selling&amp;quot; of your personal information.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;We have not disclosed, sold, or shared any personal information to third parties for a business or commercial purpose in the preceding twelve (12) months. We will not sell or share personal information in the future belonging to website visitors, users, and other consumers.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Your Rights&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You have rights under certain US state data protection laws. However, these rights are not absolute, and in certain cases, we may decline your request as permitted by law. These rights include:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to know&#039;&#039;&#039; whether or not we are processing your personal data&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to access&#039;&#039;&#039; your personal data&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to correct&#039;&#039;&#039; inaccuracies in your personal data&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to request&#039;&#039;&#039; the deletion of your personal data&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to obtain a copy&#039;&#039;&#039; of tne personal data you previously shared with us&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to non-discrimination&#039;&#039;&#039; for exercising your rights&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&#039;&#039;&#039;Right to opt&#039;&#039;&#039; out of the processing of your personal data if it is used for targeted advertising (or sharing as defined under Califomja&#039;S privacy law), the sale of personal data, or profiling in furtherance of decisions that produce legal or similarly significant effects (&amp;quot;profiling&amp;quot;)&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Depending upon the state where you live, you may also have the following rights:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Right to obtain a list of the categories of third parties to which we have disclosed personal data (as permitted by applicable law, including California&#039;s and Delaware&#039;s privacy law)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Right to obtain a list of specific third parties to which we have disclosed personal data (as permitted by applicable law, including Oregon&#039;s privacy law)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Right to limit use and disclosure of sensitive personal data (as permitted by applicable law, including California&#039;s privacy law)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;Right to opt out of the collection of sensitive data and personal data collected through the operation of a voice or facial recognition feature (as permitted by applicable law, including Florida&#039;s privacy law)&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;How to Exercise Your Rights&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;To exercise these rights, you can contact us by emailing us at support@cometind.com, or by referring to the contact details at the bottom of this document.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Under certain US state data protection laws, you can designate an authorized agent to make a request on your behalf. We may deny a request from an authorized agent that does not submit proof that they have been validly authorized to act on your behalf in accordance with applicable laws.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Request Verification&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Upon receiving your request, we will need to verify your identity to determine you are the same person about whom we have the information in our system. We will only use personal information provided in your request to verify your identity or authority to make the request. However, if we cannot verify your identity from the information already maintained by us, we may request that you provide additional information for the purposes of verifying your identity and for security or fraud-prevention purposes.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;If you submit the request through an authorized agent, we may need to collect additional information to verify your identity before processing your request and the agent will need to provide a written and signed permission from you to submit such request on your behalf.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;Appeals&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Under certain US state data protection laws, if we decline to take action regarding your request, you may appeal our decision by emailing us at support@cometind.com. We will inform you in writing of any action taken or not taken in response to the appeal, including a written explanation of the reasons for the decisions. If your appeal is denied, you may submit a complaint to your state attorney general.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;California &amp;quot;Shine The Light&amp;quot; Law&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;California Civil Code Section 1798.83, also known as the &amp;quot;Shine The Light&amp;quot; law, permits our users who are California residents to request and obtain from us, once a year and free of charge, information about categories of personal information (if any) we disclosed to third parties for direct marketing purposes and the names and&amp;amp;nbsp;addresses of all third parties with which we shared personal information in the immediately preceding calendar year. If you are a California resident and would like to make such a request, please submit your request in writing to us by using the contact details provided in the section &amp;quot;How Can You Contact Us about This Notice&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Do We Make Updates to This Notice =&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;In Short: &#039;&#039;&#039;Yes, we will update this notice as necessary to stay compliant with relevant laws.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;We may update this Privacy Notice from time to time. The updated version will be indicated by an updated &amp;quot;Revised&amp;quot; date at the top of this Privacy Notice. If we make material changes to this Privacy Notice, we may notify you either by prominently posting a notice of such changes or by directly sending you a notification. We encourage you to review this Privacy Notice frequently to be informed of how we are protecting your information.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How Can You Contact Us About This Notice =&lt;br /&gt;
&amp;lt;p&amp;gt;If you have questions or comments about this notice, you may email us at support@cometind.com or contact us by post at:&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Comet Electronics LLC&amp;lt;br&amp;gt;2301 Burlington&amp;lt;br&amp;gt;North Kansas City, MO 64116&amp;lt;br&amp;gt;United States&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How Can You Review, Update or Delete the Data We Collect From You =&lt;br /&gt;
&amp;lt;p&amp;gt;Based on the applicable laws of your country or state of residence in the US, you may have the right to request access to the personal information we collect from you, details about how we have processed it, correct inaccuracies, or delete your personal information. You may also have the right to withdraw your consent to our processing of your personal information. These rights may be limited in some circumstances by applicable law. To request to review update, or delete your personal&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;information, please email support@cometind.com.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Transferring_Data_From_LX-800_to_T10&amp;diff=2430</id>
		<title>Transferring Data From LX-800 to T10</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Transferring_Data_From_LX-800_to_T10&amp;diff=2430"/>
		<updated>2026-04-06T16:17:16Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As Comet transitions to the T10, we are developing tools to help our customers with the transfer of data and files from the LX-800 to the T10. This procedure is supposed to make that process smooth and painless. The data transfer capabilities are available for any CF card previously used with a Comet AEI site. Alternatively, another storage device can be used if properly set up. Information transferred includes, but is not limited to: parameters, configuration settings, FTP connection data and CINQ connection data.&lt;br /&gt;
= Transferring from an LX-800 CF Card =&lt;br /&gt;
&#039;&#039;&#039;Parts:&#039;&#039;&#039;&amp;lt;br&amp;gt;• CF card with site data to be transferred&amp;lt;br&amp;gt;• CF card reader with male USB connection&lt;br /&gt;
# Insert the CF card into the card reader (pictured below).[[image:img1736978116179.png|465px|center|frameless]]&lt;br /&gt;
# Plug the USB from the card reader to the T10 (pictured below). There are USB ports on the front and back of the board.[[image:img1736914413002.png|400px|center|frameless]]&lt;br /&gt;
# Boot up the APU normally. The T10 will automatically copy files from the CF card. This process can take up to 2 minutes after rebooting.&lt;br /&gt;
The unit will reboot once the process is finished. Review the APU&#039;s files to ensure everything has been copied over. The CF card reader can be safely removed once the files have been copied.&amp;lt;br&amp;gt;&lt;br /&gt;
= Transferring from AEI Directory Backup =&lt;br /&gt;
&#039;&#039;&#039;Parts:&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
• Backup of the site&#039;s AEI directory&amp;lt;br&amp;gt;• Storage device with male USB connection (e.g. USB Flash Drive)&lt;br /&gt;
#Transfer the site&#039;s AEI directory to the root of the storage device.&lt;br /&gt;
##For example, if the drive the device is stored on is called &amp;quot;F:&amp;quot;, the file path for the transferred directory would be &amp;quot;F:\aei&amp;quot;&lt;br /&gt;
#Plug the storage device in via a USB port available on the T10. There are USB ports on the front and back of the board.&amp;lt;br&amp;gt;[[image:img1736914413002.png|400px|center|frameless]]&lt;br /&gt;
#Boot the APU normally. The T10 will automatically copy files from the storage device. This process can take up to 2 minutes after rebooting.&lt;br /&gt;
The unit will reboot once the process is finished. Review the APU&#039;s files to ensure everything has been copied over. The storage device can be safely removed once the files have been copied.&lt;br /&gt;
&lt;br /&gt;
= Other Transfer Options =&lt;br /&gt;
If the above procedures are not applicable, configuration of the site must be done by hand. This can be done using the &amp;amp;lt;ep&amp;amp;gt; command to edit the parameters. The original parameters may be referenced, if they are available.&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=Test_Reporting_on_the_Test_Bench&amp;diff=2429</id>
		<title>Test Reporting on the Test Bench</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=Test_Reporting_on_the_Test_Bench&amp;diff=2429"/>
		<updated>2026-04-06T16:15:55Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When using a LX-800, please make sure the APU-102 software has been updated to V5.2.1.1. or greater, as it comes with CINQ Connect. CINQ Connect does not work independently. Host reporting and report enabling need to be enabled initially, along with inserting the ACC and BAT files for site reporting. The Site Information needs to be configured to match the site settings on RSM, as well.&lt;br /&gt;
&lt;br /&gt;
Current settings for the RV50 show report forwarding to have a IP of 166.165.79.198 and the port set to 23. These are the current config settings in the RV50 and are subject to change.&lt;br /&gt;
&lt;br /&gt;
Login to the APU under the supervisory menu. Using the &amp;amp;lt;ep&amp;amp;gt; command to edit parameters, navigate to to Ports(8), then Ethernet. The parameters need to match what is shown below.[[image:img1737001437262.png|327px|center|frameless]]&lt;br /&gt;
&lt;br /&gt;
Once set, perform a full reboot using the &amp;amp;lt;r&amp;amp;gt; command. Simulate a train using &amp;amp;lt;st&amp;amp;gt; and, once completed, enter &amp;amp;lt;hr,now&amp;amp;gt; to force reports to be sent immediately. Check the train directory to make sure they’re being reported. After confirming that they have been reported, check RSM for reports to make sure it&#039;s going through.&amp;amp;nbsp;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2428</id>
		<title>CINQ Edge User Quick Start Guide</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2428"/>
		<updated>2026-04-06T16:00:22Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Signing On to RSM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-size: 18pt;&amp;quot;&amp;gt;Getting Started on the CINQ Platform&amp;lt;/span&amp;gt;&#039;&#039;&#039; =&lt;br /&gt;
&amp;lt;p&amp;gt;As part of the installation and preparation for a CINQ Edge site, COMET Techs will name the site, connect it to CINQ and create a Company Admin. (This information will be obtained from the Company contact)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The Company Admin will set up users within the Company and define their Roles (usually Maintainer), which determines what access a user has in CINQ. Your email address, User Name and Password will be entered by the Admin.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing On to CINQ ==&lt;br /&gt;
&amp;lt;p&amp;gt;Navigate to [https://insight.railrsm.com/ CINQ]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You will be prompted to sign in with your User Name and Password.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;After you enter your information, a screen will tell you that a One-Time code has been emailed to you. Check your email for this code and enter it in the boxes on the screen. (This is Multifactor Authorization and increases the security of your account.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your Dashboard ==&lt;br /&gt;
&amp;lt;p&amp;gt;After signing in, you will land on the Dashboard for your Account. Icons for AEI sites registered to your Company will appear here. This includes full-scale RailNet sites, which will be Green, Yellow, Orange or Red. &amp;lt;br&amp;gt;CINQ Edge sites are marked by grey icons.&amp;amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[file:CEwidedashboard.png|500px|center|thumb|CINQ Edge sites are marked with a grey icon. Your company may not have any RailNet sites registered, and no colored icons would appear.]]&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
If you click on the grey icon, a message with the name of the site will pop up. Click &amp;quot;See Details&amp;quot; on that popup. This will take you to the main page for the site where you can access Equipment Moves, Details about the site and Messages that were sent to the cloud by CINQ Edge.&lt;br /&gt;
[[File:Click_on_Icon_bigger.JPG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;You can also access your site by selecting the “CINQ Edge” button on the lefthand navigation menu.&amp;lt;br&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Screenshot 2026-04-06 105441.png|center]]&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Railroad Equipment ==&lt;br /&gt;
The second button on the lefthand navigation is labeled “Railroad Equipment. Select this button to see a List of all movements or a list of Railroad Equipment that passed your CINQ Edge site. (The Movements list can be downloaded in Excel format.)&amp;amp;nbsp;&lt;br /&gt;
[[File:Screenshot 2026-04-06 105644.png|center|1359x1359px]]&lt;br /&gt;
[[File:Screenshot 2026-04-06 105757.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Track Zones ==&lt;br /&gt;
&amp;lt;p&amp;gt;If your Admin has set up Track Zones for your site(s), you can click on Track Zone to view a list of them. Click on the blue Zone Name to see a list of Track Zone Movements or Track Zone Inventory.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-04-06 105853.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;When you have finished using the CINQ platform, you may Log Out at the bottom of the lefthand navigation menu.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2427</id>
		<title>CINQ Edge User Quick Start Guide</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2427"/>
		<updated>2026-04-06T15:59:45Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-size: 18pt;&amp;quot;&amp;gt;Getting Started on the CINQ Platform&amp;lt;/span&amp;gt;&#039;&#039;&#039; =&lt;br /&gt;
&amp;lt;p&amp;gt;As part of the installation and preparation for a CINQ Edge site, COMET Techs will name the site, connect it to CINQ and create a Company Admin. (This information will be obtained from the Company contact)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The Company Admin will set up users within the Company and define their Roles (usually Maintainer), which determines what access a user has in CINQ. Your email address, User Name and Password will be entered by the Admin.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing On to RSM ==&lt;br /&gt;
&amp;lt;p&amp;gt;Navigate to [https://insight.railrsm.com/ CINQ]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You will be prompted to sign in with your User Name and Password.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;After you enter your information, a screen will tell you that a One-Time code has been emailed to you. Check your email for this code and enter it in the boxes on the screen. (This is Multifactor Authorization and increases the security of your account.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your Dashboard ==&lt;br /&gt;
&amp;lt;p&amp;gt;After signing in, you will land on the Dashboard for your Account. Icons for AEI sites registered to your Company will appear here. This includes full-scale RailNet sites, which will be Green, Yellow, Orange or Red. &amp;lt;br&amp;gt;CINQ Edge sites are marked by grey icons.&amp;amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[file:CEwidedashboard.png|500px|center|thumb|CINQ Edge sites are marked with a grey icon. Your company may not have any RailNet sites registered, and no colored icons would appear.]]&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
If you click on the grey icon, a message with the name of the site will pop up. Click &amp;quot;See Details&amp;quot; on that popup. This will take you to the main page for the site where you can access Equipment Moves, Details about the site and Messages that were sent to the cloud by CINQ Edge.&lt;br /&gt;
[[File:Click_on_Icon_bigger.JPG|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;You can also access your site by selecting the “CINQ Edge” button on the lefthand navigation menu.&amp;lt;br&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Screenshot 2026-04-06 105441.png|center]]&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Railroad Equipment ==&lt;br /&gt;
The second button on the lefthand navigation is labeled “Railroad Equipment. Select this button to see a List of all movements or a list of Railroad Equipment that passed your CINQ Edge site. (The Movements list can be downloaded in Excel format.)&amp;amp;nbsp;&lt;br /&gt;
[[File:Screenshot 2026-04-06 105644.png|center|1359x1359px]]&lt;br /&gt;
[[File:Screenshot 2026-04-06 105757.png|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Track Zones ==&lt;br /&gt;
&amp;lt;p&amp;gt;If your Admin has set up Track Zones for your site(s), you can click on Track Zone to view a list of them. Click on the blue Zone Name to see a list of Track Zone Movements or Track Zone Inventory.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Screenshot 2026-04-06 105853.png|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;When you have finished using the CINQ platform, you may Log Out at the bottom of the lefthand navigation menu.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105853.png&amp;diff=2426</id>
		<title>File:Screenshot 2026-04-06 105853.png</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105853.png&amp;diff=2426"/>
		<updated>2026-04-06T15:59:20Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Track Zone Screen Shot&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105757.png&amp;diff=2425</id>
		<title>File:Screenshot 2026-04-06 105757.png</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105757.png&amp;diff=2425"/>
		<updated>2026-04-06T15:58:29Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RRE Inventory&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105644.png&amp;diff=2424</id>
		<title>File:Screenshot 2026-04-06 105644.png</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105644.png&amp;diff=2424"/>
		<updated>2026-04-06T15:57:20Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RRE Movements&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105441.png&amp;diff=2423</id>
		<title>File:Screenshot 2026-04-06 105441.png</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:Screenshot_2026-04-06_105441.png&amp;diff=2423"/>
		<updated>2026-04-06T15:55:43Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;menu for CE&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2422</id>
		<title>CINQ Edge User Quick Start Guide</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2422"/>
		<updated>2026-04-06T15:54:02Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Your Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-size: 18pt;&amp;quot;&amp;gt;Getting Started on the CINQ Platform&amp;lt;/span&amp;gt;&#039;&#039;&#039; =&lt;br /&gt;
&amp;lt;p&amp;gt;As part of the installation and preparation for a CINQ Edge site, COMET Techs will name the site, connect it to CINQ and create a Company Admin. (This information will be obtained from the Company contact)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The Company Admin will set up users within the Company and define their Roles (usually Maintainer), which determines what access a user has in CINQ. Your email address, User Name and Password will be entered by the Admin.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing On to RSM ==&lt;br /&gt;
&amp;lt;p&amp;gt;Navigate to [https://insight.railrsm.com/ CINQ]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You will be prompted to sign in with your User Name and Password.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;After you enter your information, a screen will tell you that a One-Time code has been emailed to you. Check your email for this code and enter it in the boxes on the screen. (This is Multifactor Authorization and increases the security of your account.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your Dashboard ==&lt;br /&gt;
&amp;lt;p&amp;gt;After signing in, you will land on the Dashboard for your Account. Icons for AEI sites registered to your Company will appear here. This includes full-scale RailNet sites, which will be Green, Yellow, Orange or Red. &amp;lt;br&amp;gt;CINQ Edge sites are marked by grey icons.&amp;amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[file:CEwidedashboard.png|500px|center|thumb|CINQ Edge sites are marked with a grey icon. Your company may not have any RailNet sites registered, and no colored icons would appear.]]&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
If you click on the grey icon, a message with the name of the site will pop up. Click &amp;quot;See Details&amp;quot; on that popup. This will take you to the main page for the site where you can access Equipment Moves, Details about the site and Messages that were sent to the cloud by CINQ Edge.&lt;br /&gt;
&lt;br /&gt;
[[File:Click on Icon bigger.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;You can also access your site by selecting the “CINQ Edge” button on the lefthand navigation menu.&amp;lt;br&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SLink Devices.JPG]]&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Railroad Equipment ==&lt;br /&gt;
The second button on the lefthand navigation is labeled “Railroad Equipment. Select this button to see a List of all movements or a list of Railroad Equipment that passed your CINQ Edge site. (The Movements list can be downloaded in Excel format.)&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[File:Railroad Equipment.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[File:Railroad Equipment Movements.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Track Zones ==&lt;br /&gt;
&amp;lt;p&amp;gt;If your Admin has set up Track Zones for your site(s), you can click on Track Zone to view a list of them. Click on the blue Zone Name to see a list of Track Zone Movements or Track Zone Inventory.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Track Zone2.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;When you have finished using the CINQ platform, you may Log Out at the bottom of the lefthand navigation menu.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2421</id>
		<title>CINQ Edge User Quick Start Guide</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2421"/>
		<updated>2026-04-06T15:53:39Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Your Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-size: 18pt;&amp;quot;&amp;gt;Getting Started on the CINQ Platform&amp;lt;/span&amp;gt;&#039;&#039;&#039; =&lt;br /&gt;
&amp;lt;p&amp;gt;As part of the installation and preparation for a CINQ Edge site, COMET Techs will name the site, connect it to CINQ and create a Company Admin. (This information will be obtained from the Company contact)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The Company Admin will set up users within the Company and define their Roles (usually Maintainer), which determines what access a user has in CINQ. Your email address, User Name and Password will be entered by the Admin.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing On to RSM ==&lt;br /&gt;
&amp;lt;p&amp;gt;Navigate to [https://insight.railrsm.com/ CINQ]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You will be prompted to sign in with your User Name and Password.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;After you enter your information, a screen will tell you that a One-Time code has been emailed to you. Check your email for this code and enter it in the boxes on the screen. (This is Multifactor Authorization and increases the security of your account.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your Dashboard ==&lt;br /&gt;
&amp;lt;p&amp;gt;After signing in, you will land on the Dashboard for your Account. Icons for AEI sites registered to your Company will appear here. This includes full-scale RailNet sites, which will be Green, Yellow, Orange or Red. &amp;lt;br&amp;gt;CINQ Edge sites are marked by grey icons.&amp;amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[file:CEwidedashboard.png|500px|left|thumb|CINQ Edge sites are marked with a grey icon. Your company may not have any RailNet sites registered, and no colored icons would appear.]]&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
If you click on the grey icon, a message with the name of the site will pop up. Click &amp;quot;See Details&amp;quot; on that popup. This will take you to the main page for the site where you can access Equipment Moves, Details about the site and Messages that were sent to the cloud by CINQ Edge.&lt;br /&gt;
&lt;br /&gt;
[[File:Click on Icon bigger.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;You can also access your site by selecting the “CINQ Edge” button on the lefthand navigation menu.&amp;lt;br&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SLink Devices.JPG]]&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Railroad Equipment ==&lt;br /&gt;
The second button on the lefthand navigation is labeled “Railroad Equipment. Select this button to see a List of all movements or a list of Railroad Equipment that passed your CINQ Edge site. (The Movements list can be downloaded in Excel format.)&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[File:Railroad Equipment.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[File:Railroad Equipment Movements.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Track Zones ==&lt;br /&gt;
&amp;lt;p&amp;gt;If your Admin has set up Track Zones for your site(s), you can click on Track Zone to view a list of them. Click on the blue Zone Name to see a list of Track Zone Movements or Track Zone Inventory.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Track Zone2.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;When you have finished using the CINQ platform, you may Log Out at the bottom of the lefthand navigation menu.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=File:CEwidedashboard.png&amp;diff=2420</id>
		<title>File:CEwidedashboard.png</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=File:CEwidedashboard.png&amp;diff=2420"/>
		<updated>2026-04-06T15:53:17Z</updated>

		<summary type="html">&lt;p&gt;DGast: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
	<entry>
		<id>https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2419</id>
		<title>CINQ Edge User Quick Start Guide</title>
		<link rel="alternate" type="text/html" href="https://docdepot.railrsm.com/index.php?title=CINQ_Edge_User_Quick_Start_Guide&amp;diff=2419"/>
		<updated>2026-04-06T15:53:00Z</updated>

		<summary type="html">&lt;p&gt;DGast: /* Your Dashboard */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= &#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-size: 18pt;&amp;quot;&amp;gt;Getting Started on the CINQ Platform&amp;lt;/span&amp;gt;&#039;&#039;&#039; =&lt;br /&gt;
&amp;lt;p&amp;gt;As part of the installation and preparation for a CINQ Edge site, COMET Techs will name the site, connect it to CINQ and create a Company Admin. (This information will be obtained from the Company contact)&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;The Company Admin will set up users within the Company and define their Roles (usually Maintainer), which determines what access a user has in CINQ. Your email address, User Name and Password will be entered by the Admin.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Signing On to RSM ==&lt;br /&gt;
&amp;lt;p&amp;gt;Navigate to [https://insight.railrsm.com/ CINQ]&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;You will be prompted to sign in with your User Name and Password.&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;After you enter your information, a screen will tell you that a One-Time code has been emailed to you. Check your email for this code and enter it in the boxes on the screen. (This is Multifactor Authorization and increases the security of your account.)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Your Dashboard ==&lt;br /&gt;
&amp;lt;p&amp;gt;After signing in, you will land on the Dashboard for your Account. Icons for AEI sites registered to your Company will appear here. This includes full-scale RailNet sites, which will be Green, Yellow, Orange or Red. &amp;lt;br&amp;gt;CINQ Edge sites are marked by grey icons.&amp;amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[media:CEwidedashboard.png|500px|left|thumb|CINQ Edge sites are marked with a grey icon. Your company may not have any RailNet sites registered, and no colored icons would appear.]]&lt;br /&gt;
&lt;br /&gt;
== Details ==&lt;br /&gt;
If you click on the grey icon, a message with the name of the site will pop up. Click &amp;quot;See Details&amp;quot; on that popup. This will take you to the main page for the site where you can access Equipment Moves, Details about the site and Messages that were sent to the cloud by CINQ Edge.&lt;br /&gt;
&lt;br /&gt;
[[File:Click on Icon bigger.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;You can also access your site by selecting the “CINQ Edge” button on the lefthand navigation menu.&amp;lt;br&amp;gt;&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:SLink Devices.JPG]]&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Railroad Equipment ==&lt;br /&gt;
The second button on the lefthand navigation is labeled “Railroad Equipment. Select this button to see a List of all movements or a list of Railroad Equipment that passed your CINQ Edge site. (The Movements list can be downloaded in Excel format.)&amp;amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
[[File:Railroad Equipment.JPG]]&lt;br /&gt;
&lt;br /&gt;
[[File:Railroad Equipment Movements.JPG]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Track Zones ==&lt;br /&gt;
&amp;lt;p&amp;gt;If your Admin has set up Track Zones for your site(s), you can click on Track Zone to view a list of them. Click on the blue Zone Name to see a list of Track Zone Movements or Track Zone Inventory.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:Track Zone2.JPG]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&#039;When you have finished using the CINQ platform, you may Log Out at the bottom of the lefthand navigation menu.&#039;&#039;&#039;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>DGast</name></author>
	</entry>
</feed>