CRC Berechnung über Persistente Variablen in TC3

msauerpb

Level-1
Beiträge
200
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich würde gern Abgleich- und Konfigwerte meine Steuerung als persistente Variablen speichern

Code:
{attribute 'Tc2GvlVarNames'}
VAR_GLOBAL PERSISTENT
    LOG_Per                         : ST_LOG_PERSISTENT;
   
    lrPowerFailDetect               : LREAL;
    
    // Tank-History:
    lr_n_Arc_Lt                     : LREAL;                            // Arc-Counter-LifeTime
    lr_n_3fArc                      : UINT;                             // 3fArc-Zaehler
    lr_s_OilPump                    : LREAL;                            // Betriebssekundenzähler Ölpumpe
    uiArcHVM                        : UINT;                             // Arc-Counter von HVM
    
    uiEB_System_Nr                  : UINT;                             // EB-System-Nr. nach pb-Tabelle
     
    lr_IbUwKennlVerschiebung        : LREAL;                            // Verschiebung der IbUw-Kennlinie
    lrUaOld                         : LREAL;                            // Ua_Soll Altwert f. IbUw_Kennlinien-Reset

    // USB_Logger FileCounter
    arCounterID                     : ARRAY [0..20] OF INT;             // 0: Event, 1: Arc, 2: Temp
    arSizeOnStick                   : ARRAY [0..20] OF UDINT;

    uiRemCountHVAResetFPGA          : UINT;                             // Anzahl HVA-Hochlauf-Resets
    
    SET_POW                         : ST_SET_POWER;
    SET_FIL                         : ST_SET_FILAMENT;
    SET_BIAS                        : ST_SET_BIAS;
    SET_HV                          : ST_SET_HV;
    SET_IB                          : ST_SET_IB;
    SET_PULSER_BIAS                 : ST_SET_PULSER_BIAS;
   
    CRC                             : UINT;
END_VAR

Damit ich sich sicherstellen kann, dass die Daten gültig sind würde ich gern die CRC des kompletten Blockes berechnen. In der Tc2_Utilities gibt es ja die Funktionen CRC16 bzw. Checksum. Wie übergebe ich denn jetzt diesen ganzen persistenten Block an die Funktion?

Danke schon mal für Eure Hilfe.

gruss

martin
 
Soweit die Adressen der Variablen nicht (eventuell mit Füllstellen) immer hintereinander liegen würde ich mal sagen so direkt gar nicht. Du Könntest Dir eine Struktur anlegen in die Du die Variablen packst und definierst diese dann als persistent. Liegen die Variablen direkt hintereinander kannst Du an den Baustein die Adresse von LOG_Per als dwSrcAddr übergeben und als Länge die Differenz der Adresse von CRC und LOG_Per - 1.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst auch die Version 3.1.4024 von TwinCAT abwarten. Da gibt es in der Struktur PlcAppSystemData eine neue Variable EPlcPersistentStatus welche die Werte PS_None=0, PS_All=1, PS_Partial=2 haben kann. Diese zeigt also an, ob die persistenten Variablen alle, teilweise oder gar nicht wiederhergestellt worden sind. Wenn da eine 1 drinnen steht, wurden alle Werte wiederhergestellt. Die Prüfung der persistenten Variablen erfolgt auch nicht mehr nur nach der Größe, sondern nach dem Datentyp.
 
Zuletzt bearbeitet:
Hi zusammen,

ich hoffe, mir kann einer von euch helfen.. und zwar, ich habe hier ein Projekt, wo ich Prüflinge über CAN Bus ansteuern muss. Dafür verwende ich eine CANOpen Klemme EL6751 und die Variablen, die in der Klemme hinterlegt sind, spreche ich an und steuere somit die Prüflinge an. Jetzt müssen wir zusätzlich eine CRC-Berechnung von Nachrichten durchführen und eine End-To-End Protection schreiben (wahrscheinlich im ST??). Meine Frage wäre, ist es überhaupt mit Twincat 2 möglich und spricht die EL6751 was dagegen, weil sie ein zyklisches Senden hat? Ich habe auf der Beckhoff-Seite eine Funktion gefunden, die genau für diese Zwecke dienen soll (F_DATA_TO_CRC16_CCITT und F_BYTE_TO_CRC16_CCITT), habe aber bis jetzt noch keine Erfahrung damit..

Danke euch
 
Zurück
Oben