Objektbewegung visualisieren

Spanier

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
ich muss eine Gruppe von rechts nach links und wieder zuruecklaufen lassen, unter bestimmten Bedingungen.
Es gab schon mal ein thema in aehnlicher weise aber ich habe von vbs noch weniger ahnung als von c und komme deshalb nicht so zurecht.
ein greifer soll von rechts nach links laufen, wenn dafuer das signal aus der sps kommt. mit folgendem skript hab ich mal probiert. da es aber immer nur einmal ausgefuehrt wird, bei variablenaenderung, kommt keine bewegung zustande. mit einer while-schleife bin ich hier auch gescheitert.
eigenschaft linienfarbe:
#include "apdefap.h"
long _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
long lSchrittweite;
long lEndPos;
long lLeft;
lSchrittweite =80; // Angabe in Pixel
lEndPos = 80; // Angabe in Pixel
// Die aktuelle Position auslesen
lLeft = GetLeft(lpszPictureName,lpszObjectName);
if( lLeft > lEndPos )
{
SetLeft(lpszPictureName,lpszObjectName, lLeft - lSchrittweite);
}
return CO_BLACK;
}
nach erreichen der endlage und nachdem ein teil abgeladen wurde soll der greifer wieder zurueckfahren. als signale stehen mir die ausgaenge fuer links- und rechtsbewegung sowie die endlagen als eingaenge zur verfuegung (WinCC 6,S7-300,MPI).
wie gehe ich am besten vor? habe ich einen falschen ansatz gewaehlt?
vielen dank fuer eure hilfe.
 
Zuletzt bearbeitet:
Objekt Bewegung

Hi,
Script bei Wertänderung bringt hier nichts, denke ich. Ich würde
eine Aktion (z.B.1 Sek. Takt) implementieren, die zyklisch den Script aufruft, und je nach Signal und Position bewegt sich das Ding.
Nachteil: Performance. Abhilfe: Im Script kann man zuerst abfragen, ob der Greifer überhaupt läuft(binär), falls nicht: return und fertig.

Gruss: Vladi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank, das klappt schon mal.
Jetzt stehe leider vor einem weiteren Problem. Ich moechte ein Rechteck um ca. 15 Grad neigen und dann simulieren, dass dieses "Paket" eine Rutsche runterfaehrt. Aber Drehungen funktionieren anscheinend nur bei Vorgaben aus der WinCC Bibliothek. Ausserdem kann man dann wahrscheinlich nicht einfach mit der X-Y-Position herumspielen.
Hat das schon jemand gemacht und kann mir einen Tipp zur Realisierung geben?
Weiterhin will ich eine Linie im Halbkreis rotieren lassen. Kann man so etwas realisieren?
Bin fuer jeden Tipp dankbar.
 
Hallo... Wenn du die in WinCC vorhandenen Linien Polygon usw verwendest, gibt es unter Geometrie das Attribut Rotationswinkel. Dieses kannst du ja über ein C Funktion dynamisieren (SetRotationAngle)!! Bischen ne fummelei aber sollte funktionieren
 
danke die rotation funktioniert wunderbar.
leider habe ich nun das problem, dass ich zuviele zyklische trigger habe die mein system belasten. da ich viele bewegungen simuliere, kann ich auch nicht den trigger auf variablenaenderung einstellen. oder gibt es die moeglichkeit eine interne variable anzulegen, die meinen zyklischen trigger ersetzt. hab leider zu wenig ahnung davon. vielleicht kann mir jemand einen tipp zur realisierung geben oder einen komplett anderen weg aufzeigen.
vielen dank.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
neuer versuch

hab mir ein global script erstellt und mit meinen minimalen c-kenntnissen mal versucht einen trigger bzw. an/aus in eine variable zu schreiben. das folgende script rufe ich mit einem standardzyklus auf:

#include "apdefap.h"
int gscAction( void )
{
#define TAG1 "TEST"
int i,j;
while(TRUE)
{
SetTagBit(TAG1,TRUE);
for(i=1;i<=5000;i++)
{
if(i==5000)
{
SetTagBit(TAG1,FALSE);
}
}
for(j=1;j<=5000;i++);
}
return 0;
}

leider ist das resultat noch nicht das gewuenschte. ich habe mir die variable mal angeschaut, da ist aber kein "blinken" zu sehen. weiss allerdings auch nicht welche werte ich am besten fuer die zaehlschleife verwenden soll. globalscript runtime sagt, dass die aktion angemeldet ist, aber hat keinen aktualisierungsabstand. was mache ich falsch?
wenn ich mich recht erinnere habe ich gelesen, dass man keine endlosschleife im script verwenden sollte. dann muesste ich die sache anders loesen.
vielleicht kann mir diesmal jemand weiterhelfen.
dankeschoen.
 
Zuletzt bearbeitet:
hi,

zur animation benutze ich die zustandsanzeige, ich habe mal ein beispielprojekt auf www.lipro.de/animation.zip gestellt.
leider ist es etwas ruckelig, da ich normaleweise ein timer-ocx für lineare bewegungen einsetze und ich nicht weis, ob in deinem projekt fremd-ocx
zugelassen sind, deswegen habe ich ein globalscript eingesetzt.

WinCC 6.0
 
Bewegungen machen wir mit SVG Grafiken

Mit:
http://pvbrowser.org

Installation:###############################
Download http://pvbrowser.de/pvbrowser/tar/pvb.tar.gz

Windows:
Unzip pvb.tar.gz in Zielverzeichnis
Im Zielverzeichnis Setup.bat dopplet clicken

Linux:
Verifizieren, dass die Qt4 Libraries installiert sind (Bei SuSE 10.1 Paket qt)
tar -zxvf pvb.tar.gz
cd pvb
su
./install.sh
exit


Programmierung erfolgt in C:#########################################
Beispiel für animierte SVG Grafik:
- SVG Grafik mit Inkscape erstellen.
- Den Objekten über rechte Maustaste einen Namen geben
- Die SVG Grafik in pvdevelop einfügen
- Der folgende Code ist aus den pvsexample

typedef struct // (todo: define your data structure here)
{
rlSvgAnimator svgAnimator;
}
DATA;

static int drawSVG1(PARAM *p, int id, DATA *d)
{
if(d == NULL) return -1;
gBeginDraw(p,id);
d->svgAnimator.writeSocket();
gEndDraw(p);
return 0;
}

static int slotInit(PARAM *p, DATA *d)
{
if(p == NULL || d == NULL) return -1;
//memset(d,0,sizeof(DATA));
pvResize(p,0,1280,1024);
pvSetPixmap(p,back,"back.png");
d->svgAnimator.setSocket(&p->s);
d->svgAnimator.read("test1.svg");
drawSVG1(p,svg1,d);
return 0;
}

static int slotNullEvent(PARAM *p, DATA *d)
{
if(p == NULL || d == NULL) return -1;
return 0;
}

static int slotButtonEvent(PARAM *p, int id, DATA *d)
{
if(p == NULL || id == 0 || d == NULL) return -1;
if(id == back) return WELLCOME;
//rlSetDebugPrintf(1);
if (id == buttonShowCircle)
{
d->svgAnimator.show("circle1", 1);
}
else if(id == buttonHideCircle)
{
d->svgAnimator.show("circle1", 0);
}
else if(id == buttonHello)
{
d->svgAnimator.svgTextPrintf("text1", "Hello");
}
else if(id == buttonWorld)
{
d->svgAnimator.svgTextPrintf("text1", "World");
}
else if(id == buttonShowMonitor)
{
d->svgAnimator.show("monitor1", 1);
}
else if(id == buttonHideMonitor)
{
d->svgAnimator.show("monitor1", 0);
}
else if(id == buttonMonitorPos1)
{
d->svgAnimator.svgPrintf("monitor1", "transform=","translate(300.5974,286.613)");
}
else if(id == buttonMonitorPos2)
{
d->svgAnimator.svgPrintf("monitor1", "transform=","translate(200.5974,286.613)");
}
drawSVG1(p,svg1,d);
return 0;
}
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo
vielen dank fuer eure schnelle hilfe.
@pvbrowser
ich habe mich schon mal kurz damit beschaeftigt, aber dafuer reichen leider meine minimalen c-kenntnisse nicht aus um mit diesem programm umzugehen und habe im moment auch nicht die zeit mich intensiv einzuarbeiten. trotzdem danke.
@praktikant
danke fuer die bereitstellung des projektes. konnte es mir leider nicht anschauen da er beim oeffnen des bildes im graphics designer bzw. runtime einen fehler bringt. koenntest du mir vielleicht erklaeren was das vb-script macht, ich hatte noch nie mit vbs zu tun. vielen dank schon mal.
gruss michael
 
Zurück
Oben