Espressione CASE in linguaggio ST per PLC

di il
15 risposte

Espressione CASE in linguaggio ST per PLC

Ciao a tutti, sono una neofita del linguaggio ST per PLC che sto apprendendo con corsi e dispense. Ho provato a scrivere un piccolo programma che però non funzinona come vorrei e non capisco l'errore.

Vorrei che se la temperatura è maggiore di quella definita l'aria condizionata sia accesa o spenta. Il problema è che se io imposto 11, giorni in cui dovrebbe accendersi l'aria è solo il 2 (martedì) e 7 (domenica) invece se setto 11 resta sempre TRUE. Ho pensato fosse legato all'inizzializzazione della variabile ma anche mettendo la VAR AriaCondizionata : BOOL := FALSE; non cambia. 

Dove sbaglio? 

Grazie a tutti 

PROGRAM PLC_PRG
VAR
 GiornoDellaSettimana: INT;  // Esempio: Mercoledì
 Temperatura: INT;
 AriaCondizionata: BOOL;
END_VAR
CASE GiornoDellaSettimana OF
 1:
   // Azioni per Lunedì
 2:
   // Azioni per Martedì
IF Temperatura >= 10 THEN
    AriaCondizionata := TRUE;
END_IF
 3:
   // Azioni per Mercoledì
IF Temperatura >=50 THEN
    AriaCondizionata := TRUE;
END_IF
 4:
   // Azioni per Giovedì
 5:
   // Azioni per Venerdì
 6:
   // Azioni per Sabato
 7:
   // Azioni per Domenica
IF Temperatura >= 0 THEN
    AriaCondizionata := FALSE;
END_IF
 ELSE
   // Azioni predefinite per valori non validi
END_CASE

15 Risposte

  • Re: Espressione CASE in linguaggio ST per PLC

    Riscrivi il quesito meglio (in italiano) perché non ho capito cosa dovrebbe succedere e quando.

    Intanto GiornoDellaSettimana  quanto vale?

    E poi il martedì (2) si accende per temperature superiori o uguali a 10 ma la domenica (7) si spegne per temperature superiori o ugauli a 0.

  • Re: Espressione CASE in linguaggio ST per PLC

    12/09/2023 - oregon ha scritto:


    Riscrivi il quesito meglio (in italiano) perché non ho capito cosa dovrebbe succedere e quando.

    Intanto GiornoDellaSettimana  quanto vale?

    E poi il martedì (2) si accende per temperature superiori o uguali a 10 ma la domenica (7) si spegne per temperature superiori o ugauli a 0.

    L'idea è:


    In base al numero del giorno della settimana e al valore della temperatura, accendo o spengo l'aria. 

    La variabile GiornoDellaSettimana può assumerò un numero da 1 a 7. 

    Se prendo, ad esempio il 2 e la temperatura è maggiore o uguale a 10 si accende. Diversamente il giorno 3 deve essere superiore a 50. 

    Ragionandoci…devo forse in qualche modo indicare in variabile che GiornoDellaSettimana è un intero che può andare da 1 a 7? Se si..ma come? 

  • Re: Espressione CASE in linguaggio ST per PLC

    Ancora non si capisce come viene assegnato il valore alla variabile GiornoDellaSettimana. Senza un valore è ovvio che non funzioni nulla. E questo è fondamentale.

    Quando avvii il programma cosa succede a quella variabile? Come viene assegnato il valore? 

    Inoltre se il martedì è stato attivato il condizionatore, quando arrivi al mercoledì resterà acceso anche per temperature minori di 50 perché non hai indicato di spegnerlo. 

    E la domenica si spegnerà a meno che non ci siano temperature sotto zero.

  • Re: Espressione CASE in linguaggio ST per PLC

    Grazie per la tua risposta. Perdona gli errori banali ma, come detto sto imparando. 

    Ho provato a ragionarci e aggiungere qualche condizione modificando il codice in questo modo e ora in effetti, se la temperatura varia, si accende o si spegne correttamente. Idem, la domenica che deve restare sempre spenta, ho modificato la condizione se il valore è 7 la variabile AriaCondizionata deve essere sempre inizializzata a FALSE ovvero sempre spenta. 

    Per indicare il giorno della settimana, attualmente lo faccio manualmente. Certo mi piacerebbe che prendesse il giorno in base a quando siamo attualmente in automatico ma non saprei come fare. Mi hai dato una buona idea e ci provo a trovare una soluzione….anzi, se hai qualche punto di studio da consigliarmi per questo ti ringrazio. 

    CASE GiornoDellaSettimana OF
     1:
       // Azioni per Lunedì
     2:
       // Martedì se più 10° accend altrimenti spegni
    IF Temperatura >= 10 THEN
        AriaCondizionata := TRUE;
    ELSE
        AriaCondizionata := FALSE;    
    END_IF
     3:
       // Mercoledì se più di 50° accendi altrimenti spegni
    IF Temperatura >=50 THEN
        AriaCondizionata := TRUE;
    ELSE
        AriaCondizionata := FALSE;
    END_IF
     4:
       // Giovedì se più di 40° accendi altrimenti spegni
    IF Temperatura >=40 THEN
        AriaCondizionata := TRUE;
    ELSE
        AriaCondizionata := FALSE;
    END_IF
     5:
       // Venerdì se più di 50° accendi altrimenti spegni
    IF Temperatura >=50 THEN
        AriaCondizionata := TRUE;
    ELSE
        AriaCondizionata := FALSE;
    END_IF
     6:
       // Sabato se più di 25° accendi altrimenti spegni
    IF Temperatura >=25 THEN
        AriaCondizionata := TRUE;
    ELSE
        AriaCondizionata := FALSE;
    END_IF
     7:
       // Domenica sempre spenta
        AriaCondizionata := FALSE;
    END_CASE
  • Re: Espressione CASE in linguaggio ST per PLC

    Devi ricavare il giorno della settimana dalla data di sistema (che in genere è un insieme di variabili di sistema che vanno comunque inizializzate).

    In merito ai test suddivisi per i vari giorni della settimana è buona norma avere anche una banda di inazione (ovvero isteresi).

    Esempio :

    IF Temperatura >= 50 THEN
    	AriaCondizionata := TRUE;
    ELSIF Temepratura < 48 THEN
    	AriaCondizionata := FALSE;
    END_IF

    Immagina un macchinario (magari con un forte assorbimento elettrico) che si accende e si spegne in continuo perchè il valore di temperatura che ti arriva dall'ingresso analogico oscilla tra 50,0 e 49,9 (lasciamo perdere la validità di una siffatta misura).

    Nel tuo codice potresti anche essertela cavata gestendo la misura di temperatura con una variabile di tipo intero (e quindi 49 oppure 50) resta il fatto che va sempre verificato se e quanto ampia serve l'isteresi.

    P.S. : Di che PLC stiamo parlando? 

  • Re: Espressione CASE in linguaggio ST per PLC

    Grande Max …. ciao!

  • Re: Espressione CASE in linguaggio ST per PLC

    Intanto sarebbe necessario avere delle informazioni in più

    1. La data come la prendi?
    2. Il plc non ha la funzione dayofweek che restituisce 1 per lunedì fino a 7 per la domenica?

    Case f_DayOfWeek of

       2: ariacondizionata := (temperatura >11 and temperatura <23) ;

       // il martedì se la temperatura ha quel range si accende altrimenti si spegne

      5, 6 : ariacondizionata := not (temperatura <11 or temperatura >23) ;

      // venerdì e sabato se la temperatura è inferiore a 11 gradi o superiore a 23 gradi si spegne altrimenti si accende

      Else: ariacondizionata:=false;

       // tutti gli altri giorni si spegne

    End;

  • Re: Espressione CASE in linguaggio ST per PLC

    13/09/2023 - oregon ha scritto:


    Grande Max …. ciao!

    Ciao A… di sfuggita ci incrociamo anche da queste parti, certo non sarebbe male rivederci da qualche parte per un sano pranzo ‘sociale’ 

  • Re: Espressione CASE in linguaggio ST per PLC

    13/09/2023 - max.riservo ha scritto:


    certo non sarebbe male rivederci da qualche parte per un sano pranzo ‘sociale’ 

    Certo … magari ci si organizza, purtroppo senza PM è un po' difficile … 

  • Re: Espressione CASE in linguaggio ST per PLC

    13/09/2023 - max.riservo ha scritto:


    Devi ricavare il giorno della settimana dalla data di sistema (che in genere è un insieme di variabili di sistema che vanno comunque inizializzate).

    In merito ai test suddivisi per i vari giorni della settimana è buona norma avere anche una banda di inazione (ovvero isteresi).

    Esempio :

    IF Temperatura >= 50 THEN
    	AriaCondizionata := TRUE;
    ELSIF Temepratura < 48 THEN
    	AriaCondizionata := FALSE;
    END_IF

    Immagina un macchinario (magari con un forte assorbimento elettrico) che si accende e si spegne in continuo perchè il valore di temperatura che ti arriva dall'ingresso analogico oscilla tra 50,0 e 49,9 (lasciamo perdere la validità di una siffatta misura).

    Nel tuo codice potresti anche essertela cavata gestendo la misura di temperatura con una variabile di tipo intero (e quindi 49 oppure 50) resta il fatto che va sempre verificato se e quanto ampia serve l'isteresi.

    P.S. : Di che PLC stiamo parlando? 

    Hai ragione e grazie per avermi dato questa info importante. 

    13/09/2023 - sihsandrea ha scritto:


    Intanto sarebbe necessario avere delle informazioni in più

    1. La data come la prendi?
    2. Il plc non ha la funzione dayofweek che restituisce 1 per lunedì fino a 7 per la domenica?

    Case f_DayOfWeek of

       2: ariacondizionata := (temperatura >11 and temperatura <23) ;

       // il martedì se la temperatura ha quel range si accende altrimenti si spegne

      5, 6 : ariacondizionata := not (temperatura <11 or temperatura >23) ;

      // venerdì e sabato se la temperatura è inferiore a 11 gradi o superiore a 23 gradi si spegne altrimenti si accende

      Else: ariacondizionata:=false;

       // tutti gli altri giorni si spegne

    End;

    Mi segno anche questa, più fluida e comoda se inizio ad avere più codice

    Non si tratta di un PLC fisico. Come scritto nel post di apertura sto studiando il codice ST per esigenze di lavoro e, utilizzando Codesys sto realizzando dei progetti per mettere in pratica le nozioni e migliorarmi. 

    Per ricavare la data dal sistema ho visto che Codesys usa la libreria SysTime (installata)..ora devo capire come applicarla e utilizzarla (non ho molta esperienza in questo senso). Spero di aggiornarvi presto 

  • Re: Espressione CASE in linguaggio ST per PLC

    13/09/2023 - logicando ha scritto:

    Non si tratta di un PLC fisico. Come scritto nel post di apertura sto studiando il codice ST per esigenze di lavoro e, utilizzando Codesys sto realizzando dei progetti per mettere in pratica le nozioni e migliorarmi. 

    Codesys è applicabile a diversi costruttori di PLC (con taluni è il Codesys nativo con altri tramite librerie personalizzate) : spero per te che sia disponibile il simulatore del PLC in modo da poter provare ‘nativamente’ il codice.

  • Re: Espressione CASE in linguaggio ST per PLC

    Buongiorno a tutti, 

    sto diventando matta e devo “gettare” la spugna e scrivervi (sto imparando ma sto facendo fatica…ho seguito un corso e mi sto leggendo il manuale Codesys ma molto è basato su linguaggio CF o Ladder perciò se avete documentazone da consigliare ve ne sarei molto grata). 

    Ad ogni modo, ho installato la libreria SystimeRtc che ho visto permette di ottenere il numero del giorno. Il problema è che sono “piantata”.
    Richiamo nel mio blocco di dichiarazione ad esempio numerodelgiorno: poi, premendo F2 non capisco quale valore utilizzare. E qui vi chiedo..come faccio a capire quale sia quello giusto? É giusta la procedura che faccio?

    Grazie mille a tutti ancora per la pazienza e la disponibilità

  • Re: Espressione CASE in linguaggio ST per PLC

    Tutto questo però non ha più nulla a che vedere con il CASE …

  • Re: Espressione CASE in linguaggio ST per PLC

    15/09/2023 - oregon ha scritto:


    Tutto questo però non ha più nulla a che vedere con il CASE …

    Perdona la mia ignoranza ma..perchè?

    Se io devo vincolare l'accensione o meno l'aria condizionata in base alla temperatura e al numero del giorno della settimana, perchè non posso prenderlo in automatico e quindi verificare se sussistono le condizioni per accendere e spegnere? 

    Con il case avrei in base al numero esegui le funzioni o meno….o ne ho capito male io la funzionalità?

Devi accedere o registrarti per scrivere nel forum
15 risposte