Hs485/127/io

Hallo!

Ich bin ein Neuling in diesem Gebiet.
Habe mir IP-SYMCON und HS485 Kompontenten gekauft und möchte sie über den PC schalten.
Studiere täglich (seit 3 Wochen) das Handbuch und die Beiträge komme aber nicht weiter.

Folgendes:
Habe RWN gefragt, ob ich sein Script verwenden darf :slight_smile:
Meine Einstellungen in IP-SYMCON sind:
Unter Instances habe ich einen COM Port #55545 (19200,8,1,even) und eine Registervariable #62324 angelegt und miteinander verbunden.
Variablen: HS485_Ausgang,
IOA1t (von A1 bis A7)
Triggervariable ist „HS485_Ausgang“ OnUpdate

Ich möchte die Aktoren mit dem IP-Designer schalten aber wie?
Was sollte passieren wenn ich den Execute Button drücke.
Mit dem Demoprogramm von ELV in C++ kann ich die Aktoren schalten.


<? 
/* 
******************************* 
IP-SYMCON Event Scripting 
******************************* 
File     : Send_HS485.ips.php 
Trigger  : OnUpdate HS485_Ausgang 


********************************************************************************************** 
* Schalten der Ausgänge des HS485 Bussystem. Funktioniert nur mit HS485/S und HS485/127/IO   * 
* Die Moduladressen müssen angepasst werden und eventuell die Schaltbefehle. Ein/Aus.        * 
* Toggle ist angegeben.                                                                      * 
* Zeitgesteuerte Abläufe(Treppenhaus,Timer) kann man in der Software von ELV einstellen oder * 
* auch über Scripte selbst steuern.                                                          * 
********************************************************************************************** 
*/ 


$ComID   = 55545;                              // Comport ID muss angepasst werden // 
$Eingabe = GetValueString("HS485_Ausgang");    // Triggervariable // 

//$Interface = "\xFE\x04\x01\xBE\xD2";         // Interface testen // 
//COMPort_SendText($ComID, $Interface); 

$Startzeichen    = "\xFD";                     // Startzeichen FD Vorgabe 
$HS485_127IO     = "\x00\x00\x20\xD5";         // Meine Moduladresse  
$HS485_S         = "\x00\x00\x10\x98";         // Schalteradresse muss angepasst werden 
$Kontrollzeichen = "\x98";                     // Kontrollzeichen 98 Vorgabe 
$Absender        = "\x00\x00\x00\x00";         // Absenderadresse vom PC immer 00000000 
$Framelaenge     = "\x06";                     // Framelaenge ergibt sich aus Befehl,Sensoreingang(vom PC immer 00),Aktornummer und Event(Ein,Aus,Toggle) 
$Framedaten      = "\x73\x00";                 // Framedaten hier Befehl "s" Aktor setzen und Sensoreingang "00" 
$HS485_127IO_A1  = "\x0C";                     // Modul Ausgang 1-7 
$HS485_127IO_A2  = "\x0D"; 
$HS485_127IO_A3  = "\x0E"; 
$HS485_127IO_A4  = "\x0F"; 
$HS485_127IO_A5  = "\x10"; 
$HS485_127IO_A6  = "\x11"; 
$HS485_127IO_A7  = "\x12"; 
$Ein             = "\x01";                      // Event, Ein, Aus, Toggle 
$Aus             = "\x00"; 
$Toggle          = "\xFF"; 
//$CRC             = "\x00\x00"; 

// Schalten der Ausgänge Modul HS485 127 IO 
switch($Eingabe) 
{ 
  case 'IOA1t': 
  $IOA1t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A1.$Toggle;  // Datenframe 
  $CRC16 = GetCRC16 ($IOA1t."\x00\x00");           // Checksumme berechnen 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff);    // Hi-Lo-Byte der Checksumme extrahieren 
  $Aktor1 = $IOA1t.$CRC16str;                      // Checksumme an Datenframe übergeben 
  COMPort_SendText($ComID, $Aktor1);               // Datenframe über Comport senden 
  SetValueString("HS485_Ausgang","");              // Variable leeren 
  break; 
   
  case 'IOA2t': 
  $IOA2t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A2.$Toggle; 
  $CRC16 = GetCRC16 ($IOA2t."\x00\x00"); 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff); 
  $Aktor2 = $IOA2t.$CRC16str; 
  COMPort_SendText($ComID, $Aktor2); 
  SetValueString("HS485_Ausgang",""); 
  break; 
   
  case 'IOA3t': 
  $IOA3t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A3.$Toggle; 
  $CRC16 = GetCRC16 ($IOA3t."\x00\x00"); 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff); 
  $Aktor3 = $IOA3t.$CRC16str; 
  COMPort_SendText($ComID, $Aktor3); 
  SetValueString("HS485_Ausgang",""); 
  break; 
   
  case 'IOA4t': 
  $IOA4t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A4.$Toggle; 
  $CRC16 = GetCRC16 ($IOA4t."\x00\x00"); 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff); 
  $Aktor4 = $IOA4t.$CRC16str; 
  COMPort_SendText($ComID, $Aktor4); 
  SetValueString("HS485_Ausgang",""); 
  break; 
   
  case 'IOA5t': 
  $IOA5t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A5.$Toggle; 
  $CRC16 = GetCRC16 ($IOA5t."\x00\x00"); 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff); 
  $Aktor5 = $IOA5t.$CRC16str; 
  COMPort_SendText($ComID, $Aktor5); 
  SetValueString("HS485_Ausgang",""); 
  break; 
   
  case 'IOA6t': 
  $IOA6t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A6.$Toggle; 
  $CRC16 = GetCRC16 ($IOA6t."\x00\x00"); 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff); 
  $Aktor6 = $IOA6t.$CRC16str; 
  COMPort_SendText($ComID, $Aktor6); 
  SetValueString("HS485_Ausgang",""); 
  IPS_LogMessage($IPS_SELF, "HS485_IOAa6:  ". $Aktor6); 
  break; 
   
  case 'IOA7t': 
  $IOA7t = $Startzeichen.$HS485_127IO.$Kontrollzeichen.$Absender.$Framelaenge.$Framedaten.$HS485_127IO_A7.$Toggle; 
  $CRC16 = GetCRC16 ($IOA7t."\x00\x00"); 
  $CRC16str = chr($CRC16>>8). chr($CRC16&0xff); 
  $Aktor7 = $IOA7t.$CRC16str; 
  COMPort_SendText($ComID, $Aktor7); 
  SetValueString("HS485_Ausgang",""); 
  //IPS_LogMessage($IPS_SELF, "HS485_IOAa7:  ". $Aktor7); 
  break; 

} 

function GetCRC16($s) 
{ 
$CRCinit = 0xffff; // Startwert 
$CRCpoly = 0x1002; // Polynom 

$CRCreg = $CRCinit << 8; 
$PLYreg = $CRCpoly << 8; 
for ($cp=0; $cp<strlen($s); $cp++) 
{ 
  $CRCreg |= ord($s[$cp]); 
  for ($bp=0; $bp<8; $bp++) 
  { 
   $CRCreg <<= 1; 
   if ($CRCreg & 0x1000000) $CRCreg ^= $PLYreg; 
   $CRCreg &= 0xffffff; 
  } 
} 
return $CRCreg >> 8; 
} 


?> 

Mfg

Hallo,

Was sollte passieren wenn ich den Execute Button drücke.

Nichts.

schalten kannst Du, wenn Du in deinen String $Eingabe z.B IOA2t schreibst zum Testen. Die Case IOxxx ist zum schalten der Aktoren. Der Name ist natürlich frei wählbar.

Zum Designer kann ich dir nichts sagen, diesen nutze ich nicht.

Hallo Rainer!
Danke für die schnelle Antwort:

Wenn ich mein Skript so schreibe passert nichts.
Möchte Aktor 1 (also OC) Schalten
Was mache ich falsch?


ComID = 55545;
Eingabe = "\xFD\x00\x00\x20\xD5\x98\x00\x00\x00\x00\x06\x73\x00\x0C\xFF\x21\x73";
COMPort_SendText($ComID, $Eingabe); 
IPS_LogMessage ($IPS_SELF,  "HS485_Ausgang:  ". $Eingabe);


Wie schaltest du deine Aktoren?

Gruß Gerd

hallo, bin mir nicht sicher, aber vielleicht solltest du auch ein $ zeichen vor ComID und Eingabe setzen.

$ComID = 55545;
$Eingabe = „\xFD\x00\x00\x20\xD5\x98\x00\x00\x00\x00\x06\x73\x00\x0C\xFF\x21\x73“;

gruss uwe

Sorry,
im Script stehen sie natürlich vorne also so:


$ComID = 55545; 
$Eingabe = "\xFD\x00\x00\x20\xD5\x98\x00\x00\x00\x00\x06\x73\x00\x0C\xFF\x21\x73"; 
COMPort_SendText($ComID, $Eingabe); 
IPS_LogMessage ($IPS_SELF,  "HS485_Ausgang:  ". $Eingabe); 

Hallo Gerd,

ich gehe davon aus das dein Comport aktiv ist und mit dem HS485 PCI verbunden. und deine Checksumme stimmt.

Meine Aktoren schalte ich mit dem Script.

Hier mal ein Testscript. Ausführen mit Execute.

Variablen anpassen.


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : HS485_schalten.ips.php
Trigger  : 
Interval : 
*/


$Tasten0 = "S2a";
$Tasten1 = "S1e";
$Tasten2 = "IOA1t";
$Tasten3 = "IOA4t";
$Tasten4 = "IOA6t";
$Tasten5 = "IOA1t";
$Tasten6 = "IOA7t";
$Tasten7 = 1;
$Ausgang = $Tasten2;
SetValueString("HS485_Schalter","$Ausgang");
?>

Hallo Gerd,

noch mal was zum Designer, allerdings ohne Gewähr.

if ($IPS_SENDER == "Designer")
{
 switch ($IPS_COMPONENT)
 {
  case "IOA1t":
break;

Deinem Button einfach den Wert IOA1t geben.
Aber dazu können Dir sicher die Leute die es einsetzen mehr zusagen.

RWN hats richtig erklärt, bis auf die zwei fehlenden Klammern.:smiley:
Bei IPSYMID im Designer ObjectInspector Fenster des ExecButton den Wert IOA1t eintragen und bei OnClick das Script was gestartet werden soll einfügen.
Beispiel:


if ($IPS_SENDER == "Designer") 
{ 
  switch ($IPS_COMPONENT) 
   { 
    case "IOA1t": 
    //hier steht der Schaltbefehl
    break; 
   }
}

Hallo!

sehr vielen Dank an Rainer und Thomas für die kompetente Unterstützung.
Mein HS485 I/O 127 schaltet von IPS und vom Designer.

Ein suuuuper Forum!!!

Jetzt steht meinem Umbau nichts mehr im Wege.

Gruß Gerd