Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 26 odgovora
  • 7.707 pregleda

Najnovija ↓

Releji i visual basic 07.04.2008. u 23:35 · pre 226 meseci #1
Imam uređaj koji se spaja na com port, dakle, relej sa 8 'dioda' - kad je recimo 1. upaljen, onda 1. svijetli i tako redom do 8 :)

Ne mogu preko visual basica zadati naredbu da ukljuci 2 te žaruljice odjednom, već samo jednu.
A to ide preko neke varijable recimo:

a$ = chr(3) + chr(0) + chr(0) + chr(3) ---> to je recimo da se upali 1. dioda

b$ = chr(3) + chr(1) + chr(0) + chr(6) ---> to je recimo da se upali 2. dioda

- onda ovu varijablu (recimo a$) saljem na mscomm. komponentu (koja se povezuje preko com porta na uređaj) i upali se 1. dioda

Ali ne mogu istovremeno upalit obadvije! Ako pošaljem ove dvije varijable, pročita prvih 4 znakova i opet zasvijetli prva i dalje ništa.
Kako to riješiti?
Re: Releji i visual basic 08.04.2008. u 00:54 · pre 226 meseci #2
Na 3, 0, 0, 3 se pali prva, a na 3, 1, 0, 6 druga...

Imas li semu tog uredjaja, ili bar neko uputstvo?

Moras znati zasto se za paljenje jedne diode salje 4 bajta.

Jer da je tako jednostavno slao bi se samo jedan bajt i sa njim bi se pokrile sve kombinacije. Za svaki bit po jedna dioda, ukupno 256 kombinacija.

Moja predpostavka je da je 3 - signal za inicijalizaciju ili promenu stanja, jer se javlja u oba primera.

Sad samo jos da se provali za sta sluze ostala 3 bajta.

Mogao bi da nam postavis i kombinacije za ostale diode, mozda se nesto da i zakljuciti iz toga.
Re: Releji i visual basic 08.04.2008. u 08:28 · pre 226 meseci #3
Da dobro bi bilo da posaljes i ostale kombinacije. Moguce je recimo da se sa trecim bajtom koji je 0 gase ostale diode pa zato ne mozes upaliti dve od jednom.
Probavaj razne kombinacije i prati.
Potpis
SELECT * FROM หน่วยงานหลัก WHERE ยสันติ LIKE 'โดย%'
Re: Releji i visual basic 08.04.2008. u 09:16 · pre 226 meseci
izmenjeno 1 put, poslednji put Aleksandar Ružičić 08.04.2008. u 16:27
  1. Aleksandar Ružičić08.04.2008. u 16:27zapis iz teksta poruke
#4
Evo ovako, jucer sam napisao one chr$ za primjer, a evo i tocnih:
Code:

If led = "0" Then send$ = Chr$(3) + Chr$(0) + Chr$(0) + Chr$(3): GoTo prikaz
If led = "1" Then send$ = Chr$(3) + Chr$(1) + Chr$(1) + Chr$(3): GoTo prikaz
If led = "2" Then send$ = Chr$(3) + Chr$(1) + Chr$(2) + Chr$(0): GoTo prikaz
If led = "3" Then send$ = Chr$(3) + Chr$(1) + Chr$(4) + Chr$(6): GoTo prikaz
If led = "4" Then send$ = Chr$(3) + Chr$(1) + Chr$(8) + Chr$(10): GoTo prikaz
If led = "5" Then send$ = Chr$(3) + Chr$(1) + Chr$(16) + Chr$(18): GoTo prikaz
If led = "6" Then send$ = Chr$(3) + Chr$(1) + Chr$(32) + Chr$(34): GoTo prikaz
If led = "7" Then send$ = Chr$(3) + Chr$(1) + Chr$(64) + Chr$(66): GoTo prikaz
If led = "8" Then send$ = Chr$(3) + Chr$(1) + Chr$(128) + Chr$(130): GoTo prikaz
prikaz:
MSComm1.Output = send$


Znači, ukoliko je led = "0" onda su sve diode ugašene. Ako je 1 onda je 1. dioda upaljena i tako do 8.
Ja trebam dobit da se dvije zajedno upale (kao što sam i prije napomenuo).

U uputstvima (koje sada ne mogu naci) je ispisan ovaj program dolje i koliko znam, nista konkretno ne pise.

