Multiplex in eine s7

Beiträge
38
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
hi
ich habe mir mit ein paar timer und ausgänge
eine art multiplexer gebastellt ,damit wollt ich
8 BCD steller einlesen einfach um eingänge
zu sparen.
ich hab eine move box die den eingangswort 6
immer dan einliest wen der entsprechende ausgang
gesetzt ist,also A0.0 bringt spannung auf den ersten
BCD steller und wird eingelesen danach vergleiche
ich ist und soll und steure ein motor
links oder recht.dan kommt A0.1 u.s.w.

mein problem ist jetzt das ich irgendwie interverenzen
bekomme mein eingelesener Wort 6 bringt mir manchmal
ganz kurz den wert vom anderen BCD steller,ist natürlich
für mich ganz schlimm weil dadurch meine
vergleicher boxen ansprechen und so die ausgänge
wieder rücksetzen.
frage voran kann es liegen mit dem falschen einlesen
gruss
 
Hallo ,
wenn ich das richtig verstanden habe gibst du über die Ausgänge nacheinander Spannung auf die BCD Steller ? Könnte es sein das zwei
Ausgänge einen Zyklus lang 1 haben mach mal eine kurze Pausen Zeit
zwischen die neuen Abfragen.

HDD
 
Hallo,
diese Pausen mußt du zwischen die Umschaltung der Ausgänge legen.
Also z.B. wenn du A0.0 abgefragt hats dann Pause dann erst A0.1 ein usw.

HDD
 
Guten Morgen allerseits

ich muss mal hdd nicht ganz recht geben

die pause gehört nach dem aktivieren deiner ausgänge rein .

das heist zuerst umschalten dann z.B 1 sek Pause und dann liest du dir erst deine eingänge ein. ansonsten wirst du die Probleme immer haben.

Da die steuerung wahrscheinlich schneller ist als deine bcd boxen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hi
danke für die idee ,ich hab mal
ein bischen umprogrammiert und
das scheint jetzt besser zu sein
also kein einlesen des falschen
BCD steller ,aber ab und zu liest
er nur nuller ein ,hab mit den timern
und die zeiten noch etwas rumgespielt
aber habs nicht ganz wegbekommen.
gibt es eigentlich nicht ne bessere lösung
für ein multiplexer,vielleicht mit takt
Merker oder so?
gruss
 
ist die frage wie du das ganze programmiert hast

speicherts du dir die ganzen eingänge auf verschiedene merkerbytes oder wie machst du das ganze
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Hobby programmierer

Zu S5-Zeiten habe ich solche Abfragen realisiert. Vorab aber eine Bemerkung: Die BCD-Steller müssen natürlich über Dioden entkoppelt sein und es ist sinnvoll, die Eingänge, auf denen die BCD-Abfrage erfolgen soll, mit Pull-Down-Widerständen gegen Masse zu klemmen.

Auf einer S5 gab es die Möglichkeiten über PAE bzw. PAA zu gehen oder unverzögert durch direktes Ansprechen der Peripherie (wort- oder byteweise), was von mir für solche Abfragen von BCD-Stellern bevorzugt wurde. Auf der S7 bin ich mir nicht sicher, wie sich das verhält. Es ist aber so, das am Ende eines normalen Zyklus das PAA auf die Peripherie geschrieben wird. Danach wird sofort der neue Zyklus gestartet, der normal mit einem PAE beginnt. In der Regel ist die abgelaufene Zeit zwischen einem PAA und PAE erheblich kürzer als zwischen einem PAE und einem PAA. Da normalerweise das Programm aus dem PAE lebt, kann das von dir realisierte Verfahren eine haarige Sache sein.

