PDA

Просмотр полной версии : СПК107 и Lectus. Передача переменных типа Real



Hemann
30.01.2015, 21:47
Коллеги, доброе время суток!

Подскажите пожалуйста, можно ли передавать с СПК107 в Lectus по GPRS переменные типа Real без преобразования в одну или несколько переменных типа WORD? Да и в общем случае, если переменная больше по разрядности чем WORD, как быть при передаче ее с СПК107 по GPRS (через соотнесение переменных в Modbus TCP Slave module)? Разбивать на несколько WORD-типа или есть другой выход?

RV9WFJ
02.02.2015, 09:20
В конечном счете они все равно будут разбиты на регистры(WORDы) согласно протокола ModBus. Тут вопрос в том как это удобнее сделать.

Трофимов Артем
02.02.2015, 10:41
в СПК107 через конфигурацию в дереве проектов лучше сейчас не опираться на передачу данных по TCP,т.к. в ней отсутствует лицензия на данный компонент от Codesys. Вы можете обойти это вложенной библиотекой, либо прописать свой сервер через syssocket.

Hemann
02.02.2015, 13:54
Артем, а в связи с отсутствием лицензии будет рваться связь? Вроде бы форумчанин TANGATAR про такие грабли писал. И, как я понял, все равно придется как-то Real обрабатывать, чтобы получить группу слов типа Word?

Трофимов Артем
02.02.2015, 16:05
из за отсутствия лицензии сервер в СПК проработает пол часа максимум, потом упадёт.
касаемо библиотеки , она также имеет буфер в виде WORDов. т.к. WORD является стандартными типом для передачи Modbus , а REAL не регламентирован там. соответственно придётся конвертить real в два ворда и , присвоив их буферу, передавать мастеру.

Hemann
02.02.2015, 20:20
Артем, а в конфигурации нужно добавлять устройство Ethernet? У меня без него все время ФБ FB_GPRS выдавал через минуту-другую работы ошибку 43. Как поставил это устройство - вроде бы исправилось. Хотя может случайно совпало, т.к. и при подключенном устройстве Ethernet, FB_GPRS разик в ту же ошибку 43 выпадал

energvk
02.02.2015, 21:15
из за отсутствия лицензии сервер в СПК проработает пол часа максимум, потом упадёт.
касаемо библиотеки , она также имеет буфер в виде WORDов. т.к. WORD является стандартными типом для передачи Modbus , а REAL не регламентирован там. соответственно придётся конвертить real в два ворда и , присвоив их буферу, передавать мастеру.

То есть такой халявы как в плк1хх в спк уже нет (в конфигурации поставил тип флоат и фсё, гоняй себе их туда-сюда)? Теперь раскладывать/складывать в ворды при передаче/приеме? Эххх... И dword'ы ж ещё...

capzap
02.02.2015, 21:18
То есть такой халявы как в плк1хх в спк уже нет (в конфигурации поставил тип флоат и фсё, гоняй себе их туда-сюда)? Теперь раскладывать/складывать в ворды при передаче/приеме? Эххх... И dword'ы ж ещё...

а что указателем обратится на первый ворд четыырехбайтной переменной модбаса не приходило в голову?

energvk
02.02.2015, 22:05
Почему не приходило? приходило

capzap
02.02.2015, 22:29
Почему не приходило? приходило
и что не получается в таком случае?

energvk
02.02.2015, 23:26
ну...лишний код :rolleyes:

Ilych
02.02.2015, 23:28
А я что-то торможу уже к вечеру. Одна переменная типа Real спокойно передается в Лектус, т.к. просто на вход данных функционального блока просто подаем указатель на эту переменную, а на вход количества данных просто размер переменной. А вот 2,3 и больше переменных передавать нужно, как я понимаю, с помощью формирования массива данных? Что-то у меня не получилось этот массив создать с помощью побайтного копирования-компилятор ругается.
пытался сделать нечто следующее:
VAR
e,f: real;
pt: pointer to byte;
my_array: array[1..8] of byte;
END_VAR
pt:=adr(e);
my_array[1]:=pt^;
my_array[2]:=(pt+1)^;
...
...
pt:=adr(f);
my_array[5]:=pt^;
my_array[6]:=(pt+1)^;

Ну и т.д.
Может я совсем затупил? Подтолкните в нужном направлении...

capzap
02.02.2015, 23:53
бред какой то, нет возможности сейчас на трешке показать, в дереве регистров именуете всё через раз, а далее как на картинке просто присваиваете и всё, зачем на байты то всё "бить"



ЗЫ улыбнуло про лишний код, где он?

energvk
03.02.2015, 01:20
Как это где? На картинке справа. Если ставить не 2 байта, а флоат, то он не нужен

capzap
03.02.2015, 07:24
Как это где? На картинке справа. Если ставить не 2 байта, а флоат, то он не нужен

покажите тогда скрин в третьем КДС, как Вы ставите там реалы

energvk
03.02.2015, 08:33
В третьем ещё не приходилось, только планирую в нем работать

Трофимов Артем
03.02.2015, 10:19
ошибка 43 - это ошибка библиотеки, не удалось пропинговать через драйвер серверный IP адрес ( по умолчанию DNS Google поставил = 8.8.8.8 ).
модуль Ethernet в проекте никаким образом не влияет на на эту ошибку.
по разбитию и слиянию флоатов повторю вложением. импортируйте в проект и собирайте/разбирайте.

Hemann
03.02.2015, 11:01
Артем, спасибо! А насчет ошибки я уже понял, что это проделки связи. Попозже к вечеру связь стала устойчивой и я гонял переменные по GPRS больше часа. Но вот еще что заметил: если FB_GPRS доходит до 43-ей ошибки (про другие не знаю) и на нем выставляется Restarting, то все - больше GPRS не перезапустишь, только передергивание питания помогает. Может там в FB_GPRS какую-то переменную нужно сбросить? Или я чего-то не так делаю? Или это проделки оператора (в чем крайне сомневаюсь)?

Hemann
03.02.2015, 11:23
Вот, нашел в ветке "СПК107+ПМ01" обсуждение аналогичной проблемы с FB_GPRS. Возникли вопросы:
вообще рестарт - это :
1) закрытие всех процессов в линуксе связанных с GPRS
А как это сделать из программы?
2) проверочное завершение звонка для модема и перевод в режим приёма АТ команд.
Это дождаться пока на выходе FB_GPRS.Done появится FALSE?
3) переподключение.
Это, как я понимаю, опять подать на FB_GPRS.Enable:=TRUE и дождаться на FB_GPRS.Done появления TRUE?
Несколько смутило: на крайний случай, можете снять флаг Enable. подождать секунд 10, свести на пару секунд ( пока библиотека проверит стартовые компоненты в системе) , далее снять, выдержать паузу завершения всех процессов пункта 1 и 2. начать заново. . Дело в том, что Enable переводил в False и ждал достаточно долго. А вот дальше не совсем понял что это значит? Флаг Enable снимаем, далее что свести на пару секунд? Или это взвести флаг Enable на пару секунд? Если так, то остальное становится понятно.

Трофимов Артем
03.02.2015, 11:51
Вот, нашел в ветке "СПК107+ПМ01" обсуждение аналогичной проблемы с FB_GPRS. Возникли вопросы:
вообще рестарт - это :
1) закрытие всех процессов в линуксе связанных с GPRS
А как это сделать из программы?
лучше не стоит, т.к. закрытие процессов делал цикличным до достижения результата. а так - библиотека sysexecute для работы с консолью linux.
2) проверочное завершение звонка для модема и перевод в режим приёма АТ команд.
Это дождаться пока на выходе FB_GPRS.Done появится FALSE?
правильно.
3) переподключение.
Это, как я понимаю, опять подать на FB_GPRS.Enable:=TRUE и дождаться на FB_GPRS.Done появления TRUE?
Несколько смутило: на крайний случай, можете снять флаг Enable. подождать секунд 10, свести на пару секунд ( пока библиотека проверит стартовые компоненты в системе) , далее снять, выдержать паузу завершения всех процессов пункта 1 и 2. начать заново. . Дело в том, что Enable переводил в False и ждал достаточно долго. А вот дальше не совсем понял что это значит? Флаг Enable снимаем, далее что свести на пару секунд? Или это взвести флаг Enable на пару секунд? Если так, то остальное становится понятно.

именно про стартовый флаг на Enable я и говорю. управляется запуск именно по нему. по заднему фронту этой переменной инициализируется алгоритм останова всех процессов библиотеки, по завершению которых done становится false.
по поводу флага restarting. видимо этот момент я пропустил (когда не удаётся подсоединиться он не сбрасывается, а лишь выдаётся ошибка 43 (учтём для релиза и подправим))

energvk
03.02.2015, 12:03
А когда планируется релиз то?

Hemann
03.02.2015, 16:15
Артем, вот еще какой вопрос возник по библиотеке Modbus TCP Slave. А сколько экземпляров ФБ MB_TCP_SERVER можно использовать в программе с одним GPRS-каналом?

Трофимов Артем
04.02.2015, 09:42
energvk - на этот вопрос ответ я дать не могу.
Hemann - ограничтесь 10 экземплярами на разных портах - этого достаточно?

Hemann
04.02.2015, 19:25
Hemann - ограничтесь 10 экземплярами на разных портах - этого достаточно?
Да, пойдет вполне, просто я думал что можно использовать только один экземпляр и тогда придется всякие изыски применять для формирования в буфере нужного набора данных

Hemann
05.02.2015, 10:06
Теперь возник вопрос по самому Lectus. Сразу скажу, что у меня демо-версия, может этим все проблемы и объясняются. Ну а сама проблема в следующем: когда связь по GPRS неустойчива (я это вижу с помощью ping ххх.ххх.ххх.ххх -t), то после каждого обрыва связи, при ее восстановлении, приходится останавливать опрос в Lectus'е и снова его запускать (с помощью кнопки "Стоп" (2 вертикальные палочки)/"Пуск" (треугольничек)). Никакого ОРС-клиента к Lectus'у у меня не подвязано, т.е. обмен данными я смотрю прямо в Lectus'овской оболочке. Вопрос: где тут грабли и как с ними бороться?

Трофимов Артем
05.02.2015, 10:18
зайдите в настройка - параметры - время возобновления опроса
16588

Hemann
06.02.2015, 12:29
Понял, спасибо!