PDA

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



mettled
20.09.2007, 16:14
возникла проблемма, вот кусок программы. Контроллер ПЛК 150 U-M. таргет 2.0-4, Прошивка 2.01.8.
при подключении к контроллеру temp1 получается значение ***INVALID: 16#FF***.
Не могу понять почему и в чем ошибка...
помогите советом добрым. люди добрые )))

set: COMSETTINGS;
temp: DWORD;
temp1:BOOL;
________________________________________
temp:=SysComOpen(1);
set.Port:=1;
set.dwBaudRate:=38400;
set.byParity:=0;
set.dwTimeout:=0;
set.byStopBits:=1;
set.dwBufferSize:=0;
set.dwScan:=0;
temp1:=SysComSetSettings(temp,ADR(set));

Филоненко Владислав
21.09.2007, 08:05
Вместо temp подставьте номер порта. И не пользуйтесь числами, используйте константы из библиотеки

mettled
21.09.2007, 10:18
ну тогда очередная неточность в описании библиотеки и ее работе.
там везде написано что надо использоваться дескриптор порта, который возвращает функция открытия порта.
и не могли бы вы, очень вас прошу, написать примерчик работоспособный, где использовались бы функциии работы с ком-портом.
Уж очень надо.

Аркадий
19.03.2008, 12:11
Вместо temp подставьте номер порта. И не пользуйтесь числами, используйте константы из библиотеки

добрый день.
подниму тему, вопросов накопилось.

пример, который в первом собщении подойдет. овен 150 И-М, таргет самый свежий.
1. функция SysComOpen у меня всегда возвращает все ff... независимо, указываю ли я порт как константу, или как численную переменную.
2.в переведеннном файле по библиотеке написано -
-Режим (для PLC-100): ..0 порт – RS-485
..1 порт – RS-232
..2 порт – не используется
..3 порт – не используется
..4 порт – отладочный RS-232
однако, в разделе типов библиотеки СОМ1 = 1. там нет константы со значением 0!. а Вы пишете использовать константы из библиотеки..
3. по хэндлу порта непонятно.. в оригинале описания библиотеки написано что в функциях библиотеки надо использовать хэндл, позвращаемы ф-ей открытия.. у вас совсем по другому, номер порта.
4. работает ли на овенах функция установки ..Ex ? Важно для числа бит !
5. работает ли библиотека на PLCWinNT ?

вот то что я делаю в пустом проекте:

PROGRAM PLC_PRG
VAR
init:BOOL;
ptr:DWORD;
set: COMSETTINGS;
END_VAR

IF (init <> TRUE) THEN

set.Port := COM1; - неважно что присваивать, результат один
set.byParity := 0;
set.byStopBits := 0;
set.dwBaudRate := 9600;

ptr := SysComOpen (set.Port);
init := SysComSetSettings (set.Port ,ADR(set));

END_IF
результат - ptr - 0xffffffff, init - INVALID 16#ff

Филоненко Владислав
19.03.2008, 13:01
SettingsEx работает, под Nt библиотека тоже должна работать, но не проверял, т.к. NT не использую.
Пример выложу в ближайшее время.

Аркадий
19.03.2008, 15:54
вот еще проектик, гляньте, скажите что не так?
вроде все примитивно, а не работает, опять какая нибудь мелочь поди.

Аркадий
20.03.2008, 12:35
up.
жду ответа.

Филоненко Владислав
20.03.2008, 14:56
Пример работы:

Аркадий
20.03.2008, 16:14
Пример работы:

пример для plc 100. у меня 150. сменил таргет. еще при загрузке проекта было замечание про разные версии библиотек...

поясните, ваша функция OPEN_FUN возвращает 1 в случае успеха или неуспеха открытия порта???

напишите пожайлуста четко, цифрами, а не константами из библиотеки номера портов 485 со стороны клеммников и 232 на лицевой панели для PLC-150.

Аркадий
21.03.2008, 16:21
по номерам портов все таки напишите пожайлуста.
какой номер для функций библиотеки у порта на лицевой стороне ПЛК-150?
и почему этот код из вашего примера :

IF SysComOpen(setings.Port)=0 THEN
OPEN_FUN:=FALSE;
ELSE
OPEN_FUN:=TRUE;

возвращает из функции TRUE если функция открытия порта возвращает 16#ffffffffff ? ведь это неудачное открытие порта согласно документации.
при выполнении программы для портов с номерами 1-5 функция открытия возвращает ффы.
???
и еще. можно ли вообще работать с портом на лиц панели из программы? не занят ли он под отладочный?

