Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Beckhoff BX9000 Komunikacja RS485 User protocol

elakota 05 Oct 2018 12:38 477 5
  • #1
    elakota
    Level 13  
    Witam,

    Próbuje uruchomić komunikację po RS485 w BX9000. Pod pinami 1 i 6 mam podpiety konwerter RS485/USB.
    Mam napisany program jak poinżej, co sekundę wysyłam parę bajtów ale nie na terminalu PC totalna cisza.

    Czy coś w programie mam niepoprawnie napisane?
    Proszę o wskazówki.

    Code:

    PROGRAM RS485_User_Protocol


    VAR
       fb_COMPortOpen_1                : FB_COMPortOpen;
       ComConfig            : ST_COMConfig;
       hCOM               : WORD;
       RX_Input               : ARRAY[0..29] OF BYTE :=1,3,2,4,3,5,4,6,5,7;
       Tx_Output            : ARRAY[0..29] OF BYTE :=11,12,13,14,15,16,17,18,19,20;
       Step_RS485            : INT;
       Result_RX                           : INT;
       Result_TX            : INT;

       fbTimer               : TON;

    END_VAR

    ComConfig.cbRxBufferLen :=300;
    ComConfig.cbTxBufferLen :=300;
    ComConfig.dwMode :=1;               (*COM 1 only "0"      COM 2 RS232 "0" and RS485 "1"   *)
    ComConfig.BaudRate :=38400;
    ComConfig.eCommPort :=COM2;
    ComConfig.eDataBits:=EIGHT_DATABITS;
    ComConfig.eParity:=NONE;
    ComConfig.eStoppBits:=ONE_STOPPBIT;


    CASE Step_RS485 OF
    (* Open Port *)
    0:  fb_COMPortOpen_1(bOpen:=TRUE , stCOMConfig:=ComConfig );
        IF NOT fb_COMPortOpen_1.bBusy THEN
            IF NOT fb_COMPortOpen_1.bError THEN
                hCOM:=fb_COMPortOpen_1.iHandle ;
                Step_RS485:=Step_RS485+1;
            ELSE
                Step_RS485 :=100;
            END_IF
        END_IF

    (* Write data*)
    1: fbTimer(IN:=FALSE);
        Result_TX:=F_COMPortWrite(hCom, 4, ADR(Tx_Output[0]));
        IF Result_TX>0 THEN
            Step_RS485 :=Step_RS485+1;
        ELSE
            Step_RS485 :=101;
        END_IF

    (*Receive data
    2:  Result_R:=F_COMPortRead(hCom, 100, ADR(Var_R[Value]));
        IF Result_R<>0 THEN
            Value:=Result_R+Value;
        END_IF
        IF Value>=4 THEN
            FOR i_k:=0 TO Value DO (*Check protocol*)
                IF Var_R[i_k-4]=11 AND Var_R[i_k-3]=22 AND Var_R[i_k-1]=33 THEN
                    Counter_V:=Var_R[i_k-2];
                    Step_RS485 :=1;
                    Value:=0;
                END_IF
            END_FOR
        END_IF
        fbTimer(IN:=TRUE,PT:=t#1s); (*Watchdog receive*)
        IF fbTimer.Q THEN
            fbTimer(IN:=FALSE);
            Step_RS485:=102;
        END_IF
    *)


    2:   fbTimer(IN:=TRUE,PT:=t#1s); (*Watchdog receive*)
        IF fbTimer.Q THEN
            fbTimer(IN:=FALSE);
            Step_RS485:=102;
        END_IF

    100: ; (*ERROR open port*)
    101: ; (*ERROR send data*)
    102: Step_RS485 :=1; (*WD ERROR no data receive*)
    END_CASE
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • #4
    elakota
    Level 13  
    Konwerter jest typu usb. Nie ma diód. Jest dobry bo w innymi urzadzeniami po 485 rozmawia.

    O jakim mapowaniu wejść /wyjść mowa? Mam zrobione dla IO dyskretnych dla RS485 nie robiłem żadnego mapowania.
  • #5
    Rariusz
    Automation specialist
    Witam

    elakota wrote:

    O jakim mapowaniu wejść /wyjść mowa? Mam zrobione dla IO dyskretnych dla RS485 nie robiłem żadnego mapowania.


    Może trochę się rozpędziłem. Przy kożystaniu np z modułu CANopen trzeba
    wykonać mapowanie zmiennych do I/O tzn. przypisać fizyczne wejścia/wyjścia
    do zmiennych w PLC. W tym przypadku widzę że port COM jest bezpośrednio
    w jednostce głównej więc chyba tego robić nie trzeba.

    To co przychodzi mi na myśl:
    1) Czy GND jest podłączone?
    2) Wykonałbym komunikację dla samego RS232 i sprawdził czy działa.
    3) Sprzwdziłbym jeszcze raz wszystkie ustawienia zgodznie z dokumntacją. Np. sprwadził to

    Beckhoff BX9000 Komunikacja RS485 User protocol

    Pozdrawiam,
  • #6
    jumaaa
    Level 10  
    elakota wrote:
    O jakim mapowaniu wejść /wyjść mowa? Mam zrobione dla IO dyskretnych dla RS485 nie robiłem żadnego mapowania.


    Po wgraniu programu i próbie uruchomienia RS, powinieneś widzieć zmieniające się zmienne w System Manager.

    COM Port > Outputs > Control Word oraz Byte n

    Jeśli na wyjściach COM Portu w System managerze nic się nie zmienia, tzn. że nie polinkowałeś zmiennych.