TC3: BUSY bei SendData wird nicht TRUE und bei Länge > 11 kommt Fehlermeldung

Beiträge
6.636
Reaktionspunkte
1.607
Zuviel Werbung?
-> 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:
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
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?
 
Die Send-Bausteine schreiben in einen 300Byte Puffer. Wenn dort noch Platz ist, ist alles gut. Wenn nicht muss gewartet werden bis Platz frei ist. Dafür ist dann der busy systematisch notwendig.
Muesste ueberschlagsmaessig hinkommen 20x11 = 220 Byte.
Arbeitest du denn den Puffer auch HW-technisch ab (also verknüpfung mit der EL-KLemme.

Guga
 
Zurück
Oben