Servus,
Also ich hab mir mal dein Projekt angeschaut.
1. In NetPro solltest du bei deiner TCP Verbindung anstelle von Fetch/Write Send/Receive einstellen.
2. Deine Steuerung muss als Modbus-Server arbeiten. D.h. wenn sie vom Modbus-Client (Master) nicht gefragt wird, dann hat sie die Klappe zu halten.
Bei deiner Konstellation schickst du jedoch ständig selber Modbus-Requests (Anfragen) - du versuchst also selber als Client (Master) zu arbeiten.
3. In deinem Empfangs-FC gehst du davon aus, dass du ein Modbus-Telegramm mit 19 Byte Nutzdaten erhälst - ist das wirklich so. Der CP343 schickt dir nur dann 19 Byte, wenn er auch wirklich 19 Byte in seinem Empfangspuffer zur Verfügung hat ! Wenn der Client (Master) jetzt ein Telegramm mit weniger als 19 Byte Nutzdaten schickt, dann sagt der AG_Receive freilich es sind keine Daten vorhanden.
Ich vermute hier eine fehlende Zuordnung MODBUS-Register zu SPS-Datenbaustein (Stichwort Pre-Mapping), finde aber weder in Hardwareconfig noch NetPro eine Möglichkeit diesbezüglich etwas einstellen zu können.
Wer oder wo soll denn bitte hier was mappen. Das ganze wie von dir programmiert ist ja noch lange kein richtiger Modbus-Treiber - sondern lediglich ein Ansatz als Modbus Client (Master) und schon lange nicht als Modbus Server (Slave). Das mappen bzw. zuordnen der Modbus-Daten zu deinen Siemens-Datenbausteinen das müsstest du dann schon noch ausprogrammieren.
Ich glaub so wird das ganze nichts. Du solltest dir mal bei
http://www.modbus.org
die Modbus-Spezifikationen besorgen und ein bissel einlesen. Und vor allem den Unterschied zwischen Client/Server bzw. Master/Slave verstanden zu haben.
Was wird denn von der Auftragsverwaltung abgefragt bzw. geschrieben ?
Kann das ganze mit einem Modbus-Auftrag abgewickelt werden oder werden von der Auftragsverwaltung mehrere Aufträge der Reihe nach abgearbeitet.
Wenn du einen Modbus-Server erstellen willst, der mit mehreren Anfragen zurecht kommen soll, dann wird das schon ein bissel komplizierter.
Die Modbus-Anfragen von der Auftragsverwaltung haben sicherlich nicht die gleiche Nutzdatenlänge, du musst also jeweils im Header auswerten wieviele Nutzdaten noch folgen und dann einen variablen Any-Pointer zusammenbauen und diesem deinem Nutzdaten Receive übergeben.
Das was du dann zurückschicken musst (Send) hängt dann auch wieder davon ab, was die Auftragsverwaltung wissen will (Functioncode). Das ganze ist dann natürlich auch variabel in der Länge.
Weiters musst du den Transaction-Identifier (Byte 0 und 1 im Empfangstelegramm) auswerten und jeweils in deinem Sendetelegramm wieder zurückschicken.
Im übrigen wirst du dir bei der ganzen Sache mit FUP gewaltig die Finger brechen - wenn das was vernünftiges werden soll, dann musst du die Sache in AWL angehen.
usw. usw.
Vielleicht kommst du doch schneller und billiger zum Ziel, wenn du die fertigen Bausteine von Siemens verwendest. Bevor du hier einige Stunden in den Sand setzt, und das ganze dann doch nichts wird.
Mfg
uncle_tom