avafab Inserito: 12 agosto 2011 Segnala Share Inserito: 12 agosto 2011 (modificato) Salve a tutti, ho bisogno di scrivere '0000000000' in una stringa (una STRING[10] definita in un datablock), come faccio usando LADDER?PS. è possibile farlo evitando di muovere BYTE a BYTE? graziee Modificato: 12 agosto 2011 da avafab Link al commento Condividi su altri siti More sharing options...
valvolina Inserita: 20 agosto 2011 Segnala Share Inserita: 20 agosto 2011 ciao una soluzione potrebbe essere :definisci in una db un campo string che inizzializzi direttamente nel db con il valore che ti interessapoi con la sfc20 (blkmov) muovi blocchi di dati utilizzando i puntatori U "E0.0" SPBN eti1 CALL "BLKMOV" SRCBLK :=P#DB4.DBX0.0 BYTE 10 (con questo puntatore definisci il punto iniziale dei dati che devi muovere, specificando poi quanti byte vuoi muovere. sarebbe il "dato_testo" del db4) RET_VAL:=DB4.DBW24 DSTBLK :=P#DB4.DBX12.0 BYTE 10 (con questo puntatore definisci il punto iniziale dei dati che devono riceve il valore, specificando poi quanti byte vuoi muovere. sarebbe il "dato_testo_out" del db4)eti1: NOP 0i dati che vedi nell'esempio sono del db4di seguito il codice del dbDATA_BLOCK DB 4TITLE =VERSION : 0.1 STRUCT dato_testo : STRING [10 ] := 'testa'; //Variabile jolly provvisoria dato_testo_out : STRING [10 ]; ret_val_testo : INT ; END_STRUCT ; BEGIN dato_testo := 'testa'; dato_testo_out := ''; ret_val_testo := 0; END_DATA_BLOCKsaluti Valvolina Link al commento Condividi su altri siti More sharing options...
batta Inserita: 21 agosto 2011 Segnala Share Inserita: 21 agosto 2011 Potresti usare l'istruzione SFC20 "BLKMOV" (come suggerito da "valvolina"), oppure l'istruzione SFC21 "FILL".Ma per 10 byte potresti risolvere semplicemente con tre move: due DWORD e una WORD.Se poi lo fai in AWL, diventa ancora più semplice.Esempio:L '0000'T DBxxx.DBD0T DBxxx.DBD4T DBxxx.DBW8Qualunque sia il metodo che utilizzi per inizializzare la stringa, ricorda però che una variabile di tipo STRING da 10 caratteri è lunga 12 byte. I due byte in più contengono rispettivamente la lunghezza totale e la lunghezza effettiva della stringa.Quindi se, per esempio, hai definito una variabile di tipo STRING da 10 caratteri a partire da DB10.DBB0, per riempire la variabile con i dati corretti dovrai impostare i byte DB10.DBB0 e DB10.DBB1 con valore 10, e riempire con il carattere '0' i byte da DB10.DBB2 a DB10.DBB11.L'esempio precedente andrebbe quindi corretto come segue:L 10T DBxxx.DBB0T DBxxx.DBB1L '0000'T DBxxx.DBD2T DBxxx.DBD6T DBxxx.DBW10Per tener conto dell'intestazione della stringa, se utilizzi SFC20 "BLKMOV" c'è da fare una piccola modifica all'esempio di "Valvolina", e considerare le lunghezze delle aree dati pari a 12 byte e non 10 byte.Se la stringa sorgente la inizializzi direttamente impostando '0000000000' nella colonna "Valore iniziale" quando dichiari la variabile nel DB, i due byte di intestazione vengono impostati automaticamente.Se poi nell'utilizzo di BLKMOV passi alla funzione i parametri delle aree sorgenti e destinazione utilizzando il simbolico ("NomeDB".NomeVariabile), anche la lunghezza viene presa in automatico. Link al commento Condividi su altri siti More sharing options...
avafab Inserita: 23 agosto 2011 Autore Segnala Share Inserita: 23 agosto 2011 grazie a tutti e due, come sempre molto disponibili ed esaurienti Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora