TwinCAT Kommunkation mit SolartMax Wechselrichtern

borsti87

Level-1
Beiträge
71
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ich stehe vor folgendem Problem:
Ich möchte mit Twincat eine Kommunikation mit zwei SolarMax Wechselrichtern herstellen (der Hersteller hat mir das Datenprotokoll zukommen lassen).

MaxCommProtokoll.jpg

Src-Adress, Dest-Adress und Length sind immer zwei ASCII-Zeichen lang, Crc ist immer vier ASCII-Zeichen lang.

Ich möcht zur Übermitlung einen String mit dem FB_FormatString erstellen und diesen per SendString255 an die COM-Schnitstelle übergeben doch wie genau berechne ich im Vorfeld Length und Crc?

Hier noch ein Beispiel für einen zu sendenden String:
Code:
{FB;2A;<Length>|1F4:TYP|<Crc>}
Gruß
borsti87
 
Hi habs mitlerweile raus bekommen ;-)

hier nochmal der Beispiel Sendestring:

Code:
{FB;2A;<Length>|1F4:TYP|<Crc>}
für die Lenght berechnung setzen wir erst mal platzhalter ein

Code:
{FB;2A;00|1F4:TYP|0000}
das ergibt Lenght = 23

so jetzt benötige ich noch Crc
dafür schneiden wir den String wie folgt ab und setzen Lenght ein

Code:
FB;2A;[COLOR=Red]23[/COLOR]|1F4:TYP|
so jetzt muss ich für jedes zeichen den ASCII Hex Cod ermitteln und einfach addieren:

Code:
[FONT=Courier New]F     =  46
B     =  66
;     =  3B
2     =  32
A     =  41
;     =  3B
2     =  32
3     =  33
|     =  7C
1     =  31
F     =  46
4     =  34
:     =  3A
T     =  54
Y     =  59
P     =  50
|     =  7C
===============
Summe =[/FONT] 883
das Ergibt dann folgenden Sendestring:

Code:
{FB;2A;[COLOR=Black]23[/COLOR]|1F4:TYP|0883}
So weit so gut.

Gehen wir jetz davon aus ich sende folgenden String (natürlich mit errechnerter Length und Crc)
Code:
{FB;2A;<Length>|64:TYP;SWV;UDC|<Crc>}
so erhielte ich z.B. folgenden Antwortstring:
Code:
{2A;FB;<Length>|64:TYP=7D0;SWV=28;UDC=180|<Crc>}
Nun ist meine Frage wie bekomme ich am saubersten die Ergebnisse aus dem String extrahiert, so das ich folgende Zuordnung erhalte?

Wert von TYP in PLC Variable TypWechselrichter
Wert von SWV in PLC Variable SoftwareVersionWechselrichter
Wert von UDC in PLC Variable EingangsSpannungWechselrichter

Gruß
borsti87
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
du willst also aus einem String einen Wert wissen.

Ich würde über die Funktion FIND den String erstmal nach deinen Suchkriterium suchen lassen daraus kannst du dann den String "beschneiden" (siehe String Funktion LEFT/RIGHT in der Hilfe) und ihn dann über STRING_TO_INT konvertieren.

gruß bonatus
 
Hallo,

aber das Beckhoff STING_TO_INT geht leider nicht da die Werte Hexadezimal angeben werden und STING_TO_INT die Buchstaben des HEX-Wertes nicht interpretieren kann aber hier hat mir OSCAT's HEX_TO_DWORD geholfen.

Gruß
borsti87
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kann ich TwinCAT irgendwie dazu bingen mir den Crc Wert zu berechnen, d.h. den ASCII-Wert eines jeden Zeichen im String auszulesen und zu addieren?

Bsp:
gegeben ist:
Code:
FB;01;26|64:PAC;UDC;UL1;IDC;IL1|
ergibt den HEX-Wert:
Code:
867
Gruß
borsti87
 
Selber denken ist nicht?

Code:
    MeinString: STRING:= 'FB;01;26|64:PAC;UDC;UL1;IDC;IL1|';
    MeinPointer:    POINTER TO BYTE;
    CRC: DWORD;

Code:
MeinPointer:=ADR(MeinString);

CRC:=BYTE_TO_DWORD(MeinPointer^);

FOR i:= 1 TO LEN(MeinString)-1 DO
    MeinPointer:=ADR(MeinString)+i;
    CRC:=CRC+BYTE_TO_DWORD(MeinPointer^);
END_FOR
 
Zurück
Oben