Buonasera a tutti gli utenti del forum,
Mi sorge l'esigenza di creare una libreria in Codesys,
o meglio, fin ora quando mi era capitato di creare librerie su questo software, ingressi e uscite
facevano parte della stessa POU o al massimo interagivano con una function block.
Dichiarando nel PRG VAR_INPUT, VAR_OUTPUT e salvando il tutto con formato .lib
potevo utilizzare ed esportare il mio programma in qualsiasi progetto.
Adesso devo fare una cosa un po' più complessa:
all'interno di un project funzionante abbastanza complesso ( per semplicità chiamiamolo con "progetto con tante POU") devo creare una libreria che mi racchiuda tutto il sistema e utilizzare qualche ingresso e uscita che non fanno parte tutti necessariamente della stessa POU.
Da qui la mia idea:
Creare una POU che grazie a dei MOVE vada a scrivere gli ingressi o leggere le uscite.
Mi spiego meglio:
Se A è un ingresso del sistema che a me interessa creo una variabile Pippo nella POU creata che con un MOVE va a scrivere il risultato su A.
Questa cosa la facevo con tutti gli ingressi e uscite che mi interessavano (ovviamente per le uscite vale il contrario, la variabile di interesse va a scrivere il PIPPO di turno).
Salvando poi tutto come libreria andavo a utilizzare solo la POU creata che poi speravo dialogava con il resto dell'intero sistema.
Salvando come file project questa cosa funziona perfettamente, ma come libreria proprio non vuole andare....
non sono un esperto e quindi non so dove sbaglio.
Se qualcuno ha capito il problema sarò lieto di ascoltare o di spiegare meglio se non sono stato chiaro.
Grazie
How to?: Creare una libreria in Codesys
Moderatori:
dimaios,
carlomariamanenti
23 messaggi
• Pagina 1 di 3 • 1, 2, 3
4
voti
Un blocco o funzione di libreria non deve MAI fare riferimento ad oggetti assoluti del programma, ma avere ingressi ed uscite, o strutture complesse da riempire sempre con gli I/O, per essere interfacciata poi al programma utente.
Il blocco o funzione di libreria deve essere SEMPRE pensato ad un livello superiore ed estraneo agli oggetti del proprio programma. Altrimenti, non si trata di una libreria, ma di una raccolta di funzioni standardizzate, ma sempre di solo uso personale.
Guarda un poco, in giro per il mondo, se tra CoDeSys, C, C#, C++, J++, ecc, trovi librerie che fanno riferimento ad oggetti statici del programma?
La tua è una richiesta errata, figlia di errata programmazione.
Il blocco o funzione di libreria deve essere SEMPRE pensato ad un livello superiore ed estraneo agli oggetti del proprio programma. Altrimenti, non si trata di una libreria, ma di una raccolta di funzioni standardizzate, ma sempre di solo uso personale.
Guarda un poco, in giro per il mondo, se tra CoDeSys, C, C#, C++, J++, ecc, trovi librerie che fanno riferimento ad oggetti statici del programma?
La tua è una richiesta errata, figlia di errata programmazione.
-

