+ Antworten
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 11
  1. #1
    Registriert seit
    Feb 2005
    Ort
    Sarkwitz
    Beiträge
    3,673

    Standard 8-Bit-Eingang lesen

    Das folgende Skript zeigt, wie man den 8-Bit-Wert (Interer: 0 bis 255) eines beliebigen Eingang (1-Wire oder andere I/O Geräte)
    in 8 einzelne Variablen (Boolean: An/Aus) "zerlegt".
    Getriggert wird das Skript z.B. mit der Variable "IO8_Port_In" mit "OnChange".
    In der For-Next-Schleife wird 8 mal eine Bitmaske über den Integer-Wert gelegt und somit Zustand der einzelnen Eingänge (An/Aus bzw. True/ False) bestimmt.
    Wenn die jeweilige Variable noch nicht existiert, so wird sie angelegt: "IO8_Port_In_BitX" (X steht für 0 bis 7)

    MST

    PHP-Code:
     //Nur Trigger durch Variable erlauben
     
    if($IPS_SENDER != "Variable")
     {
      return;
     }

     
    //Port Wert auslesen
     
    $value GetValueInteger($IPS_VARIABLE);

     
    //Port Integer Wert auf einzelne Pin Variablen verteilen
     
    for($i=0$i<8$i++)
     {
      
    $bitvalue = (($value & (<< $i)) == (<< $i));
      
    $varname $IPS_VARIABLE."_Bit".$i;

      
    //Falls Variable nicht vorhanden -> anlegen
      
    if(!IPS_VariableExists($varname))
      {
       
    IPS_CreateVariable($varname"Boolean");
      }
      
    SetValueBoolean($varname$bitvalue);
     } 

  2. #2
    Registriert seit
    Dec 2005
    Beiträge
    367

    Gilt das auch für WAGO über die Modbus.DLL ?

  3. #3
    Registriert seit
    Feb 2005
    Ort
    Lübeck
    Beiträge
    21,815

    Das geht mit jeder Integer Variable. Wenn du eine höhere Auflösung als 8Bit brauchst, musst du die For-Schleife verändern.

    paresy

  4. #4
    Registriert seit
    Jul 2005
    Ort
    Roeselare - Belgium
    Beiträge
    1,394

    Gibt es da keine elegantere lösung ?
    left(sprintf(integer,arg)),1) = b7
    usw...

    bin zu mude heute um noch etwas .php aus dem kopf zu schutteln

  5. #5
    Registriert seit
    May 2005
    Beiträge
    2,278

    wie ich gerade im Parallelthread erwähnte: Für C-Programmierer ist das der normale Weg. nicht wie in Basic->erst Zeichenkette aus 0 und 1 machen und dann die Stringfunktionen drauf los lassen. DAS ist umständlich. Ein Glück, das wir alle Computer mit Ghz-Prozessoren haben, sonst würden sich die Programierer letzteres von ganz alleine verkneifen.

    Tommi
    (Der gerade versucht, Prozessoren mit 128Byte Ram und 8Mhz zu Programmieren)

  6. #6
    Registriert seit
    Feb 2005
    Ort
    Sarkwitz
    Beiträge
    3,673

    Standard Byte > 8-Bits

    Das folgende Skript haben wir für die V2 angepasst...

    PHP-Code:
    //Nur Trigger durch Variable erlauben
    if($IPS_SENDER != "Variable") {
        return;
    }

    $value GetValue($IPS_VARIABLE);   // BYTE > Trigger

    for($i=0$i<8$i++) {
        
    $bitvalue = (($value & (<< $i)) == (<< $i));
        
    $varname IPS_GetName($IPS_VARIABLE)."_Bit".$i;
          
    $vid CreateVariableByName($IPS_VARIABLE$varname0);
         
    SetValue($vid$bitvalue);
    }

    function 
    CreateVariableByName($id$name$type){
       global 
    $IPS_SELF;
       
    $vid = @IPS_GetVariableIDByName($name$id);
       if(
    $vid===false) {
          
    $vid IPS_CreateVariable($type);
          
    IPS_SetParent($vid$id);
          
    IPS_SetName($vid$name);
          
    IPS_SetInfo($vid"This Variable was created by Script #$IPS_SELF");
       }
       return 
    $vid;


  7. #7
    Registriert seit
    Mar 2008
    Beiträge
    219

    Standard Byte auf Bit

    Hallo Steiner,

    genau das war es! Ich hatte im Forum immer nach Byte auf Bit gesucht, auf 8-Bit-Eingang war ich nciht gekommen.
    Vielen Dank

    Gruß
    Bastelfrosch

  8. #8
    Registriert seit
    Mar 2008
    Beiträge
    219

    Standard 8-Bit-Ausgang (DB) schreiben

    Hallo Steiner,

    wie bereits beschrieben, läuft das Script für das Auslesen und aufteilen der Werte super.
    Geht das vielleicht auch anders herum?
    Also DB1.DBX1.0 und DB1.DBX1.1 auf 1 entspricht DB1.DBB1=3 etc.

    So könnte man in der Visu die einzelnen Bits für die Schaltvorgänge verwenden und diese würden dann als Byte zur SPS übertragen.


    viele Grüße

    Bastelfrosch

  9. #9
    Registriert seit
    Feb 2008
    Ort
    127.0.0.1
    Beiträge
    455

    Hallo Bastefrosch,

    ich habe ein Ethernet I/O von W&T da kann man es ähnlich machen. Dort setze ich einzelne IPS BoolVariablen zu einem Byte wie folgt zusammen:

    PHP-Code:
    $Value 0;
    for (
    $i=0$i<=7$i++){       //low Byte      Ausgang 0-7
      
    if (GetValueBoolean("Ausgang".$i)){  // Wenn "Ausgang0"...."Ausgang7" = true
        
    $Value $Value pow(2,$i);
      }

    $Value ist dann der Bytewert.
    Ist noch V1 Code. Du mußt halt nur das einlesen der Bool Variablen anpassen.

    Gruß

  10. #10
    Registriert seit
    Feb 2005
    Ort
    Sarkwitz
    Beiträge
    3,673

    ... siehe auch Bit > Byte

Ähnliche Themen

  1. Dimmer 0-10V Eingang
    Von guyabano im Forum Off Topic
    Antworten: 23
    Letzter Beitrag: 10.12.07, 09:28