IO-Link Kommunikation per S7comm

Hans54216

Level-1
Beiträge
340
Reaktionspunkte
11
Ich hab mit dem Thema schon in meinem alten Thread angefangen. Auf Wunsch von Thomas_v2.1 hier nun die Abspaltung des Themas in einen eigenen Thread.


Thema:
Mit dem Siemens S7-PCT Tool (Step7 v5 oder Step7 v10-16 (TIA)) kann die Siemens IO-Link Master Baugruppe auf einer ET200 (ProfiBus/ProfiNet) parametriert werden und auch die Daten der Angeschlossenen Sensoren ausgelesen werden. Interessant dabei ist, dass das Programmiergerät (PC) lediglich per Netzwerk mit der Steuerung (in meinem Fall eine 840d sl (NCU 730.3 PN mit einer 317F-3 PN/DP)) verbunden ist.


Es gibt bereits von einigen Herstellern Software die mit ProfiNet IO-Link Mastern kommunizieren, wobei das ProfiNet-Netzwerk dabei als "normales" TCP/IP Netz verwendet wird. Damit ist jedoch kein Zugriff auf ProfiBus Master oder auf die Siemens ET200 Master möglich.
Was jedoch immer funktioniert ist der klassische Weg über die PLC. Dies hat jedoch einen Großen Programmieraufwand + Parametrieraufwand zur Folge. Auch ist der Speicher der PLC recht begrenzt.


Ich habe mir daraufhin die Kommunikation der S7-PCT Tools angesehen und darin s7comm Pakete entdeckt. Da ich zusammen mit dem Thomas_v2.1 schon die NC Kommunikation in die LibNoDave integriert habe ist das Ziel nun auch den IO-Link Part mit aufzunehmen.




Verlauf aus dem Thema "DotNetSiemensPLCToolBoxLibrary (LibNoDave) Zugriff auf Dual-Port RAM / FB15"


DotNetSiemensPLCToolBoxLibrary (LibNoDave) Zugriff auf Dual-Port RAM / FB15














Die Angaben Index und Subindex und den Wert in der Antwort findet sich wieder. Das entspricht aber nicht dem Aufbau aus dem IO-Link PDF. Es scheint, das ist eine Mixtur aus IO-Link Standard und einem Eigengewächs drumherum.




 
Zuletzt bearbeitet:

Hab mal verschiedene Startadressen für den IO-Link Master vergeben.
E264 (alte Konstellation), E300, E500, E3300, E10000
Anhang anzeigen Eingangsadresstest_20200524.rar



PCT-Tool ist auch in TIA und S7-1200 und S7-1500 weiter im Einsatz.

ET200 IO-Link Masterbaugruppe ist sowie so noch nicht so alt und hat mit der PLC erstmal nicht zu tun. Einzige ist, dass bei S7-1500 sicher S7commPlus zum Einsatz kommt.

Noch funktioniert aber das gute alte S7comm ja auch mit den neuen PLCs und in der NC Welt wird die 300 eh noch ne weile im Einsatz sein, da die neue Sinumerik One und TIA aktuell ne rechte Krankheit sind.
 
Macht so wie ich das sehe auch keinen Unterschied, oder ist nur eine einzige IO-Link Baugruppe erlaubt?
Ich habe dir mal eine Wireshark Testversion gebaut in der ein paar Feldwerte angezeigt werden.
 
Mach morgen mal ne Erweiterung zu meinem Testaufbau. Zusätzliche ET200, weitere IO-Link Master und mehr Sensoren.
 
Was es übrigens auch noch gibt, ist die Funktion READREC in S7comm. Das wird z.B. verwendet wenn du eine PN-CPU hast und dort den Zustand der Netzwerkports abfragst. Ich habe noch nicht getestet ob das generell bei allen Baugruppen möglich ist, aber da die Siemens Bausteine laut Doku den READREC intern verwenden (müsste man mal reingucken), lässt sich das vlt. selber aus ein paar READREC Aufrufen nachstellen. Dann solltest du zumindest ein paar Werte lesen können. Das ist relativ einfach und von den Parametern her auf dem Netzwerk fast identisch zum READREC Aufruf aus dem SPS-Programm heraus.
 
Wie muss man das mit dem ReadRec angehen? Wie du richtig schreibst wird in der PLC der SFB52/SFB53 (RDREC/WRREC) verwendet.
Es ist jedoch auch zu beachten ob dann die Begrenzung der PLC Zutrifft. Bei manchen PLCs darf nur ein SFB (denk es war der RDREC/WRREC) aktiv sein.
 
Für RDREC benötigst du die ID und die Baugruppenadresse, genau so wie beim Aufruf aus dem SPS-Programm. Ich habe ein rudimentäres Python Programm mit dem ich die Funktion ausführen kann, mit dem ich ein paar Fehlaufrufe ausgetestet habe. Wenn du Python hast dann kannst du das damit mal ausprobieren.
Wie gesagt, ich weiß nicht ob damit generell alles gelesen werden kann, oder nur die für Profinet relevanten Datensätze. Ich denke mal das wird bei IO-Link auch nur funktionieren, wenn die Daten mit einem einzigen RDREC Aufruf zurückkommen.
 
Für RDREC benötigst du die ID und die Baugruppenadresse, genau so wie beim Aufruf aus dem SPS-Programm.
Hab mir den IO-Link Baustein gerade angesehen. Ist recht unübersichtlicher AWL Coder der aus einer SCL Quelle generiert ist.

Soweit ich das gesehen habe wird nur der RDREC/RDREC für ProfiBus (sollte auch für ProfiNet funktionieren) verwendet. Mit der Angabe des Index/Subindex wird über ein paar Schleifen die Länge berechnet und ein paar Daten im Instanz-DB rum kopiert.


Ich habe ein rudimentäres Python Programm mit dem ich die Funktion ausführen kann, mit dem ich ein paar Fehlaufrufe ausgetestet habe. Wenn du Python hast dann kannst du das damit mal ausprobieren.
Kannst du mir das Programm zukommen lassen?
 
Ich hänge die Python Testfunktion einmal an. Die Antworten werden nicht angezeigt, das müsstest du dir in Wireshark ansehen. In der s7-rdrec.py musst du die IP-Adresse, vermutlich den TSAP und dann die ID und die Diagnoseadresse anpassen. Die ID 0xf841 oder 0xf831 sollten bei einer PN-CPU auf die Diagnoseadresse der PN-Schnittstelle funktionieren.
 

Anhänge

  • py-rdrec-test.zip
    2,7 KB · Aufrufe: 6
Also bei deinen Aufzeichnungen wird f402 verwendet, also 0xf4, 0x02.
Das erste Byte ist die Verbindungsressource, im zweiten Byte ist Rack/Slot eincodiert. Hier Rack 0, Slot 2. Was bei dir die Ressource 0xf4 bedeutet kann ich nicht sagen, ich kenne nur 1, 2, 3 oder für projektierte Verbindungen ab 0x10.
 
Problem war scheinbar der Virenscanner.
Habs jetzt in ner VM ausgeführt und folgende Ergebnisse erhalten

#IO-Link
#Index 227
#ID=Adresse 300
resp = s7.sendReadrec(227, 0x12C)

Antwort: Invalid address (0x05)

Anhang anzeigen rdrec_20200526.rar
 
Zuletzt bearbeitet:
Ich kann das letzte rar nicht entpacken.

Scheint so als ließe sich der RDREC nicht für beliebige Datensätze über S7comm nutzen, oder das funktioniert nicht mit jeder CPU. Funktioniert das mit dem RDREC Aufruf aus dem SPS-Programm heraus denn so einfach? Dann frage ich mir warum Siemens da noch einen Baustein drumherumbauen musste.

Aber wenn RDREC nicht geht, dann müssen wir wohl doch noch bei der anderen Variante gucken ob wir dahinterkommen.
 
Ich kann das letzte rar nicht entpacken.

Hier als Zip.

Anhang anzeigen rdrec_20200526.zip

