-> Hier kostenlos registrieren
Hallo,
ich versuche einen ModbusTCP Server mithilfe der ModbusFB-Bibliothek einzurichten. Soweit habe ich auch die Verbindung stehen, allerdings bekommt mein Client keine daten übertragen und auch auf dem Holdingregister schreiben funktioniert nicht. Sowohl Client als auch Serve zeigen mir dabei keine Fehler an.
Ich mache das übrigens nicht über den Konfigurator aus dem Device-Tree, da ich parameter später aus dem Programm heraus verändern können möchte. (z.B. Registergröße, Offsets usw.)
Ich habe mich sehr an dem Beispielprojekt für die Bibliothek orientiert. Die Dokumentation dazu findet man hier -> ModbusFB Codesys Online Help
Die Arrays für Holding- und Inputregister in der GVL ModbusTCP sind jeweils 200 Werte lang und vom Typ WORD.


Der Code sieht so aus:
PROGRAM prgModbusTCP
VAR
//Setup-Variable
xSetupDone: BOOL:= FALSE;
//Server-FB initialisieren
Server_ModbusTCP: ModbusFB.ServerTCP;
// setze unterstützte MB-Funktionen
fcsSupported : ModbusFB.SupportedFcs := (
ReadCoils:=TRUE,
ReadDiscreteInputs:=TRUE,
ReadHoldingRegisters:=TRUE,
ReadInputRegisters:=TRUE,
WriteSingleCoil:=TRUE,
WriteSingleRegister:=TRUE,
WriteMultipleCoils:=TRUE,
WriteMultipleRegisters:=TRUE,
MaskWriteRegister:=TRUE,
ReadWriteMultipleRegisters:=TRUE);
//setze Array vom Typ TableSection für Sektionskonfiguration
aRegisterSections: ARRAY[0..3] OF ModbusFB.TableSection;
//Setze Daten für Konfiguration der Datenstruktur
DataStructure : ModbusFB.TableDefinitions := STRUCT(
tableDiscreteInputs := STRUCT(
uiNumSections := 0, // Keine Discrete Inputs
pSections := ADR(aRegisterSections[3]) // Leeres Array
),
tableCoils := STRUCT(
uiNumSections := 0, // Keine Coils
pSections := ADR(aRegisterSections[2]) // Leeres Array
),
tableInputRegisters := STRUCT(
uiNumSections := 1,
pSections := ADR(aRegisterSections[1]) // Input Register Sektionen
),
tableHoldingRegisters := STRUCT(
uiNumSections := 1,
pSections := ADR(aRegisterSections[0]) // Holding Register Sektionen
));
END_VAR
IF NOT xSetupDone THEN //wird nur beim ersten Start ausgeführt
//Sektionskonfiguration
//Holding Register
aRegisterSections[0].uiStart:= 32000;
aRegisterSections[0].uiNumDataItems:= 121;
aRegisterSections[0].pStartAddr:= ADR(ModbusTCP.awHoldingRegister[0]);
aRegisterSections[0].uiDataItemSize:= 16;
//Input Register
aRegisterSections[1].uiStart:= 0;
aRegisterSections[1].uiNumDataItems:= 107;
aRegisterSections[1].pStartAddr:= ADR(ModbusTCP.awInputRegister[0]);
aRegisterSections[1].uiDataItemSize:= 16;
//Coils (nicht benutzt)
aRegisterSections[2].uiStart:= 0;
aRegisterSections[2].uiNumDataItems:= 0;
aRegisterSections[2].pStartAddr:= ADR(ModbusTCP.axCoils);
aRegisterSections[2].uiDataItemSize:= 1;
//Discrete Inputs (nicht benutzt)
aRegisterSections[3].uiStart:= 0;
aRegisterSections[3].uiNumDataItems:= 0;
aRegisterSections[3].pStartAddr:= ADR(ModbusTCP.axDiscreteInputs);
aRegisterSections[3].uiDataItemSize:= 1;
//Modbus Server
//Konfiguration
Server_ModbusTCP(fcsSupported:=fcsSupported, dataModel:=DataStructure, xEnable:=FALSE, wsInterfaceName:=, udiLogOptions:=(ModbusFB.LoggingOptions.ServerStartStop OR ModbusFB.LoggingOptions.ServerReceivedValidRequests));
//aktivieren
Server_ModbusTCP(xEnable:= TRUE);
//Datenmodell laden
Server_ModbusTCP.InitDataModel();
//Setup ausgeführt
xSetupDone:= TRUE;
END_IF
//Server ausführen
Server_ModbusTCP();
Kennt sich da wer mit aus? Ich finde da nicht besonders viel zu.
Danke schonmal
ich versuche einen ModbusTCP Server mithilfe der ModbusFB-Bibliothek einzurichten. Soweit habe ich auch die Verbindung stehen, allerdings bekommt mein Client keine daten übertragen und auch auf dem Holdingregister schreiben funktioniert nicht. Sowohl Client als auch Serve zeigen mir dabei keine Fehler an.
Ich mache das übrigens nicht über den Konfigurator aus dem Device-Tree, da ich parameter später aus dem Programm heraus verändern können möchte. (z.B. Registergröße, Offsets usw.)
Ich habe mich sehr an dem Beispielprojekt für die Bibliothek orientiert. Die Dokumentation dazu findet man hier -> ModbusFB Codesys Online Help
Die Arrays für Holding- und Inputregister in der GVL ModbusTCP sind jeweils 200 Werte lang und vom Typ WORD.


Der Code sieht so aus:
PROGRAM prgModbusTCP
VAR
//Setup-Variable
xSetupDone: BOOL:= FALSE;
//Server-FB initialisieren
Server_ModbusTCP: ModbusFB.ServerTCP;
// setze unterstützte MB-Funktionen
fcsSupported : ModbusFB.SupportedFcs := (
ReadCoils:=TRUE,
ReadDiscreteInputs:=TRUE,
ReadHoldingRegisters:=TRUE,
ReadInputRegisters:=TRUE,
WriteSingleCoil:=TRUE,
WriteSingleRegister:=TRUE,
WriteMultipleCoils:=TRUE,
WriteMultipleRegisters:=TRUE,
MaskWriteRegister:=TRUE,
ReadWriteMultipleRegisters:=TRUE);
//setze Array vom Typ TableSection für Sektionskonfiguration
aRegisterSections: ARRAY[0..3] OF ModbusFB.TableSection;
//Setze Daten für Konfiguration der Datenstruktur
DataStructure : ModbusFB.TableDefinitions := STRUCT(
tableDiscreteInputs := STRUCT(
uiNumSections := 0, // Keine Discrete Inputs
pSections := ADR(aRegisterSections[3]) // Leeres Array
),
tableCoils := STRUCT(
uiNumSections := 0, // Keine Coils
pSections := ADR(aRegisterSections[2]) // Leeres Array
),
tableInputRegisters := STRUCT(
uiNumSections := 1,
pSections := ADR(aRegisterSections[1]) // Input Register Sektionen
),
tableHoldingRegisters := STRUCT(
uiNumSections := 1,
pSections := ADR(aRegisterSections[0]) // Holding Register Sektionen
));
END_VAR
IF NOT xSetupDone THEN //wird nur beim ersten Start ausgeführt
//Sektionskonfiguration
//Holding Register
aRegisterSections[0].uiStart:= 32000;
aRegisterSections[0].uiNumDataItems:= 121;
aRegisterSections[0].pStartAddr:= ADR(ModbusTCP.awHoldingRegister[0]);
aRegisterSections[0].uiDataItemSize:= 16;
//Input Register
aRegisterSections[1].uiStart:= 0;
aRegisterSections[1].uiNumDataItems:= 107;
aRegisterSections[1].pStartAddr:= ADR(ModbusTCP.awInputRegister[0]);
aRegisterSections[1].uiDataItemSize:= 16;
//Coils (nicht benutzt)
aRegisterSections[2].uiStart:= 0;
aRegisterSections[2].uiNumDataItems:= 0;
aRegisterSections[2].pStartAddr:= ADR(ModbusTCP.axCoils);
aRegisterSections[2].uiDataItemSize:= 1;
//Discrete Inputs (nicht benutzt)
aRegisterSections[3].uiStart:= 0;
aRegisterSections[3].uiNumDataItems:= 0;
aRegisterSections[3].pStartAddr:= ADR(ModbusTCP.axDiscreteInputs);
aRegisterSections[3].uiDataItemSize:= 1;
//Modbus Server
//Konfiguration
Server_ModbusTCP(fcsSupported:=fcsSupported, dataModel:=DataStructure, xEnable:=FALSE, wsInterfaceName:=, udiLogOptions:=(ModbusFB.LoggingOptions.ServerStartStop OR ModbusFB.LoggingOptions.ServerReceivedValidRequests));
//aktivieren
Server_ModbusTCP(xEnable:= TRUE);
//Datenmodell laden
Server_ModbusTCP.InitDataModel();
//Setup ausgeführt
xSetupDone:= TRUE;
END_IF
//Server ausführen
Server_ModbusTCP();
Kennt sich da wer mit aus? Ich finde da nicht besonders viel zu.
Danke schonmal