A ovo je program koji sam dobio sa uređajem, preko njega sam i dosao do tih chr$. Uglavnom, cini mi se da ovaj program u jednom slucaju upali nekoliko lampica zajedno (ne mogu ovo sa sigurnoscu reci jer ne mogu isprobati program - kao da je kompjuteru prebrz :) isprobao sam ga pred par godina na drugom kompjuteru):
Code:


CLS: CLEAR
DIM inbuf(800)
DIM outbuf(8)
OPEN "com2:19200,n,8,1,bin,cs,ds" FOR RANDOM AS #1

'----- INTERRUPT SERIAL INTERFACE ON -----
COM(2) ON
ON ERROR GOTO BADCOM
ON COM(2) GOSUB GETFRAME

'----- INITIALIZE RELAIS BOARD -----
PRINT "INITIALIZE BOARD"
outbuf(0) = 1: outbuf(1) = 1: outbuf(2) = 0: GOSUB sendframe
FOR delay = 1 TO 1000000: NEXT: CLS

'----- SWITCH RELAIS -----
teststart:
r = 1
rt:
outbuf(0) = 3: outbuf(1) = 1: outbuf(2) = r: GOSUB sendframe
FOR delay = 1 TO 1000000: NEXT: CLS
r = r * 2: IF r < 256 THEN GOTO rt
GOTO teststart

'||||| SERIAL COMMUNICATION |||||
'---------------------------------
'----- READ 4 BYTE DATAFRAME -----
'---------------------------------
GETFRAME:
inbuf(bz) = ASC(INPUT$(1,#1))
bz = bz + 1
IF bz = 4 THEN GOTO checkframe
RETURN
'----- CHECK VALIDITY -----
checkframe:
ERROR$ = "ERROR"
IF inbuf(0) XOR inbuf(1) XOR inbuf(2) = inbuf(3) THEN
ERROR$ = "OK"
bz = 0: PRINT "RECEIVED:"; "  "; inbuf(0); "  "; inbuf(1); "  "; inbuf(2); "  "; inbuf(3); "  "; ERROR$
PRINT "-----------------------------------------------------------------": RETURN
END IF
'---------------------------------
'----- SEND 4 BYTE DATAFRAME -----
'---------------------------------
sendframe:
outbuf(3) = outbuf(0) XOR outbuf(1) XOR outbuf(2)
send$ = CHR$(outbuf(0)) + CHR$(outbuf(1)) + CHR$(outbuf(2)) + CHR$(outbuf(3))
PRINT #1, send$
PRINT "TRANSMITTED: "; "  "; outbuf(0); "  "; outbuf(1); "  "; outbuf(2); "  "; outbuf(3)
RETURN

'***** ERROR HANDLER *****
BADCOM:
PRINT "----- DATA ERROR -----"
RESUME
RETURN

ende:
END



I još nešto:
Code:

send$ = Chr$(3) + Chr$(1) + Chr$(1) + Chr$(3) -----> pali 1. diodu
send1$ = Chr$(3) + Chr$(1) + Chr$(128) + Chr$(130) -----> pali 8. diodu
MSComm1.Output = send$
MSComm1.Output = send1$



- ovaj kod bi trebao upaliti prvu diodu i osmu diodu, međutim, upali samo 1. diodu... ali pokušao sam stavit jednostavnu petlju kojom mu napravim neki delay, recimo ovako:
Code:

send$ = Chr$(3) + Chr$(1) + Chr$(1) + Chr$(3)
MSComm1.Output = send$

For i = 1 To 100000000
Next i

send1$ = Chr$(3) + Chr$(1) + Chr$(128) + Chr$(130)
MSComm1.Output = send1$

- onda pali 1. diodu, ceka cirka 2 sekunde i upali 8. diodu (ali 1. diodu ugasi)

Došao sam do zaključka da on sa jednim chr$ gasi sve ostale diode (što ste i vi pretpostavili), tj. barem se nadam da je tako, sada još treba otkriti koji je to chr$, jer sam vec sve probao izmjeniti i ne mogu to dobiti. Hvala!



Skuzio sam nest, hmm...

Code:

send$ = Chr$(3) + Chr$(1)
MSComm1.Output = send$


Kada ucitam ovu funkciju dva puta, onda pali prve dvije diode. A dalje sad ne znam :)

A mogu i zadat ovako:
Code:

send$ = Chr$(3) + Chr$(1) + Chr$(3) + Chr$(1)

---------> moze biti i send$ = Chr$(3) + Chr$(0) + Chr$(3) + Chr$(0)


Onda pali prve dvije odmah :) Trazim dalje... ako tko ima prijedlog, neka napise!
Re: Releji i visual basic 08.04.2008. u 12:11 · pre 226 meseci
izmenjeno 1 put, poslednji put Aleksandar Ružičić 08.04.2008. u 16:28
  1. Aleksandar Ružičić08.04.2008. u 16:28zapis iz teksta poruke
