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?