форум асутп
 На главную                       Здесь может быть Ваша реклама, подробнее...


 Наверх  |  Перейти к теме  |  Поиск  |  Вход  |  Дерево    
 функция write_var() в среде PL7
Автор: ditalent 
Дата:   18.08.16 05:03

Всем привет!

Передаю инфу от одного ПЛК к другому.
Использую функцию
WRITE_VAR(#ADR_SYS, '%MW' adr_destination, count_send, start_registr:count_reg, ADR_REG:4);

Данные нормально передаются!
Но хотелось бы понять, что означает последний параметр и как им пользоваться.
Пока ставлю туда адрес любого свободного регистра и при передаче наблюдаю там череду меняющихся разнообразных значений.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   18.08.16 12:21

Добрый день!

Это достаточно важные параметры, чтобы воспринимать их как "череду меняющихся разнообразных значений".

В help посмотрите Common communication function - Communication functions - General points - Management Parameter Structure.

Первое слово  в старшем байте содержит порядковый номер обмена (в hex),  младшем байте младший бит - бит активности функции.

Второе слово в старшем байте содержит Operation report, в младшем - Communication report (в hex). Если передача успешна, то оба байта равны нулю. Если есть ошибки, то на следующей странице help расписаны коды ошибок.

Первые два слова управляются системой, мы их только читаем.

Третье слово - timeout в 0,1 сек. Если, например, используется связь по Modbus TCP, то при равенстве этого параметра нулю при переподключении сетевого разъёма RJ45 связь не восстановится. Поэтому обычно ставится 50 в третье слово ПЕРЕД вызовом функции.

Четвёртое слово содержит длину посылки в байтах.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   19.08.16 04:04

Благодарю, Сергей!
Прояснили смысл.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   13.10.16 05:38

Помогите, кто-нибудь! Ничего не могу понять!

Три TSX соединены по FIP-WAY  Нажатие кнопки на первом, должно включать лампочки на втором и третьем.
Функции отправки комманды одинаковые, но на втором лампа включается, а на  третьем - нет.

IF RE %I1.5
THEN IF %M15
THEN RESET %M15;
ELSE SET %M15;END_IF;
END_IF;

IF RE %M15 OR FE %M15
THEN %MW0:X0:=%M15;
WRITE_VAR(ADR#{1.1}SYS,'%MW',0,1,%MW0:1,%MW320:4);
WRITE_VAR(ADR#{1.2}SYS,'%MW',0,1,%MW0:1,%MW324:4);
END_IF;

При чём, даже не нажимая кнопку, наблюдаю частое (3-4 раза в сек) изменение значений в %MW324 и в %MW325

в MSB %MW324 даже значения не успеваю записать
в LSB %MW324 два меняющихся варианта(178 и 179) - то есть бит активности функции то есть, то нет

в MSB %MW325 постоянно 0 - то есть Operation report = Positive result
в LSB %MW325 два меняющихся варианта(0 и 11) - то есть Communication report = "Exchange successful" или "No processor system resources"

В программе эти номера регистров нигде больше не используются

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   13.10.16 07:22

Добрый день!
1. Начните с того, что сделайте вызов каждой функции по отдельности. Нужно убедиться, что по отдельности сделаны верные настройки и ПЛК друг друга видят.
2. Если по отдельности функция какая-то даёт ошибку - нужно искать: физика, настройки каналов, проверка адресов и синтаксиса.
3. Если по отдельности всё хорошо, но вместе идут ошибки - сделайте очередь. Сперва одну функцию,затем вторую. Использовать можно или бит активности, или временное разделение.
4. Логика по %M15 для меня непонятна.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   13.10.16 10:33

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

И пока это выяснял, увидел что быстро меняющийся MSB, на самом деле просто оч.быстро увеличивается.
Я ввёл доп.строчку INC %M353 сразу после WRITE_VAR и увидел, что новая переменная оч.быстро инкрементируется.

Возможно всё именно в %M15, но где там ошибка - я не пойму.

Смысл у М15 такой:
Кнопка без фиксации сидит на %I1.5
При одном нажатии лампа включится, при другом - погаснет.
Если происходит ризинг кнопки, то инвертирую флаг М15
Если флаг инвертировался, то его значение переношу в %MW0:X0 и передаю %MW0 по FIP-WAY

Но сейчас условие IF RE %M15 OR FE %M15 выполняеися почему-то всегда
В итоге WRITE_VAR работает без остановки, постоянно передавая одно состояние
 :-(

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   14.10.16 12:24

Дело в том, что для корректной работы фронтов нужно сделать промежуточное присваивание в переменную типа EBOOL, а фронт брать уже у промежуточного бита.

Выглядеть это должно примерно так:
%M16 := %I1.5;(*промежуточный бит*)
IF RE %M16 OR FE %M16 THEN
%M15:=NOT %M15;
END_IF;

%M17:=%M15;(*промежуточный бит*)
IF RE %M17 OR FE %M17 THEN
%MW0:X0:=%M15;
WRITE_VAR(ADR#{1.1}SYS,'%MW',0,1,%MW0:1,%MW320:4);
END_IF;

Кстати, на всякий случай - в FIPWAY есть и другие способы обмена (Common Words, Shared Table). Смотрите документацию на сайте SE

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   25.10.16 05:26

сделал без промежуточного присваивания фронтов: всё теперь хорошо!

IF RE %I1.5
THEN %M15:=NOT %M15;
     %MW0:X0:=%M15;
     WRITE_VAR(ADR#{1.1}SYS,'%MW',0,1,%MW0:1,%MW320:4);
     WRITE_VAR(ADR#{1.2}SYS,'%MW',0,1,%MW0:1,%MW324:4);
     WRITE_VAR(ADR#{1.3}SYS,'%MW',0,1,%MW0:1,%MW328:4);
END_IF;

Оказывается все четыре слова каждого Reporta нужно обнулять при инициализации программы, а я их не трогал, потому что в документации написано что первые два слова система заполняет сама. Но сама она их заполняла каким-то мусором...

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   17.11.16 04:03

При нажатии кнопки на центральном контроллере, на левом и правом включаются лампы.
При отпускании - выключаются.
Всё нормально работает, если нажатие спокойное.
Но если нажатие - это кратковременное и резкое касание, то лампы остаются включёнными!
И это происходит со всеми кнопками.
Почему так? Помогите!


=================================================================================
(* SEND DISCRETS_INPUTS *)

%MW0:X0:=%I1.0;
%MW0:X1:=%I1.1;
%MW0:X2:=%I1.2;

IF %MW2<>%MW0 // если состояние входов сменилось
AND NOT %MW300:X0 AND NOT %MW304:X0 // и предыдущая отправка не активна
THEN REPEAT // то начинаем отправку сообщений, пока...
%MW2:=%MW0; // запомним отправляемое состояние
WRITE_VAR(ADR#{1.1}SYS,'%MW',0,1,%MW0:1,%MW300:4); // левому
WRITE_VAR(ADR#{1.2}SYS,'%MW',0,1,%MW0:1,%MW304:4); // и правому
UNTIL %MW305=0 AND %MW301=0 END_REPEAT; // ...пока не отправим без ошибок
END_IF;
=================================================================================

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   17.11.16 08:05

Попробуйте мой вариант.
В цикле до сих пор ни разу не видел использования READ/WRITE VAR.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   17.11.16 08:40

Попробовать Ваш вариант... Это о промежуточном бите?
Если о нём, то ту проблему я решил ещё месяц назад, обнулением байт репорта во время инициализации контроллера при старте программы.

А теперь-то другая проблема.
А цикл я вставил потому, что без него не работало.
Я и думал что может цикл мне поможет.
Но он не помог.

Думаю есть вариант опрашивать кнопки пару раз в секунду и отправлять сообщения о их статусе с такой же частотой. Работать скорее всего будет, но как-то это не совсем правильно: будут полусекундные задержки на отклик

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   18.11.16 22:03

Смотрели другие способы обмена (Common Words, Shared Table)?

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   21.11.16 03:22

смотрел другие методы, ничего не понял...
да и правильней было бы с этим разобраться

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

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   21.11.16 04:31

сделал опрос кнопок 3 раза в секунду и при изменении отправляю сообщение
не помогло...

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   21.11.16 21:53

Выложите проекты *stx и укажите физическую архитектуру (что и как именно подключено по FIP-way).
Сформулируйте точно задачу, а то вводные меняются))
Попробуем разобраться с FIP-овскими специфическими способами обмена.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   22.11.16 09:14

Благодарю, Сергей, что не оставляете меня.

Файлы проекта, вид архитектуры и описание ошибки я отправил на файлообменник

http://www.fayloobmennik.net/6720249

пароль для скачивания архива: 5720

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   23.11.16 01:09

Примем, что KP - арбитр шины и адрес на его карте FPP20 выставлен {1.0}.
KA_SLAVE_1 -  адрес на FPP20 {1.1}.
KA_SLAVE_2 -  адрес на FPP20 {1.2}.

Запишем состояния кнопок в сетевое слово на мастере %NW{1.0}.

После чего прочитаем его на узлах  {1.1} и  {1.2} из сетевого слова %NW{1.0}.

Надеюсь, что физическая реализация FIPWAY сделана в соответствии с рекомендациями SE - ответвительные коробки, терминаторы на концах линии и т.д., а не как на присланном рисунке))

http://www.fayloobmennik.net/6721647

Пароль 5720

Три проекта - ка, slave1, slave2.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   23.11.16 05:52

Офигенная технология Common Words, Сергей!
Всё заработало, как надо!

Только вот непонятно зачем тогда нужна старая сбойная WRITE_VAR ?

И ещё: Есть ли смысл сначала побитно заполнять промежуточный байт %MW0, а потом копировать его в сетевой ?
%NW{1.x}0 := %MW0;

может сразу напрямую:   ?
%NW{1.x}0:X0 := %I1.0;
%NW{1.x}0:X1 := %I1.1;
%NW{1.x}0:X2 := %I1.2;

Ну и на приёмной стороне без промежуточных присваиваний
IF %NW{1.x}0:X0 THEN ...

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   23.11.16 09:39

Думаю, что  WRITE_VAR использовали те, кто поленился изучить документацию по специфике FIPWAY))
Я-то на SE документы почитал и попробовал один из рекомендованных способов обмена.

Использование  WRITE_VAR тоже имеет особенности и она не сбойная - думаю,при вызове в цикле переполнялся буфер, поэтому и такое поведение было.

Да, можно попробовать напрямую сразу, т.к. запись-чтение промежуточные могут "съесть" лишний цикл-другой ПЛК.

Удачи!

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: ditalent 
Дата:   23.11.16 11:06

Спасибо, Сергей!

Начав переписывать программу, я выявил недостаток технологии %NW
Оказывается размер общих сетевых данных ограничен четырьмя байтами на каждый сетевой адрес.
То есть имея в своей конфигурации три контроллера, я могу использовать только 12 слов:
%NW{1.0}0     %NW{1.1}0     %NW{1.2}0
%NW{1.0}1     %NW{1.1}1     %NW{1.2}1
%NW{1.0}2     %NW{1.1}2     %NW{1.2}2
%NW{1.0}3     %NW{1.1}3     %NW{1.2}3

А мне нужно больше. Поэтому придётся комбинировать технологии:
Состояние дискретных входов, на которые нужно быстро реагировать, обрабатывать через %NW{1.x}
А массивы данных пересылать с помощью WRITE_VAR


P.S.
Наверное для записи сетевого слова, всё-таки лучше использовать промежуточный байт.
Так как при изменении даже одного бита в сетевом слове, скорее всего приводит к скрытому внутри технологии процессу пересылки этого слова между устройствами сети. Поэтому пока я в нём буду 16 бит менять, слово это 16раз будет сеть дёргать. (НАВЕРНОЕ ТАК)
А вот читать можно напрямую.

Адрес этого сообщения    Ответить на это сообщение
 
 Re: функция write_var() в среде PL7
Автор: Огородников Сергей 
Дата:   23.11.16 15:31

>>Оказывается размер общих сетевых данных ограничен четырьмя байтами на каждый сетевой адрес.
>>То есть имея в своей конфигурации три контроллера, я могу использовать только 12 слово

Четыре СЛОВА (не байта) на каждый адрес, а это 64 бита на станцию.

Я ж спрашивал про вводную, а она в очередной раз меняется...

Посмотрите внимательно на Shared table - организация публикуемых данных с одного ПЛК на другие.
В документации примеры описаны. Если не получится с Shared table  - только тогда возвращайтесь к использованию WRITE_VAR.

Адрес этого сообщения    Ответить на это сообщение
 Список форумов    


 Список форумов  |  Нужен логин? Регистрируйтесь здесь 
 Логин пользователя
 Имя пользователя:
 Пароль:
 Помнить пароль:
   
 Забыли ваш пароль?
Введите имя пользователя или e-mail, и новый пароль будет послан на email, указанный в вашем профиле.

Рейтинг@Mail.ru