Per SCL ein Bit in einen DBD schreiben

SEAL

Level-1
Beiträge
80
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich möchte per SCL eine 0 oder 1 in ein DBD schreiben. am eingang gebe ich vor in Welches Bit geschrieben werden soll auch möchte ich vorgeben ob eine 1 oder 0 in den DB geschrieben werden soll.
Mein Bisheriger Versuch sieht so aus, aber irgendwie will das nicht funktionieren.
FUNCTION FC58 : VOID


// Bausteinparameter
VAR_INPUT
// Eingangsparameter
Punkt : INT;
FreiBelegt :int;
END_VAR

VAR_IN_OUT
// Durchgangsparameter
END_VAR

VAR_OUTPUT
// Ausgangsparameter

END_VAR

VAR_TEMP
// temporäre Variablen

END_VAR

// Anweisungsteil
FreiBelegt:=DB200.DBX146.[Punkt];
END_FUNCTION
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK bin ziemlich neu was scl betrifft, wie meinst du das mit dem Maskieren? Meinst du evtl. das ich alles auschreibe "DBName.gliederung1.Gliederung1.Name"?
 
Hallo SEAL,

die Variable "Punkt" ist doch eine INT Variable.
Somit würdest du ja auf die Bitadresse (DBX146.x) einen 16 Bit "Zeiger" laden.
 
Hallo SEAL,

die Variable "Punkt" ist doch eine INT Variable.
Somit würdest du ja auf die Bitadresse (DBX146.x) einen 16 Bit "Zeiger" laden.

wtf?

anyway ... mit maskieren meint er: mit (doppel)-wordverknüpfungen (und, oder) das bit beeinflußen ... das hat wenig mit SCL zu tun, das ist digitaltechnik in seiner urerscheinung
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der "Punkt:Integer" soll ja nur sagen auf welches bit vom dbw er zugreifen soll und der wird nicht höher als 15 ausfallen. Habe aus de r Variable "FreiBelegt :int" ein "FreiBelegt :dword" zu machen, da dies letztendlich ja der wert ist der in den datenbaustein geschrieben werdn soll.
Hat aber auch nix gebracht.
 
wtf?

anyway ... mit maskieren meint er: mit (doppel)-wordverknüpfungen (und, oder) das bit beeinflußen ... das hat wenig mit SCL zu tun, das ist digitaltechnik in seiner urerscheinung
Lass doch einfach das doofe Rumsülzen und schreib einfach wie es geht wenn schon alles besser weißt.
 
// Bausteinparameter
VAR_INPUT
// Eingangsparameter
Punkt: INT; // 16 Bit´s
FreiBelegt :int; // 16 Bit´s
END_VAR


// Anweisungsteil
FreiBelegt:=DB200.DBX146.[Punkt];
END_FUNCTION

Ich habe mit SCL noch nie etwas gemacht, aber du versuchst einen Integer Wert (16Bit) in einen Bit (DBX) zu schreiben!
Du musst FreiBelegt als Bool deklarieren, oder eben so maskieren das du nur das erste Bit hast mit der Wertigkeit 1!

In AWL
L FreiBelegt
L 16#1 oder 2#0000000000000001
UW
T FreiBelegt

Und deine Variable Punkt müsstest du auf maximal 7 begrenzen das höchste Bit im DB wäre DBX146.7 denn DBX146.8 oder höher gibt es nicht!
Das kannst du indem du bis auf die ersten drei Bits alle anderen ausmakierst

L Punkt
L 16#7 oder 2#0000000000000111
UW
T Punkt
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke erst mal für die Antworten.
Ich würde lieber die scl Variante bevorzugen da ich diese funktion öfters einsetzten muss.
Ich habe in einem DB eine Variable vom typ word angelegt DB200.DB146 in dieser möchte ich nun die einzelnen Bits schreiben und mittels scl Baustein will ich das Bit anwählen können das in dem Word gesetzt werden soll.
 
Ich würde lieber die scl Variante bevorzugen da ich diese funktion öfters einsetzten muss.
Ich habe in einem DB eine Variable vom typ word angelegt DB200.DB146 in dieser möchte ich nun die einzelnen Bits schreiben und mittels scl Baustein will ich das Bit anwählen können das in dem Word gesetzt werden soll.
Probiere mal das Byte und das Bit zu übergeben:

Code:
VAR_INPUT
   i_Byte : INT;
   i_Bit  : INT;
END_VAR

VAR_TEMP
   FreiBelegt : BOOL;
END_VAR

FreiBelegt := DB200.DX[i_Byte, i_Bit];
// i_Byte := 146
// i_Bit := 0-7
 
Hallo Paule,
Danke für den Code aber das ist auch noch nicht das was ich suche.

Wie gesagt ich möchte sobald der fc(SCL) aufgerufen wird das er mittels integer variable in das Bit von einem DBW eine 1 Schreibt, dasganze brauche ich dann nochmal nur das er ein null schreibt.
Aber ich glaube dein Vorschlag ist der Lösung schon ganz nahe. :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Probiere mal das Byte und das Bit zu übergeben:

Code:
VAR_INPUT
   i_Byte : INT;
   i_Bit  : INT;
END_VAR

VAR_TEMP
   FreiBelegt : BOOL;
END_VAR

FreiBelegt := DB200.DX[i_Byte, i_Bit];
// i_Byte := 146
// i_Bit := 0-7

Wäre es mgl. mittels wenn dann funktion in 2 Bytes zu schreiben wenn zb. das Bit kleiner ist als 7 dann nutze 147 wenn grösser dann 146 und eine freigabe anliegt und das ich 2 freigabe eingänge hätte, einer der das gewählte bit auf 0 setz und einer der es auf 1 setzt. Leider bin ich in scl nicht so fit :(
 
An die Mgl hatte ich auch schon gedacht :)

nach viel rumprieren konnte ich es nun Lösen.
In dem DB habe ich ein Array angelegt. und mittel SFC kann ich dort nun belibig viele Bits schreiben :)
Für Leute die auch sowas gebrauchen können hier mal der Code.
Als erstes im DB1 ein Array[1..x] mit Dekl. BOOL anlegen und anschl. den FC erstellen.

Code:
Funktion FC1 :Void

     VAR_INPUT
       
       Fach_Frei :BOOL ;
       Fach_Belegt : BOOL;
       Fach_Nr : INT;

     END_VAR

     IF Fach_Frei = true THEN
     db1.Status_Fach[Fach_Nr] := true ;
     END_IF

     IF Fach_Fach_Belegt = true THEN
     db1.Status_Fach[Fach_Nr] := false ;
     END_IF


END_Function
Danke an alle die mir Geantwortet haben.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
An die Mgl hatte ich auch schon gedacht :)

nach viel rumprieren konnte ich es nun Lösen.
In dem DB habe ich ein Array angelegt. und mittel SFC kann ich dort nun belibig viele Bits schreiben :)
Für Leute die auch sowas gebrauchen können hier mal der Code.
Als erstes im DB1 ein Array[1..x] mit Dekl. BOOL anlegen und anschl. den FC erstellen.

Code:
Funktion FC1 :Void

     VAR_INPUT
       
       Fach_Frei :BOOL ;
       Fach_Belegt : BOOL;
       Fach_Nr : INT;

     END_VAR

     IF Fach_Frei = true THEN
     db1.Status_Fach[Fach_Nr] := true ;
     END_IF

     IF Fach_Frei = false THEN
     db1.Status_Fach[Fach_Nr] := false ;
     END_IF


END_Function
Danke an alle die mir Geantwortet haben.

ich hab da mal eine frage :
geht das in scl nicht so ?


Code:
Funktion FC1 :Void

     VAR_INPUT
       
       Fach_Frei :BOOL ;
       Fach_Belegt : BOOL;
       Fach_Nr : INT;

     END_VAR

     db1.Status_Fach[Fach_Nr] := Fach_Frei ;


END_Function

ich mag das scl jetzt nicht so, aber die if's kann man sich wohl sparen oder nicht?
 
Ein kleinen Fheler hatte ich noch entdeckt, bei der 2 IF Anweisung hatte ich die Falsche Variable gewählt :) ist geändert worden
Naja es kommt immer darauf an was man machen will.

Ich brauchte eine Funktion die mir Ein Bit einer DB Variable auf 0 und 1 setzen kann.

Hintergrund: ich habe ein lagerregal dort fahre ich mit einem Drei_Achsenmodel die einzelnen Fächer an. Ich gebe das Fach an wo ich holen will und das fach wo ich absetzten möchte.
Wenn der schritt zum Holen vollständig abgeschlossen ist soll er mir das Bit für das fach auf 0 setzten und somit anzeigen das es frei ist. Das heist ich gebe ein Signal auf die "Fach_Frei" Variable
das Gleich wenn der schritt ablegen ageschlossen ist dann gebe ich ein Signal auf "Fach_Belegt"
Bei deiner Variante würde das Bit zwar gesetzte werden aber nicht wieder zurückgesetzt.

Gruss
 
Zuletzt bearbeitet:
Da hier eine Zuweisung gemacht wird, nimmt die Variable

db1.Status_Fach[Fach_Nr]

den Status von "Fach_frei" an. Wenn der FALSE ist, wird auch "zurückgesetzt".
 
Ok, ich hatte mir nach deinem beitrag schon sowas gedacht. ich hatte nur angst das man im SCL die zuweisung nicht so machen könnte wie ich das getan hab. Ich programmiere schon länger in ST. da geht das auf jeden fall so. SCL habe ich mir nur mal kurz angeschaut und wegen des editors wieder vergessen.
 
Zurück
Oben