Vai al contenuto
PLC Forum


Istruzione FILL


Stefano Russoni

Messaggi consigliati

Stefano Russoni

Salve a tutti,

Sono un giovane ragazzo di 21 anni alle prime anni con i software di programmazione con tia portal v15.1.

Sto sviluppando un software e durante lo sviluppo di questo software mi sono imbattuto nell' istruzione FILL, che devo utilizzarla per azzerare una db composta da 64 bit che sarebbero gli allarmi del mio impianto. Purtroppo ho un esempio, ma è sviluppato con un s7-1500 ( CPU 1514F e l'istruzione FILL utilizza un tipo di dati "Variant", mentre come illustrato dal sistema di informazione posso utilizzare per l's7-300 (CPU 314 2PN DP)"Any" come tipo di dati. Come posso procedere? Quali sono le differenze? Dove posso trovare qualche manuale o spiegazione che mi faccia comprendere a pieno l'istruzione FILL e i suoi tipi di dati?

Ringrazio in anticipo chi avrà la pazienza di aiutarmi. 

Russoni Stefano

Link al commento
Condividi su altri siti


Ciao!

Fill lo usi stabilendo con cosa devi andare a riempire un area dati.

qWKFNAH.png

Ad esempio.

Dichiaro #Zero = 0

Richiamo FILL, indico il campo sorgente (bval) con il quale andrò a riempire l'area specificata in BLK.

In questo caso andrò ad azzerare il campo db1.dbb0 per 68 byte.

Se nella tua db avessi una struttura commentata, potresti fare una cosa del genere per semplificarti la vita (e leggibilità)

Prendendo sempre esempio db1..

 

aE4Enzw.png

 

Dichiarando una struttura che racchiuda l'intera db, il P#db1.dbx0.0 byte 68 prende preso nome della db, con il nome della struttura. (quindi "test1" = nome db, .TEST_FILL è la struttura interna della db, che vale 68 byte.

 

Nei dettagli di programma, in BLK avrai:

ZhQTPzz.png

 

Spero sia chiaro!

 

Ciao!

Link al commento
Condividi su altri siti

Stefano Russoni

Ciao, 
scusami se non ti ho più risposto e grazie ancora!!

Stamattina ho provato a utilizzare l'istruzione come da te suggerito, però certe cose ancora non mi sono chiare.. ovvero che tipo di dati devo utilizzare nel parametro BVAL e inoltre non riesco a capire il fattore di moltiplicazione... comunque lascio in allegato la mia prova

Immagine.png

Immagine2.png

Link al commento
Condividi su altri siti

Attenzione che l'istruzione FILL è messa nel gruppo "Legacy". Se possibile, si consiglia di evitarne l'uso.
Per fare quello che desideri prova a guardare l'istruzione "SCATTER" che, tra l'altro, lavora anche con blocchi ottimizzati.

Link al commento
Condividi su altri siti

Stefano Russoni

Mi scuso tanto per la mia ignoranza ma purtroppo il gruppo Legacy non so cosa sia.

Proverò a vedere la funzione SCATTER e farò qualche prova. 

Grazie.

Link al commento
Condividi su altri siti

In Legacy ci sono funzioni ancora presenti per mantenere la compatibilità con le precedenti versioni, ma considerate obsolete.

In ogni caso, per il tuo scopo l'istruzione SCATTER risulta anche più facile da usare.

Link al commento
Condividi su altri siti

Stefano Russoni

Ciao batta,

purtroppo la funzione SCATTER per s7-300 non è disponibile, è disponibile solo per s71500 e s71200.
 

Link al commento
Condividi su altri siti

Quote

purtroppo la funzione SCATTER per s7-300 non è disponibile, è disponibile solo per s71500 e s71200.

Sì, hai ragione. Vedendo che usi TIA, avevo dato per scontato che la CPU fosse una 1200/1500. Mi era sfuggito che la devi usare su un 300.

