Nieuw programmeer vraagje....

Gewoon even offtopic praten over van alles en nog wat.

Moderator: Moderators

Plaats reactie
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Nieuw programmeer vraagje....

Bericht door Swets »

Ik ben PLC programmeur, en wij werken met HMI schermen van Schneider...

Nu had ik in die schermen een aantal trends, van drukken en feedbacks van analoog aan gestuurde kleppen...

Die Trend in het scherm, zit in een tool database, die helemaal op slot staat, dus je kan zo trend gebruiken, maar niets aan wijzigen...
maar die tool (history Trend) is tig jaar geleden ontworpen, toen we nog schermen hadden van 640x480 pixels, en ik werk nu veel met 1920x1080 pixels...
Nu kon je die trend wel uitrekken, maar alle bitmap-plaatjes die in die tool gebruikt werden, werden er dan niet mooier op...

verder had dat ding nog een nadeel, je kan met knoppen heen en weer stappen door de trend... maar die knoppen doen dat met de snelheid van de sample rate. wij loggen per seconde, dus 1 druk op de knop, stapte je 1 seconde voor, of achteruit... (in 1 trend staat 20 minuten, dus je moest 1200 x drukken om een beeld te verschuiven)

dit had ik wel eens neer gelegd bij de helpdesk van schneider... maar die waren totaal niet bereid mee te werken....

Toen ben ik zelf eens gaan zoeken.... ten eerste ben ik heel veel files van die tools, gaan bekijken in het kladblok (ascii)
en op een gegeven moment vond ik in een aantal files een naam in commentaar regels... en ik zag ook hele stukken code welke ik wel thuis kon brengen in de verschillende tools...

Toen eens gaan google op die Naam, plus Vijeo designer er bij... en ja hoor ik vind die persoon... mailtje gestuurd... en die werkte heel erg mee... :-)

de stuurde me een tooltje, als je die runt maakt hij een register bestand aan... (daar moest ik met de hand nog 1 en ander in wijzigen, want het tooltje was nog uit de XP-tijd, toen zat het in andere registers)

en hop.... Alles waar ik vroeger nooit bij kon is nu open ....
wel waarschuwde hij mij dat ik alles wel steeds goed moest saven enzo.. want als je een fout in die code maakt, kunnen er hele raren dingen gebeuren, want er zit totaal geen controle op die software, dus fouten worden niet afgevangen...

Okay, dat was de inleiding...

Nu ben ik gelijk lekker aan het wijzigen gegaan.... maar ik heb iets wat nog niet helemaal werkt... Ik dacht dat ik het had... maar naar testen zie ik toch rare dingen... het gaat over het onderstaande stukje code:

Code: Selecteer alles

if (rewindArea.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*60));

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + ((trendSampleRate*60) * ((internalNumSamples/60)- 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
else if (rewindArea10.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*600));

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + ((trendSampleRate*600) * ((internalNumSamples/600)- 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
else if (pauseArea.intersects(clickArea))
Dat *60 en /60 en *600 en /600 heb ik er bij gemaakt...

die eerste rewind zat er standaard in, en daar staptje je dus 1 sec mee terug...
Ik heb daar die *60 /60 bij gemaakt... en joepie ... hij stapte een minuut... dus dat was goed...

toen dat rewind10 erbij genaakt,
om ook stappen van 10 minuten te kunnen maken...
en ik dacht dat dat ook werkte....

maar er zit toch nog een lulligheidje in....
als ik eerst 2x op 1 minut drukt, gaat het goed...
als ik daarna op 10 minuten druk, begin hij weer op de plek waar hij stond toen ik de eerste keer op 1 min drukte....
ik hoop dat ik het zo duidelijk uitleg....

iemand die het misschien gelijk zie?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
ruudpg
Donateur
Berichten: 1051
Lid geworden op: 19 jul 2011 12:37
Locatie: Spijkenisse
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door ruudpg »

Wat ik volgens mij zie is dat je basis telkens de actuele tijd is, zowel bij 1 minuut als bij 10 minuten,

int calendarTime = Calendar1.getTimestamp(); // gets current time

// current time + length of time interval
int newEndTime = calendarTime + ((trendSampleRate*600) * ((internalNumSamples/600)- 1));

Pas als de basistijd ook een variabele wordt waar je mee verder werkt zal hij minuten en 10 minuten bij elkaar gaan optellen, niet
als er telkens 1 of 10 minuten wordt gerekend vanaf calendarTime. De regel "int calendarTime=Calendar1...." moet maar 1x uitgevoerd
worden. Wil je hem vaker indrukken moet je lijkt me ook calenderTime gelijk gaan maken aan NewEndTime.

Of zie ik het helemaal verkeerd? :oops:
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door Swets »

ik vind het alleen zo raar, als ik 10 x op de 1 minuut knop drukt gaat het goed...
als ik 10 x op de 10 minuut knop druk gaat het goed...

maar doe ik ze door elkaar gaat het niet goed... dat snap ik niet helemaal?

ik zal even heel het knoppen kode verhaaltje hier neer zetten, misschien mis ik ergens iets...

Code: Selecteer alles

</SOOnVariableChange>
<SOOnPointerPress><![CDATA[CgpArea clickArea = PointerEvent.getArea();
CgpArea rewindArea = rectRewind.getBoundingArea();
CgpArea pauseArea = rectPause.getBoundingArea();
CgpArea playArea = rectPlay.getBoundingArea();
CgpArea forwardArea = rectForward.getBoundingArea();
CgpArea dateArea = ImageGoToDate.getBoundingArea();
CgpArea rewindArea10 = rectRewind10.getBoundingArea();
CgpArea forwardArea10 = rectForward10.getBoundingArea();

if (rewindArea.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*60));

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + ((trendSampleRate*60) * ((internalNumSamples/60)- 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
else if (rewindArea10.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*600));

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + ((trendSampleRate*600) * ((internalNumSamples/600)- 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
else if (pauseArea.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	paused = true;
}
else if (playArea.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	setLiveTime();
	paused = false;
	readAllData();
}
else if (forwardArea.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	
	int calendarTime = Calendar1.getTimestamp();
	int newEndTime = calendarTime + ((trendSampleRate*60) * (internalNumSamples/60));
	
	if (newEndTime < channelTags[fastestChannelNum].getHistorian().getNowTimestamp())
	{
		newTimestamp = newEndTime;
		Calendar1.setTimestamp(calendarTime + (trendSampleRate*60));
	}
	readAllData();
}
else if (forwardArea10.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	
	int calendarTime = Calendar1.getTimestamp();
	int newEndTime = calendarTime + ((trendSampleRate*600) * (internalNumSamples/600));
	
	if (newEndTime < channelTags[fastestChannelNum].getHistorian().getNowTimestamp())
	{
		newTimestamp = newEndTime;
		Calendar1.setTimestamp(calendarTime + (trendSampleRate*600));
	}
	readAllData();
}
else if (dateArea.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	paused = true;
	Calendar1.show(true);

	int h = Math.min(CgpSystem.baseWindow.getHeight(), CgpSystem.getHeight()); 

	if (h <= 240)
	{
		CgpSmartKeypad.openKeypadPopup(this, x1, y1, calendarWidth + 25, calendarHeight - 25);
	}
	else
	{
		CgpSmartKeypad.openKeypadPopup(this, x1, y1, calendarWidth + 25, calendarHeight);
	}

	IgpContainer popupContainer = null;
	CgpWindow window = CgpWindow.getFirstWindow();
	while (window != null)
	{
		if (window.isKeypadWindow())
		{
			popupContainer = window.getPanel();
		}
		window = window.getNextWindow();
	}

	Calendar1.changeContainer(popupContainer);	
}]]>
Laatst gewijzigd door Swets op 21 okt 2020 13:24, 1 keer totaal gewijzigd.
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door Swets »

even filmpje online gezet....
wat ik ook al raar vind , is dat de eerste keer drukken een dubble stap gemaakt word?


https://youtu.be/tpnGUtuVX_c
http://www.arjan-swets.com (met cnc filmpjes)
Jantje2k
Berichten: 173
Lid geworden op: 15 aug 2020 17:28
Locatie: Hardinxveld-Giessendam

Re: Nieuw programmeer vraagje....

Bericht door Jantje2k »

Inderdaad apart.

Wat ik me even afvraag: waar heb je de variabele Calendar1 gedefinieerd? In de code die je post staan voor zover ik nu kan zien niet echt fouten ofzo.

Waar haal je de variabele trendsampleRate vandaan? Gaat daar misschien wat fout?
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door Swets »

dit is alles: https://www.dropbox.com/s/uf095qymq2bpo ... 2.xml?dl=0

dat eerste deel SOVariables, zijn alle variabele, die uit deze tool komen, en die je normaal in het HMI kan gebruiken...
Dus dat is zeg maar de koppeling tussen variabelen in en uit the trend....
DIe trend kan dus 8 knalen tegelijk laten zien...

Code: Selecteer alles

if (rewindArea.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*60));

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + ((trendSampleRate*60) * ((internalNumSamples/60)- 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
en die 60 heb ik er dus bij gemaakt om hem een minuut te laten stappen.... dat was er dus niet, en doen kon ik met de knoppen maar 1 seconde schuiven...
nu is me nooit opgevallen, of hij dan ook de eerste keer 2 seconde stapte ipv 1
viel niet zo op natuurlijk....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door Swets »

ik probeer het verhaal ook te snappen....

Code: Selecteer alles

if (rewindArea.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - trendSampleRate);

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + (trendSampleRate * (internalNumSamples - 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
Dit bovenstaande was het...

dus stel, de trend is 20min lang, dus dat zijn 1200 punten...
Dus ik denk dat er uit die Calendar1.setTimestamp(Calendar1.getTimeStamp()-trendSampleRate);
1200-1=1199 staat..

Int CalendarTime=Calendar1.GetTimeStamp() zou dan 1200 zijn..

int newEndTime = calendarTime + (trendSampleRate * (internalNumSamples- 1));
newEndTime=1200+(1*(1200-1)=2399

NewTimeStamp=newEndTime ,
dus de NewTimeStamp (oude was 1200) word op 2399

okay...
nu met de 60 (is 1 minut stappen )

Code: Selecteer alles

if (rewindArea.intersects(clickArea))
{
	paused = true;
	gpclasses.system.CgpSystem.beep(false);

	// set calendar time stamp back by 1 sample's time
	Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*60));

	int calendarTime = Calendar1.getTimestamp(); // gets current time
	
	// current time + length of time interval
	int newEndTime = calendarTime + ((trendSampleRate*60) * ((internalNumSamples/60)- 1));

	// newTimestamp is adjusted to current time + x-axis length.
	newTimestamp = newEndTime;

	readAllData();
}
Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*60));
dus 1200-(1*60) = 1140

int calendarTime = Calendar1.getTimestamp();
CalendarTime=1200

int newEndTime = calendarTime + ((trendSampleRate*60) * ((internalNumSamples/60)- 1));
1200+((1*60)*((1200/60)-1)) = 2340

ik snap nu al eigenlijk niet wat ik zit te bekijken :-)

Nu als de trend links uit beeld geschoven is? stel dat de huidig tijd 2400 is (2 x de trend vol) wat krijgen we dan...
Calendar1.setTimestamp(Calendar1.getTimestamp() - (trendSampleRate*60));
2400-(1*60)=2340

int calendarTime = Calendar1.getTimestamp();
CalendarTime=2400

int newEndTime = calendarTime + ((trendSampleRate*60) * ((internalNumSamples/60)- 1));
2400+((1*60)*((1200/60)-1)) = 3540

snap iemand het nog?
Ik word gek... :-)

misschien moet ik bij die InternalNumSamples wel eers die 1 er aftreekn en dan pas delen door 60 ?
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door Swets »

https://youtu.be/MkXP-IYEbeM

dat heeft geholpen.... nu doet hij geen dubbele stap meer in het begin...
en ook kan ik 1min en 10min door elkaar gebruiken....

dus

int newEndTime = calendarTime + (trendSampleRate * (internalNumSamples - 1));

had ik van gemaakt:
int newEndTime = calendarTime + (trendSampleRate * ((internalNumSamples*60) - 1));

en nu
int newEndTime = calendarTime + (trendSampleRate * ((internalNumSamples - 1)*60));

ik denk een beetje dat dat het probleem was....
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
Swets
Berichten: 2661
Lid geworden op: 09 feb 2007 21:49
Locatie: krimpen aan den IJssel
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door Swets »

ik dacht dat ik er was...
maar het terug bladeren gaat goed...

maar dan weer vooruit nog niet...

Code: Selecteer alles

else if (forwardArea.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	
	int calendarTime = Calendar1.getTimestamp();
	int newEndTime = calendarTime + ((trendSampleRate*60) * (internalNumSamples/60));
	
	if (newEndTime < channelTags[fastestChannelNum].getHistorian().getNowTimestamp())
	{
		newTimestamp = newEndTime;
		Calendar1.setTimestamp(calendarTime + (trendSampleRate*60));
	}
	readAllData();
}
else if (forwardArea10.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	
	int calendarTime = Calendar1.getTimestamp();
	int newEndTime = calendarTime + ((trendSampleRate*600) * (internalNumSamples/600));
	
	if (newEndTime < channelTags[fastestChannelNum].getHistorian().getNowTimestamp())
	{
		newTimestamp = newEndTime;
		Calendar1.setTimestamp(calendarTime + (trendSampleRate*600));
	}
	readAllData();
}
dus in dit verhaal moet ook nog iets niet kloppen...

het was dit..

Code: Selecteer alles

else if (forwardArea.intersects(clickArea))
{
	gpclasses.system.CgpSystem.beep(false);
	
	int calendarTime = Calendar1.getTimestamp();
	int newEndTime = calendarTime + (trendSampleRate * internalNumSamples);
	
	if (newEndTime < channelTags[fastestChannelNum].getHistorian().getNowTimestamp())
	{
		newTimestamp = newEndTime;
		Calendar1.setTimestamp(calendarTime + trendSampleRate);
	}
	readAllData();
}
tja... wat kan daar nu weer fout zijn... :-)

als ik 10 vooruit stap.... als ik daarna dan 1 vooruitstapt, doet hij de eerste keer 10, en de 2de keer wel 1...

andersom ook, als ik eerst op 1 drukt, en daarna op 10, doet hij eerst een stap van 1, en de 2de keer pas 10?

dus om een of andere reden blijft er een waarde hangen.... pfff.

dat *60 en /60 zou er uit kunnen... want die kan je tegen elkaar weg strepen.... maar maakt ook niet uit als het er inzit....

ik snap alleen nog niet waarom als nadat je op 1 gedrukt heb, en daarna op 10, waarom hij dan eerst een stap van 1 doet...
http://www.arjan-swets.com (met cnc filmpjes)
Gebruikersavatar
hugo stoutjesdijk
Donateur
Berichten: 11995
Lid geworden op: 02 mar 2011 17:04
Locatie: elst (u)
Contacteer:

Re: Nieuw programmeer vraagje....

Bericht door hugo stoutjesdijk »

Ik heb er helemaal geen benul van, maar zou het niet zo kunnen zijn dat het verwerken van de waarde van die button na ijlt op de actie.
Zou je een testbutton kunnen maken waar je alleen de waarde op 10 zet, en vervolgens met een andere button de stap maakt die op dat moment gekozen is.
Dan zit er altijd meer dan genoeg tijd voor de verwerking. Gevoelsmatig heel onlogisch, maar heb al vaker onmogelijke zaken zien gebeuren die achteraf toch verklaarbaar waren.
Ik ben voor meer techniek op school, maar dan wel vanaf groep 1 basischool.
Plaats reactie