Skript ausführen bei Slideränderung

Hi Jungs,
ich hab irgendwie ein Brett vorm Kopf und weiß nicht weiter :confused:

Ich habe eine Modbus Instanz die auf ein MW den Eingestellten Slider Wert im WF schreibt.
Das Skript dazu sieht wie folgt aus:


$o = IPS_GetObject($IPS_VARIABLE);
Modbus_WriteRegisterWord($o['ParentID'], $IPS_VALUE);

Das funktioniert soweit gut, jetzt muß ich aber in der SPS, um den gesetzten Wert aus dem WF auszuführen, ein MX auf TRUE setzen. Wie ich ein MX auf True/False, per Skript setze, ist klar nur wie lasse ich das Skript ausführen. Ändere ich mit dem Slider einen Wert, dann hat dies zwar zur Folge das das Skript von oben ausgeführt wird aber wenn ich hier noch weiteren Code hinzufüge, so wird das nicht beachtet. Irgendwie stehe ich auf dem Schlauch und beiße mir die Zähne aus. Ich sehe bestimmt den Wald vor lauter Bäumen nicht.:frowning:

OK, vielleicht war die Frage auch einfach zu dumm :mad:
Ich habe noch ein wenig rumprobiert aber so ganz will es nicht und ich verstehe nicht warum.
Er schreibt das RegisterWord, aber macht dann nicht weiter mit dem ModBus_WriteCoil. Warum nicht :confused:
Habe auch schon mal mit der Zeit ips_sleep gespielt aber das hat keine Auswirkung. Habe testweise das false setzen weggelassen um zu sehen ob der Merker überhaupt auf True gesetzt wird…wird er aber nicht.
Setze ich die Instanz auf True, über die Einstellungen der Instanz, dann wird der Merker schön gesetzt. Aber warum nicht über das Skript. Vorhin funzte es einmal, war aber irgendwie wohl Zufall. Ich habe danach einen neuen Wert im WF vorgegeben und dann ging es schon wieder nicht.:frowning:

Kommt schon Leute…Hilfe!

Folgendes Skript


<?
{
$o = IPS_GetObject($IPS_VARIABLE);
Modbus_WriteRegisterWord($o['ParentID'], $IPS_VALUE);
ModBus_WriteCoil(58657 /**/, true);
ips_sleep(50);
ModBus_WriteCoil(58657 /**/, false);
}
?>

Kommt schon Leute, irgend jemand muss mir doch helfen können :frowning:

Hallo DeejayT,

was passiert denn, wenn Du in einem eigenen Testskript nur die MX-Variable setzt und manuell ausführst?

ModBus_WriteCoil(58657 /**/, true);

Das funktioniert ohne Probleme, das habe ich probiert. Das ist ja das merkwürdige :confused:

Führe ich halt weiter Selbstgespräche.

Ändere ich das Script so, funktioniert es. Warum, keine Ahnung aber so läuft es :mad:

 <?
{
$o = IPS_GetObject($IPS_VARIABLE);
Modbus_WriteRegisterWord($o['ParentID'], $IPS_VALUE);
ips_sleep(50);
ModBus_WriteCoil(58657 /**/, true);
ips_sleep(50);
ModBus_WriteCoil(58657 /**/, false);
}
?> 

Hallo DeejayT,

ich kann dir sagen warum es mit sleep funktioniert. Du Kannst bei Modbus TCP oder RTU keine Zwei Funktionen gleichzeitig ausführen. Es geht immer nur eine Funktion. Du kannst auch nicht gleichzeitig schreiben und lesen. Immer eins nach dem anderen. Erst schreiben, dann lesen. Und bei einer Normalen SPS muss nach jeder Anfrage an den Slave erst auf die Antwort gewartet werden.

Beispiel:

Frage Master Lesen:
Slave 1 sage mir was im Register 25 liegt

Antwort vom Slave:

Hallo Master im Register 25 ist dieser Wert xxx

Master hat jetzt eine Antwort und kann jetzt wieder eine andere Funktion abfragen.

Master Schreibt jetzt ins Register 45…

So Funktioniert das Ganze. Also immer eine Funktion abarbeiten bis es zur nächsten geht. Und immer auf den Response warten bevor ein Funktionswechsel gemacht wird. Wenn du nicht auf die Antwort wartest dann kann es passieren das du ein Falsches Register schreibst oder liest.

so wie du es in deinem letzten Beispiel hast ist es Richtig

<?
{
$o = IPS_GetObject($IPS_VARIABLE);
Modbus_WriteRegisterWord($o[‚ParentID‘], $IPS_VALUE);
ips_sleep(50);
ModBus_WriteCoil(58657 //, true);
ips_sleep(50);
ModBus_WriteCoil(58657 /
/, false);
}
?>

Ahhh ok, das erklärt einiges. Wie kann man denn sicherstellen das die erste Abfrage komplett abgearbeitet worden ist. Kann man hier irgendwie das Script erweitern so das man das abfangen kann oder reicht das Einfügen einer Zeit?

Wie es bei IP-Symcon Funktioniert kann ich dir nicht sagen. Es müsste irgedwo eine Response Array geben. In diesem Array steht dann die Antwort mit Slavenummer, Registernummer und die werte die du schreibst oder liest. Ich habe bis jetzt nur mit dieser Classe gearbeitet

http://code.google.com/p/phpmodbus/

in der IPS doku steht

Rückgabewerte
Konnte der Befehl erfolgreich ausgeführt werden, liefert er als Ergebnis TRUE, andernfalls FALSE.

http://www.ip-symcon.de/service/dokumentation/modulreferenz/modbus-rtu-tcp/modbus-writecoil/

das wird die Antwort sein.