Step 7 Array in DB übertragen geht nicht

Skydriver2909

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
ich möchte aus meinem Char-Array #reference_for_the_input einen Wert in einen Datenbaustein kopieren. Dafür habe ich den Move Baustein genutzt und an dessen Ausgang wird mir auch der richtige ASCII Code für meinen Char angezeigt. Im Datenbaustein wird dieser allerdings nicht eingetragen.Unbenannt.PNG
Da der korrekte Wert am OUT eingetragen ist, verstehe ich nicht, warum mein Char nicht im DB landet.
Was das ganze noch komischer macht: wenn ich an IN eine fixe Variable platziere wird es übertragen.Unbenannt2.PNG
Wenn ich nun aber meine Quelle beibehalte und das Ziel verändere dann funktioniert es auch wieder:

2022_07_08_08_58_48_brm_wp10_taa4_Remotedesktopverbindung.png

Wenn ich meine Variable also sowohl aus meinem Array raus, als auch in den DB rein verschieben kann, warum kann ich sie dann nicht von Array in den DB schieben?
 
Welchen DB ist denn vor NW31 geöffnet? Gibt es einen Grund warum du das Ganze nicht symbolisch addressierst? Zeig doch mal noch den Programmteil davor.

Auch möglich ist, dass reference_for_the_input[0] mit call by reference an deinen Baustein übegeben wird und beim lesen ändert sich der aktuell geöffnete DB, sodass du mit dem Move auf DBB52 in einen anderen DB schreibst, als du eigentlich möchtest.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Unbenannt5.PNGAm Eingang #Telegramm_TB liegt der DB1256, den ich auch im 3. Bild als direkten Ausgang gewählt hab. Der fertige Baustein soll am ende flexibel ohne Änderungen eingesetzt werden können, deshalb keine symbolische Addressierung sondern über OPEN
 
Schalte mal die Ansicht auf AWL um und beobachte, ob an der Stelle wo der Move aufgerufen wird der geöffnete DB geändert wird.

Bzw. kannst du auch prüfen, ob an der Stelle in den DB auf DBB52 geschrieben wird, der dir reference_for_the_input[0] übergibt.

Ein möglicher workaround wäre an der Stelle statt dem Move in FUP folgendes in AWL (gibt aber sicher auch andere Möglichkeiten):

Code:
L reference_for_the_input[0]
Auf #Telegram_DB
T DBB52

Ob das jetzt die schönste Möglichkeit ist, sei mal dahingestellt. Wenn es ein flexibler und immer wieder zu verwendender Baustein werden soll, kann man die Probleme vielleicht auch eleganter angehen. Was soll denn der Baustein insgesamt machen?
 
Ich vermute ebenfalls, daß zwischen dem Öffnen Deines DB und dem MOVE auf das nur teilqualifizierte DBB52 ein anderer DB geöffnet wird. Dafür reicht schon, wenn irgendein vollqualifizierter DB-Zugriff stattfindet, dann wird da der geöffnete DB auf den DB des vollqualifizierten Zugriffs geändert. (Passiert gerne durch unbedachte bzw. ungenügend durchdachte Programmänderungen/erweiterungen durch Dritt-Programmierer.)
Code:
L 1256
T #Telegramm_DB

AUF #Telegramm_DB      //hiernach ist DB1256 geöffnet
L 123
T DBB52                //hier wird in DB1256.DBB52 geschrieben
...
U "einAndererDB".xyz   //hier wird "einAndererDB" geöffnet !
...
T DBB52                //hier wird in "einAndererDB".DBB52 geschrieben

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay das funktioniert. Komisch, da wird er wohl beim abgreifen aus den Array aus irgendeinem Grund seinen DB verlieren. Es wird aber im gesamten Baustein nur der Telegramm_DB geöffnet.
 
Eine andere Möglichkeit wäre auch noch reference_for_the_input[0] auf eine lokale Variable zu schreiben und mit dieser am Move zu arbeiten, wobei dies im Programm geschehen muss, bevor du den Ziel DB öffnest. Wie gesagt, gibt viele Möglichkeiten und wahrscheinlich könnte man den kompletten Teil eleganter lösen, wenn die genaue Aufgabenstellung bekannt wäre.

Wie ich oben bereits geschrieben habe, greifst du auf reference_for_the_input[0] zu und hier wird mit call by reference gearbeitet. Das heißt, dass die SPS intern auf den zugeordneten Speicherbereich zugreift, inklusive des DBs indem sich der Speicher befindet.
 
Wo ist das Array reference_for_the_input deklariert?
Wie sieht der Programmcode zwischen dem OPN und dem MOVE aus?
Tipp: wie UDP schon schrieb, beobachte das Programm in der AWL-Ansicht, um zu sehen wo sich der Inhalt des DB-Registers ändert.

Der fertige Baustein soll am ende flexibel ohne Änderungen eingesetzt werden können, deshalb keine symbolische Addressierung sondern über OPEN
Dann solltest Du erst recht vollsymblisch programmieren und nicht solche uralten indirekt-Adressier-Tricks anwenden. Spätestens wenn der Baustein mal nach TIA zu einer SPS mit "optimiertem" Speicherzugriff migriert werden soll/muß, dann kannst Du den Programmcode komplett wegwerfen und neu schreiben.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Anhang anzeigen 62211Am Eingang #Telegramm_TB liegt der DB1256, den ich auch im 3. Bild als direkten Ausgang gewählt hab. Der fertige Baustein soll am ende flexibel ohne Änderungen eingesetzt werden können, deshalb keine symbolische Addressierung sondern über OPEN
Gerade wenn man einen fertigen Baustein flexibel einsetzen will braucht man Symbolische Adressierung über die Schnittstelle des Bausteins… Du kannst auch UDTs und STRUCTs in der Schnittstelle deklarieren
 
Zurück
Oben