Vai al contenuto
PLC Forum


calcolo check sum con blocco funzione


Messaggi consigliati

Inserito:

Ho creato un blocco funzione per calcolare il CS, ma non funziona perfettamente, dove sto sbagliando?

testo blocco strutturato:

Fine:= Inizio+lunghezza;
N:= 1;
FCS:= 0;
FOR J:= inizio TO Fine DO
    Car:= MID(Variabile,N,J);
    TJ:=STRING_TO_WORD( Car);
    FCS:= TJ XOR FCS;    
END_FOR;
ENO:= FALSE;

 

variabili interne:

J          UINT                    
TJ       WORD                   
Fine    UINT              
Car     STRING(1)      
N        UINT         

 

Variabili ingresso:

EN                BOOL

Inizio             UINT              
Lunghezza    UINT  

           

Variabili uscita:

ENO   BOOL

FCS    WORD

   

variabili ingresso/uscita

Variabile    STRING(40)                 

         

 

 

Grazie

 


Inserita:

Non puoi usare una stringa.

Supponiamo che vuoi fare il checksum di due bytes, uno contiene #01 e l'altro #02 (# è esadecimale in Omron). Li metti nella tua stringa e li passi alla FB.

Quando fai la MID, ti estrae il primo byte cioè #01, ma l'istruzione STRING_TO_WORD non ti restituisce 1, perchè #01 non è un carattere ASCII di una cifra, e non può convertirlo, per cui probabilmente restituirà 0. Stessa cosa ovviamente per #02.

A meno che tu non abbia composto la stringa byte per byte con CONCAT da una STR4... Ma occhio che il valore #00 che è un valore valido, corrisponde a stringa nulla o fine stringa.

Meglio lavorare con dati numerici, anche se c'è un po' da smazzarsi per l'utilizzo dei bytes che non sono nativi in Omron...

Inserita:

testo blocco strutturato:

IF start THEN 

    (* estrae il byte No.2 *)

    Cost2:= INT_TO_WORD(255);    
    Var2:= Variabile[0] AND Cost2;
    temp:= temp XOR Var2;

    (* Estrae gli altri byte *)
    FOR N_Ciclo:=1 TO 6 DO
                
        Var1:=SHR(Variabile[N_Ciclo],8);
        temp:= temp XOR Var1;
    
        Var2:= Variabile[N_Ciclo] AND Cost2;
        temp:= temp XOR Var2;
    
    END_FOR;

    Var1:=SHR(Variabile[7],8);
    temp:= temp XOR Var1;

    FCS:= temp;

END_IF;

 

ENO:=FALSE;

Variabili interne:

Var1            WORD                    
Var2            WORD                  
N_Ciclo       UINT                
Cost2          WORD              
temp           WORD                
    
Variabili Ingresso:

       start    BOOL                

Variabili Uscita:

FCS    WORD    Mantenuto: Sì       

 

Variabili ingresso/uscita:

Variabile    WORD [40]                  

 

 

Questa volta il blocco funziona, unico problema che ogni volta che do l'ingresso start,  il valore di  FCS va a zero e poi indica il risultato.

Mi servirebbe che il valore rimanesse...

Grazie

Inserita:

Esempio funzionale: word[] contiene 264E 3030 3030 3030 4C30 3030 3030 305C 

La funzione calcola il checksum dei valori evidenziati

 

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