Vai al contenuto
PLC Forum


Espressione Booleana In Structured Text - sono io che non capisco?


Berlus

Messaggi consigliati

Ciao a tutti,

sto iniziando a programmare in ambiente RSLogix 5000, uso il testo strutturato. Mi sono trovato a dover scrivere un'espressione del tipo:

IF sourceA = sourceB THEN ...

dove sourceA e sourceB sono due BOOL. Il compilatore non mi lascia scrivere questa espressione, in pratica non gli piace il paragone tra due booleani fatto così.

Ma ora dico io, come faccio a paragonare il valore di due bit?

Se invece gli scrivo

IF NOT (sourceA XOR sourceB) THEN ...

gli va bene. E' chiaro che le due espressioni hanno lo stesso risultato logico, ma non vorrei usare il secondo metodo per ottenere il paragone tra due bit...

Spero di star sbagliando qualcosa io, che mi dite?

Link al commento
Condividi su altri siti


Non hai altra possibilita' almemo mi sembra che

operazione " = " in ST sia uguale a quella in Ladder "EQU" infatti queste 2 funzioni esigono operatori come SINT,INT,DINT,REAL, etc

non e' percio' possibile con 2 operatori Boolean.

Potresti eseguire il Casting su 2 operatori SINT e trascrivere in essi il valore True or False sul Bit0

in questo modo :

definisco 2 nuovi Tags OP_A, OP_B : [sINT]

definisco 2 tags sourceA,sourceB : [bOOL]

Poi eseguo un casting OP_A.0 := sourceA ; OP_B.0 := sourceB

in pratica diventa cosi' :

OP_A :=0;OP_B :=0;

OP_A.0 := sourceA ; OP_B.0 := sourceB

if OP_A = OP_B then

Result := 1:

else

Result:=0:

end_if:

Ma il tuo metodo di eseguire una EXOR e' certamente corretto. .

oppure potresti farti una tua nuova istruzione ADD-ON e la chiami ad esempio "equal" li passi i 2 parametri di input , e ti

fai restituire il risultato su "EnableOut"

ecco un esempio veloce.

ADD-ON Instruction Nome = ' Equal'

Parameters:

Name Usage Type Default Style Req Visible Description

EnableIn Input BOOL 1 Decimal 0 0 Enable Input - System Defined Parameter

EnableOut Output BOOL 0 Decimal 0 0 Enable Output - System Defined Parameter

A Input BOOL 0 Decimal 1 1 Operand A

B Input BOOL 0 Decimal 1 1 Operand B

C Input BOOL 0 Decimal 1 1 Operand C

Result Output BOOL 0 Decimal 0 1 Result

Local:

Name Type Default Style

OP_A DINT 0 Decimal

OP_B DINT 0 Decimal

OP_C DINT 0 Decimal

Logic:

OP_A:=0;OP_B:=0;OP_C:=0;

OP_A.0:= A;

OP_B.0:= B;

OP_C.0:= C;

if (OP_A=OP_B) and (OP_B=OP_C)

then Result:=1;

else Result:=0;

End_If;

EnableOut:=Result;

Esempio uso in Lader:

<< Equal Test A B C OTE Goal >>

Esempio uso in ST:

<<

Equal(Ck3,A,B,C);

if Ck3.Result then Hello:=1; else Hello:=0; end_If;

>>

Link al commento
Condividi su altri siti

Grazie mille della risposta esaustiva. Provengo da altri ambienti, ed è la prima volta che mi capita un ambiente che non supporti questo tipo di istruzione.

Sempre su questo argomento, ho notato che il sistema non prevede le classiche istruzioni di casting

INT_TO_BOOL

WORD_TO_INT

e chi più ne ha più ne metta. In pratica te le devi creare sottoforma di Add-On Instructions, il che non mi piace molto in quanto sono istruzioni basilari e necessarie. Va bè, mi adatto e inizierò a scriverle mano a mano che mi serviranno.

Quando avrò nuovi dubbi o domande mi rifarò sentire, grazie ancora!

Link al commento
Condividi su altri siti

WORD_TO_INT

move Tag[word] to tag[iNT]

integer e word ci sono poche differenze.

puoi leggere i singoli Bits di un Integer, e di una Word

il Casting avviene quali sempre verso l' elemento di destinazione, in automatico.

Perciò non devi usare nessuna funzione particolare di Casting (Tipo INT_TO_BOOL e WORD_TO_INT)

Il caso che tu hai esposto in precedenza è un caso eccezionale, non ti devi preocupare di castomizzare i tuoi dati.

Unica volta che bisogna prestare attenzione e nel passare dei Real verso un INT o DINT (devi solo limitare il Casting)

puoi eseguire un casting anche da 2 INT il un REAL, oppure 4 SINT in un REAL, e viceversa, con istruzione COP o CPS.

i singoli bits di una Tag di tipo INT,DINT può essere estrapolati in questa maniera

Joel[int] estrapolo il bit 7 così Joel.7

puoi estrapolare porzioni di Word e DWORD con le funzioni BTD o con MVM, SWPB,

puoi estrapolare dati da più word o Dword con FAL, FSC, COP, FLL

nel linguaggio ST non devi castomizzare ogni dato, come avviene per SCL in Siemens, oppure in altri linguaggi tipo Pascal o Delphi.

Modificato: da Henon
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...