String in OP der C7-613

Matthias_aus_AT

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an Alle,

als unregistered habe ich schon so manches Problem mithilfe des Forums lösen können, vielen Dank - zum jetzigen gibt es jedoch noch keinen Beitrag.

Also:
Ich möchte auf dem OP an der C7-613 ein Bild anzeigen in dem sich die Texte aus dem Programm heraus verändern lassen.
Mittels der SFC20 (Block-Move) schreibe ich direkt in den Config-DB (bei mir DB101), leider verändert sich die Anzeige nicht, es wird kein String angezeigt.

So habe ich es gemacht

Aufruf in OB 1

U M 70.1
SPBN SP01
call FB 5, DB 5 (Angelegter FB mit In/ OUT deklaration als String[20]
inString:="Schnittstelle_OP".STRG_Schritt_0"
outString:="SCREEN_1_Lang_1".SCREEN[0].PIC_STATIC[3] (Bild 0, 3. Zeile)
SP01: NOP 0

der FB 5
Deklaration:
IN --> inString als String[20]
Out --> outString als String[20]

call SFC20
SRCBLK:=#inString
RET_VAL:=MW252
DSTBLK:=#outString

So ist es in Ansetzen (zumindest was das Beschreiben des angelegten SCREEN-DB angeht) in Handbuch der C7-613 beschrieben.

Kann irgend jemand helfen, hab mit der Suchfunktion leider keinen Erfolg gehabt. Außerdem ist ist mit dem Beobachten der Strings ja auch etwas schwierig.

Mfg Matthias
 
Dein Programm sieht für mich erst mal o.K. aus, das sollte so funktionieren und lässt sich ja auch, wenngleich umständlich, beobachten.
Haben denn die Strings, die du kopierst, korrekte Kennungen in den ersten beiden Bytes (1. Byte : max. Länge, 2. Byte: aktuelle Länge des strings) ?
Es darf auch m.W. nirgendwo im String eine 00H drinstehen, das wird als Endekennung interpretiert.

Grüße von HaDi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Haben denn die Strings, die du kopierst, korrekte Kennungen in den ersten beiden Bytes (1. Byte : max. Länge, 2. Byte: aktuelle Länge des strings) ?
*ACK*
Ich halte das auch für den Fehler - der String ist nicht initialisiert - das ist dem Blockmove wahrscheinlich egal ...
 
String initialisieren

Hallo euch beiden,

erst mal danke das Ihr euch die Zeit für mein Problem nehmt.

Also, meine Vermutung war, das ich an irgendeiner Stelle im Prog. mittels der mitgelieferten HMI- Bausteine noch irgendetwas anschieben muss.

Wenn es an der String- Initialisierung liegt habe ich jedoch einen Black-Out.
Was meint ihr damit ?!
Ich habe in einem Datenbaustein mehrere Texte mit STRING[20]- Typ eingegeben. Der (variable) Text ist natürlich nicht immer gleich lang.
Diesen Text schiebe ich dann mit "Block- Move" in den DB den das HMI auswertet.
An welcher Stelle müsste ich jetzt wie eine Initialisierung durchführen.

Vielleicht gibt es auch ein Grundproblem in dem OP ?!
Weshalb ?!
Ich habe Bilder angelegt, auch mit Variablen, alles i.O.
Die Infotexte jedoch zeigt er mir nicht an, hier kommen immer wieder die aus dem Bibliotheksprogramm (hatte ich zum Testen drauf)
Inzwischen habe ich diese Texte im Programm alle entfern und gegen neue ersetzt, nach neuem Laden der DB's und Neustart des OP sind die alten Texte wieder da.
(alle anderen Änderungen werden jedoch übernommen)

Aber gerne erst mal das Hauptproblem mit den variablen Texten.

Mfg Matthias
 
Hallo Matthias,
ein String besteht nicht nur aus dem von dir hineingeschriebenen Nutz-Inhalt, sondern auch noch aus einer Deklaration der Gesamt-Länge und der beinhalteten Zeichen.

Wenn du dir deine STRING[20] in deinem DB anschaust, so wirst du sehen, dass der String in Wirklichkeit immer 22 Byte Platz in Anspruch nimmt. Hierbei sind die 2 Byte mehr die Kopfdaten desselben. Der Kopf des Strings ist immer gleich aufgebaut (bei Siemens) : 1.Byte die max. Länge des Strings (in deinem Fall muß es dann 20 beinhalten) und 2.Byte die tatsächlich benutzte Länge davon (hier kann max. auch 20 stehen oder eben entsprechend das, was du von dem String benutzt).
Wenn du nur einen Text in den String schreibst, ist dadurch nicht automatisch der String initialisiert (also der Kopf deklariert - sondern es steht hier immer noch in beiden Bytes "0" drin). Die Visu greift aber diese Kopfdaten auf und "agiert" entsprechend.

Diesen Text schiebe ich dann mit "Block- Move" in den DB den das HMI auswertet.
An welcher Stelle müsste ich jetzt wie eine Initialisierung durchführen.
Unmittelbar nach dem Block-Move ...
Von woher holt der Block-Move seine Ursprungsdaten ?
Hast du sie fest in einem DB hinterlegt ? Wenn ja, dann kannst du die Initialisierung auch dort schon machen - dann nimmt Block-Move sie auch gleich mit ...

Ich hoffe, damit kommst du erstmal weiter ...

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
String übertragen - initialisieren

Hallo Larry,

ich habe in einem DB mehrere Texte - alle STRING[29] aber mit unterschiedlicher, tatsächlicher Länge.
Wenn ich diese Texte - testweise - einfach in einen anderen DB übertrage kann ich das Ergebniss nach Block- Move byteweise in der VAT prüfen - es ist alles i.O.
Der DB des OP, wo die Anzeigedaten liegen, ist etwas anders aufgebaut.
Hier muss ich mit der symbolischen Adressierung (siehe 1. Beitrag) arbeiten.
Lt. Handbuch sind diese DB's aber auch auf STRING[20] initialisiert/ eingestellt.
Könnte noch eine weitere Initialisierung notwendig sein ?!

Gruß Matthias
 
Hallo Matthias,
ich versuche es noch einmal :
Beispiel STRING[20] zugewiesen in DB20.DBB0 und folgende ...
Hier wäre dann DBB0 die max. Länge des Strings - hier sollte manuell b#16#14 entspricht dezimal 20 zugewiesen sein.
DBB1 ist die benutzte Länge. Steht hier "0" drin, dann ist es egal, was in DBB2 ff. drin steht - es wird ggf. ignoriert ...
DBB2 - 21 : hier steht dein String-Inhalt - z.B. "Hallo Welt !". Dieser Nutzstring ist 12 Zeichen lang - entsprechend solte dann in DBB1 der Wert 12 - bzw. b#16#0C drinstehen.

Ist das bei dir dann auch so ?
Das ist jedenfalls das, was ich dir in meinen Beiträgen (bzw. auch HaDi dir) vermitteln wollte ...

Gruß
LL
 
Es ist immer schwierig, noch etwas Sinnvolles beizutragen, wenn Larry bereits geantwortet hat ;) .

