Input/Output

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.404
Reaktionspunkte
4.039
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es irgendeine Möglichkeit, den Input/Output eines FC (Step7) so zu definieren, daß er Byte, Word oder DWord sein kann? Mal Abgesehen von der Übergabe als Any!

Ich dachte ich hab das schon mal irgendwo gesehen, kann es aber nicht mehr finden.

Bsp.:

Eine Inputvar kann Byte, Word oder DWord sein. Diese Variable soll aus einer Datenbank bedient werden, abhängig von einem angewählten Produktionstyp.
Ein entsprechender Wert soll dann in der Outputvar erscheinen. Ich will nicht 3 Funktionen schreiben, eine für Byte, eine für Word und eine für DWord.
 
versteh ich jetzt nicht, zumindest müsstest du für den "schlimmsten fall" also für Dword den speicher reservieren.

wenn du die auswertung extern machst, ggf. wandelst und der fc immer dword gibst?

bzw. wenn du die daten aus einer db bekommst, wo werder die bei dir abgelget? in welchem bereich? und woher weist du ob es byte word oder dword ist? anhand der größe der zahl?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist das eine Problem, es können alle Datentypen auftreten. Natürlich weiß ich was ich holen will, also ein Byte, oder ein Word aus einem DB. In dem DB sind die Daten für 50 Produkte hinterlegt. Abhängig vom Produkt will ich also sagen können "Gib mit Wert 10 aus dem Datensatz als Byte". An den Output schreibe ich ein dann z.Bsp. eine Temp-Var als Byte. Wert 11 soll als DWord ausgegeben werden, also an den Output ein DWord, fertig.

Warum?

Eine bestehende Anlage soll nun unterschiedliche Produkte gleichzeitig herstellen. Dazu hole ich den Produktionstyp vom WT. Die Daten aus der Datenbank. Alles kein Problem. Allerdings gibt es einige Daten, auf die früher fest zugegriffen wurde, da ja die Produktanwahl fest war. Nun will ich statt des festen Aufrufs der Daten L DB1.DBD20, eine Funktion haben, die mir am Output dann den richtigen Wert aus der Datenbank gibt. Auch kein Problem, aber ich will für alle Werte nur eine Funktion haben, nicht 4 Funktionen, bin halt faul.:ROFLMAO:
 
ich blicks garnichtmehr...

du hast quasi x produkte und jedes produkt hat einen datensatz der sieht z.b. so aus:

byte - Nummer
int - komponete A
dint - kompnetet B
dint - komponete C
int - verhältniss A-B
int - verhältniss A-C

so ??? ja ???

ist diese struktur bei allen produkten gleich?
oder sieht der datensatz von produkt B z.b. so aus?

byte - Nummer
int - komponete A
int - komponente B
dint - laufzeit
 
Die Datensätze sind alle gleich. Da das System so in vielen Anlegen eingesetzt wird, sind die Datensätze nicht struckturiert (Einfach 100 aufeinanderfolgende Word). Es liegen also als Struktur alles Word-Daten vor. Je nach Bedarf kann man also Bit, Byte, Word oder auch DWord in diesem Datenbereich ablegen. Ist nicht sehr übersichtlich ich weiß, dafür aber universell. Man hat auch keine Symbolik davon, aber das wird im Programm ausreichend dokumentiert, bei jedem Variablenzugriff steht, was das ist, sind auch nicht all zu viele!

Mal anders:

Früher: neues Produkt auf der Anlage --> Anwahl des Produktes, Umspeichern von 100 Word in einen "aktuellen Datensatz". Aus diesen wurde dann immer zugegriffen, dieser konnte auch bei Bedarf strukturiert sein, das ist den Daten beim Umspeichern ja egal.

Jetzt neu: mehrere Produkte gleichzeitig. Das Umspeichern in den "aktuellen Datensatz" geht ja nun nicht mehr, also indirektes Auslesen der Daten direkt aus der Datenbank zu dem Zeitpunkt, an dem sie benötigt werden, durch einen möglichst universellen FC.
 
Jetzt neu: mehrere Produkte gleichzeitig. Das Umspeichern in den "aktuellen Datensatz" geht ja nun nicht mehr, also indirektes Auslesen der Daten direkt aus der Datenbank zu dem Zeitpunkt, an dem sie benötigt werden, durch einen möglichst universellen FC.


das versteh ich jetzt dann doch nicht?
wie bearbeitet die maschien mehrere produkte gleichzeigtig?
du unterschlägst mir hier doch informationen...

hat die anlage (band) mehrere stationen, und es werden chaotisch verschiedene produkte draufgeworfen, jede station muss dann ein anderes produkt bearbeiten aber auf die selbe datenbasis zugreifen?
 
Ja, die Produkte liegen auf WT und fahen auf einem Band durch die Anlage.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Denkansatz

Hallo Ralle,

mein erster Gedanke dazu war, einfach 3 unterschiedliche Eingänge am FC zu deklarieren (byte,Word,DW), und über einen zusätzlichen Eingang über eine Kennung (1=byte,2=W,3=DW) dem Baustein zu sagen, in welchem Modus er gerade arbeiten soll.
Hat aber leider den Nachteil, daß die nicht benutzten Eingänge mit "Schmierdaten" belegt werden müssten, da sie ja schlecht unbelegt bleiben können.
Und damit finde ich das ganze selbst nicht mehr so toll....
Bin gespannt, was da für ne Lösung rauskommt, werde es gespannt verfolgen!
 
ok ich habe so etwas häufiger, und realisiere das dann so das jede station ihren eigenen aktualbereich bekommt.


das sieht dann z.b. so aus:

DB110 // 100 word die z.b. über die visu editiert werden können
dieser db kann in und aus dem 200er bereich kopiert werden (prg laden speichern) --> offlineprogrammieren solange anlage produziert


DB201 - DB2xx // Speicher für Rezepturen (bei neuen CPUs unlinked auf der mmc)


DB111 // daten für station 1
DB112 // daten für Station 2
.
.
.
diese db´s könenn aus dem 200er bereich kopiert werden (prg laden)

Diese DBs sehen alle gelich aus bzw bestehen aus der structur udt_x


auf deinem wzt "fährt" nur die programmnummer mit.
wenn der wzt an die station kommt wirde der entsprechede db2xx in den stations-db11x kopiert.

die station verwendet in dem db11x nur das was sie braucht...

wäre das nicht einfacher und sauberer?
 
Zuletzt bearbeitet:
@pjoddy

Genau das ist mein Problem, gefiel mit auch nicht so sonderlich.
Mach gerade eine vereinfachte Variante.

@markus

Stimmt schon, will aber nicht das ganze System ändern, Maschine steht ja schon, das Datenmanagement ist halt nach und nach ausgebaut worden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stell mit das etwa so, wie im Bild vor.

Anwahl binär (Also kein Input als Byte, Word, oder DWord) und Ausgabe als DWORD, das ist als Kompromiß erstmal tragbar.

Unten die Zeilen im Bild ist der alte Aufruf des Parameters.

Weiß jemand, wie ich am Besten an die Bits in einem Word herankomme?
L DBW[AR1, P#0.0]
gesuchter Bitwert 9

Was muß ich zum Pointetr addieren? und kann ich das irgenwie zusammenbasteln?
Will das auch noch in den FC mit reinquetschen, aber möglichst ohne Ausmaskierung, sondern über
U DBX[Pointer_1], den man erstellt.
 

Anhänge

  • Indirekt.jpg
    Indirekt.jpg
    79,4 KB · Aufrufe: 28
Zuletzt bearbeitet:
Die Datensätze sind alle gleich. Da das System so in vielen Anlegen eingesetzt wird, sind die Datensätze nicht struckturiert (Einfach 100 aufeinanderfolgende Word). Es liegen also als Struktur alles Word-Daten vor. Je nach Bedarf kann man also Bit, Byte, Word oder auch DWord in diesem Datenbereich ablegen.
So was Ähnliches haben wir schon mal gemacht, Du hast PN.


Gruß Axel
 
zu deinem gesamtproblem fällt mir nichts wirklich brauchbares ein was hier nicht schon steht.

um auch den bitzugriff variable zu machen gehts so.
Code:
Bit indirekt ansprechen
      L     10                          //byteadresse
      SLD   3                           //zum pointer machen
      LAR1                              //ins adressregister (10.0)
      L     4                           //bitadresse
      +AR1                              //im ar1 steht jetzt 10.4
 
Da es sich um Pointer handelt, ist das auch schön:

Code:
Bit indirekt ansprechen
      L    P#10.0                          //byteadresse als Pointer
      LAR1                              //ins adressregister (10.0)
      L    P#0.4                          //bitadresse
      +AR1                              //im ar1 steht jetzt 10.4

Der Pointer lässt sich auch z.B in einer Schleife hochzählen.
Dabei macht er den Übertrag von Bit auf Byte automatisch !
 
ja so geht das auch ist aber nicht so flexibel.
anstatt
L 4
kann ich auch ein z.b. mb nehmen und kann damit gezielt dieses bit ansprechen. das klappt mit deiner variante nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Volker

Yep, so isses dann auch geworden:

Code:
      L     #Prod_Typ_Temp              
      L     300                         //Länge pro Typ 
      *I    
      L     300                         //Offset ohne das Byte
      +I    
      L     #Byte_Nr                    //aus welchem Byte soll das Bit kommen?
      +I    
      T     #Adr

      L     P#0.0
      L     #Adr
      ITD   
      SLD   3
      +D    
      L     #Bit_Nr
      +D    
      T     #pointer_1

   
      L     #DB_Nr
      T     #DB_Nr_temp
      AUF   DB [#DB_Nr_temp]

      U     DBX [#pointer_1]
      =     #Bitwert
Das komische, wir haben das hier im Forum schon X Mal durchgekaut,
Adr, SLD3 wegen der Bitadresse usw., aber wenn mans braucht kommt man einfach nicht drauf. Deshalb ist das mit dem Forum wirklich super :rolleyes:.
 
Zurück
Oben