Etapas de Desarrollo de Software

Estaba viendo la presentación de OWASP y en una diapositiva salieron las etapas de desarrollo de software, que guardo aquí. Habría que traducirlo.

Por mientras:

DevSecOps CI/CD

  1. Requerimientos (requirements).
    1. (Regulatory compilance).
    2. (Policies).
    3. (Industry requirements).
  2. Diseño (design).
    1. Análisis de riesgos (threat modeling).
    2. Revisiones de arquitectura (architecture reviews)
    3. Consejos de seguridad (security advisements)
  3. Implementación (implementation).
    1. Revisiones de código (code reviews)
    2. Herramientas de desarrollo (IDE tools)
    3. Capacitación (training)
  4. Pruebas (testing).
    1. Análisis estáticos (static analysis)
    2. Análisis dinámicos (dynamic testing)
    3. Análisis interactivos (interactive testing)
  5. Operación (deployment).
    1. (hardening guidelines)
    2. (network assessments)
  6. Mantención (maintenance).
    1. Cumplimiento regulatorio (regulatory compilance)
    2. (third party pentesting)
    3. Requerimientos industriales (industry requirements)
https://www.youtube.com/watch?v=jLXMbpcrPyA

En mantención

Estamos remodelando

Sólo quería avisar que Google no tiene los suficientes recursos y ganas de seguir manteniendo los blogs que se alojan en servidores propios (como este blog) así que nos están obligando a retirarnos, pasar a blogspot o redirigir un subdominio a sus servidores.

Yo pienso que es por el tema de la publicidad: quieren hacerle la vida más fácil a la gente que no cacha.

Por lo mismo, he estado evaluando estos meses WordPress y Joomla. La verdad es que me carga mantener bases de datos, era feliz manejando sólo archivos.

También me ha costado mucho tratar de insertar mi propio código dentro de los artículos de este blog en WordPress para que se ejecute tal como yo lo quiero. Me gusta más escribir el html directamente cuando escribo, por ejemplo, esto.

Así que no sé qué voy a hacer, quedan pocos días para que se acabe el mes y no pueda escribir más en este blog a través de blogger y sus comentarios no aparezcan.

También hay que pensar en los buscadores que ya tienen estos artículos en sus resultados, los links en otros blogs, el OpenId; el feed por lo menos está en feedburner, pero puede que con el cambio vuelvan a aparecer los artículos antiguos como nuevos. Maldito, Blogger.

Esto está en mantención.

Referencias

Programé un KOP en el PLC S7-200 con Step-7 MICROWIN de Siemens

No voy a enseñar a programar un PLC, porque un semestre (y un post) no alcanzan para describir toda la teoría (física, electrónica, matemática) que hay detrás de un KOP de PLC. Así que voy a usar esta entrada o artículo para anotar los trucos KOP que aprendí a hacer con el MICROWIN este semestre.

Estudiante de ingeniería moviendo la perilla de un osciloscopio

Definiciones

PLC

Los PLC (Programmable Logic Controller en sus siglas en inglés) son dispositivos electrónicos muy usados en Automatización Industrial.

Es un hardware industrial, que se utiliza para la obtención de datos. Una vez obtenidos, los pasa a través de bus (por ejemplo por ethernet) en un servidor.

Más en Wikipedia.

KOP

KOP es una abreviación de Kontaktplan que en alemán signfica Plan de Contacto o arreglo de contactos. Básicamente es un método para programar Controladores Lógicos Programables (o PLC). En inglés serían los Diagramas Ladder (LD) y como lenguaje de programación, es más conocido como Ladder Logic.

Ladder logic es una filosofía de dibujo de esquematismo de lógica electrónica. Es un lenguaje gráfico muy popular para programar Controladores Lógicos Programables (PLCs). Originalmente fue inventado para describir la lógica hecha desde relés.

Más en Wikipedia.

Mis bases de diseño de KOP

Los programas KOP hacen que el programa emule la circulación de corriente eléctrica desde una fuente de alimentación, a través de una serie de condiciones lógicas de entrada que, a su vez, habilitan condiciones lógicas de salida. Los programas KOP incluyen una barra de alimentación izquierda que está energizada. Los contactos cerrados permiten que la corriente circule por ellos hasta el siguiente elemento, en tanto que los contactos abiertos bloquean el flujo de energía.

Estas son las diapositivas más importantes que entregó el profesor.

Clase 3 – Automatización S7-200


Ver presentación en Google Docs

Clase 5 – Set- Reset-Flancos-not


Ver presentación en Google Docs

Clase 6 – Comparadores, contadores


Ver presentación en Google Docs

Lo que yo sé hacer

Interruptores de encendido y apagado

Con un switch interruptor

Con un interruptor es fácil, más que fácil, básico. Ya que el interruptor al encenderlo deja pasar corriente (cierra) y al apagarlo la corta (abre), el circuito es el más elemental que se puede ocurrir.

ORGANIZATION_BLOCK MAIN:OB1 
TITLE=PROGRAM COMMENTS 
BEGIN 
Network 1 
LD     I0.0 
=      Q0.0 
END_ORGANIZATION_BLOCK 
SUBROUTINE_BLOCK SBR_0:SBR0 
TITLE=SUBROUTINE COMMENTS 
BEGIN 
Network 1 // Network Title // Network Comment 
END_SUBROUTINE_BLOCK 
INTERRUPT_BLOCK INT_0:INT0 
TITLE=INTERRUPT ROUTINE COMMENTS 
BEGIN 
Network 1 // Network Title // Network Comment 
END_INTERRUPT_BLOCK
Con diferentes botones

Si quisiera que un botón sólo encienda y otro sólo apague, se me ocurre algo parecido a esto:

ORGANIZATION_BLOCK MAIN:OB1
TITLE=PROGRAM COMMENTS
BEGIN
Network 1 
LD     I0.0
O      Q0.0
AN     I0.1
=      Q0.0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=INTERRUPT ROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_INTERRUPT_BLOCK

I0.0 (que está abierto) enciende (cierra y deja pasar la corriente) al oprimirlo. Y el I0.1, que está cerrado, apaga (abre y no deja pasar la corriente) cuando lo oprimen.

Con el mismo botón: telerruptor

La combinación telerruptor me sirve para cambiar el estado de alguna salida (encender y apagar) con el mismo botón, por ejemplo:

ORGANIZATION_BLOCK MAIN:OB1
TITLE=PROGRAM COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
LD     I0.0
EU
LPS
AN     Q0.0
S      M0.0, 1
LPP
A      Q0.0
R      M0.0, 1
Network 2 
LD     M0.0
=      Q0.0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=INTERRUPT ROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_INTERRUPT_BLOCK

Cronograma del telerruptor anterior: cierro y se enciende, abro y no pasa nada, cierro y se apaga, abro y no pasa nada, cierro y se enciende...

El circuito telerruptor es una aplicación típica del uso de marcas y funciones set y reset. El funcionamiento es el siguiente: la función “detectar flanco positivo” permite, cada vez que se aprieta el pulsador conectado a I0.0, la circulación de corriente durante un ciclo en el segmento. Por cada flanco la salida Q0.0 deberá invertir su estado.

Interrupción o parada de emergencia

Poner un botón de emergencia que detuviera todo es algo que nos pedían siempre. Yo lo hacía poniendo un contacto “detectar flanco negativo” y luego todo lo demás.

ORGANIZATION_BLOCK MAIN:OB1
TITLE=PROGRAM COMMENTS
BEGIN
Network 1 
LD     I0.0
AN     I0.1
=      Q0.0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=INTERRUPT ROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_INTERRUPT_BLOCK

Secuencias y ciclos

Secuencias

Cuando habían secuencias sin tiempo definido (uno después de otro), yo empezaba cada paso con un contacto “detectar flanco negativo” y los activaba después de cada paso para que se detuvieran antes de seguir con el otro, combinado con sensores o temporizadores al final de cada paso para esperar que terminara antes de continuar.

Ciclos con tiempos definidos

Cuando habían ciclos con tiempos definidos (por ejemplo, las luces de un semáforo), poníamos un TON y luego comparábamos con “mayor que” o “menor que” su estado.

LDW>   T37, 1
AW<=   T37, 100
=      Q0.0
Network 3 
LDW>   T37, 100
AW<=   T37, 150
=      Q0.1
Network 4 
LDW>   T37, 150
AW<=   T37, 300
=      Q0.2
Network 5 
// Reset para formar un ciclo
LD     T37
R      T37, 1
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=INTERRUPT ROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_INTERRUPT_BLOCK

Al final hacemos que el temporizador haga un RESET a sí mismo para que se repita el ciclo una y otra vez.

Otros

Autoretención o enclavamiento

El enclavamiento servía para mantener la circulación de electricidad hasta que gatilláramos nosotros mismos el apagado más adelante de alguna forma. Esto estaba en la primera diapositiva, Clase 3, así que textual:

La autoretención es una manera clásica de puesta en marcha de casi todos los dispositivos industriales. Esta estructura de contactos entrega una solución a muchos problemas de programación. Lo que hace básicamente es memorizar el estado de una entrada aunque esta haya desaparecido.

ORGANIZATION_BLOCK MAIN:OB1
TITLE=PROGRAM COMMENTS
BEGIN
Network 1 // Enclavamiento
// Network Comment
LD     I0.0
O      Q0.0
=      Q0.0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=INTERRUPT ROUTINE COMMENTS
BEGIN
Network 1 // Network Title
// Network Comment
END_INTERRUPT_BLOCK

Cronograma de un enclavamiento. Al encender, se enciende; al apagar, sigue encendido.

Se puede apreciar que al activar I0.0 se activará también la salida Q0.0. Lo que produce que el contacto asignado con la misma variable Q0.0 se active también. Así entonces la salida queda energizada mediante los contactos I0.0 y Q0.0. Al desactivar I0.0 se mantendrá activada la salida pues sigue recibiendo energía mediante el contacto Q0.0. A esta situación se le denomina comúnmente enclavamiento.

Intermitencia

La luz intermitente la hacíamos con un interruptor de frecuencia de 1Hz y una Marca especial SM0.5 que lo que hacía era activarse 0.5 segundos y se desactivaba 0.5 segundos después dando un ciclo de 1 segundo.

ORGANIZATION_BLOCK MAIN:OB1
TITLE=INTERMITENCIA
BEGIN
Network 1
LD     SM0.5
=      Q0.0
END_ORGANIZATION_BLOCK
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE
BEGIN
Network 1
END_SUBROUTINE_BLOCK
INTERRUPT_BLOCK INT_0:INT0
TITLE=INTERRUPT ROUTINE COMMENTS
BEGIN
Network 1
END_INTERRUPT_BLOCK

Links de interés