Vai al contenuto
PLC Forum


Azzeramento Accumulativo


puntalino

Messaggi consigliati

vorrei scrivere 0 in diverse dbw ess.

in db1 vorrei scrivere zero dalla dbw 0 alla dbw2000

come si può fare con un unico comando

ciao e grazzie

Link al commento
Condividi su altri siti


Ti allego un esempio (S7 3xx)

Puoi crearti un FC parametrizzato se ti serve ( parametri IN ), oppure sostituire tali parametri con valori fissi :

L 0

T #Count // inc. number of data word

L #NoOfWord //load number of words to be resetted **** Parameter IN ****

T #Loop

L #DB_Target //load DB to be pointed **** Parameter IN ****

T #DataBlock

AUF DB [#DataBlock]

SPA on

next: T #Loop

on: L 0

T DBW [#Count] // ...Clean DBW xxx

L 2

SLW 3 // Transform into Pointer format

L #Count

+I

T #Count //Add this to the pointer to increase the byte number for 1

L #Loop // repeat until loop is = 0

LOOP next

Bye

Link al commento
Condividi su altri siti

Puoi usare la SFC21 FILL che è una routine di sistema che permette di sovrascrivere un'area dati con un valore a tua scelta.

Nel tuo caso la routine andrebbe richiamata nel seguente modo:

CALL "FILL"

BVAL :=MW10

RET_VAL:=MW100

BLK :=P#DB1.DBX0.0 BYTE 2000

in MW10 metti '0' e la routine ti va scrivere i primi 2000 byte della DB1 a '0'

CIAO

Link al commento
Condividi su altri siti

( polemica dichiarata )

- che casino !

su gli altri plc basta una istruzione, la metodica e' circa la stessa su tutti

tratto le word che contengono i bit come gruppi contigui, ognuno e' una word di 16 bit (i 16 merker) e chiedo di scrivere zero in n_ word successive, cioe' n_ x 16 bit.

e tutte le word si azzerano

Link al commento
Condividi su altri siti

(Risposta a polemica dichiarata)

Perchè non alleghi il codice di esempio di un altro PLC? Forse perchè impiega il medesimo numero di istruzioni di SFC21?

Link al commento
Condividi su altri siti

(Risposta a polemica dichiarata)

A parte la sintassi un pò particolare per il resto la routine è semplice e veloce da implementare.

Piacerebbe anche a me vedere un esempio di come si fa l'azzeramento sugli altri PLC.

CIAO

Link al commento
Condividi su altri siti

MOVE_INT 64 0 M00001,%M00001; general electric

traduzione :

metti in 64 word (cioe' 64 x 16 bit) che cominciano dalla variabile denominata M00001 (nome dato di default, che si puo' cambiare) che rappresenta l'indirizzo logico %M00001 il valore zero

e in un solo ciclo, con una sola istruzione da %m1 a %m1024 vanno in off

potrei anche scrivere MOVE_DINT 64 0 M00001,%M00001

metti in 64 dword (cioe' 64 x 32 bit) che cominciano dalla variabile denominata M00001 (nome dato di default, che si puo' cambiare) che rappresenta l'indirizzo logico %M00001 il valore zero

e in un solo ciclo, con una sola istruzione da %m1 a %m2048 vanno in off

Link al commento
Condividi su altri siti

e in un solo ciclo, con una sola istruzione da %m1 a %m2048 vanno in off

Bisogna valutare in quanto tempo il processore risolve l'istruzione PLC. Perchè alla fine di tutto c'è un processore che scrive 2048 0 in 2048 bytes (o 1024 0 in 1024 words) di RAM!

Link al commento
Condividi su altri siti

per esempio, riferito alla serie piccola (90.30 corrispondente al Siemens 300) general electric

la cpu piu' piccola ed economica della vecchia serie (331) ci mette circa 370 usec.

la cpu media della vecchia serie (340) ci mette circa 120 usec.

le cpu della nuova serie (350 e 36x) ci mettono circa 27,8 usec.

e' comunque da tenere conto che in genere operazioni di questo genere sono tipiche di inizailizzazioni e reset, difficilmente vengono usati in ciclo

io per esempio ho realizzato su un mio programma la scrittura in un solo ciclo di 1.600 registri a 16 bit, ma lo faccio una volta pilotato dal flag di first_scan

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