Comunque, con il 300, per soli 64 bit non mi farei tanti problemi con FILL od altro, bastano due semplici MOVE su due DWORD.

Link al commento
Condividi su altri siti

  • 1 year later...

Buongiorno, in relazione al problema di Stefano e per curiosità, l'istruzione FILL_BLK associata ad un array in questo caso per gli allarmi, si può implementare con l's7-300? andrebbe ad azzerare tutti gli elementi da indice 0 ad x.

Link al commento
Condividi su altri siti

Ciao

si una cosa abbastanza semplice, di seguito quello che uso io per fare quello che serve a te:

      L     L#0
      T     #Fill_DWORD

      AUF   "DB_MMI_ALLARMI"
      L     DBLG                        // Carico la lunghezza totale del DB da azzerare
      T     #Lunghezza_DB

      LAR1  P##P_ALLARMI_MAC            // Carica indirizzo inziale del puntatore Any di origine in AR1
      L     B#16#10                     // Registra Syntax-ID nel puntatore Any
      T     LB [AR1,P#0.0]
      L     B#16#2                      // Carica tipo di area a BYTE 
      T     LB [AR1,P#1.0]              // e deposita nel puntatore Any
      L     #Lunghezza_DB               // Registra numero dei byte
      T     LW [AR1,P#2.0]
      L     127                         // Registra numero DB di origine
      T     LW [AR1,P#4.0]
      L     P#DBX 0.0
      T     LD [AR1,P#6.0]              // Carica puntatore di area nel blocco 

// generali
// multirex
// inverter
// assi
// libero

      CALL  "FILL"
       BVAL   :=#Fill_DWORD
       RET_VAL:=#Fill_Error
       BLK    :=#P_ALLARMI_MAC

 

Cosi anche se la DB dovesse essere modificata la funzione sopra andrebbe sempre ad azzerarla, io la uso su una DB da 64 word

 

Saluti

Link al commento
Condividi su altri siti

Il 11/11/2020 alle 01:23 , Siltec ha scritto:

Buongiorno, in relazione al problema di Stefano e per curiosità, l'istruzione FILL_BLK associata ad un array in questo caso per gli allarmi, si può implementare con l's7-300? andrebbe ad azzerare tutti gli elementi da indice 0 ad x.

Mi riferisco ad un array di valori booleani

Link al commento
Condividi su altri siti

Ciao

Quote

Mi riferisco ad un array di valori booleani

per l'istruzione fill non fa differenza se il tuo DB è composto da bool da word o dword, nel caso di bool hai hai solo una condizione da rispettare ovvero che la tua DB sia divisibile per 8 come scritto sul . dell'istruzione:

Quote

Se l'area di destinazione da preimpostare non è un multiplo intero della lunghezza del parametro di ingresso BVAL, essa viene comunque scritta fino all'ultimo byte.
Se l'area di destinazione indicata è minore dell'area sorgente, vengono copiati solo tanti dati quanti ne può contenere l'area di destinazione.
Se l'area di destinazione o l'area sorgente realmente disponibile è minore delle dimensioni dell'area di memoria parametrizzata per l'area sorgente o di destinazione (parametri BVAL, BLK), la reazione dipenderà dal tipo di CPU.

·    CPU S7-300: non vengono trasmessi dati. RET_VAL ha il valore W#16#837F.

·    CPU S7-400 V4 (CPU standard V4, CPU H V4 e V4.5): non vengono trasmessi dati.Per tutte le altre CPU S7-400: i dati vengono trasmessi.In tutte le CPU S7-400 viene segnalato un errore in RET_VAL con codice di errore W#16#8122 o W#16#8323. Questi parametri RET_VAL vanno sempre analizzati nel programma utente.

Se il puntatore ANY (sorgente o destinazione) è del tipo BOOL, la lunghezza indicata deve essere divisibile per 8; in caso contrario l'SFC non viene eseguita.

 

Saluti

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