Vai al contenuto
PLC Forum


parere su funzione per smistare i bit di un telegramma


coquinati

Messaggi consigliati

salve e buona domenica,

per verificare l'ingressi e controllare le uscite su plc s7-300 di una CU305 ho scelto il telegramma di siemens n394 . 

il telegramma è formato nella seguente maniera:

                           TELEGRAMMA 394

---------|----------------------------------------------|

PZD1  |  CU_STW1          |  CU_ZSW1     |

PZD2  |A_DIGITAL           | E_DIGITAL     |

PZD3  |A_DIGITAL_1       |E_DIGITAL_1  |

---------|---------------------------------------------|

 

le parole che a me interessano e  devo scrivere nella mia funzione della cu sono le PZD2/3, ho dovuto prestare un po di attenzione riguardo le parole i byte della E_DIGITAL perchè si usano solo i primi 4 bit (da 0-4) gli altri 4 sono usati dal sistema siemens in parole povere acquisiscono il grado di riservati.

detto ciò prendiamo in esempio la parola "E_DIGITAL" riesco a leggere 8 ingressi, i primi 4 ingressi della morsettiera  X132 ( bit:0.0-0.4, ) e i 4 della morsettiera X133 ( bit:1.0-1.4 ).

per smistarli nei merker del plc ho creato questa funzione :

      AUF   DI     1                    //apro il blocco dati di instanza cu 305
      LAR1  P##LETTURA_DP             // imposto il registro AR  a puntarmi nella lettura profibus dP
      LAR2  P##x133_0                   //indirizzo morsettiera da assegnare lo stato

      L     4                           // 4 loop ---->4 ingressi da ASSEGNARE 
next: T     #inloop
      U     E [AR1,P#0.0]               // interrogo l'ingresso ricevuto tramite PROFI DP
      =     A [AR1,P#0.0]               //assegno l'uscita ricevuto tramite PROFI DP
      +AR1  P#0.1                       // sommo un bit nel registro ar1
      +AR2  P#0.1                       //sommo un bit nel registro ar 2
      LOOP  next
      +AR1  P#0.4                       //completo il byte e ar1 passa al byte successivo 

dove :

#inloop è assegnata ad una variabile TEMP

#LETTURA_DP è la doble word cioè E_DIGITAL + E_DIGITAL_1 per puntarlo ho scritto (p#dix 10.0)

#X133_0  è l'indirizzo iniziale impostata in out nella funzione proseguirà con _1 _2 _3

 

questa funzione fa si che l'indirizzo si incrementa automaticamente ad ogni loop e mi scrive l'indirizzo su ogni uscita .

devo ancora provarla però, secondo voi come logica può andare ?

inoltre mi chiedevo se in questo punto  ho impostato i puntatori in maniera corretta:


      U     E [AR1,P#0.0]               // interrogo l'ingresso ricevuto tramite PROFI DP
      =     A [AR1,P#0.0]               //assegno l'uscita ricevuto tramite PROFI DP

E: interroga gli ingressi mentre A assegna le uscite , ma non mi è molto chiara come storia, sono andato un po a intuizione . secondo voi esperti ?  

buona domenica

 

coquinati 

 

 

 

 

Modificato: da coquinati
Link al commento
Condividi su altri siti


ti complichi la vita in 2 modi. 

1-creando due discussioni diverse per lo stessa cosa

2- crei un db uguale al telegramma. forse ci sono già le udt scaricabili da internet. con le apposite funzioni (se usi s7 classico ci sono delle sfc) leggi dalla periferia e scrivi sul db. leggi dal db e scrivi sulla periferia. usi poi il db come meglio credi.

 

 https://www.automation.siemens.com/mc-app/sinamics-application-examples/Home/Index?language=en

 

in rete trovi già degli esempi fatti. forse non valgono per la tua cu ma alla fine sono tutti uguali

Link al commento
Condividi su altri siti

ok ragazzi.

grazie molte della risposta!

chiedo se un moderatore può unire le discussioni a questo punto.

comunque avevo già trovato un errore nel mio codice :

 U     E [AR1,P#0.0]               // interrogo l'ingresso ricevuto tramite PROFI DP
 =     A [AR1,P#0.0]               //assegno l'uscita ricevuto tramite PROFI DP

trovando una guida sui puntatori ho risolto cosi :
 

 U      [AR1,P#0.0]               // interrogo l'ingresso ricevuto tramite PROFI DP
 =      [AR1,P#0.0]               //assegno l'uscita ricevuto tramite PROFI DP

  

può andare sempre bene se si usano telegrammi impostasti dall'utente e non dA SIEMENS a mio parere

Link al commento
Condividi su altri siti

  • 2 weeks later...

Occhio che nell'UDT scaricabile da Siemens, quello del telegramma 111 c'è un errore, un bit scambiato o addirittura una word, non ricordo: al momento non ho tempo per verificare ma la cosa è nota, se ne parla anche qui, sebbene sia per un altro telegramma:
https://support.industry.siemens.com/tf/WW/en/posts/sinamics-telegram-library/111121?page=0&pageSize=10

E' meglio quindi verificare la struttura dell'UDT con la documentazione, prima dell'utilizzo. Per il resto, quoto anch'io Ken, uso abitualmente il sistema da lui suggerito (per PLC 1200/1500).

Link al commento
Condividi su altri siti

il 11/12/2018 at 08:00 , Cesare Nicola scrisse:

Occhio che nell'UDT scaricabile da Siemens, quello del telegramma 111 c'è un errore, un bit scambiato o addirittura una word, non ricordo: al momento non ho tempo per verificare ma la cosa è nota, se ne parla anche qui, sebbene sia per un altro telegramma:
https://support.industry.siemens.com/tf/WW/en/posts/sinamics-telegram-library/111121?page=0&pageSize=10

E' meglio quindi verificare la struttura dell'UDT con la documentazione, prima dell'utilizzo. Per il resto, quoto anch'io Ken, uso abitualmente il sistema da lui suggerito (per PLC 1200/1500).

 

grazie della info !

sinceramente per gestire 8 ingressi e 12 uscite mi sono servito del codice a puntatori ,vedo che funziona ! almeno nella prova simulata ... 

a parer mio gli  udt vanno bene quando lavori con telegrammi abbastanza complessi tipo quello da te descritto

Link al commento
Condividi su altri siti

il 14/12/2018 at 23:55 , coquinati scrisse:

gli  udt vanno bene quando lavori con telegrammi abbastanza complessi tipo quello da te descritto

Gli UDT sono gratis, non serve risparmiare sul loro utilizzo! 🙂 Scherzi a parte, io per comandare assi con CU320 mi sono creato più o meno uno standard che usa il telegramma 111: non c'è macchina complessa o macchina semplice, c'è un asse da muovere. Se nel telegramma 111 ci sono funzioni (e ce ne sono tante) che non mi servono, non le uso. Standardizzando, il vantaggio è che copio/incollo da un progetto all'altro i miei blocchi standard e so che funzioneranno, senza pormi la questione di quale telegramma utilizzare. Per i G120C, per esempio, leggo abitualmente anche la corrente, la coppia e la velocità motore: raramente mi servono, ma sono gratis, fatica zero, se non li uso non li associo a nessuna variabile e finita lì.

Link al commento
Condividi su altri siti

il 17/12/2018 at 08:59 , Cesare Nicola scrisse:

 (e ce ne sono tante) che non mi servono, non le uso. 

veramente ce ne sono moltissime  ... per me è il primo approccio con starter e con un protocollo profibus dp , se fossi un po più esperto non ci penserei due volte a crearmi un telegramma personalizzato ,(999) , io credo che con una massimo 2 pzd mi basta e avanza per gestire abilitazioni e warning/fault.

 

 

il 17/12/2018 at 08:59 , Cesare Nicola scrisse:

 Standardizzando, il vantaggio è che copio/incollo da un progetto all'altro i miei blocchi standard e so che funzioneranno, 

 io sto appunto pensando di creare una fb principale per gestire la comunicazione di base (rampe/abilitazioni principali/il profibus DP),poi in un altra FB fare la gestione dei dati che andranno a determinare il posizionamento  richiamando di nuovo la SFC14/15 in quest'ultima  , almeno penso che si possa fare.

Link al commento
Condividi su altri siti

  • 2 months later...

ciao ragazzi,

ripassando i puntatori e i registri AR in awl mi sono accorto di una cosa, a mio parere strana,  date le mie conoscenze vorrei limitarmi nel giudicare e chiedere a voi professionisti , vi illustro subito il codice (che è quello sopra descritto ) :
 

 

    U     #DPsinc_FAULT_read          // SE SFC14 in errore saltami la lettura 
      SPB   err1
      AUF   DI     1                    //apro il blocco dati di instanza cu 305
      LAR1  P##LETTURA_DP               // imposto il registro AR  a puntarmi nella lettura profibus 
      LAR2  P##x133_0                   //indirizzo morsettiera da assegnare lo stato

      L     4                           // 4 loop ---->4 ingressi da ASSEGNARE 
next: T     #inloop
      U     DIX [AR1,P#2.4]             // interrogo l'ingresso ricevuto tramite PROFI DP
      =     #x133_0                     //assegno l'uscita ricevuto tramite PROFI DP
      +AR1  P#0.1                       // sommo un bit nel registro ar1
      +AR2  P#0.1                       //sommo un bit nel registro ar 2
      LOOP  next
      +AR1  P#0.4                       //completo il byte e ar1 passa al byte successivo 

 

ecco come si può notare in LAR ho caricato l'indirizzo default  OUT della FB, nella nona riga di programma ho scritto come valore assoluto il codice :

 =     DIX [AR2,P#6.0] 

il valore p#6.0 e l'indirizzo da assegnare nel DB di istanza della FB

una volta che salvo si compila e risulta :

 

=     #x133_0  

fin qua è tutto corretto .

 

io ho pensato ad una cosa , se carico come default l'indirizzo x133 nel registro AR2 non dovrei semplicemente scrivere :

 

  =     DIX [AR2,P#0.0]  

se provo a fare cosi una volta che salvo come indirizzo simbolico mi compare la prima variabile del blocco dati:

 

  =     #PROFI_DP_EN                //assegno l'uscita ricevuto tramite PROFI DP

 

assurdità che funziona comunque , come è possibile questa cosa ?

 

Cordiali saluti

 

Coquinati

Modificato: da coquinati
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...