KTP Basic to ControlLogix Time Sync: Area Pointer & NTP Guide

David Krause13 min read
HMI / SCADASiemensTroubleshooting
Licensed PE Working through this on a live machine? A Maine-licensed engineer can take it from here — included with IMD hardware, by the hour for everything else. Book an engineer

Synchronizing SIMATIC KTP Basic HMI Time to Allen-Bradley ControlLogix

Time-stamped alarms and audit trails on a Siemens SIMATIC KTP Basic panel require a reliable time source. When that panel is talking to an Allen-Bradley ControlLogix controller (1756-L7x, 1756-L8x, 1756-L9x) over EtherNet/IP, the obvious shortcut — point the HMI at the PLC and call it done — usually fails. The PLC does not speak NTP, the HMI cannot execute scripts, and the date/time area pointer has data-type rules that the standard manuals gloss over.

This reference covers three working paths, the data layout the area pointer actually expects, the reasons the ControlLogix "Clock Master" cannot answer NTP requests, and the firmware cutoffs that determine which method is even available on a given Basic Panel. The content assumes TIA Portal V17 or later, WinCC Comfort/ES V17 or later, Studio 5000 Logix Designer V32 or later, and a 2nd-generation KTP Basic (KTP x00 Basic PN) shipped from 2014 onward.

Verification of source codes: The DTL byte layout, area pointer rules, and CIP Sync limitations referenced below are documented in the official Siemens TIA Portal V20 help (Configuring time synchronization for integrated connections) and the Siemens Knowledge Base entry 69864408 (Time Synchronization with an HMI Operator Panel and a SIMATIC PLC). The Rockwell side is documented in the ControlLogix 1756-L8 Add-on Profile "Enable Time Synchronization on the Controller" page (Enable Time Synchronization on the Controller).

1. Problem Definition

The reported symptoms are:

  • Alarm time stamps on the KTP Basic drift relative to the ControlLogix wall clock.
  • A user-defined tag array built to mirror the Siemens DTL data type does not update from the PLC.
  • Pointing the HMI's NTP client at the ControlLogix IP address returns "no response from time server".
  • After a power cycle, the HMI clock reverts to 00:00:00 on 01.01.2011 (or similar), wiping the audit trail.

All four symptoms share a single root cause: the HMI/PLC combination was set up as if it were a Siemens-to-Siemens integrated connection, but the Allen-Bradley side uses a different time-distribution model (CIP Sync, IEEE 1588) that does not interoperate with the HMI's NTP client or with the area pointer's data-type assumptions.

2. Prerequisites

Item Minimum version Notes
TIA Portal V17 (use V18/V19/V20 for current builds) WinCC Comfort/Advanced included
WinCC Comfort/ES V17 or later matching TIA version Older versions ship without NTP for Basic Panels
Studio 5000 Logix Designer V32.01 or later For 1756-L8x; V35+ recommended for 1756-L9x
ControlLogix firmware V31 for L8x, V35 for L9x Time Sync attribute requires V31+ on 1756-L8x
KTP Basic firmware KTP x00 Basic PN 2nd gen, image V16 update 6+ 1st gen (mono) does not support NTP
EtherNet/IP module 1756-EN2T, 1756-EN3TR, 1756-EN4TR EN2T supports CIP Sync; EN4TR adds PRP/HSR
Generation check: Open the KTP Basic's HMI device properties in TIA Portal → "Device & Networks" → right-click the panel → "Device information". A 2nd-generation panel is identified by article number 6AV2 1xx-xxxxx-xxxx (the 6AV2 prefix is the indicator). 1st-generation panels (6AV6 6xx-xxxxx-xxxx) do not support the NTP path described in Section 5.

3. Why the Standard DTL-Mapping Attempt Fails

The Siemens DTL (Date_And_Time_Long) data type is a 12-byte structure:

Byte offset Field Type Range
0–1 YEAR UINT 1970–2554
2 MONTH USINT 1–12
3 DAY USINT 1–31
4 WEEKDAY USINT 1–7 (Sun=1)
5 HOUR USINT 0–23
6 MINUTE USINT 0–59
7 SECOND USINT 0–59
8–11 NANOSECOND UDINT 0–999,999,999

The Date/Time PLC area pointer expects exactly 12 bytes in this layout, written from the controller into the HMI's address space. The Comfort and Basic Panels do not interpret individual DTL sub-elements; the area pointer is a raw byte block, and the HMI assembles the date/time locally from that block.

