{"id":1754,"date":"2022-06-02T12:32:45","date_gmt":"2022-06-02T12:32:45","guid":{"rendered":"https:\/\/garikoitz.info\/blog\/?p=1754"},"modified":"2022-06-02T12:39:41","modified_gmt":"2022-06-02T12:39:41","slug":"pidlab","status":"publish","type":"post","link":"https:\/\/garikoitz.info\/blog\/2022\/06\/pidlab\/","title":{"rendered":"PIDLab"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Si no visualiz\u00e1is correctamente la versi\u00f3n incrustada del blog, pod\u00e9is acceder directamente a la aplicaci\u00f3n desde aqu\u00ed: <a rel=\"noreferrer noopener\" href=\"https:\/\/garikoitz.info\/pidlab\/\" target=\"_blank\">https:\/\/garikoitz.info\/pidlab\/<\/a><\/p>\n\n\n\n<!DOCTYPE html>\n<html>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/2.9.3\/Chart.min.js\"><\/script>\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chartjs-plugin-zoom@0.7.7\"><\/script>\n<script>\n\/* PIDLab web\n   Versi\u00f3n 0.2 [06\/2022]\n   Autor PIDLab: Rafael Gonzalez Martin\n   Conversi\u00f3n a Javascript: Garikoitz Martinez Moreno (garikoitz.info);\n   ** Freeware **\n*\/\n<\/script>\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"description\" content=\"C\u00e1lculo de sinton\u00edas y simulaci\u00f3n en lazo cerrado para controladores PID\">\n\t<meta name=\"keywords\" content=\"PID, PIDLab, sinton\u00edas, simulaci\u00f3n, arduino, Cohen-Coon, Ziegler-Nichols, Lambda, SIMC, Improved SIMC, IAE, ITAE, Rivera, Skogestad\">\n\t<meta name=\"author\" content=\"Rafael Gonz\u00e1lez Mart\u00edn, Garikoitz Mart\u00ednez Moreno\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n\t<title>PIDLab<\/title>\n\t<link rel=\"icon\" type=\"image\/x-icon\" href=\"favicon.png\">\n<style>\n<-- https:\/\/www.w3schools.com\/cssref\/css_colors.asp -->\nbody {\n\tbackground-color: #f2f2f2;\n\tfont-family: Arial, Helvetica, sans-serif;\n\t<--font-family: 'Courier New', monospace;-->\n}\n.button {\n\tbackground-color: #4CAF50;\n\tborder: none;\n\tcolor: white;\n\tpadding: 10px 32px;\n\ttext-align: center;\n\ttext-decoration: none;\n\tdisplay: inline-block;\n\tfont-size: 16px;\n\tmargin: 4px 2px;\n\tcursor: pointer;\n}\n.button_Black {\n  background-color: #f2f2f2;\n  color: black;\n  border: 2px solid #555555;\n}\ntextarea {\n\tresize: none;\n}\ntable {\n  border-spacing: 0;\n  width: 100%;\n  border: 0.5px solid #ddd;\n}\n\nth, td {\n  text-align: center;\n  padding: 8px;\n  font-size: 10px;\n}\ntr:nth-child(odd){background-color: #c2c2c2}\ntr:nth-child(even){background-color: #c2c2c2}\n\nh2.center {\n\ttext-align: center;\n\tmargin-left: auto; \n\tmargin-right: auto;\n}\n.contenedorcanvas{\n\tbox-sizing:border-box;\n\tfloat:center;\n\twidth:100%;\n\tpadding:10px;\n}\n.canvas{ \n\tbackground-color: #c2c2c2;\n\twidth: 40vh;\n\theight: 60vh;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n}\n.details,\n.summary {\n  margin-left: 10px;\n  color: darkgray;\n  font-size: 100%;\n}\n.psummary {\n  margin-left: 20px;\n  line-height: 1.1;\n  text-align: justify;\n  text-justify: inter-word;\n  color: navy;\n  font-size: 90%;\n}\n.psummarydos {\n  margin-left: 20px;\n  line-height: 1.1;\n  text-align: justify;\n  text-justify: inter-word;\n  color: red;\n  font-size: 80%;\n}\nfieldset {\n  background-color: #eeeeee;\n}\nlegend {\n  background-color: gray;\n  color: white;\n  padding: 5px 10px;\n}\ninput {\n  margin: 5px;\n}\n<\/style>\n<\/head>\n<body>\n\n<p id=\"debug\"><\/p>\n\n<div id=\"AcercaDe\">\n\t<details class=\"details\">\n\t\t<summary class=\"summary\">Acerca de<\/summary>\n\t\t<p class=\"psummary\">\n\t\t\tPIDLab es un desarrollo original de <a href=\"https:\/\/www.linkedin.com\/in\/rafagmartin\" target=\"_blank\" rel=\"noopener\">Rafael Gonz\u00e1lez Mart\u00edn<\/a>\n\t\t\tquien tiene una amplia experiencia en control de procesos.<br>\n\t\t\tLa conversi\u00f3n a Javascript de los c\u00e1lculos y la simulaci\u00f3n ha sido realizada por\n\t\t\t<a href=\"https:\/\/www.linkedin.com\/in\/gmartinezmo\/\" target=\"_blank\" rel=\"noopener\">Garikoitz Martinez Moreno<\/a> <a href=\"https:\/\/www.garikoitz.info\" target=\"_blank\" rel=\"noopener\">(garikoitz.info)<\/a><br>\n\t\t\tPIDLab es Freeware. \u00a1a disfrutar!\n\t\t<\/p>\n\t<\/details>\n<\/div>\n<hr>\n\t<h1>C\u00e1lculo y Simulaci\u00f3n de sinton\u00edas PID<\/h1>\n\t<h2>Variables del Sistema<\/h2>\n\t<div id=\"AyudaSistema\">\n\t<details class=\"details\">\n\t\t<summary class=\"summary\">Ayuda<\/summary>\n\t\t<p class=\"psummary\">\n\t\t\t>> K<sub>P<\/sub>: Ganancia del proceso. Unidades: %\/% o adimensional.<br>\n\t\t\t>> T<sub>0<\/sub>: Tiempo muerto. Unidades: segundos.<br>\n\t\t\t>> T<sub>P<\/sub>: Tiempo del proceso. Es el tiempo en que la PV alcanza el 63.2% de la respuesta ante un salto escal\u00f3n en la OP. \n\t\t\tUnidades: segundos.<br>\n\t\t\t>> T<sub>f<\/sub>: Constante de tiempo deseada en lazo cerrado. \n\t\t\tSolo aplica a ciertas sinton\u00edas, en este caso, Lambda, IMC, SIMC e Improved SIMC. Unidades: segundos.\n\t\t<\/p>\n\t<\/details>\n\t<br>\n\t<\/div>\n\t\t<fieldset>\n\t\t<legend>Variables del Sistema<\/legend>\n\t\t\t<label for=\"txtKp\">K<sub>P<\/sub>:<\/label>\n\t\t\t<textarea id=\"txtKp\" name=\"txtKp\" rows=\"1\" cols=\"5\" Placeholder=\"Kp\">1.33<\/textarea>\n\t\t\t<label for=\"txtT0\">T<sub>0<\/sub>:<\/label>\n\t\t\t<textarea id=\"txtT0\" name=\"txtT0\" rows=\"1\" cols=\"5\" Placeholder=\"T0\">1.25<\/textarea>\n\t\t\t<label for=\"txtTp\">T<sub>P<\/sub>:<\/label>\n\t\t\t<textarea id=\"txtTp\" name=\"txtTp\" rows=\"1\" cols=\"5\" Placeholder=\"Tp\">2.55<\/textarea>\n\t\t\t<label> \/\\ <\/label>\n\t\t\t<label for=\"lblTf\">T<sub>f<\/sub>:<\/label>\n\t\t\t<textarea id=\"txtTf\" name=\"txtTf\" rows=\"1\" cols=\"5\" Placeholder=\"Tf\">6.00<\/textarea>\n\t<\/fieldset>\n\t<br>\n    <button type=\"button\" class=\"button button_Black\" onclick=\"Calcular()\">Calcular sinton\u00edas<\/button>\n\t<br>\n\t\n<div id=\"TablaSintonias\" style=\"overflow-x:auto;text-align:center;\">\n\t\t<h2>Sinton\u00edas<\/h2>\n\t\t<div id=\"AyudaTabla\">\n\t\t<details class=\"details\">\n\t\t<summary class=\"summary\">Ayuda<\/summary>\n\t\t\t<p class=\"psummary\">\n\t\t\t>> CC-25: Cohen-Coon con una Raz\u00f3n de Amortiguamiento del 25% (B\/A = 1\/4) entre la primera y la segunda oscilaci\u00f3n.<br>\n\t\t\t>> CC-10: Cohen-Coon con una Raz\u00f3n de Amortiguamiento del 10% (B\/A = 1\/10) entre la primera y la segunda oscilaci\u00f3n.<br>\n\t\t\t>> ZN-25: Ziegler-Nichols con una Raz\u00f3n de Amortiguamiento del 25% (B\/A = 1\/4) entre la primera y la segunda oscilaci\u00f3n.<br>\n\t\t\t>> ZN-10: Ziegler-Nichols con una Raz\u00f3n de Amortiguamiento del 10% (B\/A = 1\/10) entre la primera y la segunda oscilaci\u00f3n.<br>\n\t\t\t>> IMC: Rivera. El Control de Modelo Interno est\u00e1 basado en el concepto de la Q-parametrizaci\u00f3n, que\n\t\t\t   constituye la base de gran parte de las t\u00e9cnicas de dise\u00f1o modernas. \u00c9ste m\u00e9todo utiliza el par\u00e1metro &#8216;lambda&#8217; (T<sub>f<\/sub>),\n\t\t\t   que representa la constante de tiempo deseada en lazo cerrado y con la cual se modela la respuesta del controlador.<br>\n\t\t\t>> Lambda: Rivera. \u00c9ste m\u00e9todo es una variaci\u00f3n del m\u00e9todo IMC y al igual que \u00e9ste, mediante la variaci\u00f3n del par\u00e1metro &#8216;lambda&#8217; (T<sub>f<\/sub>),\n\t\t\t   somos capaces de modelar la respuesta en lazo cerrado.<br>\n\t\t\t>> ITAE-C: Rovira y otros. M\u00e9todo dise\u00f1ado para minimizar la integral del tiempo por el error absoluto ante cambios de carga.<br>\n\t\t\t>> ITAE-SP: Rovira y otros. M\u00e9todo dise\u00f1ado para minimizar la integral del tiempo por el error absoluto ante cambios de setpoint.<br>\n\t\t\t>> IAE-C: Rovira y otros. M\u00e9todo dise\u00f1ado para minimizar la integral del error absoluto ante cambios de carga.<br>\n\t\t\t>> IAE-SP: Rovira y otros. M\u00e9todo dise\u00f1ado para minimizar la integral del error absoluto ante cambios de setpoint.<br>\n\t\t\t>> SIMC: Skogestad. M\u00e9todo basado en las ideas cl\u00e1sicas de Ziegler-Nichols, la sinton\u00eda IMC de Rivera y las reglas\n\t\t\t   de sinton\u00eda de Smith y Corripio. Presenta buen comportamiento ante cambios de carga y setpoint y sirve tanto en\n\t\t\t   procesos integradores como en procesos con tiempo muerto puro. Utiliza el par\u00e1metro &#8216;lambda&#8217; (T<sub>f<\/sub>) \n\t\t\t   para modelar la respuesta en lazo cerrado considerando que cuando T<sub>f<\/sub>=T<sub>0<\/sub> estamos ante un control \n\t\t\t   ajustado (Tight) y que cuando T<sub>f<\/sub>>T<sub>0<\/sub> estamos ante un control suave (smooth).<br>\n\t\t\t>> Improved SIM C: Skogestad. Mejora del m\u00e9todo SIMC para procesos con tiempo muerto puro y constante de \n\t\t\t   tiempo de proceso peque\u00f1o (Tp=T<sub>0<\/sub>).<br>\n\t\t\t<\/p>\n\t\t\t<hr>\n\t\t\t<p class=\"psummarydos\">\n\t\t\t* Ti\/Td (Tiempo integral\/derivarivo): normalmente utilizado en controladores industriales.<br>\n\t\t\t* Ki\/Kd (Ganancia integral\/derivativa): habitualmente utilizada en las librer\u00edas PID de Arduino, Raspberry PI, etc.<br>\n\t\t\t<\/p>\n\t\t<\/details>\n\t\t<\/div>\n\t\t<br>\n\t\t<table>\n\t\t  <tr>\n\t\t\t<th><\/th>\n\t\t\t<th><\/th>\n\t\t\t<th>CC-25<\/th>\n\t\t\t<th>CC-10<\/th>\n\t\t\t<th>ZN-25<\/th>\n\t\t\t<th>ZN-10<\/th>\n\t\t\t<th>Lambda<\/th>\n\t\t\t<th>IMC<\/th>\n\t\t\t<th>ITAE-C<\/th>\n\t\t\t<th>ITAE-SP<\/th>\n\t\t\t<th>IAE-C<\/th>\n\t\t\t<th>IAE-SP<\/th>\n\t\t\t<th>SIM C<\/th>\n\t\t\t<th>Improved SIM C<\/th>\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t\t<td rowspan=\"2\">PI<\/td>\n\t\t\t<td>Kc<\/td>\n\t\t\t<td id=\"tdKcPI1\"><\/td>\n\t\t\t<td id=\"tdKcPI2\"><\/td>\n\t\t\t<td id=\"tdKcPI3\"><\/td>\n\t\t\t<td id=\"tdKcPI4\"><\/td>\n\t\t\t<td id=\"tdKcPI5\"><\/td>\n\t\t\t<td id=\"tdKcPI6\"><\/td>\n\t\t\t<td id=\"tdKcPI7\"><\/td>\n\t\t\t<td id=\"tdKcPI8\"><\/td>\n\t\t\t<td id=\"tdKcPI9\"><\/td>\n\t\t\t<td id=\"tdKcPI10\"><\/td>\n\t\t\t<td id=\"tdKcPI11\"><\/td>\n\t\t\t<td id=\"tdKcPI12\"><\/td>\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t\t<td>Ti | Ki<\/td>\n\t\t\t<td id=\"tdTiPI1\"><\/td>\n\t\t\t<td id=\"tdTiPI2\"><\/td>\n\t\t\t<td id=\"tdTiPI3\"><\/td>\n\t\t\t<td id=\"tdTiPI4\"><\/td>\n\t\t\t<td id=\"tdTiPI5\"><\/td>\n\t\t\t<td id=\"tdTiPI6\"><\/td>\n\t\t\t<td id=\"tdTiPI7\"><\/td>\n\t\t\t<td id=\"tdTiPI8\"><\/td>\n\t\t\t<td id=\"tdTiPI9\"><\/td>\n\t\t\t<td id=\"tdTiPI10\"><\/td>\n\t\t\t<td id=\"tdTiPI11\"><\/td>\n\t\t\t<td id=\"tdTiPI12\"><\/td>\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t\t\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t\t<td rowspan=\"3\">PID<\/td>\n\t\t\t<td>Kc<\/td>\n\t\t\t<td id=\"tdKcPID1\"><\/td>\n\t\t\t<td id=\"tdKcPID2\"><\/td>\n\t\t\t<td id=\"tdKcPID3\"><\/td>\n\t\t\t<td id=\"tdKcPID4\"><\/td>\n\t\t\t<td id=\"tdKcPID5\"><\/td>\n\t\t\t<td id=\"tdKcPID6\"><\/td>\n\t\t\t<td id=\"tdKcPID7\"><\/td>\n\t\t\t<td id=\"tdKcPID8\"><\/td>\n\t\t\t<td id=\"tdKcPID9\"><\/td>\n\t\t\t<td id=\"tdKcPID10\"><\/td>\n\t\t\t<td id=\"tdKcPID11\">&#8211;<\/td>\n\t\t\t<td id=\"tdKcPID12\">&#8211;<\/td>\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t\t<td>Ti | Ki<\/td>\n\t\t\t<td id=\"tdTiPID1\"><\/td>\n\t\t\t<td id=\"tdTiPID2\"><\/td>\n\t\t\t<td id=\"tdTiPID3\"><\/td>\n\t\t\t<td id=\"tdTiPID4\"><\/td>\n\t\t\t<td id=\"tdTiPID5\"><\/td>\n\t\t\t<td id=\"tdTiPID6\"><\/td>\n\t\t\t<td id=\"tdTiPID7\"><\/td>\n\t\t\t<td id=\"tdTiPID8\"><\/td>\n\t\t\t<td id=\"tdTiPID9\"><\/td>\n\t\t\t<td id=\"tdTiPID10\"><\/td>\n\t\t\t<td id=\"tdTiPID11\">&#8211;<\/td>\n\t\t\t<td id=\"tdTiPID12\">&#8211;<\/td>\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t\t<td>Td | Kd<\/td>\n\t\t\t<td id=\"tdTdPID1\"><\/td>\n\t\t\t<td id=\"tdTdPID2\"><\/td>\n\t\t\t<td id=\"tdTdPID3\"><\/td>\n\t\t\t<td id=\"tdTdPID4\"><\/td>\n\t\t\t<td id=\"tdTdPID5\"><\/td>\n\t\t\t<td id=\"tdTdPID6\"><\/td>\n\t\t\t<td id=\"tdTdPID7\"><\/td>\n\t\t\t<td id=\"tdTdPID8\"><\/td>\n\t\t\t<td id=\"tdTdPID9\"><\/td>\n\t\t\t<td id=\"tdTdPID10\"><\/td>\n\t\t\t<td id=\"tdTdPID11\">&#8211;<\/td>\n\t\t\t<td id=\"tdTdPID12\">&#8211;<\/td>\n\t\t  <\/tr>\n\t\t  <tr>\n\t\t<\/table>\n<\/div>\n\t\n<br><br>\n\t\n<div class=\"contenedorcanvas\" id=\"contenedorcanvas\">\n\t<h2>Simulaci\u00f3n<\/h2>\n\t<div id=\"AyudaSimula\">\n\t<details class=\"details\">\n    <summary class=\"summary\">Ayuda Simulaci\u00f3n<\/summary>\n\t<p class=\"psummary\">\n\t\t>> PV.Sup.: L\u00edmite superior de la variable de proceso (PV).<br>\n\t\t>> PV.Inf.: L\u00edmite inferior de la variable de proceso (PV).<br>\n\t\t>> Kc: Ganancia proporcional del controlador.<br>\n\t\t>> Ti: Tiempo integral del controlador.<br>\n\t\t>> Td: Tiempo derivativo del controlador.<br>\n\t\t>> Ecuaci\u00f3n: Ecuaci\u00f3n aplicada al controlador.<br>\n\t\t>> Ts: Tiempo de muestreo en segundos.<br>\n\t\t>> T.Final: Duraci\u00f3n de la simulaci\u00f3n en segundos.<br>\n\t\t>> PV.Ini.: Valor de inicio de la variable de proceso.<br>\n\t\t>> OP.Ini.: Valor de inicio de la salida del proceso.<br>\n\t\t>> Carga.Ini.: Valor de inicio de la carga.<br>\n\t\t>> &Delta;.SP: Delta de setpoint a simular. Se introduce al 5% de la simulaci\u00f3n.<br>\n\t\t>> &Delta;.Carga: Delta de carga a simular. Se introduce al 50% de la simulaci\u00f3n.<br>\n\t\t>> OP.L.Sup.: L\u00edmite superior de la salida de proceso (OP).<br>\n\t\t>> OP.L.Inf.: L\u00edmite inferior de la salida de proceso (OP).<br>\n\t<\/p>\n\t<p class=\"psummarydos\">\n\t\t* Selecciona una sinton\u00eda, rellena los par\u00e1metros del controlador, de la simulaci\u00f3n y haz clic en Simular.<br>\n\t<\/p>\n\t<\/details>\n\t<\/div>\n\t<br>\n\t<fieldset>\n\t\t<legend>Sinton\u00eda del Controlador<\/legend>\n\t\t<select name=\"sintonias\" id=\"sintonias\" onchange=\"sintonias_SEL()\">\n\t\t\t<optgroup label=\"PI\">\n\t\t\t\t<option value=\"CC25PI\">CC25<\/option>\n\t\t\t\t<option value=\"CC10PI\">CC10<\/option>\n\t\t\t\t<option value=\"ZN25PI\">ZN25<\/option>\n\t\t\t\t<option value=\"ZN10PI\">ZN10<\/option>\n\t\t\t\t<option value=\"LambdaPI\">Lambda<\/option>\n\t\t\t\t<option value=\"IMCPI\">IMC<\/option>\n\t\t\t\t<option value=\"ITAECPI\">ITAE-C<\/option>\n\t\t\t\t<option value=\"ITAESPPI\">ITAE-SP<\/option>\n\t\t\t\t<option value=\"IAECPI\">IAE-C<\/option>\n\t\t\t\t<option value=\"IAESPPI\">IAE-SP<\/option>\n\t\t\t\t<option value=\"SIMCPI\">SIMC<\/option>\n\t\t\t\t<option value=\"Improved_SIMCPI\">Improved SIMC<\/option>\n\t\t\t<\/optgroup>\n\t\t\t<optgroup label=\"PID\">\n\t\t\t\t<option value=\"CC25PID\">CC25<\/option>\n\t\t\t\t<option value=\"CC10PID\">CC10<\/option>\n\t\t\t\t<option value=\"ZN25PID\">ZN25<\/option>\n\t\t\t\t<option value=\"ZN10PID\">ZN10<\/option>\n\t\t\t\t<option value=\"LambdaPID\">Lambda<\/option>\n\t\t\t\t<option value=\"ITAECPID\">ITAE-C<\/option>\n\t\t\t\t<option value=\"ITAESPPID\">ITAE-SP<\/option>\n\t\t\t\t<option value=\"IAECPID\">IAE-C<\/option>\n\t\t\t\t<option value=\"IAESPPID\">IAE-SP<\/option>\n\t\t\t<\/optgroup>\n\t\t<\/select>\n\t<\/fieldset>\n\t<br>\n\t<fieldset>\n\t\t<legend>Par\u00e1metros del Controlador<\/legend>\n\t\t<label for=\"Txt_PVrngSup\">PV.Sup.:<\/label>\n\t\t<textarea id=\"Txt_PVrngSup\" name=\"Txt_PVrngSup\" rows=\"1\" cols=\"3\" Placeholder=\"PVHI\">100<\/textarea>\n\t\t<label for=\"Txt_PVrngInf\">PV.Inf.:<\/label>\n\t\t<textarea id=\"Txt_PVrngInf\" name=\"Txt_PVrngInf\" rows=\"1\" cols=\"3\" Placeholder=\"PVLO\">0<\/textarea>\n\t\t<label for=\"Txt_Kc\">Kc:<\/label>\n\t\t<textarea id=\"Txt_Kc\" name=\"Txt_Kc\" rows=\"1\" cols=\"3\" Placeholder=\"Kc\">1.44<\/textarea>\n\t\t<label for=\"Txt_Ti\">Ti:<\/label>\n\t\t<textarea id=\"Txt_Ti\" name=\"Txt_Ti\" rows=\"1\" cols=\"3\" Placeholder=\"Ti\">2.09<\/textarea>\n\t\t<label for=\"Txt_Td\">Td:<\/label>\n\t\t<textarea id=\"Txt_Td\" name=\"Txt_Td\" rows=\"1\" cols=\"3\" Placeholder=\"Td\">0<\/textarea>\n\t\t<label for=\"ecua\">Ecuaci\u00f3n:<\/label>\n\t\t<select name=\"ecua\" id=\"ecua\">\n\t\t\t<option value=\"PID\">PID<\/option>\n\t\t\t<option value=\"PI-D\">PI-D<\/option>\n\t\t\t<option value=\"I-PD\">I-PD<\/option>\n\t\t<\/select>\n\t\t<br>\n\t<\/fieldset>\n\t<br>\n\t<fieldset>\n\t\t<legend>Par\u00e1metros de Simulaci\u00f3n<\/legend>\n\t\t<label for=\"Txt_muestreo\">Ts:<\/label>\n\t\t<textarea id=\"Txt_muestreo\" name=\"Txt_muestreo\" rows=\"1\" cols=\"3\" Placeholder=\"Ts\">1<\/textarea>\n\t\t<label for=\"Txt_Tfinal\">T.Final:<\/label>\n\t\t<textarea id=\"Txt_Tfinal\" name=\"Txt_Tfinal\" rows=\"1\" cols=\"3\" Placeholder=\"T.Final\">60<\/textarea>\n\t\t<label for=\"Txt_PVini\">PV.Ini.:<\/label>\n\t\t<textarea id=\"Txt_PVini\" name=\"Txt_PVini\" rows=\"1\" cols=\"3\" Placeholder=\"PV.Ini\">50<\/textarea>\n\t\t<label for=\"Txt_OPini\">OP.Ini.:<\/label>\n\t\t<textarea id=\"Txt_OPini\" name=\"Txt_OPini\" rows=\"1\" cols=\"3\" Placeholder=\"OP.Ini\">30<\/textarea>\n\t\t<label for=\"Txt_CargaIni\">Carga.Ini.:<\/label>\n\t\t<textarea id=\"Txt_CargaIni\" name=\"Txt_CargaIni\" rows=\"1\" cols=\"3\" Placeholder=\"Carga.Ini\">0<\/textarea>\n\t\t<label for=\"Txt_DSP\">&Delta;.SP:<\/label>\n\t\t<textarea id=\"Txt_DSP\" name=\"Txt_DSP\" rows=\"1\" cols=\"3\" Placeholder=\"&Delta;.SP\">5<\/textarea>\n\t\t<label for=\"Txt_Dcarga\">&Delta;.Carga:<\/label>\n\t\t<textarea id=\"Txt_Dcarga\" name=\"Txt_Dcarga\" rows=\"1\" cols=\"3\" Placeholder=\"&Delta;.Carga\">5<\/textarea>\n\t\t<label for=\"Txt_OPLimSup\">OP.L.Sup.:<\/label>\n\t\t<textarea id=\"Txt_OPLimSup\" name=\"Txt_OPLimSup\" rows=\"1\" cols=\"3\" Placeholder=\"OPHI\">100<\/textarea>\n\t\t<label for=\"Txt_OPLimInf\">OP.L.Inf.:<\/label>\n\t\t<textarea id=\"Txt_OPLimInf\" name=\"Txt_OPLimInf\" rows=\"1\" cols=\"3\" Placeholder=\"OPLO\">0<\/textarea>\n\t<\/fieldset>\n\t<button type=\"button\" class=\"button button_Black\" id=\"Simular\" onclick=\"Simular()\">Simular<\/button>\n\t<div id=\"contenedorcanvas2\">\n\t\t<canvas class=\"canvas\" id=\"myChart\">Su navegador no soporta canvas \ud83d\ude41 <\/canvas>\n\t<\/div>\n<\/div>\n\n<script>\nfunction sintonias_SEL() {\n\tvar sinto = document.getElementById(\"sintonias\").value;\n\tswitch(sinto) {\n\t\tcase \"CC25PI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcCC25pi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiCC25pi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"CC10PI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcCC10pi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiCC10pi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"ZN25PI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcZN25pi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiZN25pi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"ZN10PI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcZN10pi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiZN10pi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"LambdaPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcLambdapi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiLambdapi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"IMCPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcIMCpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiIMCpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"ITAECPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcITAECpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiITAECpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"ITAESPPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcITAESPpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiITAESPpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"IAECPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcIAECpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiIAECpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"IAESPPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcIAESPpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiIAESPpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"SIMCPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcSIMCpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiSIMCpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\tcase \"Improved_SIMCPI\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcImpSIMCpi;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiImpSIMCpi;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t\tbreak;\n\t\t\/\/\n\t\tcase \"CC25PID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcCC25pid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiCC25pid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdCC25pid;\n\t\tbreak;\n\t\tcase \"CC10PID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcCC10pid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiCC10pid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdCC10pid;\n\t\tbreak;\n\t\tcase \"ZN25PID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcZN25pid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiZN25pid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdZN25pid;\n\t\tbreak;\n\t\tcase \"ZN10PID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcZN10pid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiZN10pid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdZN10pid;\n\t\tbreak;\n\t\tcase \"LambdaPID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcLambdapid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiLambdapid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdLambdapid;\n\t\tbreak;\n\t\tcase \"ITAECPID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcITAECpid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiITAECpid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdITAECpid;\n\t\tbreak;\n\t\tcase \"ITAESPPID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcITAESPpid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiITAESPpid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdITAESPpid;\n\t\tbreak;\n\t\tcase \"IAECPID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcIAECpid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiIAECpid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdIAECpid;\n\t\tbreak;\n\t\tcase \"IAESPPID\":\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = KcIAESPpid;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = TiIAESPpid;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = TdIAESPpid;\n\t\tbreak;\n\t\tdefault:\n\t\t\tdocument.getElementById(\"Txt_Kc\").value = 1;\n\t\t\tdocument.getElementById(\"Txt_Ti\").value = 2;\n\t\t\tdocument.getElementById(\"Txt_Td\").value = 0;\n\t}\n}\n<\/script>\n\t\n<script>\nfunction Calcular() {\n\/\/Sistema\nvar K = parseFloat(document.getElementById(\"txtKp\").value);\nvar T0 = parseFloat(document.getElementById(\"txtT0\").value);\nvar Tp = parseFloat(document.getElementById(\"txtTp\").value);\nvar Tf = parseFloat(document.getElementById(\"txtTf\").value);\nif (Tf == null || Tf == 0.0) Tf = Tp;\nif (Tf == null || Tf == 0.0) document.getElementById(\"txtTf\").innerHTML = Tp;\nvar decimals = 2;\nvar fl = -0.000001;\n\/\/C\u00e1lculos\n\/\/ PI\ntry {\nKcCC25pi = ((1 \/ K) * (Tp \/ T0) * (0.9 + (T0 \/ (12 * Tp)))).toFixed(decimals);\nKcCC10pi = ((1 \/ K) * (Tp \/ T0) * (0.9 + (T0 \/ (12 * Tp))) * 0.6).toFixed(decimals);\nKcZN25pi = (Tp \/ (K * T0) * 0.9).toFixed(decimals);\nKcZN10pi = (Tp \/ (K * T0) * 0.9 * 0.666).toFixed(decimals);\nKcLambdapi = (Tp \/ (K * (Tf + T0))).toFixed(decimals);\nKcIMCpi = ((Tp + T0 \/ 4) \/ (K * Tf)).toFixed(decimals);\nKcITAECpi = (1 \/ K * 0.859 * Math.pow(T0 \/ Tp, -0.977)).toFixed(decimals);\nKcITAESPpi = (1 \/ K * 0.586 * Math.pow(T0 \/ Tp, -0.916)).toFixed(decimals);\nKcIAECpi = (1 \/ K * 0.984 * Math.pow(T0 \/ Tp, -0.986)).toFixed(decimals);\nKcIAESPpi = (1 \/ K * 0.758 * Math.pow(T0 \/ Tp, -0.861)).toFixed(decimals);\nKcSIMCpi = ((1 \/ K) * (Tp \/ (Tf + T0))).toFixed(decimals);\nKcImpSIMCpi = ((1 \/ K) * ((Tp + T0 \/ 3) \/ (Tf + T0))).toFixed(decimals);\n\/\/\nTiCC25pi = (T0 * (30 + 3 * (T0 \/ Tp)) \/ (9 + 20 * (T0 \/ Tp))).toFixed(decimals);\nTiCC10pi = (T0 * (30 + 3 * (T0 \/ Tp)) \/ (9 + 20 * (T0 \/ Tp)) * 1.2).toFixed(decimals);\nTiZN25pi = (T0 \/ 0.3).toFixed(decimals);\nTiZN10pi = (T0 \/ 0.3).toFixed(decimals);\nTiLambdapi = (Tp).toFixed(decimals);\nTiIMCpi = (Tp + T0 \/4).toFixed(decimals);\nTiITAECpi = (Tp \/ (0.674 * Math.pow(T0 \/ Tp, -0.68))).toFixed(decimals);\nTiITAESPpi = (Tp \/ (-0.165 * Math.pow(T0 \/ Tp, 1) + 1.03)).toFixed(decimals);\nTiIAECpi = (Tp \/ (0.608 * Math.pow(T0 \/ Tp, -0.707))).toFixed(decimals);\nTiIAESPpi = (Tp \/ (-0.323 * Math.pow(T0 \/ Tp, 1) + 1.02)).toFixed(decimals);\nTiSIMCpi = (Math.min(Tp, 4 * (Tf + T0))).toFixed(decimals);\nTiImpSIMCpi = (Math.min((Tp + T0 \/ 3),(4 * (Tf + T0)))).toFixed(decimals);\n\/\/ PID\nKcCC25pid = ((1 \/ K) * (Tp \/ T0) * (16 * Tp + (3 * T0)) \/ (12 * Tp)).toFixed(decimals);\nKcCC10pid = ((1 \/ K) * (Tp \/ T0) * (16 * Tp + (3 * T0)) \/ (12 * Tp) * 0.6).toFixed(decimals);\nKcZN25pid = ((Tp \/ (K * T0) * 1.2) * ((2 * T0) + (0.5 * T0)) \/ (2 * T0)).toFixed(decimals);\nKcZN10pid = ((Tp \/ (K * T0) * 1.2 * 0.666) * ((2 * T0) + (0.5 * T0)) \/ (2 * T0)).toFixed(decimals);\nKcLambdapid = ((Tp + T0 \/ 2) \/ (K * (Tf + T0 \/ 2))).toFixed(decimals);\nKcITAECpid = (1 \/ K * 1.357 * Math.pow(T0 \/ Tp, -0.947)).toFixed(decimals);\nKcITAESPpid = (1 \/ K * 0.965 * Math.pow(T0 \/ Tp, -0.855)).toFixed(decimals);\nKcIAECpid = (1 \/ K * 1.435 * Math.pow(T0 \/ Tp, -0.921)).toFixed(decimals);\nKcIAESPpid = (1 \/ K * 1.086 * Math.pow(T0 \/ Tp, -0.869)).toFixed(decimals);\n\/\/\nTiCC25pid = (T0 * (32 + 6 * (T0 \/ Tp)) \/ (13 + 8 * (T0 \/ Tp))).toFixed(decimals);\nTiCC10pid = (T0 * (32 + 6 * (T0 \/ Tp)) \/ (13 + 8 * (T0 \/ Tp)) * 1.2).toFixed(decimals);\nTiZN25pid = ((2 * T0) + (0.5 * T0)).toFixed(decimals);\nTiZN10pid = ((2 * T0) + (0.5 * T0)).toFixed(decimals);\nTiLambdapid = (Tp + T0 \/ 2).toFixed(decimals);\nTiITAECpid = (Tp \/ (0.842 * Math.pow(T0 \/ Tp, -0.738))).toFixed(decimals);\nTiITAESPpid = (Tp \/ (-0.147 * Math.pow(T0 \/ Tp, 1) + 0.796)).toFixed(decimals);\nTiIAECpid =  (Tp \/ (0.878 * Math.pow(T0 \/ Tp, -0.749))).toFixed(decimals);\nTiIAESPpid =  (Tp \/ (-0.13 * Math.pow(T0 \/ Tp, 1) + 0.74)).toFixed(decimals);\n\/\/\nTdCC25pid = (4 * T0 \/ (11 + 2 * (T0 \/ Tp))).toFixed(decimals);\nTdCC10pid = (4 * T0 \/ (11 + 2 * (T0 \/ Tp))).toFixed(decimals);\nTdZN25pid = ((0.5 * T0) * (2 * T0) \/ ((2 * T0) + (0.5 * T0))).toFixed(decimals);\nTdZN10pid = ((0.5 * T0) * (2 * T0) \/ ((2 * T0) + (0.5 * T0))).toFixed(decimals);\nTdLambdapid = (Tp * T0 \/ (2 * Tp + T0)).toFixed(decimals);\n\/\/TdIMCpid = .toFixed(decimals);\nTdITAECpid = (Tp * 0.381 * Math.pow(T0 \/ Tp, 0.995)).toFixed(decimals);\nTdITAESPpid = (Tp * 0.308 * Math.pow(T0 \/ Tp, 0.929)).toFixed(decimals);\nTdIAECpid =  (Tp * 0.482 * Math.pow(T0 \/ Tp, 1.137)).toFixed(decimals);\nTdIAESPpid =  (Tp * 0.348 * Math.pow(T0 \/ Tp, 0.914)).toFixed(decimals);\n\/\/\n}\ncatch(err) {\n  document.getElementById(\"debug\").innerHTML = err.message;\n}\n\/\/Relleno la tabla\n\/\/ PI\ndocument.getElementById(\"tdKcPI1\").innerHTML = KcCC25pi;\ndocument.getElementById(\"tdKcPI2\").innerHTML = KcCC10pi;\ndocument.getElementById(\"tdKcPI3\").innerHTML = KcZN25pi;\ndocument.getElementById(\"tdKcPI4\").innerHTML = KcZN10pi;\ndocument.getElementById(\"tdKcPI5\").innerHTML = KcLambdapi;\ndocument.getElementById(\"tdKcPI6\").innerHTML = KcIMCpi;\ndocument.getElementById(\"tdKcPI7\").innerHTML = KcITAECpi;\ndocument.getElementById(\"tdKcPI8\").innerHTML = KcITAESPpi;\ndocument.getElementById(\"tdKcPI9\").innerHTML = KcIAECpi;\ndocument.getElementById(\"tdKcPI10\").innerHTML = KcIAESPpi;\ndocument.getElementById(\"tdKcPI11\").innerHTML = KcSIMCpi;\ndocument.getElementById(\"tdKcPI12\").innerHTML = KcImpSIMCpi;\n\/\/\ndocument.getElementById(\"tdTiPI1\").innerHTML = TiCC25pi + \" | \" + (KcCC25pi\/TiCC25pi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI2\").innerHTML = TiCC10pi + \" | \" + (KcCC10pi\/TiCC10pi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI3\").innerHTML = TiZN25pi + \" | \" + (KcZN25pi\/TiZN25pi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI4\").innerHTML = TiZN10pi + \" | \" + (KcZN10pi\/TiZN10pi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI5\").innerHTML = TiLambdapi + \" | \" + (KcLambdapi\/TiLambdapi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI6\").innerHTML = TiIMCpi + \" | \" + (KcIMCpi\/TiIMCpi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI7\").innerHTML = TiITAECpi + \" | \" + (KcITAECpi\/TiITAECpi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI8\").innerHTML = TiITAESPpi + \" | \" + (KcITAESPpi\/TiITAESPpi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI9\").innerHTML = TiIAECpi + \" | \" + (KcIAECpi\/TiIAECpi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI10\").innerHTML = TiIAESPpi + \" | \" + (KcIAESPpi\/TiIAESPpi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI11\").innerHTML = TiSIMCpi + \" | \" + (KcSIMCpi\/TiSIMCpi).toFixed(decimals);\ndocument.getElementById(\"tdTiPI12\").innerHTML = TiImpSIMCpi + \" | \" + (KcImpSIMCpi\/TiImpSIMCpi).toFixed(decimals);\n\/\/ PID\ndocument.getElementById(\"tdKcPID1\").innerHTML = KcCC25pid;\ndocument.getElementById(\"tdKcPID2\").innerHTML = KcCC10pid; \ndocument.getElementById(\"tdKcPID3\").innerHTML = KcZN25pid; \ndocument.getElementById(\"tdKcPID4\").innerHTML = KcZN10pid;\ndocument.getElementById(\"tdKcPID5\").innerHTML = KcLambdapid; \ndocument.getElementById(\"tdKcPID6\").innerHTML = \"-\";\ndocument.getElementById(\"tdKcPID7\").innerHTML = KcITAECpid;\ndocument.getElementById(\"tdKcPID8\").innerHTML = KcITAESPpid; \ndocument.getElementById(\"tdKcPID9\").innerHTML = KcIAECpid;\ndocument.getElementById(\"tdKcPID10\").innerHTML = KcIAESPpid; \ndocument.getElementById(\"tdKcPID11\").innerHTML = \"-\";\ndocument.getElementById(\"tdKcPID12\").innerHTML = \"-\";\n\/\/\ndocument.getElementById(\"tdTiPID1\").innerHTML = TiCC25pid + \" | \" + (KcCC25pid\/TiCC25pid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID2\").innerHTML = TiCC10pid + \" | \" + (KcCC10pid\/TiCC10pid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID3\").innerHTML = TiZN25pid + \" | \" + (KcZN25pid\/TiZN25pid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID4\").innerHTML = TiZN10pid + \" | \" + (KcZN10pid\/TiZN10pid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID5\").innerHTML = TiLambdapid + \" | \" + (KcLambdapid\/TiLambdapid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID6\").innerHTML = \"-\";\ndocument.getElementById(\"tdTiPID7\").innerHTML = TiITAECpid + \" | \" + (KcITAECpid\/TiITAECpid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID8\").innerHTML = TiITAESPpid + \" | \" + (KcITAESPpid\/TiITAESPpid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID9\").innerHTML = TiIAECpid + \" | \" + (KcIAECpid\/TiIAECpid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID10\").innerHTML = TiIAESPpid + \" | \" + (KcIAESPpid\/TiIAESPpid).toFixed(decimals);\ndocument.getElementById(\"tdTiPID11\").innerHTML = \"-\";\ndocument.getElementById(\"tdTiPID12\").innerHTML = \"-\";\n\/\/\ndocument.getElementById(\"tdTdPID1\").innerHTML = TdCC25pid + \" | \" + (KcCC25pid*TdCC25pid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID2\").innerHTML = TdCC10pid + \" | \" + (KcCC10pid*TdCC10pid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID3\").innerHTML = TdZN25pid + \" | \" + (KcZN25pid*TdZN25pid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID4\").innerHTML = TdZN10pid + \" | \" + (KcZN10pid*TdZN10pid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID5\").innerHTML = TdLambdapid + \" | \" + (KcLambdapid*TdLambdapid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID6\").innerHTML = \"-\";\ndocument.getElementById(\"tdTdPID7\").innerHTML = TdITAECpid + \" | \" + (KcITAECpid*TdITAECpid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID8\").innerHTML = TdITAESPpid + \" | \" + (KcITAESPpid*TdITAESPpid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID9\").innerHTML = TdIAECpid + \" | \" + (KcIAECpid*TdIAECpid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID10\").innerHTML = TdIAESPpid + \" | \" + (KcIAESPpid*TdIAESPpid).toFixed(decimals);\ndocument.getElementById(\"tdTdPID11\").innerHTML = \"-\";\ndocument.getElementById(\"tdTdPID12\").innerHTML = \"-\";\n\/\/\nTablaSintonias.style.visibility = 'visible';\ncontenedorcanvas.style.visibility = 'visible';\ndocument.getElementById(\"ecua\").value = \"PI-D\";\ndocument.getElementById(\"sintonias\").value = \"CC10PI\";\nsintonias_SEL();\n}\n<\/script>\n\n<script>\n\/\/\nTablaSintonias.style.visibility = 'hidden';\ncontenedorcanvas.style.visibility = 'hidden';\n\nfunction Simular(){ \n\ttry{\n\t\tvar imax, Ts, PVEUHI, PVEULO, PVIni, OPIni, Kcalc, KcalcEU, Tocalc, Tpcalc, a1, a2;\n        var SP, SPp, DV, PV, PV1, PV2, dPV, dPV1, PVp, myError, myError1, myError2, i, j, tnow, factor;  \n\t\tvar OP, OP1, dOP, nDelays, Kc, Ti, Td, Eq, strTipoModelo, strInc, WindUp, Tfinal, DVIni, dSP, dCarga;  \n\t\tvar Ik, Ik1, KEUPor, KPorEU, TProp, TInte, TDer, dProp, dInte, dDer, Saturado, OPHILim, OPLOLim;  \n\t\tvar dPVPred = [], dblCoeffX = [], dblCoeffY = [], nCoeff, intHP, intPerMuest, result_tnow = [];\n\t\tvar result_SP = [], result_PV = [],result_OP = [], result_DV = [], IAE_sim, titulo_chart, sinto;\n            \/\/\n            PVEUHI = parseFloat(document.getElementById(\"Txt_PVrngSup\").value);\n            PVEULO = parseFloat(document.getElementById(\"Txt_PVrngInf\").value);\n            Kc_simula = parseFloat(document.getElementById(\"Txt_Kc\").value);\n            Ti_simula = parseFloat(document.getElementById(\"Txt_Ti\").value);\n            Td_simula = parseFloat(document.getElementById(\"Txt_Td\").value);\n            Kc = parseFloat(document.getElementById(\"Txt_Kc\").value);\n            Ti = parseFloat(document.getElementById(\"Txt_Ti\").value);\n            if (Ti == 0.0) { Ti = 9999.0 };\n            Td = parseFloat(document.getElementById(\"Txt_Td\").value);\n\t\t\teq = document.getElementById(\"ecua\").value;\t\n            strInc = \"NO\";\n            WindUp = \"SI\";\n            Kcalc = parseFloat(document.getElementById(\"txtKp\").value);\n            KcalcEU = parseFloat(Kcalc * (PVEUHI - PVEULO) \/ 100); \/\/para la simulaci\u00f3n se usa en unidades de ingenier\u00eda aunque se muestre en %\/%\n            Tocalc = parseFloat(document.getElementById(\"txtT0\").value);\n            Tpcalc = parseFloat(document.getElementById(\"txtTp\").value);\n            strTipoModelo = \"P.Orden\";\n            Ts = parseFloat(document.getElementById(\"Txt_muestreo\").value);\n            Tfinal = parseFloat(document.getElementById(\"Txt_Tfinal\").value);\n            PVIni = parseFloat(document.getElementById(\"Txt_PVini\").value);\n            OPIni = parseFloat(document.getElementById(\"Txt_OPini\").value);\n            DVIni = parseFloat(document.getElementById(\"Txt_CargaIni\").value);\n            dSP = parseFloat(document.getElementById(\"Txt_DSP\").value);\n            dCarga = parseFloat(document.getElementById(\"Txt_Dcarga\").value);\n            OPHILim = parseFloat(document.getElementById(\"Txt_OPLimSup\").value);\n            OPLOLim = parseFloat(document.getElementById(\"Txt_OPLimInf\").value);\n\t\t\t\/\/\n            factor = 1; \/\/ 1 para segundos, 60 para minutos\n            KEUPor = parseFloat(100 \/ (PVEUHI - PVEULO));\n            KPorEU = parseFloat(1 \/ KEUPor);\t\n\t\t\t\/\/console.log(\"KEUPor \" + KEUPor + \" KPorEU: \" + KPorEU);\t\t\n            \/\/***************************************\n            \/\/modelo de primer orden con retardo puro\n            \/\/***************************************\n            a1 = parseFloat(Ts * KcalcEU \/ (Tpcalc * factor + Ts));\n            a2 = parseFloat(Tpcalc * factor \/ (Tpcalc * factor + Ts));\t\n\t\t\t\/\/console.log(\"a1 \" + a1 + \" a2: \" + a2);\t\t\t\n            \/\/**********************************\n            \/\/numero de intervalos de simulacion\n            \/\/**********************************\n            imax = parseInt(Tfinal * factor \/ Ts);\n            nDelays = parseInt(((Tocalc * factor \/ Ts) + 1)); \/\/ se suma 1 por el Z-H\n\t\t\tlet MV = new Array(nDelays).fill(OPIni)\n            PV = PVIni;\n            PV1 = PVIni;\n            PV2 = PVIni;\n            dPV1 = 0;\n            dPV = 0;\n            SP = PVIni;\n            DV = DVIni;\n            Ik = OPIni * (Ti * factor) \/ Kc;\n            Ik1 = Ik;\n\t\t\tmyError = 0;\n            myError1 = 0;\n            myError2 = 0;\n            OP = OPIni;\n            OP1 = OPIni;\n            \/\/\n            result_tnow.length = imax;\n            result_SP.length = imax;\n            result_PV.length = imax;\n            result_OP.length = imax;\n            result_DV.length = imax;\n            \/\/\n\t\t\tresult_tnow = new Array(imax).fill(0);\n\t\t\tresult_SP = new Array(imax).fill(0);\n\t\t\tresult_PV = new Array(imax).fill(0);\n\t\t\tresult_OP = new Array(imax).fill(0);\n\t\t\tresult_DV = new Array(imax).fill(0);\n\t\t\t\/\/\n\t\t\tIAE_sim = 0;\n            for (let i = 0; i < imax; i++) {\/\/For i = 0 To imax\n                tnow = parseInt(i * Ts \/ factor);\n\t\t\t\t\/\/console.log(i + \" tnow: \" + tnow);\n\t\t\t\t\/\/-------------------------------------------------------------------------------------------COMPROBAR parseInt y parseFloat--------------------\n                if (i > (imax \/ 20)) { SP = PVIni + dSP };\n                if (i > (imax \/ 2)) { DV = DVIni + dCarga };\n                SPp = KEUPor * (SP - PVEULO);\n                PVp = KEUPor * (PV - PVEULO);\n\t\t\t\t\/\/console.log(i + \" SPp: \" + SPp + \" PVp: \" + PVp);\n                if (dSP > 0) { myError = SPp - PVp };\n                if (dSP < 0) { myError = PVp - SPp };\n                if (eq == \"PID\") { TProp = Kc * myError };\n                if (eq == \"PI-D\") { TProp = Kc * myError };\n                if (eq == \"I-PD\") { TProp = -Kc * (PV - PVIni) * KEUPor };\n                if (eq == \"PID\") { dProp = Kc * (myError - myError1) };\n                if (eq == \"PI-D\") { dProp = Kc * (myError - myError1) };\n                if (eq == \"I-PD\") { dProp = -Kc * (PV - PV1) * KEUPor };\n                Ik = Ik1 + (Ts \/ 2 * (myError + myError1));\n\t\t\t\t\/\/console.log(i + \" Ik: \" + Ik + \" myError: \" + myError + \" myError1: \" + myError1 + \" PVp: \" + PVp);\n                TInte = Ik * Kc \/ (Ti * factor);\n                dInte = Kc * Ts \/ Ti \/ factor * myError;\n                if (eq == \"PID\") { TDer = Kc * Td * factor * (myError - myError1) \/ Ts };\n                if (eq == \"PI-D\") { TDer = -(Kc * Td * factor * KEUPor \/ Ts * (PV - PV1)) };\n                if (eq == \"I-PD\") { TDer = -(Kc * Td * factor * KEUPor \/ Ts * (PV - PV1)) };\n                if (eq == \"PID\") { dDer = Kc * Td * factor \/ Ts * (myError - 2 * myError1 + myError2) };\n                if (eq == \"PI-D\") { dDer = -Kc * Td * factor * KEUPor \/ Ts * (PV - 2 * PV1 + PV2) };\n                if (eq == \"I-PD\") { dDer = -Kc * Td * factor * KEUPor \/ Ts * (PV - 2 * PV1 + PV2) };\n                if (strInc == \"SI\") {\n                    dOP = dProp + dInte + dDer;\n                    OP = OP1 + dOP;\n                } else {\n                    OP = TProp + TInte + TDer;\n                }\n\t\t\t\t\/\/console.log(i + \" Ik: \" + Ik + \" TProp: \" + TProp + \" TInte: \" + TInte);\n                Saturado = \"false\";\n                if (OP > OPHILim) {\n                    OP = OPHILim;\n                    Saturado = \"true\";\n                }\n                if (OP < OPLOLim) {\n                    OP = OPLOLim;\n                    Saturado = \"true\";\n                }\n                result_tnow[i] = tnow;\n                result_SP[i] = SP;\n                result_PV[i] = PV;\n                result_OP[i] = OP;\n                result_DV[i] = DV;\n\t\t\t\tIAE_sim += (Math.abs(result_SP[i] - result_PV[i])); \/\/SP-PV\n                MV[0] = OP + DV;\n                myError2 = myError1;\n                myError1 = myError;\n                PV2 = PV1;\n                PV1 = PV;\n\t\t\t\t\/\/console.log(i + \" dSP: \" + dSP + \" SP: \" + SP + \" PV: \" + PV);\n                if (dSP > 0.0001) { dPV1 = PV - PVIni };\n                if (dSP < 0.0001) { dPV1 = PVIni - PV };\n                OP1 = OP;\n                if (WindUp == \"SI\") {\n                    if (Saturado == \"false\") { Ik1 = Ik };\n                } else {\n                    Ik1 = Ik;\n                }\n                if (strTipoModelo == \"P.Orden\") {\n                    if (dSP > 0) { PV = (a1 * (MV[nDelays - 1] - OPIni) + a2 * dPV1) + PVIni }; \n                    if (dSP < 0) { PV = PVIni - (a1 * (MV[nDelays - 1] - OPIni) + a2 * dPV1) };\n                }\n\t\t\t\tMV = rotateRight(MV);\t\t\t\n\t\t\t}\t\n\/\/------------------------------------------------------------\t\t\t\n\/\/https:\/\/www.chartjs.org\/docs\/next\/samples\/line\/line.html\ndocument.getElementById(\"contenedorcanvas2\").innerHTML = '&nbsp;';\ndocument.getElementById(\"contenedorcanvas2\").innerHTML = '<canvas class=\"canvas\" id=\"myChart\">Su navegador no soporta canvas :( <\/canvas>';\n\/\/\nsinto = document.getElementById(\"sintonias\").value;\ntitulo_chart = sinto + \" | Kc:\" + Kc + \" Ti:\" + Ti + \" Td:\" + Td;\n\/\/\nvar minSPPV, maxSPPV, stepSPPV, desiredStepsSPPV, mag10SPPV, stepSizeSPPV;\nvar minOP, maxOP, stepOP, desiredStepsOP, mag10OP, stepSizeOP;\nminSPPV = Math.floor(((Math.min.apply(this,result_PV))-2));\nmaxSPPV = Math.ceil(((Math.max.apply(this,result_PV))+2));\ndesiredStepsSPPV = 10;\nstepSPPV = ((maxSPPV-minSPPV)\/desiredStepsSPPV);\nmag10SPPV = Math.ceil(Math.log(stepSPPV) \/ Math.log(10));\nstepSizeSPPV = Math.pow( mag10SPPV, 10 );\n\/\/\nminOP = Math.floor(((Math.min.apply(this,result_OP))-10));\nmaxOP= Math.ceil(((Math.max.apply(this,result_OP))+10));\ndesiredStepsOP = 10;\nstepOP = ((maxOP-minOP)\/desiredStepsOP);\nmag10OP = Math.ceil(Math.log(stepOP) \/ Math.log(10));\nstepSizeOP = Math.pow( mag10OP, 10 );\n\/\/\nconsole.log(\"minSPPV \" + minSPPV + \" | maxSPPV \" + maxSPPV + \" | mag10SPPV \" + mag10SPPV + \" | stepSizeSPPV \" + stepSizeSPPV);\nconsole.log(\"minOP \" + minOP + \" | maxOP \" + maxOP + \" | mag10OP \" + mag10OP + \" | stepSizeOP \" + stepSizeOP);\n\/\/\nnew Chart(\"myChart\", {\n  type: \"line\",\n  backgroundColor: \"DimGray\",\n  data: {\n    labels: result_tnow,\n    datasets: [{\n\t\tlabel: 'SP',\n\t\tyAxisID: \"SP\",\n\t\tdata: result_SP,\n\t\tborderColor: \"Blue\",\n\t\t\/\/pointStyle: 'circle',\n\t\tradius:0,\n\t\ttension:0.1,\n\t\tstepped: true,\n\t\tfill: false\n    }, { \n\t\tlabel: 'PV',\n\t\tyAxisID: \"PV\",\n\t\tdata: result_PV,\n\t\tborderColor: \"Fuchsia\",\n\t\t\/\/pointStyle: 'circle',\n\t\tradius:0,\n\t\ttension:0.1,\n\t\tfill: false\n    }, { \n\t\tlabel: 'OP',\n\t\tyAxisID: \"OP\",\n\t\tdata: result_OP,\n\t\tborderColor: \"Yellow\",\n\t\t\/\/pointStyle: 'circle',\n\t\tradius:0,\n\t\ttension:0,\n\t\tfill: false\n    }, { \n\t\tlabel: 'Carga',\n\t\tyAxisID: \"Carga\",\n\t\tdata: result_DV,\n\t\tborderColor: \"cyan\",\n\t\tradius:0,\n\t\ttension:0.1,\n\t\tstepped: true,\n\t\tfill: false\n    }]\n  },\n  options: {\n\tresponsive: true,\n\taspectRatio: 1,\n\tmaintainAspectRatio: false,\n    \/\/fullWidth: true,\n    \/\/legend: {display: true, position: 'top'},\n\tlegend: {display: true,\tposition: 'top', labels: {  boxWidth: 80, fontColor: 'black'}},\n\ttitle: {display: true, text: ['Simulaci\u00f3n en lazo cerrado', titulo_chart, 'IAE: ' + IAE_sim.toFixed(0)]},\n\t\/\/\n\ttooltips: {\n\t\tmode:'index', \n\t\tintersect: true,\n\t\tposition : 'custom',\n\t\tcallbacks: {\n            title: function (tooltipItem, data) { \n                return \"Segundo \" + data.labels[tooltipItem[0].index]; \n            },\n\t\t\tlabel: function(tooltipItems, data) {\n                return data.datasets[tooltipItems.datasetIndex].label + \" \" + (tooltipItems.yLabel).toFixed(2) + ' %';\n            },\n            \/\/footer: function (tooltipItem, data) { return \"...\"; }\n        }\n\t},\n\tscales: {\n\t\txAxes: [{\n\t\t\tdisplay: true,\n\t\t\tscaleLabel: {display: true, labelString: 'Tiempo (segundos)', stepSize: 2}\n\t\t}],\n\t\tyAxes: [{\n            id: 'PV',\n            type: 'linear',\n            position: 'left',\n            display: true,\n\t\t\tgridLines: { display: true, color: \"LightGray\"  },\n\t\t\tscaleLabel: { display: true, labelString: 'PV', fontColor: 'Fuchsia', fontWeight: 'bold', fontSize: 12},\n\t\t\tticks: {min: Number(minSPPV), max: Number(maxSPPV), stepSize: Number(stepSizeSPPV), beginAtZero: false, fontSize: 10, maxTicksLimit: Number(desiredStepsSPPV), fontColor: 'Fuchsia'}\n            }, {\n            id: 'SP',\n            type: 'linear',\n            position: 'left',\n            display: true,\n\t\t\tgridLines: { display: false},\n\t\t\tscaleLabel: { display: true, labelString: 'SP', fontColor: 'blue', fontWeight: 'bold', fontSize: 12},\n\t\t\tticks: {min: Number(minSPPV), max: Number(maxSPPV), stepSize: Number(stepSizeSPPV), beginAtZero: false, fontSize: 10, maxTicksLimit: Number(desiredStepsSPPV), fontColor: 'blue'}\n\t\t\t\/\/ticks: {min: minSPPV, max: maxSPPV, stepSize: stepSPPV, beginAtZero: false}\n\t\t\t\/\/ticks: {min: (Math.min.apply(this,result_PV)-5), max: (Math.max.apply(this,result_PV)+5),stepSize: 5, beginAtZero: false}\n            }, {\n            id: 'OP',\n            type: 'linear',\n            position: 'right',\n            display: true,\n\t\t\tgridLines: { display: false },\n\t\t\tscaleLabel: { display: true, labelString: 'OP', fontColor: 'Yellow', fontWeight: 'bold', fontSize: 12},\n\t\t\tticks: {min: Number(minOP), max: Number(maxOP), stepSize: Number(stepSizeOP), beginAtZero: false, fontSize: 10, maxTicksLimit: Number(desiredStepsOP), fontColor: 'Yellow'}\n\t\t\t\/\/ticks: {min: Math.round(Math.min.apply(this,result_OP)-5), max:Math.round(Math.max.apply(this,result_OP)+5),stepSize: 5, beginAtZero: false}\n            }, {\n            id: 'Carga',\n            type: 'linear',\n            position: 'right',\n            display: true,\n\t\t\tgridLines: { display: false },\n\t\t\tscaleLabel: { display: true, labelString: 'Carga', fontColor: 'cyan', fontWeight: 'bold', fontSize: 12},\n\t\t\tticks: {min: 0, max: 100, stepSize: 10, beginAtZero: false, fontSize: 10, fontColor: 'cyan'}\n\t\t\t\/\/ticks: {min: Math.min.apply(this,result_DV)-5, max:Math.max.apply(this,result_DV)+5,stepSize: 5, beginAtZero: false}\n            }]\n    },\n\t\/\/https:\/\/github.com\/chartjs\/chartjs-plugin-zoom\/blob\/v0.7.7\/README.md\n\tplugins: {\n\t\tzoom: {\n\t\t\t\/\/ Container for pan options\n\t\t\tpan: {\n\t\t\t\tenabled: true,\n\t\t\t\tmode: 'xy',\n\t\t\t\trangeMin: {\/\/ Format of min pan range depends on scale type\n\t\t\t\t\tx: null,\n\t\t\t\t\ty: null\n\t\t\t\t},\n\t\t\t\trangeMax: {\/\/ Format of max pan range depends on scale type\n\t\t\t\t\tx: null,\n\t\t\t\t\ty: null\n\t\t\t\t},\n\t\t\t\tspeed: 20, \/\/ On category scale, factor of pan velocity\n\t\t\t\tthreshold: 10, \/\/ Minimal pan distance required before actually applying pan\n\t\t\t},\n\t\t\tzoom: {\n\t\t\t\tenabled: true,\n\t\t\t\tdrag: true,\n\t\t\t\tmode: 'xy',\n\t\t\t\trangeMin: {\n\t\t\t\t\tx: null,\n\t\t\t\t\ty: null\n\t\t\t\t},\n\t\t\t\trangeMax: {\n\t\t\t\t\tx: null,\n\t\t\t\t\ty: null\n\t\t\t\t},\n\t\t\t\tspeed: 0.1,\n\t\t\t\tthreshold: 2,\n\t\t\t\tsensitivity: 3,\n\t\t\t\t}\n\t\t\t}\n\t}\n  }\n});\n\/\/\nChart.Tooltip.positioners.custom = function(elements, eventPosition) {\n    \/** @type {Chart.Tooltip} *\/\n    var tooltip = this;\n\n    \/* ... *\/\n\n\t\treturn {\n\t\t\tx: eventPosition.x,\n\t\t\ty: eventPosition.y\n\t\t};\n\t}\n\/\/\n\t\tvar ctx = document.getElementById('myChart').getContext('2d');\n\t\tmyChart = new Chart(ctx, options);\n\t}catch(err) {\n\t  \/\/document.getElementById(\"debug\").innerHTML = err.stack;\n\t  \/\/document.getElementById(\"debug\").innerHTML = err.message + \" - \" + err.name + \" - \" + err.stack;\n\t}\n}\n\/\/\nfunction rotateRight(arr){\n    let last = arr.pop();\n    arr.unshift(last);\n    return arr;\n}\n<\/script>\n\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Si no visualiz&aacute;is correctamente la versi&oacute;n incrustada del blog, pod&eacute;is acceder directamente a la aplicaci&oacute;n desde aqu&iacute;: https:\/\/garikoitz.info\/pidlab\/ PIDLab Acerca de PIDLab es un desarrollo original de Rafael Gonz&aacute;lez Mart&iacute;n quien tiene una amplia experiencia en control de procesos. La conversi&oacute;n a Javascript de los c&aacute;lculos y la simulaci&oacute;n ha sido realizada por Garikoitz Martinez Moreno (garikoitz.info) PIDLab es Freeware. &iexcl;a disfrutar! C&aacute;lculo y Simulaci&oacute;n de sinton&iacute;as PID Variables del Sistema Ayuda &gt;&gt; KP: Ganancia del proceso. Unidades: %\/% o&#8230;<\/p>\n<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/garikoitz.info\/blog\/2022\/06\/pidlab\/\"> Leer m\u00e1s<span class=\"screen-reader-text\">  Leer m\u00e1s<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":1755,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","wpupg_custom_link":[],"wpupg_custom_link_behaviour":[],"wpupg_custom_link_nofollow":[],"wpupg_custom_image":[],"wpupg_custom_image_id":[],"footnotes":""},"categories":[1],"tags":[153,157,160,162,158,159,17,25,152,155,156,161,101,98,163,154],"class_list":["post-1754","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria","tag-cohen-coon","tag-iae","tag-imc","tag-improved-simc","tag-itae","tag-lambda","tag-pid","tag-pid-tunning","tag-pidlab","tag-rivera","tag-rovira","tag-simc","tag-sintonia-pid","tag-sintonizacion-pid","tag-skogestad","tag-ziegler-nichols"],"_links":{"self":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1754","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/comments?post=1754"}],"version-history":[{"count":8,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1754\/revisions"}],"predecessor-version":[{"id":1763,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/posts\/1754\/revisions\/1763"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media\/1755"}],"wp:attachment":[{"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/media?parent=1754"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/categories?post=1754"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/garikoitz.info\/blog\/wp-json\/wp\/v2\/tags?post=1754"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}