dps7_s

velmat

  • 帖子

    84
  • 精华

    0
  • 被关注

    0

论坛等级:游民

注册时间:2003-06-06

普通 普通 如何晋级?

发布于 2003-12-09 13:05:37

0楼


IN
Name Type Comment
DBPA INT parameter-datablock
SYPA INT pointer to systemparameter in parameter-DB
SLPA INT pointer to slaveparameter in parameter-DB

TEMP
ret_value INT Fehlerwort des SFC15
db_parameter WORD Nummer des DB-Parameter
db_nutzdaten WORD Nummer des DB-Nutzdaten
ptr_dbpa WORD Zeiger im DB-Parameter
ptr_dbnd WORD Zeiger im DB-Nutzdaten
ptr_lw WORD Zeiger auf Lokaldatenwort
ptr_dw WORD Zeiger auf Datenwort
ptr_peri WORD Zeiger auf Peripherieadresse
adr_kstw WORD Adresse des Kommunikationssteuerworts
adr_kstw_2 WORD Adresse des Kommunikationssteuerworts 2
adr_anzw WORD Adresse des Anzeigenworts
adr_pkw_versuchszaehler WORD Adresse des PKW-Versuchszaehlers
adr_pafe WORD Adresse der Pafe 1/2 Bytes
adr_pke_ss WORD Adresse PKE im Zwischenspeicher
adr_index_ss WORD Adresse des alten Index
adr_pke_sendefach WORD Adresse PKE-Sendefach
adr_index_sendefach WORD Adresse des Index im Sendefach
adr_pwe_sendefach WORD Adresse PWE1 im Sendefach
adr_pwe_ss WORD Adresse PWE1 im Zwischenspeicher
ppo_typ WORD PPO-Typ
anzahl_bytes_pkw WORD Anzahl Bytes PKW-Bereich
anzahl_bytes_pzd WORD Anzahl Bytes PZD-Bereich
teilnehmernummer WORD Teilnehmernummer
startbyte_pkw WORD Startbyte PKW-Bereich
startbyte_pzd WORD Startbyte PZD-Bereich
auftragskennung WORD Auftragskennung
schleifenzaehler WORD Schleifenzaehler
array_auftrag BOOL Kennung: Array-Auftrag
Reserve1 DWORD Reserve
Reserve2 DWORD Reserve
Reserve3 DWORD Reserve
Reserve4 WORD Reserve
Basissendefach1 WORD Basissendefach
Basissendefach2 WORD Basissendefach
Basissendefach3 WORD Basissendefach
Basissendefach4 WORD Basissendefach
Basissendefach5 WORD Basissendefach
Basissendefach6 WORD Basissendefach
Basissendefach7 WORD Basissendefach
Basissendefach8 WORD Basissendefach
Basissendefach9 WORD Basissendefach
Basissendefach10 WORD Basissendefach
Basissendefach11 WORD Basissendefach
Basissendefach12 WORD Basissendefach
Basissendefach13 WORD Basissendefach
Basissendefach14 WORD Basissendefach

//DPS7_S
FC-Call
-------
This FC is to be called for each slave one time per cycle.

Function (Send)
---------------
This FC evaluates the communication-controlword and transmitts the telegram
into the periphery-area.

Input-values
------------
DBPA : number parameter-datablock
SYPA : pointer to systemparameter in parameter-DB 0..8172
SLPA : pointer to slaveparameter in parameter-DB
format: INT: possible values : 8..8180


Diagnosis
---------
Pafe2-byte in userdata-DB (communication-interface)
for the specified slave
datenwordaddress = "KSTW" + 8 (KSTW=communication-controlword)
Pafe2 : 2 no valid PPO-type

Permissible datablock-numbers
-----------------------------
CPU315-2DP: DB 1 - 127
CPU413-2DP: DB 1 - 511
CPU414-2DP: DB 1 - 1023

DB parameter: 6 datawords per slave + 4 datawords systemparameter
max. 682 slaves per DB --> length over all: 4096 datawords
DB userdata : PPO 1: 21 datawords/slave, max. 195 slaves/DB --> length over
all:
4095 datawords (DBW0 not used)
PPO 2: 29 datawords/slave, max. 141 slaves/DB --> length over
all:
4089 datawords (DBW0 not used)
PPO 3: 9 datawords/slave, max. 455 slaves/DB --> length over all:

4095 datawords (DBW0 not used)
PPO 4: 17 datawords/slave, max. 240 slaves/DB --> length over
all:
4080 datawords (DBW0 not used)
PPO 5: 37 datawords/slave, max. 110 slaves/DB --> length over
all:
4070 datawords (DBW0 not used)

Used flagwords
--------------
none

Used SFC
--------------
SFC 15 - "DPWR_DAT"

Network 1:
L #DBPA
T #db_parameter
OPN DB [#db_parameter] // DB Parametersaetze
L #SLPA
T #ptr_dbpa // Zeiger auf PPO-Typ
SLD 3
LAR1
L DBW [AR1,P#0.0]
T #ppo_typ // PPO-Typ
L #ptr_dbpa
+ 2
T #ptr_dbpa // Zeiger auf TNU
SLD 3
LAR1
L DBW [AR1,P#0.0]
T #teilnehmernummer
L #ptr_dbpa
+ 2
T #ptr_dbpa // Zeiger auf DBND
SLD 3
LAR1
L DBW [AR1,P#0.0]
T #db_nutzdaten // DB Nutzdaten
L #ptr_dbpa
+ 2
T #ptr_dbpa // Zeiger auf Adresse KSTW
SLD 3
LAR1
L DBW [AR1,P#0.0]
T #adr_kstw // Adresse KSTW
L #ptr_dbpa
+ 2
T #ptr_dbpa // Zeiger auf PPKW
SLD 3
LAR1
L DBW [AR1,P#0.0] // Startbyte PKW-Bereich
T #startbyte_pkw
L #ptr_dbpa
+ 2
T #ptr_dbpa // Zeiger auf PPZD
SLD 3
LAR1
L DBW [AR1,P#0.0] // Startbyte PZD-Bereich
T #startbyte_pzd
OPN DB [#db_nutzdaten] // DB Nutzdaten
L #adr_kstw // Adresse KSTW
+ 2
T #adr_kstw_2 // Adresse KSTW2
+ 2
T #adr_anzw // Adresse ANZW
+ 2
T #adr_pkw_versuchszaehler // Adresse PKW-Versuchszaehler
+ 2
T #adr_pafe // Adresse PAFE 1/2
+ 2
T #adr_pke_ss // Adresse PKE-SS (PPO 1, 2, 5)
+ 2
T #adr_index_ss // Adresse alter INDEX (PPO 1, 2, 5)
+ 2
T #adr_pwe_ss // Adresse altes PWE1 (PPO 1, 2, 5)
+ 4
T #adr_pke_sendefach // Adresse PKE-Sendefach (PPO 1, 2, 5)
+ 2
T #adr_index_sendefach // Adresse INDEX Sendefach (PPO 1, 2, 5)
+ 2
T #adr_pwe_sendefach // Adresse PWE1 Sendefach (PPO 1, 2, 5)
L #adr_pafe
SLD 3
LAR1
L 0
T DBB [AR1,P#1.0] // Pafe 2 loeschen
L 1 // PPO 1
L #ppo_typ
<>I
JC PPO2
L 4 // Anzahl Bytes PZD
L 8 // Anzahl Bytes PKW
JU TRAN
PPO2: L 2 // PPO 2
<>I
JC PPO3
L 12 // Anzahl Bytes PZD
L 8 // Anzahl Bytes PKW
JU TRAN
PPO3: L 3 // PPO 3
L #ppo_typ
<>I
JC PPO4
L 4 // Anzahl Bytes PZD
L 0 // Anzahl Bytes PKW
JU TRAN
PPO4: L 4 // PPO 4
<>I
JC PPO5
L 12 // Anzahl Bytes PZD
L 0 // Anzahl Bytes PKW
JU TRAN
PPO5: L 5 // PPO 5
L #ppo_typ
<>I
JC ANZ2
L 20 // Anzahl Bytes PZD
L 8 // Anzahl Bytes PKW
JU TRAN
ANZ2: L #ptr_dbnd
SLD 3
LAR1
L 2
T DBB [AR1,P#1.0] // Pafe 2
BEU // ==> ENDE
TRAN: T #anzahl_bytes_pkw
TAK
T #anzahl_bytes_pzd
Network 2:
L #anzahl_bytes_pkw // Kein PKW-Bereich (PPO3, PPO4)
L 0
==I
JC ENDE // ==> ENDE
L #adr_kstw // Adresse KSTW ins ADR1 zur Bitauswertung
SLD 3
LAR1
L #adr_kstw_2 // Adresse KSTW2 ins ADR2 zur Bitauswertung
SLD 3
LAR2
AN DBX [AR2,P#1.4] // keine SPM (KSTW2)
R DBX [AR1,P#1.1] // Quittung ohne vorh. SPM (KSTW)
JC PKW
AN DBX [AR1,P#1.1] // quittieren SPM (KSTW)
JC PKW
R DBX [AR1,P#1.1] // Quittierung loeschen (KSTW)
S DBX [AR2,P#1.3] // laeuft SPM (KSTW2)
R DBX [AR2,P#1.4] // loeschen SPM steht an (KSTW2)
L #adr_anzw // Adresse ANZW ins ADR2 zur Bitauswertung
SLD 3
LAR2
R DBX [AR2,P#1.5] // Anzw: SPM steht an (ANZW)
AN DBX [AR1,P#1.2] // SPM-Bit senden
= DBX [AR1,P#1.2] // invertieren
L #adr_pke_ss // Adresse PKE-SS ins ADR1 zur Bitauswertung
SLD 3
LAR1
L #adr_pke_sendefach // Adresse PKE-Sendefach ins ADR2 zur Bitauswertung
SLD 3
LAR2
= DBX [AR1,P#0.3] // + PKW -SS
= DBX [AR2,P#0.3] // + PKW -Sendefach
L #adr_pkw_versuchszaehler // Wiederholungszaehler loeschen
SLD 3
LAR1
L 0
T DBW [AR1,P#0.0]
JU ENDE
PKW: O DBX [AR2,P#1.3] // laeuft SPM (KSTW2)
O DBX [AR2,P#1.0] // laeuft PKW-Auftrag (KSTW2)
ON DBX [AR1,P#1.0] // Anstoss PKW (KSTW)
JC ENDE
L #adr_pke_sendefach // Adresse PKE-Sendefach ins ADR1
SLD 3
LAR1
L DBW [AR1,P#0.0] // neues PKE
SRW 12 // PNU und SPM-Bit ausblenden
T #auftragskennung // Auftragskennung retten
L #adr_anzw // Adresse ANZW ins ADR1 zur Bitauswertung
SLD 3
LAR1
AN DBX [AR1,P#1.2] // fertig mit Fehler (ANZW)
AN DBX [AR1,P#1.4] // PKW gestoert (ANZW)
AN DBX [AR1,P#1.1] // fertig ohne Fehler (ANZW)
O DBX [AR2,P#1.6] // Null-Auftrag beendet (KSTW2)
R DBX [AR2,P#1.6] // --> neuen Auftrag uebernehmen (KSTW2)
JC OK
L #adr_pke_ss // Adresse PKE-SS ins ADR1
SLD 3
LAR1
L #adr_pke_sendefach // Adresse PKE-Sendefach ins ADR2
SLD 3
LAR2
L DBW [AR1,P#0.0] // "alte" PKE
SLW 5 // alte PNU ausblenden + Spontanbit
L DBW [AR2,P#0.0] // "neue" PKE
SLW 5 // neue PNU ausblenden + Spontanbit
<>I
JC OK
O(
L 4 // indizierte Auftraege
L #auftragskennung // pruefen
==I // Auftragskennung 4,5,6,7,8,11,12
)
O(
L 5
==I
)
O(
L 6
L #auftragskennung
==I
)
O(
L 7
==I
)
O(
L 8
L #auftragskennung
==I
)
O(
L 11
==I
)
O(
L 12
L #auftragskennung
==I
)
= #array_auftrag // Array-Auftrag
AN #array_auftrag // Kein Array-Auftrag
JC NULL
L #adr_index_sendefach
SLD 3
LAR1
L #adr_index_ss
SLD 3
LAR2
L DBB [AR1,P#0.0] // "neuer" Index
L DBB [AR2,P#0.0] // "alter" Index
<>I // Index ungleich
JC OK
NULL: L #adr_anzw // Adresse ANZW ins ADR1 zur Bitauswertung
SLD 3
LAR1
L #adr_kstw_2 // Adresse KSTW2 ins ADR2 zur Bitauswertung
SLD 3
LAR2
S DBX [AR2,P#1.5] // "Nullauftrag" starten (KSTW2)
S DBX [AR2,P#1.0] // "laeuft" intern (KSTW2)
S DBX [AR1,P#1.0] // "laeuft" (ANZW)
R DBX [AR1,P#1.1] // Anzw: fertig ohne Fehler (ANZW)
R DBX [AR1,P#1.2] // fertig mit Fehler (ANZW)
L #adr_pke_ss // PKE-Zwischenspeicher loeschen
SLD 3
LAR1
L 0
T DBW [AR1,P#0.0] // PKE-Zwischenspeicher loeschen
L #adr_pke_sendefach // Adresse PKE-Sendefach ins ADR1 zur Bitauswertung
SLD 3
LAR1
A DBX [AR2,P#1.2] // SPM-Bit (KSTW2)
= DBX [AR1,P#0.3] // ins PKE-Sendefach uebernehmen
L #adr_pkw_versuchszaehler // Wiederholungszaehler loeschen
SLD 3
LAR1
L 0
T DBW [AR1,P#0.0]
JU ENDE
OK: L #adr_anzw // Adresse ANZW ins ADR1 zur Bitauswertung
SLD 3
LAR1
L #adr_kstw_2 // Adresse KSTW2 ins ADR2 zur Bitauswertung
SLD 3
LAR2
S DBX [AR2,P#1.0] // "laeuft" intern (KSTW2)
S DBX [AR1,P#1.0] // "laeuft" (ANZW)
R DBX [AR1,P#1.1] // Anzw: fertig ohne Fehler (ANZW)
R DBX [AR1,P#1.2] // fertig mit Fehler (ANZW)
L #adr_kstw // Adresse KSTW ins ADR1 zur Bitauswertung
SLD 3
LAR1
R DBX [AR1,P#1.0] // Anstoss loeschen (KSTW)
L #adr_pke_sendefach // Adresse PKE-Sendefach ins ADR1 zur Bitauswertung
SLD 3
LAR1
A DBX [AR2,P#1.2] // SPM-Bit (KSTW2)
= DBX [AR1,P#0.3] // ins PKE-Sendefach uebernehmen
L #adr_pke_sendefach // gesamten PKW-Auftrag in Zwischenspeicher
SLD 3 // schreiben
LAR1
L #adr_pke_ss
SLD 3
LAR2
L DBD [AR1,P#0.0] // PKE-Sendefach und INDEX in
T DBD [AR2,P#0.0] // Zwischenspeicher schreiben
L #adr_pwe_sendefach
SLD 3
LAR1
L #adr_pwe_ss
SLD 3
LAR2
L DBD [AR1,P#0.0] // PWE1 u.PWE2 aus Sendefach in
T DBD [AR2,P#0.0] // Zwischenspeicher schreiben
L #adr_pkw_versuchszaehler // Wiederholungszaehler loeschen
SLD 3
LAR1
L 0
T DBW [AR1,P#0.0]
ENDE: NOP 0

Network 3:
L 2
T #schleifenzaehler // Schleifenzaehler
L 70
T #ptr_lw // Zaehler ab LW70
L #anzahl_bytes_pkw // Kein PKW-Bereich (PPO3, PPO4)
L 0
==I
L #adr_kstw // Adresse Anwender-Steuerwort
+ 10
JC SEND
L 78 // PZD-SS bei PPO 1/2/5
T #ptr_lw // ab LW78
L #adr_kstw // Adresse Anwendersteuerwort
+ 26
SEND: T #ptr_dw // Start-DW Sendefach,PPO-abhg.
SCHL: L #ptr_dw
SLD 3
LAR1
L #ptr_lw
SLW 3
LAR2
L DBW [AR1,P#0.0] // DW laden
T LW [AR2,P#0.0] // in Lokaldatenbereich schreiben
L #anzahl_bytes_pzd // Anzahl Bytes
L #schleifenzaehler
<=I
JC WEIT
+ 2 // Schleifenzaehler
T #schleifenzaehler
L #ptr_dw
+ 2 // Zeiger auf DW erhoehen
T #ptr_dw
L #ptr_lw
+ 2 // Zeiger auf LW erhoehen
T #ptr_lw
JU SCHL
WEIT: L #anzahl_bytes_pkw // Kein PKW-Bereich (PPO3, PPO4)
L 0
==I
JC PERI // Daten in Peripherie schreiben
L 2 // ==> 膎derung !!!!!!! <==
T #schleifenzaehler // Schleifenzaehler
L 70
T #ptr_lw // Zaehler ab LW70
L #adr_kstw
+ 10
T #ptr_dw // Start PKW-SS
LOOP: L #ptr_dw
SLD 3
LAR1
L #ptr_lw
SLW 3
LAR2
L DBW [AR1,P#0.0] // DW laden
T LW [AR2,P#0.0] // in Lokaldatenbereich schreiben
L #anzahl_bytes_pkw // PKW-SS uebertragen
L #schleifenzaehler
<=I
JC PERI // Daten in Peripherie schreiben
+ 2 // ==> 膎derung !!!!!!!! <==
T #schleifenzaehler
L #ptr_dw
+ 2 // Zeiger auf DW erhoehen
T #ptr_dw
L #ptr_lw
+ 2 // Zeiger auf LW erhoehen
T #ptr_lw
JU LOOP
PERI: L 1 // PPO 1
L #ppo_typ
<>I
JC PP2 // ==> naechster PPO-Typ
CALL SFC 15 // Block in Peripherie schreiben
LADDR :=#startbyte_pkw
RECORD :=P#L 70.0 BYTE 8 // Ab LW70 --> 8 Bytes
RET_VAL:=#ret_value
L #startbyte_pzd
SLD 3
LAR1
L LD 78 // 2 Bytes mit Lade/Transfer-Bef.
T PQD [AR1,P#0.0] // in Ausgangsperipherie schreiben
JU END
PP2: L 2 // PPO 2
<>I
JC PP3 // ==> naechster PPO-Typ
CALL SFC 15 // Block in Peripherie schreiben
LADDR :=#startbyte_pkw
RECORD :=P#L 70.0 BYTE 8 // Ab LW70 --> 8 Bytes
RET_VAL:=#ret_value
CALL SFC 15 // Block in Peripherie schreiben
LADDR :=#startbyte_pzd
RECORD :=P#L 78.0 BYTE 12 // Ab LW70 --> 12 Bytes
RET_VAL:=#ret_value
JU END
PP3: L 3 // PPO 3
L #ppo_typ
<>I
JC PP4 // ==> naechster PPO-Typ
L #startbyte_pzd
SLD 3
LAR1
L LD 70 // 2 Bytes mit Lade/Transfer-Bef.
T PQD [AR1,P#0.0] // in Ausgangsperipherie schreiben
JU END
PP4: L 4 // PPO 4
<>I
JC PP5 // ==> naechster PPO-Typ
CALL SFC 15 // Block in Peripherie schreiben
LADDR :=#startbyte_pzd
RECORD :=P#L 70.0 BYTE 12 // Ab LW70 --> 12 Bytes
RET_VAL:=#ret_value
JU END
PP5: L 5 // PPO 5
L #ppo_typ
<>I
JC END // ==> ENDE
CALL SFC 15 // Block in Peripherie schreiben
LADDR :=#startbyte_pkw
RECORD :=P#L 70.0 BYTE 8 // Ab LW70 --> 8 Bytes
RET_VAL:=#ret_value
L #startbyte_pzd
T #ptr_peri
CALL SFC 15 // Block in Peripherie schreiben
LADDR :=#startbyte_pzd
RECORD :=P#L 78.0 BYTE 20 // Ab LW78 --> 20 Bytes
RET_VAL:=#ret_value
END: BE
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

MasterDrives

共有5853条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。