Anypointer Speicherbereich SFC20 kopiert nicht

spqr76

Level-2
Beiträge
128
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
habe über dieses Thema bisher nichts gefunden deshalb meine Anfrage:
ich habe an einem FB mehrere IN Parameter als INT.Diese werden im FB zu einem Anypointer zusammengesetzt. Damit wird der SFC 20 Quelle/Ziel beschaltet. Die Quelle ist ein DB das Ziel ist der Instanz DB. Muss an dem Anypointer -SFC20 -Quelle (ist im FB enthalten) für den Speicherbereich dann die 84 für DB oder der Wert 85 für DI parametriert werden ? Da es ja IN Parameter sind könnte mein Pointer für die Quelle ja aus dem Instanz DB kommen also 85 oder ?
Allerdings kommen die Daten ja aus einem DB.....Hm???

Ich bin heute darüber gestolpert . Es gibt da anscheinend bei den CPU's Eigenschaften die auf diesen unterschied Wert legen . Der besagte FB wurde mehrfach verwendet ohne Probleme mit dieser 85 im Speicherbereich für den Anypointer-am SFC20-Quelle. Es werden einfach Daten aus einem DB in den InstanzDB kopiert. Heute jedoch nicht war eine neu Inbetriebnahme an einer älteren S7/300...... Ich konnte diesen Fehler auch nicht nachstellen an anderen CPU's. Weder PLCSIM noch andere reale CPU's stören sich an der Angabe des Speicherbereiches und kopieren die Daten . Nur diese eine CPU heute nicht.

Nun bin ich allerdings schon zu Haus und kann erst morgen näheres zur Hardware sagen. Es muss aber an der Angabe des Speicherbereiches liegen .Da in diesem speziellen Fall die Änderung von Speicherbereich 85 in 84 den gewünschten Effekt gebracht hat. Und die Daten wurden wie gewünscht kopiert.

Mich interessiert eben nun warum ? Da der Baustein von mir ist :) Wenn ich einen Fehler gemacht habe ok ......
Für Infos wäre ich sehr dankbar. Wenn nähere Infos gewünscht sind Poste ich sie gern morgen hinterher.

Ich hoffe das versteht irgendeiner was ich hier geschrieben habe*grins
 
Es gibt mehrere "Sorten" 300er -CPUs.
Sie arbeiten intern mit unterschiedlichen Prozessoren.
Beim SFC20 tritt dann unterschiedliches Verhalten auf.
Bei manchen CPUs funktionieren z.B, überlappende Speicherbereiche von Quelle und Ziel bei einer 312 geht das nicht.
Das Kopieren nach DI ist - soweit ich es kenne - auch noch abhängig von der Firmware.
Ich nutze es generell nicht.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das war mir nicht bewusst.
Der FB ist für eine Kamera die Bauteile kontrolliert.
Da diverse Bauteilinformationen (Teilenummer/Baudatum etc ) zur Produktrückverfolgung in den SendeString zur Kamera integriert werden müssen(TCP/IP), sah ich keine andere Möglichkeit als einen Indirekten Anypointer am SFC20 in meinem FB zu verwenden. Um aus den vorhandenen DB's die einzelnen Infos raus zu kopieren.
Da es ganz unterschiedliche Maschinenherstelleter mit diversen Bausteinnummern bei uns gibt lag eben die Wahl einen FB zu nehmen am nächsten. Deshalb auch das schreiben in den InstanzDB. Und wegen der Symbolik die spare ich mir dadurch. :p
 
Also ich habe noch nie etwas anderes eingetragen wie eine 84.
Ich habe mich da immer an folgendes Beispiel von einem Sylvio Blanke gehalten das ich vor längerer Zeit mal im Netz gefunden habe.

Code:
// der ANY-Zeiger wird nun mit Daten belegt
LAR1 P##ANY_Zeiger // Adressregister mit Anfangsadresse der temp.Variable laden Hier L0.0
L W#16#1002 // Type Byte
T LW [AR1,P#0.0] // in BYte n und n+1 laden
L 10 // Anzahl der Bytes
T LW [AR1,P#2.0] // in Byte n+2 und n+3 laden
L 1 // DB-Nr
T LW [AR1,P#4.0] // in BYte n+4 und n+5
L W#16#8400 // Operandenbereich hier DBX
T LW [AR1,P#6.0] // in Byte n+6 und n+7
// wir laden hier eine Konstant zB 30 als Byteanfangsadresse, hier kann man über MWxx xbeliebige
// Werte laden. Die Byteadresse muss dreimal nach links geschoben werden, weil die unteren
// drei Bits die Bitadresse beinhalten als 0 bis 7. Wir wollen 30.0 adressieren.
L 30 // Quellenanfang (Zeiger) wir woolen aus DB1.DBX30.0 anfangen
SLW 3 // dreimal nach links (im Akku 1)
T LW [AR1,P#8.0] // in Byte n+8 und n+9
// Der ANY_Zeiger sollte jetzt komplett vorbelegt sein, war doch einfach oder ?
 
Also ich habe noch nie etwas anderes eingetragen wie eine 84.
Ich habe mich da immer an folgendes Beispiel von einem Sylvio Blanke gehalten das ich vor längerer Zeit mal im Netz gefunden habe.

Code:
// der ANY-Zeiger wird nun mit Daten belegt
LAR1 P##ANY_Zeiger // Adressregister mit Anfangsadresse der temp.Variable laden Hier L0.0
L W#16#1002 // Type Byte
T LW [AR1,P#0.0] // in BYte n und n+1 laden
L 10 // Anzahl der Bytes
T LW [AR1,P#2.0] // in Byte n+2 und n+3 laden
L 1 // DB-Nr
T LW [AR1,P#4.0] // in BYte n+4 und n+5
L W#16#8400 // Operandenbereich hier DBX
T LW [AR1,P#6.0] // in Byte n+6 und n+7
// wir laden hier eine Konstant zB 30 als Byteanfangsadresse, hier kann man über MWxx xbeliebige
// Werte laden. Die Byteadresse muss dreimal nach links geschoben werden, weil die unteren
// drei Bits die Bitadresse beinhalten als 0 bis 7. Wir wollen 30.0 adressieren.
L 30 // Quellenanfang (Zeiger) wir woolen aus DB1.DBX30.0 anfangen
SLW 3 // dreimal nach links (im Akku 1)
T LW [AR1,P#8.0] // in Byte n+8 und n+9
// Der ANY_Zeiger sollte jetzt komplett vorbelegt sein, war doch einfach oder ?

Aber ich empfehle, SLD 3 zu verwenden, da sonst bei Any, die weit hinten in einen großen DB "zeigen" die korrekte Adresse zerstört wird (die 3 linken Bit des Wortes fallen ja einfach weg!).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Pinky (Signatur)

Code:
[INDENT]Den Fortschritt verdanken die Menschen den Unzufriedenen. 
[SIZE=1]Aldous Huxley[/SIZE]
[/INDENT]

Und ich dachte immer...
Dem Fortschritt verdanken die Menschen die Unzufriedenheit :cool:
 
Zurück
Oben