Seite 1 von 1

ASCII Darstellung unterbinden

Verfasst: Mittwoch 4. Juli 2007, 15:38
von sg_pyth
Hallo Leute,

ich möchte einen Datenaustausch zwischen SPS und PC realsieren. Von der SPS werden dabei INT Werte via TCP/IP geschickt. Diese Daten werden dann von einem Python Server in eine Datei geschrieben.

Der Python Server hat folgenden Code:

Code: Alles auswählen

#! /usr/bin/env python
# -*- encoding: latin1 -*-

# Dieser TCP-Server sendet alle Daten, die er empfängt an den
# Client als Antwort zurück

from socket import *
import time

# Der standard Echo Port ist nicht sehr nützlich, da er root
# Rechte erfordert. Wir nehemen den Port 50007
ECHO_PORT = 2000
BUFSIZE = 1024
def main():
# TCP-Socket erstellen und an Port binden
    s = socket(AF_INET, SOCK_STREAM)
    f = file('C:\\gedicht.txt', 'a')
    print "Socket initiert"
    x = gethostname()
    print x
    y = gethostbyname(x)
    print y
    s.bind(('', ECHO_PORT))
    s.listen(1)
    print "Server gestartet"
    # Warte auf eine Verbindung zum Server
    conn, (remotehost, remoteport) = s.accept()
    print 'Verbunden mit %s:%s' % (remotehost, remoteport)

    while 1:
        # Empfange daten vom Client
        data = conn.recv(BUFSIZE)
        zeit = time.strftime('%d.%m.%Y %H:%M:%S')
        zeitm = time.clock()
        print  (time.strftime('%d.%m.%Y %H:%M:%S') + '\t' + str(time.clock()) + '\t' + repr(data) + '\t') 
        f.write(time.strftime('%d.%m.%Y %H:%M:%S') + '\t' + str(time.clock()) + '\t' + repr(data) + '\t')
        f.write('\n')
        if not data:
                # Die Verbindung wurde getrennt
                # Abbruch
                break

    # Sende die Daten zurück zum client
    #conn.send(data)
    # Socket schließen
    s.close()
    f.close()
    print('Verbindung beendet')
if __name__ == '__main__':
    main()

Durch den Befehl repr() habe ich bereits erreicht, dass Großteil der Daten in der hexadezimalen Darstellung angezeigt wird, z. B. Bytewert 0 als 'x\00'. Wird jedoch ein Bytewert übertragen, der einem druckbaren Zeichen entspricht, dann wird dieses Zeichen in die Datei geschrieben. Wie kann man erreichen, dass nur Bytewerte und keine ASCII-Zeichen in die Datei geschrieben werden?

Verfasst: Mittwoch 4. Juli 2007, 15:45
von BlackJack
Hilft das weiter:

Code: Alles auswählen

In [35]: '\x00a\xffz'.encode('hex')
Out[35]: '0061ff7a'
?

Edit: Oder willst Du wirklich die Bytes in der Datei stehen haben? Dann lass das `repr()` einfach weg.

Verfasst: Mittwoch 4. Juli 2007, 18:12
von Drake
An dieser Stelle eine kleine Frage an BlackJack:

Wieso steht bei dir immer dieses In und Out davor? Das sieht recht schön aus, machst du das manuell oder wo ist das dabei? ;)

Verfasst: Mittwoch 4. Juli 2007, 18:29
von BlackJack
Das ist, neben einem Haufen anderer nützlicher Funktionen, bei IPython dabei. Ein paar von den Möglichkeiten:

Man kann mit `who` abfragen welche Namen definiert sind. Bei #59 habe ich Tab gedrückt, dann wird vervollständigt bzw angezeigt was möglich ist. Mit einem ? kann man sich die Docstring-Dokumentation anzeigen lassen. Und über den Unterstrich + Nummer kommt man an alle alten Ergebnisse heran.

Code: Alles auswählen

In [57]: who
a       os      subprocess      sys     test

In [58]: 'Hallo'.encode('base64')
Out[58]: 'SGFsbG8=\n'

In [59]: subprocess.
subprocess.CalledProcessError  subprocess.__setattr__
subprocess.MAXFD               subprocess.__str__
subprocess.PIPE                subprocess._active
subprocess.Popen               subprocess._cleanup
subprocess.STDOUT              subprocess._demo_posix
subprocess.__all__             subprocess._demo_windows
subprocess.__class__           subprocess.call
subprocess.__delattr__         subprocess.check_call
subprocess.__dict__            subprocess.errno
subprocess.__doc__             subprocess.fcntl
subprocess.__file__            subprocess.list2cmdline
subprocess.__getattribute__    subprocess.mswindows
subprocess.__hash__            subprocess.os
subprocess.__init__            subprocess.pickle
subprocess.__name__            subprocess.select
subprocess.__new__             subprocess.sys
subprocess.__reduce__          subprocess.traceback
subprocess.__reduce_ex__       subprocess.types
subprocess.__repr__

In [59]: subprocess.call?
Type:           function
Base Class:     <type 'function'>
String Form:    <function call at 0x83e310c>
Namespace:      Interactive
File:           /home/bj/subprocess.py
Definition:     subprocess.call(*popenargs, **kwargs)
Docstring:
    Run command with arguments.  Wait for command to complete, then
    return the returncode attribute.

    The arguments are the same as for the Popen constructor.  Example:

    retcode = call(["ls", "-l"])


In [60]: _58
Out[60]: 'SGFsbG8=\n'

Verfasst: Donnerstag 5. Juli 2007, 09:09
von sg_pyth
Hallo Black Jack,

danke für die schnelle Antwort. Mit dem Befehl
data.encode("HEX") wird der Inhalt von data tatsächlich hexadezimal ausgegeben.

Grüsse,

s.g.