-> Hier kostenlos registrieren
Hallo liebe Gemeinde!
Ich bin gerade am verzweifeln, wär also nett wenn ihr mir weiterhelfen könntet
Ich habe ein Projekt bei dem ich Daten mehrerer Regler über eine RS485- Schnittstelle auslesen muss.
Als Hardware habe ich ein Power-Panel, das über X2X-Link mit einem Kommunikationsmodul (X20CS1030) verbunden ist.
Die Regler sind untereinander über RS485 verbunden und die Leitung geht anschließend auf mein Kommunikationsmodul.
Leider hab ich es bis jetzt noch nicht geschafft, das mir ein Regler eine Antwort zurückschickt
(bin auch noch Neuling auf dem Gebiet)
Zur Kommunikation verwende ich die "DVFrame"-Bibliothek. Nachstehend füge ich meinen Code und einen Auszug des Schnittstellenprotokolles der Regler ein, vielleicht fällt euch ja ein Lösungsansatz ein. Vielleicht mach ich auch grundsätzlich was falsch...
Ausschnitt aus dem Schnittstellen-Protokoll (E-Link):
=====================================================================================
Beispiel für die Abfrage aller Laufvariablen: ^A~^B?9000^CH^D
============================================================================================
Nun mein Code (zyklisch):
===================
CASE step OF
//WARTEN******************************************************************
0:
strcpy(ADR(Sendebuffer),ADR(''));
IF (Open) THEN
step := 1;
END_IF
//ÖFFNEN*******************************************************************
1:
FRM_xopen_0.enable := TRUE;
FRM_xopen_0.device := ADR('IF2.ST2.IF1');
FRM_xopen_0.mode := ADR('/PHY=RS485 /BD=9600 /DB=8 /PA=N /SB=1');
FRM_xopen_0.config := 0;
FRM_xopen_0.config := ADR(Schnittstellenparameter);
Schnittstellenparameter.idle := 1000;
Schnittstellenparameter.delimc := 1;
Schnittstellenparameter.delim[0] := 4; //<EOT>
Schnittstellenparameter.tx_cnt := 8;
Schnittstellenparameter.rx_cnt := 8;
Schnittstellenparameter.tx_len := 256;
Schnittstellenparameter.rx_len := 256;
Schnittstellenparameter.argc := 0;
Schnittstellenparameter.argv := 0;
FRM_xopen_0();
IF (FRM_xopen_0.status = 0) THEN
step := 2;
strcpy(ADR(Sendebuffer), ADR('^A~B?9000^CH^D'));
ELSIF (FRM_xopen_0.status = ERR_FUB_BUSY) THEN
step := 1;
ELSE
step := 255;
END_IF
//SENDEBUFFER ANFORDERN***************************************************
2:
FRM_gbuf_0.enable := TRUE;
FRM_gbuf_0.ident := FRM_xopen_0.ident;
FRM_gbuf_0();
IF (FRM_gbuf_0.status = 0) THEN
memset(FRM_gbuf_0.buffer, 0, FRM_gbuf_0.buflng);
strcpy(FRM_gbuf_0.buffer, ADR(Sendebuffer));
step := 3;
i := 0;
ELSIF (FRM_gbuf_0.status = ERR_FUB_BUSY) THEN
step := 2;
ELSE
step := 255;
END_IF
//SENDEN *****************************************************************
3:
FRM_write_0.enable := TRUE;
FRM_write_0.buffer := FRM_gbuf_0.buffer;
FRM_write_0.buflng := strlen(ADR(Sendebuffer));
FRM_write_0.ident := FRM_xopen_0.ident;
FRM_write_0();
IF (FRM_write_0.status = 0) THEN
step := 4;
ELSIF (FRM_write_0.status = ERR_FUB_BUSY) THEN
step := 3;
ELSE
step := 255;
END_IF
//LESEN ******************************************************************
4:
FRM_read_0.enable := TRUE;
FRM_read_0.ident := FRM_xopen_0.ident;
FRM_read_0();
IF (FRM_read_0.status = 0) THEN
step := 5;
ELSIF (FRM_read_0.status = frmERR_NOINPUT) THEN
step := 4;
ELSE
step := 255;
END_IF
//LESEBUFFER KOPIEREN ****************************************************
5:
memset(ADR(Readbuffer), 0, SIZEOF(Readbuffer));
memcpy(ADR(Readbuffer), FRM_read_0.buffer, FRM_read_0.buflng);
strcpy(ADR(ReceivBuffer),ADR(Readbuffer));
IF (FRM_read_0.buflng > 0) THEN
FRM_rbuf_0.enable := TRUE;
FRM_rbuf_0.ident := FRM_xopen_0.ident;
FRM_rbuf_0.buffer := FRM_read_0.buffer;
FRM_rbuf_0.buflng := FRM_read_0.buflng;
FRM_rbuf_0();
IF FRM_rbuf_0.status = 0 THEN
step := 0;
ELSIF FRM_rbuf_0.status = ERR_FUB_BUSY THEN
step := 5;
ELSIF FRM_rbuf_0.status = frmERR_INVALIDBUFFER THEN
step := 4;
ELSE
step := 255;
END_IF
ELSE
step := 6;
END_IF
//SCHLIESSEN*************************************************************
6:
FRM_close_0.enable := TRUE;
FRM_close_0.ident := FRM_xopen_0.ident;
FRM_close_0();
IF FRM_close_0.status = 0 THEN
step := 0;
ELSIF FRM_close_0.status = ERR_FUB_BUSY THEN
step := 6;
ELSE
step := 255;
END_IF
//************************************************************************
255:
//ERROR
END_CASE
Ich bin gerade am verzweifeln, wär also nett wenn ihr mir weiterhelfen könntet

