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
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