Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 28

Thema: Textfile vie Ethernet verschicken

  1. #1
    Registriert seit
    17.06.2013
    Beiträge
    13
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Leute,

    ich stehe vor folgender Aufgabe.

    Ich muss mit einer S7-1214 in einem bestimmten Fall eine Textdatei an einen Etikettendrucker schicken, der Zebra-Drucksprache versteht. (Nicht kompliziert, Textfile existiert schon)
    Ich habe ein bestehendes Netzwerk, wo CPU, Drucker und Display mit Ethernet kommunizieren.

    Nun stellt sich für mich die Frage, mit welchen Bausteinen ich dieses Textfile speichere und wie ich es schaffe, dieses über Ethernet an eine bestimmte Adresse zu schicken.
    Hat hier schon jemand Erfahrungen oder konnte dieses Problem schonmal jemand lösen?

    Über Unterstützung, Tipps und evtl. Lösungen bedanke ich mich bereits jetzt schon.

    Gruß Markus
    Zitieren Zitieren Textfile vie Ethernet verschicken  

  2. #2
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    Hi Markus,

    ich hoffe ich antworte dir nicht zu spät. Aber ich habe genau das was du machen willst schon häufiger gemacht.

    Wir setzen hier auch die S7-1214 ein und senden dabei gelegentlich über RS232 oder eben auch TCP/IP ein Druckfile an ein Zebra PAX-Modul.
    Dabei ist es eigentlich egal ob es sich um ein PAX Modul oder ein anderes Zebra Druckmodul handelt. Die Skriptsprache ist immer ZPL (Zebra Programming Language).

    Nun weiß ich nicht wie weit du dich im Allgemeinen mit dem Drucker auskennst und welchen Drucker du verwendest. - Vielleicht kannst du hierzu noch eine
    Aussage treffen?

    Ich habe das jedenfalls so gelöst das ich mir zur Laufzeit aus mehreren Variablen und festen Elementen wie zum Beispiel Header und sonstige Initialisierungs-
    sequenzen mein Druckfile zusammensetze und in einem Array in einem Datenbaustein ablege.

    Mit dem Baustein TSEND_C kannst du eine TCP Verbindung zu dem Drucker aufbauen, halten und die Daten aus dem Datenbaustein an den Drucker senden.

    Wenn du (immer noch) Hilfe brauchst kann ich dir gerne weiter helfen (will mir jetzt hier nur nicht die Finger wund tippen und du hast das Problem schon
    selbst gelöst).

    Gruß smartie

  3. Folgende 2 Benutzer sagen Danke zu smartie für den nützlichen Beitrag:

    Markus1988 (08.07.2013),QMark (02.07.2014)

  4. #3
    Markus1988 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2013
    Beiträge
    13
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Smartie,

    das klingt ja schonmal sehr gut.
    Als Drucker habe ich einen Eidos Printess Etikettendrucker (versteht aber ZPL Sprache).

    Problem konnte ich noch nicht lösen möchte aber morgen mal eine SPS Verbindung mit dem Drucker aufbauen. Hab den Befel T_Send schon gesehen kann aber noch keine IP Adresse auswählen, vermutlich weil ich erst ein Gerät hinzufügen muss.

    Was ich noch nicht genau weiß wie ich es löse ist der Inhalt des DB's. Hier muss ich ja das ZPL file ablegen oder? Oder muss ich mein ^CC..... Und so da eintippen?

    Für weitere Hilfe bin ich dir im voraus schon dankbar. Falls evtl Bilder hast wäre das ganze noch besser

    Gruß Markus

  5. #4
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    Hallo Markus,
    ich versuche dir morgen Vormittag ein paar Screenshots zu posten, anhand denen
    du das eigentlich hinbekommen solltest.
    Ist eigentlich recht einfach. In dem DB legst du am besten ein Array of Char an, bei dem
    jedes Byte einem Textzeichen deines ZPL Telegrams entspricht. Aber davon werde ich auch
    einen Screenshot posten.

    Welche Version von TIA setzt du ein?

    Gruß smartie

  6. Folgender Benutzer sagt Danke zu smartie für den nützlichen Beitrag:

    Markus1988 (08.07.2013)

  7. #5
    Markus1988 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2013
    Beiträge
    13
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Smartie,

    Version von TIA ist Version 11 SP2 Update 3.

    Danke dir, spart mir sehr viel Zeit an Gehirnschmalz verbraten und vermutlich auch an Ärger.

    Gruß Markus

  8. #6
    Registriert seit
    14.07.2005
    Beiträge
    298
    Danke
    27
    Erhielt 18 Danke für 15 Beiträge

    Standard

    Guten Morgen,

    ich habe jetzt einmal ein paar Screenshots gemacht:

    Wie du auf dem Bild "Druckaufbereitung_DB" siehst habe ich mir einen DB erstellt, der die einzelnen Elemente des Druckauftrags (Löschbefehl, Kopfzeile, Variablen, Fußzeile)
    enthält. Diese einzelnen Arrays wandle ich zur Laufzeit in Strings, setze Sie zu einem Druckauftrag zusammen und wandle den String dann wieder in ein Array (Ausgangsspeicher)
    welches ich an den Drucker sende.
    - Dadurch kann ich flexibel auf die Länge der variablen reagieren.

    Wenn dein Druckauftrag aber immer gleich aussieht brauchst du den ganzen Kram eigentlich nicht. Leg einfach einen DB an, indem du ein Array of CHAR definierst. Jedes Byte des
    Array steht dann für ein Zeichen im Druckauftrag. Wichtig ist das du bei den Steuerzeichen (CR bzw 0D/LR bzw 0A) die richtigen verwendest: 0D entspricht $D, 0A entspricht $A.
    Ich habe das in dem Datenbaustein mal markiert.

    Auf dem Bild "Druckaufbereitung_FC_Param" erkennst du die Parametrierung des CONNECT_DB. Sobald du diese Einstellungen machst sollte der Datenbaustein eigentlich automatisch
    generiert werden. Den gibst du dann am Funktionsbaustein "TSEND_C" als CONNECT an (siehe Bild "Druckaufbereitung_FC_Param" --> Verbindungsdaten).
    Wichtig ist noch das der Verbindungsaufbau durch die SPS geschieht und das der richtige Port eingestellt ist. Die Zebra Drucker haben hier standardmäßig 9100. Sobald du einen Port
    über 2000 eingibst wird die TIA zwar meckern, aber die Eingabe sollte trotzdem akzeptiert werden (wird halt nur gelb markiert).

    Auf dem Bild "Druckaufbereitung_FC" erkennst du dann wie ich meinen "TSEND_C" Baustein belegt habe.

    Ich hoffe du kommst soweit zurecht. - Wenn nicht schreib einfach, ich schau heute von Zeit zu Zeit mal rein.

    Druckaufbereitung_DB.jpgDruckaufbereitung_FC.jpgDruckaufbereitung_FC_Param.jpg

    smartie

  9. Folgende 5 Benutzer sagen Danke zu smartie für den nützlichen Beitrag:

    es_pe_es (13.12.2016),jack911 (19.06.2013),Markus1988 (08.07.2013),QMark (02.07.2014),Schlichti (08.12.2017)

  10. #7
    Markus1988 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    17.06.2013
    Beiträge
    13
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Smartie,

    super, vielen vielen Dank. Werd das heute, spätestens am Freitag mal testen und aufbauen sollte aber mit deiner Anleitung einfach funktionieren.

    Gruß Markus

  11. #8
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Hi

    Zitat Zitat von smartie Beitrag anzeigen
    Diese einzelnen Arrays wandle ich zur Laufzeit in Strings, setze Sie zu einem Druckauftrag zusammen und wandle den String dann wieder in ein Array (Ausgangsspeicher) welches ich an den Drucker sende.
    - Dadurch kann ich flexibel auf die Länge der variablen reagieren.

    Wenn dein Druckauftrag aber immer gleich aussieht brauchst du den ganzen Kram eigentlich nicht. Leg einfach einen DB an, indem du ein Array of CHAR definierst. Jedes Byte des Array steht dann für ein Zeichen im Druckauftrag. Wichtig ist das du bei den Steuerzeichen (CR bzw 0D/LR bzw 0A) die richtigen verwendest: 0D entspricht $D, 0A entspricht $A. Ich habe das in dem Datenbaustein mal markiert.

    zum Wandeln der von String nach CharArray und zurück gibt es zwei Systemfunktionen strg_to_chars und chars_to_strg. Die können einen das lästige Gewurstel mit einzelnen Zeichen im char array doch deutlich erleichtern.
    Und noch etwas was so offensichtlich nicht im Handbuch steht. Angenommen, mein String in der TEMP heißt dings, dann kann man mit #dings[i] auf die einzelnen Zeichen zugreifen. Liest man hinten raus, dann kommt '$00' zurück. Wenn man schreibt, dann kann man den String um jeweils ein Zeichen verlängern. Also angenommen #dings ist 'haus', dann macht #dings[1]:='H' ein 'Haus' draus. Ein #dings[5]:='!' erzeugt ein 'Haus!' aber ein folgendes #dings[7]:='x' geht nicht. Immer nur ein Zeichen dazu.

    Warum ich das erzähle? Wegen der Performance.
    Das Verlängern eines Strings um ein einzelnes Zeichen ist schneller als ein CONCAT oder ein + in SCL mit einem einzelen Zeichen. Etwa Faktor 5.
    Sowohl das CONCAT als auch das überladene + in SCL sind interne Funktionen (MC7-Strich Befehle -- keine SFC oder FC Aufrufe -- also deutlich schneller als auf einer 317) die sich aber mit jeglicher Kombination von Quell und Zielstrings abmühen müssen. Da wird also erst mal viel geprüft, bevor es zur Sache geht. Das scheint das #dings[i] nicht zu machen. Also nicht so intensiv, denn es ist ja klar, dass Quelle und Ziel der selbe String sind.
    Den Faktor 5 hatte ich vor längerem auf einer 1200 vermessen. Bei der 1500 geht die Tendenz in die gleiche Richtung, aber der Faktor schwankt "wie Sau".

    Fazit: Lange Strings mit CONCAT und kurze Strings mit Einzelzeichenzugriff verketten.


    @Siemens: Warum gibt es den RUNTIME nicht in KOP/FUP?
    Geändert von HelleBarde (21.06.2013 um 21:00 Uhr)

  12. Folgende 2 Benutzer sagen Danke zu HelleBarde für den nützlichen Beitrag:

    rostiger Nagel (21.06.2013),vollmi (15.08.2013)

  13. #9
    Registriert seit
    29.03.2004
    Beiträge
    5.793
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    Zitat Zitat von HelleBarde Beitrag anzeigen
    Und noch etwas was so offensichtlich nicht im Handbuch steht. Angenommen, mein String in der TEMP heißt dings, dann kann man mit #dings[i] auf die einzelnen Zeichen zugreifen. Liest man hinten raus, dann kommt '$00' zurück. Wenn man schreibt, dann kann man den String um jeweils ein Zeichen verlängern. Also angenommen #dings ist 'haus', dann macht #dings[1]:='H' ein 'Haus' draus. Ein #dings[5]:='!' erzeugt ein 'Haus!' aber ein folgendes #dings[7]:='x' geht nicht. Immer nur ein Zeichen dazu.
    Scheint aber auch erst seit V12 zu funktionieren, in V11 ist das noch nicht möglich.

  14. #10
    Registriert seit
    16.01.2013
    Beiträge
    41
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hi !

    ich muss mal hier einhaken... ich habe eine 300er CPU (315-F PN/DP) da gibts ja den TSEND_C nicht sondern nur den TSEND.
    Welches Geraet muss ich anlegen damit ich das genauso verwenden kann ?

    Gruss gerd

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 29.03.2012, 18:21
  2. Daten verschicken
    Von sps_mitte im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 20.09.2011, 13:20
  3. Störmeldung per SMS verschicken
    Von TimoK im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 23.05.2008, 07:06
  4. Antworten: 14
    Letzter Beitrag: 29.07.2007, 22:47
  5. Maschinenstörung per SMS verschicken!!
    Von stefand im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 19.11.2005, 21:36

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •