CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels /Suche nach Frequenzumrichter
Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!
26.01.2016, 15:50 (Dieser Beitrag wurde zuletzt bearbeitet: 27.01.2016 11:28 von Y-P.)
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels /Suche nach Frequenzumrichter
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.... Wenn nicht, dann muss ich mich wieder einlesen.
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;
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.
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
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…
Ich hab's mal "wortwörtlich" nach LabVIEW umgesetzt:
Es kommen die von dir erwarteten Werte heraus…
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
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
EDIT: Code zur CRC ist nur kopiert - ist nicht von mir...
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
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:
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
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. Wie bekomme ich nun meinen erzeugten Hex-String an den Frequenzumrichter geschickt?
Gruß Markus
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
(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?
Write VISA...
Gruß, Jens
Wer die erhabene Weisheit der Mathematik tadelt, nährt sich von Verwirrung. (Leonardo da Vinci)
!! BITTE !! stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort!
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
(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.
Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN
71083
Deutschland
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
Dann brauche ich die Modbus-VIs gar nicht?
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.
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...
-------------------------------------------------------------------------- Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
RE: CRC-Berechnung in LabVIEW anhand eines C-Code-Beispiels
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?