Beste forumgenoten,
Momenteel ben ik een siemens s7 1200 icm een ktp400 HMI aan het programmeren.
Nu heb ik visueel (op de hmi) een keypad gemaakt (alleen nummeriek). Nu wordt bij bediening van een willekeurige toets de desbetreffen variabele geset en bij het loslaten weer gereset. Dus gewoon steeds even een variabele met gekoppelde waarde die hoog en weer laag wordt.
Nu komt het.. Nu wil ik vanaf dat keypad een waarde kunnen maken die maximaal 9999 is. Maar hoe..
Ik programmeer voor het eerst met step7 basic V13 ik heb meer ervaring met CoDeSys V2.3.. Maar om eerlijk te zijn heb ik nog nooit eerder met een dergelijk bijltje gehakt.. Wie o wie heeft de moed en kracht om mij een klein beetje te helpen aan een opstapje?
Mogelijk moet ik nog meer informatie verstrekken voor iemand me wat kan helpen.. Laat het dan maar even weten?
Alvast hartelijk dank!!
https://support.industry.siemens.com/cs/attachments/90114350/hmi_basic…
hoofdstuk 4.4
als de tag action waar je de waarde van wilt wijzigen kun het onscreen nummeric keybord oproepen. Aan je tag die je wijzigen gaat kun je ook minimale en maximale waarde aanhangen, dit kunnen kijkharde ingegeven in je project of ook weer tags uit je plc
Waarom zou je?
een keypad functie zit standaard al in het HMI ingebakken.
je hoeft alleen maar een instelling in het dropdown menu van het invoerveldje aan te zetten zodat de gebruiker toegang heeft tot het schrijven van een variabele.
Zodra de gebruiker het veldje aantikt komt het keypad naar voren.
Deze instelling is te vinden zodra je in Tia portal het desbetreffende invoerveld hebt aangeklikt,
en dan in het menu onderin het scherm onder de tab "properties"/"general"
----------------------
Maar, jouw keypad ziet er wel iets mooier uit dan het standaard keypad.
als je door wilt gaan moet jouw keypad moet je in de Plc een stukje programma schrijven dat aan de hand van de knopmerkers de getallen in een variabele zet.
Ja, dat is het juist.. ik heb dat geprobeerd met een 'ingebakken keypad' ..dan stel je een i/o field in als in/output.. dat is opzich best mooi. Maaar op deze HMI moet een bouwvakker [niets ten nadele van hen;)] op een snelle, duidelijke en eenvoudige methode kunnen invoeren en alle extra mogelijkheden op een keypad of 'kleine' toetsen zijn voor hen een ergernis. vandaar mijn overweging om met een eigenhandige keypad aan de gang te gaan.
Maar nu is mij niet helemaal helder hoe ik de variabelen van de [bediende toetsen] op de juiste volgorde als een in mijn geval 4 cijferige variabele krijg.. mij staat iets bij dat ik dat met een zogenoemd 'DataBlock' kan gaan doen.. misschien iemand die mij hierover nog iets verder kan vertellen
.
alvast dank voor de reacties!
Oke, Een datablock is een tabel waarin je meerdere variabelen kunt opslaan.
Het heeft ten doel om de data geordend weg te kunnen schrijven.
Met alleen een datablock ben je er dus niet.
-------------------
Je moet ook een functieblock toepassen.
daar heb je 2 smaken van, eentje met geheugen waarin de waarden onthouden worden (blauw) (function block)
en eentje waarin het geheugen wordt gewist zodra het functieblok doorlopen is (Groen)(function).
Dit is gelijkwaardig aan de Codesys versie van beiden.
Je kunt in beiden evengoed het programma schrijven waarin je de toetsdrukken verwerkt, maar je moet hier wel rekening mee houden.
Ik persoonlijk zou voor blauw gaan, dan blijven je merkers staan en kun je de volgende plc cyclus gewoon verder.
----------------
Heb je al een idee voor een programma dat de toets aanslagen verwerkt?
Ik wil je daar ook wel een beetje mee helpen, maar dan moet je aan het eind van de rit wel t project toesturen met het HMI scherm en de code voor de toets verwerking.
(Of nog beter, hier op CO online zetten, dan hebben we er allemaal wat aan!)
Dan kan ik dat later ook mooi toepassen op mijn projecten. 
Ja daartoe ben ik zeker bereid. Ik zal inderdaad eerst eens beginnen met een functieblok te maken voor de toetsen afhandeling.. dat lijkt mij ook t beste.
Ik moet eerlijk bekennen dat ik geen held ben op het gebied van StructuredText, ik heb het meest met de functie blokken van doen [ben ook maar een eenvoudige machinebouwer] dus zal het ook deze keer in het geheel met functie blokken proberen te schrijven.
Als ik wat verder ben laat ik zeker even wat weten. en misschien heeft Roel intussen nog een heldere ingeving;)
Functieblokken is helemaal prima 
Mijn ingeving is om 6 "interger" variabelen aan te maken.
de eerste 4 zijn voor losse cijfers
de 5e voor het totale getal
de 6e voor een tellerwaarde (kom ik zo op terug)
voor iedere toets zou ik een apart netwerk te gebruiken, om alles mooi gescheiden te houden.
de merker waarop de knopdruk binnenkomt stop je in een "P_TRIG" waardoor je een puls maakt (vergelijkbaar met Codesys "R_trig").
-----------------------
deze puls stop je in een "&" poort.
naast deze puls komt er op de 2e ingang van de "&" poort een "comparator" van het type "==".
deze vergelijkt de tellerwaarde met een vast getal (in dit geval 0)
achter de & poort komt een "move", deze krijgt voor toets1 een 1 aan de ingang, (voor toets2 een 2 etc.)
deze schrijft zijn waarde van de ingang in de variabele met (bijvoorbeeld) de naam "cijfer_een".
daarna achter de move instructie komt een "add" blok.
deze krijgt de variabele voor de teller op poort 1
en een 1 op poort 2.Dit doe je vanaf de "-----" (tot onderaan) in totaal 4 keer per knop, iedere keer hoog je het cijfer dat in de comparator gaat met 1 op (tot 3) en verander je de naam van "cijfer_een" in "cijfer_twee" en zo verder.
daardoor gaat het alsvolgt werken:
als de teller gelijk aan 0 is, en er op de knop wordt gedrukt wordt de waarde "1" in de variabele met de naam "cijfer_een" geschreven.
daarna wordt de teller met een verhoogd (en krijgt dus de waarde 1).
nu wacht het programma totdat de toets wordt losgelaten (door de P_TRIG)
stel dat iemand nog een keer op de toets drukt, dan wordt dezelfde stappen doorlopen, maar komt het getal niet in de variabele "cijfer_een" maar in variabele "cijfer_twee" terecht omdat ondertussen de teller is opgehoogd.
-------------
Bovenstaande voor alle toetsen maken.
(kun je zo door kopieren, dan hoef je alleen nog de merker voor de "P_TRIG" aan te passen (voorbeeld voor een naam: "Flank_toets1") en het cijfer dat ingevoerd wordt in het "move" blokje moet je aanpassen.
voor knop 2 wordt dat 2,
voor knop 3 wordt dat 3, 
Misschien maar een domme vraag, maar hoe krijg ik bijv. een drietal variabelen in een waarde?.. dus bijv. Een waarde 4,7,8 allen als losse variabele a, b, c. en dat in een variabele x zetten als 478?
Moet ik dan aan de gang met een array?
Alvast hartelijk dank voor uw begrip 
Bij elke toetsaanslag het getal wat je al had (int of dint) vermenigvuldigen met 10, en de nieuwe toetsaanslag (0-9) er bij optellen.
Backspace is ook makkelijk: gewoon weer delen door 10 (de rest van de deling valt toch weg).
Je kunt aan 1 button in het KTP'tje meerdere acties koppelen. Bijvoorbeeld:
knop 1:
- sla de waarde '1' op in de variabele LaatstGedrukteToets
- set het bitje ToetsGedrukt
knop 2:
- sla de waarde '2' op in de variabele LaatstGedrukteToets
- set het bitje ToetsGedrukt
etc
Je kunt nu met 1 stukje code in de PLC verder:
if ToetsGedrukt then
resultaat := resultaat * 10 + LaatstGedrukteToets;
ToetsGedrukt := false;
end_if;En ben je al verder gekomen?
Beide manieren komen eigenijk op hetzelfde pricipe uit,
Ik wilde namelijk nadat je 4 losse cijfers had verzameld dezelfde berekening doen.
(duizentallen x1000, honderdtallen x100 etc.)
Zijn code is alleen korter, maar je krijgt geen gescheiden cijfers wat later misschien handig had kunnen zijn voor verdere verwerking.
Roel, ik heb t voor elkaar? ..t was even een strijd voor mij? maar t werkt.
Alleen nog geen . In de code meegenomen, maar wel vier getallen. alleen ze worden nog iets traag weergegeven.. mogelijk de snelheid van de variabelen wat hoger zetten.
Weet jij misschien hoe/waar ik een los FB vanuit TiaPortal of hardeschijf kan selecteren, zo ja..waar zal het ongeveer staan? Dan kan ik het FB hier op t forum slingeren, voor degenen die daar baat bij hebben?
Helemaal super!
De refesh snelheid van de variabelen staat standaard op 1 seconde (dacht ik).
Deze kun je (voor iedere tag apart) instellen in het "tag menu" van het Hmi screen (aan de linkerkant te openen onder hmi/hmi_tags)
vergeet dan ook niet meteen de refresh rate van de knoppen omhoog te zetten.
----------------
Je kunt het project bovenin Tia portal (in hetzelfde menu als opslaan) op "archiveren" klikken en dat bestand vervolgens uploaden.
Daarnaast bestaat er de mogelijkheid om per functieblok op de rechtermuisknop te drukken en dan "generate source from blocks" te doen.
dan krijg je een soort tekst bestand... (geen ervaring mee)
Maar of dat "generate source from blocks" ook mogelijk is voor het Hmi gedeelte van het project lijkt me niet...
------------
Wat ook gewoon werkt is op "opslaan als" te klikken (en dan niet op oke!) waardoor je ziet in welke map het project nu is opgeslagen.
Per project maakt Tia portal een aparte map aan, met allerlei project bestanden daarin.
Dus dan moet je deze gehele map maar kopieren en uploaden.
Als je iemand een FB,FC wilt sturen zonder het hele project is generate source de beste optie. Deze "tekst" kun je bv ook als code in forum plakken hier.
Oke, ik zal as week even de hele bende uploaden?. Nu heb alleen weer even ruzie met mn plc/hmi.. of zij met mij?...
de variabelen tussen de hmi en plc komen compleet gemixed over??, why?
Ik weet dat je binnen CoDeSys de 'netwerk variabelen' steeds op allen op exact de zelfde regel moet hebben.. dus variabele a in de plc op regel 1 en variabele a in de hmi op regel 1 enz.
Is het nu zo dat je ook zo iets hebt met step7 basic? ik heb al van alles geprobeerd.. ook de tags 'gesynchroniseerd' maar niets helpt.
Dat verhaal met die netwerk regels gaat niet op.
Je hebt al een tag synchronisatie uitgevoerd.
(Door middel van de knop hoop ik, niet door zelf de hele lijst te vergelijken?!)
Ik zag dat je 2 Plc's hebt, ben je toevallig met de ip adressen aan het wisslen geweest?
Kun je voor de zekerheid alles naar ieder netwerk onderdeel opnieuw downloaden (plc1, plc2 en het Hmi), zodat overal de meest recente versie van jouw project inzit.
[Bericht gewijzigd door roel999 op (10%)]
Ja klopt, ik heb dmv de knop een tag synchronisatie gedaan [incl. wijzigen toestaan].
Ik had inderdaad de keypad afhandeling [tijdelijk ivm levering huidige plc] even in een 1212C AC/DC/Rly geschreven.. alles even opgepakt [gekopieerd] en in de nieuwe 1211C DC/DC/DC cpu geplakt.. even wat dingen 'rechtgezet' en vanuit de hmi de tags gesynchroniseerd, maar dat doe ik nooit meer.. wat geeft dat een geklier 
Nu bleef het gedonder.. ik heb inmiddels de hmi al 2 maal gereset [to factory settings]., ten einde raad heb ik een totaal nieuw project aangemaakt [ook alle variabelen opnieuw aangemaakt, en niet gekopieerd oid]
Nu komen alle tags weer 1op1 binnen, maar rest er nog 1 raadsel.. als ik [tag list] num8 bedien krijg ik op waarde_gewenst een getal van 256, als ik num9 bedien 512, als ik start bedien: 8192 en als laatste als ik stop bedien krijg ik op lengte_gewenst een waarde van 4096 te zien....
wat kan dat nou wezen?
Alvast hartelijk dank voor alle tips!!
functie achter de knop setbitintag gebruikt? in plaats van settag?
je zet een bool,
binair tellen,
DBx/Mx.0 (0001) is 1
DBx/Mx.1 (0010) is 2
DBx/Mx.2 (0100) is 4
DBx/Mx.3 (1000) is 8 enzovoort
al dan niet met een hele byteswap ergens
maar ik kan niet in je programma kijken hoe je het precies allemaal aan elkaar geknoopt hebt en waar het misgaat
als ... van 256, als ik num9 bedien 512, als ik start bedien: 8192 ... 4096 te zien....
wat kan dat nou wezen?
Dat lijkt op een typische overlapping van de tags,waarschijnlijk zet je door middel van bijvoorbeeld de knoppen enkele bitjes binnen de geheugenruimte van jouw variable "gewenste_waarde" of "actuele_waarde".
vooral omdat het precies 256, 512 is.
(256 is bit 9 van bijvoorbeeld "gewenste_waarde" op 1)
512 is bit 10,
Ga naar de symbol list in de plc en geef jouw tag voor "waarde_actueel" en "waarde_gewenst" een nieuw adres, dat boven het huidige hoogste adres ligt.
als het huidig hoogste adres bijvoorbeeld %M9.5 is, maak jouw tag dan %MW10 en let op! je gebruikt waarschijnlijk een double, dus de volgende wordt minimaal 12!! (er moeten 4 bytes tussen zitten voor een Dint of Dword, een INT of Word heeft 2 Bytes tussenruimte na de startpositie (die je in het vakje intyped) nodig.
Update daarna (met de hand) ook de tags in het Hmi.
Oke, Alvast hartelijk dank! Ik ga de adressen even wijzigen. en DK, ik heb inderdaad SetTag gebruikt.. ipv SetBitInTag, maar ik heb nog even niet helder wat het verschil is.
Wil u dat nader verklaren aan mij? 
Setbitintag wordt gebruikt om een bitje van bijvoorbeeld een byte, word of Dword te zetten.
dan moet je ook de offset opgeven, van bijvoorbeeld 3 en de tag linken.
zodra je op het Hmi de toets bedient zet het Hmi het bitje nummer drie van de opgegeven tag.
Roel999,
excuus voor mijn erg late reactie.. ik ben er even een poosje tussenuit geweest en niet verder gegaan met mijn project iod.
Hierbij probeer ik je nog even de map met de keypad software te versturen [gebaseerd op een 1211DC/DC/DC plc met de jongste firmware icm. KTP400 HMI]
Als het goed is moet dit .Zip bestand na het uipakken werken., zo niet hoor ik het wel.
Stepper programma meetbaan.zip
Mvg,
Henk
Henk1989
Ik ben met een soort gelijk project bezig maar dan met een losse num keypad met 1 common en 12 uitgangen voor 0 t/m 9 en # *. Ik wil graag een hardware keypad gebruiken van eao. Nu zou ik graag jouw programma gebruiken voor referentie materiaal. Alleen wanneer ik het bestand uitpak kan ik het niet gebruiken omdat het niet de extensie .ap13 heeft. Kan je mij verder helpen.
Wanneer ik het blok klaar heb zal ik het hier posten.
