-> Hier kostenlos registrieren
Hallo,
Ich bin ein C/C++/C# Programmierer der sich gerade mit ST rumschlagen muss. Und da hab ich ein paar Probleme, denke das ich da ein paar Grundlegende Dinge falsch mache.
Ich hab ein Funktionsbaustein in dem ich einmalig übergebene werte an eine selbst definierte Struktur übergebe. Diese ist als VAR_IN_OUT deklariert.
Hier der Code:
Hier noch ein Baustein der dieses Struct verwendet (Haupt Arbeitscode wegen Größe entfernt).
Das ganze rufe ich dann über ein Programm auf (in CFC), siehe Bild.
Das CFC Programm rufe ich über mein MAIN programm auf, in der auch de Modbusschnittstelle deklariert wurde:
Aber aus irgend einem Grund scheinen keine Werte in der Struktur zu sein, zumindest nicht wenn sie außerhalb von RomutecMaster verwendet wird. Der "Debugger" zeigt nur "???", Folglich kommt auch keine Modbuskommunikation zu Stande.
Ich bin ein C/C++/C# Programmierer der sich gerade mit ST rumschlagen muss. Und da hab ich ein paar Probleme, denke das ich da ein paar Grundlegende Dinge falsch mache.
Ich hab ein Funktionsbaustein in dem ich einmalig übergebene werte an eine selbst definierte Struktur übergebe. Diese ist als VAR_IN_OUT deklariert.
Hier der Code:
Code:
TYPE TypRomutec :
STRUCT
bSlaveAddress : BYTE;
bActiveModule : BYTE;
bTotalModules : BYTE;
aModuleAddresses : ARRAY [0..9] OF BYTE := 16#FF,16#FF,16#FF,16#FF,16#FF,16#FF,16#FF,16#FF,16#FF,16#FF;
tTimeout : TIME;
xInit : BOOL;
MB: ModbusRtuMaster_PcCOM;
END_STRUCT
END_TYPE
Code:
FUNCTION_BLOCK RomutecMaster
VAR_INPUT
bSlaveAddress : BYTE := 160;
tTimeOut : TIME := t#1s;
ModbusComPort: ModbusRtuMaster_PcCOM;
END_VAR
VAR_IN_OUT
sRomutec :TypRomutec;
END_VAR
VAR
xInit : BOOL;
END_VAR
Code:
IF NOT xInit THEN
sRomutec.bSlaveAddress := bSlaveAddress;
sRomutec.MB := ModbusComPort;
sRomutec.tTimeout := tTimeOut;
xInit := TRUE;
END_IF
Hier noch ein Baustein der dieses Struct verwendet (Haupt Arbeitscode wegen Größe entfernt).
Code:
FUNCTION_BLOCK BDH1401
VAR_INPUT
xEnable : BOOL := TRUE;
bModuleAddress : BYTE;
bModuleGroup : BYTE := 0;
END_VAR
VAR_OUTPUT
END_VAR
VAR
bOutput : BYTE;
aInput : ARRAY[0..2] OF BYTE;
iState: BYTE;
END_VAR
VAR_IN_OUT
sRomutec :TypRomutec;
END_VAR
Code:
IF InitRomutec(bModuleAddress, sRomutec) THEN
CASE iState OF
0: sRomutec.MB.ReadInputStatus(
UnitID:=sRomutec.bSlaveAddress , (* Slave address *)
Quantity:=24 ,
MBAddr:=bModuleAddress *32 ,
cbLength:=3 ,
pMemoryAddr:=ADR(aInput) , (*Copy in the input array *)
Execute:=TRUE ,
Timeout:=t#1s );
IF NOT sRomutec.MB.BUSY THEN
sRomutec.MB.ReadInputStatus(Execute:=FALSE);
iState:=1;
END_IF
1: sRomutec.MB.WriteMultipleCoils(
UnitID:=sRomutec.bSlaveAddress , (* Slave address *)
Quantity:=8 , (* Write 1 Byte *)
MBAddr:=bModuleAddress *32 ,
cbLength:=1 ,
pMemoryAddr:=ADR(bOutput) ,(*Copy to the output *)
Execute:=TRUE ,
Timeout:=t#1s );
IF NOT sRomutec.MB.BUSY THEN
sRomutec.MB.WriteMultipleCoils(Execute:=FALSE);
iState:=0;
NextModule(sRomutec); (* Gehe zum nächsten Modul *)
END_IF
END_CASE
END_IF
Das ganze rufe ich dann über ein Programm auf (in CFC), siehe Bild.
Code:
PROGRAM Test
VAR
Mod1: BDH1401;
Master: RomutecMaster;
Mod2: BDH1401;
sRomutec: TypRomutec;
x1: BOOL;
END_VAR
Das CFC Programm rufe ich über mein MAIN programm auf, in der auch de Modbusschnittstelle deklariert wurde:
Code:
PROGRAM MAIN
VAR
MB: ModbusRtuMaster_PcCOM;
fbBX_COM_64 : FB_BX_COM_64;
ComConfig : ST_COMConfig;
xInit : BOOL := TRUE;
END_VAR
Code:
(* BX COM 2 Interface *)
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 := 1; (*0-RS232 / 1-RS485*)
(* convert Modbus lib to the seriell BX interface *)
fbBX_COM_64();
(* see globale variables VAR_CONFIG *)
fbBX_COM_64.pstrEmo_IN := ADR(MB.InData );
fbBX_COM_64.pstrEmo_Out := ADR(MB.OutData );
Test;
Aber aus irgend einem Grund scheinen keine Werte in der Struktur zu sein, zumindest nicht wenn sie außerhalb von RomutecMaster verwendet wird. Der "Debugger" zeigt nur "???", Folglich kommt auch keine Modbuskommunikation zu Stande.