IR Empfänger für SPS

Hallo edison,
im Anhang findest Du das abgeänderte Programm (txt -> hex). Nun werden die Ausgänge des µC nach einer kleinen Zeit zurückgesetzt.

Übrigens würde ich gerne mal ein Bild von Deiner Platine sehen.


Gruß
Marcus
 

Anhänge

  • IR2PLC.txt
    1,6 KB · Aufrufe: 24
Zuviel Werbung?
-> Hier kostenlos registrieren
Wow, schon über 650 Hits auf diesen Thread - und dabei schreiben nur 2 Personen hinein.
Scheint ja doch Interesse vorhanden zu sein.
Aber wer outet sich schon, das Er eine SPS privat einsetzt.

Mal ein kleiner Zwischenbericht:
Schaltung ist Fertig, auf Lochrasterplatine aufgebaut und getestet.
Programm auf dem Atmega aufgespielt und getestet.
Alles zusammen provisorisch im Wohnzimmer montiert.
S7 Programm ist in Arbeit.
 

Anhänge

  • Atmegainbetriebnahme.jpg
    Atmegainbetriebnahme.jpg
    138,8 KB · Aufrufe: 87
  • Montageort.jpg
    Montageort.jpg
    121,2 KB · Aufrufe: 102
  • Wohnzimmer.jpg
    Wohnzimmer.jpg
    29,5 KB · Aufrufe: 98
Ich Oute mich...

Wow, schon über 650 Hits auf diesen Thread - und dabei schreiben nur 2 Personen hinein.
Scheint ja doch Interesse vorhanden zu sein.
Aber wer outet sich schon, das Er eine SPS privat einsetzt.

Ich hab ne S7-224 (Ich denke die reicht aus.vor allem vom platzaufwand) am laufen.Funst super hab ein TP177micro im Flur.
Bin gerade an der Heizungssteuerung Planung (Steckdosen und Licht sind ja am Laufen) . Die Realisierung mit s7 ist wesentlich günstiger als wie eib.
Die verkablung ist eben aufwendiger.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
S7 Programm ist in Arbeit.
Ich würde Das so machen:

Programm
Code:
FUNCTION FC123 : INT
TITLE = 'IR2PLC'
VERSION : '0.1'
AUTHOR  : AutoLab
NAME    : IR2PLC
FAMILY  : BASIC

VAR_INPUT
  DB_No     :INT;           (* Nummer des Datenbausteins    *)      
  IRcmd0    :BOOL;  
  IRcmd1    :BOOL;  
  IRcmd2    :BOOL;  
  IRcmd3    :BOOL;  
  IRcmd4    :BOOL;  
  IRcmd5    :BOOL;  
  IRaktiv   :BOOL;
END_VAR

VAR_TEMP
  // temporäre Variablen
  myCMD       :INT;     (* Kommando von der IR-FB       *)
  myByteNo    :INT;     (* Bytenummer im DB             *)
  myBitNo     :INT;     (* Bitnummer  im DB             *)
  myDB_No     :WORD;    (* Datenbausteinnummer intern   *)

END_VAR

  // Anweisungsteil
  myCMD := 0;
  IF IRcmd0 THEN myCMD := myCMD +  1; END_IF;
  IF IRcmd1 THEN myCMD := myCMD +  2; END_IF;  
  IF IRcmd2 THEN myCMD := myCMD +  4; END_IF;
  IF IRcmd3 THEN myCMD := myCMD +  8; END_IF;
  IF IRcmd4 THEN myCMD := myCMD + 16; END_IF;  
  IF IRcmd5 THEN myCMD := myCMD + 32; END_IF;  

  myByteNo := myCMD DIV 8;
  myBitNo  := myCMD MOD 8;
  myDB_No  := INT_TO_WORD(DB_No);

  WORD_TO_BLOCK_DB(myDB_No).DD[0] := 0;  
  WORD_TO_BLOCK_DB(myDB_No).DD[4] := 0;  
  WORD_TO_BLOCK_DB(myDB_No).DX[myByteNo, myBitNo] := IRaktiv;  

  IF NOT IRaktiv THEN 
    myCMD := -1;
  END_IF;

  FC123 := myCMD;
