Problém s více procesy

Volná diskuse k projektu AMiTsys Junior

Problém s více procesy

Příspěvekod partikam » pon 05. dub 2010 14:44:52

Dobrý den, nastal mi malý problém při zkompletování mého programu. Program jsem měl rozdělen na části a vše jsem postupně zkoušel. Tudíž mi vše fungovalo bez problémů, ale poté jsem ze tří programů vytvořil jeden to znamená rozdělení na více procesů. V prvním procesu mám načtení binin a poté další podmínky a odkázání na daný case a na konci binout=>spustí pár věcí. Ve druhém procesu mám měření teploty, jak teplota přesáhne hranici program opět spustí daná opatření =>opět binout. Třetí proces na danou chybu již nemám vliv. Problém je ten, že funguje buď měření teploty a poté jsou spuštěna daná opatření=>binout nebo načtení vstupního číslicového signálu=>a opět spuštěna daná opatření binout, ale ne společně. Program se mi hádá, protože např. když je teplota v mezích, tak program nic nespouští, ale je třeba spuštěno některé z čidel binin=>program neví jestli pustit do binout signál nebo ne jeden proces to spouští druhý naopak ne!!!!! Zkoušel jsem různě kombinovat umístění binout, ale funguje vždy jen jeden proces(jen jedno spínání, buď spínám binout regulováním teploty nebo číslicovými vstupy. Ale nejde to společně-hádá se to). Chtěl bych poradit, kam mám umístit příkazi binout, aby pokud jeden nebo druhý proces něco "spustí nebo vypíná", tak aby to jelo. Snažil sem se problém vystihnout co nejpřesněji, doufám, že to pochopíte a děkuji za radu.
partikam
 
Příspěvky: 29
Registrován: čtv 08. říj 2009 16:17:27

Re: Problém s více procesy

Příspěvekod partikam » pon 05. dub 2010 18:26:03

Příklad pro přiblížení daného problému:

Proces 01:

BinIn #DIO0_0, 0x0000, @kour_bin

let prepinani=if(not @kour_bin,0,prepinani)

If @kour_bin
let prepinani=1
endif

Switch prepinani

case=0
Let @proudeni_1=false
let @odsavani=false
endcase

case 1
Let @proudeni_1=true
let @odsavani=true
endcase
endswitch

BinOut @proudeni_1, 0x0000, #DO00_0
BinOut @odsavani, 0x0000, #DO00_1
////////////////////////////////////////////////////////////////////////////////////
Proces 02:

AnIn #AI00_0, teplota0, 10.000, 0.000, 10.000, -12.000, 2825.000
Limits teplota0, @teplo0_nad, @teplo0_pod, 69.000, 70.000, 0.000, 0x0000

If @teplo0_pod
let celsium = 0
endif

If @teplo0_nad
let celsium = 1
endif

switch celsium
case 0
let @proudeni_1=false
let @odsavani=false
endcase

case 1
let @proudeni_1=true
let @odsavani=true
endcase
endswitch

BinOut @proudeni_1, 0x0000, #DO00_0
BinOut @odsavani, 0x0000, #DO00_1

=>potřebuji pro to nějakou podmínku, pokud platí některá z podmínek v jakémkoli procesu, tak aby to udělalo to co má a nehádalo se to mezi sebou!!
Např.; Jeden proces říká ať je @proudeni_1 a @odsavani spuštěné a druhý proces říká, aby to bylo vypnuto. Jak mám tenhle problém vyřešit?? Děkuji za rady...
partikam
 
Příspěvky: 29
Registrován: čtv 08. říj 2009 16:17:27

Re: Problém s více procesy

Příspěvekod jarda » pon 05. dub 2010 19:35:23

Zdravím,
pokud nebudete zkušenější v programování, tak se zdržte pravidla, že do proměnné (výstupu) se zapisuje jen z jednoho místa :!:
Čtení může být samozřejmě i z více míst.
Toto je základní pravidlo :!: (pokud proměnnou nepoužíváte jen jako krátkodobé úložiště hodnoty, ale v začátku bych si i pro tento případ vytvářel nové proměnné)
Při použití tohoto pravidla vám k popisovanému problému nemůže dojít.
Vysvětlení: v jednom procesu na výstup zapíšete hodnotu a v následném ho opět přepíšete novou hodnotou z dalšího procesu ;).
Doporučený postup:

Proces 01:
BinIn #DIO0_0, 0x0000, @kour_bin
let prepinani=if(not @kour_bin,0,prepinani)
If @kour_bin
let prepinani=1
endif
Switch prepinani
case=0
Let @proudeni_X=false
let @odsavani_X=false

endcase
case 1
Let @proudeni_X=true
let @odsavani_X=true

endcase
endswitch
////////////////////////////////////////////////////////////////////////////////////

Proces 02:
AnIn #AI00_0, teplota0, 10.000, 0.000, 10.000, -12.000, 2825.000
Limits teplota0, @teplo0_nad, @teplo0_pod, 69.000, 70.000, 0.000, 0x0000
If @teplo0_pod
let celsium = 0
endif
If @teplo0_nad
let celsium = 1
endif
switch celsium
case 0
let @proudeni_Y=false
let @odsavani_Y=false

endcase
case 1
let @proudeni_Y=true
let @odsavani_Y=true

endcase
endswitch
let @proudeni_1= @proudeni_X or @proudeni_Y
let @odsavani= @odsavani_X or @odsavani_Y


BinOut @proudeni_1, 0x0000, #DO00_0
BinOut @odsavani, 0x0000, #DO00_1
Jarda Valter
Uživatelský avatar
jarda
 
Příspěvky: 118
Registrován: sob 12. dub 2008 9:43:03
Bydliště: Jindřichův Hradec


Zpět na AMiTsys Junior

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků

cron