PDA

Просмотр полной версии : Owen_io.dll и CriticalSection



Антон Волков
27.05.2013, 10:30
Здравствуйте!

Есть софт для работы приборов ОВЕН посредством Owen_io.dll

Архитектура следующая:
1. "Своя" DLL, предоставляющая остальным частям софта доступ к owen_io.dll через функции-обертки.
2. Часть софта читающая приборы через "свою" DLL и визуализирующая результат.

Чтение в п.2 осуществляется циклически в потоке (Thread) по следующему алгоритму для каждого канала каждого прибора:
1. Открыли порт
2. Прочли нужный канал
3. Закрыли порт
4. Задержка (Sleep) для потока на 100мс.

Все работало стабильно и без сбоев.

Понадобилось добавить запись в приборы по требованию конечного пользователя из "визуализирующей" части.

Алгоритм:
1. В любой момент времени пользователь указывает, что и куда записать, нажимает кнопку в окне программы.
2. Через обертку в "своей" DLL вызывается соответствующая функция записи из owen_io.dll

Для синхронизации запросов на запись была ведена CriticalSection? т.о. алгоритм опроса стал:
1. Вошли в CriticalSection
2. Открыли порт
3. Прочли нужный канал
4. Закрыли порт
5. Вышли из CriticalSection
6. Задержка (Sleep) для потока на 100мс.

Соответственно, в момент записи:
1. EnterCriticalSection
2. WriteXXXX
3. LeaveCriticalSection

Теперь визуализирующая программа может только открывать и закрывать порт. На все другие операции (чтение/запись) возникает nErr с кодом "B", если конкретно: "Прибор вернул nErr: B"

Выходит, использование CriticalSection влияет на работоспособность owen_io.dll?
Если да, то как тогда лучше синхронизировать операции чтения записи?

PS: Используется OWENIO_API_NEW. При OWENIO_API_OLD библиотека работать отказывается. Среда Delphi XE2.

SafSerg66
10.06.2013, 13:13
"Используется OWENIO_API_OLD. При NEW библиотека работать отказывается."это не понял я разбирался с библиотеками работаю Builder 6 и owen_io.dll.

Антон Волков
20.06.2013, 08:33
Используется OWENIO_API_OLD. При NEW библиотека работать отказывается
Перепутал. Исправил в исходном посте.


разбирался с библиотеками работаю Builder 6 и owen_io.dll
Это не совсем в тему.
Delphi XE2 от Builder 6 отличается разительно. Хотя бы тем, что в XE2 юникод по умолчанию.

"Доработка напильником" интерфейсного модуля owen_io.pas заключалась в замене всех PChar на PAnsiChar. Также пришлось добавить немного для корректного преобразования ошибок в строки.

Код был на несколько раз перепроверен на предмет ошибок типизации и алгоритмических огрехов. Все в порядке.

Главный вопрос: Что такое "Прибор вернул nErr: B" из LastErrorToString? В описании библиотеки этот код отсутствует. В интерфейсном модуле такой константы тоже нет. И как можно победить эту ошибку?

Илья Глан
21.06.2013, 11:34
Какие приборы опрашиваются программой? Поскольку в протоколе нет значения 0x0B, то неплохо бы выяснить что все-таки передает прибор. Подключить какой-нибудь portmon. Еще вроде Есть должна быть возможность диагностического вывода в консоль, правда, в старом Delphi она не работала. Включить ее можно функцией SetDbgIndication().