PDA

Просмотр полной версии : Вопрос по биб-ке ComService



Boris_K
20.02.2014, 14:02
Не понятно что делает вход Enable у функционального блока COM_SERVICE. Сам экземпляр блока вызывается так: имяэкземпляра(Enable:=TRUE, Settings:=Settings1, Task:=OPEN_TSK); входу Settings передаётся структура с настройками порта, входу Task - код действия, которое надо сделать с портом. Единственный выход блока Ready собсно и показывает, открылся ли порт после вызова.

Нигде не закомментировано, хелпа к биб-ке нет, скачал пример работы с биб-кой SysLibCom (где также используется ComService), там есть документ Описание, но тоже ничего не сказано. То, что входу Enable присваивают истину, когда стучатся в порт, и ложь если порт ещё не открыт - понятно, но какой смысл у этого входа? По идее надо бы просто указать что делать с портом (открыть/сменить настройки/закрыть) - вход Task и каковы будут настройки - вход Settings. И считать результат с выхода Ready... Буду рад если кто прояснит.

XopHeT
20.02.2014, 15:12
Не понятно что делает вход Enable у функционального блока COM_SERVICE. Сам экземпляр блока вызывается так: имяэкземпляра(Enable:=TRUE, Settings:=Settings1, Task:=OPEN_TSK); входу Settings передаётся структура с настройками порта, входу Task - код действия, которое надо сделать с портом. Единственный выход блока Ready собсно и показывает, открылся ли порт после вызова.

Нигде не закомментировано, хелпа к биб-ке нет, скачал пример работы с биб-кой SysLibCom (где также используется ComService), там есть документ Описание, но тоже ничего не сказано. То, что входу Enable присваивают истину, когда стучатся в порт, и ложь если порт ещё не открыт - понятно, но какой смысл у этого входа? По идее надо бы просто указать что делать с портом (открыть/сменить настройки/закрыть) - вход Task и каковы будут настройки - вход Settings. И считать результат с выхода Ready... Буду рад если кто прояснит.

Вы хоть сами пробовали этот сумбур прочитать?
Ваш экземпляр ФБ будет вызываться в каждом цикле ПЛК, а если Вам сейчас ничего не нужно с портом делать просто подаете на вход Enable ложь, и у Вас ФБ не будет выполняться.
Enable:=true - ФБ выполняется, Enable:=False - ФБ не выполняется. Вот и всё. Стоило ли тему создавать?

Boris_K
20.02.2014, 15:26
Где именно сумбур? Ткнуть пальцем.


Ваш экземпляр ФБ будет вызываться в каждом цикле ПЛК Этот блок создан только для открытия/закрытия/перенастройки порта, то есть вызывается в единичных случаях. Как я понял, этот вход у блока добавлен просто для адаптации под графические языки. А я пишу на ST, и сам контролирую, когда мне вызывать этот блок (с помощью условного оператора). То есть на ST в этот вход мне надо просто тупо писать TRUE когда вызываю этот блок.

XopHeT
20.02.2014, 15:43
Где именно сумбур? Ткнуть пальцем.

Этот блок создан только для открытия/закрытия/перенастройки порта, то есть вызывается в единичных случаях. Как я понял, этот вход у блока добавлен просто для адаптации под графические языки. А я пишу на ST, и сам контролирую, когда мне вызывать этот блок (с помощью условного оператора). То есть на ST в этот вход мне надо просто тупо писать TRUE когда вызываю этот блок.

Ну вот, немного мозг напрягли, и уже все понятно. Стоило сразу так сделать.
Но только капитан очевидность намекнет, что и в графическом ЯП пользователь самостоятельно может решить будет ли выполняться блок, или нет. Нужно только немного мануалов почитать.
Этот вход сделали для тех, кто мануалы не читает, и этого не знает.

Ну всё, кэп помог, кэп улетает.

Boris_K
20.02.2014, 16:04
Я впервые работаю с портом напрямую, да и в Кодесис недавно. Поэтому Кэп тут слаб.

