RS485 Kommunkation mit Agilent Ionengetterpumpe

RubenMts

Level-2
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,
da ich leider schon einige Zeit in dieser Hinsicht festhänge möchte ich mich hier nochmal an dem Schwarmwissen erfreuen.
Ich versuche über eine Beckhoff EL6022 eine Agilent VacIon150 Iongetterpumpe anzusteuern. Mein Problem ist (denke ich) das aufbauen des Protokoll-String im geforderten Format. Ich habe bereits verschiedene Bausteine zum versenden und Empfangen der Strings gebaut, welche bei der Steuerung anderer Pumpen auch bereits funktionieren.
Für die Kommunikation mit der Pumpe is folgender Aufbau für den zu übergebenen String vorgesehen: https://www.agilent.com/cs/library/usermanuals/public/IPCMini.PDF

Meine Methode zur Erstellung sieht wie folgt aus:
METHOD BuildTelegramString : STRING
VAR_INPUT
Command : ST_AgilentTelegram;
Adress : INT;
END_VAR
VAR
ADDR : INT := 1;
STX : STRING := CHR(2); // Start of transmission
ETX : STRING := CHR(3); // End of transmission
WIN : ARRAY[1..3] OF BYTE;
WINSTRING : STRING;
CRC : ARRAY[1..2] OF STRING; //Kontroll-String
tempString : STRING;
crcValue : BYTE := 0;
i : INT;
data : STRING;


sCheckSum : BYTE;
sWIN : STRING;
END_VAR
VAR_OUTPUT
sTelegram : STRING;
END_VAR
WIN[1] := F_ToASC(str := Command.WIN);
WIN[2] := F_ToASC(DELETE(str := Command.WIN,1,1));
WIN[3] := F_ToASC(DELETE(str := Command.WIN,2,1));
WINSTRING := CONCAT(CONCAT(BYTE_TO_STRING(WIN[1]),BYTE_TO_STRING(WIN[2])),BYTE_TO_STRING(WIN[3]));
tempString := CONCAT(STX, CONCAT(INT_TO_STRING(16#80 + Adress), CONCAT(WINSTRING, CONCAT(Command.COM, ETX) )));
FOR i := 1 TO LEN(tempString)+1 DO
crcValue := crcValue XOR tempString;
END_FOR
CRC[1] := BYTE_TO_STRING(F_ToASC(BYTE_TO_STRING(crcValue)));
CRC[2] := BYTE_TO_STRING(F_ToASC(DELETE(BYTE_TO_STRING(crcValue),1,1)));
sTelegram := CONCAT(tempString, CRC[1]);
sTelegram := CONCAT(sTelegram, CRC[2]);


Im laufenden Betrieb wird das entsprechende Telegram versandt und exakt das gleiche Telegram wieder im RXBuffer erhalten. Mich macht stutzig, das die Pumpe anscheinend antwortet, aber nur die Nachricht zurückschickt und nicht die angeforderten informationen. Ich hoffe jemand kann mir dabei weiterhelfen.
 
Hier nochnmal Screenshots der entsprechenden FBs
 

Anhänge

  • BuildTelegram.png
    BuildTelegram.png
    53,5 KB · Aufrufe: 25
  • ControllPump.png
    ControllPump.png
    54,6 KB · Aufrufe: 26
  • SendAndReceive.png
    SendAndReceive.png
    71,1 KB · Aufrufe: 24
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

CRC wird laut Anleitung ohne STX gebildet.

Schau Dir sonst mal den gesamten Sendestring an und schicke ihn eventuell mal mit einem Terminalprogramm.

Ich würde da mit einem Bytebuffer arbeiten, gerade wegen der nicht darstellbaren Zeichen wie STX, Address und ETX. Aber das ist meine persönliche vorliebe.

Gruß
 
Hi,

CRC wird laut Anleitung ohne STX gebildet.

Schau Dir sonst mal den gesamten Sendestring an und schicke ihn eventuell mal mit einem Terminalprogramm.

Ich würde da mit einem Bytebuffer arbeiten, gerade wegen der nicht darstellbaren Zeichen wie STX, Address und ETX. Aber das ist meine persönliche vorliebe.

Gruß
Moin, da ich bei i = 1 beginne lasse ich doch das STX aus dem CRC raus. Der tempString beginnt doch bei 0. Ich kann nachher wenn ich an der Anlage bin nochmal screenshots vom zusammengesetzten String schicken und mit welchen WIN dieser gebildet wurde etc.

Mit Bytebuffer meinst du ich solle keinen String als Zwischenspeicher nehmen sondern einen Byte Array?
VG
 
Hast recht, komme immer durcheinander damit das bei den verschiedenen Sprachen mit 0 oder 1 gestartet wird.

Ja mit Buffer meine ich Byte Array. Da kann man sich den Inhalt auch besser anzeigen lassen. Sind denn ansonsten Deine RS485 Einstellungen alle richtig? Und die Verdrahtung?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vor allem wenn du das als String schickst, wird am Ende noch eine 0 mitübertragen (nullterminierter String). Das kann die Gegenseite durcheinanderbringen.
 
1715161655086.png
Hier einmal das geschickte und das empfangene Telegram. Zu erkennen ist, dass sie identisch sind (nur der CRC wurde aufgrund des eingestellten suffix vom receiveFB nicht mitgenommen. Ich finde es sehr sonderbar das das Selbe telegram zurück kommt. Die Verkabelung und Verlinkungen habe ich gebrüft. scheint alles zu stimmen. Das Telegram sieht auch IO aus.
STX: $02
ADDR:0x80+0x01 entspricht: 129
WIN: '205' -> in ASCII: 504853
COM: 0x30 entspricht: 0
DATA: nicht vorhanden da read
ETX: $03
CRC: 21 -> in ASCII: 5049
Telegram ist daher denke ich auch correct
 

Anhänge

  • 1715161216887.png
    1715161216887.png
    7,5 KB · Aufrufe: 2
Hi,

Adresse ist nicht richtig. 0x81 muß so als Byte übertragen werden, nicht umgewandelt in characters.

Hast Du auch halb duplex eingestellt (Handbuch S. 68)? Sonst empfängt die Klemme was Du sendest.

Gruß
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Adresse ist nicht richtig. 0x81 muß so als Byte übertragen werden, nicht umgewandelt in characters.

Hast Du auch halb duplex eingestellt (Handbuch S. 68)? Sonst empfängt die Klemme was Du sendest.

Gruß
Das mit halbduplex hatte ich in der Tat vergessen. Ich denke ich werde das Telegramm dann doch eher als byte array aufbauen und mit SendByte versenden
 
Zurück
Oben