Step 7 Move Befehl, Wert wird nicht sofort übernommen

B1798

Level-1
Beiträge
87
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

S7 318i und einen Siemens Posmo A Servomotor

ich habe mir die dazugehörigen Bausteine für Step7 und das HMI-Projekt von der Siemens Seite geladen.

ich kann im simulierten Panel vorwärts, rückwärts und Position fahren, aber wenn ich Referenzieren/ auf 0 Setzten möchte muss ich ca 10-20 mal auf den Button(M20.1) Referenzieren drücken bis er 0 setzt
ich habe es auch schon über einen Eingang(E0.1) versucht um die Übertragungszeit des Panels zu umgehen, aber es hat nichts gebracht.

im Baustein wird die Reverenz mit einem Move befehl übertragen

M20.1--- MOVE
out --- DB11.DBD10
0--- in


wenn ich mir die Variable simuliert ansehe und ich den Button drücke ist der Wert 0 aber wenn ich vom Butten runtergehe ist wieder der alte Wert (Position) drin.
wie gesagt wenn ich öfter drauf drücke funktioniert´s

hätte jemand eine Idee warum er den Wert nicht sofort übernimmt?
 
Netzwerk1
U "Start Posmo"
UN "Antrieb fährt"
UN "Fehler"
SPBN M1
L MW 110
T MW 112
M1: NOP 0

NW2
I_O_adress: Dezimale Adresse aus Step7 HW Konfig hier: 256
Initialization: ständige 1
Jogging_1: Tippen Schlitten auf
Jogging_2: Tippen Schlitten ab
Jogging override: optional auf 20 %
Start: Start Posmo MDI Schrittmaßfahrt absolut ( Flanke z.B. vom Starttaster)
No_intermediate_stop: immer 1
No_stop: immer 1
Quittieren: Flanke z.B. über Taster wenn Fehler
Override: optional 100 %
MDI velocity:eek:ptional 100 %
MDI acceleration: optional 100 %
MDI Position: Vorgabe der Zielposition als Real Format
Timer for wait: Freier Timer hier: T1
Koordination: Ein gleicher Merker für FB10 un FB11 ( wird von Bausteine
verändert)
Fault: Ausgang wenn Fehler = 1

U "VKE=1"
= L 12.0
BLD 103
U "Jog +"
= L 12.2
BLD 103
U "Jog -"
= L 12.3
BLD 103
U "Start Posmo"
= L 12.4
BLD 103
U "VKE=1"
= L 12.5
BLD 103
U "VKE=1"
= L 12.6
BLD 103
U "Quittieren"
= L 13.3
BLD 103
U "VKE=0"
= L 13.4
BLD 103
CALL FB 10 , DB10
I_O_adresss :=256
Initialization :=L12.0
Referencing :=
Jogging_1 :=L12.2
Jogging_2 :=L12.3
Jogging_override :=10
Start :=L12.4
No_intermediate_stop :=L12.5
No_stop :=L12.6
automatic_operation :=
external_blockchange :=
Read_in_enable :=
Brake_release :=
Fault_acknowledgement :=L13.3
Block_number :=B#16#3
Override :=100
Start_byte :=
MDI_type :=L13.4
MDI_velocity :="Geschw."
MDI_acceleration :=100
MDI_position :=DB10.DBD16
Timer_for_wait :="FB10_Timer"
Warning :=
Fault :="Fehler"
Ready :=
Data_transfer_ready :=
Status_word :=
Actual_block :=
Check_back_signal_byte:=
Warn_number :=
Warn_info :=
Fault_number :=
FB_coordination :="Koordinations_Merker"
NOP 0


NW3

Aufbereitung des Sollwertes vom Panel
Der Sollwert wird Dezimal(Integer) im Panel eingegeben, da Real zB. 999,99
nicht
möglich ist.
Umwandlung von Integer nach Double-Integer und dann Wandlung in Real.
Wert wurde mit Faktor 10 in Panel skaliert ( multipliziert) daher Division
durch 10 ( wegen Genauigkeit ) und dann Transfer in DB 10 MDI_position
Sollwert

U(
U(
L "Sollwert_Posmo"
ITD
T #Soll_DINT
SET
SAVE
CLR
U BIE
)
SPBNB _001
L #Soll_DINT
DTR
T #Soll_Real
SET
SAVE
CLR
_001: U BIE
)
SPBNB _002
L #Soll_Real
L 1.000000e+001
/R
T DB10.DBD 16
_002: NOP 0


NW4
Wenn Referenzierungsbit vom Panel auf 1, dann Wert 0 Position in Parameterwert
schreiben.Damit wird die Achse bei der gewünschten Position auf 0 gesetzt

U "Start_Referenzierung"
SPBNB _003
L 0
T DB11.DBD 10
_003: NOP 0


NW 5
Durch den FB11 wird
1. Der Istwert der Position ständig gelesen
2. Der Sollwert 0 für die Referenzierung geschrieben


"I_O_adress" : Dezimale Adresse aus Step7 HW Konfig hier: 256


"Number" : Auftrag Nummer 40 bedeutet die Istposition oder Sollposition zum
Posmo lesen oder schreiben


"Read" : Wenn nicht refernziert wird, dann nur lesen. Dies muß verriegelt
werden, da ein gleichzeitiges lesen und schreiben nicht möglich ist


"value" :Speicherbereich für die Ist und Sollwerte


"Koordination" : Ein gleicher Merker für FB10 un FB11 (wird von den Bausteinen
verändert)

UN "Start_Referenzierung"
= L 12.0
BLD 103
U "Start_Referenzierung"
= L 12.1
BLD 103
CALL FB 11 , DB11
I_O_adress :=256
Number :=40
Index :=
Read :=L12.0
Write :=L12.1
Factory_default:=
Parameter_save :=
fault_present :=
task_completed :=
Fault_number :=
value :=DB11.DBD10
FB_coordination:="Koordinations_Merker"
NOP 0


NW6
Der Istwert im Realformat wird mit 100 multipliziert ( wegen Genauigkeit )und
dann
zur Double Integer gewandelt um am Panel angezeigt werden zu können.

U(
L DB11.DBD 10
L 1.000000e+002
*R
T #Ist_Real
UN OV
SAVE
CLR
U BIE
)
SPBNB _004
L #Ist_Real
RND
T "Istwert_Panel"
_004: NOP 0


NW 7
Rückmeldung Antrieb fährt =1 / steht=0 ( Bit aus Statuswort und kann zur
Weiterverabeitung im Programm genutzt werden. Weiterleitung zur Anzeige an
Panel

U DB10.DBX 24.5
= "Antrieb fährt"
 
Ja es ist ein in-out

er ist an einem in out am Baustein bei -value

DB11.DBD10 -value

muss ich den umstellen?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
DB11 ist ein Instanz-DB des FB11, DB11.DBD10 eine Instanz-Variable, die außerhalb der Instanz manipuliert wird (in NW4) und zu allem Überfluß auch noch an die Instanz übergeben wird (in NW5). Was für ein Parameter ist FB11.value - ein OUT? Wie ist der FB11 deklariert (was liegt im IDB an Adresse DBD10)?

Vermutlich wird die Variable, die im IDB an Adresse DBD10 liegt, im FB11 beschrieben. Da hat sie aber den FB-internen Name und nicht den Name DB11.DBD10.

Harald
 
value ist ein Datentyp: DWord an der IN_Out Schnittstelle des FB11 an dem hängt der DB11.DBD10

U #Write // Auswertung Schreibauftrag
FP #FL_S
S #A_Schr
U #A_Schr
UN #FB_coordination
FP #Fl_Schreiben
SPBN schr
SET
R #fault_present
R #task_completed
S #FB_coordination
L #Number //--------------------------------------------------
SPL JUMP
SPA G10 //MD0 Schreibauftrag
SPA G5 //MD1 C4
SPA G5 //MD2 C4
SPA G5 //MD3 C4
SPA G9 //MD4 I2 Maßeinheit
SPA G5 //MD5 C4
SPA G5 //MD6 C4
SPA G5 //MD7 C4
SPA G5 //MD8 C4
SPA G7 //MD9 T2
SPA G6 //MD10 I4
SPA G5 //MD11 C4
SPA G5 //MD12 C4
SPA G10 //MD13 T4
SPA G5 //MD14 C4
SPA G5 //MD15 C4
SPA G5 //MD16 C4
SPA G6 //MD17 I4
SPA G9 //MD18 T2 1ms
SPA G5 //MD19 C4
SPA G5 //MD20 C4
SPA G5 //MD21 C4
SPA G5 //MD22 C4
SPA G10 //MD23 T4
SPA G8 //MD24 N2
SPA G8 //MD25 N2
SPA G8 //MD26 N2
SPA G8 //MD27 N2
SPA G5 //MD28 C4
SPA G10 //MD29 T4
SPA G9 //MD30 I2
SPA G9 //MD31 I2
SPA G9 //MD32 I2
SPA G6 //MD33 I4
SPA G9 //MD34 I2
SPA G9 //MD35 N2
SPA G6 //MD36 I4
SPA G9 //MD37 I2
SPA G9 //MD38 N2
SPA G5 //MD39 C4
SPA G5 //MD40 C4
SPA G5 //MD41 C4
SPA G5 //MD42 C4
SPA G5 //MD43 C4
SPA G5 //MD44 C4
SPA G10 //MD45 T4
SPA G5 //MD46 C4
SPA G5 //MD47 C4
SPA G9 //MD48 I2
SPA G9 //MD49 I2
SPA G6 //MD50 I4
SPA G6 //MD51 I4
SPA G6 //MD52 I4
SPA G6 //MD53 I4
SPA G6 //MD54 I4
SPA G5 //MD55 C4
SPA G9 //MD56 V2
SPA G6 //MD57 I4
SPA G10 //MD58 T4
SPA G5 //MD59 C4
SPA G10 //MD60 T4
SPA G10 //MD61 T4
// ------------------------------------- Schreibaufträge
JUMP: L 80 //Parameter > 52
-I
L 0
<I
SPB G10 //--> Sprung wenn Parameter < 80
TAK
SPL JM80
SPA G4 //MD 80
SPA G1 //MD 81
SPA G3 //MD 82
SPA G3 //MD 83
SPA G2 //MD 84
SPA G1 //MD 85
SPA G4 //MD 86
SPA G4 //MD 87
JM80: L #Number
L 97 // Power On Reset neu ab V 1.4
==I
SPB G9
L #Number // Referenzpunkt gesetzt zurücksetzen neu ab V 1.4
L 98
==I
SPB G9
L #Number
L 99 // Bei MD 99 andere Kennung
==I
SPB G4
L #Number
L 100
==I
SPB G9
L #Number
L 101
==I
SPB G4 // mit Index keine Wandlung
L #Number
L 970 // Werksvorseinstellung laden
==I
SPB G9 // keine Wandlung
L #Number
L 971 // Übernahme in den nichtflüchtigen Speicher
==I
SPB G9 // keine Wandlung
SPA G10 // Parameter > 87 keine Umwandlung
// Gruppe 1: Index; Real-C4; Doppelwort // MD 81 u. MD 85
G1: L #value // wert in Real
L 1.000000e+004 // mal 10000
*R
RND // Nach DINT wandeln
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#8000 //Auftragskennung schreiben
SPA s
// Gruppe 2: Index; DINT-T4; Doppelwort,keine Wandlung MD 84
G2: L #value
L 10
/D
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#8000 //Auftragskennung schreiben
SPA s
// Gruppe 3: Index; Int-N2; Doppelwort MD 82 / MD 83
G3: L #value
ITD
DTR
L 1.638400e+002
*R // S7--> DV
RND
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#7000 //Auftragskennung schreiben
SPA s
// Gruppe 4: Index; WORD/INT-V2; Wort; keine Wandlung MD 80
G4: L #value
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#7000 //Auftragskennung schreiben
SPA s
// Gruppe 5: Kein Index; REAL-C4; Doppelwort
G5: L #value // wert in Real
L 1.000000e+004 // mal 10000
*R
RND // Nach DINT wandeln
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#3000 //Auftragskennung schreiben
SPA s
// Gruppe 6: Kein Index; DINT-T4; Doppelwort; Wandlung 10ms
G6: L #value // wert in Real
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#3000 //Auftragskennung schreiben
SPA s
// Gruppe 7: Kein Index; INT-/T2; Wort; Wandlung 10 ms
G7: L #value // wert in Real
L 10
/D
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#2000 //Auftragskennung schreiben
SPA s
// Gruppe 8: Kein Index; INT-N2; Wort;
G8: L #value // wert in Real
ITD
DTR
L 1.638400e+002
*R // S7--> DV
RND
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#2000 //Auftragskennung schreiben
SPA s
// Gruppe 8: Kein Index; INT-N2; Wort;
G9: L #value // wert in Real
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#2000 //Auftragskennung schreiben
SPA s


// Gruppe 10: Kein Index; T4 Wandlung 10ms ;
G10: L #value // wert in Real
L 10
/D
T #PKWschreiben.PKW // und als Wert eintragen
L W#16#3000 //Auftragskennung schreibeL
SPA s
// Gruppe 11: Index; keine Wandlung; Para = 99
L W#16#6000 //Auftragskennung schreiben
s: L #Number
OW
T #PKWschreiben.PKE
L #Index
SLW 8
T #PKWschreiben.IND


CALL SFC 15 // Daten schreiben
LADDR :=#Anfangsadresse
RECORD :=#PKWschreiben
RET_VAL:=#hmw
SPA ende
schr: NOP 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wieso verwendest Du dann ein DWORD als Real?

also ich schau mir jetzt nicht den code an, einige Hinweise hast Du ja schon.
Der DB11.DBD10 ist eine in_out variable und Bestandteil einer Instanz und wird von aussen beschrieben.

Das ist jedenfalls zumindest "unsauber" programmiert.
Harald hat das schon erläutert.

Dort wirds halt ecken...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist nicht möglich, einen Baustein-Übergabeparameter vom Typ DWORD mit einer REAL-Variable zu beschalten. Das geht nur, wenn die angeschaltete Adresse kein Symbol hat und deshalb als absolute Adresse dasteht. Hat der DB11 einen symbolischen Name? Oder gibt es gar keine Variable an der Instanz-Adresse DBD10, d.h. überdeckt das DBD10 womöglich mehrere Variablen? Ist die Adresse falsch, ist vielleicht eine andere Adresse gemeint?
Schon komisch, daß DB11.DBD10 nicht symbolisch dargestellt wird.

Jetzt zeige uns doch mal bitte die Deklaration des FB11. Von mir aus auch den kompletten Code.
Dazu gehst Du im AWL-Editor auf "Datei > Quelle generieren ..." und wählst den FB11 aus.
Dann kopierst Du den Code aus der AWL-Quelle und fügst ihn hier in einen Beitrag in [CODE]-Tags ein (der #-Button im Beitragseditor).

Alternativ öffne den DB11 als Global-DB (Doppelklick und im Öffnen-Dialog "Nein" auswählen) und mache einen Screenshot und lade hier das Bild hoch (im Beitragseditor "Erweitert" auf "Anhänge verwalten").

naja wieso macht Siemens sowas.
Wieso Siemens? Wie heißt der FB11 und wie heißt der aufrufende Baustein (der Code, den Du hier gepostet hast)?

Harald
 
S7 318i und einen Siemens Posmo A Servomotor

ich habe mir die dazugehörigen Bausteine für Step7 und das HMI-Projekt von der Siemens Seite geladen.
Es ist wohl dieses Projekt
Funktionsbeispiel für eine Positionieraufgabe mit einem dezentralen Positioniermotor POSMO A


ich kann im simulierten Panel vorwärts, rückwärts und Position fahren, aber wenn ich Referenzieren/ auf 0 Setzten möchte muss ich ca 10-20 mal auf den Button(M20.1) Referenzieren drücken bis er 0 setzt
[...]
wenn ich mir die Variable simuliert ansehe und ich den Button drücke ist der Wert 0 aber wenn ich vom Butten runtergehe ist wieder der alte Wert (Position) drin.
wie gesagt wenn ich öfter drauf drücke funktioniert´s

hätte jemand eine Idee warum er den Wert nicht sofort übernimmt?
Ich habe keinen echten Antrieb. In meinem PLCSIM wird DB11.DBD10 sofort auf 0 gesetzt und bleibt auf 0.
ABER:
DB11.DBD10 ist der IN_OUT-Parameter "Para DB".value, eine Variable mit Multifunktion (und wechselndem Datentyp). Da muß garnicht der Posmo-Istwert drinstehen. Das kann z.B. auch der Wert eines Parameter-Leseauftrags oder Parameter-Schreibauftrags sein. In dem Beispielcode wird DB11.DBD10 einfach immer konvertiert in MD102 geschrieben (FC1 NW5) und am Touchpanel als "Posmo-Istwert" ausgegeben. Laut Kommentar im NW4 wird allerdings der Istwert der Position ständig gelesen und in #value geschrieben - scheint also so zu funktionieren wie es soll. Solange M20.1 "Referenzierung" aktiv ist, wird 0 in DB11.DBD10 geschrieben. Wenn nicht, dann schreibt der FB11 in DB11.DBD10.

Ist bei Dir vielleicht noch ein anderer Parameter-Schreibauftrag oder -Leseauftrag aktiv? Oder nimmt der Antrieb das Referenzieren nur an, wenn er absolut stillsteht? Außerdem dauert es wohl auch eine gewisse Weile bis der Antrieb eine Reaktion auf das Referenzieren zeigt. Beim Drücken auf [Referenzieren] wird ein Auftrag W#16#3028 an den Posmo ausgelöst. Ich habe keine Ahnung was das bedeutet und wie der Antrieb darauf reagieren sollte.


Ich vermute die Ursache Deines Problems in dem Posmo. Nicht im Beispielprogramm.

Harald
 
Zurück
Oben