TIA Ausgabe von 12Bit an einer DO Baugruppe in TIA

Azubi94

Level-2
Beiträge
107
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes SPS Forum,

ich habe folgende Frage:

Wenn ich ein analoges Eingangssignal ( 0 bis 20mA) mit einer sps über eine Analog-In Baugruppe einlesen möchte (also in 16Bit, Aufteilung in 27648 Steps) und das Signal über derren DO Ausgänge in einer Auflösung von 12 Bit (also nur 4096 Steps auf 12 DI Eingänge) an eine alte S5 Eingangsbaugruppe weitergeben will, kann ich dies tun indem ich einfach (wie im Anhang gezeigt) das Signal auf 0 bis 4096Steps Normiere und das ganze dann über die DO der S7 als Ausgagnswort in Word (über die verfügbaren 16 DOs) ausgebe?
Ich habe die Starke Vermutung, dass ich Probleme bekommen könnte, da ja die S7 den Wert immer noch mit 16 DOs abbildet, die S5 ja nur 12 Eingänge benutzt. Oder ist dies egal, da ich ja das Signal bereits auf 12Bit herunter gesetzt habe?
Für ein paar Tips von Profis wäre ich sehr dankbar :D

Viele Grüße und einen angenehmen Tag
 

Anhänge

  • FB.png
    FB.png
    63,9 KB · Aufrufe: 35
  • OB1.jpg
    OB1.jpg
    59,1 KB · Aufrufe: 35
naja, am Ende kommts drauf an, was die S5 jetzt bei den 12bit erwartet... Falls Du in die S5-Software nicht reinschauen kannst, wo kamen die 12bit bisher her? Kannst Du dort reinschauen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe die Starke Vermutung, dass ich Probleme bekommen könnte, da ja die S7 den Wert immer noch mit 16 DOs abbildet, die S5 ja nur 12 Eingänge benutzt. Oder ist dies egal, da ich ja das Signal bereits auf 12Bit herunter gesetzt habe?
Das Word bleibt immer 16bit lang.
Wenn du nur 12bit verwendest bleiben die restlichen 4bit SPS-intern einfach dauerhaft auf FALSE.
Sehe da erstmal kein Problem.

Wenn du das Word direkt auf die DOs schreibst, würdest du damit 4bit effektiv dauerhaft auf FALSE schreiben.
Falls du nicht mit DQs knausern musst, könnte man das als Kolateralschaden abhaken ¯\(°_o)/¯

Ansonsten könntest du vllt. per Slice die einzelnen Word-Bits den Ausgängen zuweisen.
Oder per "Scatter" das Word in ein "Array[0..15] of Bool" zerlegen & die einzelnen Arrayelemente dann auf die Ausgänge schreiben.
Oder du maskierst das Ausgangswort der Peripherie mit dem Ergebnis deiner Analogwert-Umrechnung.
Be creative (* ̄3 ̄)╭

Aber bei den Preisen für SPS-Module würde ichn einfach ein komplettes 16er DQ-Modul für die Ausgabe des Analogwerts reservieren & feddich.
 
Hallo,

wie Botimperator schon geschrieben hat hast du bei dem Word Zugriff dann 4 Ausgangsbits die du nicht sauber für andere Sachen nehmen kannst. Da würde ich dann mit einem Slice Zugriff arbeiten, damit kannst du die einzelnen Bits aus der Normierungsvariable auf die einzelnen Ausgänge schreiben. (Die Variante von Botimperator mit dem Scatter geht aber natürlich genauso).

Dein Code hat aber ein großes Problem noch bei der Normierung, da du nur mit Integer rechnest wird die Berechnung nicht funktionieren, da 4095 / 27648 eine Ganzzahl (0) als Ergebnis hat.

Ich hätte der Einfachheit halber die Grenzvariablen auf den Datentyp Real geändert.
Es kann auch Sinn machen den Eingang zu limitieren auf den Wertebereich von UGEB bis OGEB, sonst könnte es bei Drahtbruch oder kleinen Schwankungen um 0 zu unplausiblen Werten kommen.

Hier mal mein Versuch das Ganze umzusetzen:
Code:
//Limitierung Eingang
#rEingang_Limit := LIMIT(MN := #rUGEB, IN := #iEINGANG, MX := #rOGEB);

//Normierung
#rNormierung := (#rOGAB - #rUGAB) / (#rOGEB - #rUGEB) * #rEingang_Limit;

//Wandlung zu Int & Word
#iNormierung := REAL_TO_INT(#rNormierung);
#wNormierung := INT_TO_WORD(#iNormierung);

//Zerlegung in Einzelbits mit Slice Zugriff
#xBIT0 := #wNormierung.%X0;
#xBIT1 := #wNormierung.%X1;
#xBIT2 := #wNormierung.%X2;
#xBIT3 := #wNormierung.%X3;
#xBIT4 := #wNormierung.%X4;
#xBIT5 := #wNormierung.%X5;
#xBIT6 := #wNormierung.%X6;
#xBIT7 := #wNormierung.%X7;
#xBIT8 := #wNormierung.%X8;
#xBIT9 := #wNormierung.%X9;
#xBIT10 := #wNormierung.%X10;
#xBIT11 := #wNormierung.%X11;

#wAUSGABE := #wNormierung;
 
Zuletzt bearbeitet:
Wenn du direkt den Eingang an des Ausgang weiterreichen willst:
L PEW x /dein AI 16bit
T PEW y /ein AO 12bit

du verlierst nichts, bei 12 bit werden die 4 niederwertigen Bits einfach unter den Tisch fallen gelassen.

Wenn du den Ausgang manipulieren willst/musst, dann erst Normierung -> verarbeiten -> Denormierung.

Wenn du 1:1 durchreichen willst und in deinen SPS den Wert benötigst, dann ev. direkt durchreichen und zusätzlich nur Normierung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du den Ausgang manipulieren willst/musst, dann erst Normierung -> verarbeiten -> Denormierung.
Das wird er aber müssen.

Die 0-20mA werden vom AI-Modul auf 0-27648 (dezimal) ausgegeben, also 15bit.
Und ausgeben will er 0-20mA auf 0-4096 (dezimal).
Und die 4096 dann per 12 boolschen Signalen einer DQ Baugruppe an die S5 übergeben.
 
Man könnte auch einfach den Analogwert als Int (nur bei Bedarf!) auf 0 - 32767 limitieren und um 3 Stellen nach rechts schieben. Dann hätte man wohl den Überlauf mit dabei. Übrigens 4095.
 
Wert nehmen, in REAL wandeln, durch 27648/4096 (6,75) teilen, nach INT wandeln und aufs Ausgangswort kopieren.
Den Rundungsfehler muss man hinnehmen.

Damit kann der Wert nur zwischen 0 und 4096 liegen, alles drüber ist der S5 ohnehin egal.
 
Er schrieb "zwischen 0 und 4096", 4096 und 0 liegen nicht in dem Bereich. :cool:

Wenn man einfach die niederwertigsten 4 Bits weglässt, dann bekommt man im Fall, daß der Wert von einem AI kommt, Probleme mit den Überlauf- und Fehler-Werten. Die müssen noch geeignet entfernt werden. Oder ggf 4095 als Fehlerwert festlegen?
 
Zuletzt bearbeitet:
Für mich stellt sich immer noch die Frage, was macht die S5 damit.
Sicherlich wird sie irgendwie mit nem WORD weiterrechnen. Aber füllt sie vorher die 12bit dann links oder rechts mit 4 Nullen auf? Oder links 1 Nullen und rechts 3 Nullen? Werden negative Zahlen berücksichtigt? Oder macht die ganz was anderes damit? Oder ist das BCD? Was ist mit Überlauf Unterlauf Fehlern.
Man weiss es nicht.
Da müsste der TE erstmal ausprobieren, was bei der S5 bei verschiedenen Kombinationen der 12bit passiert.

Evtl. wäre es so, dass bei 0mA alle 12bit false und bei 20mA alle 12bit true sein sollen. Man weiss es nicht.

Ich geh mal davon aus, die S5 ist Bestand und soll/kann/darf nicht umprogrammiert werden?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dazu kommt, dass man die Übertragung in irgendeiner Form synchronisieren muss. Es ist ja sonst nicht sicher, dass bei einer Wertänderung sofort alle betroffenene Bits im gleichen Zyklus eingelesen werden.