The user reported that individual UInt/USInt/UDInt tags from the PLC would not read. The most common cause is that the HMI tag table was created with mismatched data lengths or that the area pointer was pointed at a tag that has overlapping usage. On a 2nd-gen Basic, the area pointer is also restricted to DBs or global memory; it cannot be bound to an alias tag that points into a produced/consumed tag.

4. Method 1 — Date/Time PLC Area Pointer (Recommended)

This is the only path that produces a synchronous, on-event update from the PLC clock to the HMI clock. It works on both 1st-gen and 2nd-gen KTP Basics.

4.1 Build a 12-byte DTL image in the ControlLogix

  1. Create a User-Defined Type in Studio 5000 called HMI_TimeBuffer with the following members (the data types do not matter to the HMI — the HMI sees raw bytes — but the byte offsets must match the table in Section 3):
    // Studio 5000 Add-On Instruction or UDT
    HMI_TimeBuffer, UDT[12 bytes]
      Time_YEAR       : DINT   // bytes 0..1   (filled via ANY-to-DINT swap)
      Reserved_Month  : SINT   // byte 2
      Reserved_Day    : SINT   // byte 3
      Reserved_WD     : SINT   // byte 4   // ignored by KTP Basic per KB 69864408
      Reserved_Hour   : SINT   // byte 5
      Reserved_Min    : SINT   // byte 6
      Reserved_Sec    : SINT   // byte 7
      Reserved_Nano   : DINT   // bytes 8..11
  2. Add a controller tag HMI_Time of type HMI_TimeBuffer[1] in program scope. Do not create this tag in an Add-On Instruction; the area pointer must reference a controller-scoped tag.
  3. Add ladder logic that runs every 1 s to copy the wall-clock time into this buffer:
    // Rungs in MainTask, periodic task 1 s
    GSV
      Class Name    = WALL_CLOCK_TIME
      Instance Name = (controller)
      Attribute Name = LocalDateTime
      Dest          = WallClock_DTL ; DINT[8]
    
    // WallClock_DTL is already a 64-bit CIP DTL: bytes 0..1 = year,
    // byte 2 = month, byte 3 = day, byte 4 = weekday, byte 5 = hour,
    // byte 6 = minute, byte 7 = second, bytes 8..11 = nanoseconds.
    // Copy element-wise:
    MOV(WallClock_DTL[0], HMI_Time.Time_YEAR)
    MOV(WallClock_DTL[1], HMI_Time.Reserved_Month)
    MOV(WallClock_DTL[2], HMI_Time.Reserved_Day)
    MOV(WallClock_DTL[3], HMI_Time.Reserved_WD)
    MOV(WallClock_DTL[4], HMI_Time.Reserved_Hour)
    MOV(WallClock_DTL[5], HMI_Time.Reserved_Min)
    MOV(WallClock_DTL[6], HMI_Time.Reserved_Sec)
    MOV(WallClock_DTL[7], HMI_Time.Reserved_Nano)
    Weekday: KB 69864408 states that the KTP 600 BASIC PN ignores the weekday byte when reading the DateTimePLC area pointer. The HMI computes its own weekday from the year/month/day fields. Do not attempt to fix the weekday by writing a constant; leave byte 4 at 0 and let the HMI calculate.
  4. Confirm the controller tag HMI_Time shows live values in Logix Designer by going online and watching the members update each second.

4.2 Bind the area pointer in TIA Portal

  1. In the HMI project tree, open Connections on the KTP Basic.
  2. Double-click the existing Allen-Bradley ControlLogix connection (driver = "Allen-Bradley ControlLogix" or "Allen-Bradley EtherNet/IP").
  3. Switch to the Area Pointers tab (under "Properties" → "Area Pointers").
  4. Enable Date/Time PLC. Set:
    • PLC tag: HMI_Time[0] (the controller tag from step 4.1.3)
    • Length: 12 (bytes — TIA Portal auto-fills this for the Date/Time PLC pointer)
    • Acquisition cycle: 1 s
  5. Compile and download to the HMI. The HMI clock will jump to the PLC time within the acquisition cycle. The first update is delayed by one full cycle after download because the pointer is initialized empty.

4.3 What the HMI does with the bytes

On each acquisition the HMI:

  1. Reads the 12 raw bytes from the address mapped to HMI_Time[0].
  2. Verifies that YEAR is in 1970–2038 (anything outside is treated as invalid and the HMI keeps its previous time).
  3. Verifies MONTH 1–12, DAY 1–31, HOUR 0–23, MINUTE 0–59, SECOND 0–59.
  4. Computes WEEKDAY from the year/month/day (the weekday byte is dropped).
  5. Sets the panel's local clock to the resulting value.

This is why the user's "DTL in the PLC" attempt did not produce visible values: the HMI was reading the bytes correctly, but the Logix Designer DTL type uses big-endian 16-bit year that maps to UINT (not UDINT), and a one-byte shift of the year field silently corrupts the parse. Always use the 8-element DINT buffer produced by the GSV/WALL_CLOCK_TIME instruction rather than the higher-level DTL datatype.

5. Method 2 — NTP Client on 2nd-Gen KTP Basic

If the HMI is a 2nd-gen KTP Basic (KTP 400, KTP 700, KTP 900, KTP 1200, all "Basic PN"), TIA Portal exposes an NTP time-synchronization mode on the panel's properties. This mode is configured under HMI device properties → Time > Time synchronization.

5.1 Configuration steps

  1. In the device configuration, set Time base = "Use NTP".
  2. Enter up to four NTP server addresses. The panel will poll on UDP port 123.
  3. Set the poll interval (default 10 s, minimum 1 s, maximum 24 h).
  4. Compile and download.

5.2 Why the ControlLogix Clock Master is not an NTP source

The 1756-EN2T/EN3TR/EN4TR module, when configured as a CIP Sync master, distributes time using the CIP Sync protocol — a vendor-neutral implementation of IEEE 1588 precision-time-protocol semantics carried inside CIP packets, not over UDP/123. There is no NTP daemon inside the Logix controller or the ENxT module, so a standard NTP request from the HMI to the PLC's IP address will time out with "no response from server" exactly as the user reported.

This is not a bug or a configuration error. It is the deliberate design of the CIP Sync stack: time distribution happens at the CIP layer, with PTP-style grandmaster/ordinary-clock election. The HMI cannot participate in CIP Sync (it is an NTP-only client), so it cannot consume the time that CIP Sync is offering.

5.3 Bridging CIP Sync to NTP

Three production-grade workarounds are documented or used in the field:

Method Hardware Accuracy Notes
Dedicated NTP appliance on the plant network Any stratum-1/2 NTP server (e.g. Siemens SICLOCK, Meinberg, EndRun) ±1 ms to ±10 ms typical Point both the HMI and a Rockwell Stratix-managed switch (if PTP-aware) at the same source for traceability
PC-based NTP server, GPS-disciplined Industrial PC with a USB GPS and a Windows/Linux NTP daemon ±1 ms to ±50 ms Cheapest option; ensure the PC's firewall allows UDP/123 inbound
Use the controller's CIP Sync time as the master and run a CIP-to-NTP bridge on a Stratix switch or panel PC Stratix 5700/5400 with IOS firmware 15.2(8)E or later, or a 3rd-party bridge ±100 µs to ±1 ms Required where the ControlLogix must be the time authority; requires PTP-capable switching infrastructure
Stratix PTP-to-NTP: The 1783-BMS10CGN, 1783-BMS20CGN, and Stratix 5400/5700 with the CIP Sync feature license can be configured as a PTP boundary clock and expose an NTP server interface. This is the only Rockwell-supported way to make a ControlLogix clock visible to an NTP-only consumer.

6. Persisting the HMI Time Across Power Cycles

KTP Basic panels do not include a battery-backed RTC for the operator-facing clock; on a cold start the panel reverts to 00:00:00 on 01.01.2011 (or the configured "Time of last session" if a recipe was saved). To keep the clock from resetting:

  1. Use NTP (Method 2). The panel will recover the correct time within the next poll cycle after boot — usually < 10 s on a 2nd-gen panel.
  2. For panels using the area pointer (Method 1) without NTP, the panel must complete one full acquisition cycle (1 s) and the PLC must be running; if the PLC is also booting, expect 5–30 s of bad time on the HMI.
  3. If neither NTP nor the area pointer is reliable, configure a project-side initial value for the HMI clock and let the operator correct it manually until the PLC comes online.

7. Verification Procedure

  1. In Logix Designer, force HMI_Time.Reserved_Month = 13 and confirm the HMI clock stops updating (invalid-month guard). Restore and continue.
  2. From a Windows PC, run w32tm /monitor /computers:<HMI_IP>. On a 2nd-gen panel with NTP enabled, the PC should see < 1 s offset.
  3. On the HMI, open an alarm view and trigger an alarm. The time stamp should equal the PLC's wall clock to within ±1 s.
  4. Power-cycle the HMI. After boot, the clock should reach the correct value within one NTP poll (default 10 s) or one area-pointer cycle (1 s) — whichever is configured.
  5. On the ControlLogix, verify that the controller is the CIP Sync grandmaster by inspecting the ENxT module's GrandmasterClock attribute in the AOP. If the module is in "Slave Only" mode, time is still correct but you cannot use it as the authoritative source for non-CIP-Sync devices.

8. Troubleshooting Matrix

Symptom Likely cause Fix
HMI clock stays at 00:00:00 01.01.2011 Area pointer not enabled, or PLC not running Verify "Date/Time PLC" area pointer is enabled, acquisition cycle = 1 s, and HMI_Time exists in controller scope
HMI clock updates but offset by 1 day Year bytes swapped (big/little endian mismatch) Use the GSV/WALL_CLOCK_TIME/LocalDateTime result directly; do not build a year word with a BTW/BTD
NTP "no response from server" against PLC IP ControlLogix has no NTP daemon (uses CIP Sync) Point HMI at a real NTP server; see Section 5.3
Area pointer reads OK in the HMI tag table, but alarm time stamps wrong HMI tag used in area pointer is also being used for an HMI-internal animation Create a dedicated controller tag for the time buffer; do not multiplex it with screen logic
Weekday shows the wrong value KTP Basic recomputes weekday from the date and ignores the byte Per KB 69864408, this is expected. Set byte 4 to 0 and document the limitation
Individual UInt/USInt tags from the PLC are blank in the HMI EtherNet/IP connection is symbolic, the tags are not added to the HMI tag table with the correct name, or the HMI is configured for legacy "CIP data table" addressing Switch the HMI's Allen-Bradley connection to symbolic addressing and re-import tags via "Read from PLC"
Time updates for 1 second then stops Controller tag is in an Add-On Instruction; the area pointer requires a controller-scoped tag Move HMI_Time to controller scope, not into the AOI
HMI shows correct time but alarms are stamped with the previous boot time Alarms are read at startup from a buffered log Clear the alarm buffer on the HMI after a successful clock sync, or enable "Update alarm time on time change" in the alarm configuration

9. Field-Proven Caveats

  • On 1756-L7x controllers (pre-L8), the WALL_CLOCK_TIME class is available but the LocalDateTime attribute returns the time in CIP Sync epoch (1900-01-01 base) rather than the S7/Logix Designer epoch (1970-01-01). The HMI will interpret the resulting year as out-of-range and discard the update. The 1756-L8x and L9x ship the corrected epoch and work without conversion.
  • The "Date/Time PLC" area pointer and the NTP mode are mutually exclusive on a single connection. Enabling one disables the other in TIA Portal; pick one and stick with it.
  • On a panel with a recipe that is being saved at the moment the time updates, the recipe's date stamp can be off by one second. This is a documented behavior, not a fault.
  • When the HMI is configured to use NTP and the network is disconnected at boot, the HMI starts with the default 01.01.2011 and waits silently. There is no HMI-side alarm for "NTP unreachable" on a 2nd-gen Basic; the only way to detect it is to monitor the system tag HmiTimeSyncStatus from the PLC.

10. FAQ

Can the Allen-Bradley ControlLogix act as an NTP time server for the KTP Basic?

No. ControlLogix distributes time via CIP Sync (IEEE 1588) inside CIP packets, not NTP over UDP/123. A 2nd-gen KTP Basic configured as an NTP client will time out when pointed at the PLC's IP. Use a real NTP server, or a Stratix switch that bridges PTP to NTP, as described in Section 5.3.

What is the byte layout the "Date/Time PLC" area pointer expects?

Twelve bytes, big-endian, in the order YEAR(UINT), MONTH(USINT), DAY(USINT), WEEKDAY(USINT), HOUR(USINT), MINUTE(USINT), SECOND(USINT), NANOSECOND(UDINT). The KTP Basic ignores the weekday byte and recomputes it from the date, per Siemens KB 69864408.

Why do my individual UInt/USInt/UDInt tags from the ControlLogix show no value in the HMI?

Most often the HMI's Allen-Bradley connection is set to legacy CIP data-table addressing and the tags have not been re-imported symbolically. In TIA Portal, open the connection, switch to symbolic addressing, and use "Read from PLC" to refresh the tag table. Also confirm the tags are in controller scope, not inside an Add-On Instruction.

Does the KTP Basic keep time across a power cycle?

No, there is no battery-backed RTC. The panel reverts to 01.01.2011 00:00:00 on cold start. With NTP enabled it will resync within one poll cycle (default 10 s). With the area pointer enabled it will resync within one acquisition cycle (default 1 s) once the PLC is running.

Can I run a script on the KTP Basic to do the synchronization manually?

No. KTP Basic panels have no scripting runtime, no scheduled tasks, and no VBScript support. The only programmatic knobs are the Date/Time PLC area pointer and the NTP client — both configured at compile time in TIA Portal.

Back to blog