Vai al contenuto
PLC Forum


Copia da DB di BOOL a DB con array di BOOL


Cesare Nicola

Messaggi consigliati

Uno dei miei limiti e di non comprendere mai a sufficienza l'utilizzo dei blocchi MOVE_BLK, MOVE_BLK_VARIANT, ecc. Infatti ci sto ricascando.

Ho una DB, posso scegliere se ottimizzata o no, che contiene n variabili tutte BOOL; devo copiare il contenuto della DB, quindi lo stato di ogni BOOL in un'altra DB che però contiene un ARRAY di BOOL (la DB destinazione è sicuramente più grande di quella di origine). Cioè, se il bit 0.3 della prima DB è 1, voglio che l'indice 3 dell'array della seconda DB sia 1; se è 1 l'offset 1.4 voglio che sia 1 l'indice 12, ecc. E' possibile?
Se non si può trovo altre soluzioni ma ne ho un po' piene le scatole di non capirci mai un tubo e di vedere il Ret_val che non è mai a zero! 🙂

 

Link al commento
Condividi su altri siti


Potresti fare così:

image.png.8fc5ef6fae6371210232262c3106d8f5.png

 

Unico limite, è che le variabili BOOL nel DB sorgente devono essere in una struttura, e non direttamente nella "radice" del DB.
Nell'esempio, ho trasferito 5 byte (40 bit) dalla struttura del DB sorgente, partendo dal primo bit della struttura, a un array di byte di appoggio, e successivamente 5 byte dall'array di appoggio all'array di BOOL nel DB di destinazione, partendo dall'elemento [0].

 

In SCL diventa come segue:

GATHER_BLK(IN:="DB_Sorg".MyStruct.bool_0,
           COUNT_OUT:=5,
           OUT=>#tmpArray[0]);

SCATTER_BLK(IN:=#tmpArray[0],
            COUNT_IN:=5,
            OUT=>"DB_Dest".BoolArray[0]);

Rompe un po' meno le scatole, perché non ti chiede il tipo di dato che costituisce l'array (quello che ho usato come appoggio) e il tipo di dato del parametro COUNT.

 

Se la struttura è formata da 8, 16, 32 o 64 bit, al posto di GATHER_BLK e SCATTER_BLK si possono usare GATHER e SCATTER.

Link al commento
Condividi su altri siti

Perfetto, funziona, grazie. Nel frattempo, ho cambiato radicalmente soluzione al mio problema, quel trasferimento da una DB all'altra non mi serve più; l'FB che prima scriveva nella DB che doveva essere di origine, ora scrive direttamente in quella che doveva essere la destinazione. A scopo didattico, però, ci tenevo ad avere una soluzione.

Link al commento
Condividi su altri siti

  • 4 months later...

UDT.thumb.PNG.6ff6bcd68ac1ca2c689c300f1d801b3a.PNG

 

Se abbiamo gli allarmi gestiti come UDT e poi volessimo rimapparli con i Bytes giusti in una Word (Usando l'UDT avremmo il vantaggio di utilizzare i nomi parlanti delle variabili)

 

Potremmo creare una funzione che copia un qualsiasi tipo di dato su un altro tipo che possa contenerlo.

Per fare questo dobbiamo creare la funzione NON OTTIMIZZATA seguente :

 

FcCopy.thumb.PNG.0cf1ff2a40fba4871dfc86a891804f6a.PNG

Questa copierebbe per esempio l'UDT in una Word , solo che avrebbe i bytes invertiti

 

Per risolvere il problema possiamo creare la seguente funzione NON OTTIMIZZATA

 

FcSwapWord.PNG.abf30c89468ad734992962ca77119ea0.PNG

A Questo punto possiamo fare una funzione che unisca le due procedure :

 

FcCopy16BoolToSwapAlarms.PNG.a39d2ac89b507cf6e13f98ee9149cc21.PNG

 

E a questo punto possiamo fare l'unica funzione di libreria per rimappare i dati :

 

Use.PNG.fbc671eb599419a0d61661f63380b94c.PNG

 

Buon Week End 🙂

 

 

 

 

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