purebasic.info

PureBasic forum
Текущее время: Вс авг 19, 2018 11:30 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Вложенные структуры
СообщениеДобавлено: Пт авг 03, 2018 5:11 am 
Не в сети
студент
Аватар пользователя

Зарегистрирован: Пт авг 03, 2018 4:58 am
Сообщений: 2
Откуда: Россия, Серпухов
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Извините, будет "многабукаф".
Есть API для управления измерительным прибором: набор из dll, lib и h-файлов этого api
Для управления необходимо сформировать некую структуру в памяти управляющего компьютера, описанную на языке C:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
//**** конфигурация
#pragma pack(1)                    //
typedef struct{                    //
        //**** настройки интерфейса.
        //**** примечание : не следует изменять данные настройки при открытом интерфейсе.
        BYTE   Port;               // номер COM порта для интерфейса RS232 или RS485
        HANDLE Handle;             // указатель на открытый интерфейс
        DWORD  ReqTotal;           // общее число переданных через интерфейс запросов
        DWORD  ReqBad;             // число запросов на которые не пришло подтвержнения
        //                         //
    DWORD  ReqBadU;                //
    DWORD  ReqBadI;                //
    DWORD  ReqBadE;                //
        //**** конфигурация модуля //
        //**** примечание : после изменения конфигурации следует вызывать функцию
        //**** TE01SetConfig()  чтобы внесенные изменения возимели действие.
    WORD   state;                  // состояния модуля
        //**** RAM                 //
        WORD   ram_size;           //02//*<15..0> размер буфера сигнала
        WORD   ram_step;           //04//*<14..0> шаг приращения адресного счетчика
        BYTE   ram_freq;           //06//*<2..0>  частота синхронизации цап (0..4)
                                   //  0 -  20 МГц
                                   //  1 -   2 МГц
                                   //  2 - 200 кГц
                                   //  3 -  20 кГц
                                   //  4 -   2 кГц
        //**** F DAC               //
        BYTE   fdac_range;         //07//*<3..0>  диапазон уровней цап
                                   //  0 - +/- 10000 мВ
                                   //  1 - +/-  5000 мВ
                                   //  2 - +/-  2000 мВ
                                   //  3 - +/-  1000 мВ
                                   //  4 - +/-   500 мВ
                                   //  5 - +/-   250 мВ
                                   //  6 - +/-   200 мВ
                                   //  7 - +/-   100 мВ
                                   //  8 -                 0 мВ
        BYTE   fdac_filter;        //08//*<1..0>  полоса пропускания фильтра нч
                                   //  0 -  широкополосный режим
                                   //  1 -   20 кГц
                                   //  2 -    5 кГц
                                   //  3 -  400  Гц
        WORD   fdac_min;           //09//*<15..0> амплитуда сигнала цап
        WORD   fdac_max;           //11//*<15..0> амплитуда сигнала цап
        //**** S DAC               //
        BYTE   sdac_range;         //13//*<1..0>  диапазон уровней цап
                                   //  0 - +/- 10000 мВ
                                   //  1 - +/-  4096 мВ
                                   //  2 - +/-   250 мВ
                                   //  3 -             0 мВ
        WORD   sdac_value;         //14//*<13..0> код выводимый на цап
        //**** U ADC               //
        BYTE   uadc_range;         //16//*<2..0>  диапазон ацп
                                   // 0 - +/- 12200.00  (12200.00  ) мВ
                                   // 1 - +/-  6100.00  ( 6100.00  ) мВ
                                   // 2 - +/-   250.00  (  625.00  ) мВ
                                   // 3 - +/-    62.50  (  156.25  ) мВ
                                   // 4 - +/-    15.6250(   39.0625) мВ
        WORD   uadc_filter;        //17//*<11..0> параметр фильтра    [19..4000]
        BYTE   uadc_switch;        //19//*<3..0>  режим входной коммутации
                                   //  0 - клеммы +U & -U на корпусе ТЕ-01 (1:1)
                                   //  1 - клеммы +U & -U на корпусе ТЕ-01 (1:10)
                                   //  2 - выход быстрого цап
                                   //  3 - выход +Us медленного цап
                                   //  4 - выход -Us медленного цап
                                   //  5 - шунт I-модуля ( 392 Ohm)
                                   //  6 - шунт I-модуля (   2 Ohm)
                                   //  7 - шунт I-модуля (49.8 Ohm)
                                   //  8 - шунт I-модуля (   0 Ohm)
                                   //  9 - сменный модуль
                                   // 10 - калибровка нуля     (диапазон 1..5)
                                   // 11 - калибровка масштаба (диапазон 1)
                                   // 12 - ноль (BUF=0)
                                   // 13 - ноль (BUF=1)
        //**** I ADC               //
        BYTE   iadc_range;         //20//*<2..0>  диапазон/режим ацп
                                   //  0 - +/- 0.312 mA
                                   //  1 - +/- 0.625 mA
                                   //  2 - +/- 1.25  mA
                                   //  3 - +/- 2.5   mA
                                   //  4 - +/- 5     mA
                                   //  5 - +/- 10    mA
                                   //  6 - +/- 20    mA
                                   //  7 - +/- 500   mA
        WORD   iadc_filter;        //21//*<11..0> параметр фильтра    [19..4000]
        BYTE   iadc_switch;        //23//*<1..0>  режим входной коммутации
                                   //  0 - токовая цепь разомкнута
                                   //  1 - сменный модуль
                                   //  2 - клеммы I+ & I- на корпусе ТЕ-01
                                   //  3 - выход медленного цап
        //**** идентификаторы сменного модуля
        BYTE   mid;                        //24//  (RO)
        BYTE   bid;                        //25//  (RO)
        //**** регистры сменного модуля    //
        BYTE   aregs[15];                  //  (RW)
        //**** последние считанные данные  //
        DWORD  ucounter;                   //
        DWORD  uvalue;                     //
        DWORD  icounter;                   //
        DWORD  ivalue;                     //
        //**** флаги использования коррекции
        WORD   cflags;                     //
        //**** калибровочные коэффициенты  //
        //                                 //
        double Kd;                         // коэф. деления внешнего делителя
        double Ku[5];                      // масштабные коэф. для вольтметра, по диапазонам
        double Bu[5];                      // коэф. смещение нуля для вольтметра, по диапазонам
        //                                 //
        double Ki[8];                      // масштабные коэф. для амперметра, по диапазонам
        double Bi[8];                      // коэф. смещение нуля для амперметра, по диапазонам
        //                                 //
        double Ks1[4];                     // масштабные коэф. для выхода U+ медленного цап, по диапазонам
        double Bs1[4];                     // коэф. смещение нуля для выхода U+ медленного цап, по диапазонам
        //                                 //
        double Ks2[4];                     // масштабные коэф. для выхода U- медленного цап, по диапазонам
        double Bs2[4];                     // коэф. смещение нуля для выхода U- медленного цап, по диапазонам
        //                                 //
        double Kf1[9];                     // масштабные коэф. для широкополосного режима быстрого цап, по диапазонам
        double Bf1[9];                     // коэф. смещение нуля для широкополосного режима быстрого цап, по диапазонам
        //                                 //
        double Kf2[9];                     // масштабные коэф. для режимов с нч фильтром быстрого цап, по диапазонам
        double Bf2[9];                     // коэф. смещение нуля для режимов с нч фильтром быстрого цап, по диапазонам
        //**** содержимое EEPROM модуля
        //**** примечание : после изменений даного поля следует вызывать функции
        //**** TE01WriteEnableEEPROM() и TE01WriteEEPROM() чтобы внесенные изменения
        //**** возимели действие.          //
        struct {                           //
                //*** системная область.   //
                BYTE  sn[6];               // серийный номер модуля
                BYTE  name[10];            // название изделия
                BYTE  revision;            // ревизия   изделия
                BYTE  cpu_type[10];        // тип установленного CPU/DSP
                DWORD qfrequency;          // частота системного кварца в Гц
                BYTE  crc_0;               // котрольная сумма
                BYTE  free[95];            // свободно
                BYTE  crc_f;               // контрольная сумма
        } mmodule_eeprom;                  //
        //                                 //
        struct {                           //
                BYTE  sn[6];               // серийный номер модуля
                BYTE  name[10];            // название изделия
                BYTE  revision;            // ревизия   изделия
                BYTE  cpu_type[10];        // тип установленного CPU/DSP
                DWORD qfrequency;          // частота системного кварца в Гц
                BYTE  crc_0;               // котрольная сумма
                double uref;               // опорное напряжения ацп вольтметра (мВ)
                BYTE  crc_1;               //
                BYTE  free[86];            //
                BYTE  crc_f;               // контрольная сумма
        } umodule_eeprom;                  //
        //                                 //
        struct {                           //
                BYTE  sn[6];               // серийный номер модуля
                BYTE  name[10];            // название изделия
                BYTE  revision;            // ревизия   изделия
                BYTE  cpu_type[10];        // тип установленного CPU/DSP
                DWORD qfrequency;          // частота системного кварца в Гц
                BYTE  crc_0;               // котрольная сумма
                BYTE  free[95];            //
                BYTE  crc_f;               //
        } imodule_eeprom;                  //
        //                                 //
        struct {                           //
                BYTE  sn[6];               // серийный номер модуля
                BYTE  name[10];            // название изделия
                BYTE  revision;            // ревизия   изделия
                BYTE  cpu_type[10];        // тип установленного CPU/DSP
                DWORD qfrequency;          // частота системного кварца в Гц
                BYTE  crc_0;               // котрольная сумма
                BYTE  mid;                 // MID
                BYTE  crc_1;               // котрольная сумма
                BYTE  comment[477];        // коментарий
                BYTE  crc_f;               // котрольная сумма
        } amodule_eeprom;                  //
} TE01, *PTE01;