END_FUNCTION
Datenbaustein:
Code:
DATA_BLOCK "IR2PLC_DB"
TITLE =
VERSION : 0.1
  STRUCT    
    IRcmd00    : BOOL ; //IR Kommando 0    
    IRcmd01    : BOOL ; //IR Kommando 1    
    IRcmd02    : BOOL ; //IR Kommando 2    
    IRcmd03    : BOOL ; //IR Kommando 3    
    IRcmd04    : BOOL ; //IR Kommando 4    
    IRcmd05    : BOOL ; //IR Kommando 5    
    IRcmd06    : BOOL ; //IR Kommando 6    
    IRcmd07    : BOOL ; //IR Kommando 7    
    IRcmd08    : BOOL ; //IR Kommando 8    
    IRcmd09    : BOOL ; //IR Kommando 9    
    IRcmd10    : BOOL ; //IR Kommando 10    
    IRcmd11    : BOOL ; //IR Kommando 11    
    IRcmd12    : BOOL ; //IR Kommando 12    
    IRcmd13    : BOOL ; //IR Kommando 13    
    IRcmd14    : BOOL ; //IR Kommando 14    
    IRcmd15    : BOOL ; //IR Kommando 15    
    IRcmd16    : BOOL ; //IR Kommando 16    
    IRcmd17    : BOOL ; //IR Kommando 17    
    IRcmd18    : BOOL ; //IR Kommando 18    
    IRcmd19    : BOOL ; //IR Kommando 19    
    IRcmd20    : BOOL ; //IR Kommando 20    
    IRcmd21    : BOOL ; //IR Kommando 21    
    IRcmd22    : BOOL ; //IR Kommando 22    
    IRcmd23    : BOOL ; //IR Kommando 23    
    IRcmd24    : BOOL ; //IR Kommando 24    
    IRcmd25    : BOOL ; //IR Kommando 25    
    IRcmd26    : BOOL ; //IR Kommando 26    
    IRcmd27    : BOOL ; //IR Kommando 27    
    IRcmd28    : BOOL ; //IR Kommando 28    
    IRcmd29    : BOOL ; //IR Kommando 29    
    IRcmd30    : BOOL ; //IR Kommando 30    
    IRcmd31    : BOOL ; //IR Kommando 31    
    IRcmd32    : BOOL ; //IR Kommando 32    
    IRcmd33    : BOOL ; //IR Kommando 33    
    IRcmd34    : BOOL ; //IR Kommando 34    
    IRcmd35    : BOOL ; //IR Kommando 35    
    IRcmd36    : BOOL ; //IR Kommando 36    
    IRcmd37    : BOOL ; //IR Kommando 37    
    IRcmd38    : BOOL ; //IR Kommando 38    
    IRcmd39    : BOOL ; //IR Kommando 39    
    IRcmd40    : BOOL ; //IR Kommando 40    
    IRcmd41    : BOOL ; //IR Kommando 41    
    IRcmd42    : BOOL ; //IR Kommando 42    
    IRcmd43    : BOOL ; //IR Kommando 43    
    IRcmd44    : BOOL ; //IR Kommando 44    
    IRcmd45    : BOOL ; //IR Kommando 45    
    IRcmd46    : BOOL ; //IR Kommando 46    
    IRcmd47    : BOOL ; //IR Kommando 47    
    IRcmd48    : BOOL ; //IR Kommando 48    
    IRcmd49    : BOOL ; //IR Kommando 49    
    IRcmd50    : BOOL ; //IR Kommando 50    
    IRcmd51    : BOOL ; //IR Kommando 51    
    IRcmd52    : BOOL ; //IR Kommando 52    
    IRcmd53    : BOOL ; //IR Kommando 53    
    IRcmd54    : BOOL ; //IR Kommando 54    
    IRcmd55    : BOOL ; //IR Kommando 55    
    IRcmd56    : BOOL ; //IR Kommando 56    
    IRcmd57    : BOOL ; //IR Kommando 57    
    IRcmd58    : BOOL ; //IR Kommando 58    
    IRcmd59    : BOOL ; //IR Kommando 59    
    IRcmd60    : BOOL ; //IR Kommando 60    
    IRcmd61    : BOOL ; //IR Kommando 61    
    IRcmd62    : BOOL ; //IR Kommando 62    
    IRcmd63    : BOOL ; //IR Kommando 63    
               
  END_STRUCT ;  
