Hallo,
ich bin gerade dabei IPSShadowing zu verstehen. Aktuell habe ich mir ein neues DeviceModul „IPSComponentShutter_ModBus“ geschrieben. Das funktioniert soweit ganz gut.
Leider komme ich mit dem SyncPosition nicht klar. Damit es etwas verständlicher wird, was ich meine, hier meine Modbuslösung:
Ich nutze eine Wago 750-881 in Verbindung mit OSCAT. Arbeitsteilung zwischen WAGO und IPS ist generell: Sicherheitsrelevant und Schnell -> WAGO; Komfort -> IPS.
Hier ein Bild meiner Rollladenansteuerung:
![Coreltrace.png](https://community.symcon.de/uploads/default/original/2X/a/aa696f35fdbde09052456ca3c9c400d0c33648f7.png)
Das Rollladenmodul im Detail:
Rot umrandet ist mein IPS zu ShadowingWrapper:
Variablendeklaration:
FUNCTION_BLOCK IPS_ShadowingInterface
VAR_INPUT
MB_IN: WORD;
Pos_IN:BYTE;
END_VAR
VAR_OUTPUT
Move_Up: BOOL;
Move_Down: BOOL;
MB_OUT: WORD;
END_VAR
VAR
tmp: WORD;
Move_Stop: BOOL;
pos: WORD;
END_VAR
ST-Rumpf
(*Regelt die Kommunikation zwischen IPS und Rollladensteuerung via Modbus*)
Move_Up:=(MB_IN AND 32768)>0;
Move_Down:=(MB_IN AND 16384)>0;
Move_Stop:=NOT (Move_Up XOR Move_Down);
(*Sicherheitsfunktion bei up=down=true*)
IF Move_stop=TRUE THEN
Move_Up:=FALSE;
Move_Down:=FALSE;
END_IF
tmp:=0;
IF Move_Up THEN tmp:=16#8000; END_IF
IF Move_Down THEN tmp:=16#4000; END_IF
(*Positionsumrechnung*)
pos:=255-Pos_IN;
MB_OUT:=pos+tmp;
Das heißt, das IPSShadowingInterface regelt die Kommunikation zu meiner vorhandenen Rollladensteuerung.
Konkret habe ich dazu im IPS eine normale ModBusVariable mit je einem Schreib- und LeseWord.
In das Schreibword kann ich jetzt per Script die Zustände Auf/Ab/Stop setzen und im LeseWord wird zusätzlich die Positionsangabe hineincodiert.
Zum verdeutlichen: das IPSComponentShutter_ModBus - Script:
<?
/**@addtogroup ipscomponent
* @{
*
*
* @file IPSComponentShutter_ModBus.class.php
* @author Andreas Brauneis
* @modifiedby tommes
*
*
*/
/**
* @class IPSComponentShutter_ModBus
*
* Definiert ein IPSComponentShutter_ModBus Object, das ein IPSComponentShutter Object für ModBus implementiert.
*
* @author Andreas Brauneis @mod by tommes
* @version
* Version 2.xx.x, 30.03.2016<br/>
*/
//Steuerungs Konstanten
define('MUP','32768');
define('MDN','16384');
IPSUtils_Include ('IPSComponentShutter.class.php', 'IPSLibrary::app::core::IPSComponent::IPSComponentShutter');
class IPSComponentShutter_ModBus extends IPSComponentShutter {
private $instanceId;
private $reverseControl;
/**
* @public
*
* Initialisierung eines IPSComponentShutter_ModBus Objektes
*
* @param integer $instanceId InstanceId des ModBus Devices
* @param boolean $reverseControl Reverse Ansteuerung des Devices
*/
public function __construct($instanceId, $reverseControl=false) {
$this->instanceId = IPSUtil_ObjectIDByPath($instanceId);
$this->reverseControl = $reverseControl;
}
/**
* @public
*
* Function um Events zu behandeln, diese Funktion wird vom IPSMessageHandler aufgerufen, um ein aufgetretenes Event
* an das entsprechende Module zu leiten.
*
* @param integer $variable ID der auslösenden Variable
* @param string $value Wert der Variable
* @param IPSModuleShutter $module Module Object an das das aufgetretene Event weitergeleitet werden soll
*/
public function HandleEvent($variable, $value, IPSModuleShutter $module){
$module->SyncPosition(((255-$value)*100/255), $this);
}
/**
* @public
*
* Funktion liefert String IPSComponent Constructor String.
* String kann dazu benützt werden, das Object mit der IPSComponent::CreateObjectByParams
* wieder neu zu erzeugen.
*
* @return string Parameter String des IPSComponent Object
*/
public function GetComponentParams() {
return get_class($this).','.$this->instanceId;
}
/**
* @public
*
* Hinauffahren der Beschattung
*/
public function MoveUp(){
ModBus_WriteRegisterWord($this->instanceId, MUP);
}
/**
* @public
*
* Hinunterfahren der Beschattung
*/
public function MoveDown(){
ModBus_WriteRegisterWord($this->instanceId, MDN);
}
/**
* @public
*
* Stop
*/
public function Stop() {
ModBus_WriteRegisterWord($this->instanceId, 0);
}
}
/** @}*/
?>
Soweit funktioniert das ganz gut.
Jetzt zu meinem Problem: Wie bekomme ich den Sync hin?
Ich habe mir ein EventInstallerScript gebastelt, welches auch den Event anlegt:
IPSUtils_Include ('IPSMessageHandler.class.php', 'IPSLibrary::app::core::IPSMessageHandler');
$messageHandler = new IPSMessageHandler();
$messageHandler->RegisterOnChangeEvent(40530 /*[Testbereich\ShutterTest\TestShutter\Wert]*/, 'IPSComponentShutter_ModBus,16577', 'IPSModuleShutter_ModBus')
siehe:
Im Log steht:
Die Datei ist im Verzeichnis. Zunächst hatte ich sie als symbolischen Link, jetzt aber direkt reinkopiert.
Was kann ich noch probieren:confused:, bzw. wer hat ModBus erfolgreich im Shutter eingesetzt?
Viele Grüße
tommes