IO-Link Kommunikation per S7comm

Hans54216

Level-1
Beiträge
340
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
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


Hab mir das PCT-Tool vom Step7 angesehen und das kann vom PC Step7 Manager unter Zuhilfenahme der Hardwarekonfig mit IO-Link Master Baugruppen auf der ET200 kommunizieren.
Bei meinem Versuchsaufbau hab ich an der 840d sl (PLC 317) eine ET200 per ProfiBus und auf dieser nen Siemens 4-Port IO-Link Master.


Hab mal die Kommunikation mit geschrieben.


Anhang anzeigen 49831


Ich hab noch mal nen schrieb von der Kommunikation gemacht und ein paar Screenshots der Übertragenen Werte.
Auch hab ich die IODD (Beschreibungsdatei IO-Link) auch mit rein gepackt.


Allgemein zu IO-Link:
vendorId = Eindeutige Herstellernummer (Global eindeutig)
deviceId = Eindeutige Gerätezuordnung (Herstellerspezifisch eindeutig)


Anhang anzeigen 49852


Das was da im Datenteil transportiert wird, scheint zumindest sehr speziell zu sein. Vom PCT werden öfters die gleichen Anfragen geschickt, aber in der Antwort kommt immer etwas anderes zurück. Das scheint auf den ersten Blick irgendwie zustandsabhängig zu sein was dort zurückkommt, oder es kann so etwas wie ein Verzeichnis gebrowst werden. Es gibt auch nur ganz selten mal eine Längenangabe vorab, der dann genau diese Anzahl an Bytes folgen.


Ich habe auch schon mal in die Spezifikation geschaut, auf den ersten Blick sehe ich da auch keine Anhaltspunkte. Mit wem spricht die PCT Software denn da, mit dem Master, oder gibt es auch Durchgriff auf die angeschlossenen Geräte?


PCT Tool muss, zumindest über den Master, mit dem Druckschalter IFM reden, da nur er die ganzen actual Daten hat.


IO-Link verfügt über Zyklische Prozessdaten zur PLC und einen Asynchronen Kommunikationskanal. Dieser Asynchrone Kommunikationskanal kann auch aus der PLC heraus genutzt werden um weitere Daten auszulesen oder z.B. Schaltpunke einzustellen.


Aufbau:
PC -> 840dsl (10.172.26.192) -> Slot? (2->PLC, 4->NC, 5->CP, 6->HMI) -> DP (Adresse 2) -> ET200 (Adresse 3) -> IO-Link Master (Steckplatz 8 ) -> Port1 -> Druckschalter


Ok, mit deinem letzten Logfile kommt man weiter, und es lässt sich ein Zusammenhang zur IO-Link Spezifikation herstellen.


Z.B. in #257 kommt die Seriennummer zurück. In #248 scheint dieser Datensatz vorselektiert zu werden, mit der 0x15 die sich am Ende findet. 0x15 ist laut Spec der Index für Serial-Number.


Passt auch mit #224 überein. Dort kommt der Produktname zurück, der in #216 mit 0x12 vorgewählt wird.


Es sieht so aus als müsste man vorher etwas anwählen und dann einen Ausführ-Befehl geben. Mal sehen ob der restliche Aufbau sich auch aus der IOL Spezifikation ableiten lässt.


Kann mir auch keinen Reim draus machen.


Hab noch mal ne Aufzeichnung gemacht. Diesmal hab ich in der Hardware Konfig den Parameter des IO-Link Masters auf "Ohne PCT" gestellt. Somit ist kein Download der Beschreibung erforderlich und andererseits kennt das PCT somit die Beschreibung nicht und zeigt nur die Empfangenen Parameter an.


Hab auch ein kleines Video vom PCT Tool mit angehängt.


Anhang anzeigen 49861


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.


Auf IO-Link Ebene wird so wie ich das gesehen habe viel mit einzelnen Bits, Nibbles und Bytes und hantiert um das Ganze effektiv zu halten. Das macht vermutlich kein Sinn das alles bis auf Master-Ebene durchzureichen. In den Nutzdaten auf Netzwerkebene stehen an vielen Stellen in einem Byte nur entweder eine 1 oder eine 0. Ich habe auch schon vermutet ob dort vlt. einzelne Bits in einem ganzen Byte untergebracht werden. Da fehlt aktuell der Startpunkt an dem sich ansetzen lässt. Das einzige was man sicher finden kann sind die Indizes/Subindizes und die Daten der Antwort.


CAP:
Siemens spezifisch: 227
Andere Hersteller (Master): 0xB400 (-19456)

ID: Adresse in der HW-Konfig
Anhang anzeigen 49872


Beispiel für den Sensorname Index 18
Anhang anzeigen 49871 Anhang anzeigen 49870



Hab noch nicht rausgefunden ob das mit dem PCT Tool überhaupt geht. Soweit ich sehe kann man nur die IODD zum Master schreiben/lesen und online nur die Parameter betrachten.
 
Zuletzt bearbeitet:
Soweit ich das sehe wird die CAP häufig nur zur Anfrage/Antwort-Kennung verwendet.
Die ID der Anfangsadresse der Baugruppe finde zumindest ich so wie ich das aktuell sehe nicht wieder. Da stellt sich die Frage, was macht das PCT wenn du mehrere IO-Link Baugruppen an einer CPU hast, wie werden diese angesprochen? Da hilft nur ausprobieren, Adressen ändern, laden, abfragen und prüfen ob und wo sich etwas ändert.

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


So wie es aussieht ist die Interpretation einiger Daten von vorigen Daten abhängig (kontextsensitiv), was es nicht leichter macht das Protokoll nachzuvollziehen.
Auch wenn ich IO-Link selber bisher nicht verwendet habe, könnte ich es mir schon nützlich vorstellen, diverse Diagnosedaten von extern abfragen zu können ohne das SPS-Programm anfassen zu müssen. Darum ist es vielleicht sinnvoll, alles zu diesen Thema in einen separaten Thread zu verschieben, da es mit NC ja nicht mehr direkt etwas zu tun hat. Wobei das mit der S7-300 ja auch alles "Legacy" Hardware ist.

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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab mal verschiedene Startadressen für den IO-Link Master vergeben.
E264 (alte Konstellation), E300, E500, E3300, E10000

Das macht überhaupt keinen Unterschied. Vielleicht läuft die Adressierung über Teilnehmernummer [3] und Steckplatz [8] wie es auch in PCT angezeigt wird.
 
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.
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

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.
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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

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 drum herumbauen musste.
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:
Zurück
Oben