-> Hier kostenlos registrieren
Hallo liebe SPS ler,
In meinen alten SIEMENS Step7 Classic Projekten haben ich mithilfe eines FCs von einem Doppelwort gleichzeitig durch Invertierung INVD und Bitvergleich UD 32 positive und negative Flanken erzeugt. Das war sehr nützlich, da man im Vergleich zum bit-Befehl PF und NF deutlich Zykluszeit spart und automatisch von allen Boolschen Prozessvariablen die pos u neg Flanken zur Vefügung hat. Die globalen DBs waren in Classic fest absolut adressiert und aufgebaut.
In dem globalen DB gab es 4 structs: X (Bool) , FP_X, FN_X und HM_X (Flanken-Hilfsmerker). Die Variablen i d 4 Structs waren identisch und jedes struct 20 Byte lang.

Der o.g. FC hat über seine Bausteinschnittstelle den global DB und die als INT jeweils die Adresse des Doppelwortes im DB abgefragt (zB 4, 24, 44 und 64), worin die 32 Bits standen von denen die Flankenauswertung gemacht werden sollte:
so sah der alte STEP7 FC aus:
//--------------------------------------------------
AUF #DBe_Datenbaustein
//--------------------------------------------------
// Adresse, wo die Flanken gebildet werden sollen
L #Ie_STATUS_Adr
SLW 3
LAR1
// Hilfsmerkeradresse
L #Ie_HM_Adr
SLW 3
LAR2
//--------------------------------------------------
// Bilden der positiven Flanke
L DBD [AR1,P#0.0]
L DBD [AR2,P#0.0]
INVD
UD
T #DWt_FP_Status_Val
// Bilden der negativen Flanke
L DBD [AR2,P#0.0]
L DBD [AR1,P#0.0]
INVD
UD
T #DWt_FN_Status_Val
// aktuellen Status in Hilfsmerker schreiben
L DBD [AR1,P#0.0]
T DBD [AR2,P#0.0]
// schreiben der pos. Flanke in entsprechende Pos in DB
L #Ie_FP_Adr
SLW 3
LAR1
L #DWt_FP_Status_Val
T DBD [AR1,P#0.0]
//schreiben der neg. Flanke in entsprechende Pos in DB
L #Ie_FN_Adr
SLW 3
LAR1
L #DWt_FN_Status_Val
T DBD [AR1,P#0.0]
//--------------------------------------------------
Das Ganze hat uns 2 Jahrzehnte lang wunderbar die Arbeit beim Flankenauswerten erleichtert.
Dann kam TIA mit der dynamischen und symbolischen Adressverwaltung, was ja auch gut ist.
Ich habe es dann mal probiert den FC mit der Bausteinschnittstelle DB_ANY zu erstellen.
In meiner Not habe ich dafür den optimierten Bausteinzugriff abgeschaltet.

Da hat der Compiler aber brav gemeckert, da fehlt mir wohl noch die TIA Übung.
Nun meine Frage
:
1) Wie kann ich das jeweilige Doppelwort im global DB (ohne opt. Speicherzugriff) verpointert übergeben ?
2) Wie kann ich das Problem mit optimierten Bausteinzugriff lösen?
Symbolisch ist schwierig, da ich 32 Boolsche Variablen in meinen Structs habe und anschließend diese 32 Bits als DWORD mit INVD und UD behandeln möchte.
Müsste ich dafür dann von jedem 32 Bit Paket zuerst ein UDT -Paket schnüren?
Ich hoffe, mein Anfrage ist halbwegs nachvollziehbar und Danke schon mal und VGe
Stefan
In meinen alten SIEMENS Step7 Classic Projekten haben ich mithilfe eines FCs von einem Doppelwort gleichzeitig durch Invertierung INVD und Bitvergleich UD 32 positive und negative Flanken erzeugt. Das war sehr nützlich, da man im Vergleich zum bit-Befehl PF und NF deutlich Zykluszeit spart und automatisch von allen Boolschen Prozessvariablen die pos u neg Flanken zur Vefügung hat. Die globalen DBs waren in Classic fest absolut adressiert und aufgebaut.
In dem globalen DB gab es 4 structs: X (Bool) , FP_X, FN_X und HM_X (Flanken-Hilfsmerker). Die Variablen i d 4 Structs waren identisch und jedes struct 20 Byte lang.

Der o.g. FC hat über seine Bausteinschnittstelle den global DB und die als INT jeweils die Adresse des Doppelwortes im DB abgefragt (zB 4, 24, 44 und 64), worin die 32 Bits standen von denen die Flankenauswertung gemacht werden sollte:
so sah der alte STEP7 FC aus:
//--------------------------------------------------
AUF #DBe_Datenbaustein
//--------------------------------------------------
// Adresse, wo die Flanken gebildet werden sollen
L #Ie_STATUS_Adr
SLW 3
LAR1
// Hilfsmerkeradresse
L #Ie_HM_Adr
SLW 3
LAR2
//--------------------------------------------------
// Bilden der positiven Flanke
L DBD [AR1,P#0.0]
L DBD [AR2,P#0.0]
INVD
UD
T #DWt_FP_Status_Val
// Bilden der negativen Flanke
L DBD [AR2,P#0.0]
L DBD [AR1,P#0.0]
INVD
UD
T #DWt_FN_Status_Val
// aktuellen Status in Hilfsmerker schreiben
L DBD [AR1,P#0.0]
T DBD [AR2,P#0.0]
// schreiben der pos. Flanke in entsprechende Pos in DB
L #Ie_FP_Adr
SLW 3
LAR1
L #DWt_FP_Status_Val
T DBD [AR1,P#0.0]
//schreiben der neg. Flanke in entsprechende Pos in DB
L #Ie_FN_Adr
SLW 3
LAR1
L #DWt_FN_Status_Val
T DBD [AR1,P#0.0]
//--------------------------------------------------
Das Ganze hat uns 2 Jahrzehnte lang wunderbar die Arbeit beim Flankenauswerten erleichtert.
Dann kam TIA mit der dynamischen und symbolischen Adressverwaltung, was ja auch gut ist.
Ich habe es dann mal probiert den FC mit der Bausteinschnittstelle DB_ANY zu erstellen.
In meiner Not habe ich dafür den optimierten Bausteinzugriff abgeschaltet.

Da hat der Compiler aber brav gemeckert, da fehlt mir wohl noch die TIA Übung.
Nun meine Frage

1) Wie kann ich das jeweilige Doppelwort im global DB (ohne opt. Speicherzugriff) verpointert übergeben ?
2) Wie kann ich das Problem mit optimierten Bausteinzugriff lösen?
Symbolisch ist schwierig, da ich 32 Boolsche Variablen in meinen Structs habe und anschließend diese 32 Bits als DWORD mit INVD und UD behandeln möchte.
Müsste ich dafür dann von jedem 32 Bit Paket zuerst ein UDT -Paket schnüren?
Ich hoffe, mein Anfrage ist halbwegs nachvollziehbar und Danke schon mal und VGe
Stefan