TIA CM PtP RS485 Daten via Send_PtP an Aktor versenden

Grapefruuuut

Level-1
Beiträge
36
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
[***gelöst***]CM PtP RS485 Daten via Send_PtP an Aktor versenden

Hallöchen liebe Wissenden,

ich habe das Problem, dass ich absolut neu in die RS485 Welt mit der SPS einsteige und habe leider das Problem nicht zu wissen, wie ich Daten senden kann.
Wir haben eine S7-300 nutzen einige ET200SP mit einem CM PtP, in Verbindung mit TIA 12.

Der Aktor (Druckcontroler), muss mit einer Sollwertvorgabe via RS485 versorgt werden. Den Baustein Send_PtP habe ich mir schon einmal angesehen und habe
jetzt leider einfach noch ein paar Problemchen. Wir wollen 11Byte an Infos senden und ihm so mitteilen, was der Druckcontroler zu tun hat.
Beim Send_PtP gibt es einen Buffer Eingang, wenn ich es richtig verstanden habe, könnte man diesen mit den Infos versehen, die gesendet werden sollen. Wie kann
ich ihm denn beliebige 11Byte verpassen?! In der Variablentabelle kann man keine Strings deklarieren und irgendwie blicke ich da generell nicht durch. Ich habe mir das
Programmierhandbuch A5E31625080-AA besrogt, finde darin aber leider auch nicht die Infos, die ich benötige.
Bitte helft mir und erklärt mir, wie ich das realisieren kann. Es soll halt später so sein, ich habe auf meinem HMI ein Eingabefeld, gebe dort den Druck vor, der wird zu nem
String gemacht, dieser wird dann seriell über RS485 an das Gerät geschickt und bekomme dann den aktuellen Druck über RS485 zurück und zeige mir diesen ebenfalls auf dem
HMI an.

LG
Christian
 
Zuletzt bearbeitet:
Hi,
also ich mache das immer über einen Datenbaustein,
dort kann man Strings deklarieren. Diese dann an den Buffer Eingang gelegt und fertig.
Umgekehrt den empfangenen String im Datenbaustein zwischen speichern und weiterverarbeiten.

Gruß Dirk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lieben Dank für die schnelle Rückmeldung.

Könnten wir da denn bitte noch etwas ins Detail gehen?!
Das bedeutet in dem Baustein deklarierst du unter Input eine String-Variable und packst den an den Buffer, richtig?! Soweit so gut, die Frage ist jetzt nur, wie kannst du diese Variable ändern bzw an den Inhalt der Vorgabe aus dem Textfeld auf dem HMI anpassen?!
Kannst du mir das bitte im Detail erklären?! Da blicke ich nämlich noch nicht ganz durch.

Danke. Lg
 
Mit dem Baustein VAL_STRG (zu finden unter Erweiterte Anweisung) kannst du einen Real Wert in einen String wandeln.
Real kann das HMI verarbeiten (ein/ausgabe Feld Typ Real).
Mit dem Baustein STRG_VAL wird dein String wieder zurückgewandelt in Real.
Du deklarierst in einem DB einmal den Real Wert vom Eingabe Feld des HMI, wandelst den in String um (auch im DB deklarieren).
Diesen String Wert kannst du dann senden und jedesmal wenn du am HMI eine Eingabe machst ändert sich der String dementsprechend.
Beim empfangen ist es halt um gekehrt. Deklarierst wieder einen String im DB den du empfängst und wandelst den wieder um in Real
und gibst den auf deinem HMI im Ausgabefeld aus.


Gruß Dirk
 
Klingt bis dahin ganz verständlich. Kann man dem Baustein val_strg denn auch eine Größe bzw länger mitteilen?! Ich bräuchte 11byte. Das bedeutet, dass dies alles außerhalb der PLC variablentabelle geschieht?! Habe ich das richtig verstanden?!
Ich werde mir das morgen früh mal zu Gemüte führten, hoffe ich kann damit dann irgendwie etwas anfangen. Ich danke dir Dirk.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Richtig das läuft alles außerhalb der Variabelentabelle.
Ja die Größe kannst du dem Baustein sagen. Ruf dir die Bausteine mal auf und dann F1.
Die sind da ganz gut beschrieben.
Da sind dann auch Tabellen zu sehen was bei welcher Länge eingetragen werden soll.
 
Sodele,

habe ein paar Dinge ausprobiert und bin auch ein ganzes Stück weiter, aber nicht da, wo ich hin möchte.

Den Baustein Val_Strg gibt es in TIA 12 nicht. Stattdessen nutze ich den Baustein Send_PtP, es wird auch defitniv etwas geschickt, aber nicht das richtige.
Es sollen 11Byte übertragen werden, ich habe den Baustein wie folgt beschaltet:

REQ wird mit einem Button auf der HMI getriggert, funktioniert auch
Port dort habe ich die erste Eingangadresse meines CM PtP Moduls eingetragen, ist auch korrekt
Buffer dort habe ich einen Verweis auf eine Variable, diese wird vom Baustein HTA gefüttert. HTA wird vom DB gefüttert, indem ich 11Bytes stehen habe.
"Byte 1" '55'
"Byte 2" 'xx'
....
Hier scheint es ein Problem zu geben. Ich verweise mit einem Pointer auf das 1. Byte und möchte alle folgenden umwandeln, scheint halbwegs zu funktioeren,
zumindest erscheint am Send_ptp Baustein-Eingang der String in Hex, den ich senden möchte,....37..........16$00$00$00$00$00$00$00$00$00$00$00$00.....
Die $00 werden hintern immer angehangen, verstehe ich zwar nicht ganz, scheint aber keine Auswirkungen zu haben. Ich habe mir mit HTerm mal angesehen, was gesendet
wird, es werden genau 11Byte gesendet, aber nicht mit dem Inhalt, der vorne am Send_PtP Baustein anliegt. Im Prinzip stimmt nur die 10.Position, sprich das 10.Byte.
Length ist mit 11 deklariert, da ich ja 11Byte übertragen möchte.

Kennt jemand mein Problem bzw. kann mir sagen was ich falsch mache?! Laut Programmierhandbuch für mein CM PtP an dezentraler Peripherie, bin ich der Meinung, dass ich alles richtig deklariert habe.
Es läuft aber wie gesagt nicht, weil nicht das geschickt wird, was vorne am Sendenbaustein anliegt und das Gerät, welches via RS485 bedient werden soll, sich nicht angesprochen fühlt.

LG
 
Ich habe nochmal ein paar Dinge geändert. Ich habe jetzt nur noch den send_ptp Baustein und trigger diesen mit einem bool Merker und habe am Buffer einen DB, dieser ist mit einem Array 0..10, sprich 11Bytes belegt und als Typ Byte initialisiert. Dort befinden sich alle Hex Daten als Startwert.
Der Buffer verweist auf das erste Byte in diesem Array und schickt auch leider nur dieses,....was mache ich falsch?!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was genau hast Du an den Eingang vom Send_PtP geschrieben?
Falls Du da sowas wie DB1.bArray[0] stehen hast, lass mal die Klammer weg und schreibe nur DB1.bArray (das bArray müsste als ARRAY[0..10] OF BYTE deklariert sein)
In Step7 classic müsste man schreiben: P#DB1.DBX0.0 BYTE 11
Geht sowas auch in TIA?

Vielleicht kann man auch ein STRING[11] dranschreiben? Ein STRUCT mit 11 Bytes gibt es ja wohl nicht.

Harald
 
Guten Abend,

erstmal danke für die schnelle Beteiligung. Ich kann Morgen gerne mal ein Bild posten wie das aussieht.
Aber es ist sowas wie DB1.DBB0 oder sowas in der Art. Wenn ich es live beobachte, dann steht da auch das P# vor, dass bedeutet aber mir, dass es ein Pointer ist, oder?!

Unter dem DB1.... in hellblau steht dann noch die Bezeichnung in "..." und innerhalb des Arrays das erste Byte.

Schon doof, dass das nirgendwo vernünftig beschrieben ist und ich habe schon verdammt viel gelesen. Ich habe leider erst mit TIA angefangen und habe so den Eindruck das es keine detaillierte Literatur gibt und viele Fachleute sich einfach streunen damit Erfahrungen zu sammeln.
 
Hallo,

hast du mal versucht den DB wo deine Werte drin stehen nicht als optimiert zu erstellen?
Erstelle den DB als nicht Optimiert, lege da das Array an (Array of Byte) und lege das an den Buffer.
Ich hatte auch schon bei manchen Sachen mit den optimierten DB´s.

Gruß Dirk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 23736
So sieht das bei mir aus. Das "11Bytes" [0], steht für den Variablenname "11Bytes" und das ist die erste Position innerhalb des Arrays von 0-10.
Length ist halt auch noch ne Sache die ich nicht verstehe, mal steht da, man soll die Anzahl der zu sendenen Bytes angeben und dann steht da auch mal:

Buffer + Array: Beim Senden gilt: Der Length-Wert muss eine Bytezahl kleiner als die vollständige Bytelänge des Arrays enthalten, wobei es sich um ein Vielfaches der Bytezahl
des Datenelements handeln muss. Beispiel: Der Parameter LENGTH eines Arrays vom Typ Word muss ein Vielfaches von zwei sein und bei einem Array vom Typ Real ein Vielfaches von vier.
Wenn Length angegeben wird, wird die Anzahl der Array-Elemente in LENGTH-Bytes übertragen. Wenn beispielsweise BUFFER ein Array mit 15DWord-Elementen (insgesamt 60Bytes) enthält und sie geben LENGTH=20
an, werden die ersten fünf DWord-Elemente aus dem Array übertragen.

Ich habe an meinen Buffer auch schon mal 10 oder 8 geschrieben und trotzdem hat er immer nur das erste Zeichen übertragen.Dirk, was meinst du mit nicht optimiert?! Beim erstellen des DB`s gibt es nicht so viel Auswahl,... Ich kann festlegen ob es ein GlobalDB ist und ob die Nummer manuell oder automatisch vergeben werden soll.
Das war es. Ob es sich um einen Array DB oder Byte, String, Word, whatever DB handelt, wird dann innerhalb dessen festgelegt. LG
 
Was mir auch noch aufgefallen ist, in der PLC- Systemkonstanten, taucht meine RS485 Schnittstelle nicht auf. Wenn ich im Internet Informationen zur Schnittstelle gefunden habe, stand dort Immer das CM als Port drin.
Bei mir ist diese komplett leer, obwohl ich ja definitiv schon Daten geschickt habe, aber meistens halt nur 1Hex Zeichen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hast du mal versucht den DB wo deine Werte drin stehen nicht als optimiert zu erstellen?
Dirk, was meinst du mit nicht optimiert?!
"optimierte DB" gibt es nicht bei S7-300. Alle DB sind mit "Standard-Zugriff".


Ich habe kein TIA V12 und auch sonst wenig Erfahrung mit TIA, doch ich meine ich weiß was Dein Problem ist: was Du am Eingang BUFFER dranschreibst scheint immer ein Symbol für ein einzelnes BYTE zu sein - Du mußt aber ein Symbol bzw. einen ANY dranschreiben, was für eine Zugriffsbreite von mindestens 11 Byte steht.

Hast Du mal ausprobiert was ich Dir im Beitrag #9 geraten habe? Besonders das weglassen der Klammer?

Es wäre sehr hilfreich, wenn man Deinen Bausteinaufruf mal sehen könnte. Doch Du scheinst irgendwie vom Pech verfolgt zu sein - Dein Anhang im Beitrag #12 funktioniert nicht - kannst Du den nochmal hochladen?

Das von Dir im EP erwähnte Programmierhandbuch beschreibt im Kapitel 3.1.9 die Parameter LENGTH und BUFFER:
- an BUFFER mußt Du einen Speicherbereich (Struktur, Array, String) angeben, welcher mindestens 11 Byte groß ist --> einen ANY mit Zugriffsbreite >= 11, nicht nur einen Pointer auf die Anfangsadresse des Speicherbereichs!
- an LENGTH mußt Du "11" (oder W#16#B ?) schreiben, dann werden nur (höchstens) die ersten 11 Byte dieses Speicherbereichs gesendet. Oder Du gibst "0" an, dann wird die Gesamtgröße des Speicherbereichs gesendet bzw. bei STRING die tatsächliche Stringlänge. Wenn Du einen Speicherbereich (Array) mit exakt der Länge 11 Byte an BUFFER angibst, dann muß an LENGTH eventuell "0" angegeben werden. (da ist die Siemens-Beschreibung etwas ungenau...)

Probiere mal dies:
- erstelle einen globalen DB: "MyDB"
- in dem DB deklariere: "Sendepuffer" ARRAY [0..19] OF BYTE
- an den Eingang BUFFER schreibe: "MyDB".Sendepuffer
- an den Eingang LENGTH schreibe: 11 (bzw. W#16#B)


PS:
Es müßte doch eigentlich auch im TIA möglich sein, an BUFFER direkt "P#DB1.DBX0.0 BYTE 11" dranzuschreiben - hast Du das probiert? (an LENGTH müßte dann vielleicht "0" angegeben werden)

Harald
 
Ob es Blödheit oder Pech ist, weiß ich noch nicht,....

Nun gut, der Baustein war ja auch das, was ich letztens angehangen habe...:
Send_PtP.jpg

Ich hoffe es funktioniert jetzt. Leider ist jetzt noch einiges andere zu tun, dass ich erst Heute Abend Zeit habe, die Tipps mal auszuprobieren bzw. die eckige Klammer mal weg zu machen,...
Es wäre echt toll, wenn das bald laufen würde. Langsam fange ich an ein bisschen an meiner Kompetenz zu zweifeln.
lg
 
An Length hatte ich auch schon 0 stehen und den Pointer den du oben mit "P#....0.0 BYTE 11" versehen hast, kann man leider nicht umschreiben. Dieser wird per Dropdown Menü ausgewählt und ist dann nicht mehr editirbar.
Darunter steht dann der Variablenname, dort kann man dinge, Parameter oder sonstiges eintragen, aber auch kein Byte 11 oder so.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

hier mal eine Ansteuerung mit passendem DB aus einem Projekt von mir. Das Projekt läuft auf einer CPU 1212 mit Kommunikationsmodul. Verwendet TIA Version 12 Prof.
DB für send_ptp.jpgsend_ptp.jpg

Gruß Dirk
 
Hmm... ob Dein S7-1200-Beispiel dem Grapefruuuut hilft?
Die Anweisung Send_PtP gibt es nicht für die S7-300.
Und die S7-1200 kennt keinen ANY, bei Grapefruuuut ist aber das Problem, daß er einfach keinen korrekten ANY an seine Anweisung Send_P2P drangeschrieben bekommt.

Harald
 
warum gibt es send_ptp für die s7-300 nicht?! ich nutze eine s7-300 und schaffe es ja das erste hex zeichen über den send_ptp zu senden.
er schickt nur nicht die anderen zeichen aus dem array,....ich verstehe es wirklich nicht, was ich da falsch mache.
hat noch jemand eine idee?!
 
Zurück
Oben