Vai al contenuto
PLC Forum


Come Lavorare Con La Tabella Delle Variabili S7 - le variabili dei blocchi di codice


Messaggi consigliati

francescotiziano
Inserito:

ciao vorrei cercare di capire ma non riesco come nei blocchi di codice

delle cpu s7 siemens la tabella delle variabili del blocco si interconnetta

con il programma editato

grazie a tutti .. :(


Inserita:

Non ho capito tanto bene cosa intendi per "tabella delle variabili del blocco", comunque proviamo.

Se intendi quella tabella che puoi creare nella cartella Blocchi che di default si chiamano VAT_xx, allora questa è una tabella che serve a monitorare e forzare operandi nella CPU quando sei online. Scrivi gli operandi desiderati E, A, M, DB, ecc poi se premi il tasto "occhiali", vedi i valori attuali. Se scrivi dei valori nella colonna "valori di comando" e premi il tasto "lampo", vai a scrivere quei valori negli operandi corrispondenti.

Se intendi la tabella in testa ad ogni blocco,

Li puoi assegnare delle variabili di 4 tipi: TEMP, IN, OUT, IN/OUT.

-TEMP sono variabili locali che puoi utilizzare solo all'interno di quel blocco, al termine del quale, vengono perse.

-IN, OUT, IN/OUT sono variabili che usi all'interno del blocco e che prendono il valore dell'operando assegnato al momento del richiamo del blocco. Serve se hai una funzione ripetitiva, richiami il blocco piu volte cambiando solo gli operandi.

Spero di essere stato abbastanza chiaro.

francescotiziano
Inserita:

scusami sdi non essere stato abbastanza chiaro in primis e' proprio la tabella che si trova sopra ogni blocco che no riesco a capire come e' in connessione col programma quando ce' un richiamo cosa succede

grazie floppydisco

Inserita: (modificato)

La tabella che sta sopra , ai corsi siemens la chiamano tendina dei parametri, la chiamo cosi anche io quando faccio i corsi dove sono l'istruttore.

E' una tabella dove puoi inserire variaili locali , ossia valide solo nel blocco dove sono usate .

Non mantengono i valori , cio vuol dire che alla fine del blocco vengono distrutte e rigenerate all'inizio.

Queste variabili sono le cosi chiamate temporanee , dichiarabili sotto la voce temp.

Poi ci sono le In , OUT , IN- OUT che fanno parte sempre dello stack e servono per copiare o meglio dire

fare da immagine per le variabili appaoggiate dall'esterno quando il blocco viene richiamato .

in breve , se prendi un FC o FB , questo puo avere due significati "informatici "

1- essere una subroutine

2-essere una funzione

COme ben saprai , sia in visual basic che in C o altri linguaggi , quando crei una funzione devi dichiarare dei parametri di ingresso , e anche di uscita .

Quelli in ingresso sono solamente letti e non puoi sovrascriverli , mentre quelli di out sono solo scrivibili

I parametri che passi dall'esterno sono copiati e non midficati dalla funzione

I parametri invece IN-OUT possono essere letti e scritti dalla funzione e dall'esterno quindi modificati , se la funzione li modifica ovviamente .

Anche se graficamente non si vede , i parametri IN-OUT sono passati per riferimento (in C sarebbe &variabile dove passi il puntatore alla variabile e cioe il suo indirizzo in RAM)

I concetti di programmazione alla fine "son sempre quelli " che siano elettronici (plc e micro ) o informatici (pc) .

Per tornare alla tua domanda , quella tabella che trovi sopra al blocco , che talvolta e' sempre bassa e rompe le palle serve per dichiarare i parametri dell'FC , che non si chiamera ' funzione , bensi' FC parametrizzato .

Spero di esser stato chiaro

ciao

walter

Modificato: da walterword
francescotiziano
Inserita:

si ma come attribuisco una variabile del blocco ad un ingresso reale del plc mi spiego

se io programmo con il nome della variabile IN tipo di dati BOOL a quale ingresso fisico del plc mi riferisco???

Inserita:

a nessuno

ti ho gia spiegato sopra che quelle sono variabili dello stack , non hanno un indirizzo come gli I/O o

i merker o i db

tu crei una funzione con le variabili interne ad essa

Poi , quando la richiami le ti chiedera' i parametri , e se ci vai sopra col puntatore del mouse

ti dira' anche il tipo di dato

A questo punto gli passerai la variabile , che se e' un INT puo passargli una MWxx , dichiarata

nell tabella dei simboli con INT e non come WORD seno' non te la prende , e' siemens ....

Cioe l' FC parametrizzato lo puoi richiamare da un altro blocco di codice che sia FC o FB oppure nel'OB1

per esempio , la scegli nel catalogo delle librerie del progetto

ciao

walter

francescotiziano
Inserita:

una qualunque dichiarata nella tabella dei simboli come int

grazie

francesco..

Inserita: (modificato)

fai un progettino con ob1 e poi crei fc1

entri in fc1 , vai nella tabella delle variabili , clicchi su IN e dai il nome simbolico e poi il tipo (INT)

Salvi e carichi .

Vai in OB1 e digiti

call FC1 e a questo punto step 7 ti propone i paramentri , devrebbe anche proporti ret_val come uscita che sarebbe il risultato della funzione , per defult .

Al parametro gli passi mw10 dichiarata come int , e al ret val mw 12 sempre come int oppure una temp

dell'ob1 ,aggiunta nella tabella in ob 1 sotto a quelli che gi ati passa il sistema operativo

Per richiamare un fc senza parametri puoi usare

UC FC1 , senza parametri significa unconditioned call e vuol dire che viene chiamata

indipendentemente dall'rlc , anche se vale 0

CC FC1 senza parametri che significa conditioned call , e vuol dire che viene richiamata quando

l'rlc e'=1

CC e' come UC senza che pero metti il salto per renderla condizionata

se invece hai i parametri scrivi CALL FC1 ed in automatico ti verranno proposti i parametri

......

UC FC1 , senza parametri e senza condizioni

...

...

u m0.0 , senza parametri ma con condizio ne di richiamo

CC FC1

...

...

CALL FC1 ,con parametri senza condizioni di richiamo

par1:=tua variabile

ret_val:=#ret_val

...

u m0.0

spbn salt

CALL FC1 ,on parametri con condizione di richiamo

par1:=tua variabile

ret_val:=#ret_val

salt: nop 0

fratellino , questi post sono una giornata di corso , spero che tu li abbia capiti perche diversamente non saprei come spiegarteli , e' chiaro che con davanti lo step 7 tutto torna subito facile ed intuibile

ciao

walter

p.s. dimenticavo ..... salva l'OB 1 e caricalo dopo aver caricato l'FC1 , seno' il sistema operativo chiamera l'ob degli errori di programmazione che non essendoci ti mandera' in stop la cpu

Modificato: da walterword
francescotiziano
Inserita:

ti ringrazio per la tuo coinvolgimento al mio non conoscere

grazie di cuore

cioa francesco..

Inserita: (modificato)

Per concludere , a tabella delle variabili e' un'altra cosa , la VAT

E' un oggetto che si crea, si aggiungono fiumi di variabili e lei ti da lo stato a fine ciclo di scansione

hai fatto le prove?

puoi anche farle senza caricare il plc , vedi il risultato lo stesso

...prego ;)

Modificato: da walterword
francescotiziano
Inserita:

ciao walter sfogliando nel mio pg ho trovato un programma delle macchine twin controllo numerico 840d della siemens me lo trovo perche' tempo addietro ho fatto il manutentore di quelle macchine e guardando un blocco mi sono accorto che nella tendine delle variabili i nomi di variabile erano solo degli aut e rifacendomi al tuo esempio ho aperto ob1 e i nomi erano proprio li' come set o ingressi adesso credo di aver capito correggimi se sbaglio ma sono appoggi di memoria nel blocco stesso? grazie

francesco

Inserita:

fra ,

sono variabili locali "prese " dallo stack di memoria .

Ti faccio un esempio in C

void my_func (int par1)

{

int b;

b=par1;

}

....

my_func(3);

il parametro chiesot in ingresso par1 e' come la variabile IN del blocco FC parametrizzato

ciao

walter

Inserita: (modificato)

quanto vale b ?

b poteva essere anche globale come una MWx .

par1 che indirizzo ha?

avra un indirizzo di sicuro ma non ti interessa , sara' sicuramente un registro della cpu ,

ma nemmeno questo ti interessa .

my_func (int par1) e' la tua FC parametrizzata e par1 e' il tuo parametro IN , intero ,chiamato par1

nella tua tendina delle variabili .

dove vale par1 ? vale al di fuori della funzione my_func(...) ?

NO !!! , vale solo li dentro , lo stesso per le variabili IN e OUT e temp

Le variabili IN-OUT anche valgono solo li , ma hanno il "potere" di leggere e scrivere

la variabile che appoggi "dal di fuori " nel momento del richiamo .

In C sarebbe :

void my_func (int *par1)

{

*par1=100;

}

...

...

...

my_func(&mia_var);

Il concetto e' questo , adesso dimmi che non conosci nemmeno un pochino il C , che lo so io che ho fatto

l'elettricista fino a 6 anni fa e sono un elettrotecnico .

Domani dovrei avere tempo e ti scrivo qua sul post una sorgente awl , compilabile in blocco FC .

Nel tuo progetto aggiungerai una sorgente nella cartella sorgenti , copierai quello che ti posto io ,

salvi e compili .

da OB1 scriverai call FC1 e vedi cosa succede e poi ci giochi un po , facendo delle prove nella sorgente o nel blocco FC1 direttamente .

Proverai a scrivere una variabile IN e vedrai che ti dira' che non si puo , ect ect

ciao

Modificato: da walterword
Inserita:

FUNCTION FC 15 : VOID

TITLE =

VERSION : 0.1

VAR_INPUT

add1 : INT ; //addendo 1

add2 : INT ; //addendo 2

END_VAR

VAR_OUTPUT

ris : INT ; //risultato

END_VAR

BEGIN

NETWORK

TITLE =somma addendo passati come IN

L #add1;

L #add2;

+I ;

T #ris;

END_FUNCTION

/////////////////////////////////////////////////////////////////////////////////////////////////////////

copia ed incolla nella tua sorgente fino a end_function

poi salva e compila e vedrai comparire nella lista dei blocchi il nuovo FC1

Apri OB1 e scrivi call FC1 e premi invio

Crei 3 variabili dichiarate come int nella tabella dei simboli oppure in un db

e le passi ad FC1

carichi tutto e provi se hai il simulatore oppure il plc

ciao

walter

p.s. poi vai nel FC1 compilato e vai a vedere nella tendina come sono dichiarati

francesco piu di cosi .......

cerca di non dirmi che non hai capito perche ' seno '............ ;)

francescotiziano
Inserita:

ciao walter

ho compilato il file sorgente come tu mi hai illustrato tutto ok ho salvato il file ,ma in lista blocchi non mi e' comparso l'fc15

ancora una cosa ti chiedo e se io volessi usare una variabile di un blocco dati dichiarata come INT lo posso fere?

Inserita:
ho compilato il file sorgente come tu mi hai illustrato tutto ok ho salvato il file ,ma in lista blocchi non mi e' comparso l'fc15

La compilazione viene portata a termine o vengono segnalati errori? Io ho provato e funziona.

ancora una cosa ti chiedo e se io volessi usare una variabile di un blocco dati dichiarata come INT lo posso fere?

Non ho capito dove vuoi usare la variabile del blocco dati. Se intendi dichiararla direttamente nella tendina, la risposta è no, a meno che non si tratti di una FB e del suo DB di istanza. Qui però le cose si complicano un pò. Meglio procedere per passi.

Se invece intendi passare il dato alla FC, allora la risposta è sì.

Esempio:

      CALL  FC    15
       add1:=DB100.DBW0
       add2:=DB100.DBW2
       ris :=DB100.DBW4

I parametri IN, OUT ed IN-OUT servono proprio per questo.

Inserita:

francesco per prima cosa quando compili una sprgente deve comparire nella lista blocchi .

Puoi passare un int se la funzione , o meglio FC parametrizzato , lo richiede un INT

E' chiaro che se l'FC vuole un DINT o un REAL devi passare un DINT o un REAL

Francesco . io non riescoa capire dove trovi ancora il problema

Adesso ti posto una funzione simile alla precedente ma dove richiede un parametro

par1 intero come IN , un parametro intero come DINT in IN-OUT lo controlla che non sia

fuori di un certo range , fa la somma dopo aver "trasformato " l'intero in doppio intero e ti restituisce

un REALE .

Farai le stesse manovre di compilarlo e quando lo avrai visto nella lista blocchi lo richiamerai da ob1 per esempio .

ORGANIZATION_BLOCK OB 1

TITLE = "Main Program Sweep (Cycle)"

VERSION : 0.1

VAR_TEMP

OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)

OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)

OB1_PRIORITY : BYTE ; //Priority of OB Execution

OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)

OB1_RESERVED_1 : BYTE ; //Reserved for system

OB1_RESERVED_2 : BYTE ; //Reserved for system

OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)

OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)

OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)

OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started

END_VAR

BEGIN

NETWORK

TITLE =

CALL FC 2 (

par1 := DB2.DBW 0,

ris := DB2.DBD 6,

par2 := DB2.DBD 2);

END_ORGANIZATION_BLOCK

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

FUNCTION FC 2 : VOID

TITLE =

VERSION : 0.1

VAR_INPUT

par1 : INT ;

END_VAR

VAR_OUTPUT

ris : REAL ;

END_VAR

VAR_IN_OUT

par2 : DINT ;

END_VAR

BEGIN

NETWORK

TITLE =

U( ;

L #par2;

L L#100;

>D ;

) ;

SPBN salt;

L L#100;

T #par2;

salt: NOP 0;

L #par1;

ITD ;

L #par2;

+D ;

DTR ;

T #ris;

END_FUNCTION

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

DATA_BLOCK DB 2

TITLE =

VERSION : 0.1

STRUCT

var1 : INT ;

var2 : DINT ;

va3 : REAL ;

END_STRUCT ;

BEGIN

var1 := 0;

var2 := L#0;

va3 := 0.000000e+000;

END_DATA_BLOCK

DATA_BLOCK DB 2

TITLE =

VERSION : 0.1

STRUCT

var1 : INT ;

var2 : DINT ;

va3 : REAL ;

END_STRUCT ;

BEGIN

var1 := 0;

var2 := L#0;

va3 := 0.000000e+000;

END_DATA_BLOCK

///////////////////////////////////////////////////////////////////////////////////////////////////

Allora hai OB1 , FC2 e DB2

Compilali tutti e prova.

In OB1 puo andare online -tasto dx e comandare le variabili forzandole ai valori desiderati , oppure

sotto nella tab page comanda , oppure crei una VAT e li forzi da li

poi ti mando la fattura ok ?

:)

francescotiziano
Inserita:

ciao walter

come faccio ad assegnare un dato ad (add1)????

lo devo riprendere in questo modo

esempio

L mw 0 //prima word

L mw 6 //seconda word

*I

T #add1

tutto questo fatto nella fc 15

o forse non e' possibile perche (add1) e' un parametro IN e no e' un AUT

ancora ciao

come sempre disponibile, grazie.

resto in attesa della parcella, mi raccomando a te come sempre ..