Abhilfe:
1. Zyklus: den Ausgang des abzufragenden BCD-Stellers setzten, alle anderen Ausgänge der nicht abzufragenden BCD-Steller zurücksetzen.
2. Zyklus: warten
3. Zyklus: die Eingänge mit der betreffenden BCD-Infoamtion abfragen. Dann den Ausgang des nächsten abzufragenden BCD-Stellers setzten, alle anderen Ausgänge der nicht abzufragenden BCD-Steller zurücksetzen.
4. Zyklus: warten
5. Zyklus: die Eingänge mit der betreffenden BCD-Infoamtion abfragen. Dann den Ausgang des nächsten abzufragenden BCD-Stellers setzten, alle anderen Ausgänge der nicht abzufragenden BCD-Steller zurücksetzen.
6. Zyklus: warten
usw. usf.

Der Rhythmus ist also: lesen, setzen - Leerzyklus einschieben - lesen, setzen Leerzyklus einschieben - usw. usf.
Beim Programmstart ist lediglich das erste Lesen zu unterdrücken.

Barnee
 
hi
KPeter ich übergeb das eingelesenen EW6
durch eine MOVE box auf ein DB der dan
alles verteilt.

Barnee
danke für deine ausfühliche erklährung
das hilft mir sehr weiter so ein intergrundwissen.
gruss
tolles BOARD!!
 
Hobby programmierer,

...gibt es eigentlich nicht ne bessere lösung
für ein multiplexer,vielleicht mit takt
Merker oder so?...

Im Prinzip musst brauchst du nur einen Baustein, der eine Kanalnummer hochzählt. Entsprechend dieser Nummer legst du deinen Eingangswert an entsprechender Stelle im DB ab. Anschliessend incrementierst du die Kanalnummer und setzt die Ausgänge für den nächsten BCD-Wert. Soweit ist es ja schon einmal klar.

Dieser Baustein muss dann z.Bsp. genau 1x pro Sekunde ausgeführt werden. Den dafür benötigten Impuls kannst du durch Flankenbildung aus einem Taktmerker gewinnen. Du brauchst keinen einzigen Timer. Noch einfacher wäre der Aufruf des Bausteins im OB35. Der Intervall des OB35 kann in der HW-Konfig unter CPU-Eigenschaften eingestellt werden.


Gruss, Onkel
 
@Hobby programmierer

Ich hab noch eine AWL-Quelle (Text-Datei) aus alten S5-Zeiten, die sicher funktioniert hat. Kommt ohne Weckaufruf aus (kein OB35 erforderlich). Der Baustein ließe sich einfach nach S7 portieren. Wenn's dich interessiert, laß es mich wissen, dann stell ich ihn dir zur Verfügung.

@ Onkel
Das Problem sind nur die Verzugszeiten bei der Ausgabe bzw. beim Einlesen. Die Wartezeit von einer Sekunde ist übertrieben. Ein einfacher Leerzyklus nach dem Setzen des Ausgangs reicht aus. Ich habe diese Methode sicher an die 200 mal eingesetzt. Später als das HMI mit preiswerten Touchscreens realisiert werden konnte, waren die BCD-Steller nicht mehr gefragt.

Gruß Barnee
 
Sorry,

mit FUP kann ich leider nicht dienen. Aber, da ja Weihnachten ist, ein Bsp. in AWL. Du kannst ja mal versuchen, den Baustein in FUP um zu schreiben.
Bei Aufruf im OB1 versorgst du den Eingang "TAKT" mit einem deiner Taktmerker und den Eingang "ZYKLISCH" mit "FAKSE". Wenn du den Baustein im Weckalarm aufrufst, dann mit "ZYKLISCH"="TRUE" und "TAKT"="FALSE". Das Erweitern auf 8 Kanäle bekommst du hin.


Gruß, Onkel



Code:
FUNCTION_BLOCK FB 1000
TITLE =BCD-Multiplexer für 4-stelligen BCD-Schalter
VERSION : 0.1


VAR_INPUT
  TAKT : BOOL ;	//Trigger-Signal zur Bearbeitung der Funktion, event. Taktmerker
  ZYKLISCH : BOOL ;	//Zyklische Ausführung (z.Bsp. aus Weckalarm-OB)
  ANZAHL_KANAELE : INT ;	//Anzahl der einzulesenden Kanäle [1..64]
  PEW : INT ;	//Wert des Analogeingangs
  DB_NR : BLOCK_DB ;	//DB für Ablage der Kanalmesswerte
  OFFSET : INT ;	//Offset in DB_NR (Byte-Adresse)
