{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "*This notebook contains material from [cbe30338-2021](https://jckantor.github.io/cbe30338-2021);\n", "content is available [on Github](https://github.com/jckantor/cbe30338-2021.git).*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.8 Lab Assignment 4: Cascade Control](https://jckantor.github.io/cbe30338-2021/03.08-Lab-Assignment-Cascade-Control.html) | [Contents](toc.html) | [Tag Index](tag_index.html) | [4.0 Process Analytics](https://jckantor.github.io/cbe30338-2021/04.00-Process-Analytics.html) >
"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.9 Lab Assignment 4: Solution](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9-Lab-Assignment-4:-Solution)",
"section": "3.9 Lab Assignment 4: Solution"
}
},
"source": [
"# 3.9 Lab Assignment 4: Solution"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.9 Lab Assignment 4: Solution](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9-Lab-Assignment-4:-Solution)",
"section": "3.9 Lab Assignment 4: Solution"
}
},
"outputs": [],
"source": [
"# import all libraries used for this assignment\n",
"\n",
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"\n",
"# use least_squares for FOPDT model fitting\n",
"from scipy.optimize import least_squares\n",
"\n",
"# tclab functions\n",
"from tclab import TCLab, clock, Historian, Plotter, setup\n",
"\n",
"# operating system library for creating data folder"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.9 Lab Assignment 4: Solution](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9-Lab-Assignment-4:-Solution)",
"section": "3.9 Lab Assignment 4: Solution"
}
},
"source": [
"The following cell consolidates choices for parameters values used throughout this notebook."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.9 Lab Assignment 4: Solution](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9-Lab-Assignment-4:-Solution)",
"section": "3.9 Lab Assignment 4: Solution"
}
},
"outputs": [],
"source": [
"# parameters used throughout this notebook\n",
"P1 = 255\n",
"P2 = 50\n",
"\n",
"# power levels used for step tests and performance evaluation\n",
"Q1 = 50\n",
"Q2 = 20\n",
"\n",
"# time grid\n",
"t_step = 5\n",
"t_final = 1000\n",
"\n",
"# tclab setup\n",
"connected = False\n",
"speedup = 20\n",
"\n",
"# data files \n",
"if not os.path.exists('data'):\n",
" os.makedirs('data')\n",
"datafile_1 = os.path.join(\"data\", \"data_lab4_1.csv\")\n",
"datafile_2 = os.path.join(\"data\", \"data_lab4_2.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 2,
"link": "[3.9.1 Exercise 1. PI Control for T2 using Q1](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9.1-Exercise-1.-PI-Control-for-T2-using-Q1)",
"section": "3.9.1 Exercise 1. PI Control for T2 using Q1"
}
},
"source": [
"## 3.9.1 Exercise 1. PI Control for T2 using Q1\n",
"\n",
"The exerise comprises of two basic steps:\n",
"\n",
"* Step 1: Step tests to identify FOPDT model for Q1 -> T2 dynamics. The same step test data will be used in exercise 2 for the Q1 -> T1 dynamics.\n",
"* Step 2: Estimate PI controller constants and implement antiwindup PI control.\n",
"* Step 3: Test controller for setpoint response and disturbance rejection.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.9.1.1 Step 1: Model Identification](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9.1.1-Step-1:-Model-Identification)",
"section": "3.9.1.1 Step 1: Model Identification"
}
},
"source": [
"### 3.9.1.1 Step 1: Model Identification"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 4,
"link": "[3.9.1.1.1 Step Test](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9.1.1.1-Step-Test)",
"section": "3.9.1.1.1 Step Test"
}
},
"source": [
"#### 3.9.1.1.1 Step Test"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"nbpages": {
"level": 4,
"link": "[3.9.1.1.1 Step Test](https://jckantor.github.io/cbe30338-2021/03.09-Lab-Assignment-Solution.html#3.9.1.1.1-Step-Test)",
"section": "3.9.1.1.1 Step Test"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}