Lars Weiß
Level-3
- Beiträge
- 1.266
- Reaktionspunkte
- 266
-> Hier kostenlos registrieren
Hallo Gemeinde,
ich hab da mal ein Problem. Ich habe heute mehr oder weniger erfolgreich einen FB für Modbus/TCP zusammgezirkelt.
Funktioniert auch soweit. Mit dem Testprogramm ModScan32 von WinTech spreche ich die SPS an.
Funktionscode 03h, n Register lesen, SPS antwortet, passt.
Jetzt das Problem: Ich wollte den Empfangpuffer für AG_SEND so groß wählen, das wenn ModScan mit den Funktionscode 10h, n Register schreiben kommt mein Baustein auf jeden Fall alles im Puffer hat. Funzt nicht.
Weil:
Für den Funktioncode 3h ist das Kommandotelegramm 12Byte lang (6B Header + 1B Slave-Adresse + 1B Funktionscode + 2B Register Offset + 2B Anzahl Register). Gebe ich am AG_RECIEVE für den Empfangbereich 12 Byte an wird korrekt übertragen, ist er grösser werden die 12Byte wie in einem Ringspeicher angehängt, also nicht mehr vernünftig auszuwerten.
Also, wie stelle ich das an, ich kann ja nicht wissen wie viele Bytes der Partner mir senden will. Funktionscode 6h reicht hier nicht aus, da Real-Werte in meinem Anwendungsfall damit nicht übertragen werden können.
Wieso macht der AG_RECIEVE so einen Müll ?
ich hab da mal ein Problem. Ich habe heute mehr oder weniger erfolgreich einen FB für Modbus/TCP zusammgezirkelt.
Funktioniert auch soweit. Mit dem Testprogramm ModScan32 von WinTech spreche ich die SPS an.
Funktionscode 03h, n Register lesen, SPS antwortet, passt.
Jetzt das Problem: Ich wollte den Empfangpuffer für AG_SEND so groß wählen, das wenn ModScan mit den Funktionscode 10h, n Register schreiben kommt mein Baustein auf jeden Fall alles im Puffer hat. Funzt nicht.
Weil:
Für den Funktioncode 3h ist das Kommandotelegramm 12Byte lang (6B Header + 1B Slave-Adresse + 1B Funktionscode + 2B Register Offset + 2B Anzahl Register). Gebe ich am AG_RECIEVE für den Empfangbereich 12 Byte an wird korrekt übertragen, ist er grösser werden die 12Byte wie in einem Ringspeicher angehängt, also nicht mehr vernünftig auszuwerten.
Also, wie stelle ich das an, ich kann ja nicht wissen wie viele Bytes der Partner mir senden will. Funktionscode 6h reicht hier nicht aus, da Real-Werte in meinem Anwendungsfall damit nicht übertragen werden können.
Wieso macht der AG_RECIEVE so einen Müll ?
Zuletzt bearbeitet: