Introducción
Esta tarde estaba aburrido en casa y puse a prueba una idea que lleva tiempo rondándome la cabeza: «¿El mismo código tiene mejor rendimiento en KOP o en SCL?» Al final, KOP tiene equivalente en todas sus funciones en SCL y quería poner a prueba si las funciones consumen los mismos recursos en SCL que en KOP. Yo, la verdad, es que imaginaba que eran iguales, pero como dice un compañero de trabajo a quien aprecio mucho, «los imagino, los espero y supongo son un cuchillo envenenado», así que me arremangué las mangas de la camiseta y decidí hacer un pequeño temporizador tonto que no hace nada, pero la idea es que active una salida continuamente cada 1 segundo y comprobar si consume recursos.
¿Cómo se ha realizado?
Para esta prueba decidí ejecutarla en el entorno de Twincat de Beckhoff Automation, que me da control del conocimiento de cada núcleo y compararlo en el mismo instante de tiempo. Preparé los FB, al final llamé a 21 FB por cada una de las tareas con un tiempo de ejecución de 0.05ms y comparé los rendimientos.
SCL
El código para la function block
FUNCTION_BLOCK FB_WaitAndWriteSCL
VAR_INPUT
END_VAR
VAR_OUTPUT
bStart: BOOL;
END_VAR
VAR
temp1: TOF;
temp2: TON;
END_VAR
temp1(IN:= temp2.Q, PT:= T#1S,);
temp2(IN:= NOT temp1.Q, PT:= T#1S,Q=>bStart);
El código usado para el programa ha sido:
PROGRAM MainSCL
VAR
fbwait0 : FB_WaitAndWriteSCL;
fbwait1 : FB_WaitAndWriteSCL;
fbwait2 : FB_WaitAndWriteSCL;
fbwait3 : FB_WaitAndWriteSCL;
fbwait4 : FB_WaitAndWriteSCL;
fbwait5 : FB_WaitAndWriteSCL;
fbwait6 : FB_WaitAndWriteSCL;
fbwait7 : FB_WaitAndWriteSCL;
fbwait8 : FB_WaitAndWriteSCL;
fbwait9 : FB_WaitAndWriteSCL;
fbwait10 : FB_WaitAndWriteSCL;
fbwait11 : FB_WaitAndWriteSCL;
fbwait12 : FB_WaitAndWriteSCL;
fbwait13 : FB_WaitAndWriteSCL;
fbwait14 : FB_WaitAndWriteSCL;
fbwait15 : FB_WaitAndWriteSCL;
fbwait16 : FB_WaitAndWriteSCL;
fbwait17 : FB_WaitAndWriteSCL;
fbwait18 : FB_WaitAndWriteSCL;
fbwait19 : FB_WaitAndWriteSCL;
fbwait20 : FB_WaitAndWriteSCL;
bStart: BOOL;
END_VAR
fbwait0();
fbwait1();
fbwait2();
fbwait3();
fbwait4();
fbwait5();
fbwait6();
fbwait7();
fbwait8();
fbwait9();
fbwait10();
fbwait11();
fbwait12();
fbwait13();
fbwait14();
fbwait15();
fbwait16();
fbwait17();
fbwait18();
fbwait19();
fbwait20();
KOP
Este es el código de la tarea:
El código para la function block
Conclusión
Y para sorpresa de nadie, funcionan exactamente igual en rendimiento.
Por otro lado, esta es una prueba. Pronto haré lo mismo para poner a prueba una FB hecha con una máquina de estados contra un software que se ejecute todas las líneas y comprobaré los resultados de los rendimientos. Aquí sí que espero una mejora de rendimiento, ya que al saltarse una gran parte del código, podré obtener rendimientos mucho más altos.
¿Y ustedes? ¿Lo sabían ya? ¿Se imaginaban el resultado como yo?¿Creéis que algo ha fallado en mi evaluación?
Espero sus comentarios, chicos.