Step 7 4 Eingänge zu Integer wandeln und vice versa

MightyMirko

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,


mein Name ist Mirko und ich arbeite mich momentan in die Automatisierung ein. Ich habe folgendes Problem was ich gerne optimalst lösen würde.
An meiner SPS hängt an 4 Inputs ein Arduino. Der Arduino sendet nun ein Integerwert (0..15) auf die Eingänge.

Position 1 | Integerwert 1
Position 2 | Integerwert 2
Position 3 | Integerwert 3
Position 4 | Integerwert 4
Gechwindigkeit 1 | Integerwert 5
Gechwindigkeit 2 | Integerwert 6
Gechwindigkeit 3 | Integerwert 7
Gechwindigkeit 4 | Integerwert 8
.
.


Diese Signale würde ich gerne so einfach wie möglich in Step7 nutzen wollen. ICh habe an bitweise Verschiebung nach Links gedacht, aber da fehlt es mir ein wenig an der Expertise in STEP7.

Oder ich mache einfache Multiplikation output = in1*2^0 + in2*2^1 +....
Hättet ihr da ne Idee/Code Snippet um mir zu helfe?
 
Was für eine SPS hast Du denn? Und was für eine Step7-Version? An welchen Eingängen hängt der Arduino?
Vielleicht gibt es für Deine SPS Slice-Zugriffe, da könntest Du einfach schreiben: MyByte.%X0 := %E0.0;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Mirko,

ein paar mehr Infos wären gut:
- Welche Software
- Welche Steuerung
- Welche Eingangsbaugruppen
- was hast du damit vor
- Wieso schiebe links??

Du kannst einfach ein Eingangswort als INteger deklarieren und verwenden.

Gruß Christian
 
Ich würde mir einen universellen FC schreiben, dem ich die einzelnen 8 (oder 16) Bits übergebe und der ein Byte (oder Word) mit den zusammengebastelten Bits zurückgibt. (Brauchst Du Byte oder Word?)
Programmbeispiel und Links zu weiteren mehr oder weniger guten/umständlichen Lösungen siehe hier

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe das eher so, das er an je einem Bit die Integer durchtakten will. Oder verstehe ich das falsch?

An meiner SPS hängt an 4 Inputs ein Arduino.

Ehrlich, ist es so schwer eine Aufgabenstellung korrekt in Worte zu fassen? Oder bin ich heute Vormittag zu blöd zum lesen?
 
Zuletzt bearbeitet:
Ich kann ja pro input nur zwei verschiedene Signalzustände übertragen.
Auf dem Arduino läuft das CANOPEN Protokoll an dem ich vier motore hängen habe. Hier habe ich noch acht GPIO Pins frei, welche an die Digitalbaugruppe der SPS angeschlossen sind (Vier input, Vier an den Output)
Nun wollte ich, mit eben 4 Inputs in die SPS, mir 16 verschiedene Zustände ausliefern lassen.

Zum beispiel habe ich dann mit
IF (E12.0 && E12.3 ) THEN
position = 5

da mein 2^0 und 2^2 (integer: 1+4) auf HIGH sind.


usw.
 
Ich würde mir einen universellen FC schreiben, dem ich die einzelnen 8 (oder 16) Bits übergebe und der ein Byte (oder Word) mit den zusammengebastelten Bits zurückgibt. (Brauchst Du Byte oder Word?)
Programmbeispiel und Links zu weiteren mehr oder weniger guten/umständlichen Lösungen siehe hier

Harald


An sowas hatte ich gedacht.

Einen FC, der regelmäßig aufgerufen wird.
Parameter zum übergeben: 4 Inputsignale vom Arduino
return value: ein Integerwert

Mit diesem Integerwert frage ich die Positionen der Motoren ab
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, jetzt verstehe ich das.

Wenn du auf E12.0 - E12.3 ein Binärsignal liegen hast, könntest du die restlichen Bits einfach ausmaskieren (oder über Schieben löschen) und dann direkt mit dem Ergebnis arbeiten.

Mal schnell aus der Hüfte in AWL:

So könnte man es mal in AWL mit Schieben testen:
Code:
L EB12
SLW12
SRW12
T MB100 --> im MB100 stehen dann deine Zahlen von 0-15 bei 4 Bit, je nachdem, welche Bits du geschaltet hattest

So mit Maskieren
Code:
L EB12
L 15      //7hex, 1111Bin
UW
T MB100 --> im MB100 stehen dann deine Zahlen von 0-15 bei 4 Bit, je nachdem, welche Bits du geschaltet hattest
 
Moin MightyMirko,

ich verstehe Deine Aufgabe so:
Die Werte, die Du auswählen willst sind auf der S7 in einem DB hinterlegt. Du hast nur 8 Integerwert angegeben, denen ein zu verwendender Wert zugeordnet ist. Es ist ein Positionswert und ein Geschwindigkeitswert (1-8) auswählbar (was ist mit Rampen o.ä. (Werte 9-16)?).

Die vier Eingangsbits können sehr einfach als Integerwert in der S7 abgefragt werden. Ich nehme einfach mal AWL an:

L EBxy // Eingangsbyte einlesen (ich gehe davon aus, dass die vier Codierbits an die Eingänge .0-.3 des Eingangsbytes angeschlossen sind!?)
L b#16#0F //
UW
T MWab

