call library function + zlozone typy danych

Jeśli masz coś do powiedzenia w sprawie LabVIEW napisz. Tutaj są tematy, których nie można uściślić do innych działów.
robertk1
Posty: 7
Rejestracja: 27 lis 2012 21:25
Wersja środowiska: LabVIEW 2012

call library function + zlozone typy danych

Post autor: robertk1 »

witam,
mam problem z skonfigurowaniem parametrów funkcji call library,
mam funkcje w bibliotece której definicja w C wyglada następująco

Kod: Zaznacz cały

FUNCTION extern PB_BOOL CALL_CONV pbt_get_dp_def_bus_param
    (
    IN  USIGN8                 BaudRate,
    IN  USIGN8                 StationAddr,
    IN  USIGN16                Mode,
    OUT T_DP_BUS_PARA_SET FAR* pBusParameters
    )
nie moge dojsc co ustawić w LabView w zzakładce Parameters jako Type dla tej zmiennej: T_DP_BUS_PARA_SET FAR* pBusParameters

T_DP_BUS_PARA_SET to struktura o następującej składni

Kod: Zaznacz cały

typedef struct _T_DP_BUS_PARA_SET
{
   USIGN16     bus_para_len;                                  /* 66..2^16-1 */
   USIGN8      fdl_add;                                           /* 0..125 */
   USIGN8      baud_rate;                                   /* DP_xBAUD_xxx */
   USIGN16     tsl;                          /* see DIN 19245-1 for details */
   USIGN16     min_tsdr;
   USIGN16     max_tsdr;
   USIGN8      tqui;
   USIGN8      tset;
   USIGN32     ttr;
   USIGN8      g;
   USIGN8      hsa;
   USIGN8      max_retry_limit;
   USIGN8      bp_flag;                               /* DP_BP_ERROR_ACTION */
   USIGN16     min_slave_interval;                /* 1..2^16-1 [100 micros] */
   USIGN16     poll_timeout;                            /* 1..2^16-1 [1 ms] */
   USIGN16     data_control_time;                      /* 1..2^16-1 [10 ms] */
   OCTET       reserved [6];
   USIGN16     master_user_data_len;                         /* 34..2^16-33 */
   STRINGV     master_class2_name [32];  /* DP Master (class 2) vendor name */

/* OCTET       master_user_data [DP_MASTER_USER_DATA_LEN - 34];             */

} T_DP_BUS_PARA_SET;


czy dobrze myśle robiąc cluster do którego wrzuce 19 indicatorów z zmiennymi z tej struktury
a w call library function ustawie jako type "Adapt to Type" a w Data format: "Handles by Value"
i ten cluster podpinam przewodem do wyjscia?
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: call library function + zlozone typy danych

Post autor: vugie »

Tak, z tym że:
- reserved musi być podklastrem o takiej wielkości w bajtach jak sizeof(OCTET)*6
- master_class2_name - podobnie. Na pewno nie wsadzaj tam stringa. Jeżeli STRINGV to po prostu char, to najlepiej będzie użyć podklastra 32-óch uint8-ów, który później będziesz mógł dwoma ruchami zamienić na labviowego stringa.
robertk1
Posty: 7
Rejestracja: 27 lis 2012 21:25
Wersja środowiska: LabVIEW 2012

call library function + zlozone typy danych

Post autor: robertk1 »

w jednym z plików nagłówkowych biblioteki znalazłem że OCTET jest typem pochodnym od zmiennej char a dokładnie jest tam coś takiego

Kod: Zaznacz cały

typedef     unsigned char        OCTET;
czy zdefiniować to jako pojedynczy usign8?
tak samo STRINGV to pochodna typu char

Kod: Zaznacz cały

typedef     char                 STRINGV;
wiec w tym przypadku zrobic podcluster z 32 indicatorami usign8?


i jak odnieść się do tego ze do zmiennej pBusParameters zwracany jest wskaźnik, a nie wartości zmiennych do struktury


edit:
udało się w przypadku master_class2_name ładnie zwraca napis
zrobiłem cluster>cluster to array>byte array to string i mam czytelny napis

w przypadku reserved zrobiłem cluster z 6 uint8
po wykonaniu programu zwraca 6 razy wartość 32, nie wiem w sumie jaka powinna być wartość zwrócona ale wydaje mi się że cos jest nie tak, jakies pomysły?
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

Re: call library function + zlozone typy danych

Post autor: vugie »

robertk1 pisze:w jednym z plików nagłówkowych biblioteki znalazłem że OCTET jest typem pochodnym od zmiennej char a dokładnie jest tam coś takiego

Kod: Zaznacz cały

typedef     unsigned char        OCTET;
czy zdefiniować to jako pojedynczy usign8?
Jako klaster 6 uint8 - tak jak zrobiłeś. Albo jako 3 int16. Albo jako jeden uint32 i jeden int16. Cokolwiek co zajmie 6 bajtów pamięci.
i jak odnieść się do tego ze do zmiennej pBusParameters zwracany jest wskaźnik, a nie wartości zmiennych do struktury
Handle by Value znaczy tyle, że LV podstawia do funkcji wskaźnik klastra, który podpinasz do wejścia Adapt to Type. Funkcja ten klaster (a właściwie blok pamięci) wypełnia w dobrej wierze nie sprawdzając żadnych typów. Wystarczy zatem że wielkość tego bloku jest większa lub równa wielkości struktury, której funkcja się spodziewa. Ale dla wygody definiujemy klastry odpowiadające strukturze bajt do bajtu. Stringów i tablic o stałej wielkości nie możemy wrzucać, bo ich struktura w pamięci wygląda inaczej niż w C, dlatego ratujemy się podklastrami.
w przypadku reserved zrobiłem cluster z 6 uint8
po wykonaniu programu zwraca 6 razy wartość 32, nie wiem w sumie jaka powinna być wartość zwrócona ale wydaje mi się że cos jest nie tak, jakies pomysły?
reserved to reserved, żadnej wartościowej informacji raczej tam nie ma.
robertk1
Posty: 7
Rejestracja: 27 lis 2012 21:25
Wersja środowiska: LabVIEW 2012

call library function + zlozone typy danych

Post autor: robertk1 »

a czy zamiast podclustra z wstawionymi numericami można zrobic tam tablice z numericami o odpowiedniej reprezentacji?
czy to na jedno wychodzi?
vugie
Posty: 383
Rejestracja: 17 lis 2006 00:00
Wersja środowiska: LabVIEW 2009
Lokalizacja: Warszawa

call library function + zlozone typy danych

Post autor: vugie »

Nie. W LV nie ma czegoś takiego jak tablica o stałej wielkości, a reprezentacja zwykłej tablicy w pamięci wygląda tak, że najpierw jest I32 przechowujące jej rozmiar.
ODPOWIEDZ