LabVIEWForum.de - CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels /Suche nach Frequenzumrichter

LabVIEWForum.de

Normale Version: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels /Suche nach Frequenzumrichter
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Hallo zusammen,

kann mir jemand sagen wie der folgende C-Code in LabVIEW aussieht, damit ich entsprechend auf die CRC-Prüfsumme (im Bsp. 7E 0A und 3F C8) komme?
Dafür kenne ich mich in C nicht mehr gut genug aus.... Bahn Wenn nicht, dann muss ich mich wieder einlesen. Confused

Zitat:Die Kommunikation zwischen dem Steuergerät und dem mit RS485 ausgestatteten Frequenzumrichter muss im RTU-Modus ablaufen. Dabei erwartet der ST9000 Umrichter in Werkseinstellung eine Übertragung mit 19200 Baud, 8/N/2. Über einfache Datenübertragung der Bytes im Rohformat ohne weitere Codierung wird gesendet und empfangen. Zusätzliche Steuerzeichen sind nicht notwendig.

Hier zwei Beispiel-Datensätze gesendet an den Frequenzumrichter:
01 07 20 00 00 01 7E 0A (Start-Befehl, dargestellt als Hexadezimalzahlen)
01 07 20 00 00 06 3F C8 (Stopp-Befehl, dargestellt als Hexadezimalzahlen)

Datensätze müssen immer am Stück gesendet werden. Tritt zwischen zwei einzelnen Zeichen eine Pause von mehr als 1½ Zeichen Dauer auf, so ist der Datensatz laut Protokolldefinition ungültig und zu verwerfen.

Kurze Erklärung der Struktur:
01 = Adresse des Frequenzumrichters (wird am Frequenzumrichter über F9.02 eingestellt)
07 = flüchtige Speicherung, Wert wird nicht fest programmiert
20 00 = Steuerparameteradresse
00 01 = Vorwärtsbetrieb
7E 0A = CRC-Checksumme
Weitere Adressen und Funktionen können Sie der Anleitung entnehmen.

Die CRC-Prüfsumme können Sie wie folgt errechnen:

Funktion zur Berechnung der CRC-Prüfsumme (in C):

unsigned int cal_crc16 (unsigned char *data, unsigned int length)
{
unsigned int i,crc_value=0xffff;

while(length–)
{
crc_result ^= *data++;
for(i=0; i<8; i++)
{
if(crc_result & 0x01)
{
crc_result = (crc_value >> 1)^0xa001;
}
else
{
crc_result = crc_result >> 1;
}
}
}
crc_result = ((crc_result & 0xff) << 8) | (crc_result >> 8);

return(crc_result);
}

Beachten Sie bitte, dass die CRC-16-Prüfsumme im Modbus-Format als Little Endian übertragen werden muss, d.h. die niederwertige Hälfte des Datenwortes vor der höherwertigen (in Hexadezimaldarstellung, also die ersten beiden und die letzten beiden Zeichen des Ergebnisses vertauscht werden), damit sie zum Algorithmus des Umrichters (wie oben in der Funktion cal_crc16()) passt.

Quelle: http://www.sourcetronic.com/faq/st9000er...rnsteuern/

Gruß Markus
Hallo Markus,
ich habe da mal was gelesen, könnte Dir weiterhelfen.
https://decibel.ni.com/content/docs/DOC-11072

Gruß Freddy
Hallo Markus,

bei Wikipedia findet sich dieses Code-Beispiel (erster Treffer bei der Suche nach "crc a001"):
Code:
const
  Mask: Word = $A001;

var
  CRC: Word;
  N, I: Integer;
  B: Byte;

begin
  CRC := $FFFF;
  for I := Low(Buffer) to High(Buffer) do
  begin
    B := Buffer[I];
    CRC := CRC xor B;
    for N := 1 to 8 do
      if (CRC and 1) > 0 then
        CRC := (CRC shr 1) xor Mask
      else
        CRC := (CRC shr 1);
  end;
  Showmessage(IntToHex(CRC, 4)); (* Ausgabe *)
end;
Das scheint mit deinem Code identisch zu sein, ist aber wesentlich besser lesbar… Big Grin