Jetzt steht im Merkerwort 'ab' der Wert, den Du haben willst. Dazu das MWab im Datentyp int deklarieren.


Wie unterscheidest Du die Kategorie (Position, Geschwindigkeit, etc.) und mit welchem Trigger übernimmst Du zu welchem Zeitpunkt den Eingangscode um die Kategorisierten Daten auszuwählen?

Du könntest ja die vier Bits so aufteilen:

Bit0 = 2^0 (für die Wertauswahl bei vier Werten)
Bit1 = 2^1 (für die Wertauswahl bei vier Werten)
Bit2 = Kategorie (0 = Position; 1 = Geschwindigkeit)
Bit3 = Trigger zur Wertübernahme


ODER: Du musst Deine Anfrage noch einmal etwas spezifizieren.


VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde nicht von einer bestimmten festgelegten Belegung der Eingänge der Digitaleingangskarte ausgehen (die z.B. unbedingt Ex.0 = LSB ... Ex.3 = MSB sein muß), sondern ganz universell und symbolisch programmieren. Dann kann man auch mal umverdrahten oder baugruppenübergreifend (z.B. E3.6 .. E4.1) anschließen, auch gerne in anderer Reihenfolge der Bits, und die Bits können auch aus Rangier- oder Kommunikations-DBs stammen:
Code:
FUNCTION FCxxx : INT
TITLE =4 Bits in einen INT (Word) packen

VAR_INPUT
  I0  : BOOL ;
  I1  : BOOL ;
  I2  : BOOL ;    
  I3  : BOOL ;    
END_VAR

VAR_TEMP
  tempWord : STRUCT
   Bit_08 : BOOL ;
   Bit_09 : BOOL ;
   Bit_10 : BOOL ;
   Bit_11 : BOOL ;
   Bit_12 : BOOL ;
   Bit_13 : BOOL ;
   Bit_14 : BOOL ;
   Bit_15 : BOOL ;
   Bit_00 : BOOL ;
   Bit_01 : BOOL ;
   Bit_02 : BOOL ;
   Bit_03 : BOOL ;
   Bit_04 : BOOL ;
   Bit_05 : BOOL ;
   Bit_06 : BOOL ;
   Bit_07 : BOOL ;
  END_STRUCT ;
END_VAR

BEGIN
NETWORK
      LAR1  P##tempWord ;       //AR1 auf Anfangsadresse der Struktur
      L     0 ;
      T     LW [AR1,P#0.0] ;    //alle Bits auf 0 initialisieren

      U     #I0 ;               //die 4 Bits einzeln
      =     #tempWord.Bit_00 ;  //in die Struktur kopieren

      U     #I1 ;
      =     #tempWord.Bit_01 ;

      U     #I2 ;
      =     #tempWord.Bit_02 ;

      U     #I3 ;
      =     #tempWord.Bit_03 ;

      L     LW [AR1,P#0.0] ;    //das zusammengebastelte Word
      T     #RET_VAL ;          //als Return-Wert zurückgeben

Harald
 
Moin MightyMirko,

dann geht es Dir einfach um einen aktuellen Zustand/Status?
Und Du möchtest aus den vier Bits einfach einen Integer-Wert erzeugen?
Dann einfach Schieben oder Ausmaskieren (beides gleich viel Code), wie Ralle es Dir vorgeschlagen hat.
Was Du machst, wäre dann Geschmacksache.


VG

MFreiberger
 
perfekt. read and write Funktioniert einwandfrei und ich konnte auch noch bissel was lernen.
Ach ja, Du wolltest ja auch noch die Gegenrichtung "vice versa": die 4 Bits aus dem INT entnehmen. Das hast Du bestimmt leicht aus dem Einpack-FC umgeformt:
Code:
FUNCTION FCxxx : VOID
TITLE =die untersten 4 Bits aus einem INT entnehmen (Unpack)

VAR_INPUT
  IN : INT ;
END_VAR

VAR_OUTPUT
  O0 : BOOL ;
  O1 : BOOL ;
  O2 : BOOL ;    
  O3 : BOOL ;    
END_VAR

VAR_TEMP
  tempWord : STRUCT
   Bit_08 : BOOL ;
   Bit_09 : BOOL ;
   Bit_10 : BOOL ;
   Bit_11 : BOOL ;
   Bit_12 : BOOL ;
   Bit_13 : BOOL ;
   Bit_14 : BOOL ;
   Bit_15 : BOOL ;
   Bit_00 : BOOL ;
   Bit_01 : BOOL ;
   Bit_02 : BOOL ;
   Bit_03 : BOOL ;
   Bit_04 : BOOL ;
   Bit_05 : BOOL ;
   Bit_06 : BOOL ;
   Bit_07 : BOOL ;
  END_STRUCT ;
END_VAR

BEGIN
NETWORK
      LAR1  P##tempWord ;       //AR1 auf Anfangsadresse der Struktur
      L     #IN ;               //den Input-INT
      T     LW [AR1,P#0.0] ;    //in die Struktur kopieren

      U     #tempWord.Bit_00 ;  //die 4 Bits einzeln aus der Struktur
      =     #O0 ;               //in die Outputs kopieren

      U     #tempWord.Bit_01 ;
      =     #O1 ;

      U     #tempWord.Bit_02 ;
      =     #O2 ;

      U     #tempWord.Bit_03 ;
      =     #O3 ;

Harald
 
Zurück
Oben