TIA Poke_blk

Deep Blue

Level-2
Beiträge
432
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

bei meinem Ziel zur Laufzeit eine Datenbausteinnummer zu übertragen, nutze ich gerade im Versuch die Funktion "POKE_BLK". Das funktioniert auch alles ganz toll. Allerdings nur in eine Richtung. Egal welche Source oder Destination ich angeben, transferiert wird immer vom Destination DB in den Source DB. Ich benötige dies allerdings genau anders herum, also immer von einem festen DB in einem DB, welcher erst zur Laufzeit bekannt ist

Was läuft denn da bei mir nicht richtig?

P.S. Da ich als Quelle und Ziel immer ein DB angegeben habe (16#84) scheint die Länge in Byte (Count) wohl egal zu sein. Denn egal was ich dort auch eingebe, es wird immer der ganze DB übertragen. Das wird in der Hilfe so nicht erklärt.

Hier mal der SCL-Code:

Code:
Temp            
Ziel_DB      DInt        
Quell_DB     DInt        


#Quell_DB := 1;
#Ziel_DB:=BYTE_TO_DINT("TAG_ID");


POKE_BLK(area_src:=16#84,         
         dbNumber_src:=#Quell_DB,
         byteOffset_src:=0,
         area_dest:=16#84,
         dbNumber_dest:=#Ziel_DB,
         byteOffset_dest:=0,
         count:=1);
 
Zuletzt bearbeitet:
das waren mir jetzt zu viele Verneinungen :p
nur damit wir nicht aneinander vorbei reden - das Attribut "optimierter Bausteinzugriff" ist deaktiviert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hm... dann kann ich das leider nicht nachvollziehen. So viel ist da eigentlich auch nicht falsch zu machen.
Hast du mal die Software komplett übersetzt? Bist du sicher, dass der ganze DB kopiert wird? Laut deinem Code dürfte nur ein Byte kopiert werden. Kannst du ausschließen, dass irgendein anderer Programmteil oder Netzwerkteilnehmer (siehe deinen Screenshot - DB erreichbar aus OPC UA) vielleicht auch in deine DBs schreibt/ sie überschreibt? Verwendest du die korrekten DB-Nummern (ist in TIA ja nicht ganz so offensichtlich wie im Classic)?
 
Hallo Howard,

ich habe mir nun mal 2 neue DB's erstellt um nachzuvollziehen, was da schief läuft. Und siehe da, nun klappt es. Beide DB's haben nur 3 Int. Hier kann ich hin- und her transferieren. Da es bei meinem Quell- DB einen Unterschied gab, habe ich nun alle DB's auf gleichen Stand gebracht. Aber leider funktioniert es immer noch nicht. Es geht nur in Richtung zum DB, der eigentlich die Quelle sein sollte. Vielleicht noch zur Info, die DB's sind mit einem PLC-Datentyp aufgebaut worden und beinhalten unterschiedliche Datentypen. Also es sind sowohl Boolean, wie auch 1 String oder DINT und INT vorhanden.
 
Hat sich nun geklärt. Das Problem saß mal wieder vor dem Gerät, habe an einer anderen Stelle die Daten hart kopiert. :rolleyes:
 
Ich lese einen RFID Tag ein und zu jeder Nummer gibt es den entsprechenden DB, dem ich dann diverse Status Werte etc. zuordne. Aber jetzt, wo ich es richtig mache, klappt es auch wunderbar. Danke für eure Unterstützung.
 
Jetz mal die Frage, weil TIA ja nicht mehr wirklich gut mit Kopieren in variable DB umgehen kann, ohne dass man Kopfstände alá Peek und Poke und "nicht oprtimierte" DB macht.
Warudm packst du die ganzen Daten nciht i einem DB als Array? Dann kannst du über die Indizees des Array die RFID-Tags einsortieren. Alles Andere ist mehr eine Krücke. Ich wollte das auch erst so beibehalten, weil ich es x Jahre in Step7 genau so gemacht habe. Aber wenn man wirklich zum Schluß mal alles vollsymbolisch haben will, dann muß man diesen Zopf ohnehin irgendwann abschneiden. Hat etwas gedauert, bis ich mich dazu durchgerungen habe, war aber gut so im Nachhinein.

P.S. Irgendwo im Forum hat mal jemand eine Version mit Variant gepostet, aber das ist auch eher nicht gut zu lesen, da gefällt mit ein Array viel besser. Auch können DB ja nun rel. groß sein, was spricht also gegen die Variante mit einem DB?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,

wie meinst Du
Warum packst du die ganzen Daten nicht in einem DB als Array? Dann kannst du über die Indizes des Array die RFID-Tags einsortieren.
genau? Vielleicht ist das ja der "bessere" Weg für mein Anliegen? Lerne gerne mehr dazu...

Mit Poke_BLK nutze ich jetzt für die DB-Adresse der Source meine ID des RFID-Tags um somit immer den DB auszulesen, welcher gerade an der Antenne ist. Das ich dafür die Optimierung ausstellen musste, fand ich nicht all zu schlimm da unsere HMI sowieso nicht mit diesem Attribut umgehen kann. Aber wie schon geschrieben, ich erweitere meinen Horizont gerne.
 
Du hast doch bestimmt einen udt für Deine RFID-DBs.
Dann einfach einen DB mit z.B. RFID := Array[0..x] of RFID-udt anlegen und Du kannst mit RFID_DB.RFID[RFID-Nr].MyDatenStruct vollsymbolisch darauf zugreifen.

Machst Du das Array auch als udt-Vorlage für den DB, kannst Du diesen udt auch komplett als Variable ans (zumindest Siemens-) Panel übergeben.
Hier war mal was Ähnliches zur Erklärung: Array of "Eigener Datentyp" im HMI Verknüpfen
Das Multiplexen für's HMI mit immer der gleichen Bildschirmseite würde ich aber eher in der PLC machen.
 
Zuletzt bearbeitet:
Zurück
Oben