- Beiträge
- 6.636
- Reaktionspunkte
- 1.607
-> Hier kostenlos registrieren
Hallo,
ich kämpfe gerade mit Kommunikationsproblemen. Ich sende die gigantische Menge von 6 Byte über eine EL6021 und empfange auch 6 Bytes, wobei am RS485 nur ein Teilnehmer angeschlossen ist. Ich habe am Bus jetzt ein anderes Gerät hängen bei dem das Senden/Empfangen nicht funktioniert und ich analisiere das gerade. Hier mal der entsprechende Schritt:
Ich wollte eigentlich kurz testen, ob bei fb_SendData BUSY TRUE wird, was seltsamerweise nicht der Fall ist. Bei einer zu übertragenden Länge von > 11 führt er den Schritt so 20mal aus bevor der Baustein eine Fehlermeldung (COMERROR_TXBUFFOVERRUN) ausgibt. Was mich jetzt halt wundert ist, warum der Baustein (außer im Fehlerfall) nie BUSY wird und warum bei einer Länge von <12 Bytes keine Fehlermeldung generiert wird. Darf der Baustein nur einmal aufgerufen werden und meldet sofort einen Fehler zurück?
ich kämpfe gerade mit Kommunikationsproblemen. Ich sende die gigantische Menge von 6 Byte über eine EL6021 und empfange auch 6 Bytes, wobei am RS485 nur ein Teilnehmer angeschlossen ist. Ich habe am Bus jetzt ein anderes Gerät hängen bei dem das Senden/Empfangen nicht funktioniert und ich analisiere das gerade. Hier mal der entsprechende Schritt:
Code:
DATA.en_ServoInitLastStep := TEN_ServoInitSteps.ReqProportionalGain;
IF DATA.st_RxBuffer.Count > 0 THEN
DATA.fb_Clear_Com_Buffer(Buffer := DATA.st_RxBuffer);
END_IF
DATA.ab8_SndDataBuffer[1] := 16#E7;
DATA.ab8_SndDataBuffer[2] := CFG.b8_ActuatorID;
DATA.ab8_SndDataBuffer[3] := 16#21;
DATA.ab8_SndDataBuffer[4] := 16#21;
DATA.ui16_TempChecksum := FC_CalculateChecksum(DATA.ab8_SndDataBuffer, 4);
DATA.ab8_SndDataBuffer[5] := UINT_TO_BYTE(SHR(DATA.ui16_TempChecksum, 8));
DATA.ab8_SndDataBuffer[6] := UINT_TO_BYTE(DATA.ui16_TempChecksum);
DATA.fb_SendData( pSendData := ADR(DATA.ab8_SndDataBuffer),
Length := 6,
TXbuffer := DATA.st_TxBuffer);
IF DATA.fb_SendData.Error <> 0 THEN
DATA.en_ErrorState := TEN_ErrorStates.SendCommunication;
DATA.en_ServoInitStep := TEN_ServoInitSteps.OnError;
ELSIF DATA.fb_SendData.Busy THEN
DATA.en_ServoInitStep := DATA.en_ServoInitStep;
// ELSIF NOT DATA.fb_SendData.Busy THEN
// DATA.en_ServoInitStep := TEN_ServoInitSteps.RcvProportionalGain;
// DATA.en_ServoInitStep := 99;
END_IF