FC38 und der Any....

mav

Level-1
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen, ich verzweifle langsam....
Folgendes Problem
Ich habe ein Programmabschnitt in dem mittels des FC38
aus einem String eine Integer gewandelt wird.
Der String liegt in einem DB als Typ String und alles klappt prima.

Problem:
Ich möchte diese Funktion in einem anderen Programm verwendet,
habe also den FC38 eingefügt mir einen DB generiert und möchte nun
den FC mit diesem DB verbinden.
Da fängt mein Problem an
Ich habe am Eingan s des FC38 den Aktualwert als Symbol eingegen
nur leider funktioniert das beim Simulieren nicht.

Beim Vergleich mit dem alten Programm fällt mit auf das der Eingangsparameter am FC38 eine Any ist.
Wie gebe ich den sowas ein?? und warum ein Any
Habe auch versucht den Any einfach mal zu kopieren geht auch nicht
Sowie diesen so zu schreiben.
Im DB alt sowie neu sind identisch aufgebaut

call FC38
s : P#DB1.dbx4.0 Byte 6
RET_VAL :=MW10

Bitte was verstehe ich da nicht
 
Hier die Hilfe zum FC38:

FC 38 STRNG_I

Beschreibung

Die Funktion FC 38 wandelt eine Zeichenkette in eine Variable im INT*Format. Das erste Zeichen in der Zeichenkette darf ein Vorzeichen oder eine Ziffer sein, die dann folgenden Zeichen müssen aus Ziffern bestehen. Ist die Länge der Zeichenkette Null oder größer als 6 oder befinden sich unerlaubte Zeichen in der Zeichenkette, findet keine Wandlung statt und das BIE*Bit wird auf "0" gesetzt. Liegt das Ergebnis der Wandlung außerhalb des INT-Zahlenbereichs, wird das Ergebnis auf den entsprechenden Wert begrenzt und das Binärergebnis BIE auf "0" gesetzt.



Parameter Deklaration Datentyp Speicherbereich Beschreibung
S INPUT STRING D, L Eingangszeichenkette
RET_VAL OUTPUT INT E, A, M, D, L Ergebnis


Der Eingangsparameter kann nur mit einer symbolisch definierten Variable belegt werden.

Warum das so ist, weiß nur Siemens, aber du mußt einen symbolischen Parameter anlegen. Dazu muß dein DB unbedingt auch in der Symbolik ein Symbol erhalten, welches du dann am FC verwendest. Auch der Name der Variablen im DB gehört ja dann mit zu Symbolik. Hinter einem String verbirgt sich beim FC38 wohl nichts anderes als ein Typ ANY.
 
Öhm, das ist zur Abwechslung mal IEC 61131-3-konform und der FC38 stammt ja aus der IEC-Bibliothek.

Meinst du wirklich, das es wegen der IEC-Konformität nicht geht, an den FC38 einen nicht symbolischen Parameter anzupappen? :confused: Das wär ja das erste mal, daß Siemens sich darum schert und dann auch noch als Einschränkung? Vermutest du das oder weißt du das genau?
 
Jep.
Die Bausteine der IEC-Bibliothek sind ja Funktionen nach besagter Norm; damit Siemens zumindest eine Zertifizierung nach IEC 61131-3 bekommt.

Das mit den Bausteinen, steht in anhängendem pdf nicht explizit. Irgendwo habe ich davon aber gelesen. Wenn ich's finde, stell ich's hier rein.
 

Anhänge

  • II_IEC61131.pdf
    711,8 KB · Aufrufe: 66
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich Danke Euch, so funktioniert es auch.
Als nächstes hatte ich das Problem einen Bereich aus einem
String auszulesen.
Der FC 26 klappt hierfür hervoragend, wenn man nur darauf kommt
im einzulesenden DB, in dem 2 Byte, die Stringlände anzugeben.
Selbst bei der Hotline von Siemens konnten sie mir das nicht sagen.
Woher weiß man sowas oder was muß man lesen um dieses Wissen zu erhalten...?
 
Ich Danke Euch, so funktioniert es auch.
Als nächstes hatte ich das Problem einen Bereich aus einem
String auszulesen.
Der FC 26 klappt hierfür hervoragend, wenn man nur darauf kommt
im einzulesenden DB, in dem 2 Byte, die Stringlände anzugeben.
Selbst bei der Hotline von Siemens konnten sie mir das nicht sagen.
Woher weiß man sowas oder was muß man lesen um dieses Wissen zu erhalten...?

Hier im Forum, wird bei Fragen zu Strings und deren Manipulation mit Step7 immer wieder darauf hingewiesen. Woher man das weiß? Keine Ahnung, gerade dazu ist das wie die Frage, wer zuerst da war, die Henne oder das Ei, ich weiß es einfach nicht mehr?

...

Ah, ich hab noch was gefunden. Wenn du mal die Hilfe zum FC26 in Step7 ansiehst, dann kannst du dort bei IN bei Datentyp auf String klicken.
Da steht dann:

STRING

Wenn Sie diesem Formalparameter einen Aktualparameter zuweisen, den Sie im Lokaldatenbereich des aufrufenden Bausteins definiert haben, so beachten Sie bitte:
Vor dem FC-Aufruf müssen Sie in der temporären Variable vom Datentyp STRING das Verwaltungsbyte "maximale Länge des Strings" mit der definierten Stringlänge beschreiben.

Das ist schon mal die eine Hälfte, oder es reicht vielleicht sogar. Ich trage immer die tatsächliche Länge auch noch ein.
 
F1: Format des Datentyps STRING
F1: Hilfe zum FC26

Strings haben vor dem eigentlichen Inhalt 2 Bytes vorangestellt, das 1. Byte gibt die max. und das 2. Byte gibt die tatsächliche (aktuelle) Länge des Strings an.
In der Hilfe zum FC26 steht drin, dass die aktuelle Länge ausgewertet wird und ggfs. ein Leerstring zurückgeliefert wird.
Sowas sollte eigentlich auch eine Hotline wissen.

Zum Thema STRING wirst du sicher hier im Forum auch so einiges finden.

Grüße von HaDi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier die Hilfe zum FC38:


Der Eingangsparameter kann nur mit einer symbolisch definierten Variable belegt werden.


Warum das so ist, weiß nur Siemens, aber du mußt einen symbolischen Parameter anlegen. Dazu muß dein DB unbedingt auch in der Symbolik ein Symbol erhalten, welches du dann am FC verwendest. Auch der Name der Variablen im DB gehört ja dann mit zu Symbolik. Hinter einem String verbirgt sich beim FC38 wohl nichts anderes als ein Typ ANY.

was so nicht ganz stimmt weil mit einem selbstgebastelten any pointer ist sehr viel möglich in ner s7. so auch die dynamisierung von stringbearbeitung oder das dynamisierte übergeben ganzer datenfelder in einen fc. man muss nur wissen wie die kiste arbeitet und wie man den miesen compiler durch guten code compensiert. dazu muss man aber ziemlich genau wissen was der any pointer ist wie er arbeitet und das eigentlich eh fast alles ein pointer ist. nur sieht mans halt nicht sofort. ein fc eingangsparameter is auch nix anderes als ein anypointer. nur muss man sich nicht darum kümmern. wenn mans doch tut kann man einige ekelhafte limitierungen aber elegant umgehen
 
was so nicht ganz stimmt weil mit einem selbstgebastelten any pointer ist sehr viel möglich in ner s7. so auch die dynamisierung von stringbearbeitung oder das dynamisierte übergeben ganzer datenfelder in einen fc. man muss nur wissen wie die kiste arbeitet und wie man den miesen compiler durch guten code compensiert. dazu muss man aber ziemlich genau wissen was der any pointer ist wie er arbeitet und das eigentlich eh fast alles ein pointer ist. nur sieht mans halt nicht sofort. ein fc eingangsparameter is auch nix anderes als ein anypointer. nur muss man sich nicht darum kümmern. wenn mans doch tut kann man einige ekelhafte limitierungen aber elegant umgehen

Prima. Und nun läßt du bitte alle an deinem Wissen teilhaben und postest hier, wie man umgehen kann, daß symbolisch parametriert werden muß!

PS: Es ging um FC38 und nicht um irgendeinen selbst geschriebenen FC. Im FAQ des Forums ist ja schön erklärt, wie das mit Any funktioniert, aber ich hoffe, du kannst nun neue Erkenntnisse beisteuern.
 
Zuletzt bearbeitet:
Hallo, wollte auch noch meinen Senf dazu geben:

Der Parameter S, des FC38 ist als String[256] deklariert und ist damit kein Anypointer.
Es scheint ein DB-Zeiger zu sein, dieser ist 6 Byte lang und enthält die DB-Nummer (16Bit) plus Bereichszeiger (32Bit).
Daher kann beim Aufruf des FC38 ein Anypointer nicht funktionieren.

Der aufrufende Code z.B. im OB1 sieht wie fogt aus:

CALL "STRNG_I"
S :=DB1.S1 // dekl: DBX 4.0 S1 String[4]
RET_VAL:=MW10

Nackter MC7 Code, der Call ist eine Art Makro:

Call
BLD 1
= L 20.0
L 1 // hier wird die DB-Nummer geladen
T LW 21 // und in LW21 abgelegt
L P#DBX 4.0 // DBX4.0 als Bereichszeiger laden
T LD 23 // und in LD 23 ablegen
UC FC 38 // UC FC38, danach folgt Param-Liste
P#L 21.0 // Adr des Param S1, DB-Zeiger
P#M 10.0 // Adr. des Retval
BLD 2
End Call


Bei der Übergabe eines Anypointers würden 10 Byte übergeben, bei diesem DB-Zeiger werden nur 6 Byte übergeben.

mfG. Klaly
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, wollte auch noch meinen Senf dazu geben:

Der Parameter S, des FC38 ist als String[256] deklariert und ist damit kein Anypointer.
Es scheint ein DB-Zeiger zu sein, dieser ist 6 Byte lang und enthält die DB-Nummer (16Bit) plus Bereichszeiger (32Bit).
Daher kann beim Aufruf des FC38 ein Anypointer nicht funktionieren.

Der aufrufende Code z.B. im OB1 sieht wie fogt aus:

CALL "STRNG_I"
S :=DB1.S1 // dekl: DBX 4.0 S1 String[4]
RET_VAL:=MW10

Nackter MC7 Code, der Call ist eine Art Makro:

Call
BLD 1
= L 20.0
L 1 // hier wird die DB-Nummer geladen
T LW 21 // und in LW21 abgelegt
L P#DBX 4.0 // DBX4.0 als Bereichszeiger laden
T LD 23 // und in LD 23 ablegen
UC FC 38 // UC FC38, danach folgt Param-Liste
P#L 21.0 // Adr des Param S1, DB-Zeiger
P#M 10.0 // Adr. des Retval
BLD 2
End Call


Bei der Übergabe eines Anypointers würden 10 Byte übergeben, bei diesem DB-Zeiger werden nur 6 Byte übergeben.

mfG. Klaly

Das würde mir einleuchten.
 
hm evtl hab ich da zu schnell geschossen. da im hintergrund aber eigentlich so gut wie alles ein zeiger is kann man da evtl was hacken. ich hab nur grad keine zeit mir das genauer anzusehen. jetzt wo ich aber darüber nachdenke fällt mir wieder ein das ich evtl deshalb meine eigenen asci to was anderes bausteine habe. ich meld mich später noch mal zu der sache. evtl auch erst morgen oder im lauf der woche. jetzt möcht ichs nähmlich auch genau wissen. kann ja gut sein das ich in dem fall scheiß verzapft habe. aber es gibt meist einen weg. auch wenn er selten in kop/fup darstelbar is ;-) hab mir den fc nicht angesehen und daher auch nicht bemerkt das da eine string variable erwartet wird. zur not muss man halt mit einigen copy funktionen einen dynamischen string erzeugen. das geht auf alle fälle.

wie gesagt ich bleib drann und poste dann was ich rausfinde.

eine frage noch. wie kommt man an den nackten mc7 code ran? hab das noch nie gebraucht aber schaut interresant aus.
 
Hallo hpl,

> eine frage noch. wie kommt man an den nackten mc7 code ran? hab das noch nie gebraucht aber schaut interresant aus.

Simatic Manager, Datei, "Memory Card Datei", neu.
Irgend einen Dateinamen xyz.wld angeben.
Nun öffnet sich ein Fenster, dort kopierst du den Baustein deines Interesses hinein.

Wenn du diesen Baustein nun öffnest, dann kann der Editor die CALL Referenzen nicht auflösen und zeigt dir diese "CALL Makros" in fast reinem AWL an.

Die Datei xyz.wld enthält übrigens den Baustein in reiner binärer Form, mit Header, Parametern, Bausteinrumpf und trailer.

mfG. klaly
 
Zurück
Oben