Vzorové programy modbus 15.07.2021 15:24 16.07.2021 12:29

PLC řady Foxtrot 1 měly na rozhraní Ethernet ovladač pro podporu dvou spojení přes protokol Modbus TCP, který zpřístupňoval celou oblast zápisníku adresovatelnou protokolem Modbus. PLC řady Foxtrot 2 tuto podporu neobsahují a protokol Modbus TCP je zajištěn přes knihovnu ModbusRTU, jmenovitě funkční blok  fbModbusTCPslave. Pro většinu případů je tento blok použit tak, že vyhrazuje pro přístup protokolem Modbus TCP uživatelem definovaná pole a zbytek zápisníku je proti přístupu tímto protokolem chráněn.

Pro případ, kdy se chce zachovat zpětná kompatibilita s PLC řady Foxtrot 1, je možné blok fbModbusTCPslave volat tak, aby zpřístupnil celou adresovatelnou oblast zápisníku totožně s původním ovladačem. Způsob, kterým se stejného chování dosáhne popisuje níže uvedený příklad.

Prvním krokem je přidání knihovny ModbusRTU do projektu.

Následně přidáme soubor s definicí počátků zón zápisníku přístupných protokolem Modbus TCP. Tyto definice je nutné provést v mnemokódu, aby nekolidovaly s uživatelskými proměnnými. Soubor do projektu přidáme z menu "Soubor" > "Nový" > "Nový soubor..." Potvrdíme, že má být soubor zařazen do projektu a vybereme typ "Zdrojové soubory Mosaic (*.mos)". Po přidání soubor posune v okně "Soubory projektu" nahoru, aby byl v překladu jako první za konfiguračním souborem "CONFIG.HWC" a doplníme do něho následující definice:

;definice pocatku registru

#def _X_0 %X0.0
#def _S_  %S0
#def _Y_0 %Y0.0
#def _R_  %R0

Poté stačí již standardně přidat program s voláním bloku fbModbusTCPslave a doplnit před něj sekci VAR_EXTERNAL, která zpřístupní definice počátků zón vyššímu jazyku. Hotový program bude vypadat následujícím způsobem:

//prirazeni pocatku registru pro vyssi jazyk
VAR_EXTERNAL
  _X_0 : BOOL;
  _Y_0 : BOOL;
  _S_ : UINT;
  _R_ : UINT;
END_VAR

PROGRAM prgModbusSlave
//program obsluhujici ModbusTCP spojeni
  VAR CONSTANT
    lastTcp : UINT := 1; //index posledniho spojeni (pocet-1)
  END_VAR
  VAR_OUTPUT
  END_VAR
  VAR
    iTcp : UINT;
    TcpSockets : ARRAY[0..lastTcp] OF UINT; //cisla soketu
    MdbTcp : ARRAY[0..lastTcp] OF fbModbusTCPslave; //bloky pro obsluhu
  END_VAR
  VAR_TEMP
  END_VAR

  FOR iTcp := 0 TO lastTcp DO
    IF TcpSockets[iTcp] = 0 THEN
      TcpSockets[iTcp] := OpenUniSocket(protocol := UNI_TCP_SERVER);
    END_IF;

    MdbTcp[iTcp](UnitID := 0, chanCode := TcpSockets[iTcp],
           port := 502,
           inputsCnt := 65535,
           coilsCnt := 65535,
           inputRegCnt := 32768,
           holdingRegCnt := 65535,
           inputs := _X_0,
           coils := _Y_0,
           inputRegs := _S_,
           holdingRegs := _R_);
  END_FOR;

END_PROGRAM

Tak jak je program napsán, zajišťuje kompatibilní chování s původní implementací. Navíc je možné nadefinovat počet spojení, které mají být simultánně obslouženy, změnou konstanty lastTcp.

Archivní skupina projektů obsahující celý příklad je ke stažení v připojených dokumentech.

Připojené dokumenty