Boris_K
20.02.2014, 16:38
Удалось открыть порт RS-232, только он открывается всегда примерно через полсекунды после первого вызова блока, то есть проходит примерно 100 циклов ПЛК (и блок "стучится" в порт каждый цикл, пока порт не откроется). В описании так и написано, но с чем это связано, это норма?

capzap
20.02.2014, 16:41
Удалось открыть порт RS-232, только он открывается всегда примерно через полсекунды после первого вызова блока, то есть проходит примерно 100 циклов ПЛК (и блок "стучится" в порт каждый цикл, пока порт не откроется). В описании так и написано, но с чем это связано, это норма?

Вы сейчас издеваетесь что ли? Откройте библилтеку и посмотрите из чего она состоит, непонравится напишите свою. Эта бибка писалась с руководства по syslibcom

Boris_K
20.02.2014, 19:44
Наверное это вы издеваетесь. Библиотека закрыта (после названия крестик стоит), при попытке открыть её POU - сообщение о запрете. Я могу видеть только её раздел описаний, типы данных, и блоки с входами/выходами (там один блок), а сам код - нет.

Была мысль изначально послать эту биб-ку и работать только по syslibcom, вроде ненамного сложнее. Просто в примерах везде эта comservice присутствует, и ещё не понятно что там ставить в некоторые параметры порта (которые в comservice отсутствуют), и нигде нет подробного описания этих параметров.

capzap
20.02.2014, 19:50
вот, что оказывается выделяет проффесилоналов от остальных, наличие крестика :)





ЗЫ каким интересно образом Вы вычислили что проходит сто циклов

Boris_K
20.02.2014, 19:54
Вы наверное не поняли. Мне не давало просматривать её код, появлялось сообщение о том что данное действие запрещено.


ЗЫ каким интересно образом Вы вычислили что проходит сто циклов Самым элементарным. MinCycleLength = 5 мс, значит за секунду проходит 200 циклов, а за полсекунды - 100. Странно что вы такой вопрос задаёте.

capzap
20.02.2014, 20:03
ну я Вам даю посмотреть окно, какие проблемы, а еще можно взять руководство по syslibcom, то можно самому открывать порт в зависимости от своих хотелок



ЗЫ как правильно заметили 5мс это минимальное время цикла, а какой он на самом деле сложно сказать, главное что не превышает максимальное время

Boris_K
20.02.2014, 20:13
ЗЫ как правильно заметили 5мс это минимальное время цикла, а какой он на самом деле сложно сказать, главное что не превышает максимальное время Это верно, но я тестировал по таймеру, проверял за сколько мс каждый цикл проходит. Отклонения КРАЙНЕ редки (и малы по величине), во всяком случае с простой программой, которая там сейчас.


ну я Вам даю посмотреть окно, какие проблемы, а еще можно взять руководство по syslibcom, то можно самому открывать порт в зависимости от своих хотелок да вижу, может другая версия биб-ки, я свою брал с диска от ПЛК (какая там сейчас не скажу, всё на работе). Насчёт syslibcom, повторю, что отпугнули несколько неизвестных параметров настройки порта, которые толком не описаны в руководстве.

Boris_K
21.02.2014, 10:54
Странный какой-то код в этой биб-ке. Там переменная Delay увеличивается на 1 каждый раз при вызове блока, и используется остаток от её деления на 100, который сравнивается с 0, и только тогда происходит собственно открытие порта. То есть она должна увеличиться до 100, прежде чем этот блок "зашевелится". Этим как раз и объяснялась задержка в 100 циклов. Это для того чтобы не обращались к порту слишком часто?

capzap
21.02.2014, 11:09
Это надо у автора спросить :)

Валенок
21.02.2014, 11:54
Насчёт syslibcom, повторю, что отпугнули несколько неизвестных параметров настройки порта, которые толком не описаны в руководстве.
А абсолютно те же параметры для ComService типа не пугают ))))

Boris_K
21.02.2014, 12:38
А абсолютно те же параметры для ComService типа не пугают Для комсервис нет того расширенного набора параметров, к тому же там хоть написано было что нули проставить в оставшиеся 2 непонятных параметра. И во всех примерах комсервис использовался. Но увидев код этого комсерсис понял что лучше послать его подальше и делать только через сислибком.

Я загуглил те аббревиатуры в доп. параметрах, нашёл описания, это дополнительные сигналы которые передаются по другим контактам разъёма (в простейшем случае используются только 2й 3й и 5й), для многих приборов эти сигналы не нужны.

Валенок
21.02.2014, 13:10
Наверное порадует, что счетчик тот .. не уперся. Просто в разных циклах. А цикл здесь и в 0мс прокатывает.

Boris_K
23.02.2014, 19:40
По поводу этого "крестика". Не знаю, в чём дело. Скачал с сайта Кодесис, скачал с сайта же ComService, при попытке открыть её функц. блок, вот такая хрень вылазит:

12054

capzap
23.02.2014, 19:52
Осталось Вам изучить как правой кнопкой мыши пользоваться :)

Boris_K
23.02.2014, 19:54
ОК, понял, надо в свойствах права доступа выставить. Прошу прощения. Не знал.

Boris_K
24.02.2014, 15:15
Вот ещё не понятна одна вещь. В руководстве к SysLibCom написано, что все функции для чтения/записи/закрытия порта должны принимать дескриптор порта (который был возвращён функцией SysComOpen при открытии порта). А на деле во всех примерах вместо дескриптора просто подставлен номер порта (тип PORTS), а на значение, возвращаемое функцией SysComOpen, просто забивают. И биб-ка ComService тоже не выдаёт никакого дескриптора. Получается, в руководстве ошибка, и обращение к порту идёт тупо через его номер.

capzap
24.02.2014, 15:23
А что, принять тот факт, что дескриптор совпадает с номером порта, неполучается?

Boris_K
24.02.2014, 16:31
Если честно, не очень, хотя бы потому, что дескриптор должен возвращаться функцией. И постоянным он быть вовсе не обязан от открытия к открытию. Так в руководстве ошибка?

capzap
24.02.2014, 17:06
Почему это не должен быть постоянным это в документации прочитали? Не путаете с хешем дескриптор

Boris_K
24.02.2014, 18:45
Ну потому что так во всех системах программирования, когда программа получает доступ к какому-то аппаратному ресурсу, файлу на диске и т. д., она работает с его дескриптором, и он почти всегда разный.

capzap
24.02.2014, 18:57
Назовите такую систему программирования, я хоть посмеюсь над создателем

Boris_K
24.02.2014, 19:18
Да хоть С++. Будете смеяться над Бьерном Страуструпом? Уточню (если вдруг мы о разном) - дескриптор в смысле синоним англ. handle, или указатель.

capzap
24.02.2014, 19:27
Хоть файл это и не аппаратное устройство, но File file = new File("path");
Приблизительно во всех одинаково, так file же неизменен, да его экземпляр имеет уникальный хеш но в проге, Вы будете использовать только имя file

Валенок
24.02.2014, 19:44
В принципе тут я соглашусь с Boris_K'ом. Но само возвращаемое значение в данной конкретной системе всегда постоянное.
И на всякий напомню, авторы syslibcom - немцы.

Boris_K
25.02.2014, 11:12
Ещё одна непонятка с этой ComService. После открытия порта она ждёт 100 циклов, а затем применяет к порту настройки с помощью функции SysComSetSettings (из SysLibCom). При этом в руководстве об этой ф-ии написано, что "Возвращает TRUE при успешной установке параметров, иначе FALSE". А в блоке же ComService это возвращённое значение обрабатывается так:

Ready := NOT SysComSetSettings(Settings.Port, ADR(Settings));

И с какого бодуна там стоит NOT? :confused: То есть получается, что при успешной установке параметров выходное значение Ready (которое сигнализирует о полной готовности порта к работе) будет FALSE. А на деле, при работе оно TRUE, мол вроде как всё готово, а выходит что при этом установка параметров прошла неуспешно. Что за бред??

Boris_K
25.02.2014, 20:59
Видать руководство к SysLibCom просто не отражает объективную реальность.

Валенок
25.02.2014, 22:57
У системщиков с dint часто -1 это ошибка, 0 - норма. А вот в логике 0 false, <> 0 true. Наверно где-то тут случился октоберфест
Как-то так:
if (! bool_to_dint(comsetting(..)){проблема с установкой}

Yegor
22.07.2015, 12:42
Сегодня вновь столкнулся с этой SysLibCom. Так получилось, что раньше я работал напрямую только с 485 портом и до сегодняшнего дня не знал, насколько всё плохо на самом деле. Если в двух словах, то документация — враньё.

Началось с того, что я попробовал что-нибудь записать в 232 порт (COM1, порядковый 1). SysComWrite никак не работала, а результат SysComSetSettings я никак не мог понять (да, я знаю про NOT). Оказывается...

SysLibCom на контроллерах Овен вопреки документации вообще не работает с дескрипторами! Везде только номера портов!

Например, SysComOpen возвращает не дескриптор, а всего лишь успех/неудачу. В этом легко убедиться, если попробовать открыть сразу два разных порта — там и там функция вернёт ноль, но дескрипторы двух разных объектов не могут быть одинаковыми. На то они и дескрипторы. В общем, ноль — порт открыт, 16#FFFFFFFF — порт занят (очень похоже на дескриптор, но это не так). То есть по факту это булевая функция. Пользоваться ею надо так: portOpened := SysComOpen(COM1) = 0.

Дальше жирный вывод подтверждается тем, что все остальные функции не работают с «дескриптором», который возвращает SysComOpen. Лишь по случайности они работают для RS-485-1, т.к. он нулевой по порядку, и лже-дескриптор от SysComOpen тоже нулевой. Из-за этого совпадения я заблуждался с 2011 года.

Вот так нужно открывать порты и работать с ними в контроллерах Овен:
PROGRAM PLC_PRG
VAR CONSTANT
port: COMSETTINGS := (Port := COM1, dwBaudRate := 38400);
END_VAR
VAR
portReady: BOOL;
buf: ARRAY [0..512] OF BYTE;
END_VAR


IF NOT portReady THEN
(* Сразу открываем и настраиваем порт *)
portReady := SysComOpen(port.Port) = 0 = SysComSetSettings(port.Port, ADR(port));
ELSE
(* Работаем с открытым портом *)
SysComRead(port.Port, ADR(buf), 1000, 0);
END_IF

А вот так надо открывать порты и работать с ними, если руководствоваться документацией (аккуратно, нерабочий код!):
PROGRAM PLC_PRG
VAR CONSTANT
port: COMSETTINGS := (Port := COM1, dwBaudRate := 1200);
handle: DWORD;
END_VAR
VAR
portReady: BOOL;
buf: ARRAY [0..512] OF BYTE;
END_VAR


IF NOT portReady THEN
(* Сначала открываем порт и получаем дескриптор *)
handle := SysComOpen(port.Port);
(* Теперь настраиваем порт через дескриптор; не забываем про странный NOT *)
portReady := handle <> INVALID_HANDLE AND NOT SysComSetSettings(handle, ADR(port));
ELSE
(* Работаем с открытым портом — тоже через дескриптор *)
SysComRead(handle, ADR(buf), 1000, 0);
END_IFРабота через дескрипторы правильно реализована в SysLibFile — можете посмотреть примеры с ней, функции там похожие.

Вот такая подстава, господа. И напоследок небольшой ликбез по следующему вопросу:
Хоть файл это и не аппаратное устройство, но File file = new File("path");
Приблизительно во всех одинаково, так file же неизменен, да его экземпляр имеет уникальный хеш но в проге, Вы будете использовать только имя fileХеш — вряд ли. Класс File как раз будет обёрткой вокруг дескриптора. Поле со словом handle в имени почти наверняка будет членом этого класса. А дескриптор, в свою очередь, это своего рода номерной билет на доступ к ресурсу, который выдаётся операционной системой. Номер в этом билете может быть любой, и упорядоченность этих номеров никак не гарантируется. Зато гарантируется уникальность в пределах контекста, то есть два файла не могут быть открыты под одинаковыми дескрипторами, и два порта тоже не могут.

Bloodtrail
28.03.2016, 08:12
Не понятно что делает вход Enable у функционального блока COM_SERVICE. Сам экземпляр блока вызывается так: имяэкземпляра(Enable:=TRUE, Settings:=Settings1, Task:=OPEN_TSK); входу Settings передаётся структура с настройками порта, входу Task - код действия, которое надо сделать с портом. Единственный выход блока Ready собсно и показывает, открылся ли порт после вызова.

Нигде не закомментировано, хелпа к биб-ке нет, скачал пример работы с биб-кой SysLibCom (где также используется ComService), там есть документ Описание, но тоже ничего не сказано. То, что входу Enable присваивают истину, когда стучатся в порт, и ложь если порт ещё не открыт - понятно, но какой смысл у этого входа? По идее надо бы просто указать что делать с портом (открыть/сменить настройки/закрыть) - вход Task и каковы будут настройки - вход Settings. И считать результат с выхода Ready... Буду рад если кто прояснит.

А не могли бы документ свой скинуть? А то задача подключить МДВВ к ПЛК 63, с использованием данных библиотек, и очень нужен пример, чтоб понять ход работы.

capzap
28.03.2016, 08:48
А не могли бы документ свой скинуть? А то задача подключить МДВВ к ПЛК 63, с использованием данных библиотек, и очень нужен пример, чтоб понять ход работы.

Откройте ComService как проект и поймете ход его работы, документация на SysLibCom идет на диске к плк

FROST87
01.02.2019, 11:37
А как быть с функцией SysComСlose(HANDLE). Другими словами, как закрыть порт?

LEXIES
04.01.2020, 02:36
Доброго всем здоровья! Гуру программеры, подскажите пож-та, как организовать настройку порта 485 через COM библиотеки для модбаса, но в ЛАДЕРЕ LD, у меня все проги в диаграммах пишутся, для киповцев понятен только он. Или может у кого есть документация по работе с функц. блоками в ЛАДЕРЕ. Ни где не могу найти.

п.с. Работаю без проблем на СИМЕНСЕ, МИТСУБИСИ, ДЕЛЬТА и там в ладере все понятно для модбаса, а тут борода! ПОМОГИТЕ.

capzap
04.01.2020, 08:26
Доброго всем здоровья! Гуру программеры, подскажите пож-та, как организовать настройку порта 485 через COM библиотеки для модбаса, но в ЛАДЕРЕ LD, у меня все проги в диаграммах пишутся, для киповцев понятен только он. Или может у кого есть документация по работе с функц. блоками в ЛАДЕРЕ. Ни где не могу найти.

п.с. Работаю без проблем на СИМЕНСЕ, МИТСУБИСИ, ДЕЛЬТА и там в ладере все понятно для модбаса, а тут борода! ПОМОГИТЕ.
берете пример на ST конвертируете в LD. Одно не пойму, если это надо Вашим киповцам почему не они задают вопрос а Вы?

LEXIES
04.01.2020, 15:31
Автоматику программирую я, а мои киповцы её устанавливают и настраивают; в режиме телефона на удаленных объектах им легче разобраться в ладере или функ. блоках.

Я нашел пример на FBD, чтение и записи регистров. Вроде получилось открыть порт и даже идет запрос с ответом. Но проскакивает ошибка 255
46538

capzap
04.01.2020, 15:37
какие приборы надо опрашивать: чтение, запись и количество слейвов?

LEXIES
04.01.2020, 15:37
берете пример на ST конвертируете в LD. Одно не пойму, если это надо Вашим киповцам почему не они задают вопрос а Вы?

Еще вопрос с ошибками, не пойму где взять расшифровку ошибок фукнц. блока?

LEXIES
04.01.2020, 15:43
какие приборы надо опрашивать: чтение, запись и количество слейвов?

Опрос шаговых драйверов, с дальнейшим управлением ими. Будет всего 4 слейва... Но пока что грызу 1. На его примере сконфигурирую остальные. Тут вопрос порядка действий: как я понял - открыть порт COM_SERVICE - настроить порт COM_SETTINGS - работа с модбасом MB_RD_... or MB_WR_...? И тут пока не разберусь с назначением переменных и привязкой блоков друг к другу.

capzap
04.01.2020, 15:50
т.е. не будет использовано кучи регистров, просто надо подавать задание в слейв с какой скоростью крутиться и все. Тогда можно полностью все упростить, объявить массив с фиксированными значениями адреса устройства и адреса регистра, подставлять только сами данные, вычислять контрольную сумму и вставить ее в нужные индексы массива, а далее отправить этот массив в порт, читать ответку даже не обязательно

LEXIES
04.01.2020, 16:05
т.е. не будет использовано кучи регистров, просто надо подавать задание в слейв с какой скоростью крутиться и все. Тогда можно полностью все упростить, объявить массив с фиксированными значениями адреса устройства и адреса регистра, подставлять только сами данные, вычислять контрольную сумму и вставить ее в нужные индексы массива, а далее отправить этот массив в порт, читать ответку даже не обязательно

По большому счету да, но с одного драйва наду будет читать скорось текущую и состояние дискретного входа: там концевик нулевого положения! Там всего то меняется 6 битов и читается 2 регистра... Для начала хочу открыть порт, считать регистр состояния устройства и дать команду на страт-стоп. На сименсах и дельтах это легко: два блока используют (открыть порт и обращение к устройству *адрес, функц, массив и т.д.), а тут я чет запутался. С модбасом на кодесис впервые!

capzap
04.01.2020, 16:12
почему сперва не попробовать на конфигураторе. Библиотека предпочтительнее в случаях если нужен полный контроль, а в этом случае я так понимаю читать нужно как можно чаще в разумных пределах, запись в редких случаях. Достаточно и конфигуратора будет

LEXIES
04.01.2020, 16:30
почему сперва не попробовать на конфигураторе. Библиотека предпочтительнее в случаях если нужен полный контроль, а в этом случае я так понимаю читать нужно как можно чаще в разумных пределах, запись в редких случаях. Достаточно и конфигуратора будет

Что за конфигуратор? Какие действия, хотя бы вкратце )... Это конфигуратор ПЛК? 4я вкладка

capzap
04.01.2020, 16:52
https://owen.ru/forum/showthread.php?t=13584

LEXIES
04.01.2020, 17:04
https://owen.ru/forum/showthread.php?t=13584

Спасибки, сейчас попробую!

LEXIES
04.01.2020, 17:24
Тут беда в том, что у меня ПЛК63, у него нет такого варианта как МОДБАС МАСТЕР в конфигурации... Там только параметры порта и все.

46539


по сему, мне надо мучится с портами программно... Еще к тому-же он не видит порт - 0, а он и есть 485 :-(

capzap
04.01.2020, 17:26
то что написано красным инвалид, можно внимания не обращать, нумерованные списки начинаются с единицы и ноль туда не вписывается вот и горит как ошибка, но работать будет

https://owen.ru/forum/showthread.php?t=13573

LEXIES
04.01.2020, 19:23
то что написано красным инвалид, можно внимания не обращать, нумерованные списки начинаются с единицы и ноль туда не вписывается вот и горит как ошибка, но работать будет

https://owen.ru/forum/showthread.php?t=13573

Ну вот. Вроде порт я открыл:
46540

Если я правильно все понял?

LEXIES
04.01.2020, 21:27
Ребята, получилось! Спасибо за помощь собеседнику, поддержал морально и советами; В лестничной диаграмме то-же работает не плохо!