BEGIN
    IRcmd00    := FALSE; 
    IRcmd01    := FALSE; 
    IRcmd02    := FALSE; 
    IRcmd03    := FALSE; 
    IRcmd04    := FALSE; 
    IRcmd05    := FALSE; 
    IRcmd06    := FALSE; 
    IRcmd07    := FALSE; 
    IRcmd08    := FALSE; 
    IRcmd09    := FALSE; 
    IRcmd10    := FALSE; 
    IRcmd11    := FALSE; 
    IRcmd12    := FALSE; 
    IRcmd13    := FALSE; 
    IRcmd14    := FALSE; 
    IRcmd15    := FALSE; 
    IRcmd16    := FALSE; 
    IRcmd17    := FALSE; 
    IRcmd18    := FALSE; 
    IRcmd19    := FALSE; 
    IRcmd20    := FALSE; 
    IRcmd21    := FALSE; 
    IRcmd22    := FALSE; 
    IRcmd23    := FALSE; 
    IRcmd24    := FALSE; 
    IRcmd25    := FALSE; 
    IRcmd26    := FALSE; 
    IRcmd27    := FALSE; 
    IRcmd28    := FALSE; 
    IRcmd29    := FALSE; 
    IRcmd30    := FALSE; 
    IRcmd31    := FALSE; 
    IRcmd32    := FALSE; 
    IRcmd33    := FALSE; 
    IRcmd34    := FALSE; 
    IRcmd35    := FALSE; 
    IRcmd36    := FALSE; 
    IRcmd37    := FALSE; 
    IRcmd38    := FALSE; 
    IRcmd39    := FALSE; 
    IRcmd40    := FALSE; 
    IRcmd41    := FALSE; 
    IRcmd42    := FALSE; 
    IRcmd43    := FALSE; 
    IRcmd44    := FALSE; 
    IRcmd45    := FALSE; 
    IRcmd46    := FALSE; 
    IRcmd47    := FALSE; 
    IRcmd48    := FALSE; 
    IRcmd49    := FALSE; 
    IRcmd50    := FALSE; 
    IRcmd51    := FALSE; 
    IRcmd52    := FALSE; 
    IRcmd53    := FALSE; 
    IRcmd54    := FALSE; 
    IRcmd55    := FALSE; 
    IRcmd56    := FALSE; 
    IRcmd57    := FALSE; 
    IRcmd58    := FALSE; 
    IRcmd59    := FALSE; 
    IRcmd60    := FALSE; 
    IRcmd61    := FALSE; 
    IRcmd62    := FALSE; 
    IRcmd63    := FALSE; 
END_DATA_BLOCK
Dann kannst Du im restlichen Programm einfach mit dem BOOL aus dem DB arbeiten als wäre es ein Taster.
 
Die Empangenen Codes als Bits in einem DB aufzuschlüsseln finde ich eine schöne Sache, Danke
Darauf war ich noch garnicht gekommen.
IF IRcmd1 THEN myCMD := myCMD + 2; END_IF;
Feine Sache
SCL beherrsche ich leider nicht somit hab ich meine FC in AWL geschrieben.
Hier mal mein Code, auf das Auswerten der Adresse hab ich erstmal verzichtet ggfs. später.
Code:
FUNCTION "IR2PLC" : VOID
TITLE =
VERSION : 0.1
 
VAR_INPUT
  EW : WORD ; //Eingangswort IR2PLC
END_VAR
VAR_OUTPUT
  Adresse : BYTE ; 
  Befehl : BYTE ; 
END_VAR
VAR_TEMP
  eing : WORD ; 
  Bef : BYTE ; 
  Adr : BYTE ; 
  Taste_aktiv : BOOL ; 
