www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Cybro-2 PLC problem z stavkom if

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Avtomatizacija v industriji
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
KernelPanic
Član
Član



Pridružen-a: Pon 13 Avg 2012 10:29
Prispevkov: 162
Aktiv.: 1.04
Kraj: Ljubljana

PrispevekObjavljeno: Ned Okt 13, 2013 1:06 pm    Naslov sporočila:  Cybro-2 PLC problem z stavkom if Odgovori s citatom

Spostovane dame in gospodje!

Programiram Cybro-2 PLC z dodanim modulom za nadzor luci preko protokola DALI, na katerega so zvezana 4 zidna stikala. Na modul za nadzor luci (DALI protokol) je zvezana testna svetilka z tremi LED trakovi, torej RGB. Doseci hocem naslednje:
1) Ob pritisku prvega stikala se vklopi rdeca komponenta (prvi led trak v luci)
2) Ob pritisku drugega stikala se vklopi zelena komponenta (drugi led trak v luci)
3) Ob pritisku tretjega stikala se vklopi modra komponenta (tretji led trak v luci)
4) Ob pritisku cetrtega stikala se vklopijo vse komponente, torej bela svetloba

Posamicno sem te scenarije ze sprogramiral in delujejo brezhibno, vendar ko jih hocem zdruziti v svoj program, katerega koda je sledeca:
Koda:
// ***************************************************************
// * At startup, turn off all three componenets (RGB) of a light *
// ***************************************************************
if first_scan then
   turn_light_off(COMP_ALL);
end_if;

// ********************************************************************************************
// * Settings statuses of lights according to switch pressed flag and previous state of light *
// ********************************************************************************************
state_light_on[COMP_RED]:=fn(sw00_ix00) xor state_light_on[COMP_RED];
state_light_on[COMP_GREEN]:=fn(sw00_ix01) xor state_light_on[COMP_GREEN];
state_light_on[COMP_BLUE]:=fn(sw00_ix02) xor state_light_on[COMP_BLUE];
state_light_on[COMP_ALL]:=fn(sw00_ix03) xor state_light_on[COMP_ALL];

// *****************************************
// * Light operation according to statuses *
// *****************************************
if state_light_on[COMP_RED] then
    turn_light_on(COMP_RED);
else
    turn_light_off(COMP_RED);
end_if;

if state_light_on[COMP_GREEN] then
   turn_light_on(COMP_GREEN);
else
   turn_light_off(COMP_GREEN);
end_if;

if state_light_on[COMP_BLUE] then
   turn_light_on(COMP_BLUE);
else
   turn_light_off(COMP_BLUE);
end_if;

if state_light_on[COMP_ALL] then
   turn_light_on(COMP_ALL);
else
   turn_light_off(COMP_ALL);
end_if;
se mi zgodi sledece, da se uposteva samo zadnji if stavek. Torej, kontroliram lahko samo priziganje vseh strek komponent - COMP_ALL, torej bele svetlobe. Zakaj mi v runtime PLC enostavno ignorira preostale tri if stavke?

Lp,
Marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.06

PrispevekObjavljeno: Ned Okt 13, 2013 3:55 pm    Naslov sporočila:  Re: Cybro-2 PLC problem z stavkom if Odgovori s citatom

Zamenjaj vrstni red barv, da bo ALL drugi po vrsti in poročaj, kaj sveti.
Tudi sicer imaš dokaj nerodno izveden preklop.
Koda:
 if sw1 AND sw2 AND sm3 AND sw4 == 0 then
 Blokada = 0
//* ce ni nic pritisnjeno, izklopi blokado
end if;

if sw1 == 1 AND Blokada ==0 then
 Rdeca = Rdeca XOR 1
 Blokada = 1
end if;

if sw2 == 1 AND Blokada ==0 then
 Zelena = Zelena XOR 1
 Blokada = 1
end if;

if sw3 == 1 AND Blokada ==0 then
 Modra = Modra XOR 1
 Blokada = 1
end if;

if sw4 == 1 AND Blokada ==0 then
 Blokada = 1

 if vse == 0
  Rdeca = 1
  Zelena = 1
  Modra = 1
  vse = 1
 else
  Rdeca = 0
  Zelena = 0
  Modra = 0
  vse = 0
 end if;
