IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> компилятор GX IEC Mitsubishi Electric, оператор IF съедает системные метки
m_by
сообщение 4.06.2009 - 16:19
Сообщение #1


Гигант мысли
****

Группа: Пользователи
Сообщений: 252
Регистрация: 15.11.2007
Пользователь №: 6407



GX IEC v7.01

Пример.
проверка w1 [INT] на 0 и установка переменной [b1] BOOL в состояние TRUE.

На языке LD:
LD= w1
k0
SET b1

На языке ST:
IF w1=0 THEN b1:=TRUE; END_IF;
компилируется как
LD<> w1
k0
CJ P30
LD b1
OUT b1
P30

Как написать код для данного примера на ST, что-бы при компиляции не использовалась системная метка? Или как заставить компилятор не использовать в Данном случае системную метку? Желательно не нарушать стандарт IEC, т.е. не использовать макрокод.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Sergei Troizky
сообщение 5.06.2009 - 01:40
Сообщение #2


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



Приведенный откомпилированный код не соответствует вышеприведенным LD и ST фрагментам.
А вообще, непонятно, в чем проблема? Меток не хватает?
Что код из компилятора неоптимален, и так понятно.


--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
m_by
сообщение 5.06.2009 - 09:34
Сообщение #3


Гигант мысли
****

Группа: Пользователи
Сообщений: 252
Регистрация: 15.11.2007
Пользователь №: 6407



LD фрагмент, в силу отсутствия графического построителя, не привожу, а только откомпилированый код.
ST фрагмент, у меня, откомпилировался именно так как.
LD фрагмент - принимаю за эталон, к которому должен стремиться после компиляции код из ST фрагмента.
Меток хватает (необходимо 60 - 70), но это в GX Developer, а обилие условных рассчётов, которые проще и нагляднее на ST, съедают оставшиеся метки и требуют ещё ...
По поводу неоптимального кода - для FX3U вполне приемлимо, а вот для FX2N - действительно беда.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Sergei Troizky
сообщение 5.06.2009 - 20:20
Сообщение #4


Гигант мысли
****

Группа: Пользователи
Сообщений: 377
Регистрация: 30.12.2004
Пользователь №: 108



Приведенный откомпилированный код:
LD<> w1 k0
CJ P30
LD b1
OUT b1
P30
соответствует ST коду: IF w1=0 THEN b1:=b1; END_IF;

Если так компилируется ST код: IF w1=0 THEN b1:=TRUE; END_IF;
я бы поостерегся пользоваться таким компилятором.

P.S. А на кой Вам этот ST? Ladder необходим и достаточен для работы с любым PLC.

P.P.S. А попробуйте b1:=(b1 OR (w1=0)), если такая конструкция допустима в IEC.

Сообщение отредактировал Sergei Troizky - 5.06.2009 - 20:34


--------------------
Делать надо сразу хорошо. Плохо само получится.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
m_by
сообщение 8.06.2009 - 10:44
Сообщение #5


Гигант мысли
****

Группа: Пользователи
Сообщений: 252
Регистрация: 15.11.2007
Пользователь №: 6407



IF w1=0 THEN b1:=TRUE; END_IF; именно так и компилируется ... увы

Вычисления в Ladder на IEC ... - не могу привыкнуть, совершенно не наглядно, другое дело на ST

а решение для строки выглядит как
set_m((w1=0),b1); - что корректно компилируется
или
out_m((w1=0),b1);

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

Сообщение отредактировал m_by - 8.06.2009 - 10:54
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
vicha15
сообщение 27.10.2009 - 19:00
Сообщение #6


Читатель
*

Группа: Пользователи
Сообщений: 18
Регистрация: 21.10.2009
Пользователь №: 9181



Да засада с этими метками,пишу код жму компиляцию,а он выдает,не хватает меток...
Конечно можно использовать конструкцию set_m(x,y),но думать надо совсем по другому,да и после привычной then сколько хочешь операторов используй,а с set_m только один остальные надо присвоением устанавливать,или есть более оригинальное решение?
попробую поставить вопрос - есть вход х1,и пять выходов Y1...Y5,используя set_m делаю так
set_m(x1,y1);
y2:=y1;y3:=y1;y4:=y1;y5:=y1; - как то некрасиво это,как можно сделать оригинальней?

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
m_by
сообщение 28.10.2009 - 10:43
Сообщение #7


Гигант мысли
****

Группа: Пользователи
Сообщений: 252
Регистрация: 15.11.2007
Пользователь №: 6407



например (для данного частного случая) ... :-)
wand_3_m(X1,K2Y0,31,K2Y0);
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
vicha15
сообщение 28.10.2009 - 16:24
Сообщение #8


Читатель
*

Группа: Пользователи
Сообщений: 18
Регистрация: 21.10.2009
Пользователь №: 9181



Ух ты! Здорово!
Конструкцию вида K2Y0 нигде не встречал кроме как в Mitsubishi,
действительно получается оригинально,но в Online в "теле кода" будет не явно видно,какой выход сработал...
и к сожалению это "частный случай",но в нескольких местах можно применить...

m_by не перестаю удивляться Вашей изощренности в написании кода на ST...
я уже стал сомневаться,что до конца смогу весь проект на ST сделать...
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
m_by
сообщение 29.10.2009 - 10:24
Сообщение #9


Гигант мысли
****

Группа: Пользователи
Сообщений: 252
Регистрация: 15.11.2007
Пользователь №: 6407



... только немного поспешил ... wand - ет для моего решения другой задачи ...
вам нужен wor_3_m(X1,K2Y0,62,K2Y0); , иначе Y5...y7 сбросятся
31d=00011111b
62d=00111110b

использую обе конструкции:
wor - для установки произвольного бита
wand - для сброса произвольного бита
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 24.04.2024 - 04:20