TIA ANY Pointer in TIA

Fritz4

Level-1
Beiträge
18
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich bin gerade dabei unsere Standard Bausteine auf TIA umzustellen. In einigen Bausteinen greife ich dabei auf abgelegte Parameterdaten in Datenbausteinen zurück die ich im jeweiligen FB dann in die Lokaldaten lade. Dem FB gebe ich dabei mit um welchen Parameter DB es sich handelt und welche Parametersatznummer. Die Länge des UDT sind immer 50 Byte je Parametersatz. Seither habe ich mir im FB jetzt die Adresse zusammengebastelt aus DB Nummer und und Parametersatznummer um mit einem Blockmove dann die entsprechenden Bereich zu kopieren.

Bsp. Code S7
//Ermittlung der Anfangsadresse des Parametersatzes
//->Die Startadresse des ersten Parametersatzes im Speicher DB
//->beginnt bei 50 und hat eine feste Länge von 50 Byte
L #II_Parametersatz
L 50
*I
ITD
T #Startadress_Parametersatz

//ANY-Pointer bilden Startsadresse des Parametersatzes

LAR1 P##Pionter_Start //Lade den ANY–Pointer in AR1

L BYTE#16#10 //Lade die Syntax–ID und
T LB [ AR1 , P#0.0 ] //transferiere sie in den ANY–Pointer

L BYTE#16#02 //Lade Datentyp Byte und
T LB [ AR1 , P#1.0 ] //Transferiere ihn in den ANY–Pointer

L 50 //Lade Anzahl Bytes und
T LW [ AR1 , P#2.0 ] //transferiere sie in den ANY–Pointer

L #DB_Nr_Parametersatz //Lade DB Nummer
T LW [ AR1 , P#4.0 ]

L P#DBX0.0 //Nummer des 1. einzutragenden Bytes laden
L #Startadress_Parametersatz
SLD 3
+D
T LD [ AR1 , P#6.0 ]

//Neu ausgewählten Parametersatz
//in Arbeitsbereich laden

CALL BLKMOV
blk_type:=Variant
SRCBLK :=#Pionter_Start
RET_VAL :=#Return_Value
DSTBLK :=#SP_PS_Aktuell.PS_Aktuell


Ich habe nun versucht das über den neuen MOVE_BLK_VARIANT zu machen was mir auch geglückt ist nach Umstellung der Datenablage der UDTs Parameter DBs auf Arrays.
Ich scheitere aber jetzt daran, den DB aus dem gelesen werden soll, über meine IN Variable DB Nummer variabel zu machen: wie geht das?

Bsp.
CALL MOVE_BLK_VARIANT
SRC :="DB753 - Analog 01 Parameter".Paramtersatz[0]
COUNT :=1
SRC_INDEX :=#Nr_Parametersatz
DEST_INDEX :=0
Ret_Val :=#Return_Value
DEST :=#SP_PS_Aktuell[0]


"DB753 - Analog 01 Parameter" möchte ich variabel machen.
.Paramtersatz[0] ist die Startadresse die immer gleich ist.

Kann mir jemand helfen wie das geht oder ob ich generell so auf dem richtigen Weg bin den S7 Code auf TIA zu übertragen.
Ich weiß, viel Text, aber vielleicht besser als zu wenig :)

Gruß
Fritz4
 
Moin Fritz,
für das was du vor hast, gibt es ganz unterschiedliche Ansätze (hier wäre es wichtig zu wissen auf welcher SPS das ganze laufen soll - der MOVE_BLK_VARIANT lässt mich auf die neuen Steuerungen schließen). Um deinen Code auf den neuen Steuerungen weitestgehend am Leben zu halten, kannst du bspw. den PEEK-Baustein von Siemens verwenden:
Code:
[TABLE]
[TR]
[TD]CALL PEEK[/TD]
[/TR]
[TR]
[TD]AREA := 16#84  // hex 84 für DB[/TD]
[/TR]
[TR]
[TD]DBNUMBER := 1  // deine Variable DB-Nummer[/TD]
[/TR]
[TR]
[TD]BYTEOFFSET := 2  // Hier die Multiplikation deiner Parametersatznummer * 50[/TD]
[/TR]
[TR]
[TD]RET_VAL := #Peeker // Ergebnis der Anweisung[/TD]
[/TR]
[/TABLE]

Empfehlen würde ich das aber persönlich nicht.
Meiner Meinung nach kann man, wenn man außen an dem Baustein eh manuell beschalten muss, welche DB-Nummer und welcher Parametersatz bearbeitet werden soll, auch gleich das korrekte Array-Element aus dem korrekten DB als In/Out übergeben und dann durchgängig symbolisch arbeiten. Das ist tendenziell leserlicher, diagnostizierbarer und via Querverweise wiederfindbar.

Der von dir gewählte MOVE_BLK_VARIANT will übrigens am Parameter SRC zwingend ein Array bzw ein Array-Element. Das geht leider nur symbolisch, nicht aber mit einer variablen Nummer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hoffe das ich dein Vorhaben gut verstanden hab.

Du kannst im TIA vollsymbolysch auf ein UDT in ein Datenbaustein zugreifen. Dies konnte mann im Classic auch schon machen.
Im FB dann im IN Schnittstelle dies als UDT anlegen. Sprich der gleiche als im DB.

Der alte Blockmove findest du im Einfache Anweisungen --> Verschieben --> Legacy.
Dies brauchst du aber vollsymbolysch auch nicht mehr.

Bram
 
Ich bin gerade dabei unsere Standard Bausteine auf TIA umzustellen.

Diese Aussage ist sehr ungenau.
Wenn du deine Standardbausteine auf TIA umstellen willst, kannst du das mehr oder weniger direkt machen ohne grossartige Anpassungen Pointer und so weiter bleiben sich gleich.

Aber was ich aus deiner Frage lese, ist. Du willst deine Standardbausteine auch S7-1500 kompatibel machen. Und da muss man sagen, sollte man sich überlegen ob man die Funktionen der S7-1500 nicht lieber nutzt, anstatt die Pointeradressierung zu behalten und das ganze per PEEK and POKE auszuführen.

Besser wäre es vermutlich das Konzept etwas anzupassen, die Bausteine korrekt aufzubauen (array of struct, Type etc.) und dann Symbolisch zu arbeiten.
 
Zuerst mal danke für die Antworten.

Ja, ich arbeite mit einer 1500er und will das schon anpassen. Das mit dem Anpassen der DBs hab ich verstanden. Wäre auch kein Problem. Die Auswahl des Speicherbereichs im DB, also der Parametersatz muss im aufgerufenen Baustein geschehen wie bisher, da das Auslesen der Speicherbereiche zu einem Ereignis im FB stattfindet und nicht Zyklisch.

Mir ist nur nicht klar jetzt, wie ich trotz symbolisch Adressierung, den auszulesenden Parameter DB "variabel" im FB gestalten kann wie seither eben.
Ich möchten den FB eben für X Sensoren nutzen. Also Quasie eben das "Alte" auf neu umbauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir ist nur nicht klar jetzt, wie ich trotz symbolisch Adressierung, den auszulesenden Parameter DB "variabel" im FB gestalten kann wie seither eben.
Ich möchten den FB eben für X Sensoren nutzen. Also Quasie eben das "Alte" auf neu umbauen.
dafür müsstest du vielleicht mal ein wenig von deinen DBs preisgeben, dann können wir mal schauen. ;)
nur mal als Beispiel ohne dein Programm jetzt zu kennen:
Wenn alle Parametersätze grundsätzlich den gleichen Aufbau haben, dann kannst du sie im DB ja als Array of UDT_Parameter anlegen.
Deinem FB könntest du dann bspw. ein unspezifiziertes Array
[*] of UDT als InOut of UDT_Paramter übergeben.
Im FB kannst du dann Symbolisch mit einem Variablen Index auf die gewünschten Einträge zugreifen.
Oder aber man übergibt dem FB direkt nur dieses eine gewünschte Array-Element, dann wäre der InOut auch nur vom Typ UDT_Parameter...
Aber am besten, zeigst du uns mal was du an "Ausgangsmaterial" hast
 
Also Konkret:

es gibt einen UDT
3J3ovUh8HagQyBYAmkKk9OFAjkCkANIFM7cGBGoFMAaAJZGoPDtQIZAoATSBTe3CgRiBTAGgCmdqDAzUCmQJAE8jUHhyoEcgUAJpApvbgQI1ApgDQBDK1BwdqBDJzI 0AAAAaSURBVDIFgCaQqT04UCOQKQA0gUztwYEa X8vte6LPSGibgAAAABJRU5ErkJgggA=


Es gibt X versiedenen DBs die so aussehen
P0s82LVKbaFRAAAAAElFTkSuQmCCAA==


In meinem FB gibt es unter Anderem
w8I3rHL48UIzwAAAABJRU5ErkJgggA=


Jetzt möchte ich den FB so aufbauen, dass ich anparametrieren kann dass ich aus den "DB 753 Analog 1" oder aus dem "DB 755 Analog 2" oder aus dem "DB 757 Analog 3" den ensprechenden Parametersatz in das Array im Static Bereich des FBs kopieren kann und damit dann im FB arbeiten.
Wie gesagt seither eben mit dem Any Pointer und jetzt im TIA evtl ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Grundlagen sehen dann etwa so aus
screenshot.53.jpg

Du kannst dann auch die ganze Struktur in einen static bereich kopieren. Achtung. Solltest du jetzt damit liebäugeln die ganze struktur in den Static zu kopieren und dann wieder zurückzukopieren, dann wirst du wohl über das Problem des fehlenden Zykluskontrollpunktes stolpern.
Variable Arrays kann man übrigens nur an INOUT deklarieren.
Upper_bound und Lower_bound liefern dir dann auch grenzen.
Array
[*] of Variant geht leider "noch" nicht.
 
w8I3rHL48UIzwAAAABJRU5ErkJgggA=

Jetzt möchte ich den FB so aufbauen, dass ich anparametrieren kann dass ich aus den "DB 753 Analog 1" oder aus dem "DB 755 Analog 2" oder aus dem "DB 757 Analog 3" den ensprechenden Parametersatz in das Array im Static Bereich des FBs kopieren kann und damit dann im FB arbeiten.
Wie gesagt seither eben mit dem Any Pointer und jetzt im TIA evtl ...

Wie oben bereits beschrieben, würde ich einen FB mit dem InOut EingangsParametersatz vom Typ "UDT_Analog_Parametersatz" erstellen. Innerhalb des FB kannst du mit dieser InOut komplett symbolisch arbeiten.
Wenn der FB aufgerufen wird, übergibt man direkt das richtige Element aus dem richtigen DB:
Code:
Call "FB_ANALOGVENTIL"
Parametersatz := [COLOR=#333333]"DB 753 Analog 1".Parametersatz[1][/COLOR]
...
Call "FB_ANALOGVENTIL"
Parametersatz := [COLOR=#333333]"DB 755 Analog 2".Parametersatz[7][/COLOR]

oder aber eben mit einem unspezifiziertem Array
[*] of UDT_Parameter als InOut und einem Parameter für die zu bearbeitende Nummer:

Code:
Call "FB_ANALOGVENTIL"
Parametersatz := [COLOR=#333333]"DB 753 Analog 1".Parametersatz[/COLOR]
Parametersatznummer := 1
...
Call "FB_ANALOGVENTIL"
Parametersatz := [COLOR=#333333]"DB 755 Analog 2".Parametersatz[/COLOR]
Parametersatznummer := 7

Es macht vom Beschaltungsaufwand ja keinen Unterschied ob man wie früher am FB eine Nummer (753 oder 755) für die DB-Nummer übergibt, oder ob man halt einfach den DB symbolisch an den FB dran schreibt.
 
OK, wenn es die beste Lödung wäre, das ganze Array als In/Out zu übergeben, dann werde ich mich mal damit beschäftigen.
Wäre halt schön gewesen es intern zur regeln wie mal angedacht.

Noch eine Frage zu der Lösung von dir Howard mit dem unspezifiziertem Array
[*]
Call "FB_ANALOGVENTIL"
Parametersatz := "DB 753 Analog 1".Parametersatz
Parametersatznummer := 1
...
Call "FB_ANALOGVENTIL"
Parametersatz := "DB 755 Analog 2".Parametersatz
Parametersatznummer := 7


Wie ist die Syntax dann im FB dann um den IN Parameter:

Parametersatz := "DB 753 Analog 1".Parametersatz

mit dem IN Parameter:

Parametersatznummer := 1

zu verknüfen um auf den entsprechenden Parametersatz zu kommen, bzw. wie ist das zu handhaben?

Das wird wohl die Lösung sein.

Vielen Dank



 
Zuviel Werbung?
-> Hier kostenlos registrieren
.. Ich scheitere aber jetzt daran, den DB aus dem gelesen werden soll, über meine IN Variable DB Nummer variabel zu machen: wie geht das? ..
Um mal bei dieser Thematik zu bleiben, das geht m.E. nur mit PEEK und POKE bzw. PEEK_BLK und POKE_BLK, wie es in #2 schon vorgeschlagen wurde. Die DB-Nr. kannst du als DB_ANY übergeben. Das setzt natürlich voraus, dass der UDT bekannt ist. Aber das war ja beim ANY-POINTER nicht anders. Diese Version würde ich als Kompromiss bezeichnen, da PEEK und POKE eben nur ein Kompromiss ist ;-) . Funktioniert wohl auch nur mit nichtoptimierten Programmen.

Übrigens solltest du bei dieser Gelegenheit auf SCL umsteigen. So manch ein Bausteinchen ist dann auch auf einer S7-1200 ganz nützlich. Besser noch, die Bausteine vorrangig auf einer S7-1200-Umgebung entwickeln.

PS: Wenn eine Lösung ohne PEEK und POKE möglich ist, dann solltest du diese natürlich bevorzugen!
 
Zuletzt bearbeitet:

Noch eine Frage zu der Lösung von dir Howard mit dem unspezifiziertem Array
[*]
Call "FB_ANALOGVENTIL"
Code:
Parametersatz := "DB 753 Analog 1".Parametersatz
Parametersatznummer := 1
...
Call "FB_ANALOGVENTIL"
Parametersatz := "DB 755 Analog 2".Parametersatz
Parametersatznummer := 7

Wie ist die Syntax dann im FB dann um den IN Parameter:

Code:
[COLOR=#0000ff]Parametersatz := "DB 753 Analog 1".Parametersatz[/COLOR]


mit dem IN Parameter:

Code:
[COLOR=#0000ff]Parametersatznummer := 1[/COLOR]


zu verknüfen um auf den entsprechenden Parametersatz zu kommen, bzw. wie ist das zu handhaben?


Im FB kannst du dann z.B. schreiben:
Code:
Parametersatz[Parametersatznummer].Tol_Pos := 123;
 
Zurück
Oben