Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


[LGraph2] Не работает плагин с минимальным кодом

Вы не вошли.

 Поиск | Регистрация | Вход 

Александр_int
12.05.2014 16:18:07
#1

Гость

[LGraph2] Не работает плагин с минимальным кодом

Задача написать минимальный плагин, в который выводятся пару значений на график в режиме получения данных с АЦП. Плагин подключается, но при запуске получения данных LGraph2 падает. В чем мой код неверен?

#include <windows.h>
#include <math.h>
#include <stdio.h>
#include "include\\plugin.h"


#define SPEKTR_SIZE 32768                   

HINSTANCE hInstance;


static struct PluginDataInfoStr DataInfo;	

double XData[20];
double YData[20];

                      
void __stdcall PluginDataExchange(struct PluginDataStr *data_str) 		    
{


   int i;
   for(i=0;i<20;i++){
        XData[i] = i + 2;
        YData[i] = i + 5;
   }
    
    int n = data_str->n;

	data_str->n_from_graph[0]  = n;
	data_str->x_data[0] = XData;
	data_str->data_from_graph[0]  = YData;
	data_str->control_index[0] = 0x0;			
	data_str->color[0] = VAL_RED;		
	data_str->line_type[0] = VAL_SOLID;	

}


void __stdcall PluginInfo(struct PluginInfoStr *p_info)
{
    
	strcpy(p_info->name, "SimplePlugin");  
	p_info->version	= 0x00010000;		
	p_info->lgraph_version = 0x222;			
	p_info->max_nch = p_info->min_nch = 0x2;	
	
	strcpy(p_info->channel_names[0], "chan X");

}


void __stdcall PluginDataInfo(struct PluginDataInfoStr *d_info)
{

    int chan1;

    if(!d_info->devices) { strcpy(d_info->error, ""); return; }
    if(!d_info->nch[0]) { strcpy(d_info->error, ""); return; }

    DataInfo=*d_info;                                   

    chan1=d_info->adc_channels[0];                    

    if(!d_info->chan_on[0][chan1]) { sprintf(d_info->error, "%u", chan1+1); return; } 

    d_info->input_kadrs_min=256;
    d_info->input_kadrs_max=SPEKTR_SIZE;


}



void __stdcall PluginVisualSetting(struct PluginVisualMainStr *main_visual_settings, struct PluginVisualStr p_visual[])
{

    int i, horizontal_step;
    int type_codes[]={L_VISUAL_GRAPH};

    main_visual_settings->n=1;                   
    main_visual_settings->plugin_height=450;                        

    p_visual[0].type=type_codes[0];    
    p_visual[0].width = main_visual_settings->width; 
    p_visual[0].height = 250; 
    p_visual[0].top = 30;   


    p_visual[0].x_axis_mode=1;  
    
    
}

void __stdcall PluginStartInput(struct PluginDataStr *data_str) {}
void __stdcall PluginStopInput(struct PluginDataStr *data_str) {}



BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    
    hInstance = hModule;
    
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:           
           }
    return TRUE;
}
13.05.2014 08:55:22
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: [LGraph2] Не работает плагин с минимальным кодом

У Вас ошибка с переменной n:

1. int n = data_str->n;
   В этом месте переменная n будет равна числу пришедших кадров от АЦП (например 10000).

2. Массивы XData, YData у Вас выделены на 20 точек.

3. data_str->n_from_graph[0]  = n;
   Здесь Вы сообщаете LGraph2, что Вы передаете n точек в массивах XData, YData. Т.е. если n = 10000, то LGraph2 попытается из массивов XData & YData извлечь по 10000 точек и уедет в чужую память с непредсказуемым результатом.


Если надо после обработки вывести именно 20 точек на графике, то надо сделать data_str->n_from_graph[0]  = 20;

Александр_int
13.05.2014 10:26:18
#3

Гость

Re: [LGraph2] Не работает плагин с минимальным кодом

Владислав пишет:

У Вас ошибка с переменной n:

1. int n = data_str->n;
   В этом месте переменная n будет равна числу пришедших кадров от АЦП (например 10000).

2. Массивы XData, YData у Вас выделены на 20 точек.

3. data_str->n_from_graph[0]  = n;
   Здесь Вы сообщаете LGraph2, что Вы передаете n точек в массивах XData, YData. Т.е. если n = 10000, то LGraph2 попытается из массивов XData & YData извлечь по 10000 точек и уедет в чужую память с непредсказуемым результатом.


Если надо после обработки вывести именно 20 точек на графике, то надо сделать data_str->n_from_graph[0]  = 20;

Я попробывал вывести теперь 5 точек, не изменяя код

data_str->n_from_graph[0]  = 5;

У меня по прежнему возникает исключение доступа
Лог из WinDBG:

(af8.b20): Break instruction exception - code 80000003 (first chance)
eax=7ffd6000 ebx=00000001 ecx=00000002 edx=00000003 esi=00000004 edi=00000005
eip=7c90120e esp=09b7ffcc ebp=09b7fff4 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=0038  gs=0000             efl=00000246
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:001> g
(af8.b28): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=6ef8fd80 ebx=0f29df04 ecx=6ef8fd80 edx=00000000 esi=0000007c edi=000049c4
eip=00450961 esp=0f29947c ebp=0f29949c iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010202
*** WARNING: Unable to verify checksum for C:\Program Files\LGraph\lgraph2.exe
*** ERROR: Module load completed but symbols could not be loaded for C:\Program Files\LGraph\lgraph2.exe
lgraph2+0x50961:
00450961 dd1a            fstp    qword ptr [edx] ds:0023:00000000=????????????????
13.05.2014 10:47:33
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: [LGraph2] Не работает плагин с минимальным кодом

По почте послал Вам собранный плагин с DLL. У меня все запускается нормально. Попробуйте с готовой dll.

Александр_int
13.05.2014 11:01:06
#5

Гость

Re: [LGraph2] Не работает плагин с минимальным кодом

Владислав пишет:

По почте послал Вам собранный плагин с DLL. У меня все запускается нормально. Попробуйте с готовой dll.

Действительно работает. Плагин был собран в LabWindows CVI ?? Я собираю сейчас в wxDev-Cpp. Буду пробывать в другой среде сборку. Спасибо.

13.05.2014 11:05:27
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 676

Re: [LGraph2] Не работает плагин с минимальным кодом

Да, в CVI. Видимо, какие-то тонкости при создании DLL. Удачи.