 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
KernelPanic Član

Pridružen-a: Pon 13 Avg 2012 10:29 Prispevkov: 162 Aktiv.: 1.04 Kraj: Ljubljana
|
Objavljeno: Ned Okt 13, 2013 1:06 pm Naslov sporočila: Cybro-2 PLC problem z stavkom if |
|
|
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 |
|
 |
igo Član

Pridružen-a: Sre 11 Okt 2006 19:11 Prispevkov: 3641 Aktiv.: 16.06
|
Objavljeno: Ned Okt 13, 2013 3:55 pm Naslov sporočila: Re: Cybro-2 PLC problem z stavkom if |
|
|
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 |
|
 |
KernelPanic Član

Pridružen-a: Pon 13 Avg 2012 10:29 Prispevkov: 162 Aktiv.: 1.04 Kraj: Ljubljana
|
Objavljeno: Ned Okt 13, 2013 4:07 pm Naslov sporočila: |
|
|
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 |
|
 |
brum Član


Pridružen-a: Čet 04 Nov 2010 16:33 Prispevkov: 82 Aktiv.: 0.46 Kraj: Kras
|
Objavljeno: Pon Okt 14, 2013 2:23 pm Naslov sporočila: |
|
|
Poskusi dati vse pogoje v if...elsif.
Na koncu pa v else, izklop vsega. |
|
Nazaj na vrh |
|
 |
KernelPanic Član

Pridružen-a: Pon 13 Avg 2012 10:29 Prispevkov: 162 Aktiv.: 1.04 Kraj: Ljubljana
|
Objavljeno: Pon Okt 14, 2013 2:27 pm Naslov sporočila: |
|
|
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 |
|
 |
TilenS Član

Pridružen-a: Čet 24 Nov 2005 12:29 Prispevkov: 556 Aktiv.: 2.35
|
Objavljeno: Pon Okt 14, 2013 7:01 pm Naslov sporočila: |
|
|
Zanimivo. Kateri kernel ter verzijo Cypro-ta uporabljaš? Mogoče preveri še maksimalni dosežen scan time. _________________ LP Tilen |
|
Nazaj na vrh |
|
 |
kose19 Član


Pridružen-a: Sre 02 Mar 2005 19:37 Prispevkov: 1228 Aktiv.: 5.20 Kraj: okolica Kobarida
|
Objavljeno: Ned Okt 20, 2013 5:20 pm Naslov sporočila: |
|
|
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 |
|
 |
TilenS Član

Pridružen-a: Čet 24 Nov 2005 12:29 Prispevkov: 556 Aktiv.: 2.35
|
Objavljeno: Ned Okt 20, 2013 8:33 pm Naslov sporočila: |
|
|
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 |
|
 |
kose19 Član


Pridružen-a: Sre 02 Mar 2005 19:37 Prispevkov: 1228 Aktiv.: 5.20 Kraj: okolica Kobarida
|
Objavljeno: Čet Nov 21, 2013 9:29 pm Naslov sporočila: |
|
|
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 |
|
 |
TilenS Član

Pridružen-a: Čet 24 Nov 2005 12:29 Prispevkov: 556 Aktiv.: 2.35
|
Objavljeno: Čet Nov 21, 2013 9:51 pm Naslov sporočila: |
|
|
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 |
|
 |
kose19 Član


Pridružen-a: Sre 02 Mar 2005 19:37 Prispevkov: 1228 Aktiv.: 5.20 Kraj: okolica Kobarida
|
Objavljeno: Čet Nov 21, 2013 10:02 pm Naslov sporočila: |
|
|
Super, hvala.
Zdaj še to preberem in poskusim. _________________ - Absens, carens -
- Tisti, ki ga ni, bo prikrajšan - |
|
Nazaj na vrh |
|
 |
|
|
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
|