PDA

Просмотр полной версии : SysLibCom 16#FF



powerind
04.10.2008, 17:12
Здравствуйте. Я просмотрел тему http://www.owen.ru/forum/showthread.php?t=790&highlight=SysComOpen но вижу что там на многие вопросы ответов так и небыло, и я тоже не могу разобраться. Есть элементарно простой проект под ПЛК150:
------------------------------------
PROGRAM PLC_PRG
VAR
com_handle: DWORD;
res: BOOL;
com_set: COMSETTINGS;
close: BOOL;
END_VAR
------------------------------------
com_handle:=SysComOpen(COM1);
com_set.Port:=COM1;
com_set.dwBaudRate:=9600;
com_set.byParity:=0;
com_set.dwTimeout:=0;
com_set.byStopBits:=0;
com_set.dwBufferSize:=0;
com_set.dwScan:=0;
res:=SysComSetSettings(COM1,ADR(com_set));
close:=SysComClose(COM1);
------------------------------------
Всё. Загружаю, ставлю Breakpoint'ы и смотрю за ходом выполнения. Стабильно:
com_handle = 4294967295
res = *** INVALID: 16#FF ***
close = *** INVALID: 16#FF ***
Что-то не так? Нужно ли в ПЛК.Конфигурации добавлять что-либо?
Мой проект с конфигурацией и таргетом в архиве - Здесь (http://narod.ru/disk/2980072000/SimpleRS232.zip.html).

powerind
06.10.2008, 21:08
На этом форуме есть возможность удалить свою тему? Она всё-равно пустая.

Slipknot
06.10.2008, 21:29
никто не знает.

Serp
07.10.2008, 09:18
тоже хотел удалить, вроде не предусмотрено

powerind
07.10.2008, 09:47
А может, кто знает всё-таки ответ? ))
Я уже переделал код, и разместил в конце этой (http://www.owen.ru/forum/showthread.php?t=790&highlight=SysComOpen) ветки, уже если на столь раннем этапе оишбка, то я не знаю чего и ожидать.
Нормально выполняется команда открытия порта. Она, как и следовало ожидать, возвращает идентификатор открытого порта, например 4294967295. Так же, нормально, как мне кажется, выполняется команда ADR, возвращая какой-то DWORD. Или, может быть не нормально? У меня например получается, что ADR(com_set)=202b4888 или 539707528. Кстати, а от чего зависит вот это отображение, десятиричное или шестнадцатеричное? Я ведь нигде не указываю это явно..

Slipknot
07.10.2008, 10:14
А я вообще не пойму зачем это нужно. :)

powerind
07.10.2008, 10:17
Вообще, мне нужно открыть порт, применить настройки, провести обмен - запись в порт, можэет быть чтение, а потом может быть закрыть. НО. Я не продолжаю дальше писать код, потому что у меня уже на этапе применения настроек возникает ошибка. И при закрытии- тоже ошибка. Хотя с чего бы это?

Slipknot
07.10.2008, 10:22
А не легче на FBD все писать?

powerind
07.10.2008, 10:30
))))))))))))))))))) Мне кажется это несущественным.
Плохо читается? Можно наверное и на CFC, не суть )

Slipknot
07.10.2008, 10:35
Мне вообще все эти строчки непонятны,толи в FBD и CFC все четко и ясно.А разве в PLC configuration не предусмотрены такие возможности-обмена,записи и т.д.?

powerind
07.10.2008, 10:43
Это для тех случаев, когда нужно общаться с нестандартным оборудованием, для которого нет драйвера типа Модбас, или Овен. Мне нужно написать прогу для записи шестнадцатиричных слов в последовательный порт.

Slipknot
07.10.2008, 10:48
А для какого оборудования?

powerind
07.10.2008, 10:50
Поворотная видеокамера, Pelco-D протокол.

Slipknot
07.10.2008, 10:53
Так твоя пограмма должа видео картинку передавать?

powerind
07.10.2008, 11:04
Шутишь? )))
Команды на управление. Переход в заранее записаные предустановки.

Slipknot
07.10.2008, 11:39
А вот вчем дело,ну это надо к профи обращаться,мне кажется на форуме есть такие,по аське кого-нибудь подаставать попробуй :)

Филоненко Владислав
07.10.2008, 13:01
Попробуйте вместо COM1 поставить число 0.

powerind
08.10.2008, 13:41
В случае com_set.Port:=1 получаю:

com_handle = 4294967295
com_set.Port = COM1
res = *** INVALID: 16#FF ***
close = *** INVALID: 16#FF ***

В случае com_set.Port:=0 получаю:

com_handle = 0
com_set.Port = *** INVALID = 0 ***
res = FALSE
close = FALSE

В случае com_set.Port:=4 получаю:

com_handle = 0
com_set.Port = COM4
res = FALSE
close = FALSE

Читаю описалово на SysComSetSettings:

As soon as the parameters could be set successfully, TRUE will be returned, otherwise FALSE.
Читаю хелп на SysComClose:

The return value will be TRUE after a successful operation, otherwise FALSE.

Я получаю FALSE, значит parameters could NOT be set/closed successfully.
..к сожалению..
Ну, и:
Почему, 0? Может быть, я хочу открыть 232ой, или Debug, который сейчас свободен?

Филоненко Владислав
08.10.2008, 18:57
Тут произошла нек-я путаница на этапе разработки с документацией, поэтому у нас порты начинаются со значения 0 (а не 1 как в библиотеке) и возвращаемое значение 0 значит успешное выполнение. К сожалению эту досадную очепятку мы обнаружили уже после начала продаж и не стали ничего менять, т.к. у людей уже были проекты рабочие.

powerind
08.10.2008, 19:31
Ясно! Спасибо за разъяснение.
Буду подключать устройства и пытаться вылить что-то в порт.
--------------------------------------------------
НО, как мне относиться к тому, что когда я открываю порт 0 (485) и порт 4(Debug), я получаю нулевой handle, хотя потом нормально выполняется setSettings и close равные FALSE, что считается нормальным?
И как мне отнеситься к тому, что получая НЕнулевой handle при открытии порта 1 (232), в дальнейшем setSettings возвращает *** INVALID: 16#FF *** ?
Что на самом деле в каких случаях должны возвращать эти функции, соответствует ли это документации?

powerind
08.10.2008, 21:45
Получилось. Я отправил данные в порт RS-485. SysComWrite возвращает число отправленых байт, устройство их получает.
В порт 232 пока не получается:
SysComSetSettings = *** INVALID: 16#FF ***
SysComWrite = 0
SysComClose = *** INVALID: 16#FF ***
----------------------------------------------------------
COM1, он же 1, он же RS-232, мне нужен обязательно, т.к. интерфейс у меня 422ой, из 232го преобразуется запросто, а из 485 не уверен, разве двойным преобразованием.. напрямик не видел конертеров.

Филоненко Владислав
09.10.2008, 13:45
Вы, наверное, номер порта не везде выставили правильный.
P.S. А пример с диска не работает?

powerind
09.10.2008, 22:55
А о каком примере с диска идет речь? Мой контроллер был упакован в коробочку 09.10.2006. Только вот сначала мучался со мной с недельку-месяц, постоянно зависал, я его перепрошивал раз 10, потом он пылился в шкафу немного, а потом сломался, потом лежал отремонтарованый на складе больше года, и вдруг необычайно понадобился. Так вот, возможно на комплектном диске небыло примера о котором идет речь. Порт я выставляю так:
com_set: COMSETTINGS:=(

Port:=1,
..........
затем,
com_handle:=SysComOpen(com_set.Port);
.........................
res:=SysComSetSettings(com_set.Port,ptCs);
.......................
BytesWritten:=SysComWrite(com_set.Port, BufferToWriteADR, BytesToWrite, WriteTimeout);
.........................
close:=SysComClose(com_set.Port);

То есть, врядли он выставлен неправильно. Но может настройки??

com_set: COMSETTINGS:=(

Port:=1,
dwBaudRate:=9600,
byParity:=0,
dwTimeout:=0,
byStopBits:=0,
dwBufferSize:=0,
dwScan:=0);

Филоненко Владислав
10.10.2008, 09:30
Вот посмотрите.
А последнюю прошивку и таргет прошили?

powerind
10.10.2008, 10:45
Мммм.. ну вот я привел настройки,

com_set: COMSETTINGS:=(

Port:=1,
dwBaudRate:=9600,
byParity:=0,
dwTimeout:=0,
byStopBits:=0,
dwBufferSize:=0,
dwScan:=0);

не может же быть, что они, вот такие настройки просто не ставятся, а другие поставятся? Кстати, 115200 тоже пробовал, остальное думаю отношения не имеет. Ну и, от того какие настройки я вношу, может возникать 16#FF?

Таргет и прошивка, последние и соответствуют друг другу. Версия 2.03

powerind
12.10.2008, 16:43
Дорогая Техподдержка, в лице ответственных и высококвалифицированых Сотрудников, я всё никак до вас не дозвонюсь, ибо борюсь с проблемой в основном в нерабочее время, но может быть попробуете помочь мне найти решение здесь, в форуме? Буду вам примногоблагодарен, а может быть и не только я, таки обсуждение открытое..

приборист
27.10.2008, 15:49
Получилось. Я отправил данные в порт RS-485. SysComWrite возвращает число отправленых байт, устройство их получает.
В порт 232 пока не получается:
SysComSetSettings = *** INVALID: 16#FF ***
SysComWrite = 0
SysComClose = *** INVALID: 16#FF ***
----------------------------------------------------------
COM1, он же 1, он же RS-232, мне нужен обязательно, т.к. интерфейс у меня 422ой, из 232го преобразуется запросто, а из 485 не уверен, разве двойным преобразованием.. напрямик не видел конертеров.


А можно примерчик работающей отправки данных в RS-485?

powerind
28.10.2008, 12:43
А можно примерчик работающей отправки данных в RS-485?


PROGRAM PLC_PRG
VAR
StartOpenAdrSetClose: BOOL;
TimerToOpen:TON;
ReadyToOpen: BOOL;
WasOpen: BOOL;
TimerToAdr:TON;
ReadyToAdr: BOOL;
WasAdr: BOOL;
TimerToSet:TON;
ReadyToSet: BOOL;
WasSet: BOOL;
TimerToClose:TON;
ReadyToClose: BOOL;
WasClosed: BOOL;

com_handle: DWORD;
com_set: COMSETTINGS:=(
Port:=0,
dwBaudRate:=9600,
byParity:=0,
dwTimeout:=0,
byStopBits:=0,
dwBufferSize:=0,
dwScan:=0);
ptCs: POINTER TO COMSETTINGS;
res: BOOL;
close: BOOL;

Buffer1ToWrite: DWORD;
Buffer2ToWrite: DWORD;
BufferToWriteADR: POINTER TO DWORD;
BytesToWrite: DWORD;
WriteTimeout: DWORD;
ReadyToWriteRun: BOOL;
ReadyToWriteStop: BOOL;
WasWriteRun: BOOL;
WasWriteStop: BOOL;
BytesWritten: DWORD;
END_VAR

IF ReadyToOpen THEN
StartOpenAdrSetClose:=FALSE;
ReadyToOpen:=FALSE;
com_handle:=SysComOpen(com_set.Port);
WasOpen:=TRUE;
END_IF

IF ReadyToAdr THEN
WasOpen:=FALSE;
ReadyToAdr:=FALSE;
ptCs:=ADR(com_set);
WasAdr:=TRUE;
END_IF

IF ReadyToSet THEN
WasAdr:=FALSE;
ReadyToSet:=FALSE;
res:=SysComSetSettings(com_set.Port,ptCs);
WasSet:=TRUE;
END_IF

IF ReadyToWriteRun THEN
WasSet:=FALSE;
ReadyToWriteRun:=FALSE;
Buffer1ToWrite:=16#040000A0;
Buffer2ToWrite:=16#2BAF0020;
BufferToWriteADR:= ADR(Buffer1ToWrite);
BytesToWrite:=SIZEOF(Buffer1ToWrite);
BytesWritten:=SysComWrite(com_set.Port, BufferToWriteADR, BytesToWrite, 0);
BufferToWriteADR:= ADR(Buffer2ToWrite);
BytesToWrite:=SIZEOF(Buffer2ToWrite);
BytesWritten:=SysComWrite(com_set.Port, BufferToWriteADR, BytesToWrite, 0);
WasWriteRun:=TRUE;
WasWriteStop:=FALSE;
END_IF

IF ReadyToWriteStop THEN
WasSet:=FALSE;
ReadyToWriteStop:=FALSE;
Buffer1ToWrite:=16#000000A0;
Buffer2ToWrite:=16#0FAF0000;
BufferToWriteADR:= ADR(Buffer1ToWrite);
BytesToWrite:=SIZEOF(Buffer1ToWrite);
BytesWritten:=SysComWrite(com_set.Port, BufferToWriteADR, BytesToWrite, 0);
BufferToWriteADR:= ADR(Buffer2ToWrite);
BytesToWrite:=SIZEOF(Buffer2ToWrite);
BytesWritten:=SysComWrite(com_set.Port, BufferToWriteADR, BytesToWrite, 0);
WasWriteRun:=FALSE;
WasWriteStop:=TRUE;
END_IF

IF ReadyToClose THEN
WasWriteRun:=FALSE;
WasWriteStop:=FALSE;
ReadyToClose:=FALSE;
close:=SysComClose(com_set.Port);
WasClosed:=TRUE;
END_IF

IF (WasClosed) THEN
WasClosed:=FALSE;
StartOpenAdrSetClose:=TRUE;
END_IF

Запускайте, ставьте контрольные точки-брейкпоинты в каждом IF...END_IF и записывайте (Ctrl+F7) в ReadyToOpen, Adr, Write и так далее, значение True - примерчик необычайно кривенький, зато наглядно.
Так же, можно записать в структуру com_set новые настройки, например выставить .Port равным 4, это Debug. Удачи!

Kirill
28.10.2008, 13:41
Дорогая Техподдержка, в лице ответственных и высококвалифицированых Сотрудников, я всё никак до вас не дозвонюсь, ибо борюсь с проблемой в основном в нерабочее время, но может быть попробуете помочь мне найти решение здесь, в форуме? Буду вам примногоблагодарен, а может быть и не только я, таки обсуждение открытое..

Если я правильно понял, у вас не выходит использовать библиотеку для com1.

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

780