Parameter-Übergabe an FC

Larry Laffer

Super-Moderator , User des Jahres 2008-2009
Teammitglied
Beiträge
14.426
Reaktionspunkte
3.282
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich könnte da mal eine Anregung gebrauchen ...

Zunächst ein bißchen drum-herum-Geplänkel :
In menier Firma arbeiten wir viel mit Rundtischen für Monatge und Prüf-Aufgaben. Um die einzelnen Arbeitsschritte der Rundtisch-Station korrekt nachvollziehen zu können bilde ich das Ergebnis deren Arbeit in einem sogenannten "Schiebespeicher" ab. Das ist im Prinzip ein rotierendes ARRAY of UDT. Der Inhalt dieses Schiebespeichers gibt u.A. die Start-Freigabe für die jeweilige Station. Das sieht im Moment in etwa so aus :
Code:
UN  DB100.DBX10.0   // Teil nicht NIO
U   DB100.DBX10.1   // Teil 1 vorhanden
UN  DB100.DBX10.2   // Teil 2 vorhanden
=  #Teil_OK
Das funktioniert auch und ist im Prinzip OK. Nun möchte ich aber lieber eine FC habe, die mir Teil_OK als BOOL zurückgibt entsprechend der Parameter, die ich übergeben habe. Und da ist jetzt mein Problem ...

Am liebsten würde ich es so machen :
Code:
call FC 500
  Station := 12
  Maske  := 'nNIO,T1,nT2'
Aber das möchte die SPS natürlich nicht. Ich möchte den String, den ich bei Maske übergebe nicht in einem DB hinterlegen, sondern die Parameter frei antragen können. Ich bestehe allerdings nicht auf diese Form der Parameter-Übergabe.

Hat jemand dazu eine gute Idee (kein Programmier-Vorschlag) ?
Danke schon mal im Voraus ...
 
sind die übergebenen parameter immer die ersten 3 bit des bytes?

dann könntest du doch einfach das byte übergeben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

am einfachsten wird es sein wenn du einen Parameter vom Typ "UDT" übergibst. Dann stehen dir im Fb alle Variablen symbolisch zur Verfügung. Oder halt über Any-Pointer.


Gruß, Onkel
 
sind die übergebenen parameter immer die ersten 3 bit des bytes?

Nein, es können z.Zt. bis zu 16 Bits werden, je nachdem, wie weit die Station hinten im Prozess steht. Es ist auch nicht so, dass immer alle Bits gesetzt sind. Es kann genauso sein, das welche nicht gesetzt sein sollen. Eben im Prinzip so, wie ich es oben dargestellt habe ...

von Onkel Dagobert: am einfachsten wird es sein wenn du einen Parameter vom Typ "UDT" übergibst. Dann stehen dir im Fb alle Variablen symbolisch zur Verfügung. Oder halt über Any-Pointer.

wie fügt man eigentlich 2 Zitate richtig ein ?
Ein UDT ist es jetzt ja schon. Ich hätte am Liebsten (man kann sich ja mal was wünschen - es ist ja bald wieder Weihnachten) eine parametrierte Übergabe. Die Funktion soll sich dann selbst daraum kümmern, wo der Salat weg kommt und ob es "1" oder "0" ist. Ich dachte da so ein bißchen an die gute alte Turbo-Pascal-Zeit.
 
Das mit dem Schiebespeicher mache ich genauso, allerdings hat sich gezeigt, daß es sinnvoll ist auch noch jeder einzelne Station ein Bit "Habe gearbeitet" mit auf die Teileinformation zu legen. Wenn jemand den Rundtisch per Hand 2 Stationen weiter gedreht hat, wurden ansonsten Teile bearbeitet, denen vorhergehende Schritte fehlen. Da man auch u.U. Stationen abwählen kann, je nach herzustellendem Teil, bin ich dann von so einem FC abgekommen, wie er dir vorschwebt und bilde mit nach wie vor meine Bits "Teil bearbeiten" etc. von Hand, so wie du das ja bisher auch machst. Aber es lohnt sich wohl, mal wieder darüber nachzudenken. Man kann natürlich dem FC 16 Bool-IN verpassen (für ein Wort z.Bsp.), welche alle True sein müssen, damit am Out ein "Teil bearbeiten" erscheint. Ungenutze bekommen ein True an den Input. Wenn du viele negierte Bits hast könnte man eine "Input-Maske im Wortformat vorsehen". Die Bits darin, negieren dann bei Bedarf im FC den Input.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,
den Ansatz (UND-Maske und ODER-Maske) hatte ich auch schon. Das wäre für mich auch OK. Aber ich habe ja noch 2 Mitarbeiter, die das Ganze idealerweise auch verstehen sollen. Ich habe da allerdings schon die Erfahrung gemacht, das so etwas wie L 2#11100011_00001111 auf ein wenig Unverständnis stösst. Vor allen Dingen dann, wenn noch H- und L-Byte vertauscht dargestellt werden ...

Ich hatte ja schon erwähnt, meine aktuelle Lösung tut es. Ich möchte halt nur etwas "schickes" neues erstellen ... Irgendwie lässt mich halt dieser Gedanke nicht los ...

Die andere Geschichte mit "habe gearbeitet" mache ich auch. Manche Station haben gearbeitet, wenn sie ihr Teil hinzugefügt haben, andere wenn sie es (wie auch immer) geprüft haben und wieder andere, wenn sie es bearbeitet haben. Das taucht dann auch so in meiner UDT-Zuordnung auf.
 
Na gut, wenns fdenn dein sein soll :ROFLMAO: dann wird halt ein langer FC:

NEG_IN01
FRG_IN01
NEG_IN02
FRG_IN02
NEG_IN03
FRG_IN03
...
NEG_IN16
FRG_IN16

als INPUT
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,
den Ansatz (UND-Maske und ODER-Maske) hatte ich auch schon. Das wäre für mich auch OK. Aber ich habe ja noch 2 Mitarbeiter, die das Ganze idealerweise auch verstehen sollen. Ich habe da allerdings schon die Erfahrung gemacht, das so etwas wie L 2#11100011_00001111 auf ein wenig Unverständnis stösst. Vor allen Dingen dann, wenn noch H- und L-Byte vertauscht dargestellt werden ...

Ich glaube zu verstehen, aber nicht warum

call FC 500
Station := 12
Maske := 'nNIO,T1,nT2'

für die 2 anderen Mitarbeiter klarer ist.

Weil da muss man nun auch einen Syntax einhalten.....und der muss, wie auch immer gecheckt werden.

Weiters, in Deinem Wunsch FC fehlt noch der "Istzustand" oder? Die "Maske" beschreibt doch nur wie es sein soll, oder steht der Istzustand immer im DB100.DBX10.0 ...... DB100.DBX11.7 (oder was auch immer für eine Länge)?
 
Hallo Booromeus,
der Istzustand ist das was in dem DB drinsteht. DBD10 steht für Station 1, DBD14 für Station 2 usw.
Der Wunsch-FC soll (sollte) über den RET_VAL zurückgeben, ob die Vorgabe mit dem Istzustand übereinstimmt.

Der Hintergrund der ganzen Geschichte ist, dass manchmal die Stationen auf (an) dem Drehtisch ihre Postion wechseln. Ich brüchte dann jetzt nun den Index an meinem FC ändern (im Bespiel die 12) und schon ist alles vergessen. Selbstverständlich gibt es wenn dann auch noch einen 2. FC, der in der Lage ist, die Zustände zu manipulieren. Aber hat man das Eine, dann ergibt sich daraus auch das Andere ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei mir ist's auch ein Register in das jede Station schreiben kann. Bei mir hat jedes Teil allerdings einen eindeutigen Status. Und der ist in einem Db als Int hinterlegt.

0 Status: Vorhanden
1 Status: niO
2 Status: Station 1: unbearbeitet
3 Status: Station 1: bearbeitet
4 Status: Station 2: unbearbeitet
5 Status: Station 2: bearbeitet
.
255 Status: unbekannt

So kann jede Station erkennen ob ein Teil vorhanden ist, ob es ueberhaupt fuer sie gedacht ist...

Und beim Cpu-Hochlauf (Ob100) oder Steuerung ein wird der Status auf 255 gesetzt...

Und wenn du mit ner HMI arbeitest kannst du jeder Int ein anders Bild zuweisen... So kann man den Bearbeitungsstatus prima Visualisieren...

Also bei mir hat sich die "Zahl"
 
Hallo xHasx,
das hilft mir leider nicht, da die Geschichte Platz-bezogen und nicht Stations-bezogen abläuft. Es können (Ralle hatte das auch schon erwähnt) ja auch mal Hand-Takte dazwischenkommen und dann wird eventuell die eine oder andere Bearbeitung übersprungen. Oder es werden aufgrund erfolgter Prüfungen Teil-Teile wieder entnommen. Deswegen ist dann nicht alles Schrott, sondern es geht spätestens nach einer Umrundung ganz normal weiter.
Ansonsten läuft natürlich alles auch über eine Visu (Panel-PC) wo die dann auch viele bunte Punkte usw. anzeige ...
 
Genau das erreichst du damit!!!
Jedes Stationsregister hat Soviele Teilereister wie Teile vorhanden sind!!!

Angenommen du hast 5 Stationen und jeweils 10 Teile -> Dann machst du die ein UDT_X 'Teil' mit nem Array von 10 INT's fuer den Teilestatus -> Dann machst du dir eine UDT_Y 'Station' mit nem Array von 25 UDT_X

Jetzt kannst du der entsprechenden Station ganz easy den kompletten Teilestatus uebergeben. Anhand des Teilestatus kannst du jetzt entscheiden was du mit den Teilen machst - bearbeiten, nicht bearbeiten, entnehmen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das erscheint mir aber doch etwas umständlich. Ich habe durchschnittlich 16 - 20 Bearbeitungsstationen, bei denen (wie schon gesagt) Teile auch degradiert werden können. D.h. dann, dass ich (bei 16 Stationen) wenn eine Station etwas macht ich das den 15 anderen Stationen mitteilen muss ...

Oder habe ich dich da falsch verstanden ...?
 
Das sehe ich anders!

Der aktuelle Teilestatus liegt der Station vor. Die Station kann dann auch ins Register schreiben.

Wenn du jetzt im Hand oder auch Automatik weitertaktest bleibt der Status genau bei jedem Teil!

Du kannst dir auch Global einen Überblick schaffen oder auch von der Hmi aus genau den Teilestatus fuer "Hand" entnomme Teile korrigieren.
 
...
aber genau das macht mein Binär-Schiebespeicher jetzt auch (und natürlich noch ein paar andere Kleinigkeiten).

Aber das war eigentlich auch nicht der Hintergrund dieses Thread. Ich wollte ja eine parametrierbare Speicher-Abfrage bauen, die aufgrund eines Index und einer Maskierung ermittelt ob der aktuelle Speicherinhalt mit dem gewünschten übereinstimmt ... Wobei es in der Regel nicht nur um 3 oder 4 Bits geht um zu der Freigabe zu kommen.

Ich habe mich an die gute alte Hochsprachen-Programmierung erinnert, wo ich mir mitunter ähnliche Function's gebaut habe ... und da dachte ich so insgeheim: "Vielleicht gibt's da bei Step7 auch einen Weg ..."
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klar gibt's die Möglichkeit!
Mach ich ja auch wenn ich z.B. 32 Zylinder. Da Vergleiche ich ich das Soll mit dem Istmuster.
Das geht am besten in AWL: So vergleiche ich z.B ob meine Grundstellung erreicht ist. Das LSB im Register ist dabei mein Zylinder 1
SteuernGS = Steuerregister
ZustandGs = Zustandsregister
Falls ein Zylinder nicht angesteuert wird ist das EGAL :)


L #SteuernGs
INVD
T #RegisterGsEgal
//2. Vergleich Soll/Ist
L #SteuernGs
L #ZustandGs
UD
T #TempDword
//3. Ergebnis Soll/Istvergleich mit Egal verodern
L #TempDword
L #RegisterGsEgal
OD
T #SollIstvergleich
//4. Pruefen ob alles 1
U(
L #SollIstvergleich
L DW#16#FFFFFFFF
==D
)
= #GsIo
 
...
das entspräche der Geschichte mit der Bit-Maske als Parameter. So ähnlich hatte Ralle das schon vorgeschlagen. Das wäre aber im Augenblick nicht meine erste Wahl ...
 
Also ich bin mit meiner Lösung total zufrieden. Wie gesagt du kannst von ueberall aus auf das Register lesend und schreibend zugreifen....

Wie fit bist du in SCL?

Also ich hab mir fuer die Sache mit dem "Int" Resgister einige Funktionen geschrieben. Das duemmste ist immer die Takterei. Da brauchst du eine Fakestation zum umkopieren. Ich habe immer ein Portal - da ist der Greifer eben auch eine Station. D.h. beim Schlessen Teilestatus der kompletten Station in die Greifer Station kopieren und anders herum. Fuer den Rest habe ich mir ein paar Funktionen geschrieben wo du auf die komplette Station zugreifen kannst, nur auf bestimmte Teile einer Station...
 
Zurück
Oben