Hardware-Adressen im Deklarationsteil einem ARRAY zuweisen (SCL)

tahren

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

ich stehe erneut vor einem kleinen Problem. Mein Funktionsbaustein muss während des laufenden Programmablaufs der Reihe nach auf mehrere Eingangsbereiche zugreifen. Da ich das innerhalb meines Bausteins nicht über globale Zuweisung, sondern über lokale Zuweisung realisieren möchte, habe ich mir gedacht, den gesamten Eingangsbereich beim Aufruf des FBs einem ARRAY zu übergeben.

Beispiel:
zu übergebender Eingangsbereich: EB0 - EB31 // beliebiger Adressbereich (32 Byte)

-------------FBx-------------

VAR_INPUT
EADR : ARRAY[0..31] OF BYTE;
END_VAR

BEGIN

.....

------------------------------

Wie muss ich nun den Eingangsadressbereich beim Aufruf des FBs übergeben, bzw. geht das überhaupt was ich vorhabe?

Vielen Dank schonmal für die Hilfe!

Mit freundlichen Grüßen
tahren
 
stichwort: ANY

tipp: nimm die beine in die hand und renn, wenn ich in die nähe eines solchen programms komme!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stichwort ANY wäre zwar eine sehr einfache Möglichkeit, aber da ich mich bei meiner Programmierung an die Norm IEC halten möchte, sind mir dabei leider die Hände gebunden. Denn in der Norm gibt es leider keinerlei Pointer...
 
Stichwort ANY wäre zwar eine sehr einfache Möglichkeit, aber da ich mich bei meiner Programmierung an die Norm IEC halten möchte, sind mir dabei leider die Hände gebunden. Denn in der Norm gibt es leider keinerlei Pointer...

Willste ne Lösung oder dich an irgendeine dahergelaufene Norm halten. :rolleyes:
 
Ich möchte lediglich wissen, ob es eine Möglichkeit zur Lösung des oben genannten Problems gibt. Normkonform natürlich! D.h. ohne ANY-Pointer. Mir wäre geholfen, wenn ich den Eingangsbereich beim FB-Aufruf in dem ARRAY abbilden könnte...
 
Hallo Tahren,
da du ja den ANY-Vorschlag von 4L so schnell verworfen hast ... was glaubst du denn, was du dem FB übergibst wenn du ein Array auf den IN-Parameter legst ?
Innerhalb der Step7-Welt ist der ANY-Pointer der vorgesehene Weg für frei spezifizierbare Datenbereiche. Dein Verweiß auf die Norm ist in diesem Zusammenhang m.E. nicht praktikabel umsetzbar da Step7 und die von dir so gern genannte Norm schon an sich ein Widerspruch sind ...

Gruß
Larry
 
Also ein komplettes STEP7 Projekt normkomform zu programmieren ist auch meiner Meinung nach praktisch nicht umsetzbar. Es geht mir dabei auch lediglich um den einen Baustein, da dieser für ein Identifikationssystem zuständig ist und so eventuell auch unter anderen Programmiersystem lauffähig sein soll. Aber da muss man mal abwarten, inwiefern dass am Ende klappt. Den Versuch möchte ich zumindest unternehmen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ... aber du siehst ja, wie schnell du da an Grenzen stößt.
Wenn du einen FB erstellen willst, der unter Step7 genauso läuft wie unter Codesys dann bezweifle ich, dass alles immer überall gleich umsetzbar ist.
Denk einfach mal in Richtung Treiber - es gibt auch keinen SW-Treiber für irgend etwas, der mit jedem Betriebssystem (noch nicht einmal jedem Windows-Betriebssystem) zusammenarbeitet ...

Gruß
Larry
 
Das mag vielleicht richtig sein was du sagst. Ich denke auch dass es schwer umsetzbar ist. Dennoch möchte ich es ausprobieren und somit den Quellcode in dem Baustein anhand der Norm schreiben. Außerhalb habe ich keine Probleme damit mittels Pointer zu arbeiten. Nur wie lege ich denn meine Eingänge an meinen Baustein an, so dass sie im dem Array abgelegt sind?
 
Sorry, aber gib dem Baustein doch einfach 2 INT-Parameter.
Einen mit der Startadresse deines IN-Bereiches und den Anderen mit der Anzahl an Bytes die Du bearbeiten möchtest.

Dein 32-Byte-ARRAY müsstest Du ja sonst auch vorher kopieren: Dann doch lieber in Deinem, dann sehr flexiblem, Baustein, oder?
 
Um den Baustein konform zu halten, könntest du vielleicht einfach nur ein Array übergeben und dieses Array vor dem Baustein mit den entsprechenden Eingangs-Daten befüllen.
 
Aber innerhalb meines FBs komme ich dann doch wieder nur über Pointer auf die Eingänge oder?

Nein ... über indirekte Adressierung ...
Der Vorschlag ist m.E. auch nicht so schlecht - Nachteil nur, dass man nie nachvollziehen kann (Querverweißliste), dass die Eingänge in dem Baustein verwendet werden. das gilt allerdings auch für den ANY-Pointer ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau die Idee hatte ich anfangs auch. Das Problem dabei war nur, dass der Baustein mehrfach genutzt werden soll, mit jeweils unterschiedlichen Eingangsbereichen. Aber ich denke ich werde es trotzdem so machen wie du vorgeschlagen hast. Ich habe mir überlegt, dass ich einfach einen großen Datenbaustein anlege und diesen dann, wie du schon sagtest, vor dem Baustein mit allen Eingangswerten beschreibe. So dass ich dann für die verschiedenen Eingangsbereiche jeweils ein eigenes ARRAY im DB deklariere und die dann separat an den Baustein lege, je nachdem, welche Eingangsbereiche gerade benötigt werden. Schöner hätte ich es gefunden, wenn man direkt die Eingangsdaten mit dem Aufruf des FB in das Array transferiert, ohne vorher noch einen Datenbaustein zu verwenden. Vielleicht hat ja noch jemand einen anderen Lösungsvorschlag...?!

Erstmal vielen Dank für die vielen Antworten!

Mit freundlichen Grüßen
tahren
 
Vielleicht hat ja noch jemand einen anderen Lösungsvorschlag...?!

Da wir beide zeitgleich geschrieben haben hast du vielleicht meinen Beitrag übersehen ...

Ansonsten sind die Alternativen innerhalb der Möglichkeiten der Programmierung begrenzt ...
Wofür benötigst du denn diese vielen Eingänge in dem FB ? Vielleicht ist da ja noch ein Ansatz etwas zu optimieren ...

Gruß
Larry
 
Nein ... über indirekte Adressierung ...

du meinst so? -> DATA := EB[byteindex];

dann greife ich ja auch wieder global auf die Eingänge zu oder?....laut Norm kann auf globale Hardware-Adressen zugegriffen, indem im Deklarationsteil eine Zuweisung der Adresse an einem später verwendeten Variablennamen erfolgt. Weißt du wie das genau gemeint ist? So langsam geht mir die Norm auch auf die Nerven ^^
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... dann greife ich ja auch wieder global auf die Eingänge zu oder?....laut Norm kann auf globale Hardware-Adressen zugegriffen, indem im Deklarationsteil eine Zuweisung der Adresse an einem später verwendeten Variablennamen erfolgt. Weißt du wie das genau gemeint ist?

... das würde ich unter dem Oberbegriff "symbolische Adressierung" zusammenfassen ... - also nicht brauchbar ... :rolleyes:

So langsam geht mir die Norm auch auf die Nerven ^^
C'est la vie ...
Mach was draus - es ist dein Projekt ...

Gruß
Larry
 
laut Norm kann auf globale Hardware-Adressen zugegriffen, indem im Deklarationsteil eine Zuweisung der Adresse an einem später verwendeten Variablennamen erfolgt.

Hmm also wenn ich das jetzt richtig verstehe, dann kann ich laut Norm folgendes machen....

ich brauche eine lokale Variable:
VAR
DATA : DWORD;
END_VAR

wenn ich nun im Deklarationsteil dieser Variable bspw. das ED0 zuweise, dann ist DATA eine Kopie des ED0 und ich kann sie im Programm nutzen. Und das sogar normkonform! Oder verstehe ich das vlt falsch?!
Im Anweisungsteil könnte ich das ja locker machen...
DATA := ED0;

aber wie geht das denn im Deklarationsteil?
 
Zurück
Oben