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
- Archiv projektové skupiny s příkladem