Modbus-Variablen per Script erstellen

Hallo allerseits,

ich möchte ein Energie-Messgerät mit mehreren Kanälen per Modbus/TCP in IP-Symcon einbinden und dazu Variablen für zahlreiche Modbus-Register anlegen. Per GUI klappt das schon recht gut, ist allerdings sehr umständlich, deswegen möchte ich ein Script dafür verwenden.

Ich kann in der Dokumentation leider keinen Hinweis finden, wie ich den Typ einer solchen Instanz vom Typ „ModBus Address“ festlegen kann. Alle Instanzen, die ich per Script generiere, bekommen die Einheit „Bit“ und eine Variable vom Typ „Boolean“. Per GUI kann ich die Einheit auf Real umstellen, aber wie geht das per Script?

Laut Referenz hat eine „ModBus Address“-Instanz nur vier Properties: ReadAddress, WriteAddress, Poller und ReadOnly. Gibt es noch weitere, undokumentierte Properties? Kann ich irgendwie alle Properties einer Instanz auflisten lassen?

Vielen Dank im Voraus!

Schöne Grüße
Ingo

Mein Code soweit:


$host = "lab-px";
$port = 502;

$client_socket = "{3CFF0FD9-E306-41DB-9B5A-9D06D38576C3}";
$modbus_rtu_tcp = "{A5F663AB-C400-4FE5-B207-4D67CC030564}";
$modbus_address = "{CB197E50-273D-4535-8C91-BB35273E3CA5}";

$socket = IPS_CreateInstance($client_socket);
IPS_SetName($socket, "$host:$port");
IPS_SetProperty($socket, "Host", $host);
IPS_SetProperty($socket, "Port", $port);
IPS_ApplyChanges($socket);

$modbus = IPS_CreateInstance($modbus_rtu_tcp);
IPS_ConnectInstance($modbus, $socket);
IPS_SetName($modbus, "Modbus/TCP @ $host");
IPS_SetProperty($modbus, "SwapWords", 0);
IPS_ApplyChanges($modbus);

$rms_current = IPS_CreateInstance($modbus_address);
IPS_ConnectInstance($rms_current, $modbus);
IPS_SetName($rms_current, "RMS Current");
IPS_SetProperty($rms_current, "ReadAddress", 0x3008);
IPS_ApplyChanges($rms_current);

[QUOTE=Raritan;199051]Hallo allerseits,

ich möchte ein Energie-Messgerät mit mehreren Kanälen per Modbus/TCP in IP-Symcon einbinden und dazu Variablen für zahlreiche Modbus-Register anlegen. Per GUI klappt das schon recht gut, ist allerdings sehr umständlich, deswegen möchte ich ein Script dafür verwenden.

Ich kann in der Dokumentation leider keinen Hinweis finden, wie ich den Typ einer solchen Instanz vom Typ „ModBus Address“ festlegen kann. Alle Instanzen, die ich per Script generiere, bekommen die Einheit „Bit“ und eine Variable vom Typ „Boolean“. Per GUI kann ich die Einheit auf Real umstellen, aber wie geht das per Script?

Laut Referenz hat eine „ModBus Address“-Instanz nur vier Properties: ReadAddress, WriteAddress, Poller und ReadOnly. Gibt es noch weitere, undokumentierte Properties? Kann ich irgendwie alle Properties einer Instanz auflisten lassen?

Vielen Dank im Voraus!

Schöne Grüße
Ingo

so mache ich es


<?php
// !! Client Sockel einstellen = Instanz
/*
$katID      = 46923 /*[Wago\Digitale Ausgänge\750-1504-POS-31-16-DO-Allgemein]*/;
$anzahl     = 8;          // Anzahl der zu erstellenden Instanzen
$adresse    = 12490 /*[Objekt #12490 existiert nicht]*/;         // ab Adresse
$datenTyp   = 0;          // 0=Bit, 1=Byte, 2=Word, 3=DWord, 4=ShortInt, 5=SmallInt, 6=Integer, 7=Real
$modulName1 = "ADR_";     // Bezeichnung der Variable
$modulName2 = "_";        // Bezeichnung der Variable
$time       = 200;        // Aktualisierungzeit in ms
$nurLesen   = false;      // true oder false

for($i=0; $i<$anzahl; $i++) {

   $neueInstanz = IPS_CreateInstance("{CB197E50-273D-4535-8C91-BB35273E3CA5}");
   IPS_SetName($neueInstanz, $modulName1.$adresse.$modulName2);
   ModBus_SetType($neueInstanz, $datenTyp);
   ModBus_SetWriteAddress($neueInstanz, $adresse);
   ModBus_SetReadAddress($neueInstanz, $adresse);
   ModBus_SetPoller($neueInstanz, $time);
   ModBus_SetReadOnly($neueInstanz, $nurLesen);
   IPS_ApplyChanges($neueInstanz);
   IPS_SetParent($neueInstanz, $katID);
   $adresse++;
   IPS_Sleep(1500);

   }
*/
?>

Vielen Dank, das ist genau die Funktion, die ich gesucht habe. Wie findet man so etwas heraus? In der Modul-Referenz ist die Funktion nicht beschrieben, und sie wird nicht einmal in der Vervollständigung mit Strg+Leertaste aufgelistet.

Schöne Grüße
Ingo

Dein SetProperty Ansatz ich such eigentlich der richtige. Mich wundert nur, dass dort die Type Eigenschaft fehlt. Ich werde die Morgen entsprechend nachpflegen.

paresy

Hallo allerseits,

ich bin mit meiner Arbeit jetzt schon ein großes Stück weitergekommen, allerdings bin ich jetzt auf ein seltsames Verhalten gestoßen, das wahrscheinlich ein Bug in IP-Symcon ist:

[ul]
[li] Ich lege eine Instanz vom Typ „ModBus Address“ an, setze den Typ auf „Real“ oder „DWord“ und lege eine Read-Adresse fest.
[/li][li] Der Wert des Registers wird sowohl im Objektbaum als auch im WebFront korrekt angezeigt.
[/li][li] Ich bearbeite die Variable der neu angelegten Instanz und wähle ein Profil aus, das eine Einheit und die Anzahl der Dezimalstellen festlegt (z.B, ~Volt).
[/li][li] Im Objektbaum wird der Wert jetzt korrekt mit Einheit dargestellt, im WebFront steht statt des Wertes nur noch „Visualisierung nicht möglich!“.
[/li][li] Ich bearbeite die Modbus-Instanz, setze den Haken bei „Nur-Lesen“, übernehme die Änderung und mache sie dann gleich wieder rückgängig.
[/li][li] Der Wert wird jetzt auch im WebFront korrekt dargestellt.
[/li][/ul]

In meinem Script sieht der notwendige Workaround folgendermaßen aus ($sensor ist die Instanz vom Typ „ModBus Address“):


IPS_SetProperty($sensor, 'ReadOnly', 1);
IPS_ApplyChanges($sensor);
IPS_SetProperty($sensor, 'ReadOnly', 0);
IPS_ApplyChanges($sensor);

Kann jemand bestätigen, dass das ein Bug ist? Oder mache ich noch etwas falsch?

Schöne Grüße
Ingo

Hat sich erledigt: Read-Only einschalten hat den Nebeneffekt, dass der Haken bei „Benutze Standardaktion“ verschwindet. Das gleiche kann ich per Script erreichen, indem ich:

IPS_SetVariableCustomAction($variable, 1);

aufrufe.

Schöne Grüße
Ingo