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
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.
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ý.