An TCP Netzwerkteilnehmer Text aus DB senden

Hesse

Level-2
Beiträge
933
Reaktionspunkte
170
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ,

ich möchte eine Text aus einem DB an einen Netzwerkteilnehmer senden.

Mit "TSEND_C_DB" habe ich das auch geschafft s.Bilder

Ergebnis:
Verbindung wird aufgebaut, und es kommt beim Teilnehmer etwas an.
Verbindungsabbau funktioniert auch :D


Aber es kommen nicht 60 Byte an sonder 62 , ich denke die String Kennung (2Byte)
wird mit gesendet. So stehen vor dem Hallo dann immer noch zwei Zeichen .

Wie verhindere ich das bei der S7-1200?

Lösungsansatz:
P#DB7.DBX2.0 BYTE 60 als Eintrag am TSEND_C DATA,
geht wenn ich den DB als
Nicht optimiert (S7/300/400 kompatibel anlege)

Aber es muss ja auch anders (Richtiger ?) funktionieren.
Wie lege ich den DB besser an ?

Danke für eine Hilfe
 

Anhänge

  • DB7_1.jpg
    DB7_1.jpg
    35,1 KB · Aufrufe: 26
  • Main_Tsend_c_1.JPG
    Main_Tsend_c_1.JPG
    28,8 KB · Aufrufe: 48
In den ersten 2 Byte stehen die Maximallänge und die Länge des Strings.

Wenn der String immer 60 Byte lang ist, dann würde sich vielleicht ein ARRAY[0..59] OF CHAR anbieten, wenn nicht, dann ist es sinnvoll wenn die PC-Software die Länge auswertet und nur die benutzten Bytes bearbeitet.

Ein weiterer Vorteil für die Längenangabe ist auch noch, dass man nicht aufpassen muss, wenn mal ein kürzerer String eingetragen wird, dass der restliche Teil des Strings initialisiert wird, da sonst noch etwas altes drinstehen kann, sondern muss nur sicherstellen, dass das Längenbyte stimmt.
 
Hallo,
danke euch beiden für die Antworten.

Beides: ARRAY[0..59] OF CHAR und Schlüsselwort AT (das kenn ich von uC als OVERLAY)
habe oder werde ich noch testen, folgendes habe ich jetzt herausbekommen.



In den ersten 2 Byte stehen die Maximallänge und die Länge des Strings.
Das ist die Erklärung warum P#DB6.DBX2.0 BYTE 60 funktioniert



P#DB6.DBX0.0 max Länge
P#DB6.DBX1.0 ist Länge
P#DB6.DBX2.0 erstes Zeichen
P#DB6.DBX61.0 max letztes Zeichen


Jetzt müsste ich also den Wert aus „P#DB6.DBX1.0“ (ist Länge) an die Stelle der Länge an den Data Eingang vom Tsend_c ( BYTE 60 ) bekommen


Also so :
P#DB6.DBX2.0 BYTE P#DB6.DBX1.0

Das gibt aber ein Syntax Error :-(

(die Länge am extra Eingang LEN vom Tsend_c zu schreiben geht auch nicht, da muss immer 0 stehen sonst sendet der gar nix)


Wenn der String immer 60 Byte lang ist
Wahrscheinlich nicht genau 60 aber, immer genau dieselben Texte aus
einer Auswahl von 6-10 festen Texten .
Somit ist jede Textlänge eigentlich im Vorfeld bekannt.

dann ist es sinnvoll wenn die PC-Software die Länge auswertet und nur die benutzten Bytes bearbeitet.
Empfänger ist kein PC, sondern wohl ein Display oder mini Drucker an dem nichts verändert werden kann (da vorhanden).

ARRAY[0..59] OF CHAR
Hat (wenn ich das richtig versanden habe) aber den Nachteil das ich jedes Zeichen einzeln
in eine Zeile im DB schreiben muss.

Und ich habe es noch nicht geschafft :

Das ARRAY[0] an den Data Eingang vom Tsend_c so anzubinden das mehr wie ein Zeichen gesendet wird .
Der Tsend_c erkennt nicht die Länge vom Array wo gebe ich da die sendelänge an ?
Es kommt immer nur ein Zeichen beim Empfänger an .

Gruß HH
 
Hi Hesse,

Vorschlag 1:
Expliziertes Char -Array und Verwendung der String-Operation.
Nachteil: das komplette Array wird gesendet und der Empfänger muss anhand des END-Zeichens den String erkennen.

TSEND_C_2.jpg


Vorschlag 2:
AT-Operator, hier muss das 2.Array-Element an DATA-Eingang und LEN explizit angegeben werden.
Wenn du hier die LEN mit der Stringoperation ermittelst wäre es ne gute Lösung.

TSEND_C_1.jpg

Gruß MK
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Mäuseklavier,
danke für deine Hilfe .


00:20 EDIT .....FREU !! :D:D:D

Vorschlag 1 ist wohl die Lösung !

Mit der Änderung : an LEN Eing. vom TSEND_C noch anstelle von der 0 ---> #MyLen_Uint


Und es klappt auch mit der Sendelänge !
Datenpaket ist dann genau so lang wie der String

Jetzt ist es aber spät genug, melde mich noch mal ob die Freude im
Zweiten Test noch vorhanden ist
Gruß HH

Dennoch zu Vorschlag 2 (vorm EDIT)
Mit dem AT überlagern das klappt so,
aber der Baustein Tsend_C spielt nicht mit

Ergebnisse in der Praxis :

#MyCharArray[2] an DATA und 60 an LEN ----> keine Daten am Empfänger (sendet gar kein Paket)
#MyCharArray[2] an DATA und 0 an LEN ----> ein Zeichen am Empfänger (das „H“ vom Hallo)
#MyCharArray an DATA und 0 an LEN ----> 60 Zeichen am Empf. mit den zwei Längenangaben am Anfang
#MyCharArray an DATA und 30 an LEN ----> 30 Zeichen am Empf. mit den zwei Längenangaben am Anfang

(Sendepakete auch mit Wireshark kontrolliert)
 
Zuletzt bearbeitet:
Dennoch zu Vorschlag 2 (vorm EDIT)
Mit dem AT überlagern das klappt so,
aber der Baustein Tsend_C spielt nicht mit

Ergebnisse in der Praxis :

#MyCharArray[2] an DATA und 60 an LEN ----> keine Daten am Empfänger (sendet gar kein Paket)
#MyCharArray[2] an DATA und 0 an LEN ----> ein Zeichen am Empfänger (das „H“ vom Hallo)
#MyCharArray an DATA und 0 an LEN ----> 60 Zeichen am Empf. mit den zwei Längenangaben am Anfang
#MyCharArray an DATA und 30 an LEN ----> 30 Zeichen am Empf. mit den zwei Längenangaben am Anfang

(Sendepakete auch mit Wireshark kontrolliert)

Sorry Fehler von mir und du hast es nicht bemerkt.
Das Array am view sollte [0..59] sein.
Und dann #MyCharArray[2] mit LEN <= 58 angeben.

Gruß MK
 
Guten morgen ,

Sorry Fehler von mir und du hast es nicht bemerkt.
doch habe ich, habe es nur nicht erwähnt. Wuste ja nicht das es ein Test ist ob ich aufpasse.. :) :)