END_VAR
BEGIN
NETWORK
TITLE =Fernbedienungscodes einlesen und auswerten
//Befehl auslesen
      L     #EW; 
      SLW   2; 
      SRW   10; 
      T     #Bef; 
//Adresse auslesen
      L     0; 
      T     #Adr; 
      L     #EW; 
      SRW   14; 
      T     #Adr; 
      L     #EW; 
      SLW   13; 
      SRW   13; 
      L     #Adr; 
      +I    ; 
      T     #Adr; 
//Tastendruck aktiv
      L     #EW; 
      T     #eing; 
      U     L      1.3; 
      SAVE  ; 
//Ausgang schreiben
      U     L      1.3; 
      SPBNB high; 
      L     #Adr; 
      T     #Adresse; 
      L     #Bef; 
      T     #Befehl; 
      SPA   end; 
high: NOP   0; 
      L     0; 
      T     #Adr; 
      T     #Befehl; 
end:  NOP   0; 
NETWORK
TITLE =Befehle auswerten
      L     #Bef; 
      L     16; 
      ==I   ; 
      U     L      1.3; 
      =     "IR_Empfangsbits".Licht_auf; 
      L     #Bef; 
      L     17; 
      ==I   ; 
      U     L      1.3; 
      =     "IR_Empfangsbits".Licht_ab; 
      L     #Bef; 
      L     32; 
      ==I   ; 
      U     L      1.3; 
      =     "IR_Empfangsbits".Rollaeden_auf; 
      L     #Bef; 
      L     33; 
      ==I   ; 
      U     L      1.3; 
      =     "IR_Empfangsbits".Rollaeden_ab; 
      L     #Bef; 
      L     13; 
      ==I   ; 
      U     L      1.3; 
      =     "IR_Empfangsbits".Licht_aus; 
 
END_FUNCTION
 
Wie jetzt, die Kiste ist in deinem Wohnzimmer, was sagt deine Frau dazu?

:ROFLMAO: Die macht da das Licht an oder öffnet die Rolläden :cool: - und ist der Meinung, das da doch noch ein paar Funktionen mehr machbar sein sollten :confused:

Das Ganze funktioniert jetzt bald schon seit 4 Wochen und der Wunsch kommt auf, das will ich auch im Arbeitszimmer, Schlafzimmer,...
Doch da werden dann doch die benötigten Eingänge knapp - war ja klar.

@AutomationLab
Wie wärs mit einer Version, bei der die SPS einen Takt vorgibt und der Atmega sendet über einen Ausgang seriell die Empfangenen Bits?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lebt das noch?

Hallo Leute,

habe heute diesen thread hier entdeckt und frage mich inwieweit eure Sachen nun noch laufen...gibts Weiterentwicklungen? Ist gar jemand auf die Idee gekommen das ganze auf ne richtige Platine zu routen und fertigen zu lassen? Wäre schöne wenns das Ding fertig programmiert gäbe, so daß man es nur noch an die SPS schließen muß....

Grüße

BigStephan
 
Hallo zusammen, ich bin neu im Forum und auch was SPS & Co betrifft (gut nicht neu aber es sit schon sehr sehr lange her) aber das mit der Fernbedienung klingt sehr interessant zumal ich auch an einem ähnlichen Projekt "bastel". Ist es möglich z.B. zwei Tasten einer Fernbedienung (RC5-Code) in den Atmega ein zulesen und ihn so zu programmieren das er auch nur diese beiden Befehle befolgt? Die beiden Codes quasi im Atmega abspeichern?
 
Hallo,
Ich habe diese Beiträge als Vorlage genommen, bin jedoch aufgrund meiner begrenzten Programierkenntnisse einen anderen Lösungsweg gegangen.

Bei meiner Version dekodiert der Atmel den RC5 Code, vergleicht den Code und schaltet dann einen entsprechenden Ausgang.
Der Atmel hat bei meiner Version 28 Ausgänge
An diese Ausgange Wird eine DI Baugruppe angebunden.
 

Anhänge

  • RC5.pdf
    88,5 KB · Aufrufe: 27
Zuletzt bearbeitet:
Zurück
Oben