Vai al contenuto
PLC Forum


Lettura Di Variabili Con Vijeo Citect 7.0


LUCAP86

Messaggi consigliati

Salve tutti;

ho assolutamente bisogno di aiuto, io sto facendo un progetto con Vijeo Citect 7.0, e per problemi di licenza,

devo andare a leggere un Bit all'interno di una doppia word proveniente da un PLC. Qualcuno di voi voi saprebbe

indicarmi se all'interno del Cicode esiste una funzione che mi permette di "shiftare" la doppia parola per interrogare

i vari Bit? Altrimenti come posso fare? Avete qualche altra via alternativa per risolvere questo problema?

Aspetto con ansia qualche consiglio grazie mille a tutti.

Luca

Link al commento
Condividi su altri siti


Prova a scrivere questa funzione:

INT FUNCTION StatoBit(INT Word, INT Bit);
INT res, mask;
mask=Pow(2, Bit);
IF ((Word BITAND mask)>0) THEN
RETURN 1;
ELSE
RETURN 0;
END
END

Link al commento
Condividi su altri siti

Grazie Marco, le i bit sono riuscito a leggerli con la funzione "BITAND", non come descritta sulla tua funzione, ma facendo i confronti (es. 1,2,4,8,16.....), ho provato ed ho visto che mi funziona, adesso devo però vedere come fare per scrivere un singolo bit all'interno di una word tu hai qualche idea a tale proposito?

grazie 1000.

Link al commento
Condividi su altri siti

Ciao, per scrivere un bit prova questa funzione:

INT FUNCTION ScriviBit(INT Word, INT Bit, INT Val);
INT res, mask;
mask=Pow(2, Bit);
IF (Val==1) THEN
Word=(Word BITOR mask);
RETURN 1;
ELSE
mask=(mask BITXOR 0xFFFF);
Word=(Word BITAND mask);
RETURN 0;
END
END

Link al commento
Condividi su altri siti

ciao ragazzi, anch'io ho lo steso problema però apro per le prime volte Citec.

sono convinto che queste funzioni siano esatte perchè se dettate da voi.....

ma dove le vado a scrivere , le devo ssalvare con qualche nome particolare ?

dai , non picchiatemi anche se la cosa vi sembra elementare

nb. ho la 6.1

grazie , grazie , grazie 10000 !!!

Link al commento
Condividi su altri siti

Non prenderti male, qua si cerca solo di aiutarsi uno con l'altro in base alle proprie conoscenze ed esperienze maturate, ovvio che mica tutti sono super-esperti; anche io sono più le volte che chiedo consiglio piuttosto che quelle dove fornisco aiuto ad altri.

Comunque per rispondere alla tua domanda:

le funzioni che sono state postate sono scritte in Cicode; con Citect hai la possibilità di programmare funzioni e script con due diversi tipi di linguaggi, il Cicode appunto ed il CitectVBA che riprende come dice il nome il VBA. Di volta in volta si può usare quella che si ritiene migliore per lo scopo da raggiungere oppure che si padroneggia meglio.

Se guardi nella struttura di un progetto di Citect, vedrai che ci sono due cartelle ripettivamente "Cicode Files" e "CitectVBA Files"; se selezioni ad esempio Cicode Files avrai una voce che dice "Create a new Cicode page"; se clicchi su essa ti si aprirà il Cicode editor dove avrai a disposizione un editor completo con cui scrivere le tue funzioni; ovviamente per imparare la sintassi, le istruzioni, le funzioni già disponibili e gli operatori dovrai studiarti un po' il linguaggio sui manuali on line. Comunque se dentro l'editor copi ad esempio una delle funzioni scritte qui e salvi puoi già usarle. In un file del Cicode puoi ovviamente scrivere più funzioni e queste sarranno comunque disponibili anche negli altri (come nei moduli in VBA di Excel).

Lo stesso vale per il CitectVBA che ovviamente avrà regole di sintassi, operatori e funzioni diverse dal cicode.

Visto che parti da zero con Citect ti consiglio di guardare per bene i manuali che sono veramente fatti bene e dettagliati, almeno per avere le basi da cui partire per sviluppare un progetto (intanto guarda anche i progetti inclusi con la installazione) e poi dopo aver acquisito le basi puoi cominciare a smanettare seriamente.

Ciao.

Link al commento
Condividi su altri siti

grazie tanto sei stato veramente istantaneo.

approposito di manuali dove posso recuperarli in italiano ?

io non ne ho , ho solo il software spedito da Schneider e mi aiuto di tanto in tanto con l'.(anche se comprendo quasi nulla)

mi sarebbe di vero aiuto un bel pdf .

grazie ,grazie , grazie !!

Link al commento
Condividi su altri siti

Per quanto riguarda la documentazione mi spiace ma in italiano non esiste nulla. Non so se i manuali ci sono anche in pdf, prova a guardare sul sito della Schneider.

Link al commento
Condividi su altri siti

Eccomi qui ho testato un attimo la funzione tutto fila liscio e i bit vengono scritti,

la funzione che sto utilizzando è quella scritta qui sotto, ho notato però che questa funzione, ogni volta che viene lanciata, mi sovrascrive i bit già scritti, ma non riesco a capire il motivo visto che utilizzo il BITOR i bit dovrebbero essere aggiunti non sovrascritti, è anche vero però che il valore della doppia parola viene scritto ogni volta secondo te Marco dov'è l'inghippo?

FUNCTION ScriviBit(STRING DWord, INT valore, INT m);

INT IntDWord, Bit

Bit = Pow(2, m);

IntDWord = TagRead(Dword);

IF valore = 1 THEN IntDWord = IntDWord BITOR Bit

END

TagWrite(DWord, IntDWord);

END

Grazie mille

Luca

Link al commento
Condividi su altri siti

Scusa ma cosa intendi dire con:

ogni volta che viene lanciata, mi sovrascrive i bit già scritti

La cosa importante è che venga modificato solo lo stato del bit che ti interessa, poi è ovvio che dichiarando le variabili come word o doubleword, a livello di comunicazione tra Citect e PLC avrai un aggiornamento di tutti i bit, ma se un bit è ad 1 ed al ciclo successivo di lettura/scrittura viene sempre rimesso a 1 non mi pare ci siano problemi.

Link al commento
Condividi su altri siti

No non intendo dire quello forse mi sono spiegato male io. Quando io scrivo 1 bit modifico lo stato del bit che mi interessa, e fin qui tutto va bene, il problema che io riscontro è che se ho già modificato un bit, e poi decido di modificarne un'altro differente all'interno della stessa doppiaword il bit che avevo scritto all'inizio non ha più lo stato a 1 , ma viene messo a zero per esempio:

DWord: DB2.DBD20

Decido di alzare il bit DB2.DBX20.0 che va ad 1 e continua a rimanere ad 1,

nell'altro ciclo di scrittura alzo il DB2.DBX20.1, e mi aspetto che il DB2.DBX20.0 continui a rimanere sempre a 1, invece viene rimesso a 0 mentre il 20.1 viene alzato correttamente.

Link al commento
Condividi su altri siti

Magari è una stupidata, ma hai controllato l ordine di precedenza degli operatori?

Prova a scrivere così:

IntDWord=(IntDWord BITOR Bit);

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