TIA 16x BOOL zu WORD

deltafox1002

Level-2
Beiträge
60
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

gibt es eine Möglichkeit aus einem DB 16 Bits zu lesen und die in ein WORD zu transferieren ? Das ganze soll aber bei optimiertem Baustein funktionieren.

Hintergrund ist, das ein DB mit z.B. 16x BOOL angelegt wird und jedes Bit soll einen eigenen Kommentar erhalten können. Also fällt ein ARRAY schon mal flach.

Dann sollen die Daten im HMI als Störmeldungen abgefragt werden können.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

du könntest einen einfachen FC schreiben, welcher die Bits mittels Slice-Zugriff in das Wort schreibt.

Beispiel SCL:

Code:
"Ziel_DB".Wort.X0 := "Quell_DB".Bit0815;

In AWL könntest du es auch machen:
Code:
U "Quell_DB".Bit0815
= "Ziel_DB".Wort.X0

Edit: dentech war schneller :ROFLMAO:
 
@dentech: Danke erst mal für den Tipp. Aber den Slice Zugriff kannte ich schon. Hilft mir auch nicht weiter. Ich möchte ja kein nicht "von groß nach klein" sondern "von klein nach groß". Also z.B. die ersten 16 einzelnen Bit's eines DB's lesen und dann in ein WORD schreiben.
 
Ähm, dir ist schon klar dass das mit dem Alice in beiden Richtungen geht...

Code:
U  DatenbausteinBit0
=  Word.X0
U  DatenbausteinBit1
=  Word.X1
...

Stand eigentlich eh schon bei LordAnubis.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, das habe ich verstanden. Es gibt also keine Möglichkeit in der symbolischen Adressierung mit einem Befehl gleichzeitig 16 Bits zu lesen ? In der absoluten Adressierung war ja die Möglichkeit zu sagen L DB1.DBW0 um die ersten 16 Bits zu lesen, egal wie der DB deklariert war.
 
Ich hab einen Hilfsbaustein, 16 Bit Struct Rein, Word raus.
Die Symbolik des äußeren Structs ist dabei dann egal, solange es eben 16 Bit hat.
 
Nein sowas gibt es nicht.
Damit du 16Bits gleichzeitig symbolisch anfassen kannst bräuchten die eben ein Symbol.
Du könntest deinen DB als Ansammlung von Struct_of_16Bool deklarieren und dann einen Konvertierungs-FC Struct16toWord bauen...

Einfacher wäre es wohl den einen DB für die Bitmeldungen auf "nicht optimiert" zu lassen, die Bits normal mit Kommentar anzulegen und dann die HMI-Variablen (Word oder Array_of_Word) mit absolutem Zugriff auf den DB anzulegen. Dann kannst du dir die Konvertierung in der SPS schenken.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt also keine Möglichkeit in der symbolischen Adressierung mit einem Befehl gleichzeitig 16 Bits zu lesen ?
Doch - man kann ja ein WORD lesen ;)

16 einzeln deklarierte Bits kann man allerdings nicht symbolisch als eine Einheit lesen, weil ja nicht bekannt ist, ob und wo die 16 Bits zusammenhängend gespeichert sind. Es sei denn, Du "zwingst" den Compiler dazu, z.B. mittels "AT" eines STRUCTs oder BOOL-Arrays auf ein WORD - das AT läßt Siemens aber für "optimierte" Datenbereiche nicht zu.

FAQ: Wie programmieren Sie in STEP 7 (TIA Portal) die Überlagerung von Variablen mit dem Schlüsselwort "AT"?
In dem FAQ sind auch fertige Bausteine "BoolToWordAT" und "WordToBoolAT" zum zusammenstellen bzw. aufdröseln von 16 Bits. Und der Hinweis, daß für bessere Performance besser Slice-Zugriffe benutzt werden sollten.

Harald
 
Ehrlich das ist doch aber alles totaler Unsinn!
Optimiert bei Siemens bedeutet, dass die Daten so abgelegt werden, dass der Prozessor der SPS, die Daten mit möglichst wenig Speicherzugriffen lesen kann.
Siemens hat dabei anscheinend vergessen, dass seine HMI bei den einfachen Störmeldungen auf Bits in Words zugreifen. In ihrem Bestreben, alles Neue als die große Verbessserung zu verkaufen, haben sie die optimierten Bausteine beworben, als wenn nun alles schnell gut und optimal wäre. Der Begriff legt das ja nahe. Für eine HMI mit Bitmeldungen ist es immer noch das Schnellste und Resourcensparenste, einen nicht optimierten Baustein zu verwenden, in welchem man die Störmeldungen und Quittieruungen ganz normal als Bits definiert, das HMi aber auf Word (absolut) aus diesem DB zugreifen läßt.
Ich hab hier ein Beispiel von Kollegen, da wird in der SPS ein optimierter Baustein verwendet, der dann 16 Bits und ein Word für 16 Meldungen bereitstellt. Ein extra FC kopiert die Bits auf das Word, das dann von der HMI gelesen wird. Wenn das dann optimal sei soll :)

Also ich denke, hier ist wirklich ein nicht optimierter Baustein der Optimale. ;-)
 
Ich hatte dabei ein Bestreben:
Wenn schon, dann bitte alles symbolisch, von HMI bis PLC, ob das jetzt 0,1 ms Zykluszeit kostet, oder ein paar Zeilen Extra-Code sind, war mir dabei völlig egal.
Dein Beispiel vom Kollegen könnte sogesehen schematisch ohne weiteres auch von mir stammen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

wie PN/DP schon beschrieben hat Optimierung ausschalten und AT benutzen ist die schnellste Möglichkeit symbolisch zu bleiben.

zu beachten ist das die Bytes getauscht sind.

Code:
FUNCTION_BLOCK "fb_SystemLog_1"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_OUTPUT 
      w_ErrorTrigger1 : Word;
      st_ErrorTrigger1 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} AT w_ErrorTrigger1 : Struct
         Bit8 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit9 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit10 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit11 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit12 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit13 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit14 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit15 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit0 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit1 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit2 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit3 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit4 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit5 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit6 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
         Bit7 { S7_HMI_Accessible := 'False'; S7_HMI_Visible := 'False'} : Bool;
      END_STRUCT;
   END_VAR




BEGIN
	
	
	
	
	
	
END_FUNCTION_BLOCK

Gruß Thomas
 
Diesen ganzen Firlefanz mit optimierten und nicht optimierten Bausteinzugriffen kann man wirklich in die Tonne treten.
Da hat Siemens mal wirklich was nettes mit den Views (AT) und dann geht das wieder nicht mit optimierten Zugriffen :cry:
Das selbe Theater bei HMI-Bitmeldungen oder OPC-Zugriffen.
Dann das Drama mit Serialize und Deserialize ... Mit persönlich können die optimierten Zugriffe mittlerweile gestohlen bleiben.

Gruß
Dieter
 
... Mit persönlich können die optimierten Zugriffe mittlerweile gestohlen bleiben.
*ACK*
Das Zeug ist oft sowas von "von hinten durch die Brust ins Auge"....

@IckeSI: Man könnte das AT im FB schon mit optimiert machen, muss bei Remanenz dann dieses "im IDB setzen" einstellen.
Aber wenn man "im IDB-setzen" verwendet kann die Optimierung auch fast schon gleich abschalten.
Die Option ist eh ein Beispiel für die ganzen Krücken die man schon einbauen musste.
 
Zuletzt bearbeitet:
Zurück
Oben