Kirill
21.03.2008, 16:51
по номерам портов все таки напишите пожайлуста.
какой номер для функций библиотеки у порта на лицевой стороне ПЛК-150?
и еще. можно ли вообще работать с портом на лиц панели из программы? не занят ли он под отладочный?

порт на лицевой панели debud rs232 имеет 4 номер. Работать с ним можно, однако для этого не подходит кабель программирования ПЛК, идущий в комплекте. В руководстве на плк приведена схема распайки нужного вам кабеля (см. рисунок). Его можно получить из кабеля программирования, удалив перемычку со стороны разъема db9.

Такой кабель также можно приобрести в фирме ОВЕН.

414

GazovikYa
28.03.2008, 10:44
У меня не работает функция SetingsEx - всегда возвращает false. Необходимо использовать функцию управления RTS. Может есть какие тонкости ее использования? Перепробовал все... даже нашел пример с установкой параметра размера .size:=sizeof(); и тем не менее не работает..... Подскажите если есть наработки:confused:

Аркадий
28.03.2008, 10:54
У меня не работает функция SetingsEx - всегда возвращает false. Необходимо использовать функцию управления RTS. Может есть какие тонкости ее использования? Перепробовал все... даже нашел пример с установкой параметра размера .size:=sizeof(); и тем не менее не работает..... Подскажите если есть наработки:confused:

собственно, если функция фозвращает 0 то она работает. если не работает - то 255. я пользуюсь данной функцией, щас проверил.
по поводу RTS вроде видел тут, что на овенах не распаяны управляющие сигналы на портах.
т.е. функция то управляет.. чипом.

Малышев Олег
28.03.2008, 10:55
Если идет речь не об Овен ПЛК то:
Возможно на этом контроллере просто не реализована данная функция. Некоторые контроллеры аппаратно не позволяют работать с не традиционными параметрами порта - например 7,n,1.5 или 7,e,2.

powerind
06.10.2008, 21:34
Пример работы:

У меня приведенный пример не работает. Подменил таргет под свой 150 IL, запускаю, получаю settings.Port = *** INVALID: 0 ***
А чего можно ожидать, выполняя сначала:

setings.Port:=COM1;

затем

setings.Port:=setings.Port-1;

потом

opn:=TRUE;
IF SysComOpen(setings.Port)=0 THEN
OPEN_FUN:=FALSE;
ELSE
OPEN_FUN:=TRUE;
END_IF

а после -

setings.Port:=setings.Port+1;

В режиме отладки видно все что происходит.
Функциональный блок:
FUNCTION SysComOpen : DWORD
VAR_INPUT
Port:PORTS;
END_VAR
VAR
END_VAR
То есть, SysComOpen должна возвращать WORD, а в примере
IF SysComOpen(setings.Port)=0 THEN
разве, это значит, что порт открыт?

-----------------------------------------------

Вот мой пример, проще не придумать, всё работает "на автомате", но НЕ применяются настройки(res = *** INVALID: 16#FF ***), и порт НЕ закрывается (close = *** INVALID: 16#FF ***):

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:=1,
dwBaudRate:=115200,
byParity:=0,
dwTimeout:=0,
byStopBits:=0,
dwBufferSize:=0,
dwScan:=0);
ptCs: POINTER TO COMSETTINGS;
res: BOOL;
close: BOOL;
END_VAR


