Vai al contenuto
PLC Forum


Ricerca Dati All'interno Di Una Db - Ricerca dati all'interno di una DB


Messaggi consigliati

Mirco Tirrezzi
Inserito:

Salve a tutti,

Mi è stato chiesto d'inserire all'interno di un programma una ricerca indicizzata su DataBase,

via rete mi viene trasmesso un codice e devo ricercare all'interno di un DB locale quali parametri

corrispondono al codice trasmesso.

Il tutto dovrebbe essere realizzato su S7 300 in awl, avete qualche consiglio su come poterlo fare ?

Non avedo esperienza con S7 sulla gestione dei DB mi chiedevo se ci fosse qualche esempio...., sapete consigliari qualche sito ?


Inserita:

dunque il tuo codice , che potrebbe derivare dallo scorporo del buffer di ricezione di un pacchetto Tcp\Ip

puoi utilizzarlo come indice

quindi al plc viene richiesto di leggere o restituire un valore di una variabile letta da una richiesta di rete

dati :array[0..1000] of int;

codice:int;

output:int;

//restituisco

dati[codice]

output:=dati[codice];

leggi i post sopra al tuo

ciao

walter

Inserita:

In AWL io faccio così:

devi scorrere la DB con un puntatore usando la sintassi :

AUF DB3 (volendo puoi indicizzare anche la DB)

L DBW[MD15] (dove MD15 è il puntatore)

poi confronti il valore con quello ricevuto....

Mi creo il puntatore da una INT (es MW10) che incremento ad ogni giro:

L MW10

SLW3

T MD15

Mi sa che se non hai l'SCL devi usare i puntatori S7.

A proposito anche dell'altro thread sugli array: anche in AWL, oltre che in Kop non puoi usarli indicizzati (utilissimi !!!)

ciao

Lorenzo

Inserita: (modificato)

si concordo pienamente

in awl bisogna progettare per bene i puntatori

si puo indicizzare come dici tu e anche con i registri Ar1 e Ar2

la tua operazione di shiftare di 3 bit per caricare il formato pointer

puo essere sostituito da p#m0.0

P#... non e' altro che una funzione che incorpora lo ** dei 3 bit (che vengono usati per l'indirizzo bit a bit )

per il formato dei puntatori

l'unica cosa bisogna stare attenti a non sforare le aree di memoria , penalty stop della cpu .

se si usano i registri bisogna , all'uscita del blocco che esegue , salvare in una doppia word

il puntatore e ricaricarlo all'inizio

questo perche , se non erro da prove fatte , il registro lavora un po come una local

durante alcune prove notavo questo e percio attribuisco quanto detto sopra , ed avevo trovato soluzione nel salvataggio in un aDWxxx.

Chiedo conferma

ciao

walter

Modificato: da walterword
Inserita:

Concordo anch'io sul fatto che ti conviene scriverti una routine ad hoc utilizzando i puntatori di AWL o utilizzando l'SCL (molto più semplice di AWL).

Se però non puoi o non vuoi farti la routine c'è un blocco Siemens che fa la stessa operazione.

Il blocco è FC86 "TBL_FIND", lo puoi recuperare dalla 'Standard Library' di Siemens selezionando la biblioteca 'TI-S7 Converting Blocks'. Se premi 'F1" dopo aver selezionato il blocco ti compare l'. del blocco con esempio.

CIAO

Inserita:

ci sono anche i LIFO e FIFO e FUFA

solo che sono limitati per il tipo di dati

ero rimasto che potevano gestire solo i tipi interi

e da allora mi son creato io il mio LIFO e FUFO e FIFO e FIFA ? :blink:

ciao

walter

Inserita:

"TBL_FIND" non ha limitazioni per quanto concerne il tipo di dati, è solo un pò macchinoso da usare.

CIAO

Federico Milan
Inserita:

Ciao, io lo faccio abitualmente, anzi sempre :) ...

banale banale ... è una scanzione di una DB ... Penso che se usi AWL la cosa è immediata con un po' di codice del tipo

MW 0 : indice di scansione
MW 2 : Dimensione in byte della struttura
MW 4 : Word da ricercare
MW 6 : Numero elementi da scansionare ...
Si preusme che la DB inizia da DBB0 ...


       AUF   "DB_CODICE"
       L 0
unt: T MW 0
       L MW 2
       *D
       SLD 4
       LAR1
       L DBW[AR1,P#0.0]
       L MW 4
       ==I
       Spb Ok
       L MW 6
       L MW 0
       + 1
       >=I
       spb unt

OK: Qui ha i tutto :) il necessario,  su AR1 il puntatore, su MW0 l'indice, ... cosa vuoi di più?

ciao

  • 1 month later...
Mirco Tirrezzi
Inserita:

Ho provato.., e funziona.

Grazie

Inserita:

Scusa Federico, ma se il DB codice fosse molto lungo, non corri il rischio di non eseguire il codice plc e quindi andare in stop per tempo ciclo troppo lungo ?

Ciao

Riccardo

Inserita:

Ricky, questo è uno dei grossi limiti delle cpu siemens. Se il tempo ciclo diventasse troppo lungo, la ricerca è sempre possibile farla in più scansioni..

Inserita:

esatto bravo rddiego ;)

invece di "spazzolare" 30.000 dati tutti in un ciclo , lo fai in piu cicli limitanto il puntatore e facendolo ripartire

da dove si era fermato e cosi via

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