Ändert aber nichts an der Sache :

#MyCharArray[2] an DATA und <=58(60) an LEN ----> keine Daten am Empfänger (sendet gar kein Paket)
#MyCharArray[2] an DATA und 0 an LEN ----> ein Zeichen am Empfänger (das „H“ vom Hallo)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...Wuste ja nicht das es ein Test ist ob ich aufpasse.. :) :)

:sm5: hee hee genau dass!




Ändert aber nichts an der Sache :

#MyCharArray[2] an DATA und <=58(60) an LEN ----> keine Daten am Empfänger (sendet gar kein Paket)
#MyCharArray[2] an DATA und 0 an LEN ----> ein Zeichen am Empfänger (das „H“ vom Hallo)

Schade da es ja einfacher wäre,
habe keine Steuerung hier, werd es aber bei Gelegenheit selbst nocheinmal probieren.

Gruß MK
 
Ich meine, #MyCharArray[2] bedeutet 1 Zeichen (CHAR). An TSEND_C:DATA muß aber ein Bereich #MyCharArray[2]...#MyCharArray[61] angegeben werden.
Und an TSEND_C:LEN müßte korrekterweise #MyCharArray[1] dranstehen, eventuell vorher in eine Variable mit zum Eingang kompatiblen Datentyp kopieren.

Harald
 
Hallo Harald

Ich meine, #MyCharArray[2] bedeutet 1 Zeichen (CHAR). An TSEND_C:DATA muß aber ein Bereich #MyCharArray[2]...#MyCharArray[61] angegeben werden.

Hier liegt wohl der Teufel im Detail.
Lt. Hilfe muss LEN nur dann von 0 abweichen, wenn DATA absolut adressiert ist. Demnach dürfte #MyCharArray[2] nur als ein Zeichen funktionieren.
Wäre halt mal durchzutesten, ach mit %DBx.DBBy und dann LEN-Angabe.

Und an TSEND_C:LEN müßte korrekterweise #MyCharArray[1] dranstehen, eventuell vorher in eine Variable mit zum Eingang kompatiblen Datentyp kopieren.

Auch möglich als Alternative zur Stringoperation.
Gruß MK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,die ganze Zeit konnte ich noch folgen jetzt bin ich etwas verwirrt ….


Wäre halt mal durchzutesten, ach mit %DBx.DBBy und dann LEN-Angabe.
Wie muß hier der genaue Syntax sein ich bekomme nur Errors


Und an TSEND_C:LEN müßte korrekterweise #MyCharArray[1] dranstehen, eventuell vorher in eine Variable mit zum Eingang kompatiblen Datentyp kopieren.
Ich habe jetzt eine Kombination aus allem gemacht, aber ohne über Array zu gehen


1. An Data --- > P#DB6.DBX2.0 BYTE 60
2. Länge von String bestimmt wie aus Vorschlag 1, und in eine Variable zum LEN-Eingang kompatiblen Datentyp kopieren, und an LEN angelegt


Und siehe da ...... das geht, es wird nur die tatsächliche Länge von String im DB gesendet,
aber nur wenn DB und FB als nicht Optimier Zugriff angelegt sind
 
Zurück
Oben