- 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