Ich habe ein Projekt bei dem ich Daten mehrerer Regler über eine RS485- Schnittstelle auslesen muss.
Als Hardware habe ich ein Power-Panel, das über X2X-Link mit einem Kommunikationsmodul (X20CS1030) verbunden ist.
Die Regler sind untereinander über RS485 verbunden und die Leitung geht anschließend auf mein Kommunikationsmodul.
Leider hab ich es bis jetzt noch nicht geschafft, das mir ein Regler eine Antwort zurückschickt

Zur Kommunikation verwende ich die "DVFrame"-Bibliothek. Nachstehend füge ich meinen Code und einen Auszug des Schnittstellenprotokolles der Regler ein, vielleicht fällt euch ja ein Lösungsansatz ein. Vielleicht mach ich auch grundsätzlich was falsch...
Ausschnitt aus dem Schnittstellen-Protokoll (E-Link):
=====================================================================================
- Baudrate: 9600
- Parität: Keine
- Datenbits: 8
- Stoppbits: 1
- Für die Kommunikation steht das folgende Protokoll zur Verfügung:
- <SOH> <Adr> <STX> <D1 D2 D3...Dn> <ETX> <Checksum> <EOT>
- <SOH> = ^A (0x01)
- <Adr> = 0x30 + Adresse des Gerätes von 0...78
- <STX> = ^B (0x02)
- D1 D2...Dn = Datenbereich (Abfrage= ? Programmierung = !, Bsp: Abfrage des Parameters 1000= ?1000
- <ETX> = ^C (0x03)
- Checksum = Checksumme: Adr xor D1 xor D2 xor D3...xorDn, Wenn Checkbyte <= 1: Checkbyte + 0x71
- <EOT> = ^D (0x04)
Beispiel für die Abfrage aller Laufvariablen: ^A~^B?9000^CH^D
============================================================================================
Nun mein Code (zyklisch):
===================
CASE step OF
//WARTEN******************************************************************
0:
strcpy(ADR(Sendebuffer),ADR(''));
IF (Open) THEN
step := 1;
END_IF
//ÖFFNEN*******************************************************************
1:
FRM_xopen_0.enable := TRUE;
FRM_xopen_0.device := ADR('IF2.ST2.IF1');
FRM_xopen_0.mode := ADR('/PHY=RS485 /BD=9600 /DB=8 /PA=N /SB=1');
FRM_xopen_0.config := 0;
FRM_xopen_0.config := ADR(Schnittstellenparameter);
Schnittstellenparameter.idle := 1000;
Schnittstellenparameter.delimc := 1;
Schnittstellenparameter.delim[0] := 4; //<EOT>
Schnittstellenparameter.tx_cnt := 8;
Schnittstellenparameter.rx_cnt := 8;
Schnittstellenparameter.tx_len := 256;
Schnittstellenparameter.rx_len := 256;
Schnittstellenparameter.argc := 0;
Schnittstellenparameter.argv := 0;
FRM_xopen_0();
IF (FRM_xopen_0.status = 0) THEN
step := 2;
strcpy(ADR(Sendebuffer), ADR('^A~B?9000^CH^D'));
ELSIF (FRM_xopen_0.status = ERR_FUB_BUSY) THEN
step := 1;
ELSE
step := 255;
END_IF
//SENDEBUFFER ANFORDERN***************************************************
2:
FRM_gbuf_0.enable := TRUE;
FRM_gbuf_0.ident := FRM_xopen_0.ident;
FRM_gbuf_0();
IF (FRM_gbuf_0.status = 0) THEN
memset(FRM_gbuf_0.buffer, 0, FRM_gbuf_0.buflng);
strcpy(FRM_gbuf_0.buffer, ADR(Sendebuffer));
step := 3;
i := 0;
ELSIF (FRM_gbuf_0.status = ERR_FUB_BUSY) THEN
step := 2;
ELSE
step := 255;
END_IF
//SENDEN *****************************************************************
3:
FRM_write_0.enable := TRUE;
FRM_write_0.buffer := FRM_gbuf_0.buffer;
FRM_write_0.buflng := strlen(ADR(Sendebuffer));
FRM_write_0.ident := FRM_xopen_0.ident;
FRM_write_0();
IF (FRM_write_0.status = 0) THEN
step := 4;
ELSIF (FRM_write_0.status = ERR_FUB_BUSY) THEN
step := 3;
ELSE
step := 255;
END_IF
//LESEN ******************************************************************
4:
FRM_read_0.enable := TRUE;
FRM_read_0.ident := FRM_xopen_0.ident;
FRM_read_0();
IF (FRM_read_0.status = 0) THEN
step := 5;
ELSIF (FRM_read_0.status = frmERR_NOINPUT) THEN
step := 4;
ELSE
step := 255;
END_IF
//LESEBUFFER KOPIEREN ****************************************************
5:
memset(ADR(Readbuffer), 0, SIZEOF(Readbuffer));
memcpy(ADR(Readbuffer), FRM_read_0.buffer, FRM_read_0.buflng);
strcpy(ADR(ReceivBuffer),ADR(Readbuffer));
IF (FRM_read_0.buflng > 0) THEN
FRM_rbuf_0.enable := TRUE;
FRM_rbuf_0.ident := FRM_xopen_0.ident;
FRM_rbuf_0.buffer := FRM_read_0.buffer;
FRM_rbuf_0.buflng := FRM_read_0.buflng;
FRM_rbuf_0();
IF FRM_rbuf_0.status = 0 THEN
step := 0;
ELSIF FRM_rbuf_0.status = ERR_FUB_BUSY THEN
step := 5;
ELSIF FRM_rbuf_0.status = frmERR_INVALIDBUFFER THEN
step := 4;
ELSE
step := 255;
END_IF
ELSE
step := 6;
END_IF
//SCHLIESSEN*************************************************************
6:
FRM_close_0.enable := TRUE;
FRM_close_0.ident := FRM_xopen_0.ident;
FRM_close_0();
IF FRM_close_0.status = 0 THEN
step := 0;
ELSIF FRM_close_0.status = ERR_FUB_BUSY THEN
step := 6;
ELSE
step := 255;
END_IF
//************************************************************************
255:
//ERROR
END_CASE