M.S. Programování Mosaic 18. 2. 2025 16:06 18. 2. 2025 15:02

Dobrý den,

pro použití vstupů a výstupů na ModBus bych chtěl použít strukturu a v ní jednotlivé pole proměnných. Nicméně do samotného pole proměnných (bool) se hodnoty z ModBus načtou, kdežto do pole proměnných ve struktuře se data nenačtou.

Definice struktury:

TYPE
 TDataBlock_4DI_DO : STRUCT //struktura pro Ebyte AI 4DA - 4DO modul
  DI_state : ARRAY [1..4] of BOOL;	        // 0x0000 FNC:02
  DO_state : ARRAY [1..4] of BOOL;  	      // 0x0000 FNC:01
  DO_write : ARRAY [1..4] of BOOL;    	    // 0x0000 FNC:15
  DI_count : ARRAY [1..4] of UINT;      	  // 0x09DF FNC:03
  DO_pulse_width : ARRAY [1..4] of UINT;    // 0x05DC FNC:16
 END_STRUCT;
END_TYPE
PROGRAM ModBusTCP_control
VAR
//test proměnných pro EBYTE ME31-AXAX4040
 DI_test_inputs         :  ARRAY [1..4] of BOOL;       // 0x0000 FNC:02
//
 XAXA4040_test          :  TDataBlock_4DI_DO;          //test struktury
 END_VAR

Následně, pokud v programu použiji:

ModbusCmdTCP (Gr:=1, FNC:=02, UnitID:=9, IP:='192.168.021.52', StAdr:=16#0000,  NoPoint:=4, PtrData:= adr(DI_test_inputs), Cmd:=CmdTCP1[25]); //čtení DI vstupů

tak se do pole data z ModBus načtou, ale pokud chci data načíst do pole ve struktuře:

ModbusCmdTCP (Gr:=1, FNC:=02, UnitID:=9, IP:='192.168.021.52', StAdr:=16#0000,  NoPoint:=4, PtrData:= adr(XAXA4040_test.DI_state), Cmd:=CmdTCP1[25]); //čtení DI vstupů

 pak pole zůstává prázdné.

Děkuji, s pozdravem 
MS
 

Odpovědi 2

Luboš Urban 18. 2. 2025 12:24

Dobrý den,

při volání funkce ModbusCmdTCP musíte v případě diskrétních vstupů a cívek předávat odkaz na pole bitů, jenže když je pole bitů jako prvek struktury, tak funkce ADR vrátí bytovou adresu, nikoli bitovou. Abyste zajistil, že dostanete bitovou adresu, musíte se odkazovat na adresu prvního prvku toho bitového pole, tedy ADR(   XAXA4040_test.DI_state[0]). To samé bude platit pro pole DO_state a DO_write.

M.S. 18. 2. 2025 15:02

Dobrý den pane Urbane,

děkuji za pomoc, toto už funguje. 

Alespoň si můžu přepsat i minulý projekt, kdy jsem po přečtení cívek z frekvenčního měniče tyto přenášel smyčkou do struktury: 

ModbusCmd(Gr:=1, FNC:=01, SNo:=18, StAdr:=0, NoPoint:=32, PtrData:= adr(Hitachi_coils_temp), Cmd:=CmdCH2[21]); // čtení 32 po sobě jdoucích cívek (1 až 32) z měniče Hitachi

FOR i := 1 TO 32 DO Hitachi_dop_coils.Hitachi_control[i] := Hitachi_coils_temp[i];
END_FOR;

Jen tedz v režimu laděni se zobrazí jen první prvek pole:

Ale v nahlížení na data je již celé pole:

Děkuji, 

S pozdravem MS

Tento dotaz je vyřešený.