Frage bezüglich OB1

DerPraktikant

Level-1
Beiträge
65
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Der OB1 birgt noch immer einige Rätsel für mich. Soweit ich jetzt weiss kann man ja von ihm aus die Haupstbausteine aufrufen. Ist es möglich dann folgendes in den OB1 zu schreiben:

Code:
UN E 0.0 //Notaus nicht gedrückt
CC FB3 //Aufruf des Bausteins "Testbereit"
//Letzte Anweisung von FB3 ist die Zahl 4 in MD100 zu transferieren
 
UN E 0.0 //Notaus nicht gedrückt
U(
L MD100
L 4
==I) //und Zahl in MD100 lautet 4
CC FB4
//Letzte Anweisung von FB4 ist die Zahl 5 in MD100 zu transferieren
 
UN E 0.0 //Notaus nicht gedrückt
U(
L MD100
L 5
==I) //und Zahl in MD100 lautet 5
CC FB5

Würde das so klappen, oder sollte ich doch besser mit einer Sprungleiste hier arbeiten oder bin ich total auf dem Holzweg?

Die aufgerufenen Bausteine selbst haben an sich keine Eingangsparameter, nur Bedingungen, und höchsten zwei Ausgaben in Form von MDs
 
und höchsten zwei Ausgaben in Form von MDs

ist der satz den ich nicht so ganz verstehe ...
wenn du die bausteine mit CC aufrufst kannst du keine parameter übergeben, auch STAT-variablen werden mangels zugewiesenen IDB nicht funktionieren, wenn deine mit CC aufgerufenen FBs allerdings nur mit globaldaten arbeiten, funktioniert das gut.

also: hast du eine schnittstelle definiert - dann geht das nicht. (mal die möglichkeit der IDB-übergabe über AR2 ausgeschlossen)

ansonsten ist es so möglich, wie du es gepostet hast. der ablauf des OB1 ist sequentiel (und zyklisch) d.h. der mit 4 beschriebene wert aus FB3 ist nach abarbeitung dessen, global verfügbar.

[edit] warum benutzt du zum speichern einer INT-zahl ein doppelwort? die passt doch bequem in ein MW ... <- ich hatte dich bereits darauf hingewiesen, dass es sauberer ist zahlenformate eindeutig zu benutzen. d.h. wenn du mit dem MD100 arbeiten möchtest solltest du auch mit ==D auf L#4 bzw. L#5 vergleichen bzw. diese zahlen dann auch im MD100 ablegen. [/edit]
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja also zunächst einmal hätten zwei Bausteine die Aufgabe Kräfte zu messen und diese sollten dann irgendwo abgespeichert sein, damit man sie am Ende des Tests auf einem TP anzeigen lassen kann.

Vielleicht sollte der Bausteinaufruf dann eher so erfolgen, z.B.:

Code:
UN E 0.0
U(
L MW100
L 3
==I)
CALL FB3
  IN     := PEW 6 //hatte vergessen dass ich doch einen analogen Input habe
  OUT1 := MD0
  OUT2 := MD4

Die folgende Frage ist vermutlich zwar selbstverstädnlich, aber ich wil sichergehen: Die IN und OUT Angaben muss ich ja dann im entsprechenden Baustein auch in der Umgebung/Schnittstelle Leiste eintragen nehme ich an? Und als was?

IN über PEW 6 ist ein analoges Eingangssignal eines Kraftsensors, mit Spannung zwischen 0...10V.
Die beiden OUT wären dann die von einem FC105 umgewandelten Werte von dem analogen Eingangssignal welche dann in den MD0 und MD4 abgespeichert bleiben sollten bis zur Anzeige am TP.

Gerade fällt mit auch ein dass ich anstelle von MDs für diese Werte an sich auch MWs nehmen könnte da beide Werte ganze Zahlen zwischen 0...20.000 darstellen sollen, oder?

So das waren wieder mal viele nette Anfängerfragen um euch den Morgen zu versüssen :rolleyes:
 
1. wenn du einen CALL bedingen willst, mußt du ihn umspringen.
2. der IN ist als WORD zu deklarieren
3. die beiden OUT als INT oder DINT oder REAL (ich bin mir immer noch nicht so ganz im klaren, welche werte du an deinem kraftmessbock als gleitkomma und welche als ganzzahl verarbeitet werden sollen

4. die ausbildungsunterlage liegt dir vor?

[edit]
5. wenn du einen FB mit CALL aufrufst ist eine IDB zu übergeben (ausnahmen bilden hier multiinstanzen)
[/edit]
 
Zuletzt bearbeitet:
Ich nehme mir mal die Freiheit Deinen Text auseinander zu pflücken und Punkt für Punkt zu antworten ;)

1. Verstehe, dann müsste es in etwa so aussehen:
Code:
UN E 0.0
U(
L MW100
L 3
==I)
SPBN ENDE
CALL FB3
  IN     := PEW 6 
  OUT1 := MD0
  OUT2 := MD4
SPA ENDE
 
ENDE: NOP 0

2. Danke

3. Also rein (IN) kommt wie gesagt ein analoger Wert in Form einer Spannung zwischen 0 und 10V, welche am Ende (OUT) als eine ganze Zahl zwischen 0 und 20000 dargestellt werden soll.

In einem anderen Thread wurde mir ans Herz gelegt den IN, der ja auch der IN für den FC105 ist, zwischen LO_LIM:=0.000000e+000 und HI_LIM:=2.000000e+004 zu begrenzen, so dass ich davon ausgehe dass ich ihn als Realwert eingeben sollte? Oder dienen diese Werte nur dazu der CPU mitzuteilen dass 0V=0.000000e+000 entsprechen und 10V=2.000000e+004, und die Deklaration des Eingangs kann eine andere sein?

Was die OUTs betrifft, sollten diese nur als ganze Zahlen zwischen 0 und 20000 dargestellt werden auf dem TP, da die Anwendung recht grob ist und ein Komma die Arbeiter nur unnötig verwirren würde. Eine Toleranz von +/- 200 ist dabei kein Problem.

Wenn ich das ganze Konzept mit dem Dualzahlensystem richtig verstanden habe, brauche ich mindestens 14 Bit um bis 20000 zu kommen. Das sind also dann mindestens 4 Byte, mit anderen Worten, es muss dann ein MD sein um die OUT-Werte abzuspeichern, oder?

4. Ja, hab ich ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zu 1.
edit-punkt 5 nicht übersehen
zu 3.
der FC105 gibt dir einen REALwert aus, diesen müßtest du ggf. mit RND in eine ganzzahl wandeln um sie dann als INT augeben zu können
der wertebereich von INT umfasst -32768 .. +32767
dafür sind 16bit notwendig. 1 byte hat 8bit, also sind 16bit zwei byte, zusammengefasst ein WORD
 
So langsam gehts glaub ich

Code:
UN E 0.0
U(
L MW100
L 3
==I)
SPBN ENDE
CALL FB3
  IN     := PEW 6 
  OUT1 := MD4
  OUT2 := MD8
L DB3.MD4
RND+
T MD12
L DB3.MD8
RND+
T MD16
SPA ENDE
 
ENDE: NOP 0

So, ich bin mir jetzt nur noch nicht ganz sicher was die Adressierung des DB3 betrifft. Und ist die Bezeichnung MD4 resp MD8 global oder bezieht sie sich nur auf den FB, resp DB. So dass man die Bezeichnungen MD4 resp MD8 noch im Rest des Programms verwenden kann. Z.B. so:

Code:
UN E 0.0
U(
L MW100
L 3
==I)
SPBN ENDE
CALL FB3
  IN     := PEW 6 
  OUT1 := MD4
  OUT2 := MD8
L DB3.MD4
RND+
T MD4
L DB3.MD8
RND+
T MD8
SPA ENDE
 
UN E 0.0
U(
L MW100
L 4
==I)
SPBN ENDE
CALL FB3
  IN     := PEW 6 
  OUT1 := MD4
  OUT2 := MD8
[B]L DB3.MD4[/B]
RND+
[B]T MD12[/B]
[B]L DB3.MD8[/B]
RND+
[B]T MD16[/B]
SPA ENDE
 
 
ENDE: NOP 0

Oder muss man noch etwas extra berücksichtigen wenn man einen FB ein zweites Mal adressiert?
 
So langsam gehts glaub ich

"ich glaube nicht, tim!" :rolleyes:

wo fangen wir jetzt an ... ich kopier einfach mal deinen code und versuch ihn in ordnung zu bringen

Code:
*
UN E 0.0
U(
L MW100
L 3
==I)
SPBN ENDE
CALL FB3, [COLOR=Red][B]DB3    [/B][COLOR=Black]//instanz-DB zum FB3 angeben[/COLOR][/COLOR]
  IN     := PEW 6 
  OUT1 := MD4
  OUT2 := MD8
// FLASCH: L [COLOR=Red][B]DB3.[/B][/COLOR]MD4
L MD4
RND+
T MD12
// FALSCH: L [B][COLOR=Red]DB3.[/COLOR][/B]MD8
L MD8
RND+
T MD16
SPA ENDE
 
ENDE: NOP 0
1. ein element eines globalen-datenbausteins wird wie folgt adressiert

Code:
*
      U     DB1.DBX    0.0              //bit
      L     DB1.DBB    0                //byte
      L     DB1.DBW    0                //word
      L     DB1.DBD    0                //dword
2. elemente eines instanz-datenbausteins (und ich möchte anmahnen solche zugriffe wenn nur irgend möglich zu vermeiden werden wie folgt adressiert:

Code:
*
      AUF   DI     1                    //IDB öffnen, da ein qualifizierter zugriff auf IDBs nicht möglich ist
      U     DIX    0.0                  //bit
      L     DIB    0                    //byte
      L     DIW    0                    //word
      L     DID    0                    //dword
3. ich weiß nicht so recht, was du vorhattest, aber wenn du ohne globalen DB auskommst, kannst du sehr wohl mit dem merkerbereich (wie in meiner korrektur) arbeiten. wenn du einen globalen DB nutzen möchtest, so solltest du die entsprechenden elemente da auch ablegen:

Code:
*
CALL FB3, DB3
  IN     := PEW 6 
  OUT1 := DB[I]xy[/I].DBD[I]u[/I]
  OUT2 := DB[I]xy[/I].DBD[I]v[/I]

diese kannst du dann im folgenden so verwenden.

man sollte halt nur wissen, was man will! alles klar? alles klar!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast immer noch keine IDB übergeben! Außderem brauchst du das PEW 6 nicht mehr, wenn du es einmal mit dem FC 105 aus der aus Bauteinbibliothek bearbeitet hast.

CALL FC 105
IN :=PEW6
HI_LIM :=2.000000e+004
LO_LIM :=0.000000e+000
BIPOLAR:=FALSE
RET_VAL:=MW1
OUT :=MD12

Jetzt hast du im MD 12 deinen normierten Wert, der zwischen 0.0 und 20000.0 liegt.

Als nächstes deine FB Aufrufe:

UN E 0.0
U(
L MW100
L 3
==I)
SPBN ENDE
CALL FB3 ,DB 3
IN := MD 12 ->Hier kannst du also mit dem MD 12 weiter arbeiten!
OUT1 := Mw4
OUT2 := Mw8

ENDE: nop 0

Die Wandlung deiner Outs in eine Ganzzahl würde ich direkt im FB machen, und nicht erst ausserhalb.

Mist, da war ich zu langsam!
 
Zuletzt bearbeitet:
Mist, da war ich zu langsam!

nich schlimm, deine hinweise haben ja erweiternden und struktur bezogenen charakter. ich finde sie wichtig und richtig. auch wenn es mir zu müßig ist, dass programm in seiner struktur anzuzweifeln - was, wenn ich alle code-schnipsel die DerPraktikant in den letzten tagen so brachte zusammennehme, aber auf jeden fall notwendig wäre. aber auf meine frage hier, nach der struktur, bekam ich keine antwort und ich renne keinem hinter her :rolleyes:
 
Danke ihr beiden

Ja, was die Struktur des Ganzen betrifft, da werkele ich gerade dran.

Insgesamt müsste mein Programm jetzt lebensfähig sein, aber es besteht noch aus einem OB und einem FB, der die ganzen Anweisungen der Reihe nach in einem Netzwerk enthält. Nicht sehr elegant, sollte aber funktionieren.

Die Sache mit dem Strukturieren ist durchaus auch sinnvoll, für den Fall dass einer nach dem Ende meines Praktikums sich an die Anlage rantraut und versucht etwas daran umzuändern, diese Person sollte dann am besten auch nicht verzweifeln müssen daran :ROFLMAO:.

Beim Strukturieren weiss ich allerdings noch nicht so recht wie ich die einzelnen Schritte in FBs aufteilen kann, da zwar hauptsächlich nur ein Weichenmotor und ein Pumpenmotor angesteuert werden, aber vor allem beim Weichenmotor das Problem ist dass er so angesteuert werden soll wie es "in Wirklichkeit" längs der Gleise der Fall ist. Also nicht mit zwei simplen Signalen für "einfahren", "ausfahren" und "halt" sondern über 6 Relais die in einer bestimmten Reihenfolge, je nach Lage, schalten.

Wie unschwer erkennbar ist, brauche ich zunächst selbst einen Plan wie ich das strukturieren will, ehe ich damit loslege ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie unschwer erkennbar ist, brauche ich zunächst selbst einen Plan wie ich das strukturieren will, ehe ich damit loslege ;)

dieser plan sollte entstanden sein, bevor überhaupt die erste zeile code geschrieben wird. nachträglich können immer änderungen auftauchen, ja, aber das grundgerüst sollte auf papier gebracht sein. da hilft auch kein: ;) ... das ist bullshit!
 
Struktur........

Also Struktur ist nur dein kleinstes Problem.

Du hast schon grundlegende Probleme wie man einen FB aufrufst, einen Wert skalierst, Variablen normierst.....

Ich denke, wenn du die Befehle alle beherrschst, dann kann man über eine echte Struktur nachdenken, aber bis dahin solltest du nur versuchen das ganze ein wenig übersichtlich zu halten. Von Struktur wage ich da noch nicht zu sprechen.:rolleyes:
 
Hallo, falls ich kurz etwas anmerken darf und dies erwünscht ist.

Um näher an die Din EN 661131 zu kommen (Was bei Siemens ja nicht so leicht ist) sollte mit deklarierten Variablen gearbeitet werden und nicht mit Merkerwörtern. Sprich eine DB Variable als Textvariable und keinen M.
Hier bieten sich UDT sehr schön an.

Hoffe ist hilfreich, grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Struktur ist nur dein kleinstes Problem.

Du hast schon grundlegende Probleme wie man einen FB aufrufst, einen Wert skalierst, Variablen normierst.....

Ich denke, wenn du die Befehle alle beherrschst, dann kann man über eine echte Struktur nachdenken, aber bis dahin solltest du nur versuchen das ganze ein wenig übersichtlich zu halten. Von Struktur wage ich da noch nicht zu sprechen.:rolleyes:

Rate auch immer erst einmal die Strukturen zu lernen.
Hoffe es erscheint nicht unhöflich wenn ich als Beispiel einen polnischen Hilfsarbeiter und einen deutschen Meister neme. Bei beiden kommt Strom aus der Steckdose, aber die Installationen und Arbeitsabläufe sind sicherlich grund verschieden.
 
Hier bieten sich UDT sehr schön an.

ich hoffe doch sehr, dass DerPraktikant auch eine symboltabelle pflegt.
was du hier mit einem UDT willst, ist mir auf den ersten blick nicht so ganz klar, aber du wirst schon wissen, was du meinst ... ein UDT ist IMHO sinnvoll wenn ein und die selbe zusammengesetzte datenstruktur an unterschiedlichen stellen zum einsatz kommen soll - so gewinnt man eine durchgängigkeit des projektes ... aber einfach mal so UDT in den raum zu stellen ist natürlich auch ganz großes kino ;)
 
dieser plan sollte entstanden sein, bevor überhaupt die erste zeile code geschrieben wird. nachträglich können immer änderungen auftauchen, ja, aber das grundgerüst sollte auf papier gebracht sein. da hilft auch kein: ;) ... das ist bullshit!
Also mit Verlaub, das ist Quatsch!
Jedenfalls für jemanden der gerade mit SPS anfängt. Der muss das System ja erst mal kennenlernen um die Möglichkeiten einer sinnvollen Strukturierung zu "erforschen".

Als ich mit der SPS-Programmierung angefangen habe, habe ich ebenso wie Praktikant einfach "drauflos" programmiert und dadurch erst den Sinn und die Möglichkeiten einer vernünftigen Programmstruktuierung erlernen können.

@Praktikant: Wie Du das angefangen hast finde ich das schon ganz richtig. Bei Deinen nächsten Projekten wirst Du wahrscheinlich von ganz alleine darauf kommen wie sinnvoll es ist sich vor Beginn der Programmierung über eine sinnvolle Struktur Gedanken zu machen, da bedarf es gar keiner Hinweise a'la "Bullshit".:D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Maxi

Das ist schon richtig mit deinem Vergleich, jedoch beherrschen beide die technischen Grundlagen, und da scheint es hier zu hapern.

Das mit den UDT ist sicher sinnvoll, aber verwirrt den armen Praktikanten wahrscheinlich komplett!
 
@OHGN: das danke ist dafür, dass du ihn nicht noch mehr entmutigst ...

ich ging übrigens nicht davon aus, dass er eine struktur mit einer vier- oder fünffachgeschachtelten multiinstanz entwirft und wie wild UDTs, STRUCTs und ARRAY hoch und runterreicht ...

viel mehr ging ich vom entwurf entlang der ausbildungsunterlage aus, denn da steht sehr wohl drin, wie funktionsgruppen sinnvoll gebildet werden können. da steht auch drin, wie man eine solche funktionsgruppe dann definiert ... alles was dann für spätere arbeiten darüber hinaus geht fußt natürlich auf erfahrungswerten.

und zu dem ging ich davon aus, dass er einen linearen ablauf aufs papier gebracht hat, anhand dessen er die einzelenen funktionen später implementieren kann. dazu braucht es keine kenntnisse über die sprache, sondern nur kenntnisse über das formulieren logischer abläufe (stichworte: IST - DANN - SONST; SOLANGE WIE - MACHE etc. pp.)

und für all das brauch ich keinen rechner, ich brauch ein stück papier und einen stift und die disziplin einen ablauf entwerfen zu wollen ... sicher reizt es immer mehr schon mal ein "hallo welt" zu machen. aber das sollte nicht in dem projekt passieren, welches man am ende als die erste gelungene arbeit präsentieren möchte PUNKT
 
Nana. Ich verstehe schon dass ich einen alten SPS-Hasen an den Rand der Verzweiflung bringen kann mit meinen Fragen, aber lieber stelle ich dumme Fragen und werde darauf hingewiesen als dass mir nachher die SPS um die Ohren fliegt..

Nun vielleicht habe ich mich auch schlecht ausgedrückt, Struktur ist natürlich drin, auch in der jetzigen Version, aber wo sich einige Stellen ähneln könnte ich eventuell FBs setzen um Speicher zu sparen, und wenn ich mich dann damit eingehender beschäftige lerne ich auch noch was dabei.

Hier sind zunächst einmal die einzelnen Abschnitte, wobei ich noch einmal anmerken will dass ich ein verschreckter Praktikant bin der festgestellt hat dass der nette SPS-Versuch im Uni-Labor nicht viel gemeinsam hat mit der SPS-Realität:

1. Start
2. Testbereit
3. Prüfschieberstromkreise testen
4. Haltekraft messen
5. Stellkraft messen
6. Testende und Testergebnisse anzeigen

Zur Zeit sieht es jetzt so aus, alles in einem Netzwerk in FB1 (ausser 1.):

2 (hier hat man die Wahl zwischen vollst. Test, nur Haltkraft oder nur Stellkraft)
3 (vollst. Test mit 3, 4 und 5 nacheinander)
4
5
4 (nur Haltekraft testen)
5 (nur Stellkraft testen)
6 (danach zurück zu 2 und wieder von vorne wenn mans denn möchte)

Wie man unschwer erkennen kann, bietet es sich an, den Code für 4 und 5 in einzelne FBs zu setzen. Bei 2, 3 und 5 könnte man es auch tun, ist aber nicht zwingend notwendig.

Ich werde heute noch versuchen mal den OB1 entsprechend zu schreiben so dass es mit mehreren FBs funktioniert.
 
Zuletzt bearbeitet:
Zurück
Oben