Dann machst du einen zweiten pointer mit dem versatz 12 Byte.
Vorrausgesetzt es sind immer 12Byte
L 24
SLD 3
LAR1
AUF #DB_Nummer
un DBX [AR1,P#0.0]
= DBX [AR1,P#12.0]
//Pointer des Störbits ins Adressregister
L P##Stoerbit
LAR1
//Störung setzen
U #Stoerungs_ursache
S #Stoerbit
//Störung zurücksetzen
UN #Stoerungs_ursache
U [AR1,P#12.0]
R #Stoerbit
R [AR1,P#12.0]
Wenn du doch einen Pointer benutzt dann musst du doch auch den
Versatz wissen.
habe jetzt folgendes probiert, jedoch wird mir das quittierbit nicht mehr gesetzt im db
Code:L P##MELDUNG LAR1 U #QUITTIERUNG R #MELDUNG S [AR1,P#12.0] UN #MELDUNG R [AR1,P#12.0]
//Pointer der Stoerung ins Adressregister
L P##MELDUNG
LAR1
//Quittierbit setzen
U #QUITTIERUNG
S [AR1,P#12.0]
//Störung zurücksetzen
U [AR1,P#12.0]
UN #Meldung
R [AR1,P#12.0]
ach da hab ich dich eben mißverstanden ich dachte du Quittierst mit
dem OP, so wie du es da gemacht hast funktioniert es nicht, da du
dein Quittierbit Setzt und gleich wieder zurücksetzt.
Code://Pointer der Stoerung ins Adressregister L P##MELDUNG LAR1 //Quittierbit setzen U #QUITTIERUNG S [AR1,P#12.0] //Störung zurücksetzen U [AR1,P#12.0] UN #Meldung R [AR1,P#12.0]
L P##MELDUNG
LAR1
U #QUITTIERUNG
S [AR1,P#12.0]
FUNCTION "Auto_Quitt_Stoer" : VOID
TITLE =
//Autor: D.M.
//Datum: Oktober 2010
//Firma:
AUTHOR : MkD
VERSION : 0.1
VAR_INPUT
AutoQuitt : BOOL ; //Automatische Quittierung Einschalten
BYTES : INT ; //Bytelänge der Störmeldungen
END_VAR
VAR_IN_OUT
IN : POINTER ; //Startadresse Störmeldungen
END_VAR
VAR_TEMP
i : INT ;
AR1_temp : DWORD ;
AR2_temp : DWORD ;
temp_bereichszeiger : DWORD ;
temp_offset : INT ;
temp_DB_NR : INT ;
END_VAR
BEGIN
NETWORK
TITLE =Register sichern
TAR1 #AR1_temp;
TAR2 #AR2_temp;
NETWORK
TITLE =Startadresse auf DB kontrollieren
//----Erst einmal Pointer auf Datenbaustein kontrollieren
L P##IN; // Andresse des Eingangs- Bits, aus Pointer lesen
LAR1 ; // Adresspointer adressieren
L W [AR1,P#0.0]; // erstes Wort eines Pointers enthält DB-Nr.
T #temp_DB_NR;
L 0; // Wenn DB-Nr = 0, dann kein D sondern E/A/M
==I ;
SPB noDB;
AUF DB [#temp_DB_NR]; // Wenn DB-Nr <>0, dann DB öffnen
noDB: NOP 0;
NETWORK
TITLE =Startadresse als Pointer
L P##IN; // Startadresse (ANY)
LAR1 ;
L D [AR1,P#2.0]; // BYTE/BIT Adresse
T #temp_bereichszeiger;
NETWORK
TITLE =Offset zu Quittierbits bestimmen
L #BYTES;
L 8;
*I ;
T #temp_offset;
NETWORK
TITLE =Laden der Adressregister
//----Störmeldebereich
L #temp_bereichszeiger;
LAR1 ;
//----Quittierbereich = Störmeldebereich + Offset
L #temp_bereichszeiger;
LAR2 ;
L #temp_offset;
+AR2 ;
NETWORK
TITLE =Automatische Quittierung angewählt?
U #AutoQuitt;
SPBN m001;
NETWORK
TITLE =Automatische Quittierung angewählt
//----Schleifenlänge
L #BYTES;
L 8;
*I ;
//----Schleife--------------
next: T #i;
//Störung
U DBX [AR1,P#0.0];
R DBX [AR2,P#0.0];
//keine Störung
UN DBX [AR1,P#0.0];
S DBX [AR2,P#0.0];
//----Inkrementieren der Adressregister um 1 Bit
L P#0.1;
+AR1 ;
L P#0.1;
+AR2 ;
L #i;
LOOP next;
//---------------------------
SPB end;
NETWORK
TITLE =Automatische Quittierung abgewählt
m001: NOP 0;
//----Schleifenlänge
L #BYTES;
L 8;
*I ;
//----Schleife--------------
nxt: T #i;
//Alle Quittierbits Reset
SET ;
R DBX [AR2,P#0.0];
//----Inkrementieren der Adressregister um 1 Bit
L P#0.1;
+AR2 ;
L #i;
LOOP nxt;
//---------------------------
NETWORK
TITLE =Adressregister wiederherstellen
end: LAR1 #AR1_temp;
LAR2 #AR2_temp;
END_FUNCTION
TAR2 #AR2_temp
LAR2 #AR2_temp;
Hallo, in welcher Zeitzone lebst du den? ;-)Code://Autor: D.M. //Datum: Oktober 2010 //Firma: AUTHOR : MkD VERSION : 0.1
//Adressregister retten
TAR1 #dTempAR1
TAR2 #dTempAR2
//Adresse laden
TAR2 //AR2 in Akku
UD DW#16#FFFFFF //Bereichscodierung ausblenden
L P##Meldung //Stardadresse "Meldung"
+D
LAR1
...
...
deine Anweisungen, wie auch immer
...
...
//Adressregister wieder herstellen
LAR1 #dTempAR1
LAR2 #dTempAR2
Wenn du weiterhin ein Multiinstanzbaustein nutzen möchtest, hier ein
Beispiel wie du den Offset in der Instanz ausrechnen kannst:
Code://Adressregister retten TAR1 #dTempAR1 TAR2 #dTempAR2 //Adresse laden TAR2 //AR2 in Akku UD DW#16#FFFFFF //Bereichscodierung ausblenden L P##Meldung //Stardadresse "Meldung" +D LAR1 ... ... deine Anweisungen, wie auch immer ... ... //Adressregister wieder herstellen LAR1 #dTempAR1 LAR2 #dTempAR2
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?