Strona 1 z 1

call library function + zlozone typy danych

: 28 lis 2012 10:41
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?

Re: call library function + zlozone typy danych

: 28 lis 2012 13:02
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.

call library function + zlozone typy danych

: 28 lis 2012 15:02
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?

Re: call library function + zlozone typy danych

: 29 lis 2012 09:57
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.

call library function + zlozone typy danych

: 04 gru 2012 21:15
autor: robertk1
a czy zamiast podclustra z wstawionymi numericami można zrobic tam tablice z numericami o odpowiedniej reprezentacji?
czy to na jedno wychodzi?

call library function + zlozone typy danych

: 05 gru 2012 11:33
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.