#5
Probaj ovako:
Code:

send$ = "0"
MSComm1.Output = send$

sta si sad dobio?
Re: Releji i visual basic 08.04.2008. u 12:15 · pre 226 meseci #6
Na ovo ne trza uopce, ne pali ni jednu! A niti ne gasi nista.
Re: Releji i visual basic 08.04.2008. u 12:37 · pre 226 meseci #8
Com2, napisao sam vec gore da relej ima 8 diodica. Ja trebam dobit da se 2 istovremeno upale, ali one koje ja zadam (recimo 1. i 4., pa 5. i 8.).

Sa programom koji sam dobio sa uređajem mogu palit sve diodice, i odjednom vise njih (to nije program koji sam gore naveo, vec neki njihov .exe s kojim mozes jednostavno slozit skriptu kak ce se palit sta, ali meni bas treba u visual basicu jer imam neke dodatne funkcije).
Re: Releji i visual basic 08.04.2008. u 13:33 · pre 226 meseci
izmenjeno 1 put, poslednji put Kiter 08.04.2008. u 13:44
  1. Kiter08.04.2008. u 13:44zapis iz teksta poruke
#10
Da li mi mozes malo konkretnije objasniti kako se s ovim radi? Ne kuzim bas :) Hvala! Sada isprobavam...

Nasao sam adresu com2 porta (valjda) i upisao i ispise mi 255. Hm:) Sto sad dalje?
Re: Releji i visual basic 08.04.2008. u 14:42 · pre 226 meseci #11
Ako je 255, onda ti on vraca da su sve upaljene ali vjerovatno to nije tako.....

Standardna adresa tvog COM1 porta 3F8

- udji u BIOS i pogledaj konfiguraciju portova, i tamo ces naci na koji IRQ i Adresu ti je dodjeljen COM2, ako taj koristis.

onda upisi tu adresu (bez &H) u textbox1 i pritisni "IN" i dobices status. Tako ces skontati koji ti broj odgovara izlazu/ulazu na COM portu,
Re: Releji i visual basic 08.04.2008. u 15:31 · pre 226 meseci #12
Hm, u biosu sam samo nasao 2F8/IRQ3 --> za com2 port. I sad upisem taj 2F8 i pritisnem IN i dobijem '255'. A gdje si uzeo da bi uopce morao biti taj &H, tj. da upisem bez toga, jer ja nisam uopce niti naisao na to.
Re: Releji i visual basic 08.04.2008. u 15:42 · pre 226 meseci #13
Da, bez toga upisi, zavisno od ploce, jer se inace adresa tako pise ...... upisi samo "2F8". Skini te ledove sa Com porta, pa pokusaj ponovo, morao bi ti dati vrijednost 0
Re: Releji i visual basic 08.04.2008. u 16:17 · pre 226 meseci #14
0 = 3, 0, 0, 3
1 = 3, 1, 1, 3
2 = 3, 1, 2, 0
3 = 3, 1, 4, 6
4 = 3, 1, 8, 10
5 = 3, 1, 16, 18
6 = 3, 1, 32, 34
7 = 3, 1, 64, 66
8 = 3, 1, 128, 130

Moja predpostavka je da je brvi bajt za promenu stanja, drugi za broj sijalica, treci pokazuje na sijalice, ali cetvrti mi i nije bas najjasniji za sta sluzi, ali je u vecini slucajeva to 3 bajt uvecan za 2.

Jedna od navedenih kombinacija bi trebala da upali prvu i osmu sijalicu:

3, 2, 129, 131

3, 1, 129, 131

Code:

128  64  32  16  8   4   2   1
 o   o   o   o   o   o   o   o

128  64  32  16  8   4   2   1
 x   o   o   o   o   o   o   x = 129

128  64  32  16  8   4   2   1
 x   x   x   x   x   x   x   x = 255


Treci bajt racunas tako sto sabiras vrednosti iznad sijalica koje zelis da upalis!

S tim da je vrednost 1 verovatno iznad prve sijalice s' desne strane, u suprotnom ti vrednosti idu od 1 do 128 umesto od 128 do 1.