Как можно описать эту структуру на PureBasic, чтобы передать указатель на неё функциям API?
Столкнулся с тем что в структуре присутствуют вложенные структуры mmodule_eeprom, umodule_eeprom, imodule_eeprom, amodule_eeprom, которые непонятно как описывать на PureBasic.
Заодно подскажите, как осуществить подключение библиотек API к программе, вроде бы разобрался, что это надо делать через Import:EndImport, но есть ощущение что я делаю что-то не так.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Вложенные структуры
СообщениеДобавлено: Пт авг 03, 2018 6:05 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 238
Благодарил (а): 32 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Примерно как-то так:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Structure Name1
  var1.b      ;byte  var1
  var2.w      ;word var2
  var3.l      ;dword var3
  var4.b[10]  ;byte[10] var4
EndStructure
 
Structure Name2
  var1.d      ;double var1
  var2.Name1  ;struture_Name1 var2
EndStructure
 
Define StrucVar.Name2 ;создаем структурную переменную
 
StrucVar\var1 = 0      ;доступ к корневым переменным
StrucVar\var2\var1 = 0 ;доступ к подструктурным переменным


Матосов Сергей писал(а):
Заодно подскажите, как осуществить подключение библиотек API к программе, вроде бы разобрался, что это надо делать через Import:EndImport, но есть ощущение что я делаю что-то не так.
Иногда нужен "ImportC" (зависит от либы)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Вложенные структуры
СообщениеДобавлено: Пт авг 03, 2018 3:23 pm 
Не в сети
студент
Аватар пользователя

Зарегистрирован: Пт авг 03, 2018 4:58 am
Сообщений: 2
Откуда: Россия, Серпухов
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ещё есть одна каверза - выравнивание полей


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Вложенные структуры
СообщениеДобавлено: Пт авг 03, 2018 3:35 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 238
Благодарил (а): 32 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
Код:
1
2
Structure <name> [Extends <name>] [Align <numeric constant expression>]
 

Вы почитайте справку уже, не стесняйтесь.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Вложенные структуры
СообщениеДобавлено: Пт авг 03, 2018 3:47 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11228
Благодарил (а): 4 раз.
Поблагодарили: 425 раз.
Матосов Сергей писал(а):
Ещё есть одна каверза - выравнивание полей
Матосов Сергей писал(а):
Код:
1
#pragma pack(1)

Выравнивание не требуется.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB