PDA

Просмотр полной версии : Ac3 + Mba



sergej.alexejew
09.10.2009, 00:14
Здравствуйте,

это вопрос, помню, поднимался раньше, но к сожалению в истории форума я его не нашел, поэтому пишу еще раз.

Через АС3 подключен МВА, к которому подключены термопары. Конфигуратором для МВА удается получить адекватные значения температуры.

При чтении данных с помощью библиотеки owen_io.dll возникает ошибка -2 ( ERR_NO_RESOURCE -2 // попытка использовать неинициализированный ресурс (например неоткрытый порт) ).

Порт открывается следующей командой (как в примере для АС3 поставялемом вместе с бибилиотекой):
int result = open_port (COM_1, spd_9600, prty_NONE, databits_8,
stopbit_1, RS485CONV_MANUAL
);
if ( result < 0 ) {
std :: cout << "OWEN Port opening error\n";
return 0;
}

Настройки СОМ - порта правильные не уверен только в последнем параметре, он взят из примера. Возвращаемое значение не меньше нуля, т.е. из этого можно заключить, что порт открывается нормально (?).

Данные читаются командой:

int time;
float value;
result = read_ieee32 (16, 0,"rEAd", value, time, -1);

В данном случае команда возвращает код ошибки -2. базовый адрес МВА - 16.

За подсказку в каком направлении искать ошибку был бы очень благодарен,

с уважением,
С.А.

Дмитрий Егоренков
09.10.2009, 11:53
на вид все правильно. вы не из разных потоков эти функции зовете?

и скачайте свежую версию библиотеки с нашего сайта -- http://www.owen.ru/device/64305906

sergej.alexejew
09.10.2009, 13:50
Спасибо, Вам большое за ответ - а Вы знаете, действительно из разных. В головном потоке открываю порт, а в подчиненном читаю данные. Библиотеку качал недавно.

Раньше помню были проблемы с последним параметром ф-ии readieee он варьировался между 1 и -1.

Хотелось бы еще спросить описание ошибки -2 ( ERR_NO_RESOURCE -2 // попытка использовать неинициализированный ресурс (например неоткрытый порт) ). Может ли тут речь идти еще о каком нибудь порте, кроме того который открываеся
open_port (COM_1, spd_9600, prty_NONE, databits_8,
stopbit_1, RS485CONV_MANUAL) ?

с уважением
А.С.

Дмитрий Егоренков
09.10.2009, 14:16
библиотеку лучше обновить -- у вас она старая. ошибка говорит о том, что порт вообще не был открыт.

Работа с одним портом из разных потоков (и с разными портами в одном потоке) поддерживается новой моделью библиотеки. Выбрать модель можно функцией SetApiMode(OWENIO_API_NEW). После этого можно выбирать активный порт функцией SelectPort(). Но я бы рекомендовал просто открывать порт в том потоке, где он используется.

sergej.alexejew
09.10.2009, 14:32
спасибо. вам большое, несмотря на то, что я какчал библиотеку 2 недели назад, я скачаю ее ще раз как вы советутет и конечно попробую открывать порт в том же потоке, где и читаю.

о результатах сообщусь в понедельник,

с уважением,
а.с.

sergej.alexejew
13.10.2009, 12:15
Здравствуйте,

действительно, прошу прощения, я был не прав библиотека новая - понятнее и лаконичнее, спасибо большое.

Однако при ее испытании возникли следующие трудности - когда я открываю порт такой же командой как и в примере

int res = OpenPort(COM_1, spd_9600, prty_NONE, databits_8, stopbit_1, RS485CONV_MANUAL);

if ( res != ERR_OK ) {
std :: cout << "Ошибка открытия порта." << std :: endl;
return;
}

Приложение вываливается в исключение, со стандартным окном, в котором предлагается отправить отчет Микрософт об ошибке. Со старой версией такого не было.

Библиотеку линкую к MinGW командой g++ ... -lowen_io.dll.

Параллельно также линкуется еще библиотека для реализации многопоточности тем же способом - с ней все нормально. Никаких ошибок линковки в отношении библиотеки owen_io не случается.

спасибо большое за помощь,
с уважением,

Сергей А.

Дмитрий Егоренков
13.10.2009, 18:15
самый простой выход такой: в файле owen_io.h заменяете строчку

#define OWEN_EXPORT __declspec(dllimport)

на

#define OWEN_EXPORT

перед именами функций добавляете подчеркивание: _OpenPort.

соответственно в программе так же используете _OpenPort().