Regarding Using X20ATC402 with Compensation Value

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?

  1. I have experience with case 1, but I’m not sure(it had been 6 years :sweat_smile:), so it’s better to get help from B&R local office or community experts.

  2. 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
  3. 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

Hi @dw_choi ,what is status of your questions, can you update us?

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.

is there anyone in Community who can help here?

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.