Afronden getallen met Beckhoff PLC

Hey allemaal,

Voor mijn GIP moet ik via een potentiometer een analoog signaal (INT) naar een analoge ingangskaart (0..10V) sturen die ik dan via een analoge uitgangskaart (4..20mA) naar een analoge drukregelaar stuur. Het analoog signaal dat binnenkomt limiteer ik naar een signaal tussen 10000 en 32767, dit zodat dit niet onder een bepaalde druk gaat.

Momenteel heb ik een probleem met mijn ingangsspanning, het blijft niet stabiel genoeg, aangezien het ingangssignaal dat van de pot meter komt verdeelt word over 32767 (door het integer getal dat ik binnenkrijg op m'n plc) denk ik dat dat daaraan ligt.

Mijn vraag was nu of het mogelijk is met beckhoff om via een bestaande (of nog zelf te maken) functie dit getaal van 10000 tot 32767 om te vormen naar een afgerond getal, dat het met stappen van bv 100 naar boven gaat? Ik dacht dat met Siemens s7 dit mogelijk was om zogezegd te kiezen welk stuk van het getal gemaskt word, maar bij Beckhoff vind ik niet direct iets.

Ik hoef niet direct de kant en klare functie te krijgen (al is dat natuurlijk altijd handig) maar enkele tips of zo zou iig handig zijn :)

Alvast bedankt

Bram

Heb ik ook al gedacht, maar dan zit je met het feit dat het geen integer getal meer is.. en dat is wat ik moet uitsturen naar m'n drukregelaar..
Of zie ik dat verkeerd?

[Bericht gewijzigd door GJ_ op 28 april 2015 14:54:50 (8%)]

Als je van een getal een integer maakt, dan wordt alles achter de komma weggegooid.
Dus 1,9 wordt 1.
Wil je afronden bij 0,5 naar boven dan is daar een apart commando voor.

Daar waar een schakeling rookt, vloeit de meeste stroom (1e hoofdwet van Toeternietoe)

Afronden kan ook met unsigned integers wel makkelijk. Eerst delen door 50, dan 1 optellen bij het resultaat, dan weer door 2 delen en integer van maken.

Kom eens langs bij RevSpace of één van de andere spaces! WORKSHOP!

Is dit geen optie: Converteren naar (L)REAL, delen door 100 (wordt automatisch afgerond) en vervolgens vermenigvuldigen met 100 en terug converteren naar INT?

Zelf heb ik een FB gemaakt dat een analoog signaal verdeelt in 100 stappen, met demping en minimaal en maximaal level er in:

FUNCTION_BLOCK Gewenst_licht_percentage
VAR_INPUT
Analoge_meting : INT;
Minimaal : REAL;
Maximaal : REAL;
NextLevel : INT;
PrevLevel : INT;
OverShoot : INT;
END_VAR
VAR_OUTPUT
Percentage : BYTE;
END_VAR
VAR
Percentage_oud : BYTE;
Analoge_percentage : INT;
Vermenigvuldiging : REAL; (* := 326.15; *)
OverShootCounter : INT;
END_VAR

CODE:

Vermenigvuldiging := ((Maximaal - Minimaal) / 100);

Analoge_Percentage := (REAL_TO_INT(Percentage_oud * Vermenigvuldiging));

IF Analoge_meting < Analoge_percentage - PrevLevel OR Analoge_meting > Analoge_percentage + NextLevel THEN
OvershootCounter := OverShootCounter + 1;
IF OvershootCounter >= OverShoot THEN
Percentage := (LREAL_TO_BYTE(Analoge_meting / Vermenigvuldiging));
OverShootCounter :=0;
END_IF;
ELSE
Percentage := Percentage_oud;
OverShootCounter :=0;
END_IF;

Percentage := LIMIT(0,Percentage,100);
Percentage_oud:= Percentage;

GJ_

Moderator

Op 28 april 2015 17:06:54 schreef Toeternietoe:
Als je van een getal een integer maakt, dan wordt alles achter de komma weggegooid.
Dus 1,9 wordt 1.
Wil je afronden bij 0,5 naar boven dan is daar een apart commando voor.

Of eerst 0,5 bij optellen en dan pas afronden natuurlijk.

@rene1975: het is wel een schoolvraag natuurlijk. Suggesties zijn goed, de hele code uitschrijven is een beetje veel van het goede :-)

[Bericht gewijzigd door GJ_ op 28 april 2015 19:27:56 (17%)]

Op 28 april 2015 17:35:26 schreef Benadski:
Afronden kan ook met unsigned integers wel makkelijk. Eerst delen door 50, dan 1 optellen bij het resultaat, dan weer door 2 delen en integer van maken.

Wat is er mis met:

50 optellen bij af te ronden getal en dan door 100 delen?

Is dat om te voorkomen dat als je een signed int hebt van 16 bits, en je zit binnen de 50 bij het plafond van 32767, je overflow krijgt? Maar daar heb je juist bij UNsigned integers, die jij noemt geen last van.

Ja, was eigenlijk heel slordig van me beschreven.

Ik bedoelde eigenlijk in plaats van unsigned int: positieve waarde in die INT (zoals TS aangaf tussen 10000 en 32767). Of die INT zelf signed/unsigned is bij de TS weet ik niet. Maar eerst delen geeft idd geen kans op overflow meer bij signed.

Kom eens langs bij RevSpace of één van de andere spaces! WORKSHOP!