回复:局部变量用于上升沿一例

我心依旧555

  • 帖子

    769
  • 精华

    9
  • 被关注

    34

论坛等级:奇侠

注册时间:2009-09-12

普通 普通 如何晋级?

发布于 2011-06-13 10:21:56

19楼

Automann大哥,关于此问题我从来就未说到过“提倡”、“鼓励”、“建议” 这样用的字眼,何来叫人走这条路。我想说的是其"可用"并"合法"。
quote: 边沿存储位的确允许使用L区,但是请注意,块的局部变量区(L区)中有静态变量和临时变量,允许用L区并不说明用临时变量作边沿存储位的合法性.


希望下面的例子能证明我的观点
下面的例子是西门子标准功能FC19的源程序,用于数控系统810D及上的标准面板程序,搞过西门子数据系统的应该熟悉,其合法性、正确性、权威性不言而喻吧。如果有兴趣可搜索程序里的FP,应该可以确认用的是临时变量吧。再如果有进一步兴趣我们可以讨论其实现的可能性(结论也许是不过如此)
FUNCTION "MCP_IFM" : VOID
TITLE =
AUTHOR : NUMERIK
FAMILY : _800D
NAME : MCP_IFM
VERSION : 6.1
CODE_VERSION1


VAR_INPUT
BAGNo : BYTE ; // BAG-Nr in die die BA uebertragen werden
ChanNo : BYTE ; // Kanal-Nr in den die Signale uebertragen werden
SpindleIFNo : BYTE ; // Nummer der Achsnahtstelle die Spindel ist
END_VAR
VAR_OUTPUT
FeedHold : BOOL ; //Vorschub Halt selbsthaltend
SpindleHold : BOOL ; //Spindel Halt selbsthaltend
END_VAR
VAR_TEMP
schmier : ARRAY [0 .. 15 ] OF BOOL ; //Schmierzellen fuer Flanken *
richtung : BYTE ; //Richtungstasten + EilgangUeberlagerung
richtung2 : BYTE ;
richtung3 : BYTE ; //dummy
achs_nr : BYTE ; //aktuell angewaehlte Achsnr. von MST
bb : ARRAY [0 .. 15 ] OF BOOL ; //BAG-Anwahlen
akt_db : WORD ; // Achtung, vorher Absolutzugriffe (*) !!!
max_bag : WORD ; // Reihenfolge ist wichtig
max_kan : WORD ;
max_axe : WORD ;
mst_ein01 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Eingaenge 0.0..1.7 * (lb12)
mst_ein23 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Eingaenge 2.0..3.7
mst_ein45 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Eingaenge 4.0..5.7
mst_ein67 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Eingaenge 6.0..7.7
mst_aus01 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Ausgaenge 0.0..1.7
mst_aus23 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Ausgaenge 2.0..3.7
mst_aus45 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Ausgaenge 4.0..5.7
mst_aus67 : ARRAY [0 .. 15 ] OF BOOL ; //temporaere Ausgaenge 6.0..7.7 *
loop_c : WORD ; //loop counter
increment : BYTE ; //Maschinenfunktion INC Vorgabe
ba_inc : BYTE ; //Maschinenfunktion INC Rueckmeldung
param : INT ;
Poi_Aus : DWORD ; //Pointer Ausgaenge
MCP_db : WORD ; //Maschinensteuer DB
BAGN : BYTE ; //BAG No
mksaxisold : BYTE ; //Achsno old if new axis sel.
DB8Offs : DWORD ;
mkschange : BOOL ; //changed
wksold : BOOL ; //wks old
mstt2 : BOOL ;
vskorr : BYTE ;
END_VAR
BEGIN
NETWORK
TITLE =INC inputs in mode group area active
///NETZWERK Eingang
L "gp_par".MaxBAG; //maximale Anzahl der BAGs
T #max_bag;
L "gp_par".MaxChan; //maximale Anzahl der Kanaele
T #max_kan;
L "gp_par".MaxAxis; //maximale Anzahl Achsen + Spindeln
T #max_axe; //Umladen GP-Parameter in lokale Variablen

L #BAGNo;
PUSH ;
AW W#16#F;
T #BAGN; //BAG Nummer bilden
POP ;
AW W#16#F0;
SET ;
JZ e001;
S #mstt2;
LAR2 P#62.0; //Offset im DB8 f. 2. MCP
LAR1 "gp_par".MCP2_Poi; //Maschinensteuertafel 2
JU e002;
e001: R #mstt2;
LAR2 P#0.0; //Offset im DB8 f. 1. MCP
LAR1 "gp_par".MCP1_Poi; //Maschinensteuertafel 1
e002: TAR2 #DB8Offs; //retten des Offsets
OPN DI 8;
L DIW [AR2,P#0.0];
T LW 0; //Schmierzellen (Schmier) = Flankenmerker *
L DIB [AR2,P#3.0];
T #achs_nr; //holen des alten Zustandes Achsnr.
A DIX 1.7; //First Run absolut
= #schmier[15]; //kopieren
//
L DBW [AR1,P#0.0]; //DB-Nr. der MSTT
T #MCP_db;
L DBD [AR1,P#8.0]; //Pointer auf Ausgaenge
T #Poi_Aus;
L DBD [AR1,P#2.0]; //Pointer auf Eingaenge
LAR1 ;
OPN DB [#MCP_db]; //aufschlagen des DB fuer MST
LAR2 P##mst_ein01; //Adresse mst_ein laden (Var_temp Datum) !!!
//AR2 wird im gesamten Baustein als Zeiger
//verwendet

L D [AR1,P#0.0]; //Laden der Bytes 0 - 3 der MST
T LD [AR2,P#0.0]; //Abspeichern in temp. Speicher mst_ein
L D [AR1,P#4.0]; //Laden der Bytes 4 - 7 der MST
T LD [AR2,P#4.0];
LAR1 #Poi_Aus; //bereichsuebergreifende Adresse der MST Ausgaenge
L D [AR1,P#0.0]; //Laden der AusgangsBytes 8 - 11 der MST
T LD [AR2,P#8.0]; //Abspeichern in temp. Speicher mst_aus
L W [AR1,P#4.0]; //Laden der Bytes 12 - 13 der MST
T LW [AR2,P#12.0];
A DIX 45.0; //neuer Hochlauf Mimik
JCN e100;
A #mstt2;
JC e099;
= #mst_ein45[3]; //1. Achse anwaehlen
e099: = #schmier[0]; //Vorschub Halt setzen
= #schmier[1]; //Spindel Halt setzen
S "NC".A_IncInModeGroup; //INC Anwahl in BAG Interface
e100: R #mkschange;
L B#16#0;
T #ba_inc;
T #mksaxisold; //keine MKS Achse zu deaktivieren
T #richtung;
///NETZWERK Global_ein
L LB [AR2,P#1.0]; //Betriebsarten INC MST
AW W#16#3F; //kontinuierlich Achse ruecksetzen
T #increment; //INC Achse / Kanal
//
L LB [AR2,P#3.0]; //Vorschub-Override (mst_ein3)
AW W#16#1F; //ueberfluessiges ausblenden
T #vskorr;
A #schmier[7]; //First Run Merker
JC n001; //NC Bearbeitung
//
A #mst_aus23[13]; //WKS
= #wksold;
A #mst_ein45[12]; //Taste MKS/WKS-Umschaltung Maschinensteuertafel
FP #schmier[3];
JCN mks1;
S #mkschange;
AN #mst_aus23[13]; //LED MKS/WKS
= #mst_aus23[13];
//angewaehlte Achsnr. wird 0
L #achs_nr;
JU mks2;
mks1: L LW [AR2,P#4.0]; //mst_ein45 laden
AW W#16#EE7; //maskieren aller Achsanwahl Tasten
L #achs_nr; //veraendert nicht die Anzeigebits
JZ kea2;
mks2: A #wksold;
JC mks4;
T #mksaxisold; //alte gewaehlte Achse retten
mks4: L LD [AR2,P#10.0]; //ab mst_aus23 laden
AD DW#16#8F31FEFF; //Loeschen aller Achs LED fuer Anzeige
T LD [AR2,P#10.0];
A #mkschange;
JC kea1;
A #mst_aus23[13]; //LED MKS/WKS
JC wks3;
LAR1 P#8.0; //Axis table for MCP1
AN #mstt2;
JC ke90;
LAR1 P#32.0; //Axis table for MCP2
ke90: OPN DI 10; //DB for Axis Table
L DIW [AR1,P#22.0]; //maxaxis for MCP1, MCP2
OW W#16#0;
JN wks4; //if not zero
L #max_axe; //max. Anzahl Maschinenachsen
JU wks4;
kea2: L LB [AR2,P#4.0]; //mst_ein45;
AW W#16#E0;
T #richtung; //Richtungstasten + EilgangUeberlagerung
JU kea3;
wks3: L B#16#3; //max. Anzahl GEO-achsen
wks4: JL m009;
JU keae; //Accu = 0
JU m001;
JU m002;
JU m003;
JU m004;
JU m005;
JU m006;
JU m007;
JU m008;
JU m009;
m009: A #mst_ein45[10]; //Anwahltaste 9
S #mst_aus23[11]; //LED 9.-Achse
L B#16#9; //fuer Achs-Nummer
JC keae;
m008: A #mst_ein45[9]; //Anwahltaste 8
S #mst_aus23[10]; //LED 8.-Achse
L B#16#8;
JC keae;
m007: A #mst_ein45[1]; //Anwahltaste 7
S #mst_aus23[4]; //LED 7.-Achse
L B#16#7;
JC keae;
m006: A #mst_ein45[8]; //Anwahltaste 6
S #mst_aus23[9]; //LED 6.-Achse
L B#16#6;
JC keae;
m005: A #mst_ein45[13]; //Anwahltaste 5
S #mst_aus23[14]; //LED 5.-Achse
L B#16#5;
JC keae;
m004: A #mst_ein45[2]; //Anwahltaste 4
S #mst_aus23[5]; //LED 4.-Achse
L B#16#4;
JC keae;
m003: A #mst_ein45[14]; //Anwahltaste Z
S #mst_aus23[15]; //LED Z-Achse
L B#16#3;
JC keae;
m002: A #mst_ein45[15]; //Anwahltaste Y
S #mst_aus45[0]; //LED Y-Achse
L B#16#2;
JC keae;
m001: A #mst_ein45[3]; //Anwahltaste X
S #mst_aus23[6]; //LED X-Achse
L B#16#1;
JC keae;
kea1: L B#16#0; //keine gueltige Achse angewaehlt
JU ke99;
keae: A #mst_aus23[13]; //LED MKS/WKS
JC ke99;
DEC 1;
SLW 3; //Accu to Pointer
+AR1 ;
OPN DI 10; //DB for Axis Table
L DIB [AR1,P#0.0]; //Axis table for MCP1 or MCP2
ke99: T #achs_nr;
kea3: A #mst_ein45[6]; //Richtung minus
= #mst_aus23[7]; //LED
A #mst_ein45[7]; //Richtung plus
= #mst_aus23[8]; //LED
///NETZWERK NC
n001: A #schmier[15]; //First run absolut
JC e010;
OPN DI 10; //Signale von PLC an NCK
A #mst_ein23[7]; //Schluesselschalterstellung 0 MST
= DIX 56.4; //Schluesselschalterstellung 0 DB
A #mst_ein23[14]; //Schluesselschalterstellung 1 MST
= DIX 56.5; //Schluesselschalterstellung 1 DB
A #mst_ein23[6]; //Schluesselschalterstellung 2 MST
= DIX 56.6; //Schluesselschalterstellung 2 DB
A #mst_ein45[4]; //Schluesselschalterstellung 3 MST
= DIX 56.7; //Schluesselschalterstellung 3 DB
///NETZWERK BAG
e010: L B#16#1;
T #param; //als Fehlerparameter
L #max_bag; //Grundprogrammparameter max.Anzahl der BAGs
L #BAGN; //angewaehlte BAG-Nr.
OW W#16#0;
JZ KBAG; //springe bei BAG-Nr. = 0
JC fehl;
DEC 1; //Nr der BAG - 1
L P#20.0; //20 Byte Offset
*I ;
LAR1 ; //Zeiger auf BAG
OPN DI 11; //BAG DB aufschlagen
//umverdrahten
A #mst_ein01[0]; //Betriebsart Automatik MST
= #bb[0]; //Automatik anwaehlen
A #mst_ein01[1]; //Betriebsart MDA MST
= #bb[1]; //MDA anwaehlen
A #mst_ein01[3]; //Betriebsart JOG MST
= #bb[2]; //JOG anwaehlen
A #mst_ein01[15]; //Betriebsart REPOS MST
= #bb[9]; //REPOS anwaehlen
A #mst_ein01[14]; //Betriebsart REF MST
= #bb[10]; //REF anwaehlen
A #mst_ein01[2]; //Maschinenfunktion Teach In MST
= #bb[8]; //Teach In anwaehlen
L DIW [AR1,P#0.0];
AW W#16#F8F8;
L LW 6; //bb als Wort laden
AW W#16#707;
OW ;
T DIW [AR1,P#0.0]; //in BAG Schnittstelle
//
L DIW [AR1,P#6.0]; //aus BAG Schnittstelle
T LW 6; //bb als Wort laden
A #bb[0]; //Automatik aktiv
= #mst_aus01[0]; //Automatik LED MST
A #bb[1]; //MDA aktiv
= #mst_aus01[1]; //MDA LED MST
A #bb[2]; //JOG aktiv
= #mst_aus01[3]; //JOG LED MST
A #bb[9]; //REPOS aktiv
= #mst_aus01[11]; //REPOS LED MST
A #bb[10]; //REF aktiv
= #mst_aus01[10]; //REF LED MST
A #bb[8]; //Teach In aktiv
= #mst_aus01[2]; //Teach In LED MST
L #increment; //INC Achse / Kanal dieser BAG
T DIB [AR1,P#2.0]; //INC

///TITLE = NETZWERK Kanal
KBAG: L B#16#2;
T #param; //als Fehlerparameter
L #max_kan; //Grundprogrammparameter max.Anzahl der KANs
L #ChanNo; //angewaehlte KAN-Nr.
OW W#16#0;
JZ KKAN; //springe bei KAN-Nr. = 0
JC fehl;
INC 20; //angewaehlte KAN-DB
T #akt_db; //KANAL DB
OPN DI [#akt_db]; //aufschlagen KANAL DB mit akt_db
AN #mst_aus23[13]; //LED MKS/WKS
JC g002;
L DIB 41; //aktives INC GEO-Achse1 im Kanal
L DIB 47;
OW ;
L DIB 53;
OW ;
T #ba_inc; //Maschinenfunktion lokal
g002: L B#16#3; //max. Anzahl GEO Achsen
g001: T #loop_c; //in loop counter
DEC 1;
SLW 5; //* P#4.0
LAR1 ; //jetzt ins Adressregister
L #loop_c;
L #achs_nr;
<>I ;
L B#16#0;
JC mks;
AN #mst_aus23[13]; //LED MKS/WKS
JC mks;
A #schmier[7]; //First Run Merker
JC mks;
L #richtung; //lokale Richtungen
mks: L DIB [AR1,P#12.0]; //lade Byte mit Richtungsvorgabe
AW W#16#1F; //Richtung und Eilgang raus
OW ;
T DIB [AR1,P#12.0]; //und zurueck mit geloeschten Richtungen
L #loop_c; //Loop counter in Accu
LOOP g001;
L #vskorr; //Vorschub-Override (mst_ein3)
T DIB 4; //in Kanal-DB Vorschubkorr. transferieren
A #mst_ein23[1]; //NC-Start
= DIX 7.1; //NC-Start im Kanal
AN #mst_ein23[0]; //NC-Stop
= DIX 7.3; //NC-Stop im Kanal
A #mst_ein23[15]; //Reset
= DIX 7.7; //Reset im Kanal
A DIX 35.0; //Programm laeuft im Kanal
= #mst_aus01[13]; //LED NC-Start
A DIX 35.3; //Programm unterbrochen im Kanal
O DIX 35.2; //angehalten
= #mst_aus01[12]; //LED NC-Stop
A #mst_ein23[13]; //Einzelsatz
FP #schmier[4];
JCN KKAN;
AN DIX 0.4;
= DIX 0.4; //Einzelsatz fuer Kanal
= #schmier[2];
KKAN: AN #schmier[7];
JC KKA1;
A #schmier[2];
= DIX 0.4;
KKA1: A DIX 0.4;
= #mst_aus23[2]; //LED Einzelsatz
///TITLE = NETZWERK Spindel
L #max_axe; //max.Anzahl der Achsen / Spindeln
L #SpindleIFNo; //angewaehlte Spindel
OW W#16#0;
JZ KSPI; //springe bei Spindel-Nr. = 0
JC KSPI;
INC 30; //Achs-DB Nr. bilden
T #akt_db; //lokales word
OPN DI [#akt_db]; //aktueller Achs-DB
L LB [AR2,P#0.0]; //mst_ein01 byte 0 Spindelkorrekturschalter
SRW 4;
T DIB 19; //Spindelkorrekturschalter

///NETZWERK Achsen
KSPI: A #schmier[7]; //First Run Merker
JC e020;

L #mksaxisold; //alte angew. Achse
OW W#16#0;
JZ KDAX; //springe bei Nr. = 0
INC 30; //Achs-DB Nr. bilden
T #akt_db; //lokales word
OPN DI [#akt_db]; //aktueller Achs-DB
SET ;
R DIX 4.6; //minus
R DIX 4.7; //plus
JU a102;
//
KDAX: A #mst_aus23[13]; //LED MKS/WKS
JC a103; //jump to Label a104 is better
L #achs_nr;
OW W#16#0;
JZ a103;
INC 30; //Achs-DB Nr. bilden
T #akt_db; //lokales word
OPN DI [#akt_db]; //aktueller Achs-DB
L #vskorr; //Vorschubkorrekturschalter mst_ein23 byte 1
T DIB 0; //Vorschubkorrekturschalter
L #richtung; //lokale Richtungstasten + EilgangUeberlagerung
L DIB 4; //lade Byte mit Richtungsvorgabe
AW W#16#1F; //Richtung und Eilgang raus
OW ; //verknuepfen
T DIB 4; //und zurueck mit Richtungszustand
a102: L #ba_inc;
L DIB 65; //Nahtstelle Maschinenfunktion INC Achse Rueckmeldung
OW ;
T #ba_inc;

a103: A #mstt2; //2. MCP ?
JC a104;
L #max_axe; //this part is for compatibily only
l001: T #loop_c;
INC 30;
T #akt_db;
OPN DI [#akt_db];
L #vskorr; //Vorschubkorrekturschalter mst_ein23 byte 1
T DIB 0; //Vorschubkorrekturschalter
L #loop_c;
LOOP l001;

///NETZWERK Global_aus
a104: A #mst_ein23[3]; //Vorschub Start
R #schmier[0]; //Vorschubsperre
AN #mst_ein23[2]; //Vorschub Halt
S #schmier[0]; //Vorschubsperre
A #schmier[0]; //Vorschubsperre
= #FeedHold; //an VAR_OUTPUT zurueck
= #mst_aus01[14]; //LED Vorschub Halt
NOT ; //LED Vorschub Halt
= #mst_aus01[15]; //LED Vorschub Start
A #mst_ein23[5]; //Spindel Start
R #schmier[1]; //Spindel Halt
AN #mst_ein23[4]; //Spindel Halt
S #schmier[1]; //Spindel Halt
A #schmier[1]; //Spindel Halt
= #SpindleHold; //an VAR_OUTPUT zurueck
= #mst_aus23[0]; //LED Spindel Halt
NOT ; //Spindel Halt
= #mst_aus23[1]; //LED Spindel Start
L #ba_inc; //Maschinenfunktion INC
AW W#16#3F;
SLW 4;
CAW ; //byte Reihenfolge "little endian"
L LW [AR2,P#8.0]; //LED direkt angesteuert, mst_aus01
AW W#16#FFC; //INC bits ausblenden
OW ; //neue hinein
//LED INC MSST
T LW [AR2,P#8.0]; //LED direkt angesteuert, mst_aus01
///NETZWERK Ausgang
LAR1 #Poi_Aus; //bereichsuebergreifende Adresse der MST
OPN DB [#MCP_db]; //aufschlagen des DB fuer MST
L LD [AR2,P#8.0]; //Laden des temp. Speicher mst_aus
T D [AR1,P#0.0]; //Abspeichern der AusgangsBytes 8 - 11 der MST
L LW [AR2,P#12.0];
T W [AR1,P#4.0]; //Abspeichern der Bytes 12 - 13 der MST
e020: SET ;
S #schmier[7]; //First Run
LAR2 #DB8Offs;
OPN DB 8; //Daten fuer naechsten Zyklus retten
L LW 0; //Schmierzellen (schmier) = Flankenmerker *
T DBW [AR2,P#0.0];
L #achs_nr; //retten des Zustandes Achsnr.
T DBB [AR2,P#3.0];
S DBX 1.7;
BEU ;
fehl: CALL FC 20 (
Dekade12 := 40,//40 = FC, 41 = FB, 80 = Graph
Dekade34 := 19,//Baustein Nummer des Aufrufers
Dekade56 := #param,//Parameternummer
Zusatz := 0,//fuer ZustandsGraph
kommend := TRUE);

CALL SFC 46 ;//STS, Stop der PLC-CPU

END_FUNCTION

一切皆有可能
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54654条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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