S7-MultipleRead

Hallo Paresy,
habe in der S7-Interface-Doku http://libnodave.sourceforge.net/ gelesen, das es eigentlich ein Möglichkeit
für das Lesen mehrerer Informationen in einen Leseauftrag gibt.

Daher meine bitte,
kannst Du dir das mal anschauen ob Du für die Scriptebene nicht diese Funktion zur Verfügung stellen kannst

First, you have to prepare an „empty“ read request,
i.e. one that doesn’t contain the address of an item.
You need a variable of type PDU to store the request.
To this request, you add the desired items using the same parameters you would specify to daveReadBytes.
You may add up to 20 difeerent items (limit introduced by Siemens PLCs) provided that the result data fits into
a single response PDU. When you have added all desired items,
call daveExecReadRequest which performs the actual data exchange with the PLC.

Example:
PDU p;
daveResultSet rs;
davePrepareReadRequest(dc, &p);
daveAddVarToReadRequest(&p,daveInputs,0,0,1);
daveAddVarToReadRequest(&p,daveFlags,0,0,4);
daveAddVarToReadRequest(&p,daveDB,6,20,2);
daveAddVarToReadRequest(&p,daveFlags,0,12,2);
res=daveExecReadRequest(dc, &p, &rs);

Now the daveResultSet should contain a result for each item.
Each result contains error information, length information and the resulting byte array.
You can use these results in two ways: Either access the structure daveResult directly or use:

daveUseResult(daveConnection *, daveResultSet * rs, int number);

Ich würde mir das wie folgt vorstellen

  • man stellt ein Array zur Verfügung (max. 20 Einträge)
//index0   = VARIABLENBEZEICHNUNG in IPS
//index1.0 = TYP          (0=bit, 1=byte, 2=word, 3=dword)
//index1.1 = AREA         (4=input, 5=output, 6=flags, 7=datablock)
//index1.2 = AREAADDRESS  (Baustein)
//index1.3 = ADDRES       (StartByte)
//index1.4 = BIT          (Bit = wird nur bei TYP=0 verarbeitet)
//index1.5 = CONVERT-S7-Value vor schreiben auf die IPS-Variable
//                        (0=unverändert, 1=Dec2Hex, 2=Hex2Dec)

$S7_VAR_IDs = array("PALETTE_PALETTENWAGEN_1" => array(2,7,275,30,0,0),
                    "PALETTE_MASCHINE_1"      => array(2,7,275,50,0,0),
                    "PALETTE_MASCHINE_2"      => array(2,7,275,70,0,0));

  • diese Array übergibt man der Funktion (vielleicht auch call-by-reference)

  • man ruft „deine neue Funktion auf“ z.B.: S7_MultipleRead, diese Funktion liest nun die
    Informtionen von der PLC und fügt in das AUFRUFARRAY die Werte den Keys[VALUE] / [ERROR] hinzu
    (wenn möglich die Funktion CONVERT-S7-VALUE vor schreiben durchführen)
    bzw. erzeugt ein eigenes Rückgabearray (Keyname wie Aufrufarray)

==> weis auch nicht was für dich am leichtesten ist

  • was man dann mit dem Rükgabearray macht ist den Benutzer überlassen z.B. schreiben auf eine IPS-Variable

… als Muster wie ich das heute mache !! ==> siehe Anhang bzw. http://www.ip-symcon.de/forum/f41/s7-kommunikation-langsam-7214/

Habe dazu aber auch gleich noch eine Frage,
im Moment bringt mir die Abfrage ob die Verbindung steht nichts, da ich nur die CheckBox der Instanz prüfe,
ist die Statuszeile das Ergebniss welches ich mit IPS_GetInstance -> InstanceStatus abfragen kann (noch nicht getestet) ???

Danke
tgusi74

Hallo Paresy,

ich wollte mal nachfragen wie der Entwicklungsstand, zu dieser tollen Idee aussieht?

Gruß
Michael