Step 7 String in SCL aus DB in statische Variable schreiben

fabries

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo allerseits,

habe ein kleines Problem! Versuche in SCL Strings[64] mit Anfangswerten '****volle_länge_mit_64_Zeichen****' aus einem DB in eine statische Variable in meinem FB zu bekommen!

mit der Zuweisung " := " gehts leider nicht -> über PLCSIM durch beobachten einzelner Worte in der VAT -> steht immer W#16#0000 drin!

habe es schon mit "Replace" versucht leider auch ohne Erfolg!

kämpfe gerade mit der "BLKMOV" Funktion, aber finde einfach kein passenden Ansatz, dass es funktioniert!

Welche Speichergrenze hat die Zuweisung :=?
oder die Replace-Funktion?
oder der BLKMOV?

Hoffe, jemand kennt das Problem bereits und kann mir weiterhelfen!
 
Hallo,
ich kenne das Problem nicht - wie wäre es, wenn du mal zeigst (Code) wie du es versucht hast es umzusetzen ...?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ist eig. ganz einfach habe um das Problem zum testen so eingegrenzt:
Schreibe den String in eine Variable und dann von der Variable wieder in einen String im DB um diesen anschließend im Online-modus von PLCSIM zu beobachten.

Code:
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

FUNCTION_BLOCK  FB20000

VAR 

    String_TempX : STRING[62];
    String_Temp_In : STRING[64];
    String_Temp_Out : STRING[64];
        _String_Temp_In AT String_Temp_In : ARRAY[1..66] OF CHAR;
       
END_VAR

BEGIN
///////////////////////////////////////////////////////////////////////////////////////////////

String_Temp_In := DB_Auftragstelegramme.Telegramm.Tele_01;        
DB_Auftragstelegramme.Telegramm.Test := String_Temp_In;

END_FUNCTION_BLOCK
///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////


DATA_BLOCK DB20000 FB20000 // Instanz für FB zuweisen!!!
BEGIN
END_DATA_BLOCK

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////


DATA_BLOCK "DB_Auftragstelegramme"
STRUCT 	
   Telegramm : STRUCT 	//Telegramm 
    Tele_01 : STRING  [64] := '****************************************************************';	//Telegramm 01
    Tele_02 : STRING  [64] := '****************************************************************';	//Telegramm 02
   
    Test : STRING  [64] := '';
END_STRUCT;
BEGIN
END_DATA_BLOCK

///////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////

genau so habe ich es mit der REPLACE-Funktion und auch mit dem BLKMOV getestet, leider ohne Erfolg! :-(
Hoffe das war ausführlich genug. Falls noch etwas unklar ist....
 
... und in dem DB sind die Variablen auf tatsächlich so drin ?
Ich frage deshalb weil ich mir vorstellen könnte, dass dein Initialisierungswert, den du z.B. auf Tele_01 legst, nur beim ersten Anlagen des DB darauf geschrieben wird.

Schreib doch spasseshalber mal eine Codezeile, die die beiden Variablen einmal vordefiniert. In deinem Code sehe ich erstmal nichts Verwerfliches.

Gruß
Larry
 
Die Variablen werden später von wo anders zugewiesen, aber das steht doch für dieses Probelm nicht zu frage!?

das Probelm ist wenn ich diese Strings zum Beispiel nur String[2] mache dann funktioniert es mit der oben beschriebenen Erklärung, aber wenn die Strings auf die länge 10 oder 64 oder... haben geht das leider nicht mehr, das ein Wert wieder ankommt im DB. Sprich es findet kein Übertrag von DB in die statische Varialbe statt oder von der statischen Variable wieder in den DB.

oder täusche ich mich???

Ich frage deshalb weil ich mir vorstellen könnte, dass dein Initialisierungswert, den du z.B. auf Tele_01 legst, nur beim ersten Anlagen des DB darauf geschrieben wird.
Was meist du damit genau?

Gruß Fabries
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du musst deinen DB noch initialisieren, wenn du den Text erst später eingegeben hast (umschalten auf Datensicht über Ansicht->Datensicht, dann initialisieren über Menü Bearbeiten->Datenbaustein initialisieren).

Mit welcher Länge sind denn deine Strings "DB_Auftragstelegramme.Telegramm.Test" und "DB_Auftragstelegramme.Telegramm.Tele_01" angelegt?
 
Du musst deinen DB noch initialisieren, wenn du den Text erst später eingegeben hast (umschalten auf Datensicht über Ansicht->Datensicht, dann initialisieren über Menü Bearbeiten->Datenbaustein initialisieren).
Von welchem Editor / Menü redest du? SCL , Simatic Manager?
diese gibt es bei mir nicht
(umschalten auf Datensicht über Ansicht->Datensicht, dann initialisieren über Menü Bearbeiten->Datenbaustein initialisieren)

Die länge der Strings ist 64!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du musst deinen DB noch initialisieren, wenn du den Text erst später eingegeben hast (umschalten auf Datensicht über Ansicht->Datensicht, dann initialisieren über Menü Bearbeiten->Datenbaustein initialisieren).
super danke für den hinweis, es lag an der Initialisierung! Anfängerfehler von mir ^^

Lässt sich das nicht automatisch Initialisieren? :???:
 
Lässt sich das nicht automatisch Initialisieren? :???:

Nur wenn du den DB über eine Quelle generierst. In SCL z.B. so:
Code:
DATA_BLOCK DB_Auftragstelegramme

    STRUCT
        Telegramm : STRUCT
            Tele_01 : STRING [64] := 'Anfangswert';
            Test : STRING[64] := 'Anfangswert';
        END_STRUCT;
    END_STRUCT
BEGIN
    Telegramm.Tele_01 := 'Aktualwert';
    Telegramm.Test := 'Aktualwert';
END_DATA_BLOCK
Sieht in AWL aber fast genauso aus.

Ansonsten hilft nur dran zu denken, habs auch schon das ein oder andere mal vergessen. Wenn du einen neuen DB anlegst der bisher noch nicht existierte, werden die Anfangswerte auch gleich als Aktualwerte eingetragen. Erst wenn du später Änderungen machst, musst du ggf. initialisieren.
 
Zurück
Oben