In der PLC funktioniert der RDREC. Wird ja wie ich gestern bereits geschrieben hab im IO-Link Baustein verwendet.
Siemens hat den Baustein drum rum, um die gelesenen Daten zusammen zu kopieren oder um z.B. eine Offset zu berechnen.


Code:
      SET   
      SAVE  
      =     L     26.1
      U     #R_TRIG_REQ_old
      NOT   
      U     #REQ
      =     #R_TRIG_REQ
      U     #REQ
      =     #R_TRIG_REQ_old
      L     #sequencecontrol
      L     0
      ==I   
      U     #R_TRIG_REQ
      SPBN  A7d0
      CLR   
      =     #DONE_VALID
      SET   
      =     #BUSY
      CLR   
      =     #ERROR
      L     DW#16#0
      T     #STATUS
      T     #SF_STATUS
      L     L#0
      T     #LENGTH
      T     #segment
      T     #address
      T     #totallength
      U     #RD_WR
      SPBN  A7d1
      L     2
      T     #typeofrequest
      L     DW#16#10022800
      T     LD    32
      L     DIW [AR2,P#22.0]
      T     LW    36
      L     DID [AR2,P#24.0]
      T     LD    38
      L     DW#16#10022800
      T     LD    42
      L     DINO
      T     LW    46
      TAR2  
      +     L#6544
      T     LD    48
      TAR2  LD    28
      UC    SFC   20
            P#L 32.0
            P#L 0.0
            P#L 42.0
      LAR2  LD    28
      L     #RetVal_BLKMOV
      SPA   A7d2
A7d1: L     1
      T     #typeofrequest
      L     0
      T     #i
A7d3: L     #i
      L     10239
      <=I   
      SPBN  A7d2
      L     #i
      ITD   
      L     L#0
      +D    
      L     L#8
      *D    
      TAR2  
      +D    
      L     B#16#0
      TAK   
      LAR1  
      TAK   
      T     DIB [AR1,P#818.0]
      L     #i
      L     1
      +I    
      T     #i
      SPA   A7d3
A7d2: L     1
      T     #sequencecontrol
      SPA   A7d5
A7d0: CLR   
A7d5: L     #sequencecontrol
      L     1
      TAK   
      ==I   
      T     LW    32
      SPB   A7d7
      SPA   A7d8
A7d7: L     B#16#1
      T     #rec.reset.ExtendedFunctionNum
      L     DW#16#FFFFFFFF
      T     #rec.reset.SequenceNo
      L     DW#16#FF
      T     #STATUS
      L     2
      T     #sequencecontrol
      SPA   A7d6
A7d8: L     2
      L     LW    32
      ==I   
      SPB   A7d9
      SPA   A7da
A7d9: SET   
      =     #WRREC_Function.REQ
      L     #ID
      T     #WRREC_Function.ID
      L     #index
      T     #WRREC_Function.INDEX
      L     6
      T     #WRREC_Function.LEN
      L     DW#16#100200F0
      T     DID [AR2,P#72.0]
      L     DINO
      T     DIW [AR2,P#76.0]
      TAR2  
      +     L#784
      T     DID [AR2,P#78.0]
      +AR2  P#56.0
      UC    SFB   53
      +AR2  P#8136.0
      U     #WRREC_Function.DONE
      =     #wrrec_if.done
      U     #WRREC_Function.BUSY
      =     #wrrec_if.busy
      U     #WRREC_Function.ERROR
      =     #wrrec_if.error
      L     #WRREC_Function.STATUS
      T     #wrrec_if.status
      U     #wrrec_if.done
      SPBN  A7db
      L     #wrrec_if.status
      T     #SF_STATUS
      L     3
      T     #sequencecontrol
      SPA   A7d6
A7db: CLR   
      U     #wrrec_if.error
      L     #rdrec_if.status
      L     DW#16#DF80B000
      =     L     26.2
      ==D   
      U     L     26.2
      SPBN  A7dd
      SET   
      =     #ERROR
      L     DW#16#30000
      T     #STATUS
      L     #rdrec_if.status
      T     #SF_STATUS
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7dd: CLR   
      U     #wrrec_if.error
      SPBN  A7de
      SET   
      =     #ERROR
      L     DW#16#30000
      T     #STATUS
      L     #wrrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7de: SPA   A7d6
A7da: L     3
      L     LW    32
      ==I   
      SPB   A7df
      SPA   A7e0
A7df: CLR   
      =     #WRREC_Function.REQ
      L     #ID
      T     #WRREC_Function.ID
      L     #index
      T     #WRREC_Function.INDEX
      L     6
      T     #WRREC_Function.LEN
      L     DW#16#100200F0
      T     DID [AR2,P#72.0]
      L     DINO
      T     DIW [AR2,P#76.0]
      TAR2  
      +     L#784
      T     DID [AR2,P#78.0]
      +AR2  P#56.0
      UC    SFB   53
      +AR2  P#8136.0
      U     #WRREC_Function.DONE
      =     #wrrec_if.done
      U     #WRREC_Function.BUSY
      =     #wrrec_if.busy
      U     #WRREC_Function.ERROR
      =     #wrrec_if.error
      L     #WRREC_Function.STATUS
      T     #wrrec_if.status
      U     #wrrec_if.done
      NOT   
      SPBN  A7e1
      L     DW#16#FF
      T     #STATUS
      L     4
      T     #sequencecontrol
      SPA   A7d6
A7e1: CLR   
      U     #wrrec_if.error
      SPBN  A7e3
      SET   
      =     #ERROR
      L     #wrrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7e3: SPA   A7d6
A7e0: L     4
      L     LW    32
      ==I   
      SPB   A7e4
      SPA   A7e5
A7e4: L     #typeofrequest
      L     1
      ==I   
      SPBN  A7e6
      L     DW#16#100FF
      T     #STATUS
      L     10
      T     #sequencecontrol
      SPA   A7d6
A7e6: L     #typeofrequest
      L     2
      ==I   
      SPBN  A7e8
      L     DW#16#200FF
      T     #STATUS
      L     20
      T     #sequencecontrol
      SPA   A7d6
A7e8: SET   
      =     #ERROR
      L     DW#16#300FF
      T     #STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7e5: L     10
      L     LW    32
      ==I   
      SPB   A7e9
      SPA   A7ea
A7e9: SET   
      =     #RDREC_Function.REQ
      L     #ID
      T     #RDREC_Function.ID
      L     #index
      T     #RDREC_Function.INDEX
      L     240
      T     #RDREC_Function.MLEN
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      U     #RDREC_Function.VALID
      =     #rdrec_if.valid
      U     #RDREC_Function.BUSY
      =     #rdrec_if.busy
      U     #RDREC_Function.ERROR
      =     #rdrec_if.error
      L     #RDREC_Function.STATUS
      T     #rdrec_if.status
      L     #RDREC_Function.LEN
      T     #rdrec_if.length
      U     #rdrec_if.valid
      SPBN  A7eb
      L     #rdrec_if.length
      L     6
      >I    
      L     #rec.backup.ExtendedFunctionNum
      L     B#16#2
      =     L     26.2
      ==I   
      U     L     26.2
      SPBN  A7ec
      L     DW#16#10000
      L     #rec.backup.SequenceNo
      OD    
      T     #STATUS
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #rec.backup.SequenceNo
      T     #segment
      L     #rdrec_if.length
      L     6
      -I    
      T     #tmplength
      L     DW#16#100200EA
      T     LD    34
      L     DINO
      T     LW    38
      TAR2  
      +     L#2752
      T     LD    40
      L     LD    34
      T     LD     4
      L     LD    38
      T     LD     8
      L     LW    42
      T     LW    12
      L     #tmplength
      T     #ANYsource.length
      L     #address
      L     L#0
      +D    
      L     L#8
      *D    
      TAR2  
      +D    
      LAR1  
      L     DIB [AR1,P#818.0]
      TAK   
      T     LD    44
      TAK   
      L     DW#16#10020001
      T     LD    34
      L     DINO
      T     LW    38
      L     LD    44
      +     L#6544
      OD    DW#16#84000000
      T     LD    40
      L     LD    34
      T     LD    14
      L     LD    38
      T     LD    18
      L     LW    42
      T     LW    22
      L     #tmplength
      T     #ANYdestination.length
      L     LD     4
      T     LD    34
      L     LD     8
      T     LD    38
      L     LW    12
      T     LW    42
      L     LD    14
      T     LD    48
      L     LD    18
      T     LD    52
      L     LW    22
      T     LW    56
      TAR2  LD    28
      UC    SFC   20
            P#L 34.0
            P#L 0.0
            P#L 48.0
      LAR2  LD    28
      L     #RetVal_BLKMOV
      L     #RetVal_BLKMOV
      L     0
      <>I   
      SPBN  A7ed
      SET   
      =     #ERROR
      L     DW#16#110FF
      T     #STATUS
      L     #RetVal_BLKMOV
      UD    DW#16#FFFF
      T     #SF_STATUS
      L     99
      T     #sequencecontrol
      SPA   A7ee
A7ed: CLR   
A7ee: L     #tmplength
      ITD   
      L     #totallength
      +D    
      T     #totallength
      L     #tmplength
      ITD   
      L     #address
      +D    
      T     #address
      SPA   A7d6
A7ec: L     #rdrec_if.length
      L     6
      ==I   
      SPBN  A7f0
      L     DW#16#10022800
      T     LD    34
      L     DINO
      T     LW    38
      TAR2  
      +     L#6544
      T     LD    40
      L     LD    34
      T     LD     4
      L     LD    38
      T     LD     8
      L     LW    42
      T     LW    12
      L     W#16#2800
      T     #ANYsource.length
      L     DW#16#10022800
      T     LD    34
      L     DIW [AR2,P#22.0]
      T     LW    38
      L     DID [AR2,P#24.0]
      T     LD    40
      L     LD    34
      T     LD    14
      L     LD    38
      T     LD    18
      L     LW    42
      T     LW    22
      L     W#16#2800
      T     #ANYdestination.length
      L     LD     4
      T     LD    34
      L     LD     8
      T     LD    38
      L     LW    12
      T     LW    42
      L     LD    14
      T     LD    48
      L     LD    18
      T     LD    52
      L     LW    22
      T     LW    56
      TAR2  LD    28
      UC    SFC   20
            P#L 34.0
            P#L 0.0
            P#L 48.0
      LAR2  LD    28
      L     #RetVal_BLKMOV
      L     #RetVal_BLKMOV
      L     0
      <>I   
      SPBN  A7f1
      SET   
      =     #ERROR
      L     DW#16#110FF
      T     #STATUS
      L     #RetVal_BLKMOV
      UD    DW#16#FFFF
      T     #SF_STATUS
      L     99
      T     #sequencecontrol
      SPA   A7f2
A7f1: CLR   
A7f2: SET   
      =     #DONE_VALID
      CLR   
      =     #BUSY
      =     #ERROR
      L     DW#16#10000
      L     #rec.backup.SequenceNo
      OD    
      T     #STATUS
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #totallength
      T     #LENGTH
      L     11
      T     #sequencecontrol
      SPA   A7d6
A7f0: SPA   A7d6
A7eb: CLR   
      U     #rdrec_if.error
      SPBN  A7f4
      CLR   
      =     #DONE_VALID
      =     #BUSY
      SET   
      =     #ERROR
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #rdrec_if.length
      ITD   
      T     #LENGTH
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7f4: SPA   A7d6
A7ea: L     11
      L     LW    32
      ==I   
      SPB   A7f5
      SPA   A7f6
A7f5: CLR   
      =     #RDREC_Function.REQ
      L     #ID
      T     #RDREC_Function.ID
      L     #index
      T     #RDREC_Function.INDEX
      L     240
      T     #RDREC_Function.MLEN
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      U     #RDREC_Function.VALID
      =     #rdrec_if.valid
      U     #RDREC_Function.BUSY
      =     #rdrec_if.busy
      U     #RDREC_Function.ERROR
      =     #rdrec_if.error
      L     #RDREC_Function.STATUS
      T     #rdrec_if.status
      L     #RDREC_Function.LEN
      T     #rdrec_if.length
      U     #rdrec_if.valid
      NOT   
      SPBN  A7f7
      L     98
      T     #sequencecontrol
      SPA   A7d6
A7f7: CLR   
      U     #rdrec_if.error
      SPBN  A7f9
      CLR   
      =     #DONE_VALID
      =     #BUSY
      SET   
      =     #ERROR
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #rdrec_if.length
      ITD   
      T     #LENGTH
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7f9: SPA   A7d6
A7f6: L     20
      L     LW    32
      ==I   
      SPB   A7fa
      SPA   A7fb
A7fa: L     B#16#1
      T     #rec.restore.ExtendedFunctionNum
      L     #segment
      T     #rec.restore.SequenceNo
      L     DW#16#20000
      L     #rec.restore.SequenceNo
      OD    
      T     #STATUS
      L     #address
      L     L#0
      +D    
      L     L#8
      *D    
      TAR2  
      +D    
      LAR1  
      L     DIB [AR1,P#818.0]
      TAK   
      T     LD    48
      TAK   
      L     DW#16#10020001
      T     LD    34
      L     DINO
      T     LW    38
      L     LD    48
      +     L#6544
      OD    DW#16#84000000
      T     LD    40
      L     LD    34
      T     LD     4
      L     LD    38
      T     LD     8
      L     LW    42
      T     LW    12
      L     W#16#EA
      T     #ANYsource.length
      L     DW#16#100200EA
      T     LD    34
      L     DINO
      T     LW    38
      TAR2  
      +     L#4672
      T     LD    40
      L     LD    34
      T     LD    14
      L     LD    38
      T     LD    18
      L     LW    42
      T     LW    22
      L     W#16#EA
      T     #ANYdestination.length
      L     LD     4
      T     LD    34
      L     LD     8
      T     LD    38
      L     LW    12
      T     LW    42
      L     LD    14
      T     LD    52
      L     LD    18
      T     LD    56
      L     LW    22
      T     LW    60
      TAR2  LD    28
      UC    SFC   20
            P#L 34.0
            P#L 0.0
            P#L 52.0
      LAR2  LD    28
      L     #RetVal_BLKMOV
      L     #RetVal_BLKMOV
      L     0
      <>I   
      SPBN  A7fc
      SET   
      =     #ERROR
      L     #RetVal_BLKMOV
      UD    DW#16#FFFF
      T     #SF_STATUS
      L     99
      T     #sequencecontrol
      SPA   A7d6
A7fc: L     21
      T     #sequencecontrol
      SPA   A7d6
A7fb: L     21
      L     LW    32
      ==I   
      SPB   A7fe
      SPA   A7ff
A7fe: SET   
      =     #WRREC_Function.REQ
      L     #ID
      T     #WRREC_Function.ID
      L     #index
      T     #WRREC_Function.INDEX
      L     240
      T     #WRREC_Function.LEN
      L     DW#16#100200F0
      T     DID [AR2,P#72.0]
      L     DINO
      T     DIW [AR2,P#76.0]
      TAR2  
      +     L#4624
      T     DID [AR2,P#78.0]
      +AR2  P#56.0
      UC    SFB   53
      +AR2  P#8136.0
      U     #WRREC_Function.DONE
      =     #wrrec_if.done
      U     #WRREC_Function.BUSY
      =     #wrrec_if.busy
      U     #WRREC_Function.ERROR
      =     #wrrec_if.error
      L     #WRREC_Function.STATUS
      T     #wrrec_if.status
      U     #wrrec_if.done
      SPBN  A800
      L     #totallength
      L     L#234
      +D    
      T     #totallength
      L     #wrrec_if.status
      T     #SF_STATUS
      L     22
      T     #sequencecontrol
      SPA   A7d6
A800: CLR   
      U     #wrrec_if.error
      SPBN  A802
      SET   
      =     #ERROR
      L     #wrrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A802: SPA   A7d6
A7ff: L     22
      L     LW    32
      ==I   
      SPB   A803
      SPA   A804
A803: CLR   
      =     #WRREC_Function.REQ
      L     #ID
      T     #WRREC_Function.ID
      L     #index
      T     #WRREC_Function.INDEX
      L     240
      T     #WRREC_Function.LEN
      L     DW#16#100200F0
      T     DID [AR2,P#72.0]
      L     DINO
      T     DIW [AR2,P#76.0]
      TAR2  
      +     L#4624
      T     DID [AR2,P#78.0]
      +AR2  P#56.0
      UC    SFB   53
      +AR2  P#8136.0
      U     #WRREC_Function.DONE
      =     #wrrec_if.done
      U     #WRREC_Function.BUSY
      =     #wrrec_if.busy
      U     #WRREC_Function.ERROR
      =     #wrrec_if.error
      L     #WRREC_Function.STATUS
      T     #wrrec_if.status
      U     #wrrec_if.done
      NOT   
      SPBN  A805
      L     #wrrec_if.status
      T     #SF_STATUS
      L     23
      T     #sequencecontrol
      SPA   A7d6
A805: CLR   
      U     #wrrec_if.error
      SPBN  A807
      SET   
      =     #ERROR
      L     #wrrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A807: SPA   A7d6
A804: L     23
      L     LW    32
      ==I   
      SPB   A808
      SPA   A809
A808: SET   
      =     #RDREC_Function.REQ
      L     #ID
      T     #RDREC_Function.ID
      L     #index
      T     #RDREC_Function.INDEX
      L     240
      T     #RDREC_Function.MLEN
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      U     #RDREC_Function.VALID
      =     #rdrec_if.valid
      U     #RDREC_Function.BUSY
      =     #rdrec_if.busy
      U     #RDREC_Function.ERROR
      =     #rdrec_if.error
      L     #RDREC_Function.STATUS
      T     #rdrec_if.status
      L     #RDREC_Function.LEN
      T     #rdrec_if.length
      U     #rdrec_if.valid
      L     #rec.backup.ExtendedFunctionNum
      L     B#16#2
      =     L     26.2
      ==I   
      U     L     26.2
      SPBN  A80a
      L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF01
      ==D   
      SPBN  A80b
      L     #segment
      L     L#1
      +D    
      T     #segment
      L     #address
      L     L#234
      +D    
      T     #address
      L     DW#16#FFFFFF01
      T     #STATUS
      L     24
      T     #sequencecontrol
      SPA   A7d6
A80b: L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF02
      ==D   
      SPBN  A80d
      L     #segment
      L     L#1
      +D    
      T     #segment
      L     #address
      L     L#234
      +D    
      T     #address
      L     DW#16#FFFFFF02
      T     #STATUS
      L     24
      T     #sequencecontrol
      SPA   A7d6
A80d: L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF03
      ==D   
      SPBN  A80e
      T     #STATUS
      L     25
      T     #sequencecontrol
      SPA   A7d6
A80e: L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF04
      ==D   
      SPBN  A80f
      SET   
      =     #ERROR
      T     #STATUS
      L     99
      T     #sequencecontrol
      SPA   A7d6
A80f: L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF05
      ==D   
      SPBN  A810
      SET   
      =     #ERROR
      T     #STATUS
      L     99
      T     #sequencecontrol
      SPA   A7d6
A810: L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF06
      ==D   
      SPBN  A811
      SET   
      =     #ERROR
      T     #STATUS
      L     99
      T     #sequencecontrol
      SPA   A7d6
A811: L     #rec.backup.SequenceNo
      L     DW#16#FFFFFF07
      ==D   
      SPBN  A812
      SET   
      =     #ERROR
      T     #STATUS
      L     99
      T     #sequencecontrol
      SPA   A7d6
A812: SPA   A7d6
A80a: CLR   
      U     #rdrec_if.error
      SPBN  A814
      SET   
      =     #ERROR
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A814: SPA   A7d6
A809: L     24
      L     LW    32
      ==I   
      SPB   A815
      SPA   A816
A815: CLR   
      =     #RDREC_Function.REQ
      L     #ID
      T     #RDREC_Function.ID
      L     #index
      T     #RDREC_Function.INDEX
      L     240
      T     #RDREC_Function.MLEN
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      U     #RDREC_Function.VALID
      =     #rdrec_if.valid
      U     #RDREC_Function.BUSY
      =     #rdrec_if.busy
      U     #RDREC_Function.ERROR
      =     #rdrec_if.error
      L     #RDREC_Function.STATUS
      T     #rdrec_if.status
      L     #RDREC_Function.LEN
      T     #rdrec_if.length
      U     #rdrec_if.valid
      NOT   
      SPBN  A817
      L     20
      T     #sequencecontrol
      SPA   A7d6
A817: CLR   
      U     #rdrec_if.error
      SPBN  A819
      SET   
      =     #ERROR
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A819: SPA   A7d6
A816: L     25
      L     LW    32
      ==I   
      SPB   A81a
      SPA   A81b
A81a: CLR   
      =     #RDREC_Function.REQ
      L     #ID
      T     #RDREC_Function.ID
      L     #index
      T     #RDREC_Function.INDEX
      L     240
      T     #RDREC_Function.MLEN
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      U     #RDREC_Function.VALID
      =     #rdrec_if.valid
      U     #RDREC_Function.BUSY
      =     #rdrec_if.busy
      U     #RDREC_Function.ERROR
      =     #rdrec_if.error
      L     #RDREC_Function.STATUS
      T     #rdrec_if.status
      L     #RDREC_Function.LEN
      T     #rdrec_if.length
      U     #rdrec_if.valid
      NOT   
      SPBN  A81c
      SET   
      =     #DONE_VALID
      CLR   
      =     #BUSY
      =     #ERROR
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #totallength
      T     #LENGTH
      L     98
      T     #sequencecontrol
      SPA   A7d6
A81c: CLR   
      U     #rdrec_if.error
      SPBN  A81e
      SET   
      =     #ERROR
      L     #rdrec_if.status
      T     #SF_STATUS
      L     #sequencecontrol
      T     #errorTrigger
      L     99
      T     #sequencecontrol
      SPA   A7d6
A81e: SPA   A7d6
A81b: L     98
      L     LW    32
      ==I   
      SPB   A81f
      SPA   A820
A81f: CLR   
      =     #RDREC_Function.REQ
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      CLR   
      =     #WRREC_Function.REQ
      +AR2  P#56.0
      UC    SFB   53
      +AR2  P#8136.0
      U     #REQ
      NOT   
      SPBN  A7d6
      CLR   
      =     #DONE_VALID
      L     DW#16#0
      T     #STATUS
      T     #SF_STATUS
      L     L#0
      T     #LENGTH
      L     0
      T     #sequencecontrol
      T     #typeofrequest
      SPA   A7d6
A820: L     99
      L     LW    32
      ==I   
      SPB   A822
      SPA   A823
A822: CLR   
      =     #RDREC_Function.REQ
      L     DW#16#100200F0
      T     DID [AR2,P#46.0]
      L     DINO
      T     DIW [AR2,P#50.0]
      TAR2  
      +     L#2704
      T     DID [AR2,P#52.0]
      +AR2  P#28.0
      UC    SFB   52
      +AR2  P#8164.0
      CLR   
      =     #WRREC_Function.REQ
      +AR2  P#56.0
      UC    SFB   53
      +AR2  P#8136.0
      CLR   
      =     #DONE_VALID
      =     #BUSY
      L     L#0
      T     #LENGTH
      L     0
      T     #sequencecontrol
      T     #typeofrequest
      SPA   A7d6
A823: CLR   
A7d6: CLR   
      U     L     26.1
      SAVE  
      BE
 
Zuletzt bearbeitet:
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…