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.

Komunikacja Modbus RTU BECKHOFF BX9000

tomsonj88 14 May 2012 16:16 4267 5
  • #1
    tomsonj88
    Level 9  
    Witam,
    próbuję podłączyć sterownik PLC z komputerem za pomocą Modbusa RTU. Jako master-komputer, slave- PLC. Wszystkie biblioteki do modbusa mam. Chciałem wysłać coś z kompa do sterownika. Skorzystałem z przykładowych programów ze strony producenta, ale nie wiem jak przetestować poprawność komunikacji.
    Proszę o jakieś wskazówki i podpowiedzi.
    Pozdrawiam
  • #2
    kuba_49
    Level 12  
    tomsonj88 wrote:
    Witam,
    próbuję podłączyć sterownik PLC z komputerem za pomocą Modbusa RTU. Jako master-komputer, slave- PLC. Wszystkie biblioteki do modbusa mam. Chciałem wysłać coś z kompa do sterownika. Skorzystałem z przykładowych programów ze strony producenta, ale nie wiem jak przetestować poprawność komunikacji.
    Proszę o jakieś wskazówki i podpowiedzi.
    Pozdrawiam


    Witam,
    Nie rozumiem pytania czy komunikacja ruszyła? Jeżeli tak to jeżeli wyślesz coś z PC to w BX będzie to widoczne pod jakąś zmienną.

    Pozdrawiam
  • #3
    ser1983
    Level 12  
    Też nie bardzo rozumiem pytania... Wyposaż się w przejściówkę RS485 na USB, podłącz do komputera, uruchom jakiś program (ja używam Radzio! Modbus Master Simulator) i fru. Na BX uruchom program w trybie on-line tak żebyś widział wartości zmiennych na żywo (jeżeli korzystasz z portu wbudowanego to będzie to zmienna typu ModbusRtuMaster_PcCOM, jeżeli KL6041 jakaś analogiczna, nie pamiętam). Sprecyzuj problem, to może będę w stanie bardziej pomóc.
  • #4
    tomsonj88
    Level 9  
    Czy komunikacja ruszyła no to właśnie nie wiem, bo nie wiem jak to sprawdzić. Korzystam z portu wbudowanego COM2 pod rs232, no i nie korzystam z tej zmiennej ModbusRtuMaster_PcCOM, tylko ModbusRtuSlave_PcCOM, bo sterownik ma być Slave'm. Załączę wykorzystywany program (ściągnięty ze strony producenta):

    PROGRAM Modbus
    VAR
    fbBX_COM_64 : FB_BX_COM_64;
    ComConfig : ST_COMConfig;
    fbModbusRtuSlave_PcCom: ModbusRtuSlave_PcCOM;
    Input: ARRAY[0..29] OF INT :=1,3,2,4,3,5,4,6,5,7;
    Output: ARRAY[0..29] OF INT :=1,2,3,4,5,6,7,8,9,10;
    Memory AT %MB0: ARRAY[0..49] OF INT;
    END_VAR

    fbBX_COM_64.ComConfig.eCommPort := COM2;
    fbBX_COM_64.ComConfig.BaudRate := 9600;
    fbBX_COM_64.ComConfig.eDataBits := EIGHT_DATABITS;
    fbBX_COM_64.ComConfig.eStoppBits := ONE_STOPPBIT;
    fbBX_COM_64.ComConfig.eParity := NONE;
    fbBX_COM_64.ComConfig.dwMode := 0; (*0-RS232 / 1-RS485*)

    fbBX_COM_64();
    (*
    fbBX_COM_64.pstrEmo_IN := ADR(Modbus.fbModbusRtuSlave_PcCom.com.Port.IO.in);
    fbBX_COM_64.pstrEmo_Out := ADR(Modbus.fbModbusRtuSlave_PcCom.com.Port.IO.out);
    *)
    fbBX_COM_64.pstrEmo_IN := ADR(Modbus.fbModbusRtuSlave_PcCom.InData );
    fbBX_COM_64.pstrEmo_Out := ADR(Modbus.fbModbusRtuSlave_PcCom.OutData);

    fbModbusRtuSlave_PcCom(UnitID:=5 , (* Slave Address *)
    AdrInputs:=ADR(Input) , (* Modbus 1xxxxx or 3xxxx *)
    SizeInputBytes:=SIZEOF(input) ,
    AdrOutputs:=ADR(Output) , (* Modbus 20800hex / 40800hex *)
    SizeOutputBytes:=SIZEOF(output) ,
    AdrMemory:=ADR(memory) , (* Modbus 24000hex / 44000hex *)
    SizeMemoryBytes:=SIZEOF(memory));

    Input[0]:=Input[0]+1; (*30000hex*)
    Output[0]; (*40800hex*)

    Program niby działa, zmienna input się inkrementuje (nie wiem po co?), no i nie wiem jak sprawdzić poprawność komunikacji. W tym programie (np. Radzio! Modbus Master Simulator) co mam zrobić? No niestety teraz nie mam dostępu do sprzętu to nie sprawdzę tego, dopiero jutro, ale proszę o jakieś podpowiedzi.
  • #5
    kuba_49
    Level 12  
    tomsonj88 wrote:
    Czy komunikacja ruszyła no to właśnie nie wiem, bo nie wiem jak to sprawdzić. Korzystam z portu wbudowanego COM2 pod rs232, no i nie korzystam z tej zmiennej ModbusRtuMaster_PcCOM, tylko ModbusRtuSlave_PcCOM, bo sterownik ma być Slave'm. Załączę wykorzystywany program (ściągnięty ze strony producenta):

    PROGRAM Modbus
    VAR
    fbBX_COM_64 : FB_BX_COM_64;
    ComConfig : ST_COMConfig;
    fbModbusRtuSlave_PcCom: ModbusRtuSlave_PcCOM;
    Input: ARRAY[0..29] OF INT :=1,3,2,4,3,5,4,6,5,7;
    Output: ARRAY[0..29] OF INT :=1,2,3,4,5,6,7,8,9,10;
    Memory AT %MB0: ARRAY[0..49] OF INT;
    END_VAR

    fbBX_COM_64.ComConfig.eCommPort := COM2;
    fbBX_COM_64.ComConfig.BaudRate := 9600;
    fbBX_COM_64.ComConfig.eDataBits := EIGHT_DATABITS;
    fbBX_COM_64.ComConfig.eStoppBits := ONE_STOPPBIT;
    fbBX_COM_64.ComConfig.eParity := NONE;
    fbBX_COM_64.ComConfig.dwMode := 0; (*0-RS232 / 1-RS485*)

    fbBX_COM_64();
    (*
    fbBX_COM_64.pstrEmo_IN := ADR(Modbus.fbModbusRtuSlave_PcCom.com.Port.IO.in);
    fbBX_COM_64.pstrEmo_Out := ADR(Modbus.fbModbusRtuSlave_PcCom.com.Port.IO.out);
    *)
    fbBX_COM_64.pstrEmo_IN := ADR(Modbus.fbModbusRtuSlave_PcCom.InData );
    fbBX_COM_64.pstrEmo_Out := ADR(Modbus.fbModbusRtuSlave_PcCom.OutData);

    fbModbusRtuSlave_PcCom(UnitID:=5 , (* Slave Address *)
    AdrInputs:=ADR(Input) , (* Modbus 1xxxxx or 3xxxx *)
    SizeInputBytes:=SIZEOF(input) ,
    AdrOutputs:=ADR(Output) , (* Modbus 20800hex / 40800hex *)
    SizeOutputBytes:=SIZEOF(output) ,
    AdrMemory:=ADR(memory) , (* Modbus 24000hex / 44000hex *)
    SizeMemoryBytes:=SIZEOF(memory));

    Input[0]:=Input[0]+1; (*30000hex*)
    Output[0]; (*40800hex*)

    Program niby działa, zmienna input się inkrementuje (nie wiem po co?), no i nie wiem jak sprawdzić poprawność komunikacji. W tym programie (np. Radzio! Modbus Master Simulator) co mam zrobić? No niestety teraz nie mam dostępu do sprzętu to nie sprawdzę tego, dopiero jutro, ale proszę o jakieś podpowiedzi.


    Witam,
    1. Sprawdź kabel czy na pewno odpowiednie piny zostały podłączone,
    2. Ustaw takie same parametry transmisji,
    3. Zmienna Memory[0] ma adres 4000hex modbusowy. Użyj 3 funkcji o odpytanie się tego rejestru (Read Holding Registers). Pamiętaj, że masz ustawiony adres 5 (slave adres).
    Pozdrawiam
  • #6
    tomsonj88
    Level 9  
    Czyli ramka będzie wyglądała tak (Chcąc odczytać 3 rejestry): 5 3 4000 3 CRC.
    Nie wiem jak określić CRC. I taką ramkę mam wpisać do programu symulującego mastera, tak?
    No i już wiem, że komunikacja nie działa, bo w tym programie mam Valid Responses:0, a tylko błędy rosną i komunikat Modbus message timeout.