TIA Blockmove mit Any auf Struktur und wieder zurück in Any. Ich krieg krämpfe

vollmi

Level-3
Beiträge
5.433
Reaktionspunkte
1.409
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen.

Ich hab ja in Step7 einen Funktionsbaustein gemacht die mir aus einem beliebigen Bereich eines DBs die Werte in einen temporären UDT Bereich legt und am ende des Funktionsbausteins wie aus dem UDT Bereich zurückkopieren auf den ANY an der Schnittstelle deklarierten ANY.

Auf der S7 1500 in TIA scheint das nicht mehr zu gehen.

Code:
(*Pointer auf UDT schreiben zum arbeiten*) // Ventilator allgemein#pLS_Strahlventilator.Bereichstyp := 2;   // Typ des Bereichs soll Byte sein (INT = 2)
#pLS_Strahlventilator.Anzahl_Werte := 112; // Länge des Pointers weil wir einen Any ohne Länge angeben wollen
// Muss so lange sein wie der UDT der angezeigt werden soll.
#Ret := BLKMOV(SRCBLK := #LS_Strahlventilator, DSTBLK => #SV); // Kopieren in die Temporäre Variable.  


(*Eigentlicher Programmteil starten*)
(*Hier wird der Pointer zurückgeschrieben*)
#Ret := BLKMOV(SRCBLK := #SV, [COLOR=#ff0000]DSTBLK => #LS_Strahlventilator[/COLOR]); // Ventilator allgemein

Beim roten kommt bei mir ungültige Parameterzuweisung.
LS_Strahlventilator ist vom Typ ANY am Bausteineingang deklariert.

pLS_Strahlventilator ist eine AT Sicht vom Typ ANY_Pointer (UDT um einen ANY umzubauen).

SV ist eine UDT Struktur. von der Länge 112 Byte und darum gehts mir. Ich will am LS_Strahlventi den ersten Datenpunkt einer beliebigen unbekannten struktur eines DBs anhängen. und dann einfach die 112 fortfolgenden Bytes verschieben in einen im TEMP deklarierten UDT. Und dies am Ende wieder zurück.

mfG René
 
Hi Vollmi
es dürfte daran liegen, dass #LS_Strahlventilator ein INput Parameter ist, und ein Rückschreiben auf Eingänge ist verriegelt. Wenn du es als INOUT deklarierst sollte es gehen.
Du könntest aber auch mit einer normalen Zuweisung arbeiten, wenn du aussen die Struktur selbst anstelle eines Zeigers verschaltest. Du könntest dort auch indizierte Arrayzugriffe angeben. Vorraussetzung wäre, dass alle Parameter in dem Spiel vom selben UDT abgeleitet werden. Was hindert dich daran?

Viel Erfolg
Magnet!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Vollmi
es dürfte daran liegen, dass #LS_Strahlventilator ein INput Parameter ist, und ein Rückschreiben auf Eingänge ist verriegelt. Wenn du es als INOUT deklarierst sollte es gehen.

Das werd ich gleich probieren. Wäre aber unlogisch, denn auf einen Pointer kann man ja nicht schreiben. Man schreibt ja dahin wo der Pointer hinzeigt.

Du könntest aber auch mit einer normalen Zuweisung arbeiten, wenn du aussen die Struktur selbst anstelle eines Zeigers verschaltest. Du könntest dort auch indizierte Arrayzugriffe angeben. Vorraussetzung wäre, dass alle Parameter in dem Spiel vom selben UDT abgeleitet werden. Was hindert dich daran?

Das will ich eben genau nicht. Der DB von dem Gelesen und geschrieben wird ist eben vorgegeben, keine Strukturen nur aufeinanderfolgende Wörter. der Inhalt wiederholt sich ansich aber immerwieder darum möchte ich dann gerne indiziert darauf zugreifen und nur immer das erste Wort einer solchen Wiederholung am Baustein anhängen und intern dann trotzdem mit einer Struktur arbeiten.

mfG René
 
Addendum:
Wenn ich den ANY am INOUT deklariere dann kann ich ihn sauber am Blockmove anhängen fehlerfrei. Nur kann ich in der INOUT deklaration keine AT überlagerung definieren. Das geht nur an IN oder natürlich im Stat und Temp. Nützt mir nur nix.
Ein Kreuz mit dem TIA manchmal.

mfG René
 
So jetzt klappts. Ich kopiere jetzt den inhalt von ANY vom IN in einen ANY von Temp.
Code:
#[COLOR=#00ff00]any_LS_Strahlventilator [/COLOR]:= #[COLOR=#ffa500]LS_Strahlventilator[/COLOR];

Und mach dann auf dem Any im Temp eine AT überlagerung.
So funktionierts.
Wenn man jetzt irgendwie mit der 1500er oder TIA die Länge eines UDT ermitteln könnte wäre ich dann schon fast wieder glücklich.

mfg René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi all

das ist die Trickserei der AS400, die eine AS1500 langsam macht.
So entstehen unwartbare Programme.

Wenn es eine Struktur ist, die sich in einem DB wiederholt, dann sollte der DB ein Array of UDT enthalten.
Das zeitverschwendende Herumgeeiere mit einem standard DB gehört ins Jahr 1990.

'n scön' Tach auch
HB
 
Das musst du mir nicht sagen. Aber wenn ich sage die Struktur wird mit UDTs in der Datenpunktliste besser. Fehler lassen sich einfacher vermeiden. Dann sagen mir Die kurz vor Pensionierung dann. "Wir haben schon immer Absolut adressiert das geht schnell und funktioniert. Wir lassen für die Pointer einfach zwischen den Objekten genügend Reserveworte im DB das man den Pointer später nicht verstellen muss wenn man dem Objekt einen Datenpunkt mehr braucht."

Sie wollen unbedingt absolute adressen weil man sonst zuviel Tippen muss. Darum heissen unsere Symbole im DB auch
"DB101"._DBW_100_0 oder "DB101"._DBX_102_1

Bis jetzt hab ich es nicht hingekriegt die älteren Semester von der Symbolischen Objektorientierten Programmierung zu überzeugen. Von UDTs haben die meisten noch garnix gehört oder halten sie für Teufelswerk.

Wenn mir jemand Argumente liefert mit dem ich wirklich jeden umdrehen kann kriegt er von mir n Fass Bier spendiert.

mfG René
 
@René:
Du mußt deinen Chef überzeugen - nicht deine Kollegen. Alle Menschen sind von Natur aus bequem. Selbst wenn ein Änderungsvorschlag 100mal besser ist (und etwas in der Art traue ich dir durchaus zu) wirst du sie so ohne Weiteres nicht davon ab bekommen weiter "mit Hammer und Meissel ihren Programmcode auf einer Steinplatte einzuritzen".
Du darfst ihnen oder auch deinem Chef diesen Kommentar durchaus zeigen ...

Gruß
Larry
 
Zurück
Oben