# CPU (4xx)  geht in "Stop", nachdem ich 2 DI + 1 DO hinzugefügt habe...



## mega_ohm (1 April 2011)

*Sehr geehrte helfende Fachleute,*

ich wollte folgende Aufgabe lösen:
- 1 Öffner ( "Stopp" ) ( DI )
- 1 Schließer ( "Start" ) ( DI )
- 1 LED ( Start- Taster  beleuchtet ) => Meldung "ist gestartet"  ( DO )

_______________________________________________________________
Das ganze Progi bekomme ich nicht zu mir nach Hause...  deswegen habe ich mal versucht, das Progi nachzubilden !


```
DATA_BLOCK DB 1
TITLE =

  STRUCT        
   M_Stop : BOOL ; //Merker für "Masch_Stopp"
   M_Start : BOOL ; //Merker für "Masch_Start"
  END_STRUCT ;  
BEGIN
   M_Stop := TRUE; 
   M_Start := FALSE; 
END_DATA_BLOCK
FUNCTION FC 192 : VOID
TITLE =
BEGIN
NETWORK
TITLE =Ausgang setzen
      U     DB1.DBX    0.1; 
      U     DB1.DBX    0.0; 
      U(    ; 
      U(    ; 
      O     A      0.6; 
      O     A    108.3; 
      )     ; 
      NOT   ; 
      )     ; 
      S     M      0.0; 
      U(    ; 
      ON    DB1.DBX    0.0; 
      ON    M      0.1; 
      )     ; 
      R     M      0.0; 
      U     M      0.0; 
      =     A      0.6; 
      =     A    108.3; 
END_FUNCTION
FUNCTION_BLOCK FB 10
TITLE =

VAR
  D_0 : DWORD ; //ED 0 sichern
  D_1 : DWORD ; //ED 4 sichern
  D_2 : DWORD ; //ED 8 sichern
  D_3 : DWORD ; //AD 0 sichern
  D_4 : DWORD ; //AD 4 sichern
  D_5 : DWORD ; //AD 8 sichern
END_VAR
BEGIN
NETWORK
TITLE = 
// Eingangs- Peripherie lesen      
      L     PED    0; 
      T     ED     0; 
//      
      L     PED    4; 
      T     ED     4; 
//      
      L     PED    8; 
      T     ED     8; 
//      
//             
//      
// ********************************* PROCEDURE  begin  **************************************************************     
// **       Jetzt kommt natürlich die ganze Mimik, die ein Programm tuen muß, um ein Programm sein zu dürfen       **
// ********************************** PROCEDURE end  ****************************************************************     
//      
//      
// Ausgangs- Peripherie schreiben      
      L     AD     0; 
      T     PAD    0; 
//      
      L     AD     4; 
      T     PAD    4; 
//      
      L     AD     8; 
      T     PAD    8; 
//      
      CALL FC   192 ;
END_FUNCTION_BLOCK
DATA_BLOCK DB 10
TITLE =
 FB 10
BEGIN
   D_0 := DW#16#0; 
   D_1 := DW#16#0; 
   D_2 := DW#16#0; 
   D_3 := DW#16#0; 
   D_4 := DW#16#0; 
   D_5 := DW#16#0; 
END_DATA_BLOCK
ORGANIZATION_BLOCK OB 1
//

VAR_TEMP
  OB1_EV_CLASS : BYTE ; 
  OB1_SCAN_1 : BYTE ; 
  OB1_PRIORITY : BYTE ; 
  OB1_OB_NUMBR : BYTE ; 
  OB1_RESERVED_1 : BYTE ; 
  OB1_RESERVED_2 : BYTE ; 
  OB1_PREV_CYCLE : INT ; 
  OB1_MIN_CYCLE : INT ; 
  OB1_MAX_CYCLE : INT ; 
  OB1_DATE_TIME : DATE_AND_TIME ; 
END_VAR
BEGIN
NETWORK
TITLE = 
      CALL FB    10 , DB    10 ;
      NOP   0; 
NETWORK
TITLE ="Stopp" setzen
      U     E    108.3; 
      U     E      2.3; 
      =     DB1.DBX    0.0; 
NETWORK
TITLE ="Start" setzen
      O     E    108.2; 
      O     E      2.4; 
      =     DB1.DBX    0.1; 
END_ORGANIZATION_BLOCK
```
 
Ich hab' mir extra einen DB1 gebastelt, um eben *KEINE* Merker- Bereiche zu überschreiben...

DI- bzw. DO- Adresse 0 ... 80 sind auf der 4xx- CPU.
Diese Adressen werden von / auf Peripherie geladen / transferiert.

DI- bzw. DO- Adresse 108 ist auf einer ET200 über Profibus angebunden.

Meine Änderungen ( die der 4xxCPU für die "rote" LED gereicht haben ):
- E2.3 ( Öffner = Taster )
- E2.4 ( Schließer = Taster )
- A0.6 ( LED für die Meldung )

Nachdem ich diese ( ich fand bis vor wenigen Stunden... es wäre eine einfache Aufgabe ! ) Änderung auf die Maschine übertragen hatte, konnte ich die Maschine mit "meinem" <neuen> Taster noch starten... und die Maschine
fing auch an, zu arbeiten !

Theoretisch hätte die LED am A0.6 leuchten müssen... so wie die LED am A108.3 ( die hat definitiv geleuchtet ! ) <<< das funktionierte schon mal nicht, auch der A0.6 wurde nicht gesetzt !
<<< Verdrahtungsfehler kann ich ausschließen ( z.b. + und - an der LED verwechselt, das hatte ich im Voraus schon geprüft ) 

>>> Danach ( ca. 1/2 min später)  * [ !!! ]*
... die Vormaterial-Maschine führte noch das nächste Vormaterial zu... 
, fuhr wieder in die Aufnahme- Position und begann, das nächste Vormaterial zu greifen...

Die Weiterverarbeitungs- Maschine starb mit dem 3. Schritt....

In der Diagnose (CPU) stand:
- "Unerlaubter Aufruf"
- "Fehler in FC 192"
_______________________________________________________________

*Meine Fragen:*
- welchen Sinn macht es, DI- Word od. DWord *AUF* ein PEW bzw. PED zu schreiben ???  

Mir ist klar, daß diese Aussage heute niemand teilen kann...  weil sie in meinem gelieferten Code nicht existiert.
Die Simu "frißt" einen Transfer auf ein PEW nicht.
Ich weiß aber, daß ich genau DAS heute gesehen habe.

Kann mir vielleicht schon jetzt jemand sagen, warum die CPU in "Stop" ging ?
  Ich habe nix gemacht...  Ich bin nicht schuld !
 oder doch ????

Mfg


----------



## thomas_1975 (1 April 2011)

Hallo,

für mich sieht es aus als hättest du hier einen "Schreibfehler",
ich meine im Ursprung denke ich werden die PEW´s in den DB10 geschoben, und dann anstatt aus der Peripherie mit dem Datenbaustein 
weitergearbeitet ( konsistenz ).
Sonst macht das ganze in meinen Augen wirklich keinen Sinn.

gruß Thomas


----------



## mega_ohm (1 April 2011)

thomas_1975 schrieb:


> Hallo,
> 
> für mich sieht es aus als hättest du hier einen "Schreibfehler",
> ich meine im Ursprung denke ich werden die PEW´s in den DB10 geschoben, und dann anstatt aus der Peripherie mit dem Datenbaustein
> ...


Genauso ist es eben nicht !

Es wird ganz lustig mit den direkten Eingangs- bzw. Ausgangs- Adressen
umher gesprungen... nachdem diese eben, wie angedeutet zyklisch auf PEW (PED) bzw. PAW (PAD) transferiert werden.
Die Funktion des DB10 ( wo dieser Kram reingeschrieben wird) raffe ich gar nicht...

Eingänge => DB1
DB2 => Ausgänge... das kenne ich

Die DI ( z.B. ED 0 ) werden auf PEW 0 transferiert...
Diese Geschichte verstehe ich schon mal nicht.

Grundsätzlich kann ich mir aber noch gar nicht erklären, warum die CPU eigentlich "gestoppt" wurde...
Meine 2 neuen Eingänge ( E2.3 bzw. E2.4 ) und mein einer Ausgang A0.6 ... <<< ich verstehe einfach das Problem nicht !

Mfg


----------



## bike (1 April 2011)

mega_ohm schrieb:


> Die DI ( z.B. ED 0 ) werden auf PEW 0 transferiert...
> Diese Geschichte verstehe ich schon mal nicht.




Du kannst ein PEW laden und ein PAW transferieren.
Wenn du im Programm die Eingänge überschreiben willst dann mit t EW.




bike


Edit: Wenn die PLC in Stopp geht, was steht im Puffer?


----------



## winnman (1 April 2011)

kann es sein dass du den DB1 nicht aufs AG geladen hast?


----------



## mega_ohm (2 April 2011)

winnman schrieb:


> kann es sein dass du den DB1 nicht aufs AG geladen hast?


Das ist völlig ausgeschlossen.

1.  weiß ich, daß man bei DB- Zugriffen den DB vor den Zuf´griffen laden muß
2. habe ich mir den DB1 online in der Datenansicht ansehen können
3. zig- andere FB's, FC's greifen auf diesen DB zu - ohne Probleme

Mfg


----------



## mega_ohm (2 April 2011)

bike schrieb:


> Du kannst ein PEW laden und ein PAW transferieren.
> Wenn du im Programm die Eingänge überschreiben willst dann mit t EW.
> 
> 
> ...


Den kompletten Diagnose- Text habe ich heute gesichert, lade ihn heute nachmittag hoch.
Definitiv steht da der FC 192 als "Problemkind".
Die Aufrufe erfolgen aber auch im FB 10 ( dieser wird vom OB1 aufgerufen), der FB10 macht diese Mimik mit dem Transfer der ED auf PED bzw. AD auf PAD und sichert diese in DB10.
Danach wird vom FB10 der FC19 aufgerufen.
Dort hinein habe ich jetzt meine "Mimik" verfrachtet" ( Man sollte mich bitte nicht fragen, warum... das weiß ich selbst nicht so genau )

Im FB90, FC90, FC91, FC92, FC93 und im FC 191 wird meine "Mimik" korrekt abgearbeitet => ohne Stopp

Sobald ich aber meine Änderungen im FC192 mache... geht die CPU in Stop

*Ich raffe das nicht.*
Dort sind nur stinknormale AWL- Anweisungen zu finden... keine Pointer- Geschichten, kein Budenzauber...
Mit dem normalen E108.2 ist alles i.O. => funktioniert.
Sobald ich im FC192 mit "Suchen / Ersetzen" anstatt des E108.2 meinen DB1.DBX0.1 ersetze, stoppt die CPU und meckert mir den FC192, Bausteinnummer 5xx an.
Den genauen Diagnose- Text lade ich heute mittag hoch.

Den DB1 habe ich definitiv geladen, ich kann mir online ( Datenansicht) die Änderungen ansehen ( solange ich eben diesen versch***en FC192 mit meinen Änderungen noch nicht auf's AG übertragen habe ).


*Ich habe mal eine ganz "fiese" Frage....*
Wenn ich mit meinen 2 Eingängen ( E2.3 bzw. E2.4) im FB10 nach dem Transfer der ED auf PED einfach die Eingänge E108.2 bzw. E108.3 setze ?


```
U E2.3 // neuer Stopp- Taster
= E108.2 // bestehender Stopp- Taster ( alt )
 
U E2.4 // neuer Start- Taster
= E108.3 // bestehender Start- Taster ( alt )
```
 

Dann müßte doch zumindest für einen Zyklus die ganze Geschichte vom AG bearbeitet werden.
Das sieht nicht schön aus, ich selbst habe mich schon darüber aufgeregt.... [ "Wer macht denn sowas ? ] , aber funktionieren muß die Maschine nach dem Willen desjenigen, der am PG sitzt.
______________________________________________________________

*Der derzeitige IST- Stand ist:*
Ich habe im FC192 den "! alten" Eingang belassen... den Rest geändert.
Es funktioniert.... bis eben auf die Funktionen, die im FC192 programmiert sind.
Die "kann" mein neuer Taster nicht !
Diese wären aber eigentlich zu 20% entscheidend für die Rechtfertigung der Nachrüstung.

Mfg


----------



## mega_ohm (2 April 2011)

Bei meiner Suche nach dem Fehler fand ich im OB1 Folgendes:

```
NW1 // Lampentest
UN M0.0 // welche Merker es nun konkret sind, ist ja unerheblich
UN M0.1
UN M0.2
SPB M003
L 1
T AW 0
T AW 2
 // etc.    eben alle Ausgänge, wo LED's  "hängen"
BEA // DAS heißt doch, der OB1 ist in diesem Fall nur noch mit dem "Lampentest" beschäftigt ??  mit sonst nix mehr ?
M003: NOP 0
 
NW2 // Mache dies
 
NW3 // Mache das
```
Ich interpretiere diesen Code so:
- wenn Lampentest, dann geht nichts anderes mehr

Oder habe ich da was Wichtiges übersehen ?

Mfg


----------



## mega_ohm (2 April 2011)

Kann mir eigentlich mal jemand erklären, warum man überhaupt

```
L ED 0
T PED 0
```
( mit den Ausgängen steht die gleiche Frage )
macht ?

Das man die Ein- bzw. Ausgänge auf DB's schreibt und dann im Programm nur noch die jeweiligen DB's verwendet... das sehe ich ein.

Warum schreibt man aber z.B. einen Eingang auf einen Peripherie- Eingang ?
Wo ist da der Vorteil ?

Die s7- Hilfe hat mir nicht geholfen.
Da stand was von "Verstecken" etc...
Wenn ich Programmteile "verstecken" will, nehme ich "einfach nur" Pointer und einen FB.
Diese Maßnahme ist sehr effizient.
Daran scheitern viele.

Mfg


----------



## bike (2 April 2011)

mega_ohm schrieb:


> Kann mir eigentlich mal jemand erklären, warum man überhaupt
> 
> ```
> L ED 0
> ...


In dem ersten Posting steht L PED 0 T ED 0.
Daher schreibt er nicht auf PED sondern läd zur Laufzeit exakt an dieser Position das PED. Kann sein, dass er sich sicher sein will / muss, dass die Eingänge aktuell sind.

Du kannst schon deine Eingänge überschreiben.
Doch warum dies tun? 

Schön wäre der Stack und auch der ungekürzte Programmteil, dann kann man suchen.
Denn einmal schreibst du PED beschreiben, dann PEW usw. 
So erschließt sich mir dein Problem nicht.


bike


----------



## mega_ohm (2 April 2011)

bike schrieb:


> In dem ersten Posting steht L PED 0 T ED 0.
> Daher schreibt er nicht auf PED sondern läd zur Laufzeit exakt an dieser Position das PED. Kann sein, dass er sich sicher sein will / muss, dass die Eingänge aktuell sind.
> 
> bike


Bei meinem letzten Posting zum Thema PED / PAD ging es mir erstmal um das grundsätzliche Verständnis, warum man sowas macht.

 Die Diagnose- Textdatei habe ich mal angehangen.


----------



## Paule (2 April 2011)

mega_ohm schrieb:


> Kann mir vielleicht schon jetzt jemand sagen, warum die CPU in "Stop" ging ?


Ich könnte mir vorstellen, dass in dem FB10 Datenwort abfragen sind ohne dass der DB geöffnet wird, sprich ein "Nichtqualifizierter Zugriff".


mega_ohm schrieb:


> Ich hab' mir extra einen DB1 gebastelt, um eben *KEINE* Merker- Bereiche zu überschreiben...


Und jetzt wird der DB1 geöffnet, was eventuell nicht an dieser Stelle passt.


----------



## bike (2 April 2011)

Paule schrieb:


> Ich könnte mir vorstellen, dass in dem FB10 Datenwort abfragen sind ohne dass der DB geöffnet wird, sprich ein "Nichtqualifizierter Zugriff".
> 
> Und jetzt wird der DB1 geöffnet, was eventuell nicht an dieser Stelle passt.



Da hast du wohl wahr 

Warum ein neuer zusätzlicher DB?
Wenn du einen DB aufschlägst, dann musst du dir vorher! Gedanken machen welchen Einfluss dies auf das Programm hat.


Ich würde einen OB121 reinkopieren, dann an meine Änderung zur Laufzeit gehen und schauen was vorher und nachher in den Akku  steht.

Programmcode würde uns und dir echt helfen.


bike


----------



## mega_ohm (6 April 2011)

Paule schrieb:


> Ich könnte mir vorstellen, dass in dem FB10 Datenwort abfragen sind ohne dass der DB geöffnet wird, sprich ein "Nichtqualifizierter Zugriff".
> 
> Und jetzt wird der DB1 geöffnet, was eventuell nicht an dieser Stelle passt.


Du ahnst gar nicht, wie recht Du hast.  

Im FC 192 wurde auf verschiedene DBW zugegriffen.
( es ist nur als Beispiel zu sehen, es ist kein Auszug aus dem realen Programm ! )

```
L DBW 80
...
T DBW 90
```
Im FB90 stand irgendwann einmal (z.B. ! )

```
AUF DB10
```
Im FB90 hatte ich zwar auch "rumgekramt" mit meinem DB1.DBX0.1,
aber in diesem FB erfolgte kein Zugriff auf einen anderen DB.
Im FB90 wurde aber der FC192 aufgerufen...
:sm11: Das hatte ich nicht beachtet.

Übrigens funktioniert auch nicht ( es funktioniert *nur* nicht, die CPU "lebt" aber... geht nicht in "Stop" ),
wenn man  ( z.B. !)

```
u E 0.0
= E 108.2
```
schreibt, wenn zwischendurch mal das PEW oder PED gelesen wird.  
Ich weiß das jetzt sicher.

Ich danke Dir für Deinen Tipp. Durch diesen konnte ich wenigstens erfassen, wo das Problem lag. ( einen irdischen Grund mußte es haben, daß war mir von Beginn an klar ).

Mfg


----------



## PN/DP (7 April 2011)

mega_ohm schrieb:


> Übrigens funktioniert auch nicht ( es funktioniert *nur* nicht, die CPU "lebt" aber... geht nicht in "Stop" ),
> wenn man  ( z.B. !)
> 
> ```
> ...


Was funktioniert daran nicht? 

Die CPU geht bei dieser legitimen Operation selbstverständlich nicht in Stop (wenn die Größe des PAE > E108.2 ist). Vielleicht entspricht das Ergebnis nur nicht den Erwartungen des Programmierers?
Will man in einem OB1-Zyklus die Einganszustände auffrischen und dann mit den aktuelleren Zuständen weiterarbeiten, dann braucht man nur schreiben:

```
L PEW0
T EW0
```

Harald


----------



## mega_ohm (8 April 2011)

PN/DP schrieb:


> Was funktioniert daran nicht?


Der FB10 macht die Mimik mit den PEW/ PED bzw. PAW / PAD ( dieser wird vom OB1 aufgerufen). Gesichert werden die Ergebnisse in DB10.
Danach wird vom FB10 der FC19 aufgerufen.

Ich hatte meinen Code
	
	



```
U E 0.0
= E 108.2
```
im FB10 vor dem Lesen der EW / ED bzw. im FC19 ( also eigentlich, nachdem die Peripherie in den DB geschrieben wurde ).
In beiden Fällen konnte ich mir in dem entsprechenden Baustein das Ganze online ansehen und es tat so, als würde es funktionieren.
Beim _Setzen /Beobachten der Variablen_ wurde zwar der E0.0 ( neuer Taster ) gesetzt...
aber mit dem E108.2 ( ursprünglicher Taster) passierte gar nichts.
Es passierte auch nichts mehr, wenn ich den Taster (E108.2) betätigte.



> Will man in einem OB1-Zyklus die Einganszustände auffrischen und dann mit den aktuelleren Zuständen weiterarbeiten, dann braucht man nur schreiben:
> Harald


Es werden doch
1. die Eingänge gelesen
2. die Verknüpfungen aktualisiert
3. die Ausgänge gesetzt   *= 1 Zyklus*

Wenn ich also vor dem Durchlauf eines kompletten Zyklus die Eingänge nochmal "genau" wissen will... muß ich das  ( z.B. ) PEW nochmal lesen ?

Mir ist klar, daß Lade / Transfer VKE- unabhängig ist. Bedeutet das denn auch das es zyklus- unabhängig ist ?

Wo oder wie soll ich denn meinen E0.0 (den neuen Taster) ins Programm tun, damit es funktioniert ?

Mfg


----------



## rostiger Nagel (8 April 2011)

warum das machst habe ich noch nicht verstanden


```
U  E 0.0
=  E 108.2
```
 
kann mann das wegen der übersichtlichkeit und üblichen Programmierlokig 
nicht besser so lösen.


```
O  E 0.0
O  E 108.2
S  #irgendwas
```
 
Warum muss mann es bei *einfachsten* Bitverknüpfungen schon so
kompleziert machen?


----------



## mega_ohm (9 April 2011)

Helmut_von_der_Reparatur schrieb:


> warum das machst habe ich noch nicht verstanden
> 
> 
> ```
> ...


 meinst Du, daß...

```
U  E 0.0
=  E 108.2
```
 komplizierter ist, als...

```
O  E 0.0
O  E 108.2
S  #irgendwas
```
 


Zumindest ist eine Zeile weniger zu schreiben.

Aber mal im Ernst:
*S* wie "Setzen" mag ich nicht so gern, weil man sich dann auch um das *R *(Rücksetzen ) kümmern muß.

Ich gebe zu, daß mein "Plan A" war, einfach eine Leitung auf die schon bestehenden Taster zu "ziehen".
Auf Grund der Entfernung ( das wäre ja noch fast egal... es gibt Tage, an denen man nicht gewinnen kann und Tage, an denen man verliert) und *hauptsächlich auf Grund* der verbauten oder zugestellten bisherigen unterirdischen Kabeltrassen war "Plan A" nicht durchführbar.
>> "Eine überirdische Leitungsführung ist zu vermeiden, um eine maschinelle Reinigung der Hallen sicherzustellen"
(Das ist eine Vorgabe der Firma )

Der "Plan B" (Software- Änderung) stand erst nach Begehung und Feststellung der Nicht- Realisierbarkeit von "Plan A" an.
- Danach habe ich, weil ich zu faul war, mir 2 freie Merker zu suchen, einen eigenen DB kreiert.
Ich ging davon aus, das "AUF DB" in nur s5 vorkommt... in s7 gab es m.M. nach keinen Grund mehr für "nichtquali. DB-Zugriffe".
Dieser Irrtum (meinerseits) wurde mit einem "CPU- Stop" _belohnt._

Da ich nicht das halbe Programm umschreiben wollte, dachte ich mir...
eine direkte Zuweisung eines E (E0.0) auf einen anderen (E108.2) ist zwar brutal ( ich mag's eigentlich gar nicht ), aber geht schnell und relativ "schmerzfrei".

Der Programmierer, der das ursprüngliche Masch.-Progi geschrieben hat, hat aber sehr gut für sich vorgesorgt.
Er hat erstmal alle DI und DO, die im Haupt- Schaltschrank existieren, mittels PEW / PED bzw. PAW / PAD irgendwie geladen / transferiert.
Egal, ob sie wirklich belegt sind... oder nicht.
(Sollte Interesse bestehen, würde ich nächste Woche "XRef" hochladen )

______________________________________________________________

*Was habe ich gelernt ?*
- Nicht alles, was auf den 1. Blick einfach lösbar schein, ist es auch.

Die Schwierigkeiten, um 2 zusätzliche Tasten einzufügen, hatte ich nicht so groß erwartet. 

Das sämtliche EW und AW, die im Schaltschrank auf die s7-4xx verdrahtet, teils aber ab der Zwischenklemme drahtfrei (not connect) sind, im Programm manipuliert werden... 
- komplette Merker- DWord wurden, *ohne* auch nur 1 Bit dieser DWord überhaupt im Progi zu verarbeiten, mit Laden / Transfer im FB10 manipuliert.
______________________________________________________________

*Die Geschichte hat ein gutes Ende*... es funktioniert.
Ich habe mir tatsächlich die Mühe gemacht, 1 freien - nicht über WORD oder DWORD- Zugriff im Progi abgearbeiteten Merker zu finden.

Für meinen "Stopp"- Taster habe ich die Verknüpfung über den DB1 beibehalten.

UND... ich habe gelernt. ( Das ist, glaube ich, das Wichtigste )
Ich habe gelernt, wenn ich mit "Suchen / Ersetzen" meine Ideen in ein bestehendes Progi einbringe, das bestehende Programm noch genauer zu analysieren...

Es war eine Prozedur... "Lernen durch Schmerz"... (es hat mich richtig geärgert, daß meine anfänglichen Änderungen nicht "laufen" )

Ich hatte über die unqualifizierten Zugriffe von DB's in s7 einfach überhaupt nicht nachgedacht, weil ich glaubte ( Glauben ist der Gegensatz von "Wissen" ) => das macht doch in s7 keiner mehr.

Heute bin ich, auch Dank Eurer Hilfe schlauer und vor allen Dingen vorsichtiger...

Mfg


----------



## rostiger Nagel (9 April 2011)

eigentlich meinte ich nicht das setzen eines "irgendwas", sondern
das Rangieren von einen Eingang auf einen Anderen. Das finde ich
mehr als Unglücklich. Eingänge als Variabel zu mißbrauchen ist unüblich,
dafür gibt es andere Variabeln, wie Merker, Temponäre Variabeln oder
Variabeln in Datenbausteine. Das es funktioniert ist schön macht aber
in diesen Fall überhaubt keinen Sinn, nur um bei einer so Leistungsfähigen 
Steuerung eine AWL Zeile zu spraren. Das hört sich an wie, ich nehme
jetzt mein Feuerzeug aus den Handschuhfach, bei einen Auto mit 350PS,
damit es schneller fährt.


----------



## IBFS (9 April 2011)

mega_ohm schrieb:


> *S* wie "Setzen" mag ich nicht so gern, weil man sich dann auch um das *R *(Rücksetzen ) kümmern muß.



Ist das dein Ernst   alles immer nur mit "=".

Ich stelle mir gerade vor es gäbe kein S und kein R. 
Meine Programme hätten viel mehr Zwischenmerker
und wären viel länger und unübersichlicher.

Nimm es mir nicht übel, aber ich bin über diese Zeile
mehr als verwundert.

Frank


----------



## Corosop15 (9 April 2011)

Vielleicht macht er es ja mit Zuweisung und Selbsthaltung....


----------



## mega_ohm (10 April 2011)

Helmut_von_der_Reparatur schrieb:


> eigentlich meinte ich nicht das setzen eines "irgendwas", sondern
> das Rangieren von einen Eingang auf einen Anderen. Das finde ich
> mehr als Unglücklich. Eingänge als Variabel zu mißbrauchen ist unüblich,


Da stimme ich Dir zu 100% zu.
Ich hatte schonmal einen Kommentar verfaßt... " Wer macht denn sowas"
Meine Lösung sieht übrigens nicht so aus
	
	



```
U E0.0
= E108.2
```
(siehe meinen Kommentar #*16* )
Das ging nämlich grundlegend schief !
Ein Fan dieser Lösung bin ich sowieso nicht.
Es ist unübersichtlich und störanfällig, sobald mal wer auf die Idee kommt, die Peripherie zu lesen.


> dafür gibt es andere Variabeln, wie Merker, Temponäre Variabeln oder
> Variabeln in Datenbausteine. Das es funktioniert ist schön macht aber
> in diesen Fall überhaubt keinen Sinn, nur um bei einer so Leistungsfähigen
> Steuerung eine AWL Zeile zu spraren. Das hört sich an wie, ich nehme
> ...


Zitat aus #*18* : (Kurzfassung )

```
Ich habe mir tatsächlich die Mühe gemacht, 1 freien - nicht über WORD oder DWORD- Zugriff im Progi abgearbeiteten Merker zu finden.
 
Für meinen "Stopp"- Taster habe ich die Verknüpfung über den DB1 beibehalten.
```
Also doch keine "Wild-West"- Programmierung, wie man sie vielleicht in einer Simu machen könnte. ( das unterlasse ich aber auch, weil daraus schlechte "Angewohnheiten" entstehen könnten ) 

Ich stimme Dir zu, daß man bei einer SPS niemals den bequemsten, einfachsten Weg nur auf Grund von Faulheit suchen sollte.
Diese Lösung rächt sich irgendwann durch Instabilität oder vollkommen unnachvollziehbares Verhalten.
Eine Fehlersuche kann dann sehr schnell mal ein paar Stunden dauern... 
Die Stillstand-Kosten muß ich den Profis nicht erklären.

Ich habe mir alle Tipps angenommen. Jetzt funktioniert es so, als hätte es fast ein Profi programmiert. ( und sieht auch im Programm fast so aus, auch dank der Hilfe dieses Forums )

Die Signatur von IBFS
"Die Bitterkeit schlechter Qualität hält noch lange an, wenn die Süße des Preises längst verflogen ist... "
entspricht meiner Meinung. Viel treffender kann man "Rum-Gemurkse" nicht beschreiben << und ich will nicht murksen.
Deshalb frage ich lieber einmal mehr, bevor Mist in eine SPS hinein produziert wird. 

Mfg


----------



## mega_ohm (10 April 2011)

IBFS schrieb:


> Ist das dein Ernst  alles immer nur mit "=".
> 
> Ich stelle mir gerade vor es gäbe kein S und kein R.
> Meine Programme hätten viel mehr Zwischenmerker
> ...


Ich mache nicht alles grundsätzlich mit "*=*"

Wenn man aber ein "*S*et" verwendet, muß man sich auch um das "*R*eset" kümmern.
Für das Beispiel in #*17* (!!!) hatte ich da Bedenken.
_____________________________________________________

Übrigens mußte ich mich manchmal auch um das Rücksetzen eines "*=*" kümmern.
z.B.: wenn in AWL ein SPB / SPNB erfolgt 

Dieser Code ist Off Topic !!
Er hat mit dem eigentlichen Thema nichts zu tun, erläutert nur meine Aussage !

```
U M0.0
U M0.1
SPB M001
= M0.2
M001: NOP 0
```
Wenn die Bedingung für = M0.2 erfüllt wurde, ist der M0.2 = high. ( und bleibt es auch )
Entspricht einem S M0.2

Mfg


----------



## vierlagig (11 April 2011)

mega_ohm schrieb:


> Übrigens mußte ich mich manchmal auch um das Rücksetzen eines "*=*" kümmern.
> z.B.: wenn in AWL ein SPB / SPNB erfolgt
> 
> Dieser Code ist Off Topic !!
> ...



niemals nicht, wird der merker M0.2 high sein!


```
*
 M0.0 | M0.1 | VKE | SPB | M0.2
------+------+-----+-----+------
   0  |   0  |  0  |  0  |  0
   1  |   0  |  0  |  0  |  0
   0  |   1  |  0  |  0  |  0
   1  |   1  |  1  |  1  |  0
```


----------



## rostiger Nagel (11 April 2011)

mega_ohm schrieb:


> Ich mache nicht alles grundsätzlich mit "*=*"
> 
> Wenn man aber ein "*S*et" verwendet, muß man sich auch um das "*R*eset" kümmern.
> Für das Beispiel in #*17* (!!!) hatte ich da Bedenken.


 
häh, wie Bitte was gibt es den hier auszusetzen, das funktioniert wenigstens

```
O  E 0.0
O  E 108.2
S  #irgendwas
```
 
Setzen und Rücksetzen ist eine der Elemtarsten Anweisungen bei der Programmierung
von Speicherprogrammierbaren Steuerungen. Ersteinmal war das nur ein Beispiel,
ich hätte auch für dich folgendes schreiben können.


```
O  E 0.0
O  E 108.2
O  #irgendwas
=  #irgendwas
```
 
Diese Anweisungen führen zu den selben Ergebnis wie deine in Beitrag #17 angezweifelten Code.


Ob eine Speicherung mit "=" oder mit "SR" gemacht wird, ich muss immer wissen was
ich da tue und natürlich muss sich der Programmierer um das Rücksetzen kümmern wenn
er es den will. Es kann ja sein das "#irgendwas" einmal im Maschinenzyklus während einer
Initalisierungsroutine gesetzt werden soll und nie..nie wieder zurückgesetzt werden darf.
Wo ist jetzt das Problemm.


----------



## vollmi (11 April 2011)

mega_ohm schrieb:


> ```
> U M0.0
> U M0.1
> SPB M001
> ...



Dann fehlt ein SET ansonsten ist die Bedingung ohne Sprung für die Zuweisung ja immer 0.

Aber wozu sollte man sowas tun? Wer macht Sprünge und führt innerhalb einer Sprunganweisung VKE abhängige Zuweisungen aus?

Gäbe es Bedingte Lade und Transferbefehle ich hätte glaub ich 90% weniger Sprünge. Da binde ich mir doch keinen Sprung ans Bein der nur VKE abhängige Anweisungen überspringt.

Kann so etwas Sinn Machen?


----------



## mega_ohm (16 April 2011)

vollmi schrieb:


> Dann fehlt ein SET ansonsten ist die Bedingung ohne Sprung für die Zuweisung ja immer 0.
> 
> Aber wozu sollte man sowas tun? Wer macht Sprünge und führt innerhalb einer Sprunganweisung VKE abhängige Zuweisungen aus?
> 
> ...


 
Wieso ist die Bedingung "immer 0" ??

  Ein Bild sagt mehr als 1000 Worte...


----------



## vollmi (16 April 2011)

mega_ohm schrieb:


> Wieso ist die Bedingung "immer 0" ??
> 
> Ein Bild sagt mehr als 1000 Worte...



Bei seinem Aufruf ist die Bedinung immer Null. Da ja das VKE für den Sprung verantwortlich ist. Und wenn der Sprung nicht ausgeführt wird weil das VKE 0 ist ist, bleibt es das auch solange kein neues Ergebnis den Wert ändert. Ein nicht ausgeführter Sprung verändert das VKE nicht.


----------



## Question_mark (16 April 2011)

*Nana*

Hallo,



			
				vollmi schrieb:
			
		

> Ein nicht ausgeführter Sprung verändert das VKE nicht.





			
				vl schrieb:
			
		

> niemals nicht, wird der merker M0.2 high sein!



Der nicht ausgeführte Sprung bei "SPB M001" setzt das VKE auf "1", und jetzt ratet mal, was der M 0.2 dann für einen Status hat ?

Gruß

Question_mark


----------



## rostiger Nagel (16 April 2011)

Diese Art etwas Speichern zu machen ist mehr als ungünstig, also
um das zu erkennen muß mann ja schon wirklich eine Wahrheitstabelle
erstellen, trotzdem nützt die in diesen fall auch nichts.
Gerade weil einer der Besten Step 7 Programmier, den ich kenne (4L) dieses
auch nicht erkannt hat kann mann, nur davor abraten so einfache Sachen
so Kompliziert zu lösen


Ich habe das jetzt noch mal durch PLCSIM laufen lassen und nur den OB1
mit folgenden Inhalt eingefügt und bin zur folgender Wahrheitstabelle
gekommen.


```
U M0.0
      U M0.1
      SPB M001
      = M0.2
M001: NOP 0
 
 
 M0.0 | M0.1 | VKE | SPB | M0.2
------+------+-----+-----+------
   0  |   0  |  1  |  0  |  1
   1  |   0  |  1  |  0  |  1
   0  |   1  |  1  |  0  |  1
   1  |   1  |  1  |  1  |  0   *
 
* dieser Fall tritt nur ein wenn M0.0 & M0.1 beim OB1
  anlauf auf "1" war oder nach diesen Anweisungen
  der M0.2 zurück gesetzt wurde.
```
 
Warum jetzt das VKE "1" wird, liegt daran das bei VKE abhängingen 
Sprungfunktionen das Statusbit und* VKE auf "1"* und OR und /ER auf "0"
gesetzt werden, auch bei *nicht* erfüllter Sprungfunktion.


schön wäre ja zu erfahren unter welchen bedingungen der M0.2 gesetzt 
werden soll und vor allen dingen wann er wieder zurück gesetzt werden
soll und welcher tiefere sinn dahinter steckt?


----------



## 190B (16 April 2011)

Auszug aus der STEP7 Hilfe:


```
Format 
SPB <Sprungmarke>
 
Operand             Beschreibung
<Sprungmarke>   Symbolischer Name des Sprungziels. 

Beschreibung 
Wenn VKE = 1, unterbricht SPB <Sprungmarke> den linearen Programmablauf und springt an das Sprungziel. Der lineare Programmablauf wird am Sprungziel fortgesetzt. Das Sprungziel wird durch eine Sprungmarke angegeben. Es kann sowohl vorwärts als auch rückwärts gesprungen werden. Sprünge können nur innerhalb eines Bausteins ausgeführt werden, d. h. die Sprunganweisung und das Sprungziel müssen innerhalb desselben Bausteins liegen. Das Sprungziel darf innerhalb dieses Bausteins nur einmal vorhanden sein. Die maximale Sprungweite liegt bei -32768 bzw. +32767 Wörtern des Programmcodes. Die tatsächliche maximale Anzahl der Anweisungen, die übersprungen werden können, hängt von der Kombination der Anweisungen innerhalb des Programms ab (Ein-, Zwei- oder Dreiwortanweisungen).
 
[COLOR=royalblue][B]Wenn VKE = 0, wird der Sprung nicht ausgeführt. Das VKE wird auf "1" gesetzt, und der Programmablauf wird mit der folgenden Anweisung fortgesetzt.[/B][/COLOR]
 
  
Statuswort
             BIE A1 A0 OV OS OR STA VKE /ER
schreibt:  -    -   -   -   -    0    1    1    0

 
Beispiel
AWL               Erläuterung
U E 1.0 
U E 1.2 
SPB JOVR        //Springe, wenn VKE = 1, zur Sprungmarke JOVR.
L EW8            //Der Programmablauf wird hier fortgesetzt, wenn der Sprung nicht ausgeführt wird.
T MW22 
JOVR: U E 2.1 //Der Programmablauf wird nach dem Sprung zur Sprungmarke JOVR hier fortgesetzt.
```
 

Gruß
190B


----------



## rostiger Nagel (16 April 2011)

noch mal das Statuswort, damit mann es richtig lesen kann


```
Statuswort
 BIE ! A1 ! A0 ! OV ! OS ! OR ! STA ! VKE ! /ER
-----+----+----+----+----+----+-----+-----+----- 
  -  ! -  ! -  ! -  ! -  ! 0  !  1  !  1  !  0
```


----------



## 190B (16 April 2011)

Hallo Helmut von der Reparatur,

Danke für das "Nachbessern". Im Editor sieht es doch anders aus wie das tatsächliche Ergebnis. 

Gruß
190B


----------



## vollmi (16 April 2011)

Helmut_von_der_Reparatur schrieb:


> Warum jetzt das VKE "1" wird, liegt daran das bei VKE abhängingen
> Sprungfunktionen das Statusbit und VKE auf "1" und OR und /ER auf "0"
> gesetzt werden, auch bei nicht erfüllter Sprungfunktion.



Uff das wusste ich garnicht. Da wär ich sicher igendwann man drauf reingefallen. Da denkt man man hätte mittlerweile die Kniffe in der S7 Programmierung raus und dann kommt wieder sowas daher :sm19:


----------



## mega_ohm (17 April 2011)

Question_mark schrieb:


> Hallo,
> 
> 
> 
> ...


Man muß nicht raten...  ich habe die Grafik angehangen.  

Mfg


----------



## mega_ohm (17 April 2011)

Helmut_von_der_Reparatur schrieb:


> Diese Art etwas Speichern zu machen ist mehr als ungünstig, also...
> 
> 
> > Es war ein Beispiel, *KEIN* Lösungsvorschlag für irgendwelche Sachen.
> ...


----------



## rostiger Nagel (17 April 2011)

mega_ohm schrieb:


> Helmut_von_der_Reparatur schrieb:
> 
> 
> > Diese Art etwas Speichern zu machen ist mehr als ungünstig, also...
> ...


*

Das mit den zitieren hat in den Beitrag #36 nicht geklappt, ich versteh
den ganzen Beitrag nicht. 

PS. meine Zeit kannst du nicht stehlen, die teile ich mir selber ein *


----------