end if;
Uredi sintakso (podpičja, znake za AND, ... ) .
_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
KernelPanic
Član
Član



Pridružen-a: Pon 13 Avg 2012 10:29
Prispevkov: 162
Aktiv.: 1.04
Kraj: Ljubljana

PrispevekObjavljeno: Ned Okt 13, 2013 4:07 pm    Naslov sporočila:   Odgovori s citatom

Ce dam ALL if stavek na drugo mesto, potem mi ob pritisku tretjega knofa zagori samo modra luc (spet se izvede zadnji pogoj, torej BLUE, ker smo ALL dali na drugo mesto). Aja pa se to: Na vsakem zidnem stikalu je ledica in sem dodal funcionalnost, da se ob pritisku na ustrezno zidno stikalo prizge njegova ledica, deluje brez problemov tudi za ugasanje. Torej, v tem primeru, ko je BLUE zadnji (ALL je na drugem mestu) in ko pritisnem naprimer prvo stikalo, se vklopi ledica na stikalu samem (kar je ok), vendar se luc ne prizge. V tem primeru, ko je BLUE zadnji (ALL je na drugem mestu), samo tretje stikalo dejansko prizge luc (v nasem primeru modro, ker je ALL na drugem mestu). Ledice samih zidnih stikal pa se prizigajo pravilno. Wtf? Sintaska sama tega Cybro-2 Structured Text je porazna (za moje pojme), tako da sem spisal kodo karseda citljivo, bom se malo popravil, ok, kar se da. Tu je upgrade kode za priziganje ledic na zidnih stikalih samih:
Koda:
// ***************************************************************
// * At startup, turn off all three componenets (RGB) of a light *
// ***************************************************************
if first_scan then
   turn_light_off(COMP_ALL);
   turn_switch_led_off(COMP_ALL);
end_if;

// ********************************************************************************************
// * Settings statuses of lights according to switch pressed flag and previous state of light *
// ********************************************************************************************
state_light_on[COMP_RED]:=fn(sw00_ix00) xor state_light_on[COMP_RED];
state_light_on[COMP_GREEN]:=fn(sw00_ix01) xor state_light_on[COMP_GREEN];
state_light_on[COMP_BLUE]:=fn(sw00_ix02) xor state_light_on[COMP_BLUE];
state_light_on[COMP_ALL]:=fn(sw00_ix03) xor state_light_on[COMP_ALL];

// *****************************************
// * Light operation according to statuses *
// *****************************************
if state_light_on[COMP_RED] then
    turn_light_on(COMP_RED);
    turn_switch_led_on(COMP_RED);
else
    turn_light_off(COMP_RED);
    turn_switch_led_off(COMP_RED);
end_if;

if state_light_on[COMP_ALL] then
   turn_light_on(COMP_ALL);
   turn_switch_led_on(COMP_ALL);
else
   turn_light_off(COMP_ALL);
   turn_switch_led_off(COMP_ALL);
end_if;

if state_light_on[COMP_GREEN] then
   turn_light_on(COMP_GREEN);
   turn_switch_led_on(COMP_GREEN);
else
   turn_light_off(COMP_GREEN);
   turn_switch_led_off(COMP_GREEN);
end_if;

if state_light_on[COMP_BLUE] then
   turn_light_on(COMP_BLUE);
   turn_switch_led_on(COMP_BLUE);
else
   turn_light_off(COMP_BLUE);
   turn_switch_led_off(COMP_BLUE);
end_if;
S spostovanjem in vnaprej se vam zahvljajujem za pomoc,
Marko
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
brum
Član
Član



Pridružen-a: Čet 04 Nov 2010 16:33
Prispevkov: 82
Aktiv.: 0.46
Kraj: Kras

PrispevekObjavljeno: Pon Okt 14, 2013 2:23 pm    Naslov sporočila:   Odgovori s citatom

Poskusi dati vse pogoje v if...elsif.
Na koncu pa v else, izklop vsega.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
KernelPanic
Član
Član



Pridružen-a: Pon 13 Avg 2012 10:29
Prispevkov: 162
Aktiv.: 1.04
Kraj: Ljubljana

PrispevekObjavljeno: Pon Okt 14, 2013 2:27 pm    Naslov sporočila:   Odgovori s citatom

brum je napisal/a:
Poskusi dati vse pogoje v if...elsif.
Na koncu pa v else, izklop vsega.
Hvala za idejo, bom probal, ampak najprej se bom znebil CMP_ALL stanja, ker je odvisen od ostalih treh stanj. Javim ...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
TilenS
Član
Član



Pridružen-a: Čet 24 Nov 2005 12:29
Prispevkov: 556
Aktiv.: 2.35

PrispevekObjavljeno: Pon Okt 14, 2013 7:01 pm    Naslov sporočila:   Odgovori s citatom

Zanimivo. Kateri kernel ter verzijo Cypro-ta uporabljaš? Mogoče preveri še maksimalni dosežen scan time.
_________________
LP Tilen
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
kose19
Član
Član



Pridružen-a: Sre 02 Mar 2005 19:37
Prispevkov: 1228
Aktiv.: 5.20
Kraj: okolica Kobarida

PrispevekObjavljeno: Ned Okt 20, 2013 5:20 pm    Naslov sporočila:   Odgovori s citatom

Naj še jaz pristavim svoj lonček v to temo.

Ali je s tem plc-jem možno uporabljati "prekinitev" kot pri mikrokontrolerjih?
Rad bi namreč, da bi z njim štel obrate osovine in ob nastavljeni vrednosti izvedel del programa. Nočem namreč, da bi se kateri od pulzov izmuznil.

_________________
- Absens, carens -
- Tisti, ki ga ni, bo prikrajšan -
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
TilenS
Član
Član



Pridružen-a: Čet 24 Nov 2005 12:29
Prispevkov: 556
Aktiv.: 2.35

PrispevekObjavljeno: Ned Okt 20, 2013 8:33 pm    Naslov sporočila:   Odgovori s citatom

Gor je HSC števec do 10kHz ampak tole z prekinitvami bo malo bolj težko. HSC ima sicer eno prekinitev in sicer ko pride števec do 0 ti lahko recimo izklopi ali vklopi relejski izhod ali pa postavi neko bitno spremenljivko, ki jo potem kasneje obdelaš. Prekinitev takšnih kot jih poznamo pri naših mikrokontrolerjih na žalost ni.

Lahko pa seveda nastaviš vrednost HSC števca pri kateri hočeš, da ti program nekaj naredi ampak to ne bo izvedeno kot prekinitev.

Več o tem pa lahko najdeš v manual na strani 48 in naprej.

_________________
LP Tilen
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
kose19
Član
Član



Pridružen-a: Sre 02 Mar 2005 19:37
Prispevkov: 1228
Aktiv.: 5.20
Kraj: okolica Kobarida

PrispevekObjavljeno: Čet Nov 21, 2013 9:29 pm    Naslov sporočila:   Odgovori s citatom

Manual sem prebral, pa se mi je postavilo novo vprašanje.

Kateri vhod se uporablja za HSC števec? Ali je mogoče potrebnen dodaten modul?

Nikjer namreč nisem nič o tem našel. Niti na uradni strani...

_________________
- Absens, carens -
- Tisti, ki ga ni, bo prikrajšan -
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
TilenS
Član
Član



Pridružen-a: Čet 24 Nov 2005 12:29
Prispevkov: 556
Aktiv.: 2.35

PrispevekObjavljeno: Čet Nov 21, 2013 9:51 pm    Naslov sporočila:   Odgovori s citatom

V CyPro manual-a je bolj opisana programska plat krmilnika oz. CyPro IDE okolja, hadware-ski del krmilnika je pa opisan tukaj.

Uporabljajo se PNP vhodi A(IX8),B(IX9) ter Z.

_________________
LP Tilen
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
kose19
Član
Član



Pridružen-a: Sre 02 Mar 2005 19:37
Prispevkov: 1228
Aktiv.: 5.20
Kraj: okolica Kobarida

PrispevekObjavljeno: Čet Nov 21, 2013 10:02 pm    Naslov sporočila:   Odgovori s citatom

Super, hvala.

Zdaj še to preberem in poskusim.

_________________
- Absens, carens -
- Tisti, ki ga ni, bo prikrajšan -
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Avtomatizacija v industriji Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 471 dni


Powered by phpBB © 2001, 2005 phpBB Group