DoorPi Verbindung zu S7 SPS

  • Wünsche / Anregungen
  • Verbesserung / Erweiterung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Da in jedem Forum ein paar Regeln eingehalten werden müssen, möchte ich diese auch vorher hier festlegen und niederschreiben. Die grundsätzliche Netiquette setze ich bei Jedem voraus. Darüber hinaus möchte ich nur spezielle Regeln ansprechen:
- Unterlasse FullQuote sondern nutze Alternativen wie Inline-Quoting
-> siehe auch https://de.wikipedia.org/wiki/Fullquote vs. https://de.wikipedia.org/wiki/TOFU#Alternativen_zu_TOFU
- Unterlasse nichtssagende Antworten wie "Danke" oder "werde ich mal testen" oder ähnliches, sofern Du nicht der Threadersteller bist und einen Lösungsvorschlag angeboten bekommen hast.
- Vermeide Doppel-Posts (zwei Beiträge von Dir hintereinander) sondern editiere wenn möglich Deine Posts.

Danke...

  • DoorPi Verbindung zu S7 SPS

    Hallo
    ich habe mal ein eigenes Thema herzu erstellt.
    Ich habe Doorpi sowie Snap 7 erfolgreich auf einem Raspberry pi 3 Jessie installiert.
    Snap 7 bildet die Schnittstelle zwischen der SPS und dem Raspberry pi. Jetzt fehlt mir noch eine Schnittstelle zwischen einen Python Skript und Doorpi.

    Folgendes hab ich vor.
     
    Mein Klingeltaster und der Türöffner sind  in der SPS verdrahtet. Die Haustüre wird von der SPS geöffnet.
    Wenn der Klingeltaster gedrückt wird, wird ein Bit in der SPS gesetzt.  Diesen lese ich mit dem unteren Skript ein.
    Wie kann ich jetzt in Doorpi das Ereignis auslösen das geklingelt wird?

    Umgekehrt muss Doorpi ein Python Skript starten das mir ein Bit in der SPS setzt damit die Haustüre geöffnet wird.

     
    Hier mal das Skript





    Quellcode

    1. from time import sleep
    2. import snap7
    3. from snap7.util import*
    4. import struct
    5. plc = snap7.client.Client()
    6. plc.connect("192.168.178.30",0,2)
    7. con = plc.get_connected()
    8. print con
    9. area = 0x83
    10. start = 3
    11. length = 1
    12. bit = 0
    13. byte = plc.read_area(area,0,start,length)
    14. print "Q3,0:",get_bool(byte,0,bit)
    15. plc.disconnect()
    Alles anzeigen
    raspberry pi 3, PiFace, Doorpi aktuelle Version

    http://plcsmarthome.jimdo.com/
  • RE: DoorPi Verbindung zu S7 SPS

    emilio20 schrieb:


    Wie kann ich jetzt in Doorpi das Ereignis auslösen das geklingelt wird?


    - mittels Hardware über GPIO / PiFace
    - mittels dem virtuellen Keyboard (basierend auf dem Dateien im Dateisystem)
    - WebApi per URL-Aufruf:

    Quellcode

    1. http://raspberrypi/control/trigger_event?event_name=OnKeyPressed_test.11&event_source=doorpi.keyboard.from_gpio

    Wäre Event OnKeyPressed für Taste 11 für das Keyboard mit dem Namen test

    Alle Events gibt es bei Deinem DoorPi unter der URL:

    Quellcode

    1. http://raspberrypi/dashboard/pages/status.modules.eventhandler.html

    Unter Übersicht -> aktive Quellen -> gelber Button ganz rechts als URL kopieren

    emilio20 schrieb:


    Umgekehrt muss Doorpi ein Python Skript starten das mir ein Bit in der SPS setzt damit die Haustüre geöffnet wird. [/font][/size]


    Schau Dir mal die Actions an - am Beispiel Log-Action:
    https://github.com/motom001/DoorPi/blob/master/doorpi/action/SingleActions/log.py

    Du müsstest Dir eine Action dafür anlegen - z.B. s7_setvalue.py
    --
    MfG Thomas
  • RE: DoorPi Verbindung zu S7 SPS

    Hallo motom

     
    ich kenne mich nicht so gut aus wie das ganze Doorpi Programm Arbeitet. Deswegen habe ich noch einige Verständnis Probleme desweitern ist Pyhton nicht meine stärke.
    Ich habe folgende Skripts erstellt
     
    Hiermit werden die Klingeltaster aus der SPS gelesen




    Quellcode

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. from time import sleep
    4. import snap7
    5. from snap7.util import*
    6. import struct
    7. #Verbindung zur SPS aufbauen
    8. plc = snap7.client.Client()
    9. plc.connect("192.168.178.30",0,2)
    10. con = plc.get_connected()
    11. #Print Verbindungsstatus
    12. print "Connect", con
    13. #Lese Byte aus der SPS
    14. byte = plc.db_read(390,2,1)
    15. Taster_1 = get_bool(byte,0,0)
    16. Taster_2 = get_bool(byte,0,1)
    17. print "Taster_1:",Taster_1
    18. print "Taster_2:",Taster_2
    19. #Verbinsung zur SPS abbauen
    20. plc.disconnect()
    Alles anzeigen



    und hirmit kann der Türöffner betätigt werden


    Quellcode

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. from time import sleep
    4. import snap7
    5. from snap7.util import*
    6. import struct
    7. #Verbindung zur SPS aufbauen
    8. plc = snap7.client.Client()
    9. plc.connect("192.168.178.30",0,2)
    10. con = plc.get_connected()
    11. #Print Verbindungsstatus
    12. print "Connect", con
    13. #Variable deklariren
    14. data = bytearray(1)
    15. #Setze Bit für Haustüre Öffnen
    16. print "Haustüre Relais True"
    17. set_bool(data,0,4,True)
    18. #Schreibe Daten in SPS
    19. plc.db_write(390,0,data)
    20. #Warte 3 secunden
    21. sleep (3)
    22. #Rücksetze Bit für Haustüre Öffnen
    23. print "Haustüre Relais False"
    24. set_bool(data,0,4,False)
    25. #Schreibe Daten in SPS
    26. plc.db_write(390,0,data)
    27. #Verbinsung zur SPS abbauen
    28. plc.disconnect()
    Alles anzeigen



    Wie und wo muss ich das ganze in Doorpi einbinden damit Doorpi mitbekommt wenn ein Taster gedrückt wird und Doorpi die Haustüre öffnet ?
    raspberry pi 3, PiFace, Doorpi aktuelle Version

    http://plcsmarthome.jimdo.com/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von emilio20 ()

  • RE: DoorPi Verbindung zu S7 SPS

    motom001 schrieb:

    Kannst Du mir noch sagen, wo man die Bibliothek "import snap7" herbekommt?


    Hallo

    sourceforge.net/projects/snap7/files/

    Hier mal die Anleitung zur Installation

    Python-Quellcode

    1. wget http://sourceforge.net/projects/snap7/files/1.4.0/snap7-full-1.4.0.tar.gz
    2. tar -zxvf snap7-full-1.4.0.tar.gz
    3. cd snap7-full-1.4.0/build/unix
    4. sudo make -f arm_v7_linux.mk all
    5. Kopiere die Datei libsnap7.so vom Verzeichniss snap7-full-1.4.0/build/unix/bin/arm_v7-linux
    6. sudo cp snap7-full-1.4.0/build/bin/arm_v7-linux/libsnap7.so /usr/lib/libsnap7.so
    7. sudo cp snap7-full-1.4.0/build/bin/arm_v7-linux/libsnap7.so /usr/local/lib/libsnap7.so
    8. sudo apt-get install python-pip
    9. sudo pip install python-snap7
    10. in Ordner /usr/local/lib/python2.7/dist-packages/snap7/
    11. cd /usr/local/lib/python2.7/dist-packages/snap7/
    12. unter "def __init__" die Zeile "lib_location='/usr/local/lib/libsnap7.so' # add this line here" einfügen
    13. am besten von putty mit dem befehl "sudo nano common.py offnen und die Zeile einfügen und speichen
    14. class Snap7Library(object):
    15. """
    16. Snap7 loader and encapsulator. We make this a singleton to make
    17. sure the library is loaded only once.
    18. """
    19. _instance = None
    20. def __new__(cls, *args, **kwargs):
    21. if not cls._instance:
    22. cls._instance = object.__new__(cls)
    23. cls._instance.lib_location = None
    24. cls._instance.cdll = None
    25. return cls._instance
    26. def __init__(self, lib_location=None):
    27. lib_location='/usr/local/lib/libsnap7.so' # add this line here
    28. if self.cdll:
    29. return
    30. self.lib_location = lib_location or self.lib_location or find_library('snap7')
    31. if not self.lib_location:
    32. msg = "can't find snap7 library. If installed, try running ldconfig"
    33. raise Snap7Exception(msg)
    34. self.cdll = cdll.LoadLibrary(self.lib_location)
    Alles anzeigen
    raspberry pi 3, PiFace, Doorpi aktuelle Version

    http://plcsmarthome.jimdo.com/

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von emilio20 ()

  • RE: DoorPi Verbindung zu S7 SPS

    Hallo motom
    ich habe mal versucht snap 7 als Funktion in Doorpi einzubinden, jedoch fehlt mir jede Menge hintergrundwissen wie Doorpi Arbeitet.
     
    Was passiert bei Parameter?
    Wie wird die Funktion s7_setvalue aufgerufen diese wir doch nirgends aufgerufen?
    Kannst du mir erklären wie Doorpi die Funktionen abarbeitet?
     
     
    Hier mal die ersten Versuche jedoch verstehe ich noch nicht wie doorpi seine Bausteine abarbeitet



    Quellcode

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. import snap7
    4. from snap7.util import*
    5. import struct
    6. import logging
    7. logger = logging.getLogger(__name__)
    8. logger.debug("%s loaded", __name__)
    9. from time import sleep
    10. from doorpi.action.base import SingleAction
    11. import doorpi
    12. def s7_setvalue (db,byte,bit)
    13. #Verbindung zur SPS aufbauen
    14. plc = snap7.client.Client()
    15. plc.connect("192.168.178.30",0,2)
    16. con = plc.get_connected()
    17. #Variable deklariren
    18. data = bytearray(1)
    19. set_bool(data,0,bit,True)
    20. #Schreibe Daten in SPS
    21. plc.db_write(db,byte,data)
    22. #Warte 1 secunden
    23. sleep (1)
    24. set_bool(data,0,bit,False)
    25. #Schreibe Daten in SPS
    26. plc.db_write(db,byte,data)
    27. #Verbinsung zur SPS abbauen
    28. plc.disconnect()
    29. def get(parameters):
    30.    parameter_list = parameters.split(',')
    31.    if len(parameter_list) is not 1: return None
    32.    
    33.    
    34. class s7_setvalueAction(SingleAction):
    35.    pass
    Alles anzeigen
    raspberry pi 3, PiFace, Doorpi aktuelle Version

    http://plcsmarthome.jimdo.com/
  • RE: DoorPi Verbindung zu S7 SPS

    motom001 schrieb:


    Quellcode

    1. http://raspberrypi/control/trigger_event?event_name=OnKeyPressed_test.11&event_source=doorpi.keyboard.from_gpio


    Alle Events gibt es bei Deinem DoorPi unter der URL:

    Quellcode

    1. http://raspberrypi/dashboard/pages/status.modules.eventhandler.html



    Noch besser klappt's, wenn man den Port (default ist, glaube ich, 8080) mit einbindet. ;)

    Auf diese Weise teste ich z.B. die Funktion der mit Eingang 0 des PiFace-Moduls verbundenen Klingel, ohne dass ich jedes Mal zum Briefkasten laufen muss:

    Quellcode

    1. http://192.168.0.22:8080/control/trigger_event?event_name=OnKeyPressed_onboardpins.0&event_source=doorpi.keyboard.from_piface


    Gruß,

    Thorsten

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von dtp ()

  • RE: DoorPi Verbindung zu S7 SPS

    Hallo

    ich habe es mit folgendem Skrip hin bekommen eine  Virtual Input BIN in die SPS zu Schreiben und einen BIT aus der SPS zum Türöffnen in einen Virtual Output zu übergeben.
    Mein skript muss extra gestartet werden damit es Funktioniert.


    Quellcode

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. from time import sleep
    4. import snap7
    5. from snap7.util import*
    6. import struct
    7. import string
    8. # Datenpfat virtual Keyboard
    9. Dateipfad_imput1 = '/var/DoorPI/keyboard/inputs/e1'
    10. Dateipfad_output1 = '/var/DoorPI/keyboard/outputs/a1'
    11. #  IP Adresse SPS
    12. ip='192.168.178.30'
    13. rack = 0
    14. slot = 2
    15. # Adresse bit lesen aus SPS
    16. S7_DRead = [390,2,0]
    17. # Adresse bit schreiben in SPS
    18. S7_DWrite = [390,0,4]
    19.    
    20. def DRead(db_nr, byte_nr, bit_nr): #Lesen aus SPS
    21.  
    22.    try:
    23.        plc = snap7.client.Client()
    24.        #print "Verbindungsaufbau"
    25.        plc.connect(ip,rack,slot)
    26.        
    27.        #print "Lese Byte aus der SPS"
    28.        byte = plc.db_read(db_nr,byte_nr,1)
    29.        value = get_bool(byte,0,bit_nr)
    30.        #print "DRead", value      
    31.              
    32.        plc.disconnect()
    33.        con = plc.get_connected()
    34.        #print "disconnect", con
    35.        return value
    36.        
    37.    except Exception as ex:
    38.        print ("Fehlerm beim lesen aus SPS",ex)
    39.        
    40. def DWrite(db_nr, byte_nr, bit_nr,value): #Schreiben in SPS
    41.    try:
    42.        plc = snap7.client.Client()
    43.        #print "Verbindungsaufbau"
    44.        plc.connect(ip,rack,slot)
    45.        
    46.        
    47.        #print "Ausertung on value True oder Flase"
    48.        if 'True' in value:
    49.            BOOL = True
    50.        else:
    51.            BOOL = False
    52.        
    53.        #print "DWrite",value    
    54.        #Variable deklariren
    55.        byte = bytearray(1)
    56.        #Lese Byte aus der SPS
    57.        byte = plc.db_read(db_nr,byte_nr,1)
    58.        #Setze Bit in Value
    59.        set_bool(byte,0,bit_nr,BOOL,)
    60.        #Schreibe Daten in SPS
    61.        plc.db_write(db_nr,byte_nr,byte)
    62.        plc.disconnect()
    63.        con = plc.get_connected()
    64.        #print "disconnected",(con)
    65.        
    66.    except Exception as ex:
    67.        print ("Fehlerm beim schreiben in SPS",ex)
    68. def Write_V_Keyboard (value):
    69.    try:
    70.        #print "Schreibe in Virtual_Keyboard"
    71.        f = open (Dateipfad_imput1 ,"w")
    72.        v =str(value)
    73.        f.write(v)
    74.        f.close()
    75.    except Exception as ex:
    76.        print ("Fehlerm beim schreiben in Virtual Keyboard",ex)
    77. def Read_V_Keyboard():
    78.    try:
    79.        #print "Value aus Doorpi Virtual Keyboard lesen"
    80.        f = open (Dateipfad_output1,"r")
    81.        v = f.readline()
    82.        f.close()
    83.        return v
    84.    except Exception as ex:
    85.        print ("Fehlerm beim lesen aus Virtual Keyboard",ex)
    86.        
    87.    
    88. #Hauptprogramm
    89. while True:
    90.        Value1 = DRead(S7_DRead[0],S7_DRead[1],S7_DRead[2])
    91.        Write_V_Keyboard(Value1)
    92.        Value2 = Read_V_Keyboard()
    93.        sleep(0.1)
    94.        DWrite(S7_DWrite[0],S7_DWrite[1],S7_DWrite[2],Value2)
    95.        sleep(0.1)
    96.        
    97.  
    Alles anzeigen


    Am liebsten würde ich das ganze in doorpi mit einbinden, hierzu habe ich mir in Singel Aktion das out.py angeschaut, jedoch verstehe ich einiges noch nicht.

    Im "def get" werden wohl die Parameter aus der config eingelesen, das wäre dann bei mir die Adressen S7_Write und S7_Read und die Vatiable True oder False + Zeit
    Dann werden die Parameter mit "return" ausgegeben an OutAction was passiert da genau ?

    Weiterhn müsste der Teil meines Programmes der den SPS BIT liest immer ausfegührt werden, so wie die Überwachung der Gipo s Bin's ? Wie und wo wird das ausgefürt ?
    Weiterhin möchte ich den Pfad der Virtual Keyboard aus der doorpi.ini Lesen ?

    Es wäre super wenn mir jemand die genaue Funktion des out.py erklären könnte


    Quellcode

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. import logging
    4. logger = logging.getLogger(__name__)
    5. logger.debug("%s loaded", __name__)
    6. from doorpi.action.base import SingleAction
    7. import doorpi
    8. from doorpi.action.SingleActions.out_triggered import get as fallback_out_triggered
    9. def get(parameters):
    10.    parameter_list = parameters.split(',')
    11.    if len(parameter_list) > 3: return fallback_out_triggered(parameters)
    12.    pin = parameter_list[0]
    13.    value = parameter_list[1]
    14.    if len(parameter_list) is 2:
    15.        log_output = True
    16.    else:
    17.        log_output = parameter_list[2]
    18.    return OutAction(doorpi.DoorPi().keyboard.set_output, pin = pin, value = value, log_output = log_output)
    19. class OutAction(SingleAction):
    20.    pass
    Alles anzeigen
    raspberry pi 3, PiFace, Doorpi aktuelle Version

    http://plcsmarthome.jimdo.com/

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von emilio20 ()

  • Hallo,
    ich würde gerne das Thema noch mal aufgreifen.
    Das oben genannte SPS S7 Skript funktioniert ja soweit und liest und setzt Virtuelle Ein/Ausgänge in Doorpi. Ich muss diese aktuell noch manuell starten.

    1. Besteht die Möglichkeit das Skript über Doorpi zu starten ? Oder Arbeitet dann Doorpi nicht mehr weiter da eine while Schleife permanent läuft?
    2. Kann ich Parameter wie IP, S7_DRead, S7_DWrite Adresse von Doorpi an das Skript übergeben um Änderungen in Doorpi durchzuführen ?
    raspberry pi 3, PiFace, Doorpi aktuelle Version

    http://plcsmarthome.jimdo.com/
  • Hallo zusammen, bin neu hier und möchte eine Verbindung zwischen Raspberry Pi 3B und meine S7 1200 herstellen.
    Kommt leider diese Fehlermeldung.
    Wenn mir es jemand ohne Fachwörter erklären kann wäre ich dankbar.



    root@raspberrypi:~# ipython
    Python 2.7.13 (default, Nov 24 2017, 17:33:09)
    Type "copyright", "credits" or "license" for more information.

    IPython 5.1.0 -- An enhanced Interactive Python.
    ? -> Introduction and overview of IPython's features.
    %quickref -> Quick reference.
    help -> Python's own help system.
    object? -> Details about 'object', use 'object??' for extra details.

    In [1]: import snap7

    In [2]: plc = snap7.client.Client()

    In [3]: plc.connect('192.168.0.1'.0.1)
    File "<ipython-input-3-1b5e63f2bb0e>", line 1
    plc.connect('192.168.0.1'.0.1)
    ^
    SyntaxError: invalid syntax


    Mein IP Protokol bei der S7 1200
    Bilder
    • PLC.jpg

      108,96 kB, 807×1.355, 67 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von slawa ()

  • Hi, das ist mir auch klar das es mit der Zeile zutun hat aber was?
    Und mittlerweile kriege ich dies Meldung.
    Kennt sich da jemand aus?

    In [1]: import snap7

    In [2]: plc = snap7.client.Client()

    In [3]: plc.connect('192.168.0.1',0.1)
    ---------------------------------------------------------------------------
    TypeError Traceback (most recent call last)
    <ipython-input-3-47ab5c6e6712> in <module>()
    ----> 1 plc.connect('192.168.0.1',0.1)

    /usr/local/lib/python2.7/dist-packages/snap7/client.pyc in f(*args, **kw)
    22 """Parses a s7 error code returned the decorated function."""
    23 def f(*args, **kw):
    ---> 24 code = func(*args, **kw)
    25 check_error(code, context="client")
    26 return f

    TypeError: connect() takes at least 4 arguments (3 given)