dw_choi
(dw choi)
February 27, 2026, 2:30am
1
I need help for using X20ATC402,
I’m using terminal block X20TB1F for now
It seems to need compensation value.
Some Questions is:
When using an external RTD(PT100) instead of the X20TB1E’s Integrated PT1000 for compensation,
the RTD is measured via the ATB312 and the value is used as the External Compensation value.
Is the RTD measured at the front temperature of the PLC IO card?
Can I convert it to 0.1°C and map it to External Compensation ?
When using an external terminal for cable extension, is the temperature of the external terminal measured using a PT1000 and then compensated for?
Also, when using the X20TB1E with the X20C402, is the PLC’s IO terminal temperature measured?
seunghwa
(Seunghwa Hyun)
February 27, 2026, 3:56am
2
I have experience with case 1, but I’m not sure(it had been 6 years ), so it’s better to get help from B&R local office or community experts.
Temperature calibration using X20TB1F instead of X20TB1E is described in the GUID below. The remote terminal block compensation should be circuit configured for cold junction.
Remote terminal block GUID: 109bcb62-3c66-4e66-a5ae-e2e03baa1db3
You can read X20TB1E’s PT1000 temperatures use acyclic IO read function block.
X20ATC402 registers GUID: 49a5edf6-bce9-47ca-9bc5-04054d9a900d
AsIOAccRead GUIID: 8be32c32-86c5-4d7f-b937-8236a908dd39
CompensationValueA,B read sample code for 6 X20ATC402 modules below;
VAR
Functionblock : Functionblock_typ;
loop : USINT;
END_VAR
TYPE
Functionblock_typ : STRUCT
AccessAsyncCJ1 : ARRAY[0..5]OF AsIOAccRead; (*CompensationValueA*)
AccessAsyncCJ2 : ARRAY[0..5]OF AsIOAccRead; (*CompensationValueB*)
END_STRUCT;
END_TYPE
PROGRAM _CYCLIC
// Manual script
Functionblock.AccessAsyncCJ1[0].pDeviceName := ADR('IF6.ST1');
Functionblock.AccessAsyncCJ2[0].pDeviceName := ADR('IF6.ST1');
Functionblock.AccessAsyncCJ1[1].pDeviceName := ADR('IF6.ST2');
Functionblock.AccessAsyncCJ2[1].pDeviceName := ADR('IF6.ST2');
Functionblock.AccessAsyncCJ1[2].pDeviceName := ADR('IF6.ST3');
Functionblock.AccessAsyncCJ2[2].pDeviceName := ADR('IF6.ST3');
Functionblock.AccessAsyncCJ1[3].pDeviceName := ADR('IF6.ST4');
Functionblock.AccessAsyncCJ2[3].pDeviceName := ADR('IF6.ST4');
Functionblock.AccessAsyncCJ1[4].pDeviceName := ADR('IF6.ST5');
Functionblock.AccessAsyncCJ2[4].pDeviceName := ADR('IF6.ST5');
Functionblock.AccessAsyncCJ1[5].pDeviceName := ADR('IF6.ST6');
Functionblock.AccessAsyncCJ2[5].pDeviceName := ADR('IF6.ST6');
// Acyclic I/O data read -> X20ATC402 : Cold junction temperature A, B
FOR loop := 0 TO 5 BY 1 DO
Functionblock.AccessAsyncCJ1[loop].enable := TRUE;
Functionblock.AccessAsyncCJ1[loop].pChannelName := ADR('266');
Functionblock.AccessAsyncCJ1[loop]();
ProcessData.TemperatureCJ1[loop] := UDINT_TO_REAL(Functionblock.AccessAsyncCJ1[loop].value) / 10;
Functionblock.AccessAsyncCJ2[loop].enable := TRUE;
Functionblock.AccessAsyncCJ2[loop].pChannelName := ADR('270');
Functionblock.AccessAsyncCJ2[loop]();
ProcessData.TemperatureCJ2[loop] := UDINT_TO_REAL(Functionblock.AccessAsyncCJ2[loop].value) / 10;
END_FOR
END_PROGRAM
kovarj
(Jaroslav Kovar)
March 9, 2026, 8:41am
3
Hi @dw_choi ,what is status of your questions, can you update us?
dw_choi
(dw choi)
March 11, 2026, 7:48am
4
Really sorry for late.
I tried cold junction compensation using the X20ATB312, but there was a discrepancy between the actual temperature and the TC sensor reading (about 5 degrees lower).
The PT100 is a rod-shaped device, and I’m not sure where I should measure the temperature to accurately compensate.
It’ll be a while before I receive the X20TB1E, so I wanted to try measuring the TC in the meantime.
Is there a way to compensate for my current environment?
I need some advice.
kovarj
(Jaroslav Kovar)
March 16, 2026, 11:19am
5
is there anyone in Community who can help here?
kovarj
(Jaroslav Kovar)
March 22, 2026, 12:07pm
6
Obviously, the Community is not helping you here, so it is probably time to get in contact with the local support team. Please update us with your findings.