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?