Entendiendo la lógica del PLC ladder

-1

Estoy tratando de entender la lógica de flujo del lenguaje de escalera. ¿Es secuencial como C / C ++? "No lo creo"

Caso particular: ¡He estado intentando algo muy simple pero no puedo hacer que suceda como quiero! Figura1.LógicadeescaleraparacontaryreiniciarEltemporizadornuncasereinicia,loheintentadoconunmontóndecosasenmovimiento.Además,labobinanoestáparpadeando.

Porcierto(Q0.0esunabobinade4Hz).

Estabaintentandoconlavariabletemporal'comenzandocon#',peroleíquesedestruye(¿asumoquelasredesseejecutandeformasecuencialyenforma(verdadera))?

ct0_reset_________________________________________________________________________________Tagcounter>4_____________|___________Out0__||_||_||_||_||_||_||_||_||_||_||_Tagcounterup__|___|___|___|___|___|___|___|___|___|___|__________________________________________________cnfg_port_|

Figura2.Variables/bobinasdeldiagramadetiempo

loscomentariospreguntaronacercadecómoserealizólaQ0.0.Aquíestáelcódigototalenelqueseencuentralared1(figura1),y(figura2)paraparpadearmostrandoelcódigototal. Figura3.Lógicadeescaleraparaparpadear

Cómoresolvíesto:despuésdemuchosintentoshiceesto:(aunquesientoqueesdifícilleerlalógicaaquí"lo entiendo" y "funciona"). pero no creo que sea fácil de leer, entonces, ¿cómo harías esto?

Tambiéneditélalógicadeparpadeoalosiguiente(creoqueestoesmáscorrecto):

    
pregunta Hasan alattar

2 respuestas

1

Si tiene una última versión de TIA que permite mezclar LAD y SCL, puede agregar un código simple, en lugar de LAD:

IF Tag_Counter1 >= 5 THEN
         tmp_cnt0_reset := TRUE;
         cnfg_port :=  NOT  cnfg_port;      
ELSE 
         tmp_cnt0_reset := FALSE;

END_IF;

Respecto a su código es totalmente incorrecto: Q0.7 se escribe varias veces, así como M1.0.

También puede reemplazar la CTU con SCL:

Out0_PosPulse := Out0 AND NOT Out0_pos; // Out0_pos ...static variable
Out0_pos := Out0;

IF tmp_cnt0_reset THEN
   Tag_Counter1 := 0;
ELSIF Out0_PosPulse THEN
   Tag_Counter1 += 1;
END_IF;

O puede que te guste la versión compacta:

Out0_PosPulse := Out0 AND NOT Out0_pos; // Out0_pos ...static variable
Out0_pos := Out0;

IF Out0_PosPulse THEN
   Tag_Counter1 += 1;
   IF Tag_Counter1 >= 5 THEN
       Tag_Counter1 := 0;
       cnfg_port :=  NOT  cnfg_port;  
   END_IF;
END_IF;

Pero todavía hay problemas, Out0 y cnfg_port son salidas de PLC, no debe acceder a ellas como a cualquier variable, solo debe escribir en ellas. Usted tiene o usar variables intermedias de tipo static o temp para ese propósito.

Tienes mucho que aprender acerca de la programación de PLC.

    
respondido por el Marko Buršič
1
  

¿Es secuencial como c / c ++?

No, con el patrón de exploración de columna típico * se evalúa de arriba a abajo y de izquierda a derecha. Esto significa que primero se evalúa toda la columna 1 desde la fila 1 hasta el final, luego se evalúa la columna 2, y así sucesivamente.
Además, la última evaluación de un símbolo anula todas las asignaciones anteriores.

Estás escribiendo Q0.7 dos veces, donde la línea 2 es dominante. Las entradas que utilizan Q0.7 usan el mismo estado.

** verifica el manual de tu plc para ver qué patrón usa el tuyo. *

    
respondido por el Jeroen3

Lea otras preguntas en las etiquetas