END_VAR
VAR_OUTPUT
  BCD_1 : BOOL ;	//1. BCD-Stelle
  BCD_2 : BOOL ;	//2. BCD-Stelle
  BCD_3 : BOOL ;	//3. BCD-Stelle
  BCD_4 : BOOL ;	//4. BCD-Stelle
END_VAR
VAR
  TRIGGER_FLM : BOOL ;	//Flankenmerker Triggerimpuls
  ADRESSZAEHLER : INT ;	//Umlaufzähler für Adressierung
END_VAR
VAR_TEMP
  ZEIGER_BCD_WERTE : DWORD ;	//Startadresse für Datenbereich BCD-Werte
END_VAR
BEGIN
NETWORK
TITLE =Zeitgesteuerte Bearbeitung


//*** Bearbeitung nur wenn TRIGGER-Impuls
//    oder ZYKLISCH (bzw. aus Weckalarm)
      U     #TAKT; 
      FP    #TRIGGER_FLM; 
      O     #ZYKLISCH; 
      NOT   ; 
      BEB   ; // !!! 

NETWORK
TITLE =BCD-Wert abspeichern


//*** Adresszähler darf nicht "0" sein (nach Neuladen ist er 0)
      L     #ADRESSZAEHLER; 
      L     0; 
      <=I   ; 
      SPBN  M001; 
      L     #ANZAHL_KANAELE; 
      T     #ADRESSZAEHLER; 

//*** Datenbaustein für BCD-Ablage öffnen
M001: AUF   #DB_NR; 

//*** mit SLD 1 wird die Wort-Adresse (Kanalnummer 1..4) in eine Byte-Adresse
//    umgewandelt (MULT 2 == SLD 1) und die drei Bit für die Bit-Adresse werden
//    aufgefüllt (== SLD 3)
      L     #ADRESSZAEHLER; // entspricht Wort-Adresse (16bit)
      DEC   1; // DB-Kanal zu "alter" Adresse (-1)
      SLD   1; // jetzt Byte-Adresse
      L     #OFFSET; // event. Verschiebung im DB
      +I    ; 
      SLD   3; // 3 Bit für Bit-Adresse
      T     #ZEIGER_BCD_WERTE; // steht jetzt auf DB-Kanal 

//*** Messwert abspeichern
      L     #PEW; 
      T     DBW [#ZEIGER_BCD_WERTE]; 

NETWORK
TITLE =Adressausgänge für den BCD-Schalter generieren


//*** Umlaufregister mit MOD
      L     #ADRESSZAEHLER; 
      L     #ANZAHL_KANAELE; 
      MOD   ; 
      T     #ADRESSZAEHLER; //0..KANAELE-1

//*** Ausgänge initialisieren
      CLR   ; 
      =     #BCD_1; 
      =     #BCD_2; 
      =     #BCD_3; 
      =     #BCD_4; 

//*** BCD-Adresse an Ausgang übergeben
      L     #ADRESSZAEHLER; 
      SPL   ERR1; 
      SPA   BCD1; 
      SPA   BCD2; 
      SPA   BCD3; 
      SPA   BCD4; 
ERR1: SPA   ENDE; 


BCD1: SET   ; 
      =     #BCD_1; 
      SPA   ENDE; 
BCD2: SET   ; 
      =     #BCD_2; 
      SPA   ENDE; 
BCD3: SET   ; 
      =     #BCD_3; 
      SPA   ENDE; 
BCD4: SET   ; 
      =     #BCD_4; 

ENDE: NOP   0; 

NETWORK
TITLE =Adresse erhöhen


//*** Adresszähler erhöhen
      L     #ADRESSZAEHLER; 
      INC   1; 
      T     #ADRESSZAEHLER; 

END_FUNCTION_BLOCK
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Barnee,


...Die Wartezeit von einer Sekunde ist übertrieben. Ein einfacher Leerzyklus nach dem Setzen des Ausgangs reicht aus...
Ja, stimmt natürlich. Es sei denn man hat eine sehr schnelle SPS, dann kommen die Eingänge nicht mehr nach. Mein Gedanke aber war, die Signale beobachten zu können.


@Hobby programmierer
Manch Kommentar in obigem Code ist nicht so ganz zutreffend (Analogwerte, 1..64 Kanäle). Ich hatte mir als Vorlage einen anderen meiner Bausteine genommen. Sorry, kann's nicht mehr editieren, war nicht eingeloggt.


Gruß, Onkel
 
hi Barnee

Ich hab noch eine AWL-Quelle (Text-Datei) aus alten S5-Zeiten, die sicher funktioniert hat. Kommt ohne Weckaufruf aus (kein OB35 erforderlich). Der Baustein ließe sich einfach nach S7 portieren. Wenn's dich interessiert, laß es mich wissen, dann stell ich ihn dir zur Verfügung.

ja gerne
gruss
 
Code:
       #FB 48
       #N GET-BCD1
 ;****************************************************************************
 ; COPYRIGHT 1994
 ; Projekt Dr. Kohl - 95 - Dorsten
 ; Stand: 03.02.1995
 ; Stand: 15.02.1996, rev.
 ; Funktionsbaustein: Kodierschalter-Abfrage Pumpe P3
 ;****************************************************************************
        #UB                                  Mengenabfrage
        A   DB 181                           Arbeits-Datenbaustein
        L   DW  51                           Schrittzaehler
        L   KB        1
        <F
        SPB =  RSET                          Wert ist ungueltig
        TAK
        L   KB        5
        <=F
        SPB =  WEIT
 ;----------------------------------------------------------------------------
 RSET   L   KB        1
        T   DW  51                           Schrittzaehler
        U             (P3-DU-GB              Durchlaufmerker
        R             (P3-DU-GB
 WEIT   B   DW  51
 SP0    SPA =  SP0
        SPA =  SP1                           Ausgang 10E3 f. Menge setzen
        SPA =  SP2                           Menge 10E3 lesen, 10E2 setzen
        SPA =  SP3                           Menge 10E2 lesen, 10E1 setzen
        SPA =  SP4                           Menge 10E1 lesen, 10E0 setzen
        SPA =  SP5                           Menge 10E0 lesen, danach Ende
 ;----------------------------------------------------------------------------
 SP1    L   KF        +0
        T   AW  25                           Ausgaenge vorsorglich loeschen
        UN            <P3-W10E3
        S             <P3-W10E3              Menge 10E3 setzen
        SPA =  ZIS6
 ;----------------------------------------------------------------------------
 SP2    UN            (P3-DU-GB
        S             (P3-DU-GB
        BEB
        L   EB  13
        L   KH        000F
        UW
        SLW     12
        T   DW  52                           Register Mengen-Sollwert
        U             <P3-W10E3
        R             <P3-W10E3
        S             <P3-W10E2              Menge 10E2 setzen
        SPA =  ZIS6
 ;----------------------------------------------------------------------------
 SP3    UN            (P3-DU-GB
        S             (P3-DU-GB
        BEB
        L   EB  13
        L   KH        000F
        UW
        SLW      8
        L   DW  52                           Register Mengen-Sollwert
        OW
        T   DW  52
        U             <P3-W10E2
        R             <P3-W10E2
        S             <P3-W10E1              Menge 10E1 setzen
        SPA =  ZIS6
 ;----------------------------------------------------------------------------
 SP4    UN            (P3-DU-GB
        S             (P3-DU-GB
        BEB
        L   EB  13
        L   KH        000F
        UW
        SLW      4
        L   DW  52                           Register Mengen-Sollwert
        OW
        T   DW  52
        U             <P3-W10E1
        R             <P3-W10E1
        S             <P3-W10E0              Menge 10E0 setzen
 ZIS6   SPA =  ZINC
 ;----------------------------------------------------------------------------
 SP5    UN            (P3-DU-GB
        S             (P3-DU-GB
        BEB
        L   EB  13
        L   KH        000F
        UW
        L   DW  52                           Register Mengen-Sollwert
        OW
        T   DW  52
        SPA OB 220
        DED                                  BCD --> DUAL
        T   DW  53                           Mengen-Sollwert in >>KF<<
        U             <P3-W10E0
        R             <P3-W10E0
 ;
        SPA FB 91                            Zaehler laden und starten
        U             (IMMER_EINS
        R             (P3-FR-GB              Freigabe fuer FB 48 loeschen
        R             (P3-DU-GB
        S             (P3-ME-GB
        S             (FR:RESET              Anwahl zuruecksetzen
        S             (P3-FR-SB
        L   KB        1
        T   DW  51
        L   DW  52                           Register Mengen-Sollwert
        L   KH        0000
        !=F
        R             (P3-ME-GB
        BEA
 ;----------------------------------------------------------------------------
 ZINC   L   DW  51                           Schrittzaehler
        I        1
        T   DW  51                           Schrittzaehler
        U             (P3-DU-GB
        R             (P3-DU-GB
 ;----------------------------------------------------------------------------
        BE
 ;

Der Baustein wurde damals auf einer S5-135U mit einer CPU928B eingesetzt.
Anders als in der Anfrage von Hobby programmierer wurde nicht eine analoge Information abgefragt, sondern der BCD-Code eines jeden Schaltersegmentes im digitalen Format, d.h. die Schaltersegmente müssen über Dioden entkoppelt werden (kann z.B. bei der Fa. Siebert so bezogen werden), damit kann ein 4 poliger "Bus" gebildet werden. An diesen "Bus" können beliebig viele Schaltersegmente gekoppelt werden, für jedes Schaltersegment muss ein Ausgang vorgesehen werden. Beispiel:
Es sollen 3 Stück 4-stellige BCD-Steller abgefragt werden, damit werden auf der SPS 4 digitale Eingänge und 12 digitale Ausgänge erforderlich.
Der Baustein FB48 holt die Information bei Bedarf, wenn die Pumpe gestartet werden soll. Die 4 Stellen des BCD-Stellers erfordern 5 Schritte in der Abfrage. Insgesamt läuft der Baustein 9 Zyklen, der Trick mit der Untersetzung liegt in der Anwendung eines Durchlaufmerkers (hier (P3-DU-GB), der z.B. im Schritt 2 noch nicht gesetzt ist und damit das VKE setzt, was zu einem Abbruch der Bausteinbearbeitung führt. Im Nächsten Zyklus ist diese Bedingung nicht mehr vorhanden und damit wird der Schritt vollständig bearbeitet. Die Information wird hier über EB13 eingelesen, d.h. E 13.0 steht für den Wert 1, E 13.1 für den Wert 2, E 13.2 für den Wert 4 und E 13.3 für den Wert 8, daher die Maskierung mit "000F". In 4 Schritten wird so die BCD-Zahl zusammengesetzt, der Aufruf von OB 220 (Schritt 5) ist spezifisch für die CPU928B, nach DED steht der abgefragte Wert eines 4-stelligen BCD-Stellers im INT-Format zur Verfügung.
Ich habe den Quelltext so wie er hier steht aus dem Projekt kopiert. Ich denke, es sollte keine Schwierigkeit sein, den Baustein nach Step7 zu portieren und nach eigenem Geschmack zu veredeln.

Gruß Barnee
 
Nachtrag

Ich sehe gerade in Schritt 1, dass AW 25 generell gelöscht wird, das hat damit zu tun, das in dem Projekt 8 Stück solcher 4-stelligen BCD-Steller abgefragt wurden, die Ansteuerungen für die BCD-Segemente waren alle beim AW 25 verdrahtet.

Gruß Barnee
 
Zurück
Oben