UC mit Parameterübergabe

EyeQ

Level-1
Beiträge
140
Reaktionspunkte
13
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich hab mal wieder ein Problemchen. Ich muss eine Modbus Kommunikation programmieren. Habe alles am Laufen, nur eine Kleinigkeit bereitet mir Kopfschmerzen. Ich habe die ganzen Modbusbausteine geladen. Der ModbusPN FB benutzt intern den FC10 (EQ_String). Ich habe den Baustein mal geöffnet (weiss auch nciht, auf mal war das Schloss weg :) ) und nach dem Aufruf gesucht. 2 Mal wird er aufgerufen:

Code:
     UC    FC    10
            P#L 42.0
            P#L 48.0
            P#L 40.2

Eigentlich kann man ja mit UC keine Parameter übergeben. Die Erstellsprache des Bausteins ist SCL. Er wird aber in AWL geöffnet obwohl ich den SCL Editor auch habe. Das Problem an der Stelle ist, dass ich den Baustein (FC10) mit einer anderen Nummer aufrufen will, da die Nummer in meinem Programm schon vergeben ist. Das kann ich zwar ändern, ist aber mit viel Aufwand verbunden und das Programm wird nachhaltig nicht mehr updatebar sein :(. Wenn ich nun aber den Aufruf ändere, bekomme ich die Parameter nicht mehr dran. Ich möchte so wenig wie möglich an dem Baustein ändern, da er nicht grad verständlich angezeigt wird und ich das Risiko einen Fehler einzubauen gering halten möchte.
Hat da jemand ne Idee, das einfach zu lösen? Oder komme ich nicht drum herum, mir Temp. Variablen anzulegen, um den Aufruf per Call zu machen? Also die Daten an den Pointer Adressen direkt zu laden.

Btw. dies ist der FB102 für Modbus Kommunikation über die interne PN Schnittstelle. Später soll es über eine CP gemacht werden um die Netze zu trennen. Weiß jemand ob dort der FC 10 vielleicht nicht benutzt wird? Habe den FB gerade leider nicht parat.

Danke wie immer schon im Vorraus.
 
Ok ich habe nun herausgefunden, dass das mit einem CP ganz anders programmiert wird und dort auch nicht der FC 10 verwendet wird. Somit habe ich ansich kein Problem mehr vorrausgesetzt, der Kunde ist bereit sich einen CP zu kaufen.

Ich habe ein Demo Projekt von Siemens, generell funktioniert es anscheinend auch dauerhaft, wenn ich das richtig verstanden habe. Allerdings muss der Baustein offiziell lizensiert werden, sprich eine Lizenz von Siemens gekauft werden.

Dennoch interessiert es mich, wie das mit dem UC und den Parametern zu Stande kommt. Liegt es daran, dass es in SCL programmiert wurde und nach AWL übersetzt wurde? Hatte da neulich schon mal etwas ähnliches mit einer S5 Konvertierung und alternativen Programmeditoren. Ich kann weder eine andere FC Nummer angeben und die Parameter dann übergeben, da diese einfach verschwinden. Noch kann ich die Parameter verändern. Wenn ich versuche den Parameter zu verändern, steht nach verlassen der Zeile wieder der alte Text da. Der Baustein lässt sich auch speichern und der Compiler meldet keine Fehler. Ob ich ihn auch laden kann, kann ich grad leider nicht testen.

Gruß.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ganze ist sog. MC7-Code, das sieht nur auf den ersten Blick wie AWL aus,
tatsächlich ist das aber nochmal eine Stufe Hardwarenäher als AWL.

Letzten Endes wird jeder Bausteinaufruf so übersetzt, aber das ist im Regelfall natürlich für dich als Anwender nicht sichtbar,
MC7-Code kann mit Step7 Boardmitteln auch nicht editiert werden.

Mfg
Manuel
 
Danke. Ich musste feststellen, daß die Bausteine für die Kommunikation über cp andere Bausteine benutzt, die ebenfalls schon vergeben sind (ag_send und ag_recv). Mit der umverdrahten Funktion von step7 kann man anscheinend diese Baustein Nummern ändern. Auch in geschützten Bausteinen. Mal sehen ob das geklappt hat :)

Gibt es ne Möglichkeit den code zu editieren? Oder ist das nur siemens vorbehalten? Reine Neugier.

Gesendet von meinem GT-I9100 mit Tapatalk 2
 
Um das zu ändern müsstest du das ursprüngliche Call-Makro wiederherstellen.
Bei Funktionen erfolgt die Parameterübergabe immer per Pointer. In deinem Beispiel befindet sich ab Adresse P#L 42.0 ein 6 Byte großer Pointer. Wie groß der Pointer ist hängt vom Datentyp des Parameters ab. Bei elementaren Datentypen <=4 Byte liegt an der Adresse direkt der Wert des Parameters.

Die etwas seltsam anmutenden Zeilen mit P#x.y bei denen eigentlich nur ein Operand vorhanden ist und die Operation fehlt, habe ich mir so erklärt, dass es ähnlich der Parameterübergabe ist wie man das von C oder Pascal-Programmen her kennt. Dort werden je nach Aufrufkonvention die Funktionsparameter auf den Stack gepusht. Ich denke mit vor den P#x.y immer ein 'push' dazu. Zumindest würde ich es so in der Art umsetzen wenn ich einen MC7 Interpreter programmieren müsste ;-)

Wenn du die Aufrufe also wirklich abändern willst, musst du auch noch den Bereich vor dem UC und auch nach dem letzten P#x.y beachten. Ist zwar nicht unmöglich das zu machen, aber man muss schon genau hinschauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab grad' noch einen Thread zu dem Thema gefunden in dem einige Informationen stehen:
http://www.sps-forum.de/showthread.php/23886-Zuweisung-von-werten-auf-Out-Variablen

Wäre ja interessant zu wissen wo die Zeiger auf die Funktionsparameter abgelegt werden. Der Editor zeigt unter bestimmten Bedingungen im Info-Feld bei einem Funktionsparameter den Text "BLOCK_SDB" an, also ein Systemdatenbaustein.
 
Danke werde da mal stöbern. Allerdings meinte ich, ob es da einen frei zugänglichen mc7 Editor gibt.

Gesendet von meinem GT-I9100 mit Tapatalk 2
 
Danke werde da mal stöbern. Allerdings meinte ich, ob es da einen frei zugänglichen mc7 Editor gibt.

Den Baustein in ein separates Projekt kopieren, dann mit einem Hexeditor die subblk.dbt öffnen und nach 0x3d 0x0a suchen, und 0x0a durch gewünschte Nummer ersetzen ;-)

Nein, das einzige was es in der Richtung gibt ist die Toolbox von Jochen Kühner. Aber direkt den MC7 bearbeiten kannst du damit auch nicht, und für den Einsatz an Kundenbausteinen ist das vom Jochen sicher (noch) nicht freigegeben.
Ich würde da auch nicht mit dem Hexeditor dran rumfummeln. Für Informations- und Testzwecke OK, aber ich weiß nicht was passiert wenn du einen so modifizierten Baustein dann in eine reale SPS schiebst. Denn spätestens beim Übertragen wird eine Bausteinprüfsumme gebildet, und ich habe keine Ahnung ob diese dann noch korrekt berechnet wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Den Baustein in ein separates Projekt kopieren, dann mit einem Hexeditor die subblk.dbt öffnen und nach 0x3d 0x0a suchen, und 0x0a durch gewünschte Nummer ersetzen ;-)

Nein, das einzige was es in der Richtung gibt ist die Toolbox von Jochen Kühner. Aber direkt den MC7 bearbeiten kannst du damit auch nicht, und für den Einsatz an Kundenbausteinen ist das vom Jochen sicher (noch) nicht freigegeben.
Ich würde da auch nicht mit dem Hexeditor dran rumfummeln. Für Informations- und Testzwecke OK, aber ich weiß nicht was passiert wenn du einen so modifizierten Baustein dann in eine reale SPS schiebst. Denn spätestens beim Übertragen wird eine Bausteinprüfsumme gebildet, und ich habe keine Ahnung ob diese dann noch korrekt berechnet wird.

Wie Zottel schreibt ist das wandeln von AWL zurück zu MC7 leider noch nicht implementiert (nur rudimentär von 2 Byte Befehlen ohne Parameter!). Aber im Moment arbeitet da wohl einer in der Richtung an meiner Lib (http://siemensplctoolboxlib.codeplex.com/discussions/354898).

Aber eigendlich stimmt die Wandlung vom Step7 Editor da nicht, es dürft da nicht P#L x.x stehen, sonder P#V x.x da auf die Vorgängerlokaldaten verwiesen wird. (Ok, in dem aufrufenden Baustein sind es die aktuellen, aber Zeiger ist auf die Vorgänger!)
 
Wie siehts denn mit der Bausteinprüfsumme aus, weißt du wie die gebildet wird?
Mit dem Step7 Editor kann man diese ja nicht mehr erzeugen lassen, da nicht mehr abspeicherbar.
 
Wie siehts denn mit der Bausteinprüfsumme aus, weißt du wie die gebildet wird?
Mit dem Step7 Editor kann man diese ja nicht mehr erzeugen lassen, da nicht mehr abspeicherbar.

Damit hab Ich mich noch gar nicht befasst... Wird ja auch erst interessant, wenn mal AWL zu MC7 realisiert ist...
Aber das lässt sich dann bestimmt herausfinden...
 
Zurück
Oben