@ PN/DP: Nach meinem Verständnis kann 0 ein gültiger Wert sein, 4096 dagegen nicht.
 
Dazu kommt, dass man die Übertragung in irgendeiner Form synchronisieren muss. Es ist ja sonst nicht sicher, dass bei einer Wertänderung sofort alle betroffenene Bits im gleichen Zyklus eingelesen werden.
Evtl. ist da ja in der S5 sowas drinn: Der Sender "darf" nur sekündlich ändern, die S5 verwirft für 3 Zyklen nach Änderung die empfangenen Werte...
 
Zuletzt bearbeitet:
Hallo,

wie Botimperator schon geschrieben hat hast du bei dem Word Zugriff dann 4 Ausgangsbits die du nicht sauber für andere Sachen nehmen kannst. Da würde ich dann mit einem Slice Zugriff arbeiten, damit kannst du die einzelnen Bits aus der Normierungsvariable auf die einzelnen Ausgänge schreiben. (Die Variante von Botimperator mit dem Scatter geht aber natürlich genauso).

Dein Code hat aber ein großes Problem noch bei der Normierung, da du nur mit Integer rechnest wird die Berechnung nicht funktionieren, da 4095 / 27648 eine Ganzzahl (0) als Ergebnis hat.

Ich hätte der Einfachheit halber die Grenzvariablen auf den Datentyp Real geändert.
Es kann auch Sinn machen den Eingang zu limitieren auf den Wertebereich von UGEB bis OGEB, sonst könnte es bei Drahtbruch oder kleinen Schwankungen um 0 zu unplausiblen Werten kommen.

Hier mal mein Versuch das Ganze umzusetzen:
Code:
//Limitierung Eingang
#rEingang_Limit := LIMIT(MN := #rUGEB, IN := #iEINGANG, MX := #rOGEB);

//Normierung
#rNormierung := (#rOGAB - #rUGAB) / (#rOGEB - #rUGEB) * #rEingang_Limit;

//Wandlung zu Int & Word
#iNormierung := REAL_TO_INT(#rNormierung);
#wNormierung := INT_TO_WORD(#iNormierung);

//Zerlegung in Einzelbits mit Slice Zugriff
#xBIT0 := #wNormierung.%X0;
#xBIT1 := #wNormierung.%X1;
#xBIT2 := #wNormierung.%X2;
#xBIT3 := #wNormierung.%X3;
#xBIT4 := #wNormierung.%X4;
#xBIT5 := #wNormierung.%X5;
#xBIT6 := #wNormierung.%X6;
#xBIT7 := #wNormierung.%X7;
#xBIT8 := #wNormierung.%X8;
#xBIT9 := #wNormierung.%X9;
#xBIT10 := #wNormierung.%X10;
#xBIT11 := #wNormierung.%X11;

#wAUSGABE := #wNormierung;
Vielen Dank für deinen Vorschlag.
Ich kannte die Funktion gar nicht, die einzelnen Bits so zu beschreiben.
Die LIMIT Funktion legt doch einfach einen Bereich fest oder? Dass ich quasi einen Überlauf vermeide?
Gruß
 
Wie schnell muss das ganze sein?
Wie schnell ist der Analogeingang?
Man könnte auch über nur 9 DO/DI die vollen 16 Bit gemultiplext übertragen.
Hallo PN/DP,

die Geschwindigkeit spielt erst mal keine Rolle. Die SPS soll testweise ein altes Bauteil ersetzen, über das ich keine Informationen mehr finde. Dies hatte quasi das Analogsignal (0 bis 20mA) in ein 12Bit Ausgangswort ausgegeben und dann 12 DIs einer S5 Baugruppe bespielt. Die S5 (davon gehe ich aus weil ich keine genaue Dokumentation finde und das Programm nicht einsehen kann) wandelt die Eingänge dann in einen Dezimalwert um, der einen Spannweg darstellt. Der kann ruhig etwas zeitversetzt kommen, ich will jedoch auf keinen Fall das S5 Programm ändern.

Gruß
 
Zurück
Oben