TsLuigi Inserito: 18 maggio 2015 Segnala Share 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... Link al commento Condividi su altri siti More sharing options...
batta Inserita: 19 maggio 2015 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
STEU Inserita: 19 maggio 2015 Segnala Share Inserita: 19 maggio 2015 E quando arrivi a scrivere alla word 1000, che fai? Shifti tutto in giù? Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 19 maggio 2015 Segnala Share 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à Link al commento Condividi su altri siti More sharing options...
TsLuigi Inserita: 19 maggio 2015 Autore Segnala Share 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ì. Link al commento Condividi su altri siti More sharing options...
TsLuigi Inserita: 20 maggio 2015 Autore Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Gianmario Pedrani Inserita: 20 maggio 2015 Segnala Share Inserita: 20 maggio 2015 Che plc stai usando ?? 1200 o 300? Link al commento Condividi su altri siti More sharing options...
TsLuigi Inserita: 20 maggio 2015 Autore Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
TsLuigi Inserita: 20 maggio 2015 Autore Segnala Share 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 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