francesco

Inserita:

Una cosa non mi è chiara: hai provato a scrivere, all'interno di una FC che non sia FC15 quanto segue:

CALL FC15

Fatto questo ti apparirà:

      CALL  FC    15
       add1:=
       add2:=
       ris :=
Con le righe add1, add2 e ris evidenziate in rosso. Se posizioni il cursore su "add1" ti verrà segnalato che è richiesto un parametro in ingresso di tipo INT. Lo stesso per "add2". "ris" è invece un parametro in uscita, sempre di tipo INT. Ad "add1" e "add2" puoi assegnare quindi qualsiasi variabile INT oppure direttamente un valore, sempre in formato INT. Il valore "ris" verrà scritto nella variabile INT che assocerai a questo parametro in uscita. Esempio:
      CALL  FC    15
       add1:=MW100
       add2:=MW102
       ris :=MW104
Somma il valore di MW100 al valore di MW102 e metti il risultato in MW104

Oppure:
      CALL  FC    15
       add1:=5000
       add2:=200
       ris :=DB10.DBW0
Somma 5000 + 200 e metti il risultato in DB10.DBW0

Tu puoi richiamare nel programma la FC15 varie volte, ogni volta passando parametri diversi.

Forse ho capito male ma mi sembra che tu stia cercando di passare il valore ai parametri di FC15 dall'interno di FC15 stessa.

Prova a postare un esempio e vediamo se riusciamo a capire meglio qual è il problema.

Inserita:

hai due parametri in ingresso che giustamente devi assegnare.

Puoi farlo cosi :

L 10

T DB2.DBW0

oppure come ti ho detto sopra puoi FORZARLO da vat oppure in modalita' online

Ma raga' leggete i post o cosa ? <_<

Francesco io credevo che qualcosa di step 7 la sapevi , ma se non sai nemmeno come assegnare un

valore ad una variabile , scusa se te lo dico ,e' prematura saper scrivere una funzione parametrizzata .

Impara prima pe cose basilari e semplici

:(:(

Inserita: (modificato)

francesco , invece di passare alla FC parametrizzata delle variabili

passa delle costanti , per esempio 10 per l'intero , L#100 per il doppio intero .

Per i doppi interi , quando assegni un valore devi fare

L L#20

T miodoppiointero

L# serve per avvisare il registro delll'accumulatore ACCU1 che dovra caricare a 32 bit.

FRANCESCOOOOOOOOOOOOOOOOOOO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

dai che e' facile ....ca**o !!!!!

Modificato: da walterword
francescotiziano
Inserita:

ciao walter

adesso mi e' tutto cristallino

mi devi scusare se ti ho dato filo da torcere nel senso che non ho compreso sin dai primi tuoi messaggi quello che volevo sapere, ti chiedo ancora le mie scuse e non so' davvero se un semplice grazie possa bastare per il tuo interesse al mio problema .

grazie !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Francesco

Inserita: (modificato)

non ti devi scusare

l'importante e' che hai capito

Hai capito allora si o no ?

:D

p.s. per il grazie non c'e' problema , l'importante e' che continui a frequentare il forum

e quando saprai di piu aiuterai il prossimo , ma non come fa il 95% degli iscritti che

si fa sentire solo quando ha bisogno e basta

E' chiaro ?

Modificato: da walterword
francescotiziano
Inserita:

ciao walter

ho papito, e tutto questo grazie alla tua gentilezza e a questo forum

che e' magnifico davvero grazie a tutti.......

non ce' ombrea di dubbio che continuero'a frequentare il forum e un giorno quado saro in grado di poter dare un aiuto, anzi tutta la mia esperienza lo faro' con grande piacere e tanta voglia di rende la vita piu' facile a chi ha come me bisogno del vostro aiuto grazie

saro' sempre con voi .....

Francesco

Inserita:

va be per sempre magari e' esagerato

facciamo .... ognitanto eh ?

B)

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...