Candy
32,5k 7 10 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 10123
- Iscritto il: 14 giu 2010, 22:54
0
voti
Grazie per la risposta,
purtroppo da utente poco esperto non ho capito la risposta (evidentemente mi mancano delle basi come ricordavi tu).
Nella fattispecie non ho capito il perché se utilizzo una sola POU dichiarando I/O il sistema funziona mentre se sono più di una le POU "non parlano".
purtroppo da utente poco esperto non ho capito la risposta (evidentemente mi mancano delle basi come ricordavi tu).
Nella fattispecie non ho capito il perché se utilizzo una sola POU dichiarando I/O il sistema funziona mentre se sono più di una le POU "non parlano".
3
voti
Non so cosa dirti di più, rispetto alla narrativa di cui è piena la rete, su come si programma.
Aggiungo un esempio di materiale CoDeSys mio, magari ti aiuta in qualche modo:
Sorgente di libreria:
Punto di applicazione nel programma:
Aggiungo un esempio di materiale CoDeSys mio, magari ti aiuta in qualche modo:
Sorgente di libreria:
- Codice: Seleziona tutto
FUNCTION_BLOCK FB_FaultHorn
VAR_INPUT
bIset : BOOL;
bIack : BOOL;
tIworkTime : TIME;
tIpauseTime : TIME;
END_VAR
VAR_OUTPUT
bLout : BOOL ;
END_VAR
var
bLpeSet : BOOL;
bLset : BOOL;
tLaccu1 : TIME ;
END_VAR
IF bIset THEN
IF NOT bLpeSet THEN
bLset := TRUE;
bLpeSet := TRUE;
bLout := TRUE;
END_IF;
ELSE
bLpeSet := FALSE;
bLset := FALSE;
END_IF;
IF bIack THEN
bLset := FALSE;
END_IF;
IF NOT bLset THEN
tLaccu1 := F_mSec(t#0ms);
bLout := FALSE;
ELSE
IF bLout THEN
IF F_mSec(tLaccu1) > tIworkTime THEN
tLaccu1 := F_mSec(t#0ms);
bLout := FALSE;
END_IF;
ELSE
IF F_mSec(tLaccu1) > tIpauseTime THEN
tLaccu1 := F_mSec(t#0ms);
bLout := TRUE;
END_IF;
END_IF;
END_IF;
Punto di applicazione nel programma:
-

Candy
32,5k 7 10 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 10123
- Iscritto il: 14 giu 2010, 22:54
0
voti
So creare una function block semplice ed utilizzarla, a me è stato chiesto una cosa differente:
Dato un programma articolato, chiuderlo su una libreria così ad un utente esterno appare come una grande macro con soli ingressi e uscite.
Mi chiedevo se sia possibile dato che non ci riesco.
Dato un programma articolato, chiuderlo su una libreria così ad un utente esterno appare come una grande macro con soli ingressi e uscite.
Mi chiedevo se sia possibile dato che non ci riesco.
1
voti
Cosa cambia tra funzione "piccola" e "grande"? Direi nulla. Poi, in verità, io ristrutturerei il problema in più blocchi, spiacializzati ciascuno per uno scopo, tanto per non avere un bloccone unico gigante, difficile da gestire.
Immagina ad esempio un blocco con una ventina e più di I/O e gestirlo in strutturato... Proprio brutto a vedersi.
Piuttosto fai una o più strutture, tematiche, da passare al super blocco, e poi colleghi gli I/O nel programma, esternamente al punto di richiamo, che è un poco più elegante da vedesri e facile da programmare.
Immagina ad esempio un blocco con una ventina e più di I/O e gestirlo in strutturato... Proprio brutto a vedersi.
Piuttosto fai una o più strutture, tematiche, da passare al super blocco, e poi colleghi gli I/O nel programma, esternamente al punto di richiamo, che è un poco più elegante da vedesri e facile da programmare.
-

Candy
32,5k 7 10 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 10123
- Iscritto il: 14 giu 2010, 22:54
0
voti
Candy ha scritto:Cosa cambia tra funzione "piccola" e "grande"? Direi nulla(...)
Piuttosto fai una o più strutture, tematiche (...)
Cambia, prova a creare una POU che date due variabili a e b le somma e il risultato lo mette in c (globale).
Poi crea un'altra POU che utilizza c e lo somma a d e il risultato finale lo metti in una variabile chiamata e.
Se simuli tutto ovviamente funziona.
Se voglio creare invece una libreria che abbia come ingressi a, b, d e come uscita abbia e come devo fare?
Ovviamente la soluzione banale di usare una function block non vale, questo esempio è solo una semplificazione del mio sistema complesso.
2
voti
Cosa significa creare una POU? Puoi creare un programma, una funzione, un blocco funzione. POU è l'insieme di tutte le risorse del sistema!
Come ti ho già detto questo è un errore. Se scrivi una funzione di libreria, il risultato della funzione o è una uscita, o è un elemento di una strutura di uscita, (ma anche InOut), o è locale ed a perdere dopo la return della funzione. NON è certamente globale del progetto. Sarebbe/è un grave errore di programmazione.
Se devi far euna funzione o blocco complesso che, durante l'elaborazione ti ristetituisca anche dei passaggi intermedi, per vederli, per processarli, fai tu, come ti è stato detto, li appoggerai su variabili temporanee, su strutture, su cosa vorrai, e le porterai fuori, prima della return, sulle variabili di destinazione.
E' un brutto modo di programmare, ma non impossibile.
Per limitare il numero delle singole variabili di I/O, usa delle strutture, organizzate magari per marco funzioni.
il risultato lo mette in c (globale)
Come ti ho già detto questo è un errore. Se scrivi una funzione di libreria, il risultato della funzione o è una uscita, o è un elemento di una strutura di uscita, (ma anche InOut), o è locale ed a perdere dopo la return della funzione. NON è certamente globale del progetto. Sarebbe/è un grave errore di programmazione.
Se devi far euna funzione o blocco complesso che, durante l'elaborazione ti ristetituisca anche dei passaggi intermedi, per vederli, per processarli, fai tu, come ti è stato detto, li appoggerai su variabili temporanee, su strutture, su cosa vorrai, e le porterai fuori, prima della return, sulle variabili di destinazione.
E' un brutto modo di programmare, ma non impossibile.
Per limitare il numero delle singole variabili di I/O, usa delle strutture, organizzate magari per marco funzioni.
-

Candy
32,5k 7 10 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 10123
- Iscritto il: 14 giu 2010, 22:54
23 messaggi
• Pagina 1 di 3 • 1, 2, 3
Torna a Automazione industriale ed azionamenti
Chi c’è in linea
Visitano il forum: Nessuno e 1 ospite

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

