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

Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 31

Thema: Mehrere Busteilnehmer mit einem CP340 ansprechen

  1. #1
    Registriert seit
    30.08.2007
    Beiträge
    207
    Danke
    16
    Erhielt 22 Danke für 17 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    ich habe mehrere selbstgebaute Busteilnehmer (RS485) über einen selbstgebauten RS232<->RS485-Wandler an einen CP340 (seriell / ASCII / 8N1, 9600) angeschlossen. Die Busteilnehmer sind alphabetisch benannt.

    Nun möchte ich aus einem vorbereiteten DB (DB3) das erste Zeichen ('a') nehmen und dieses seriell mit dem CP340 verschicken. Die in der SPS ankommenden Zeichen werden analysiert und wenn ein 'a' zurückgekommen ist, soll in einem anderen DB (DB4) der verwertbare ASCII-Wert als INT gespeichert werden. Dann folgt das 'b' aus dem DB3 usw... Mit einem RS232-Teilnehmer habe ich das bereits gemacht. Nur wie "ticker" ich die Adressen in den DB's durch? Ja klar, indirekte Adressierung, aber wie?

    Ablauf:
    Lade DB3.'a'
    Sende Inhalt.DB3.'a'
    Empfange String.DB2
    Verarbeite String.DB2
    Wandle String.DB2.nach.INT
    Speicher String.DB2.als.INT.im.DB4_Pos.'a'
    ---
    Lade DB3.'b'
    Sende Inhalt.DB3.'b'
    Empfange String.DB2
    Verarbeite String.DB2
    Wandle String.DB2.nach.INT
    Speicher String.DB2.als.INT.im.DB4_Pos.'b'
    ---
    usw., bis man beim 'z' angekommen ist.
    Dann soll das ganze wieder bei 'a' angfangen.

    Es geht mir nicht um die Stringverarbeitung, sondern lediglich um das Laden der richtigen DB-Sendeposition und das Laden der dazugehörigen DB-Empfangsposition.

    Anbei noch ein paar Screenshots, vielleicht wird es dann klarer.

    Vielen Dank,
    poppycock
    Angehängte Grafiken Angehängte Grafiken
    Mit einem Computer löst man die Probleme, die man ohne einen Computer nicht hätte.
    Zitieren Zitieren Mehrere Busteilnehmer mit einem CP340 ansprechen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Hallo,
    ich bin mir nicht sicher, ob ich dich richtig verstanden habe ...
    Ich würde mir den "Pointer" für die Ziel-Adresse aus dem ASCII-Code des empfangenen Zeichens bilden. "a" hat z.B. den ASCII-Code 97 - die weiteren inkrementell folgend ...
    ASCII-Code heißt in dem Fall der Byte-Wert des empfangenen Zeichens.
    Der Pointer ist dann :
    Code:
    L #Zeichen
    L 96
    -I  // jetzt hast du 1 für a und 26 für z
    L 2
    *I  // weil du ja Worte adressieren möchtest
    SLD 3  // und nun ist es ein Pointer auf ein Wort ...
    T #myPointer   // Format DWORD
    Hattest du das so gedacht ?

    Gruß
    LL

  3. #3
    Avatar von poppycock
    poppycock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.08.2007
    Beiträge
    207
    Danke
    16
    Erhielt 22 Danke für 17 Beiträge

    Standard

    Hallo Larry,

    das hört sich gar nicht mal so schlecht an, so ähnlich könnte ich das aufbauen!

    Ich schicke von der SPS ein 'a' raus, der selbstgebaute RS232<->RS485-Wandler schickt das 'a' sofort wieder zurück. Danach antwortet der Busteilnehmer 'a' und sendet seine Busadresse samt Daten und Stoppzeichen hinterher.
    Der komplette String des Busteilnehmers 'a' könnte so aussehen: aa1023#
    erstes a = das gesendete Zeichen von der SPS
    zweites a = Busadresse vom Busteilnehmer
    1023 = Messwert (verwertbarer Wert)
    # = Stoppzeichen
    Wenn das erste Zeichen gleich dem zweiten Zeichen ist, so soll der Messwert verwertet werden, ansonsten wird dieser verworfen.

    Mal gucken, ob ich das Problem so (ähnlich) lösen kann, wie du es vorgeschlagen hast.
    Das würde die Hürde für die Zeil-Adresse lösen, aber wie lasse ich das Alphabet automatisch für das Senden durchtickern?
    Genau so? Oder gibt's eine bessere Lösung?

    Gruß,
    poppycock
    Mit einem Computer löst man die Probleme, die man ohne einen Computer nicht hätte.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    Zitat Zitat von poppycock Beitrag anzeigen
    ... aber wie lasse ich das Alphabet automatisch für das Senden durchtickern?
    Genau so? Oder gibt's eine bessere Lösung?
    Das müßtest du mir bitte (noch) einmal erklären. Was willst du da genau machen ?

  5. #5
    Avatar von poppycock
    poppycock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.08.2007
    Beiträge
    207
    Danke
    16
    Erhielt 22 Danke für 17 Beiträge

    Standard

    Da ich meine Busteilnehmer alphabetisch anspreche, muss ich im CP340-Sendebaustein angeben, was gesendet werden soll.
    Darum habe ich einen DB angelegt, in dem die Daten stehen, also 'a' bis 'z'.
    In meinem ersten Posting sieht man den Aufbau des DB's. Es ist das mittlere Bild: DB3.
    Ich habe jetzt erstmal einen Timer angelegt, der alle 20ms einen Sendevorgang anstößt. Das wird aber noch zeitunkritischer gelöst.
    D.h. im Moment wird alle 20ms ein 'a' an die Busteilnehmer gesendet.
    Nun möchte ich aber, dass nach dem 'a' das 'b' folgt usw., bis man bei 'z' angekommen ist. Danach soll das mit 'a' wieder von vorne beginnen.

    Ich hoffe, das ist nun verständlicher beschrieben?!
    Mit einem Computer löst man die Probleme, die man ohne einen Computer nicht hätte.

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard

    ... klar ... verstanden ...

    Ich würde das Ganze in einer Schleife lösen (bei mir wäre hier dann das Mittel der Umsetzung SCL - das war bei dir glaube ich kein Thema ?).
    In der Schleife würde ich dann von 1 .. 26 hoch-inkrementrieren, aus der Index-variablen der Schleife dann das Sende-Zeichen bauen (umgekehrt wie oben schon beschrieben) und dann entsprechend verfahren.
    Zu beachten ist hier, dass ein Schleifen-Durchlauf in einem SPS-Zyklus passiert, dann erstmal ein ganze Weile (mehrere Zyklen nichts in der Richtung) und dann (ggf. nach Erhalten der Anwort oder so) die Übertragung der Rest-Information. Danach kann/darf dann erst der Index erhöht werden - also so nebenher noch so eine Art Schrittkette ...
    Soll der Index dann irgendwann auf 27 gesetzt werden, so setzt du ihn an Stelle dessen wieder auf 1.

    Hast du es dir so gedacht ?

    Gruß
    LL

  7. #7
    Avatar von poppycock
    poppycock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.08.2007
    Beiträge
    207
    Danke
    16
    Erhielt 22 Danke für 17 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Hast du es dir so gedacht ?
    Ja, in diese Richtung hatte ich gedacht!

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    Ich würde das Ganze in einer Schleife lösen (bei mir wäre hier dann das Mittel der Umsetzung SCL - das war bei dir glaube ich kein Thema ?).
    Richtig, sollte schon in AWL bleiben!
    Hatte ja schon mal so ein ähnliches Problem, bei dem du mir erfolgreich geholfen hattest! *danke*

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    In der Schleife würde ich dann von 1 .. 26 hoch-inkrementrieren, aus der Index-variablen der Schleife dann das Sende-Zeichen bauen (umgekehrt wie oben schon beschrieben) und dann entsprechend verfahren.
    Zu beachten ist hier, dass ein Schleifen-Durchlauf in einem SPS-Zyklus passiert, dann erstmal ein ganze Weile (mehrere Zyklen nichts in der Richtung) und dann (ggf. nach Erhalten der Anwort oder so) die Übertragung der Rest-Information. Danach kann/darf dann erst der Index erhöht werden - also so nebenher noch so eine Art Schrittkette ...
    Soll der Index dann irgendwann auf 27 gesetzt werden, so setzt du ihn an Stelle dessen wieder auf 1.
    D.h. ich brauche eigentlich keinen DB für die Sendezeichen, sondern generiere mir aus einem Zählwert ein ASCII-Zeichen, das gesendet werden soll.
    Dann könnte ich mir doch einen FB bauen, der das alles beinhaltet?!

    Den Sendebefehl werde ich letztendlich so programmieren:
    Beim Hochlauf der SPS wird ein Bit gesetzt und stößt den Sendevorgang an.
    Wenn der CP erfolgreich etwas empfangen hat und die Umwandlung von ASCII nach INT durchgeführt wurde, wird der nächste Sendeauftrag eingeleitet. Somit stelle ich sicher, dass ich immer erst etwas sende, wenn ich erfolgreich etwas empfangen habe.
    Dieses "Anstoßbit" könnte ich dann für den Zähler verwenden...

    LG,
    poppycock
    Mit einem Computer löst man die Probleme, die man ohne einen Computer nicht hätte.

  8. #8
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.759
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Aufbau DB1:
    ZAEHLER: INT
    res: 8 BYTE
    SENDEDATEN[1..26] ARRAY of 100 BYTE, beginnend bei 10

    Lokalvariablen:
    SENDEZEICHEN : BYTE


    Code:
    L DB1.DBW0
    L 'A'
    +I
    T SENDEZEICHEN
    
    L DB1.DBW0
    L 100 
    *D
    L 10
    +D
    SLD 3
    LAR1
    
    //NUN hasst du im AR1 die Adresse auf deine sendedaten...
    
    
    //ZAEHLER erhöhen
    L DB1.DBW 0
    + 1
    T DB1.DBW 0
    L 26
    >I
    SPBN ok
    
    L 0
    T DB1.DBW 0
    ok: NOP 0

    hab ich so richtig verstanden was du woltest???
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten
    Zitieren Zitieren Wie wärs bsw. so??  

  9. #9
    Avatar von poppycock
    poppycock ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    30.08.2007
    Beiträge
    207
    Danke
    16
    Erhielt 22 Danke für 17 Beiträge

    Standard

    Hallo,

    ich habe jetzt ein wenig Zeit gefunden und habe mich wieder der Programmierung meiner Datenabfrage gekümmert.
    Die DB's habe ich als Screenshot angehängt.
    Nicht mit der Bezeichnung "Alphabet" irritieren lassen, ich habe nur Busteilnehmer a und b, darum ist bei 98 Schluss mit zählen.

    Wenn ich Busteilnehmer a anspreche, bekomme ich folgenden String zurück aa1023#
    Das erste a schickt der Buswandler sofort zurück, das a1023# kommt vom Busteilnehmer. So soll es auch sein!
    Wenn ich Busteilnehmer b anspreche, bekomme ich b1023# zurück, also ohne das erste Zeichen (b).
    Ich glaube, es liegt an meiner Zählweise, dass da irgendwas nicht stimmt.
    Könnte sich das mal bitte einer angucken? Bin schon am Verzweifeln.

    Code:
          L     254
          T     DB2.DBB    2
          T     DB2.DBB    3
          L     254
          T     DB2.DBB  270
          T     DB2.DBB  271
    
          L     1
          T     DB3.DBB    2
          T     DB3.DBB    3
    
    // SENDEN
          CALL  "P_SEND_OLD" , "P_SEND_Instanz"
           REQ   :=M0.3
           R     :=
           LADDR :=256
           DB_NO :=3
           DBB_NO:=4
           LEN   :=1
           DONE  :="P_SEND_Data".SND_Done
           ERROR :="P_SEND_Data".SND_Error
           STATUS:=
    
    // EMPFANGEN
          CALL  "P_RCV_OLD" , "P_RCV_Instanz"
           EN_R  :=M0.1
           R     :=
           LADDR :=256
           DB_NO :=2
           DBB_NO:=4
           NDR   :="P_RCV_Data".RCV_NDR
           ERROR :="P_RCV_Data".RCV_Error
           LEN   :=
           STATUS:=
    
          L     "P_RCV_Instanz".i_GESAMTLAE
          T     "P_RCV_Data".aktuelle_Laenge
    
    
    // nutzbare Länge errechnen
          L     "P_RCV_Data".aktuelle_Laenge
          L     3
          -I    
          T     "P_RCV_Data".nutzbare_Laenge
    
    // erstes Zeichen auslesen und speichern
          L     "P_RCV_Data".RCV_String[1]
          T     "P_RCV_Data".erstes_ASCII_Zeichen[1]
    
    // zweites Zeichen auslesen und speichern
          L     "P_RCV_Data".RCV_String[2]
          T     "P_RCV_Data".zweites_ASCII_Zeichen[1]
    
    // verwertbare ASCII-Daten heraussuchen
          CALL  "MID"
           IN     :="P_RCV_Data".RCV_String
           L      :="P_RCV_Data".nutzbare_Laenge
           P      :=3
           RET_VAL:="P_RCV_Data".ASCII_Daten
    
    // empfangenen ASCII-String nach INT wandeln
          CALL  "STRNG_I"
           S      :="P_RCV_Data".ASCII_Daten
           RET_VAL:="P_RCV_Data".INT_Daten
    
          U     "P_RCV_Data".RCV_NDR
          SPBN  nop1                        // Mache nichts, wenn keine neue Daten empfangen wurden
    
    // Im DB die Speicherstelle generieren
          L     "P_SEND_Data".SND_ASCII[1]
          L     97
          -I    
          L     2
          *I    
          SLW   3
          LAR1  
          L     "P_RCV_Data".INT_Daten
          T     #Werte
          AUF   "P_INT_Data"
          L     #Werte
          T     DBW [AR1,P#0.0]
    
    // Alphabet durchzählen
          L     "P_SEND_Data".SND_ASCII[1]
          L     1
          +I    
          T     "P_SEND_Data".SND_ASCII[1]
          L     98
          >I    
          SPBN  ende                        // Alphabet-Ende erreicht, wieder bei 'a' anfangen
          L     97
          T     "P_SEND_Data".SND_ASCII[1]
    ende: NOP   0
    
    nop1: NOP   0

    Danke, poppycock
    Angehängte Grafiken Angehängte Grafiken
    Mit einem Computer löst man die Probleme, die man ohne einen Computer nicht hätte.

  10. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.794
    Danke
    398
    Erhielt 2.417 Danke für 2.013 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Poppycock,
    ich kann erstmal keinen Fehler erkennen ... bis auf :
    Wenn du mit den S7-Strings_Wandlungs-FC's (MID , STRING_I, etc.) arbeitest dann muß zwingend sichergestellt sein, dass ALLE beteiligten Strings initialisiert sind (String-Länge und -Größe in den Header-Bytes eingetragen). Ich habe davon jetzt in deinem Code nichts gefunden - hast du das gemacht ? Wenn nein, dann hol das doch bitte noch nach ...

    Gruß
    LL

Ähnliche Themen

  1. Mehrere Motoren an einem Sanftstarter
    Von michi204 im Forum Antriebstechnik
    Antworten: 10
    Letzter Beitrag: 07.09.2010, 10:38
  2. Mehrere Zeilen in einem Script
    Von Bensen83 im Forum HMI
    Antworten: 2
    Letzter Beitrag: 20.03.2010, 17:31
  3. Mehrere FB's in einem Netwerk aufrufen
    Von fai004 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 13.01.2010, 17:25
  4. Mehrere Benutzer an einem Step7 Projekt
    Von Ollypse im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 08.11.2009, 11:12
  5. mehrere CPU's in einem Projekt
    Von michi im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 16.05.2005, 22:05

Stichworte

Lesezeichen

Berechtigungen

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