Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Scrivere Ciclicamente In Un Db


Messaggi consigliati

Inserito:

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


Inserita:

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.

Inserita:

E quando arrivi a scrivere alla word 1000, che fai? Shifti tutto in giù?

Inserita:
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à

Inserita:

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:

Inserita:

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:

Che plc stai usando ?? 1200 o 300?

Inserita:

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

Inserita:

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

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