:: Visual Foxpro, Foxpro for DOS
Железо и фокс
Victoriacom

Сообщений: 106
Дата регистрации: 08.12.2010
Здравствуйте всем!
Выдали на днях китайскую железку и документацию для программиста. Как это обычно с ними бывает (с китайцами), где-то должен был быть подвох. Случилось сразу же, при чтении документации. Названия функций не соответствуют действительности. Это увидел через OCX, которую мне тоже вручили.
Ну да бог с ним. Названия похожи, но в некоторых случаях приходится только догадываться что к чему.
Принцип там такой: вызываю какую-либо функцию и должен сработать соответствующий OnEvent.
Проблема в том, что этот OnEvent срабатывает как-то криво: долго думает.
Например, код установки соединения:

_VFP.AUTOYIELD = .F.
cIp = '192.168.1.218'
nPort = 30000
cLogin = 'admin'
cUnitPass = '12345'
nRet = FSsdk.C_Connect(cIp, nPort, cLogin, cUnitPass)
DOEVENTS FORCE

Должен сработать OnEventCConnect. С первого раза ВСЕГДА не срабатывает.
Сначала я крутил это в цикле:

cSerNum = ''
DO WHILE EMPTY(cSerNum)
nRet = FSsdk.C_Connect(cIp, nPort, cLogin, cUnitPass)
DOEVENTS FORCE
cSerNum = oDevice.sernum
WAIT WINDOW '' TIMEOUT .5
ENDDO

Срабатывало, но после большого количества циклов. И что интересно, при SET STEP ON, это происходит значительно быстрее. Я понимаю, что дело в паузе, когда степаю F6.
Игрался с паузами.
А иногда и без отладчика срабатывало мгновенно.

Понимаю, что что-то делаю не так, но что именно, не понимаю.
Может кто-то что-то посоветует?

Очень смущает то, что иногда можно приконнектиться только через 70 секунд, а иногда - через 4.

Саму OCX я положил на пустую форму и включил ее (форму) в общедоступный класс. Чтобы было проще отлаживаться.

OnEvent'ы все однотипные и выглядят примерно так:

*** ActiveX Control Event ***
LPARAMETERS strdevsn, lopcode, luserdata, lextendparam, strip, lport
lopcode должен возвращать 0. Поставил туда свой код:

IF lopcode=0
oDevice.sernum = strdevsn
ELSE
oDevice.sernum = ''
ENDIF
Где "oDevice" - мой паблик объект.

Пробовал вариант, когда вызов функции один, а DOEVENTS я кручу в цикле:

nRet = FSsdk.C_Connect(cIp, nPort, cLogin, cUnitPass)
DO WHILE EMPTY(cSerNum)
DOEVENTS FORCE
cSerNum = oDevice.sernum
WAIT WINDOW '' TIMEOUT .5
ENDDO

Результат тот же.



Исправлено 6 раз(а). Последнее : Victoriacom, 09.12.19 16:24
Ratings: 0 negative/0 positive
Re: Железо и фокс
vk65

Сообщений: 402
Дата регистрации: 08.04.2008
А если попробовать DOEVENTS без FORCE ?
Ratings: 0 negative/0 positive
Re: Железо и фокс
Victoriacom

Сообщений: 106
Дата регистрации: 08.12.2010
26 секунд. Это тоже много.
В программе есть операции по загрузке/выгрузке данных в/из прибор/а. Представляете, клиент будет каждый раз ожидать по 26 сек!
И, ладно бы, всегда. А то иногда 3, иногда 50...

Сейчас приконнектился 20 раз. Перезагрузил прибор, и еще пару раз. Должен сказать что коннект стабилизировался на 11 секундах. Это - без FORCE.



Исправлено 4 раз(а). Последнее : Victoriacom, 09.12.19 16:44
Ratings: 0 negative/0 positive
Re: Железо и фокс
Victoriacom

Сообщений: 106
Дата регистрации: 08.12.2010
Не. Все по-старому. Перезагрузил прибор и компьютер. И все вернулось.
Ratings: 0 negative/0 positive
Re: Железо и фокс
dimuhametov

Сообщений: 1562
Откуда: Костанай
Дата регистрации: 01.11.2008
.


------------------
Незнание делает жизнь такой интересной.




Исправлено 1 раз(а). Последнее : dimuhametov, 09.12.19 18:24
Ratings: 0 negative/0 positive
Re: Железо и фокс
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
По идее для псевдо-синхронной работы правильный вариант последний - 1 вызов и ожидание в цикле. только вместо WAIT WINDOW '' TIMEOUT стоит применить INKEY(0.5), можно дополнить АПИшной Sleep(500)

Вряд ли тут дело в фоксе.

Попробуй ещё асинхронный вариант работы. В общем виде это выглядит как

Click кнопки start -> вызываем АПИ функцию соединения.
OnConnected -> обрабатываем результат установления соединения, и вызываем АПИ функцию посылки следующей нужной команды - ну к примеру чтение данных из устройства.
OnDataRead -> обрабатываем результат чтения данных, и вызываем следующую команду.

Теория про "конечные автоматы" должна помочь понять как правильно реализовать всю последовательность работы.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Железо и фокс
Victoriacom

Сообщений: 106
Дата регистрации: 08.12.2010
Igor Korolyov
По идее для псевдо-синхронной работы правильный вариант последний - 1 вызов и ожидание в цикле. только вместо WAIT WINDOW '' TIMEOUT стоит применить INKEY(0.5), можно дополнить АПИшной Sleep(500)
Вряд ли тут дело в фоксе.

Попробуй ещё асинхронный вариант работы. В общем виде это выглядит как

Click кнопки start -> вызываем АПИ функцию соединения.
OnConnected -> обрабатываем результат установления соединения, и вызываем АПИ функцию посылки следующей нужной команды - ну к примеру чтение данных из устройства.
OnDataRead -> обрабатываем результат чтения данных, и вызываем следующую команду.

Теория про "конечные автоматы" должна помочь понять как правильно реализовать всю последовательность работы.
Спасибо. После замены WAIT WINDOW на INKEY и SLEEP, соединяется относительно стабильно 11~20 сек.
Вообще, после общения с разработчиками по скайпу, я пришел к выводу, что этот прибор - то еще г-но. Наше руководство закупило два на пробу, теперь думает кому бы впихнуть.
Ratings: 0 negative/0 positive
Re: Железо и фокс
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
С прибором возможно все в порядке.
Ты что, при каждой опреации обмена данными конектишься к прибору?
Обычно приборы которые подключаются по Ethernet позволяют создавать и обмениваться по нескольким соединениям одновременно.
В таком случае операция подключения может быть очень дорогой.

Ведь сначала надо идентифицировать пользователя.
Потом определить выделенные ему права.
Создать сессию.
Создать процесс или поток как минимум
Выделить ресурсы.
Создать необходимые объекты.
Инициализировать их.

Такое имеет смысл если обмен данными происходит с прибором происходит редко.
Обычно приложение подключается к прибору один раз при запуске и переподключается при потере соединения.
Хотя конечно зависит от задачи и от прибора.
Одно дело считывать показания электросчетчиков раз в месяц, другое в реальном масштабе времени управлять процессом.
Ratings: 0 negative/0 positive
Re: Железо и фокс
Vedmak

Сообщений: 5949
Откуда: CiTY
Дата регистрации: 30.10.2003
Брат, приведи оригинал доки... чую разное. С китайскими девайсами успешно пользую Socket.


------------------
Говорить стоит лишь для тех, кто слушает.
Ratings: 0 negative/0 positive
Re: Железо и фокс
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Василий, плюспанул, держишь чеснак по налогообложения ( ну, по родк занятий, но тем не менее)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 12 (Гостей: 12)

© 2000-2024 Fox Club 
Яндекс.Метрика