dps7_v

velmat

  • 帖子

    84
  • 精华

    0
  • 被关注

    0

论坛等级:游民

注册时间:2003-06-06

普通 普通 如何晋级?

发布于 2003-12-09 13:06:12

0楼

IN
Name Type Comment
SANZ INT number of slaves
TNU1 INT busaddress of first slave
PPO INT PPO-type
DBND INT first DB-userdata
DBPA INT first DB-parameter
WDH INT number of PKW-task repetition
PANF INT pointer to periphery

OUT
ANZ BYTE fault-status-byte

TEMP
pointer_lokdat ANY Zeiger auf Lokaldaten des SFC21
db_parameter WORD Nummer des ersten DB-Parameter
db_nutzdaten WORD Nummer des DB-Nutzdaten
anzahl_slaves WORD Anzahl Slaves mit gleichem PPO-Typ
anzahl_slaves_dbnd WORD Anzahl Slaves pro DB-Nutzdaten
anzahl_by_nutzdatenblk WORD Anzahl Bytes des Nutzdatenblocks
anzahl_bytes_pkw WORD Anzahl Bytes des PKW-Bereichs
anzahl_bytes_pzd WORD Anzahl Bytes des PZD-Bereichs
adr_anwender_stw WORD Adresse Anwendersteuerwort
ptr_dbpa WORD Schreibzeiger im DB-Parameter
stationsnummer WORD Stationsnummer
startbyte_pkw WORD Startbyte PKW-Bereich
startbyte_pzd WORD Startbyte PZD-Bereich
zaehler_slaves_dbnd WORD Zaehler Slaves im DB-Nutzdaten
zaehler_slaves_dbpa WORD Zaehler Slaves im DB-Parameter
anzahl_db_create INT Anzahl DB-Parameter
anzahl_slaves_rest WORD Anzahl Slaves im letzten DBPA
nr_db_create WORD Zu erzeugender DB
count WORD SFC22: Anzahl Byte
ret_value INT SFC22: Fehlerwort
db_number WORD SFC22: Erzeugter DB
fuellmuster WORD SFC21: Fuellmuster beim DB-Loeschen

//DPS7_V
FC-Call
-------
This FC is to be called for each PPO-type per slave one time at restart.

Function
--------
The FC"DPS7_V" creates the DB-paramter and the DB-userdata,
furthermore the DB-parameter is initialized with presetvalues.

Input-values
------------
SANZ : number of slaves with same PPO-type
format INT: possible values : 1...64
TNU1 : first stationnumber
format INT: possible values : 3..125 and TNU1+SANZ <= 125
PPO : used PPO-type
format INT: possible values : 1..5
DBND : number of first DB-userdata
format INT
DBPA : number of first DB-parameter
format INT
WDH : number of PKW-task repetition, 0 <= WDH <= 32767
format INT
PANF : pointer to periphery
format INT
ANZ : fault-status-byte
format BYTE: 1: number of slaves <= 0
2: wrong PPO-type
3: DBPA to short
4: DBND to short
5: wrong stationnumber
6: periphery-area not sufficient
7: number of PKW-task repetition (permissible:0<=WDH<=32767)

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

Used SFC
--------
SFC 21 - "FILL"
SFC 22 - "CREAT_DB"
SFC 46 - "STOP"

Network 1:
L #DBPA // Nummer des 1.DB-Parameter in
T #db_parameter // Lokaldatenbereich schreiben
L #DBND // Nummer des 1.DB-Nutzdaten in
T #db_nutzdaten // Lokaldatenbereich schreiben
L 0
T #fuellmuster // DB's mit 0 vorbesetzen
T #ANZ // Anzeigebyte loeschen
L #SANZ // Anzahl Slaves > 0
<>I
JC WEIT // ==> Bearbeitung fortsetzen
L 1 // Anzahl Slaves <= 0
T #ANZ
JU END1 // ==> FEHLER
WEIT: T #anzahl_slaves // Anzahl Slaves gesamt
L 682 // Max. 682 Slaves in einem DBPA
/I
T #anzahl_db_create // Anzahl der zu erzeugenden DBPA
SRD 16
T #anzahl_slaves_rest // Anzahl Slaves im letzten DBPA
L #db_parameter
T #nr_db_create // Erster zu erzeugender DBPA
LOP1: L #anzahl_db_create
L 0
>I
L 682
T #count // zwischenspeichern
JC GEN1
TAK
L #anzahl_slaves_rest // keine restlichen Slaves vorhanden
>=I
JC PPO // Fertig ==> Auswertung PPO-Typ
T #count // zwischenspeichern
TAK
T #anzahl_slaves_rest // restliche Slaves = 0
GEN1: L #count
L 12
*I
L 8 // + 8Byte Systemparameter
+I
T #count // = Anzahl Bytes des DBPA
CALL SFC 22 // Erzeugung der DBPA
LOW_LIMIT:=#nr_db_create // 1.DBPA
UP_LIMIT :=#nr_db_create // Letzter DBPA
COUNT :=#count // Anzahl Bytes pro DBPA
RET_VAL :=#ret_value // Fehlerwort
DB_NUMBER:=#db_number // Wird nicht ausgewertet
L P##pointer_lokdat // Adresse von "pointer_lokdat" in AR1 laden
LAR1
L W#16#1002 // S7-Kennung (10H), Datentyp BYTE (02H)
T LW [AR1,P#0.0]
L #count // Wiederholungsfaktor (Anzahl Bytes)
T LW [AR1,P#2.0]
L #nr_db_create // DB-Nummer (DBPA)
T LW [AR1,P#4.0]
L W#16#8400 // Speicherbereich (DB = 84H), Start bei DW0
T LW [AR1,P#6.0]
L W#16#0 // Start bei DW0
T LW [AR1,P#8.0]
CALL SFC 21 // Loeschen des erzeugten DBPA
BVAL :=#fuellmuster
RET_VAL:=#ret_value
BLK :=#pointer_lokdat
L #ret_value
L 0
==I
JC NEX1 // kein Fehler ==> naechster DBPA
L 3 // Fehler bei Erzeugung DBPA
T #ANZ
JU END1 // ==> FEHLER
NEX1: L #anzahl_db_create
+ -1
T #anzahl_db_create
L #nr_db_create
+ 1
T #nr_db_create
JU LOP1 // ==> naechsten DBPA erzeugen
PPO: L 1 // PPO 1
L #PPO
<>I
JC PPO2
L 42 // Anzahl Bytes des Nutzdatenblocks
T #anzahl_by_nutzdatenblk
L 195 // Anzahl Slaves pro DB-Nutzdaten
T #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
L 8 // Anzahl Bytes des PKW-Bereichs
L 4 // Anzahl Bytes des PZD-Bereichs
JU SLAV
PPO2: L 2 // PPO 2
<>I
JC PPO3
L 58 // Anzahl Bytes des Nutzdatenblocks
T #anzahl_by_nutzdatenblk
L 141 // Anzahl Slaves pro DB-Nutzdaten
T #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
L 8 // Anzahl Bytes des PKW-Bereichs
L 12 // Anzahl Bytes des PZD-Bereichs
JU SLAV
PPO3: L 3 // PPO 3
L #PPO
<>I
JC PPO4
L 18 // Anzahl Bytes des Nutzdatenblocks
T #anzahl_by_nutzdatenblk
L 455 // Anzahl Slaves pro DB-Nutzdaten
T #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
L 0 // Anzahl Bytes des PKW-Bereichs
L 4 // Anzahl Bytes des PZD-Bereichs
JU SLAV
PPO4: L 4 // PPO 4
<>I
JC PPO5
L 34 // Anzahl Bytes des Nutzdatenblocks
T #anzahl_by_nutzdatenblk
L 240 // Anzahl Slaves pro DB-Nutzdaten
T #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
L 0 // Anzahl Bytes des PKW-Bereichs
L 12 // Anzahl Bytes des PZD-Bereichs
JU SLAV
PPO5: L 5 // PPO 5
L #PPO
<>I
JC ANZ2
L 74 // Anzahl Bytes des Nutzdatenblocks
T #anzahl_by_nutzdatenblk
L 110 // Anzahl Slaves pro DB-Nutzdaten
T #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
L 8 // Anzahl Bytes des PKW-Bereichs
L 20 // Anzahl Bytes des PZD-Bereichs
JU SLAV
ANZ2: L 2 // Fehler: unzulaessiger PPO-Typ
T #ANZ
JU END1 // ==> FEHLER
SLAV: T #anzahl_bytes_pzd // Anzahl Bytes des PZD-Bereichs
TAK
T #anzahl_bytes_pkw // Anzahl Bytes des PKW-Bereichs
L #anzahl_slaves // Anzahl Slaves
L #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
/I
T #anzahl_db_create // Anzahl der zu erzeugenden DBND
SRD 16
T #anzahl_slaves_rest // Anzahl Slaves im letzten DBND
L #db_nutzdaten
T #nr_db_create // Erster zu erzeugender DBND
LOP2: L #anzahl_db_create
L 0
>I
L #anzahl_slaves_dbnd // Anzahl Slaves pro DBND
T #count // zwischenspeichern
JC GEN2
TAK
L #anzahl_slaves_rest // keine restlichen Slaves vorhanden
>=I
JC STAT // Fertig ==> Auswertung Stationsnummer
T #count // zwischenspeichern
TAK
T #anzahl_slaves_rest // restliche Slaves = 0
GEN2: L #count // Anzahl Slaves pro DBND
L #anzahl_by_nutzdatenblk // Anzahl DW pro Nutzdatenblock
*I
L 2 // + 2 = Anzahl Bytes (DW 0 bleibt frei)
+I
T #count // = Anzahl Bytes des DBND
CALL SFC 22 // Erzeugung der DBND
LOW_LIMIT:=#nr_db_create // 1.DBND
UP_LIMIT :=#nr_db_create // Letzter DBND
COUNT :=#count // Anzahl Bytes pro DBND
RET_VAL :=#ret_value // Fehlerwort
DB_NUMBER:=#db_number // Wird nicht ausgewertet
L P##pointer_lokdat // Adresse von "pointer_dbnd" in AR1 laden
LAR1
L W#16#1002 // S7-Kennung (10H), Datentyp BYTE (02H)
T LW [AR1,P#0.0]
L #count // Wiederholungsfaktor (Anzahl Bytes)
T LW [AR1,P#2.0]
L #nr_db_create // DB-Nummer (DBND)
T LW [AR1,P#4.0]
L W#16#8400 // Speicherbereich (DB = 84H), Start bei DW0
T LW [AR1,P#6.0]
L W#16#0 // Start bei DW0
T LW [AR1,P#8.0]
CALL SFC 21 // Loeschen der erzeugten DBND
BVAL :=#fuellmuster // Pointer auf Quelle (mit Inhalt 0)
RET_VAL:=#ret_value // Wird nicht ausgewertet
BLK :=#pointer_lokdat // Pointer auf DBND im Lokaldatenbereich
L #ret_value
L 0
==I
JC NEX2 // kein Fehler ==> FERTIG
L 4 // Fehler bei Erzeugung DBND
T #ANZ
JU END1 // ==> FEHLER
NEX2: L #anzahl_db_create
+ -1
T #anzahl_db_create
L #nr_db_create
+ 1
T #nr_db_create
JU LOP2 // ==> naechsten DBND erzeugen
STAT: L #TNU1
L 3 // Start-Stationsnummer < 3
JC ANZ5
TAK
L #SANZ
+I // End-Stationsnummer > 125
L 125
<=I
JC END1
ANZ5: L 5 // Fehler bei Stationsnummer
T #ANZ
END1: NOP 0

Network 2:
L #ANZ // Fehler aufgetreten
L 0
<>I
JC END2 // ==> CPU in STOP setzen
L #TNU1 // Start Stationsnummer
+ -1
T #stationsnummer
L 2
L #anzahl_by_nutzdatenblk
-I
T #adr_anwender_stw // Vorbesetzen Adresse Anwendersteuerwort
L #PANF // PANF: Startbyte Peripherie-Bereich
L #anzahl_bytes_pkw
-I
L #anzahl_bytes_pzd
-I // Vorbesetzung Startbyte PKW-Bereich
T #startbyte_pkw // = Startbyte PKW - Anzahl Bytes PKW-Bereich
END2: NOP 0

Network 3:
L #ANZ // Fehler aufgetreten
L 0
<>I
JC STOP // ==> CPU in STOP setzen
L 0
T #zaehler_slaves_dbnd // Zaehler Slaves im DB Nutzdaten
LOP3: L 1
T #zaehler_slaves_dbpa // Zaehler Slaves im DB Parameter
OPN DB [#db_parameter] // Systemparameter
L 0
T DBD 0 // Reserve
T DBW 4 // Reserve
L 0
L #WDH
<=I
JC OK4
L 7 // kein negativer WDH zugelassen
T #ANZ
JU STOP // ==> CPU in STOP setzen
OK4: T DBW 6 // Wiederholungen PKW-Auftrag
L 6
T #ptr_dbpa // Zeiger im DB Parameter
SLA: L #ptr_dbpa
+ 2
T #ptr_dbpa
SLD 3
LAR1
L #PPO // PPO-Typ
T DBW [AR1,P#0.0]
L #stationsnummer // Stationsnummer + 1
+ 1
T #stationsnummer
L #ptr_dbpa
+ 2
T #ptr_dbpa
SLD 3
LAR1
L #stationsnummer
T DBW [AR1,P#0.0] // Stationsnummer
L #ptr_dbpa
+ 2
T #ptr_dbpa
L #zaehler_slaves_dbnd // Anzahl Slaves im DB Nutzdaten
+ 1
T #zaehler_slaves_dbnd
L #anzahl_slaves_dbnd // max. Anzahl Slaves
<=I
JC WEI
L #db_nutzdaten // Nr. DB Nutzdaten + 1
+ 1
T #db_nutzdaten
L 1 // Zaehler Slaves loeschen
T #zaehler_slaves_dbnd
L 2 // Startadresse Anwendersteuerwort
L #anzahl_by_nutzdatenblk // ermitteln
-I
T #adr_anwender_stw
WEI: L #ptr_dbpa
SLD 3
LAR1
L #db_nutzdaten
T DBW [AR1,P#0.0] // Nr. DB Nutzdaten
L #adr_anwender_stw // Adresse Anwendersteuerw. erhoeh.
L #anzahl_by_nutzdatenblk
+I
T #adr_anwender_stw
L #ptr_dbpa
+ 2
T #ptr_dbpa
SLD 3
LAR1
L #adr_anwender_stw
T DBW [AR1,P#0.0] // Adresse Anwendersteuerwort
L #startbyte_pkw // Startbyte PKW-Bereich
L #anzahl_bytes_pkw // + Anzahl Peripheriebytes PKW
+I
L #anzahl_bytes_pzd // + Anzahl Peripheriebytes PZD
+I
T #startbyte_pkw // = neues Startbyte PKW-Bereich
L #anzahl_bytes_pkw // Anzahl Peripheriebytes PKW
L #anzahl_bytes_pzd // + Anzahl Peripheriebytes PZD
+I // == Anzahl Peripheriebytes PPO-Typ
L 2047 // max. Adresse Peripherie
TAK
-I
L #startbyte_pkw // neues Startbyte PKW-Bereich
JC ANZ6 // ==> FEHLER: Peripherie-Bereich zu klein
L #startbyte_pkw // neues Startbyte PKW-Bereich
L #anzahl_bytes_pkw // + Anzahl Peripheriebytes PKW
+I
T #startbyte_pzd // neues Startbyte PZD-Bereich
JU TRAN
ANZ6: L 6 // Peripherie-Bereich zu klein
T #ANZ
JU STOP // ==> CPU in STOP setzen
TRAN: L #ptr_dbpa
+ 2
T #ptr_dbpa
SLD 3
LAR1
L #startbyte_pkw // neues Startbyte PKW-Bereich eintragen
T DBW [AR1,P#0.0] // PPKW: Startbyte
L #ptr_dbpa
+ 2
T #ptr_dbpa
SLD 3
LAR1
L #startbyte_pzd // neues Startbyte PZD-Bereich eintragen
T DBW [AR1,P#0.0] // PPZD: Startbyte
L #zaehler_slaves_dbpa
+ 1
T #zaehler_slaves_dbpa // Zaehler Slaves im DB Parameter
L #anzahl_slaves // Anzahl Slaves insgesamt
>I
BEC
L #zaehler_slaves_dbpa
L 682
<=I
JC SLA
L #anzahl_slaves // max. Anzahl Slaves - 682
+ -682
T #anzahl_slaves
L #db_parameter // Nr. DB Parameter + 1
+ 1
T #db_parameter
JU LOP3
STOP: CALL SFC 46 // CPU in STOP setzen
BE



评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

MasterDrives

共有5855条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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