July 29, 2026

#311 - Comparing PIDE (Rockwell) with PID_Compact (Siemens) and PIDFF (Schneider)

- Simulation code for Rockwell:

// First Scan Initialization
IF S:FS THEN 
	SIMULATION_SampleTime := 0.5; // [s]
	SIMULATION_Process_Tau := 150.0; // [s]
	SIMULATION_Process_Gain := 1.136; // PV/CV = 100.0/88.0
	SIMULATION_Process_DeadTime := 30.0; // [s]
	SIMULATION_Process_Lag_Out := 20.0; // [degC]
	SIMULATION_Disturbance_Period := 240.0; // [s]
	SIMULATION_Disturbance_Angle := 0.0; // [rad]
	SIMULATION_Disturbance_Amplitude := 0.2; // [degC]
	SIMULATION_Disturbance_Load := 0.0; // [degC]
	SIMULATION_Disturbance_Load_Tau := 10.0; // [s]
	SIMULATION_Disturbance_Load_Ramp := 0.0;
	SIMULATION_Disturbance := 0.0;
	SIMULATION_Delayed_CV := 88.0; // [%]
	SIMULATION_Delay_Index := 0;
	SIMULATION_DeadTime_SampleTime_Ratio := 0;
	SIMULATION_2PI := 6.28318531; //[rad]
	SIMULATION_SIZE_DELAY_BUFFER_ARRAY := 500; 
END_IF;	

// Advance the disturbance wave angle based on task execution time
SIMULATION_Disturbance_Angle := SIMULATION_Disturbance_Angle + ((SIMULATION_2PI / SIMULATION_Disturbance_Period) * SIMULATION_SampleTime);
IF SIMULATION_Disturbance_Angle >= SIMULATION_2PI THEN
    SIMULATION_Disturbance_Angle := SIMULATION_Disturbance_Angle - SIMULATION_2PI;
END_IF;

// Compute the sine wave disturbance value scaled by the target amplitude
SIMULATION_Disturbance := SIN(SIMULATION_Disturbance_Angle) * SIMULATION_Disturbance_Amplitude;

// Write the current PIDE output into the dead-time circular buffer
SIMULATION_Delay_Buffer[SIMULATION_Delay_Index] := PID_CV;

// Read the historical PIDE output from the buffer based on the dead-time steps
SIMULATION_DeadTime_SampleTime_Ratio := SIMULATION_Process_DeadTime / SIMULATION_SampleTime;
SIMULATION_Delayed_CV := SIMULATION_Delay_Buffer[(SIMULATION_Delay_Index - SIMULATION_DeadTime_SampleTime_Ratio + SIMULATION_SIZE_DELAY_BUFFER_ARRAY) MOD SIMULATION_SIZE_DELAY_BUFFER_ARRAY]; 

// Increment the buffer write index and wrap at SIMULATION_SIZE_DELAY_BUFFER_ARRAY
SIMULATION_Delay_Index := (SIMULATION_Delay_Index + 1) MOD SIMULATION_SIZE_DELAY_BUFFER_ARRAY;

// Calculate the first-order lag process dynamic response
SIMULATION_Process_Lag_Out := SIMULATION_Process_Lag_Out + (SIMULATION_SampleTime / SIMULATION_Process_Tau) * ((SIMULATION_Process_Gain * SIMULATION_Delayed_CV) - SIMULATION_Process_Lag_Out);
SIMULATION_Disturbance_Load_Ramp := SIMULATION_Disturbance_Load_Ramp + (SIMULATION_SampleTime / SIMULATION_Disturbance_Load_Tau) * (SIMULATION_Disturbance_Load - SIMULATION_Disturbance_Load_Ramp);

// Combine the lag process output with the sine wave disturbance
PID_PV := SIMULATION_Process_Lag_Out + SIMULATION_Disturbance + SIMULATION_Disturbance_Load_Ramp; 

- Here is a trend to validate the process simulation:

No comments:

Post a Comment