SPIDER_ACCESS: Lesen von SAIA nach Phoenix ILC

Begonnen von rrbd, 11. August 2013, 18:24:11

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

rrbd

Hallo,

nachdem das Verfahren zwischen Phoenix ILC problemlos funktioniert, wollte ich nun mal probieren, aus einer SAIA PCD3.M2130V6 über Netzwerk mit SPIDER_ACCESS zu lesen. Leider erst mal Prellbock, "No Such Component Found" (Error-Ausgang von SPIDER_ACCESS bleib aber 0). Hatte so etwas bei http://www.oscat.de/community/index.php/topic,2017.msg10521.html#msg10521 schon befürchtet.

Nun  ist die spannende Frage woran es liegt. Man muss wissen dass sich die Bedeutung von "für den Webzugriff freigegeben", "Instanz-Variable", "Globale Variable" grundlegend von der IEC 61131 (PC WORX) Welt unterscheiden.

Variablennamen
Findet man in einer Saia eine Variable "RLT1.AUSSENTEMPERATUR", Bedeutet "RLT1" nicht wie bei PC WORX, dass die Variable zu einem Arbeitsblatt  "RLT1" gehört. Vielmehr bietet die SAIA-Programmierumgebung die Möglichkeit einer Art Baumstruktur in der Namensgebung. Ich kann also "einfach so" für meine Anlage "RLT1" eine Gruppe "RLT1.Istwerte" mit einer Ganzzahlvariablen "RLT1.Istwerte.Außentemperatur" anlegen.  "RLT1.Istwerte" hat aber keinerlei Bezug zur Programmstruktur, sondern ist wie gesagt nur eine komfortable Möglichkiet, Variablennamen zu verwalten, einen neuen Varablensatz  für gleichartige Funktion eines gleichartigen Anlagenteils zu erzeugen ("RLT2.Istwerte"), mit denen sich dann sehr einfach ein Programmteil für diesen anderen Anlagenteil "RLT2" erzeugen lässt.

Globale Varablen
Hat in der SAIA-Welt eine andere bedeutung. Ein (FUPLA-) Programm kann jede menge Programmbausteine (Zyklisch abgearbeitete COB, bedingt abgearbeitete PB usw usw usw enthalten, die aber alle auf die gleichen mit "Local" gekennzeichneten Variablen zurückgreifen.
Nur bei Verwendung mehrerer Funktionsplan-Dateien (Heizungsanlage.fup und Lueftung.fup, die am Schluss zu einer Maschinencode-Datei zusammengelinkt werden, müssen globale Variablen definiert werden, die dann in allen .fup mit derselben Bedeutung verwendet werden.
Evtl. ähnlich ist das bei der Erstellung einer Web-Visualisierung, die SAIA-SpiderControl-Lösung setzt überhaupt Globale Variablen ("Public") voraus, alles andere wird beim Build mit "Unresoved EXTERNALs" als Fehler gebrandmarkt. Ein "PDD-Flag" wie bei PC WORX gibt es nicht.

Variablennamen in der Saia-WebVisu
Im Visu-Editor werden dieselben Variablennamen wie im FUPLA-Programm benutzt, die verwendeten sind eh alle Global. Heißt, fpr mein Register "RLT1.Zul.Is.B_TmpAussen0"  (Public) aus dem Fupla heißt der PPO im Visu-Editor für das WEBVISU.prj auch "RLT1.Zul.Is.B_TmpAussen0". Allerdings muss beim SAIA-System vor dem Build des Programms für die SPS noch ein Compilierungsvorgang durchgeführt werden, der eine Datei webserver.wsc erzeugt. Nur mit diesem Vorgang funktioniert der Datenaustausch zwischen der Visu und dem SPS-Programm. Was immer das bedeutet, ich habe mal ein Dateibeispiel angehängt, das auch die o.g. Variable enthält, die ich für meine Tests auch ausprobiert habe.

Ich hatte schon mal bei http://www.sbc-support.ch/faq/item/item.detail.php?it_index=101574&search_for=excel&back_url=%2Ffaq%2Fitem%2Fitem.search.php%3Fcmd%3DSEARCH%26category%3D0%26search_for%3Dexcel%26send_form.x%3D0%26send_form.y%3D0%26sort_order%3D-1%26search_area%3D0%26items_per_page%3D10%26frame%3Dresult%23idx101574 nachgelesen in der Hoffnung, dass mir das neuer Einsichten bringt, leider vergeblich.

Hat jemand schon mal Variablen aus einer SAIA mit SPIDER_ACCESS gelesen? Oder wie können wir mal systematisch ermitteln, wie der Zugriff funktionieren kann?

Viele Grüße

Rainer

[gelöscht durch Administrator]

peewit

#1
hallo

erstelle eine mini test visu seite mit zwei variablen
eine anzeige variable die ständig von der sps gelesen wird und eine variable die du mit einem button 0/1 schalten kannst

dann mach bitte einen wireshark datenmitschnitt und schalte den button mehrmals

dann kan ich erkennen was bei saia anders zu machen ist

schreib mir dann noch die original variablennamen hinzu, und eventuell eine erklärung der struktur

rrbd

Hallo, danke für die schnelle Reaktion, ich kümmere mich schnellstmöglich (morgen). Wenn ich Dich richtig verstanden habe benötigst du eine Saia-Visualisierung mit irgendeinem Wert (ich nehme mal einen Temperaturmesswert) und einen Binärwert, ich denke, ich nehme einen Button, der per Button (mous-down, mouse-up) zwischen Binär-0 und Binär-1 wechselt, das ganze als Wireshark-Mitschnitt.

Hinsichtlich Struktur müsstest Du vielleicht noch mal nachfragen wenn du erste Ergebnisse hast, ich bin im Augenblick nicht sicher, ob ich verstanden habe, was du meinst, aber schau'n wir mal.

Viele Grüße

Rainer

peewit

#3
struktur

ich sehe im wireshark mitschnitt ja nur einen variablennamen mit irgend welchen zusatzzeichen
ich weiss aber nicht was nun der nakte reale sps variablenname ist

was willst du denn überhaupt damit machen ?

alternativ dazu, habe ich ja auch die net_var bausteine geschrieben
mit denen du viel besser daten zwischen zwei steuerungen austauschen kannst


rrbd

> alternativ dazu, habe ich ja auch die net_var bausteine geschrieben

Hallo, ich weiß, setze ich auch ein. Das ist natürlich die effizientere Lösung, aber der Charme der SPIDER_ACCESS-Lösung ist, dass man mal spontan auf einen Wert einer anderen SPS zugreifen kann, ohne dass man das Programm auf der Datenquellen-SPS anfassen muss - was ja auch gar nicht immer möglich ist.

Insbesondere die SAIA-SPS ist aus einer ganz anderen Welt, da ist's nichts mit net_var Baustein 'reinpfriemeln. Und meine Möglichkeiten würde es halt sehr erweitern, wenn ich von einer Phoenix-ILC aus einfachen Zugriff auf jeweils wenige Daten in einer SAIA-SPS hätte.

Zum beiliegenden Wireshark-Protokoll:

Meine Mini-Visu hatte eine Alarmlampe, die auf ein Flag (Bool) mit Symbol-Namen "Druck.SM.StoerK1" mit der Maschinenadresse "F2981" (ausgelesen aus der SPS) reagiert.

Außerdem habe ich 2 Buttons, die ein anderes Flag mit Symbolnamen "Allgemein.Dummy" und der Maschinenadresse "F03067" jeweils per Schreibzugriff in die SPS auf 1 oder 0 setzen.

Dieser Schreibzugriff (aus Sicht der Visu) war leicht im Protokoll zu finden, siehe z.B. Eintrag 53 im Wiresharkprotokoll.

Ich hoffe, die Aufzeichnungen helfen Dir weiter,

Gruß

Rainer

[gelöscht durch Administrator]

peewit

#5
hallo

das bringt einige unklarheiten und schwierigkeiten

bei meinen baustein wir die verbindung ständig auf/abgebaut so wie es bei anderen steuerungen notwendig ist
bei dir bleibt die verbindung bestehen, was ja auch ansich viel besser ist

der datenaustausch wir mittels Transfer-Encoding: chunked durchgeführt, das mein http-get baustein nicht kann
aber es sollte so sein, wenn unser baustein das nicht mit angibt, dann darf die antwort auch kein chunked code enthalten


das schreiben ist ja noch gut nachvollziehbar und konnte auch mit dem baustein direkt funktionieren

GET /cgi-bin/writeVal.exe?PDP,,F03067,B+0 HTTP/1.1


aber beim lesen wird eine art zugriffs/gruppennummer benutzt die ich nicht zuordnen kann
es kann leicht sein, da zu beginn der kommunikation diese gruppe definiert wurde, jedoch fehlt das in der datenaufzeichnung !!

GET /cgi-bin/ReadFile.exe?1411165462 HTTP/1.1

das dürfte sowas ähnliches wie das sein http://host/dir/cgi-bin/OrderValues.exe?Project_+dummy+1000+ppo1+ppo2+ppo3…+ppon

du musst die aufzeichnung vor der visu starten
mach das doch bitte nochmal , dann haben wir zumindest das protokoll dokumentiert !!!!


das problem ist aber das zuviel anders ist, und es keine schnelle lösung gibt/geben kann


rrbd

Zitatdas problem ist aber das zuviel anders ist, und es keine schnelle lösung gibt/geben kann

Hallo, hatte mir schon so etwas gedacht, aber wo dicke Bretter gebohrt werden kann's halt auch schon mal etwas dauern.

Ein weiteres Wiresharkprotokoll, diesmal vor der Visu gestartet und deshalb etwas länger, habe ich beigefügt.

Gruß

Rainer

[gelöscht durch Administrator]

peewit

hallo

kann es sein das du mir eine gefilterte auszeichnung gegeben hast
ich kann nähmlich nur daten in einer richtung erkenn , nähmlich von der Visu zur sps
und umgekehrt sehe ich gar nichts
(wenn das stimmt , wäre halt eine komplette aufzeichnung nicht schlecht)


aber ich habe trotzdem das gesuchte entdeckt

GET /cgi-bin/OrderValues.exe?1415490425+dummy+1000+PDP,,TEXT03019,S+PDP,,F02981,B+PDP,,F03067,B HTTP/1.1

GET /cgi-bin/ReadFile.exe?1415490425 HTTP/1.1



es wird mit ordervalues eine gruppe von varaiblen mit einer nummer definiert
und dann beim lesen wird einfach aufbasis der nummer der block angefordert

dass ist ansich nichts neues, denn das geht auf bei pcworx auch so, wenn man will

muss mir das noch in ruhe ansehen (habe er am montage wieder etwas zeit....)
es sieht nicht ganz so hoffnungslos aus .....


rrbd

Das klingt seeeehr gut!

Mit Wireshark kenne ich mich nicht allzu gut aus.
Der "ip.src == 172.16.202.117" Filter, den ich beim Ansehen drin hatte, sollte dich ja sicher nicht behindert haben (der sollte beim neu Öffnen gar nicht aktiv sein), dass ich nur den VPN-Tunnel als Gateway gewählt hatte dürfte eigentlich nichts unterschlagen. Wenn  du doch noch irgendetwas vermisst müsstest du mir noch mal einen Tipp zu Wireshark-Einstellungen geben, ich wüsste momentan nicht, was ich da ändern sollte. Oder ob das eine Eigenart der Einstellungen bei Saia ist?

Bei Tests helfe ich natürlich gern,

Gruß

Rainer

peewit

#9
ip.src == 172.16.202.117

das ist genau das problem das ich meinte
die ip der quelle und des ziels wechseln wenn es auf ein telegramm eine antwort gibt

mit deinen filter siehst du nur die telegramme die von 172.16.202.117 versendet wurden, alles andere fehlt


tip !!

der mechanismus zum variablen lesen und schreiben ist auf basis http-get realisiert
und genau das kannst du direkt mit dem browser auch machen

host ist die ip-adresse deiner sps
ppoVarName = dein variablen bzw zugriffsyntax   z.B. PDP,,F03067

http://host/dir/cgi-bin/readVal.exe?ppoVarName
http://host/dir/cgi-bin/writeVal.exe?ppoVarName+Value


so könnte das aussehen für schreiben
http://host/dir/cgi-bin/writeVal.exe?PDP,,F03067,B+123

und so könnte das aussehen für lesen
http://host/dir/cgi-bin/readVal.exe?PDP,,F03067

probiere doch mal ein wenig herum ....

rrbd

Hallo peewit,

diese Form des Zugriffs hatte ich vor längerer Zeit schon mal ausprobiert und nun noch mal bestätigt, funktionierte an eine existierenden Anlage mit
<http://172.16.202.117/cgi-bin/readVal.exe?PDP,,R2248,d>, was das Register 2248 ausliest und als dezimale Ganzzahl auswirft.

Der Schreibzugriff <http://172.16.202.117/cgi-bin/writeVal.exe?PDP,,R2244,d+31>, der den Registerinhalt von R2244 von 30 auf 31 änderte, funktionierte auch.

Brauchst du noch irgendetwas von mir?

Gruß

Rainer

peewit

hallo


also wenn das vom browser aus auch so funktioniert dann ist die kleine anpassung vielleicht auch ein schritt nach vorne
dann wird wahrscheinlich der befehl korrekt verschickt, und nur mehr die antwort wird falsch verstanden

aber das könntest du mal als ersten schritt probieren....

Baustein "SPIDER_ACCESS"

CASE state OF

00:
   IF MODE > BYTE#0 AND MODE < BYTE#3 THEN
      MODE_SAVE := MODE; (* Modus speichern *)
      (* wenn kein '.' in Name dann ist es eine globale variable *)
      IF FIND(VAR_NAME,'.') = 0 AND FALSE THEN
         st_tmp := CONCAT('%40GV.',VAR_NAME);
      ELSE
         st_tmp := VAR_NAME;
      END_IF;

      IF MODE_SAVE = BYTE#2 THEN (* 2 = Write *)
         VALUE_LEN := INT_TO_UINT(LEN(VALUE));
         st_tmp := CONCAT(st_tmp,'+');
         st_tmp := CONCAT(st_tmp,VALUE);
         URL_DATA:=STRING_TO_URL(STR:= CONCAT('http://x/dir/cgi-bin/writeVal.exe?',st_tmp),DEFAULT_PROTOCOL:='',DEFAULT_PATH:='');
      ELSE
         URL_DATA:=STRING_TO_URL(STR:= CONCAT('http://x/dir/cgi-bin/readVal.exe?',st_tmp),DEFAULT_PROTOCOL:='',DEFAULT_PATH:='');
      END_IF;

      state := 60;
   END_IF;

rrbd

Hallo peewit,

tut mir Leid dass ich so lange nicht von mir hören ließ, zu viel andere, vordringliche Arbeit! Nun wollte ich mich gerade wieder mit Feuereifer auf dieses Problem stürzen und den von Dir vorgeschlagenen Test durchführen, allerdings tauchte nun ein neues Problem auf, das zunächst geklärt werden muss, bevor ich an dieser Baustelle weiter arbeite, siehe mein neuer Post "SPIDER_ACCESS"!

Gruß,

Rainer

rrbd

So, habe gerade festgestellt, dass meine Saia MODBUS-Library im PG5 Lizenz-geschützt ist und > Lt. Preisliste 1200 EUR Kosten soll. Da kommt Ehrgeiz auf, dann investiere ich lieber hier zeit für einen alternativen Datenaustausch für die Hand-voll Bits, die ich aus der SAIA benötige. Ich setze die Forschung auf Basis der letzten Tipps fort.

Rainer

rrbd

Nun habe ich's endlich geschafft meinen Plan auszuführen. Für einen Test bei einem Kunden habe ich mir den SPIDER_ACCESS aus der Lib heraus kopiert und um Problemen aus dem Weg zu gehen einfach die Zeile 21 ersetzt durch
STRING_TO_URL.STR:= CONCAT('http://192.4.0.190/cgi-bin/readVal.exe?PDP,,R100,d','');.
Damit schreibt mir der SPIDER_ACCESS_SAIA den Inhalt des Registers 100 (statisches Register) aus der SAIA SPS als Dezimalzahl in VAR_NAME.
Damit ist mein Problem schon gelöst, ich werde mir zunächst einen SPIDER_ACCESS_MEINER basteln, bei dem ich einfach den kompletten cgi-Zugrifsstring direkt von außerhalb des Bausteins vorgebe. Die Verwendung fester Adressen für Datenaustausch ist in der SAIA-Welt ein beliebtes Verfahren, da das Proprietäre SAIA-S-NET sehr einfach auf feste Adressen in anderen SPS zugreifen kann.

Wenn hier Interesse besteht, einen "aufgebohrten" SPIDER_ACCESS zu erstellen, der auch Zugriff auf exotische Spidercontrol-Anwendungen ermöglicht, bin ich natürlich gern bei der Forschung behilflich, könnte mal sehen, wie man das für Symbolische Variablennamen handhaben muss, usw.

Gruß

Rainer