Mislim da nema potrebe za citanje com porta, sve komande tom uredjaju mozes poslati i preko MSCOMM, koji je i mnogo jednostavniji za koriscenje od API f-ja.
Re: Releji i visual basic 09.04.2008. u 12:04 · pre 226 meseci #15
3, 1, 129, 131

Pali 1. i 8. diodu.

Veliko hvala!!
Sad moram racunat, ak mi nesto ne bude jasno se javim :)
Re: Releji i visual basic 09.04.2008. u 12:42 · pre 225 meseci
izmenjeno 2 puta, poslednji put Kiter 09.04.2008. u 13:17
  1. Kiter09.04.2008. u 13:17zapis iz teksta poruke
  2. Kiter09.04.2008. u 13:14zapis iz teksta poruke
#16
Ajd molim te, malo pojasni ovo racunanje, ne mogu sad izracunat recimo za 2. i 5. heh:))
Otkud 131 na kraju? Kuzim da je to treci bajt uvecan za 2, ali pogledaj:

3, 1, 130, 132
- ovo bi trebalo upaliti 2. i 8. diodu jel? Ali nista se ne desava. Hmm...

Ako zbrajam se desne strane, onda pali sve po redu, recimo:
3, 1, 240, 242
- pali 5,6,7,8 diodu

--------------------------------------------
Skuzio sam sad:
znaci
3, 1, 132, 134
- pali 3. i 8. diodu

3, 1, 130, 128 (jer je tamo kod 2. diode na kraju 2, 0 - pa sam ovaj 130 umanjio za 2 i radi)
- pali 2. i 8. diodu
Re: Releji i visual basic 09.04.2008. u 13:40 · pre 225 meseci #17
Nakon 'otkrića' kako se dvije diode pale istovremeno, naisao sam na novi problem:)

Imam datoteku sadrzaja:
01081214

Ovu datoteku ovako ucitavam u visual basic:
- prve dvije znamenke ucita u textbox1, znaci 01 (što predstavlja prvu diodu koja se mora upaliti)
- druge dvije znamenke ucita u textbox2, znaci 08 (što predstavlja drugu diodu koja se mora upaliti)
- sljedece dvije znamenke oznacavaju koliko sekundi mora biti upaljena prva dioda (ucitam u textbox3)
- i zadnje dvije znamenke oznacavaju koliko sekundi mora biti upaljena druga dioda (ucitam u textbox4)

Problem je, kako zadati sad funkciju da recimo, istovremeno se upale 1. i 8. dioda (u ovom slucaju), te da se nakon 12 sekundi ugasi prva dioda, a nakon 14 sekundi ugasi druga dioda bez prekidanja određene diode?




Re: Releji i visual basic 09.04.2008. u 15:34 · pre 225 meseci #18
3, 1, 129, 132

Pa posle 12 sekundi:

3, 1, 128, 130

a zatim za gasenje:

3, 0, 0, 3

Znaci nema gasenja, nego uvek postavljas novo stanje...
Re: Releji i visual basic 09.04.2008. u 21:17 · pre 225 meseci #19
Zaboravih da ti kazem da ako hoces da stopiras program na neko vreme nije pametno da stavis iteraciju koja ce ti napraviti zauzece procesora od 100% i biti zavisna od brzine masine na kojoj se izvrsava, vec probaj to da resis sa TIMER-om ili sa API f-jom Sleep ili SleepEx iz KERNEL32.DLL.

Znaci ne:
Code:

For i = 0 to 1000000
Next i


nego:
Code:

' U globalnim deklaracijama
Private Declare Function SleepEx Lib "kernel32" (ByVal dwMilliseconds As Long, ByVal bAlertable As Long) As Long
' i u programu
SleepEx 1000, False ' gde je 1000 = vreme za koje hoces da stopiras izvrsenje u milisekundama


Re: Releji i visual basic 10.04.2008. u 13:34 · pre 225 meseci #20
Ok, sve razumijem, i ubacio sam ovaj timer za pauzu i radi sve.

E sad jos samo moram to isprogramirat. Nemam bas ideje kako poceti, posto imam 4 textboxa (opisana u gornjem slucaju). Sada bih morao sa 'IF' naredbom ispitati sve moguce situacije ili postoji kakva bolja ideja? Jer ono if textbox1 = "01" and textbox2 = "02" then ukljuci_prvu_i_drugu_diodu mi se ne cini bas pametno:) a jos tu treba i sekunde ubaciti...
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme