Vai al contenuto
PLC Forum


Scrivere Ciclicamente In Un Db


TsLuigi

Messaggi consigliati

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


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

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

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

:thumb_yello:

Link al commento
Condividi su altri siti

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

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

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

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