TimerToOpen(IN:=StartOpenAdrSetClose, PT:=t#1s);
ReadyToOpen:=TimerToOpen.Q;
IF ReadyToOpen THEN
StartOpenAdrSetClose:=FALSE;
com_handle:=SysComOpen(com_set.Port);
WasOpen:=TRUE;
END_IF
TimerToAdr(IN:=WasOpen, PT:=t#1s);
ReadyToAdr:=TimerToAdr.Q;
IF ReadyToAdr THEN
WasOpen:=FALSE;
ptCs:=ADR(com_set);
WasAdr:=TRUE;
END_IF
TimerToSet(IN:=WasAdr, PT:=t#1s);
ReadyToSet:=TimerToSet.Q;
IF ReadyToSet THEN
WasAdr:=FALSE;
res:=SysComSetSettings(com_set.Port,ptCs);
WasSet:=TRUE;
END_IF
TimerToClose(IN:=WasSet, PT:=t#1s);
ReadyToClose:=TimerToClose.Q;
IF ReadyToClose THEN
WasSet:=FALSE;
close:=SysComClose(com_set.Port);
WasClosed:=TRUE;
END_IF
IF (WasClosed) THEN
WasClosed:=FALSE;
StartOpenAdrSetClose:=TRUE;
END_IF


Архив с программой Здесь (http://narod.ru/disk/3024484000/SimpleRS232%20(copy%202).zip.html)

Филоненко Владислав
07.10.2008, 13:03
Порт должен быть==0
Com1 ==1 - это 232 на ПЛК100

powerind
07.10.2008, 13:26
Спасибо, я слышал об этом, но в SysLibCom заявлео твердое соответствие, COM1:=1, COM2, и так далее, то есть 0 не может соответствовать какому-то гипотетически COM0, поэтому когда я присваиваю переменной объявленой как com_set.Port:PORTS:=0; то, что не удивительно получаю ошибку: com_set.Port = *** INVALID: 0 ***
----------------------------------------
Для начала, я хочу изучить команды открытия и закрытия, и проверить их выполнение. Для этого, пытаюсь открыть любой доступный порт, настроить его и закрыть. У меня нет подключенного устройства на RS-485 и на RS-232 порту, при этом я не могу настроить его и закрыть. Так должно быть?
P.S.: У меня ПЛК150, на нем нумерация портов такая же?

Филоненко Владислав
07.10.2008, 17:48
Настроить и закрыть можно только открытый порт :)
0 - 485
1 - 232
4 - DBGU

На всех

powerind
08.10.2008, 13:29
Да, пожалуйста, присмотритесь к коду моей программы, я всё приложил:
Открываю, настраиваю, и закрываю. По непонятным причинас, проходит только команда открытия. Пусть, это будет COM1:=1 он же 232, не суть. Трабл в том, что я могу его только открыть.
-----------------------------------------------------------
Ну, и .. только что всем советовали использовать константы из библиотеки, но ведь константы для 0, он же 485, не существует, и если писать ноль то получаю ошибку: com_set.Port = *** INVALID: 0 ***

Филоненко Владислав
08.10.2008, 18:58
Это Не ошибка, а возмущение компилятора на константу вне диапазона. Можно не реагировать.

powerind
08.10.2008, 23:35
Спасибо, полезное замечание, очень-очень. Если .Port=0 это я понял..
-------------------
А когда SysComSetSettings или SysComClose равен *** INVALID: 16#FF *** - это ошибка, или тоже возмущение компилятора, которое можно игнорировать?

Филоненко Владислав
09.10.2008, 13:46
0хff - операция прошла неудачно.
P.S. А пример на диске не смотрели? там все порты

powerind
09.10.2008, 22:58
А как ещё можно проверить, в чём проблема, и исправен ли порт? и нужно ли подключать что-то к порту, чтобы успешно открыть его, внести настройки и закрыть?
Буквально неделю назад я его успешно перепрошил через Debug, естественно поставил соответствующий таргет удалив старый.

Филоненко Владислав
10.10.2008, 09:23
Поставьте мастер Овен/Modbus и посмотрите в терминале, идут ли посылки.
Аналогично можно с помощью slave.

Степан
10.10.2008, 12:58
Здраствуёте ребята. Подскажите пожалуйста с влагомером песка и бетона поток.
Возможна ли работе его с PLC-100?

magirus
10.10.2008, 14:12
Plc100 не имеет аналоговых входов
я думаю подойдет в таком случае Plc150. (154)

powerind
12.10.2008, 16:40
Да. Проверил.
Owen через 232 незозможен на 150том, Modbus настраиваю на 485, связь с МВА8 есть,ю затем меняю порт на Debug 232, подключаю через конвертер MOXA A53, соезинение устанавливается (ошибки протокола Modbus в регистре Last Error нет, она появляется если выключить питание у МВА), при установленном соединении на конвертере моргают лампочки Tx и сразу Rx, то есть обмен данными происходит, но данные которые я получаю в ПЛК почему-то нули.
При подключении к входу 232 конвертера RS232-485 компьютера с OPC-сервером и клиентом я вижу данные с МВА, обмен идет так же с помаргиванием светодиодов на Моксе. Подключаю ПЛК, и вижу что обмен опять идет, но получаю в регистрах только нули.
------------------------------------------------------------
Смог передать данные в порт 232 и чситать их через монитор COMPump (получать обратно пока не пробовал). Для этого, выставил .Port равный 4. То есть, Debug. Если выставляю 1, COM1, то настройки не применяются, данные не передаются, порт не закрывается, хотя успешно получаю командой открытия какой-то хэндл.
У кого-нибудь работает Debug через .Port=1 ?

kma
21.04.2009, 10:46
Ну вобщем то в моем случае все тоже самое - открыть применить настройки и реально передать получилось только с портом COM4. Пробовал поднимал в PLCConfiguration по интерфейсу RS232 Modbus Slave - работает стабильно с различными параметрами ... очень интересно какой инициализируется при этом порт COM4 или COM1 :)

target_PLC_150_2.05.0\PLC150.I-L

Филоненко Владислав
21.04.2009, 13:26
господа, пока вы не выкладываете проекты - мы помочь ничем не можем, т.к. телепатическими способностями не обладаем.

Lightning
09.09.2009, 18:19
Собственно, подниму тему.
Начал осваивать SysLibCom и столкнулся с вопросом...

Надо послать строку Х в порт RS232 (не дебаг, а стандартный, DB9), чтобы я мог ее считать на ПК.

Делаю так:

f1:=SysComOpen(1);
comset.Port:=1;
comset.dwBaudRate:=115200;
comset.byParity:=0;
comset.dwTimeout:=0;
comset.byStopBits:=0;
comset.dwBufferSize:=0;
comset.dwScan:=0;
res:=SysComSetSettings(1,ADR(comset));
wb:=SysComWrite(1,ADR(x), LEN(x),0);
res_close:=SysComClose(1);

В результате, при запуске программы получаю:

f1=0 (Как я понял - так и должно быть, а в доках - ошибка)
comset.Port=COM1 (т.е. порт RS232?!)
comset.dwBaudRate=115200
comset.byParity=0
comset.dwTimeout=0
comset.byStopBits=0
comset.dwBufferSize=0
comset.dwScan:=0
res=FALSE (Почему? Параметры порта не установлены и приема-передачи нет? Или так и должно быть?)
wb=27 (Длина строки Х, тут все правильно, выходит, данные в буфер порта отправлены...)
res_close=FALSE (Почему? Получается, порт не закрыт?)

Прослушиваю порт программой COMPump - ничего, пусто...

Сам проект - в приложении.

И еще один вопрос - читаю в ПЛК данные от МВА8 вот таким способом:

VAR

t_in AT %QD8.1.1:REAL;
...
Но приходят одни нули...
Опрос идет, лампочки RS485 на МВА8 мигают.
МВА8 подключен к ПЛК согласно рекомендациям ОВЕН, прилагаемым на диске.

ПЛК100-220.Р.М.
Прошивка: 2.05.7
Таргет: 2.10

Crusash
10.09.2009, 10:24
f1 это вроде как хендл СОМ порта, получаемый SysComOpen и используемый всеми остальными функциями.
А вообще СОМ порт достаточна инертная штука(вовсяком случае в Виндах) и вкаждом рабочем цикле открывать его, чтото писать и сразу закрывать - несколько не корректно. Достаточно один раз, например при инициализации, открыть порт, настроить его, а потом по таймеру что-то писать...
Когда я игрался с портами, чтобы не парится с таймерами, очень удобно было в визуализации настроить кнопочки на открытие, закрытие, настройка,запись, чтение... Лампочку контролирующую ошибку, и таблицу с содержимым буфера порта(то что при чтении приходит, сам буфер конечно не вывести)... Ну это на ПС, уж низнаю как на вашем ПЛК с визуализацией...

По второму вопросу (опять же на ПиСи), не используемые переменные КДС просто игнарирует и при мониторинге не выводит, важно чтобы переменная хотя бы раз гденить к чемунить присвоилась...

Филоненко Владислав
10.09.2009, 11:08
воспользуйтесь примером. там описан корректный и 100% работающий способ использования порта. зачем придумывать велосипед, тем более не работающий?

Lightning
10.09.2009, 13:17
Crusash
Cпасибо за совет! :)

воспользуйтесь примером. там описан корректный и 100% работающий способ использования порта. зачем придумывать велосипед, тем более не работающий?
Пример я видел и штудировал, но велосипед изобретаю, т.к. хочу сам в тонкостях разобраться. :)

Малышев Олег
10.09.2009, 13:48
главное - что нужно понять функции порта сразу возвращают управление
т.е. закрытие идет до того как программа передала нужный буффер.

Lightning
10.09.2009, 16:48
работает на ура через 4-й порт (дебаг) - все читает и передает.
через 1-й порт - не хочет.
видимо, Com кабель Db9-db9 у меня глючный. :)
всем спасибо за советы.

Lightning
15.09.2009, 15:40
возник еще один вопрос - как можно очистить циклический буфер порта?

Малышев Олег
16.09.2009, 08:36
Видимо чтением(SysComRead)?

Lightning
16.09.2009, 09:37
Видимо чтением(SysComRead)?
Сейчас так и делаю, но думалось, вдруг уже есть стандартная функция... :)
Пришлось написать отдельную функцию ClearBuffer.