Vai al contenuto
PLC Forum


Step7 E I Salti


lucios

Messaggi consigliati

Dovrei pensare una FB che all'interno deve fare in un paio di punti un calcolo di parità (CRC) su un array di dati in input.

Il modo migliore sarebbe di creare un'altra FB che esegue il calcolo e richiamarla quando serve all'interno della FB principale.

Per motivi di praticità però vorrei fare tutto all'interno della FB (vorrei distribuire solo 1 FB), quindi ho pensato di fare un segmento (con una label apposita) in cui mettere la logichina di calcolo e di fare i jump dove mi serve.

Ma come caspita si fa a ritornare al blocco successivo al salto alla suddetta "subroutine"?

In altre parole: esiste un'istruzione di salto ad una etichetta con ritorno? Io non l'ho trovata.

P.S.

A corollario di quanto sopra: cercando appunto l'istruzione desiderata ho fatto una rilettura delle istruzioni AWL e mi è venuta la seguente domanda:

Che differenza c'è tra le istruzioni BE e BEA? Sul manuale, se non vado errato, sono descritte nello stesso identico modo..... :blink: :blink:

Ciao a tutti e grazie

Link al commento
Condividi su altri siti


esiste un'istruzione di salto ad una etichetta con ritorno?

No, non mi risulta esistere: potresti utilizzare l'istruzione LOOP con qualche accorgimento (per es. accumulatore caricato a 1) perchè il ritorno venga effettuato una volta sola, oppure un'altra istruzione di salto condizionato;

Che differenza c'è tra le istruzioni BE e BEA? Sul manuale, se non vado errato, sono descritte nello stesso identico modo.....

Infatti il manuale dice:

Per quanto riguarda

l'hardware S7, l'operazione BE offre la medesima funzionalità dell'operazione BEA.

Link al commento
Condividi su altri siti

potresti utilizzare l'istruzione LOOP con qualche accorgimento (per es. accumulatore caricato a 1)

Ciao busanela,

scusa ma non ho capito. Io vorrei saltare da più punti ad una stessa etichetta e ritornare all'istruzione successiva.

Ho pensato di caricare una variabile ad un valore diverso per ogni salto e, alla fine della subroutine, interrogarla per selezionare il ritorno, ma mi sembra una soluzione un po macchinosa....

Link al commento
Condividi su altri siti

Io vorrei saltare da più punti ad una stessa etichetta e ritornare all'istruzione successiva

In questo caso, l'unico sistema che mi viene in mente al momento, è un salto condizionato ad un FB invece che ad una etichetta ...

Link al commento
Condividi su altri siti

Il salto jump non è una call con return. Solo i linguaggi compilati offrono delle soluzioni simili a cosa chiedi tu, (ma molto tra parentesi; nel senso che talune volte è il copilatore che decide se far edelle call, o usare dei salti parametrizzati. Neanche il programmatore).

Ma, per tornare al tuo quesito, se vuoi fare una unica FB, che però contine delle parti di codice comune, o ripeti il codice, o, prima di fare il salto, regoli una variabili che indicizzerà un successivo salto di ritorno, usando, mnemonico tedesco, SPN ed SPL. (Che mi sembra una gran schifezza).

Link al commento
Condividi su altri siti

Io rivedrei la decisione di distribuire una sola FB (FB o FC?).

Il modo più logico, più semplice e più funzionale per risolvere il tuo problema è il richiamo di un'altra funzione.

Non credo ti valga la pena complicare il codice per ricrearti una specie di istruzione "return", solo per evitare di distribuire una FB (FB o FC?) in più.

Link al commento
Condividi su altri siti

Innanzitutto grazie per le risposte, comunque:

o ripeti il codice

Ci ho pensato ma è un modo di programmare veramente brutto.

regoli una variabili che indicizzerà un successivo salto di ritorno, usando, mnemonico tedesco, SPN ed SPL. (Che mi sembra una gran schifezza)

Schifezza per schifezza.....

Non credo ti valga la pena complicare il codice per ricrearti una specie di istruzione "return", solo per evitare di distribuire una FB (FB o FC?) in più

Hai ragione ma, essendo io abituato a programmare con linguaggi un pò più "evoluti", ho l'abitudine di fare largo uso di funzioni riutilizzate più volte e, in questo caso, non trattandosi di un progetto di automazione completo ma di un pacchetto software da fornire assieme a dell'hardware, che dovrà essere installato all'interno di progetti fatti da altri (non so come), è sicuramente più bello fornire una singola FB che il progettista di automazione potrà inserire nel proprio progetto senza ulteriori complicazioni.

Link al commento
Condividi su altri siti

Io rivedrei la decisione di distribuire una sola FB (FB o FC?).

Quoto in toto!

...una singola FB che il progettista di automazione potrà inserire nel proprio progetto senza ulteriori complicazioni.

Anche una FC (o magari un OB) con funzioni "simil main" che richiami alcuni FC può essere inserita, senza grandi complicazioni, in un altro progetto.

Link al commento
Condividi su altri siti

è sicuramente più bello fornire una singola FB che il progettista di automazione potrà inserire nel proprio progetto senza ulteriori complicazioni.

La decisione è tua, ma io non vedo così grave fornire due funzioni anziché una.

Se proprio vuoi fornire un unico file, puoi creare un unico sorgente da consegnare al cliente. Sorgente che, una volta compilato, genera le due funzioni.

Oppure potresti fare una biblioteca (così le chiama Siemens in italiano, ma sarebbe più corretto definirla libreria) di Step7 contenente le due funzioni. Una volta zippata la biblioteca occupa al massimo qualche decina di kB.

Il cliente può così importare i blocchi che gli servono dalla biblioteca.

Se il cliente deve solo utilizzare i blocchi senza però poterli modificare, potresti compilare le funzioni con l'istruzione "KNOW_HOW_PROTECT" prima di inserirle nella biblioteca.

Il cliente si troverebbe nella biblioteca i due blocchi con il simbolo del lucchetto.

Link al commento
Condividi su altri siti

La decisione è tua, ma io non vedo così grave fornire due funzioni anziché una

Ok, anche se devo dire che andando avanti nello studio ho visto che avrò bisogno di qualche altra funzione, quindi le FB (FC) diventeranno 4 o 5.

Grazie

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...