Ergänzend vielleicht noch folgende Anmerkungen:
-Such mal in der Step7-Hilfe nach "Format des Datentyps STRING"
-der Blockmove kopiert auch den Kopf mit und es ist ihm völlig egal, was da drin steht
-Die Kennung sollte bei dir daher natürlich schon im Quell-DB ("Schnittstelle_OP") richtig drinstehen
-Wenn du die Texte als Aktualwerte mit dem Bausteineditor eingibst, wird auch die Länge passend eingetragen

Grüße von HaDi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ggf. muss das Problem woanders sein

Hallo Ihr Zwei,

das Problem muss wohl etwas tiefer legen, aber vielleicht nochmals vereinfacht was ich vorhabe.
Auf meinem in der C7-613 integrierten OP möchte ich (zum Beispiel) im Bild 1 neben Prozesswerten die Texte:
"Handbetrieb"
"Automatik"
"Anlage Aus"
anzeigen.
Dazu habe ich einen DB "TEXTE" mit den 3 Einträgen:
Text_1 STRING[20] 'Handbetrieb'
Text_2 STRING[20] 'Automatik'
Text_3 STRING[20] 'Anlage Aus'

Je nach aktueller Betriebsart sage ich jetzt:
call SFC 20
SRCBLK:="TEXTE".Text_1
RET_VAL:=MW100
DSTBLK:="SCREEN_1_Lang_1".SCREEN[1].PIC_STATIC[1]

