• Welcome to Diskuse2 Elektrika.cz. Please login or sign up.
 

Jakým přiřazovacím příkazem mohu nastavit konkrétní bit v proměnné typu byte?

Started by Petr Liskar, 29.05.2012, 01:51

previous topic - next topic

Petr Liskar

Situace: Programuji Tecomat Foxtrot. Mám POU volanou v úloze, kterou chci spouštět, pokud je první bit systémové proměnné System_S.S25 roven jedné. Tento bit chci nastavit na základě nějaké podmínky v jiné/jiných POU a shodit při vykonání daného POU. Existuje nějaký jednoduchý zápis či přiřazení, kterým bych mohl daný konkrétní bit ovlivnit?


Postránecký Petr

Quote from: Petr Liskar on 29.05.2012, 01:51
Situace: Programuji Tecomat Foxtrot. Mám POU volanou v úloze, kterou chci spouštět, pokud je první bit systémové proměnné System_S.S25 roven jedné. Tento bit chci nastavit na základě nějaké podmínky v jiné/jiných POU a shodit při vykonání daného POU. Existuje nějaký jednoduchý zápis či přiřazení, kterým bych mohl daný konkrétní bit ovlivnit?


Udělal bych to takto:
- Hodnotu bytu bych uložil do proměnné
- Dosadil do vzorce x= Proměnou AND 1 (prvni bit vysledkem je 1 pokud je "nahozen" a 0 pokud ne)
- porovnaní a nějaká akce


Jirka Š. Svejkovský

Neznám prostředí Mosaic, ale pokud chcete přehodit libovolný bit, použijte operaci xor:

1000b xor 10b = 1010b (překlopí druhý bit)

Zápis na překlopení prvního bitu by vypadal asi takto:

System_S.S25 = System_S.S25 xor 1

Pokud je systémová proměnná System_S.S25 readonly, pracoval bych s její kopií.
Projektant (strojní zařízení/energetika/TZ budov), revizní technik E1B

Petr Liskar


Petr Liskar

Quote from: Jirka Š. Svejkovský on 29.05.2012, 12:14
Neznám prostředí Mosaic, ale pokud chcete přehodit libovolný bit, použijte operaci xor:

1000b xor 10b = 1010b (překlopí druhý bit)

Spíš OR než XOR, potřebuji bit zaručeně nahodit (shodit na nulu se dá pro změnu ANDem).
Hledal jsem jednodušší způsob, než se matlat s ORem a s ANDem. Konkurence například umožňuje nadefinování aliasu nad zvolený bit a dál se v operacích pracuje s názvem aliasu a prgramátor se o nic nestará. Popřípadě syntaxe přiřazení umožňuje jít až na zvolený bit dané proměnné přímo...

Takže mě čeká psaní vlastní knihovny, aby bylo možno Teco rozumně použít...  >:(

Quote from: Jirka Š. Svejkovský on 29.05.2012, 12:14
Pokud je systémová proměnná System_S.S25 readonly, pracoval bych s její kopií.

Ne, je RW a tato konkrétně řídí spouštení určité skupiny úloh.


SMILEK

No dobrá, tedy vážně:

VAR_GLOBAL
   mujNastavovanyBit  AT %S25.1  : BOOL;   
END_VAR


a v POU pak volat:
IF moje_podminka THEN mujNastavovanyBit := hodnota; END_IF
;)

Milan Bydžovský

Alias na první bit lze zapsat jako:

VAR_GLOBAL
  alias_na_prvy_bit_s25 AT System_S.S25.0 : BOOL;
END_VAR

Kromě definice proměnné lze použít zápis s bitovým indexem i přímo v kódu:

zápis může vypadat např. takto:

System_S.S25.0 := hodnota;


SMILEK

Quote from: Milan Bydžovský on 29.05.2012, 19:24
System_S.S25.0 := hodnota;


A myslíte, že to bude v praxi fungovat? Měl jsem pocit, že S25.0 si přepisuje samotný systém (plánování P9) a uživatelsky ovlivnitelné jsou až bity S25.1-7.  Tak jsem v příkladu přepsal nultý bit na první (S25.1).   (dance)

Jiří Schwarz

Koukám, že mi asi trochu ujel vlak...
Já bych to dokázal maximálně pro nějaký PIC pomocí instrukce  BSF f,b
Jako tvrdá Chodská palice nemám rád přísloví o tom, že moudřejší ustoupí. Když moudřejší ustoupí, hlupák si prosadí nesmysl!
Příspěvky psané kurzívou berte s velkou rezervou a nadhledem :-)

Petr Liskar

Quote from: Milan Bydžovský on 29.05.2012, 19:24
Alias na první bit lze zapsat jako:
VAR_GLOBAL
  alias_na_prvy_bit_s25 AT System_S.S25.0 : BOOL;
END_VAR

OK, až na to, že chci nastavit první, nikoliv nultý bit.

Quote from: Milan Bydžovský on 29.05.2012, 19:24
Kromě definice proměnné lze použít zápis s bitovým indexem i přímo v kódu:
zápis může vypadat např. takto:
System_S.S25.0 := hodnota;

Jo, to kupodivu funguje taky, byť s předchozí výhradou. jsem děkující...

Petr Liskar

Quote from: Pavel Smílek on 29.05.2012, 19:45
A myslíte, že to bude v praxi fungovat? Měl jsem pocit, že S25.0 si přepisuje samotný systém (plánování P9) a uživatelsky ovlivnitelné jsou až bity S25.1-7.  Tak jsem v příkladu přepsal nultý bit na první (S25.1).   (dance)

Kušuj, rejpale, tady přece mají radit odborníci...  ;)

SMILEK

Pokud je pravda tohle:
Quote from: Jiří Schwarz on 29.05.2012, 20:13
Já bych to dokázal maximálně pro nějaký PIC pomocí instrukce  BSF f,b


tak nejspíš není pravda tohle:
Quote from: Jiří Schwarz on 29.05.2012, 20:13
Koukám, že mi asi trochu ujel vlak...


Protože pokud tu zrovna nefrajeříme s přímým adresováním a řízenou aktivací úloh (bez čehož se dá ve většině aplikací velmi pohodlně žít), tak je to celé jen variace na starý dobrý Pascal. Je to stejné jako na silnici. Své místo tu má profík TIR a stejně tak děda s kloboukem, vezoucí pytel jablek ze zahrádky. Výhodou PLC od Tecomatu je, že každý si může najít to své. Šikovný neprogramátor si ovládání svého domu nakliká ve FoxToolu, programátor si vybere dle svého zaměření ze sedmi jazyků (některé jsou grafické, jiné textové), profík na tom stejném PLC bude Profibusem či Modbusem řídit průmyslovou linku. Je to stavebnice (jo, jsem hračička, vyrostl jsem s Merkurem  ;)), ze které se dá udělat regulátor domácího topení či světel a stejně tak velín dálničního tunelu.   

Milan Bydžovský

Quote from: Petr Liskar on 29.05.2012, 20:19
OK, až na to, že chci nastavit první, nikoliv nultý bit.
Jo, to kupodivu funguje taky, byť s předchozí výhradou. jsem děkující...


Rádo se stalo. Omlouvám se za nepochopení, já chápal první bit jako bit s indexem nula ;-)