Multiplexer ansteuern

Bastelfrosch

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

ich habe erstmalig ein analoges Eingangsmodul an einer SPS in VErwendung und mittels eines PT1000/0-10V-Umwandlers eine Temperatur gemessen. Nun möchte ich mit dem Multiplexer von Rink 16 PT1000 ansteuern.
Für die Daten habe ich schon in einem FC geschrieben, dass wenn die 4 Merker für die Ausgänge entsprechend geschaltet sind, die Ergebnisse der Messungen in einen entsprechenden DB geschrieben werden.
Merker und Ausgänge habe ich gleichgesetzt.
Dies waren dann mal eben 16 Netzwerke. Jetzt möchte ich diese 4 Merker zyklisch schalten lassen, um automatisch, z.B. sekündlich, die einzelnen Temperaturen abfragen und in den entsprechenden DB schreiben zu können. Hier suche ich nach einer möglichst kleinen Lösung.
Mir ist hier nur eingefallen mit Timern zu arbeiten und jeweils mit ODER Funktionen zu arbeiten, aber das würde ja auch wieder eine Reihe von Netzwerken bedeuten.
Eine weitere Variante, die ich mir vorstellen könnte, wäre einfach das Byte der 4Merker durchlaufend zu verändern, Also MB26 =1, nächster Zyklus =2 etc. Aber :
erstens weiss ich nicht, wie ich das Byte direkt schreiben kann und zweitens könnte ich dann die 4 verbleibenden Merker bzw. Ausgänge nicht mehr anderweitig verwenden.

Aber wahrscheinlich sehe ich den Wald vor lauter Bäumen nicht mehr...

Vielen Dank für Eure Hilfe

bastelfrosch
 
Ein Baum wäre, in dem du einen Merker aus dem Taktmerkerbyte (in HW-Config bei der CPU angelegt) benutzt um ein Byte hochzuzählen.

Na gut, 4 direktzuweisungen aus nem Merkerbyte/Datenwort heraus auf die Ausgänge , kann mann schon machen.
Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Programmiere Dir einen 1 sec Zykluswisch (ein Wisch je sekunde ).
Dann zähle mit jedem Wisch 1 hoch ( ein Datenwort).
wenn 5 erreicht setze sofort auf 1. Somit zählt das Ding immer von 1-4
(ausser im allerersten Zyklus).

Code:
UN M #Wischnerker
L S5t#1s
se T1

U T1
= M #Wischmerker


UN #Wischmerker
spb n1
L #Zähldatenbaustein
L 1
+I
T #Zähldatenbaustein

L #Zähldatenbaustein
L 5
<>I
SPB n1

L 1 
T #Zähldatenbaustein

n1: NOP 0


L #Zähldatenbaustein
L 1
==I
= M #Wert1

L #Zähldatenbaustein
L 2
==I
= M #Wert2

usw.
gibts dann die Verschaltungsmerker

peter(R)
 
Zuletzt bearbeitet:
Hallo Zusammen,

ich habe es nun glaube ich ganz kompliziert hinbekommen:

U M 100.7
ZV Z 1
BLD 101
NOP 0
NOP 0
U "M120.4Reserviert"
R Z 1
L Z 1
T "MW119"
NOP 0
NOP 0
hiermit zähle ich das MW 119 hoch

CALL "Byte_to_Bits" , "MUX1 Daten Zähler"
IN:="MB120"
B0:="AM MultiplexerTemp1A1"
B1:="AM MultiplexerTemp1A2"
B2:="AM MultiplexerTemp1A3"
B3:="AM MultiplexerTemp1A4"
B4:=
B5:=
B6:=
B7:=
NOP 0
Danach zerlege ich da MB120 wieder in Bits und weise die Bits den Merkern für die Ausgänge zu.

U "AM MultiplexerTemp1A1"
= "MultiplexerTemp1A1"
U "AM MultiplexerTemp1A2"
= "MultiplexerTemp1A2"
U "AM MultiplexerTemp1A3"
= "MultiplexerTemp1A3"
U "AM MultiplexerTemp1A4"
= "MultiplexerTemp1A4"
Hier verbinde ich die Merker mit den Ausgängen

UN #Merker0
UN #Merker1
UN #Merker2
UN #Merker3
SPBNB _001
L #MeasuredValue
T #DB_Ziel_0
_001: NOP 0
Hier habe ich dann 16 Netzwerke mit den Bitstellungen zur Transferierung in einen DB geschrieben

Dieses Verfahren hat zwei mir bekannte Nachteile
1. Ich habe das komplette MW119 dafür belegt
2. so ca. alle 60Min. kommen die Werte kurzzeitig versetzt an, also habe ich die Temperatur von Fühler 1 auf eimal auf dem Eingang von Fühler 2.

Wenn ich den Taktmerker auf 10Hz setze, kommt der Fehler ca. im Minutentakt.
Sicherlich kann man das ganze viel einfacher und eleganter lösen, ohne bei den Ausgangsmerkern die restlichen Bits (4-7) einzubüßen. Leider weiss ich nicht wie.

Wer hat den den Multiplexer auch im Einsatz und wie habt Ihr das Problem gelöst?

Vielen Dank im Voraus

bastelfrosch
 
ausgehend von einem bitmuster:

Code:
*
VAR_INPUT
  xTrigger : BOOL
  iSignalMax : INT
  iPEWByNumber : INT
  bdDB : BlockDB
END_ VAR

VAR_TEMP
  rTemp : REAL
END_VAR

VAR_INOUT
  xHelpFlag : BOOL
  iSignal : INT
END_VAR

VAR_OUT
  xSwitch1 : BOOL
  xSwitch2 : BOLL
END_VAR


      U     #xTrigger
      FP    #xHelpFlag
      SPBN  none
      
      L     #iSignal
      +     1
      T     #iSignal
      L     #iSignalMax
      =I
      SPBN  none
      L     0
      T     #iSignal

none: LAR1  P##iSignal
      U      [AR1,P#0.0]
      =     #xSwitchOut1
      U      [AR1,P#0.1]
      =     #xSwitchOut2
      
      L     #iPEWByNumber
      SLD   3
      LAR1

      L     PEW [AR1,P#0.0]
      ITD
      DTR
      L     1.000000e+001
      /R
      T     #rTemp
      
      L     #iSignal
      SLD   5
      LAR1

      AUF   #bdDB
      L     #rTemp
      T     DBD [AR1,P#0.0]

      SET
      SAVE

...liest allerdings den wert zyklisch bis zum nächsten trigger :rolleyes: ... dazu kommt, dass er ungetestet und nur im editor erstellt ist :cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo vierlagig,

ich bin da nicht so fit. Ich nehme an, das ist in scl geschrieben.
Habe versucht das zu übersetzen, bekomme aber immer eine Warnung angezeigt
W: Z00001 S :00001 Ungültige Zeichen bis Zeile 62
ergebnis: 0Fehler, 1 Warnung.

Deine Variante regelt nur die Ausgabe des Bitmusters, richtig?
Danach müsste also noch irgendwas kommen, um eine Pause einzubauen, bevor die Daten in den DB geschrieben werden

Vielen Dank

bastelfrosch
 
Hallo Bastelfrosch,

der Analogeingang braucht eine gewisse Wandlungszeit. Du musst zu Beginn deines Taktes den aktuellen Messwert abspeichern. Unmittelbar danach setzt du die Ausgänge auf die nächste Adresse.


Gruß, Onkel
 
Zurück
Oben