TsLuigi Inserito: 18 maggio 2015 Segnala Inserito: 18 maggio 2015 Buona sera a tutti, sono alle prime armi con SCL ed avrei bisogno di un aiuto. Devo leggere un valore in una word, ed andarlo a scrivere ciclicamente tramite OB a tempo in una DB fissa, ad ogni attivazione dell'OB devo incrementare l'indirizzo dove scrivere. (la DB è lunga 1000 word con un OB a tempo con attivazione ogni 20millisecondi) Se qualcuno mi può aiutare ringrazio in anticipo. Ho già provato con vari esempi trovati quì sul forum, ma al compilatore non piacciono...
batta Inserita: 19 maggio 2015 Segnala Inserita: 19 maggio 2015 Ho già provato con vari esempi trovati quì sul forum, ma al compilatore non piacciono... Dovresti essere un po' più preciso. Che esempi hai provato e quali sono gli errori segnalati dal compilatore? Se non ci fai vedere qualche riga di codice, come possiamo trovare gli errori? In ogni caso, il tuo problema è di semplicissima soluzione. Nel DB di destinazione crei un array di 1000 word (esempio: MyArray [0..999] of WORD). Ti serve poi una variabile INT da usare come indice. Ad ogni richiamo dell'OB ciclico scrivi il valore in: "DB_Destinazione".MyArray[id] Incrementi l'indice "id" e, se supera 999, lo riporti a 0.
STEU Inserita: 19 maggio 2015 Segnala Inserita: 19 maggio 2015 E quando arrivi a scrivere alla word 1000, che fai? Shifti tutto in giù?
Livio Orsini Inserita: 19 maggio 2015 Segnala Inserita: 19 maggio 2015 E quando arrivi a scrivere alla word 1000, che fai? Shifti tutto in giù? Batta ha dato l'indicazione: Incrementi l'indice "id" e, se supera 999, lo riporti a 0. Questo tipo di algoritmo è quello che in informatica si dice "coda circolare", perchè è identico al comportamento di un sistema rotativo si parte dall'angolo zero e raggiunto angolo 360° si ritorna a zero senza soluzione di continuità
TsLuigi Inserita: 19 maggio 2015 Autore Segnala Inserita: 19 maggio 2015 Grazie Batta, ora purtroppo sono ad un altro PC, e penso di poter provare domani pomeriggio. Arrivato alle 1000 word semplicemente mi fermo e dopo aver letto tutta la DB dal supervisore per creare una curva, semplicemente azzero la DB che così è pronta per il ciclo successivo. In realtà devo creare 3 DB così.
TsLuigi Inserita: 20 maggio 2015 Autore Segnala Inserita: 20 maggio 2015 Comincio a pensare di essere veramente negato per SCL, credo di aver seguito i consigli di Batta, ma questo è il risultato (ho messo gli errori che mi compaiono) Grazie FUNCTION_BLOCK FB1 VAR_TEMP n := INT; //R00005 C00007: manca la virgola o i due punti MEM := BOOL; //R00006 C00009: manca la virgola o i due punti DB2.ARRAY[0..999]OF WORD; //R00007 C00005: manca la virgola o i due punti END_VAR VAR_INPUT ING := WORD; //R00010 C00009: manca la virgola o i due punti START := BOOL; //R00011 C00011: manca la virgola o i due punti END_VAR IF START AND NOT MEM THEN n := 0; DB2.ARRAY(n) := ING; MEM := TRUE; ELSIF START AND MEM THEN n := +1; DB2.ARRAY(N) := ING; ELSE END_IF; END_FUNCTION_BLOCK Scusate: DB2.ARRAY[0..999]OF WORD; //R00007 C00005: identificatore mancante o non valido
Gianmario Pedrani Inserita: 20 maggio 2015 Segnala Inserita: 20 maggio 2015 Che plc stai usando ?? 1200 o 300?
TsLuigi Inserita: 20 maggio 2015 Autore Segnala Inserita: 20 maggio 2015 Dopo tanti tentativi sono giunto a questo, ma non riesco a trasferire il mio valore di ingresso nella DB FUNCTION FC100 : VOID VAR_TEMP n : INT; MEM : BOOL; DB_N : ARRAY [0..999] OF WORD; END_VAR VAR_INPUT ING : WORD; START : BOOL; DB_NR : BLOCK_DB; END_VAR BEGIN IF n < 1000 THEN IF START THEN n := 0; DB_NR.DB_N[n] := ING; n := n+1; END_IF; ELSE IF NOT START THEN n := 0; END_IF; END_IF; END_FUNCTION ho intenzione di usare un 300
TsLuigi Inserita: 20 maggio 2015 Autore Segnala Inserita: 20 maggio 2015 Funziona!!!! VAR_INPUT ING : WORD; START : BOOL; END_VAR BEGIN IF n < 2000 THEN IF START AND NOT MEM THEN n := 0; DB2.dw[n] := ING; n := n+2; MEM := TRUE; ELSIF START AND MEM THEN DB2.dw[n] := ING; n := n+2; END_IF; ELSE IF NOT START THEN n := 0; MEM := FALSE; END_IF; END_IF; END_FUNCTION DATA_BLOCK DB2 STRUCT DB_VAR : ARRAY [0..999] OF WORD; END_STRUCT BEGIN END_DATA_BLOCK Scusate errore di copia FUNCTION FC100 : VOID VAR_TEMP n : INT; MEM : BOOL; END_VAR VAR_INPUT ING : WORD; START : BOOL; END_VAR BEGIN IF n < 2000 THEN IF START AND NOT MEM THEN n := 0; DB2.dw[n] := ING; n := n+2; MEM := TRUE; ELSIF START AND MEM THEN DB2.dw[n] := ING; n := n+2; END_IF; ELSE IF NOT START THEN n := 0; MEM := FALSE; END_IF; END_IF; END_FUNCTION DATA_BLOCK DB2 STRUCT DB_VAR : ARRAY [0..999] OF WORD; END_STRUCT BEGIN END_DATA_BLOCK
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