nun erwarte ich eigentlich das sich die 1. Zeile des OP mit "Handbetrieb" schmückt - was leider nicht geht.
Ich denke die Initialisierung der Strings in dem DB funktioniert tadellos.
Testweise habe ich die Texte von meinem eigentlichen DB mit SFC in einen anderen von mir angelegten verschoben.
Sowohl im Ausgangs- DB als auch in meinem Test DB wurden die Maxlänge und tatsächliche Länge richtig erkannt. (Zumindest wr die so bei Byteweiser Auslesung in der VAT zu erkennen)

Nun verändere ich das "Schiebeziel" in der SFC 20 und nichts geht.
Erschwerend kommt hinzu das ich das Ziel (DB für Screen's) auch byteweise nicht in der VAT ansehen kann.

Ich habe versucht das RET_VAL zu analysieren, aber zum HEX-Wert: W#16#833A konnte ich nicht's finden.

Habt Ihr diese Vorgehensweise an der C7 schon mal mit Erfolg ausgeführt/ genutzt. Meine Befürchtung: vielleicht geht das gar nicht.

Ich hoffe ich nerve nicht und kann ggf. noch heute einen Erfolg verbuchen (IB am Dienstag nächster Woche)

Gruß MMM
 
Ergänzung

Hallo nochmal,

muss ergänzen, das einzig die Erkenntniss: geht nicht - vor Ort entstanden ist, die Test's und Fehlermeldungen habe ich mit PLCSIM erhalten.
Ob dies hiermit 1:1 nachgestllt werden kann weiss ich immo nicht.

Gruß MMM
 
Also, ich hab mal im Handbuch geblättert und weiß jetzt immerhin, dass das C7-613 doch erheblich anders ist als andere C7-Geräte, die ich kenne.
Wenn ich es richtig verstehe ist das Problem, dass du in den Screen-DB schreibst und das Geschriebene nicht zur Anzeige kommt.
Nachdem ich das Handbuch mal durchgeblättert habe denke ich das kann so auch nicht gehen.
Wenn ich es richtig verstanden habe, wird der Screen-DB aus dem Ladespeicher in den OP-Bereich übertragen.
Du müsstest also nach Überschreiben der statischen Texte den DB in den OP-Bereich übertragen, was sicher nicht automatisch geht.
Zur Lösung deines Problems hätte ich 2 Vorschläge:
1. Du machst per Steuerungsauftrag eine Bildumschaltung auf dasjenige Bild, welches den entsprechenden Text enthält, oder besser
2. Du legst im Screen-DB ein Ausgabefeld an (Kapitel C2, Adresse 140 ff.), damit definierst du einen Speicherbereich in der S7 aus dem das OP den Text holt und in diesen Speicherbereich kannst du dann deine Text reinkopieren.

Grüße von HaDi
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ausgabefeld

Hall HADI,

also das mit dem Ausgabefeld ist nicht so einfach.
Die Programmierung erfolgt indem man auf einen der DB's doppelklickt.
Es öffnet sich ein Parametrierfenster.
Nun eine Ausgabevariable einfügen - das geht allerding kein String, kediglich CHAR. Da ich aber maximal 8 Stück je bild anlegen kann reicht die Länge für meine Texte nicht aus.
Ich weiß nicht wer diese C7 bestellt hat - mit dem guten alten OP7 wäre ich längst in den Ferien - die habe ich nämlich um eine Woche verkürzen müssen da ich nicht fertig bin. *gg*
Habe ich deine Ausführungen richtig verstanden oder gibts noch Erlärungsbedarf ?!

MFG MMM
 
Was spricht gegen ein Ausgabefeld der Länge 20 vom Typ Char ?

Grüße von HaDi

[edit]
Ich sehe gerade, die max. Länge ist wohl 15 (Fhex), würd aber doch reichen.
[/edit]
 
Zuletzt bearbeitet:
Mhhh

Meinst du das geht ???

Einfach Typ Char, Feldlänge 15 und bei Adresse den Start zB. DB19, Byte 10 eingeben ?
Muss ich dann im DB für jeden Buchstaben einen einzelnen CHAR anlegen oder den String (mit 2Byte versatz ansprechen da 1. und 2. Byte ja die besprochenen Initialwerte sind.
Bitte noch kurz um deine Antwort, danach gebe ich Ruhe bis ich morgen getestet habe.

Gruß Matthias
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich denke, das müsste so gehen (Feldlänge: 15, Typ: Ausgabefeld, Darstellungsformat: ASCII, Speicherbereich: Datenbaustein...).
Die Texte im Datenbaustein würd ich trotzdem als STRING anlegen und dann, wie du richtig vermutest, das Ausgabefeld im OP auf das 3. Byte schauen lassen.

Grüße von HaDi
 
Rückmeldung zum Thema

Also,

erstmal vielen Dank für die Antworten.
Abschließend muss ich feststellen:
Mittel überschreiben des DB kann man die statischen Texte nicht ändern, zumindest wie von mir vorgesehen ohne das Paneel neu parametrieren7 Anwendung laden zu lassen.
Zu dem letzten Thread von HaDi:
Eine anzeige eines längeren Char funktionierte bei mir nicht. Man muss wirklich für jeden Buchstaben im DB ein Char anlegen und in der OP- Programmierung für jeden Buchstaben eine Variable verschwenden (max 8 Stück/ Bild möglich)

Wenn noch jemand einen Hinweis hat werde ich diesen gerne "live" testen.
Für meine Anlage muss ich jetzt wohl doch mit umschalten der Bilder arbeiten.

Nochmals, vielen Dank und Gruß MMM
 
Hallo Matthias,
ich habe mir (angeregt durch die Beiträge von HaDi) jetzt auch erstmal das Ding, von dem du da immer sprachst angesehen - hätte man vielleicht eher machen sollen ...:rolleyes:.
Ich bin bei meinen Beiträgen natürlich auch immer davon ausgegangen, dass es sich hier um eine Panel handelt, dass sich mit Flex oder ProTool programmieren läßt. Dem ist wohl nicht so ...

Ich fürchte an Hand der Beschreibung, die ich kurz überflogen habe, hast du wohl keine andere Wahl als :
Für meine Anlage muss ich jetzt wohl doch mit umschalten der Bilder arbeiten.

Grüße und viel Erfolg
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Idee hab ich noch:
Leg doch mal ein Ausgabefeld der Länge 4 an, Darstellungsart ASCII und Datentyp DWORD, damit müssten doch schon mal 4 Zeichen darzustellen sein.
Wenn das geht, kannst du ja 4 solcher Felder nebeneinander legen und die Kuh wäre vom Eis.

Grüße von HaDi
 
Rückkopplung

Hall HaDi und Larry,

also das mit dem Doppelwort funktioniert einwandfrei.
Ich habe jetzt in einem DB alle möglichen Texte - jeweils als STRINg[4] liegen.
Je nachdem welcher Text angezeigt werden soll werden die einzelnen Strings in separate Bereiche kopiert (Aktualwerte) - dies mit SFC 20 - Block Move.
Aus diesem Aktualwertbereich holt das OP dann die 4-selligen Texte als DWord und zeigt sie mit ASCII-Codierung an.
Für eine einzelne Zeile (20 Felder) benötige ich also 5 Variablen.
Dies ist zwar alles etwas umständlich aber der einzige Weg den ich (bzw. wir gemeinsam) ausgemacht haben.
Wie schön war das OP7.........

Vielen Dank, MMM
 
Zurück
Oben