PDA

Просмотр полной версии : ТРМ101 и Owen_io.dll



Hemann
12.01.2010, 00:27
Уважаемые коллеги! Сегодня столкнулся с такой проблемой. Пишу программу на Дельфях с использованием библиотеки Owen_io.dll. Прибор ТРМ101, версия 03.0023. Чтение проходит совершенно без проблем, а вот с записью происходят чудеса. Пытаюсь записать параметр SH, функция WriteFloat24() показывает что ошибок нет (ERR_OK), но реально в приборе значение SH сбрасывается в 0, какое бы я туда с передней панели не ввел. С записью параметра KU еще круче - точно такой же вызов как и для параметра SH дает ошибку -104. А читаются эти параметры без проблем.
Вот примеры вызовов:
wr24_sh:=WriteFloat24(adr,0,'SH ',val_sh,-1);
wr24_ku:=WriteFloat24(adr,0,'KU ',val_ku,-1);
Что ж с записью то? Может я чего не так делаю?

Малышев Олег
12.01.2010, 09:39
Здравствуйте, встречный вопрос - конфигуратор нормально пишет эти параметры? Кроме того, в конфигураторе можно экспортировать список параметров и посмотреть что не так - не совпадают типы или названия параметров. Желательно так же разнести небольшим таймаутом - например Sleep(100) записи параметров.

Hemann
12.01.2010, 09:47
Приветствую, Олег! Конфигуратор пишет нормально. Тайм-аут пробовал. Делал вот так:
.........
for i:=0 to 10 do
begin
wr24_ku:=WriteFloat24(adr,0,'KU ',val_ku,-1);
if wr24_ku=0 then break;
sleep(200);
end;
........
Не помогло, блин...

Hemann
12.01.2010, 10:15
Экспортировал список параметров. Имена я у себя задаю правильно, а вот типы в полученном с помощью экспорта списке не указаны. Я уже попробовал WriteIEEE32 на всякий случай-то же самое, только вид сбоку, ошибка -104. На всякий пожарный-пишу на Delphi 5, правда не вижу в этом проблемы, dll-ка нормально подключается.

Малышев Олег
12.01.2010, 11:21
и снова приветствую, герман,
на вскидку после Ku и Sh должны быть 2 пробела...

Дмитрий Егоренков
12.01.2010, 11:57
ну сколько можно, а? не нужны там эти пробелы.

Hemann
12.01.2010, 12:05
дык ткните носом, чего я делаю неправильно?

Дмитрий Егоренков
12.01.2010, 12:10
на первый взгляд все правильно. обновите библиотеку с сайта, и проверьте диапазоны значений, которые записываете в прибор, возможно, в этом дело.

кстати, задержки между обращениями для современных приборов не актуальны. к тому же библиотека сама переспрашивает, если прибор не ответил -- см. SetMaxRetriesGlobal().

и еще. код возврата ERR_NERR (-104) означает, что прибор вернул код ошибки, который можно узнать вызвав GetDeviceLastErr(). или вызвать LastErrToStr() и получить описание ошибки.

Hemann
12.01.2010, 13:17
библиотека самая последняя. а вот остальное попробую. спасибо. кстати, что вы имеете в виду говоря о диапазонах значений?

Дмитрий Егоренков
12.01.2010, 13:21
что вы имеете в виду говоря о диапазонах значений?

допустимые значения для данного параметра. они должны быть указаны в списке программируемых параметров.

кстати, попробуйте еще использовать индекс при записи параметра -- вдруг поможет?

Hemann
12.01.2010, 15:39
Допустимые значения в рамках. Пробовал индексы (0 и 1) - без толку. Пробовал использовать GetExtendedLasErr-возвращает 0. Ее можно самостоятельно использовать или только после LastErrToStr?

Дмитрий Егоренков
12.01.2010, 15:41
можно. только использовать надо было GetDeviceLastErr().

Hemann
12.01.2010, 16:08
Накидал простейший проект для ПЛК150 - он мастер, пишет в зависимости от дискретного входа 1 либо SH=1, KU=1,005, либо SH=0, KU=1. Ну, там FloatPIC и все остальное соответственно моему ТРМ101. Все работает прекрасно, а от компа-ни в какую. Сейчас подсуну ПЛК под видом ТРМки

Hemann
12.01.2010, 17:56
можно. только использовать надо было GetDeviceLastErr().
Хм... У меня в описании библиотеки такой функции нет.

А вот что показали эксперименты с подменой ТРМки ПЛК150-ым: Функция WriteFloat24 пишет какое-то особо малое значение (1,735409... в -39 степени), причем и при вызове для параметра SH, и при вызове для параметра KU. SH это воспринимает как 0 и для него это нормальное значение, а KU ругается из-за того, что 0 для него значение не допустимое. Вот только почему такое значение передается? В пошаговой отладке я вижу, что в WriteFloat24 передаются правильные параметры.:confused: Такая вот эпидерсия...

Дмитрий Егоренков
12.01.2010, 17:58
у вас в дельфи как функция WriteFloat24 описана?

Hemann
12.01.2010, 18:54
TProcWriteFloat24=function (adr,adr_type: DWORD;command: pchar;var value: single;index: integer):integer;stdcall;
WriteFloat24:TProcWriteFloat24;
Так в хелпе на библиотеку она описывается. Подключил LastErrToStr(), она дала вот что "Значение мантиссы превышает ограничение дескриптора" (не ручаюсь что дословно так)

Дмитрий Егоренков
13.01.2010, 00:01
должно быть так:

TProcWriteFloat24=function (adr,adr_type: DWORD;command: pchar;value: single;index: integer):integer;stdcall;

у вас не значение передается, а указатель на переменную.

Hemann
13.01.2010, 11:12
дима, спасибо большое! все пошло. одна голова хорошо, а две лучше :)