TIA VB Skript TP1500 TIA V17 DWORD in 2 WORD w1&w2 (UINT) aufteilen

Beiträge
7
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Nachmittag allerseits

Folgendes Problem:

VB Skript TP1500 TIA V17 DWOR in 2 WORD (UINT) aufteilen

TIA V17 Update 2
TP1500 Comfort Panel
CPU 1516-3 PN/DP

Für die HMI Meldungen DWORD per VB Skript in 2 WORD's (UINT1 & UINT2) aufteilen, damit ich sie überhaupt verwenden kann im Meldesystem.
In der Steuerung ist meine Meldevariable als DWORD vorhanden, für die HMI Meldungen muss die Variable allerdings im WORD Format sein.
Wenn ich nur einzelne Bits auslesen musste habe ich mir folgendermassen beholfen:

Function wResultMsgAO(ByValdwTag)
Dim bit0, bit1, bit2, bit3, bit4
Dim wlResult
Dim dwlTag

dwlTag = dwTag
bit0 = dwlTagAnd (2^10)
bit1 = dwlTagAnd (2^23)
bit2 = dwlTagAnd (2^24)
bit3 = dwlTagAnd (2^25)
bit4 = dwlTagAnd (2^26)

wlResult = 0

If bit0 Then
SetBitInTag wlResult,0
End If

If bit1 Then
SetBitInTag wlResult,1
End If

If bit2 Then
SetBitInTag wlResult,2
End If

If bit3 Then
SetBitInTag wlResult,3
End If

If bit4 Then
SetBitInTag wlResult,4
End If

wResultMsgAO = wlResult

End Function

Die benötigten Bits in einen lokalen UINT geschrieben und dieses im als Triggervariable verwendet.
Nun muss ich aber alle Bits vom DWORD haben, also eine Aufteilung in zwei lokale UINT1 und UINT2.

Lösungsansatz gleich wie oben hat nicht funktioniert.
bit0 = dwlTagAnd (2^0)
bit1 = dwlTagAnd (2^1)
bit2 = dwlTagAnd (2^2)
bit3 = dwlTagAnd (2^3)
bit4 = dwlTagAnd (2^4)
bit5 = dwlTagAnd (2^5)
bit6 = dwlTagAnd (2^6)
bit7 = dwlTagAnd (2^7)
bit8 = dwlTagAnd (2^8)
bit9 = dwlTagAnd (2^9)
bit10 = dwlTagAnd (2^10)
bit11 = dwlTagAnd (2^11)
bit12 = dwlTagAnd (2^12)
bit13 = dwlTagAnd (2^13)
bit14 = dwlTagAnd (2^14)
bit15 = dwlTagAnd (2^15)

und in der zweiten Funktion:

bit0 = dwlTagAnd (2^16)
bit1 = dwlTagAnd (2^17)
bit2 = dwlTagAnd (2^18)
bit3 = dwlTagAnd (2^19)
bit4 = dwlTagAnd (2^20)
bit5 = dwlTagAnd (2^21)
bit6 = dwlTagAnd (2^22)
bit7 = dwlTagAnd (2^23)
bit8 = dwlTagAnd (2^24)
bit9 = dwlTagAnd (2^25)
bit10 = dwlTagAnd (2^26)
bit11 = dwlTagAnd (2^27)
bit12 = dwlTagAnd (2^28)
bit13 = dwlTagAnd (2^29)
bit14 = dwlTagAnd (2^30)
bit15 = dwlTagAnd (2^31)

Bit16 bis Bit31 wurden nie angezeigt, immer 0-en obwohl Bits gesetzt waren, bei bit0 bis bit15 funktionierte es teilweise bis auf bit15. Manchmal ging es und z.B. nach einer Simulation neu starten dann nicht mehr.

Bsp_dw_in_w_BZW_Uint.PNG

Weiterer Lösungsversuch:

dwlowtow.PNG

dwhightow.PNG

Oder

blabla.PNG

Funktioniert aber alles nicht.

Gibt es hier jemanden der sich mit VB Skript in im TIA auskennt und einen Tipp hat wie man das lösen kann?

Besten Dank im Voraus

Gruss Danilo
 
Ich habe nicht analysiert warum Dein Skript "nicht funktioniert". (Möglicherweise wird es nie aufgerufen? Kein Trigger?)
Ich will Dir nur abraten von der Verwendung von VBS-Skripten für die Bitmeldungen.

VBS hat ein großes Problem, wenn in dem DWORD das Bit .31 gesetzt ist...
Der Datentyp UINT ist auch ganz falsch für Bitstrings (Ansammlungen von Bits)...

Realisiere eine Lösung, die völlig ohne Skript funktioniert (Was machen wohl Anwender von Basic Panels, die gar keine Skripte können?)
z.B. deklariere die Meldevariablen in der PLC als WORD, oder kopiere die Meldungen für das HMI in ein Array OF WORD, oder deklariere die HMI-Variable als WORD mit absolutem Zugriff auf die Adressen der PLC-Meldevariablen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann dein Problem nicht ganz nachvollziehen.
D.h. schon. aber für Bitmeldungen halte ich das ganze für bullshit. Aber da streiten sich die Geister
Du benutzt die ganz normalen Bit-Meldungen?

Lege die Variable für die Meldungen als Array of Word an. Der DB darf nicht Optimiert sein.
Zugriffsart: Absoluter Zugriff
In der HMI-Variablentabelle für dieses array bei PLC-Variable nichts eintaragen also <Undefiniert>
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jein.
das kommt drauf an wie du deinen störmelde_db parametriert hast.
wenn der auch ein array of word ist klappt das natürlich.
aber dann hast du in dem db keine einzelnen bits denen du einen vernünftigen namen geben kannst.
bei mir ist der stm_db ein nicht optimierter baustein. keine struct. kein array. dort hat jedes bit seine meldung
daher kann ich im hmi nicht symbolisch adressieren da das nicht übereinander passt.
ich verzichte an dieser stelle lieber im hmi für eine var auf die symbolische zuordnung als das ich im programm sowas stehen habe wie
u stm
= db350.dbx.%10
oder so
in der steuerung habe ich bei meiner variante also saubere symbolische zuordnungen für die stm
 
Ich spiegele die Einzelbits für die PLC auf Words fürs HMI.
Ich lebe lieber mit etwas mehr Speicherbedarf. 🤷‍♂️


Ich stör' mich an solchen Stellen an der Formulierung "darf nicht", wenn Du eigentlich meinst "ich empfehle".
Ich frag' mich als Laie dann immer, was ich denn jetzt schon wieder verkehrt gemacht habe.
:unsure:
 
wie ich schon sagte. hier scheiden sich die geister.
ich habe für mich entschieden das so zu machen.
falls nicht klar ist wie ich das meine hier mal ein einfacher screenshot.
zudem habe ich mir noch ein vb-script geschrieben welches aus den exportierten hmi-meldungen einen db erzeugt den ich in das programm importieren kann. (das script liegt übrigens schon lange auf meiner hp)
also 1 arbeit gespart.

1660925130962.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie ich schon sagte. hier scheiden sich die geister.
ich habe für mich entschieden das so zu machen.
Wie gesagt:
Ich stör' mich an solchen Stellen an der Formulierung "darf nicht", wenn Du eigentlich meinst "ich empfehle".
Ich frag' mich als Laie dann immer, was ich denn jetzt schon wieder verkehrt gemacht habe.
:unsure:
Es verwirrt mich einfach, wenn ich irgendwas gemacht habe, was lt. Aussagen von anerkannten Profis eigentlich nicht funktionieren soll.
Vlt. glaube ich ja nur, das es funktioniert; macht es aber gar nicht?
Also drehe ich diese Dinge bei mir erst mal (in diesem Fall unnötig) wieder auf den Kopf...
🤷‍♂️
 
Ich formuliere besser:
Du empfiehlst für die Bitmeldung Dein Vorgehen, für welches man zwingend einen nichtoptimierten DB benötigt.
Für andere Vorgehen ist der nichtoptimierte DB aber kein unbedingtes Muss.

Ich hatte Deine Aussage so verstanden, das Bitmeldung generell nur mit nichtoptimiertem DB geht (und ich damit bei mir was falsch gemacht habe).
🤷‍♂️
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo PN/DP, volker und hucki

Vielen Dank für eure Antworten.

Selbstverständlich habt ihr recht in der Steuerung kann man das viel besser lösen. Im TP dagegen absoluter Unsinn. Nach internen Diskussionen wurde entschieden, dass ich die Meldungen in der SPS bereitstellen darf. Habe es plus minus so gemacht wie volker. Unterschied nur Symbolischer Zugriff und einzelne WORD’s.

Funktioniert.

Nochmals vielen Dank, das war sehr hilfreich.

Gruss Danilo
 
Zurück
Oben