Ich hab's mal "wortwörtlich" nach LabVIEW umgesetzt:
[attachment=55160]
Es kommen die von dir erwarteten Werte heraus…
Modbus? RTU? Dafür gibt es bei NI 2 APIs zum Download!!! Wozu sich also mit der CRC rumärgern, gibt es fertig! z.B. hier: http://www.ni.com/example/29756/en/

Gruß, Jens

[attachment=55161]

EDIT: Code zur CRC ist nur kopiert - ist nicht von mir...
Dem Programmierer des von Jens kopierten Beispiels scheint aber bei der inneren Schleife plötzlich entfallen zu sein, dass es auch For-Schleifen gibt. Also wenn, dann schon so:
[attachment=55163]
Vielen Dank Euch allen. Das mit der CRC-Prüfsumme funktioniert nun.
Habe es noch etwas erweitert und die CRC-Prüfsumme an den String angefügt.
[attachment=55164][attachment=55165]

Mit den Modbus-VIs komme ich aber noch nicht so klar. Wie bekomme ich nun meinen erzeugten Hex-String an den Frequenzumrichter geschickt? Unsure

Gruß Markus
(27.01.2016 10:09 )Y-P schrieb: [ -> ]Vielen Dank Euch allen. Das mit der CRC-Prüfsumme funktioniert nun.
Habe es noch etwas erweitert und die CRC-Prüfsumme an den String angefügt.

Mit den Modbus-VIs komme ich aber noch nicht so klar.
Dein Modbus-String-Bsp ist extrem ungewöhnlich. Das ist eine Anfrage für Modbus Function Code 7, "Read Exception Status". Und damit sollen irgendwelche Einstellungen vorgenommen werden? Das ist mir noch nicht untergekommen. Hast du keine gescheite Doku vom Hersteller? Was du uns ins Forum kopiert hast, ist ja nur das hier aus den FAQ.
(27.01.2016 10:09 )Y-P schrieb: [ -> ]Wie bekomme ich nun meinen erzeugten Hex-String an den Frequenzumrichter geschickt? Unsure
Write VISA...

Gruß, Jens
(27.01.2016 10:09 )Y-P schrieb: [ -> ]Habe es noch etwas erweitert und die CRC-Prüfsumme an den String angefügt.
Die CRC-Prüfung wird ja sowohl zum Erzeugen der Prüsumme als auch zum Prüfen eines Strings mit Checksumme verwendet. Das Prüfen erfolgt einfach so, dass bei Erstellung der Checksumme von einen String mit bereits angehängert Checksumme der Wert Null herauskommen muss.

Aus diesem Grunde würde ich das CRC-Sub-Vi lieber so machen, dass es sich für beide Aufgaben gleichermaßen verwenden läßt. Also nicht schon im SubVI die Prüfsumme an den String anhängen. Ist nur so ein Vorschlag.
Dann brauche ich die Modbus-VIs gar nicht? Unsure

Ich habe leider auch keine Anleitung, weil ich den Umrichter noch nicht habe. Den Umrichter wollte ich zuerst nehmen, weil es bei Sourcetronic LabVIEW-Treiber gibt. Allerdings habe ich nun erfahren, dass dies nur für das alte Modell gilt und nicht für das neue.
Da sind sie wohl noch am Programmieren.

Hättet Ihr mir evtl. einen Frequenzumrichter, der besser dafür geeignet ist und für den es schon fertige VIs gibt? NI hat mir Sourcetronic empfohlen (was aber beim neuen Typ auch nicht mehr zutrifft). Mehr wussten die auch nicht. Wie es sich angehört hat, haben die damit aber auch nicht so wirklich viel Erfahrung gehabt.
Vielleicht hat ja schon mal jemand von Euch einen Frequenzumrichter angesteuert und hat mir einen guten Tip. Big Grin
Ich kann ja aber schon mal nachfragen, ob es das Handbuch von Sourcetronic in elektronischer Form gibt.

Gruß Markus

(27.01.2016 10:34 )jg schrieb: [ -> ]Write VISA...
Hallo Markus,

wir verwenden hier diverse Umrichter, aber entweder per Analog/Digital-Signal (Siemens G110) oder per CANopen (SEW, ControlTechniques).
Zu ModBus kann ich nichts empfehlen…

Muss es ModBus sein, weil du über dieses Protokoll und diese (preiswerte) Schnittstelle Werte zurücklesen willst?
Seiten: 1 2 3 4
Referenz-URLs