[VB] Rozdzielenie jednej zmiennej na trzy

Witam, działam w Visual Basic Express 2010 z komunikacją po UDP i nie moge rozwiązać nastepującego problemu.

Dostaje po komunikacji ciąg znaków który zapisuje do zmiennej np. x = 100;200;OK lub 3;4;OK itd. i teraz potrzebuje rozdzielić tą zmienną na trzy inne tzn. a=100, b=200, c=OK tzn. każde wyrażenie oddzielone “;” (lub jakimś innym znakiem) do innej zmiennej. Czy jest na to jakiś prosty sposób?

Chyba jesteś bardzo początkującym programistą bo nawet z zapisem zmiennej x jest coś nie tak. :slight_smile:

Zmienne powinno się raczej deklarować określając ich typ. np.

dim x as string             (zmienna tekstowa)

x=“100;200;OK”

aby ją rozdzielić tworzymy tablicę

Wcześniej deklarujemy tablicę :

dim tablica() as string

Przy pomocy funkcji Split rozdzielamy elementy zmiennej X i zapisujemy je w naszej tablicy

tablica=split(x,";")

Poszczególne elementy tej tablicy będą tymi rozdzielonymi elementami, czyli:

tablica(0) będzie oznaczała zmienną “100”

tablica(1) będzie oznaczała zmienną “200”

tablica(2) będzie oznaczała zmienną “OK”

Jeżeli nie znamy liczby elementów tablicy, to do jej określenia można użyć funkcji Ubound

LiczbaElementow=ubound(tablica)

w tym przypadku liczbaElementow=2 (licząc od zera)

Zmienna LiczbaElementow też powinna być wcześniej zadeklarowania np.

dim LiczbaElementow as long

Jeżeli znamy liczbę elementów tablicy to można w pętli for coś tam z tymi elementami tablicy robić dalej np. wypisywać, tworzyć nowe zmienne itd

For i=0 to LiczbaElmentow

next i

albo po prostu tak jakTy chcialeś;

a=tablica(0)

b=tablica(1)

c=tablica(2)

Po zadeklarowaniu wcześniej zmiennych,a,b,c jako zmienne tekstowe

Jeżeli chcemy aby zmienna była liczbą, to do takiej zamiany używamy funkcji val

liczba1=val(tablica(0) itd.

Jeśli to visual basic .net to klasa string ma metodę split. http://msdn.microsoft.com/en-us/library/6x627e5f(v=vs.90).aspx

A później poszczególne elementy z tablicy, która jest wynikiem działania Split, przypisać do zmiennych.

Dziękuje za pomoc o to mi chodziło :slight_smile:

żeby nie zakładać nowego tematu zadam tutaj jeszcze jedno pytanie:

 

posiadam podłączony do komputera przez usb sterownik z wjściami oraz wyjściami i obsługuje go z poziomu VB za pomocą ActiveX tzn. odpytuje o stan wejść, wystawiam wyjścia itd. I tutaj pytanie czy jest w VB jakaś możliwość ciągłego “monitorowania” tych wejść? Do tej pory używałem do tego celu timera który co określony czas odpytywał dane wejście.

Nie wiem co Ty rozumiesz przez ciągły monitoring.

Dla mnie każde działanie cykliczne odbywa się co pewien określony czas, krótszy lub dłuższy w zależności od potrzeb.

Jeżeli wykorzystujesz kontrolkę timer, to standardowo umieszczona w niej procedura jest wywoływana co 1 sek czyli zmienna interval=1000 (czas mierzony w milisekundach). Nic nie stoi na przeszkodzie aby ustawić wartość tej zmiennej na: interval=100 i wówczas procedura będzie wywoływana co 0,1 sek, a gdy ustawimy interval=10, to co 0,01 sek.

Jak dla mnie jest to wystarczająco krótki czas aby w większości zastosowań mówić o ciągłym monitoringu.

 

Może źle to napisałem. W tym momencie robie to tak jak napisąłeś za pomocą kontorlki timer z interval=100. Pytałem o to czy nie ma w VB gotowej funkcji do “odpytywania” tych wejść żeby nie robić tego za pomocą timera.

Nawet gdyby była taka kontrolka, to działała by na tej samej zasadzie, tylko wszystko było by bardziej ukryte.

Ok, masz racje.

 

Jeszcze jedno pytanie w jaki sposób mogę zrealizować żeby program czekał z wykonaniem kolejnych insturkcji aż pojawi się sygnał na wejściu?

W timerze odpytuje co 0,1s to wejście:

 

 in1 = abb.get_InX(4)

 

i niezależnie od tego wykonuje się kod proagramu, próbowałem robić to w ten sposób:

 

      in1t.Text = “start”

Jak dla mnie, to gdy kod wejdzie w pętlę, to z niej nie wyjdzie, no chyba że z innego miejsca i w innym wątku zmieni się in1

 

takie pytania:

  1. Co to za ActiveX, napisz dokładnie, może ma eventy, którymi się załatwi logikę odbierania danych.
  2. Czy sterownik komunikuje się natywnie przez usb, czy emuluje port com? Jeśli emulje, to w .NET masz klasę SerialPort http://msdn.microsoft.com/pl-pl/library/system.io.ports.serialport(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1

Taka pętla będzie działać bez końca. :frowning:

Jeśli już chcesz korzystać z takiej pętli to musiało by być coś w tym stylu:

Do While (in1 = False)

n1 = abb.get_InX(4)

Loop

i gdy n1 przyjmie wartość true, to pętla będzie opuszczona.

ale jeśli odczytujemy wartość n1 w pętli to dzialanie timer jest w tym przypadku zbyteczne, czyli ustawiamy

timer.enabled=false ’ i co najwyżej po wyjściu z pętli uruchamiamy ponownie zegar o ile to potrzebne.

n1 = abb.get_InX(4)

Do While (in1 = False)

n1 = abb.get_InX(4)

loop

timer.enabled=true

===============

Można też nie używać żadnej pętli, a tylko użyć instrukcji if przy jednocześnie włączonym timer czyli timer.enabled=true

n1 = abb.get_InX(4)

if n1=true then

else

endif