Datenbereich für FC festlegen...

AndreK

Level-1
Beiträge
415
Reaktionspunkte
27
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich möchte mir einen allgmeinen Baustein schreiben, den ich sehr häufig benutzen werde. Deshalb dachte ich, keinen FB wegen der Menge an I-DB`s. Sondern einen FC dem ich einen Eingangsbereich zuweise und natürlich auch einen Ausgangsbereich.

Wie deklariere ich den Bereich...? Ich habe jetzt mal als Test ein Array mit: ARRAY[0..15] of int angelegt.

jetzt dache ich mir, beim Bausteinaufruf den IN Parameter per Pointer zu übergeben: P#DB4.DBX0.0 Byte32. Dies geht wohl so nicht...

Jemand eine Idee wie ich aus einem FC ine einen Variabelen Bereich schreiben und lesen kann... mir ist auch nocht nicht klar wie ich einzelne Bits aus dem Arrayfeld herauslöse bzw. schreibe...
Könnte mir aber vorstellen das ich ein Wort in einen Puffer schreibe/lese und dann das jeweilige Bit ändere.

Bin für Vorschläge und Lösungen dankbar.
 
jetzt dache ich mir, beim Bausteinaufruf den IN Parameter per Pointer zu übergeben: P#DB4.DBX0.0 Byte32. Dies geht wohl so nicht...

geht es wohl doch. datentypen POINTER und ANY sind dann diejenigen welche zum erfolg führen.

allerdings sehe ich noch nicht, dass du das für deinen ERSTEN allgemeinen FC brauchst.
darüber hinaus finde ich deine argumentation zum thema FB sehr dünn - liegt vielleicht auch daran, dass die gewünschte funktionalität deines bausteins aus deiner sehr dünnen beschreibung nicht so ganz/überhaupt nicht klar wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok...

Das mit dem ANY habe ich schon herausbekommen... habe mir einfach mal einen anderen Baustein angeschaut was der am übergebenen POINTER verlangt. Darauf hin, habe ich dann den "Multi-FC" mit ANY für IN/OUT und INOut geändert.

Aber wie lese ich aus einem Datenfeld? Also aus dem 3 Wort das bit 0.4?

Warum das ganze:
1. Bastelei... gerade ein wenig Zeit... und Weiterbildung ist wichtig :)
2. Vieleicht wird das mal ein allgemeiner Motorbaustein, der Eingänge für: Motorschutz, Steuersicherung, Thermistorschutz, Drehzahlüberwachung, EIN/AUS/PAUSE, Stromwandler, Schaltpunkte... Ausgänge für Störmeldungen für WinCC als Word, ein Statusbyte damit ich in WinCC immer das gleiche Template verwenden kann und und und und und....
 
Wenn du ein Standartbaustein als FB ausführst kannst du diesen als Multiinstanz in einem andern FB aufrufen, das ergibt dann nur einen Instanz-DB. Und das ganze noch ohne POINTER
 
Möchte ich in diesem Fall aber nicht, weil...

Wenn du ein Standartbaustein als FB ausführst kannst du diesen als Multiinstanz in einem andern FB aufrufen, das ergibt dann nur einen Instanz-DB. Und das ganze noch ohne POINTER

Ok, das wäre mir aber zu verschachtelt. Der Baustein soll recht simpel einer Funktionsgruppe zuzuordnen sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber wie lese ich aus einem Datenfeld? Also aus dem 3 Wort das bit 0.4?

zerleg den any in seine bestandteile, ermittle den datentyp und rufe dann mit hilfe indirekter adressierung den entsprechenden datenbereich auf, kleines bsp.:

Code:
*
      L     P##anyIn
      LAR1
//handelt es sich um ein datenbausteinelement?
      L     W [AR1,P#4.0]
      L     0
      <>I   
      SPBN  db2
      TAK   
      T     #wDB1

das ganze dann halt für alle bestandteile des any (s. FAQ)
und, bleiben wir mal bei datenbaustein, word:

Code:
*
      AUF   DB [#wDB1]
      L     DBW [AR1,P#3.4]

Warum das ganze:
1. Bastelei... gerade ein wenig Zeit... und Weiterbildung ist wichtig :)

ok, vielleicht solltest du dir dann für deinen ERSTEN allgemeinen Baustein etwas anderes vornehmen?!

2. Vieleicht wird das mal ein allgemeiner Motorbaustein, der Eingänge für: Motorschutz, Steuersicherung, Thermistorschutz, Drehzahlüberwachung, EIN/AUS/PAUSE, Stromwandler, Schaltpunkte... Ausgänge für Störmeldungen für WinCC als Word, ein Statusbyte damit ich in WinCC immer das gleiche Template verwenden kann und und und und und....

wenn du daraus einen motorbaustein baust, dann ... dann ... argh ... ich geh kotzen...
 
Na, übergeben muss sich keiner...

... denn ich bin offen für Vorschläge!

Mir geht es nur darum wie ich einem Standardbaustein (nein, ist nicht mein erster) ein Datenfeld zuweisen bzw. in ein Datenfeld schreiben kann.

Ich kann dann Status, Störungen uns sonstiges immer gleich aus WinnCC anzeigen. Und jede Funktionsgruppe hat einen eigenen DB...

Ob das an der Stelle nun gut ist lasse ich jetzt mal dahingestellt... aber jetzt will ich wissen wie es geht :) Aber für einen anderen Vorschlag bin ich auf jeden Fall offen!
 
.Mir geht es nur darum wie ich einem Standardbaustein (nein, ist nicht mein erster) ein Datenfeld zuweisen bzw. in ein Datenfeld schreiben kann.

definiere datenfeld!
ein bit/byte/word in einem datenbaustein?
schau dir mal den datentyp Block_DB an.
oder auch die funktionalität von AUF [...]

Ich kann dann Status, Störungen uns sonstiges immer gleich aus WinnCC anzeigen. Und jede Funktionsgruppe hat einen eigenen DB...

aber über die menge von IDBs meckern und eine multiinstanz als zu sehr verzweigt empfinden ... irre

Ob das an der Stelle nun gut ist lasse ich jetzt mal dahingestellt... aber jetzt will ich wissen wie es geht :) Aber für einen anderen Vorschlag bin ich auf jeden Fall offen!

vorschlag für was? motor-baustein? http://sps-forum.de/showthread.php?t=37785
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Man kann doch einen UDT anlegen, diesen dann im FC als IN/OUT reinnehmen,

Den UDT in beliebigen DB's ablegen udn von aussen dran schreiben.

Damit hast du alles Symbole und Typen im FC und kannst darauf zugreifen.
 
Danke

Ich hatte gedacht die Daten (Status, Störungen, usw.) von mehreren Antrieben die zu einer Funktionsgruppe gehören in EINEM DB unterzubringen.

Diese Datenfelder sollten dann immer die gleiche Struktur haben, z.B.

Im Endeffekt 3 Felder mit ca. 8 Wörtern für IN, INOut, Out... aber wenn ich mir den Aufwand anschaue halte ich das eher für unpraktikabel mit ANY zu arbeiten. Möchte ich auch keinem im Service zumuten...

Klar geht das auch mit FB`s und I-DB`s, so habe ich es ja schon... ist ja auch nicht schlecht.
 
Man kann doch einen UDT anlegen, diesen dann im FC als IN/OUT reinnehmen,

Den UDT in beliebigen DB's ablegen udn von aussen dran schreiben.

Damit hast du alles Symbole und Typen im FC und kannst darauf zugreifen.

man kann auch ne UDT anlegen, die UDT im aufrufenden und im aufgerufenen FB im STAT bereich verfügbar machen und den aufzurufenden FB mit UC aufrufen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja, werde ich auch mal drüber nachdenken...

Man kann doch einen UDT anlegen, diesen dann im FC als IN/OUT reinnehmen,

Den UDT in beliebigen DB's ablegen udn von aussen dran schreiben.

Damit hast du alles Symbole und Typen im FC und kannst darauf zugreifen.

Hört sich auch ganz gut an...
 
Soweit ja...

Sollte eigentlich das passende sein für deinen Zweck.

Haste verstanden wie das geht ?

Habe schon mal mit UDT was gemacht, ist schon was her... aber sollte noch in einer rostigen Ecke des Hirnes zu finden sein.

Aber ich denke das ist wirklich die simpelste Lösung... um in eine Datenablage eine sehr übersichtliche Struktur zu bekommen.

Danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
warum so eine Codeakrobatik? Geht es denn wirklich nicht mit einem FB? gekapselt, portierbar, instanzierbar, für jeden nachvollziehbar etc. ...?

Nehmt bitte keine Rücksicht auf Schwächen der HMI. Ich hab nicht als Anwender das Problem zu lösen, dass so dumme Software wie Flexible nicht in der Lage ist, ein Päckchen Variablen, das seither mit "Instanz" symbolisch verbunden war, automatisch neu mit "DB".Multiinstanz zu verbinden (wird höchste Zeit, mal einen SR diesbezüglich zu starten).
 
... vielleicht noch so als Add-On zu dem Beitrag vom Perfektionsten :

In einem I-DB wird zur Unterbringung der (Instanz-)Daten auch nicht mehr Platz gebraucht, wie in einem "normalen" DB. Man spart sich halt nur (anscheinend leider) das zerwuschteln der Übergabe-Pointer. Außerdem hat es dann auch den (anscheinend unschönen) Beigeschmack, das der Baustein-Code dadurch i.d.R. sehr viel einfacher und durchschaubarer wird.
Das ein FB genau für so etwas gedacht ist will ich hier mal aussen vor lassen ...

Grüße
Larry
 
Zurück
Oben