IPB

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

3 страниц V   1 2 3 >  
Ответить в эту темуОткрыть новую тему
> ST. Спецификация языка (FX, GX Works 2), Нужна спецификация на все конструкции языка.
uni
сообщение 19.11.2014 - 23:51
Сообщение #1


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Доброго. Начал тут пробовать силы в ST и не могу найти нормального человеческого описания языка. Может у кого есть такое? Именно для FX семейства Mitsubishi, а не сферический конь в вакууме.

Для начала я хотел бы узнать можно ли в программе создать переменную с указанным адресом, т.е. псевдоним для имеющейся переменной (M8002 или D8120), а то мне неудобно делать инициализацию. Есть ли символы для однострочных комментариев, типа // в C++? Как же всё-таки описывать функции?

Код
(* Действия при загрузке. *)
IF M8002 THEN
    
    (* Выполняем инициализацию. *)
    Шаг := 0;
    
END_IF;

(* Автомат состояний. *)
CASE Шаг OF
    
    (* Инициализация. *)    
    0:
        (* Адрес прибора. *)
        Адрес := 0;    
        
        (* Доделать: Вставить табличку скоростей. *)
        
        (* Communication Format Register
        [ Регистр формата соединения ][LX3V]
                   00000000 - Initial Value *)
        D8120 := 2#10100111;
        (*         ||||||||
                   76543210
                   |||||||+- 0:    - Length (0 - 7 bits, 1 - 8 bits)
                   ||||||+-- 1: -+ - Parity (00 - none, 01 - odd, 11 - even)
                   |||||+--- 2: _|
                   ||||+---- 3:    - Stop bit (0 - 1 bit, 1 - 2 bits)
                   |||+----- 4: -+ - Baud rate
                   ||+------ 5:  |
                   |+------- 6:  |
                   +-------- 7: _|
                   *)        
            
        (* Переход на тест индикации. *)
        Шаг := 1;        
        
    (* Тест индикации. *)
    1:;
    
    
END_CASE;
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 20.11.2014 - 02:00
Сообщение #2


Гуру
******

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



Ссылка

Добрый совет:
Язык ST (Structured Text) не привязан к конкретной линейке ПЛК, и это не тот язык, который понимает и поддерживает ПЛК. Если действительно хотите прощупать купленный контроллер и оценить его возможности, то про С-подобные языки лучше забыть и писать программы на родном для контроллера языке.

Сообщение отредактировал inntele - 20.11.2014 - 02:27


--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 20.11.2014 - 08:26
Сообщение #3


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Спасибо. Я тоже думал, что не привязан, но конструкции из другого руководства по ST что-то не пошли (хотел функцию объявить).

Родной для LX3V - это примитивный LAD или STL. Мне нужно работать по протоколу с прибором: считывать и записывать в него набор данных. Слава богу без CRC или иной контрольной суммы. Я написал на STL программку, она работает с прибором, считывая с него данные, но выглядит это убого. Кроме того, я начал путаться в том как включатся и отключаются шаги в программе и, видимо, не только я. GX Works 2 при отладке в онлайне на определённом куске кода зависает, теряя связь с контроллером. И это всего каких-то жалких 10 шагов. Симулятор использовать не могу: контроллер не родной, да и связь с прибором нужна.

Вот я и решил попробовать ST. Мне кажется, что реализация протокола на нём должна быть более читаемой. Кроме того, после небольшого шаманства я заставил GX Works 2 понимать русские идентификаторы для переменных. Это ещё один плюс, также как и комментарии на русском.

Ничего, попробуем возможности ST, сравним две реализации и удобство их сопровождения. Единственный минус тут это то, что китайский контроллер не понимает программу, которая получается после компиляции ST. Там добавляется в конце FEND и он уходит в ERROR. Приходится скачать программу в LAD, чуть подредактировать и заливать обратно.

П.С. После некоторых экспериментов с разными языками и прошивкой их в ПЛК у меня он перестал отвечать. Пока не знаю в чём дело, возможно придётся перешить ему мозги. У китайцев есть программка прошивалка мозгов для CPU. Надеюсь поможет (я уже делал upgrade таким образом для одного ПЛК).
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 20.11.2014 - 11:01
Сообщение #4


Гуру
******

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



STL тоже не язык. Работать в STL непросто, к тому же в Вашей задаче этот способ построения программ не к месту.
Родной язык (Макроассемблер) для ПЛК - это Melsec IL. Читабельность программы же в большей степени определяется использованием символьных имен для переменных и подробностью комментариев. И то, и другое Вам уже удалось русифицировать.
Если нетрудно, поделитесь, что надо предпринять, чтобы имена переменных можно было задавать русскими буквами. Вдруг кому пригодится.


--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 20.11.2014 - 12:24
Сообщение #5


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Не могу сейчас найти ссылки с подробным описанием как это делается, но смысл в общем в следующем. Скачиваете из сети программу Unlocker, она встраивается в проводник при установке (нужна для замены системных файлов). Внимание! При установке нажимайте SKIP, чтобы не установились лишние программы, которые идут в комплекте.

Далее:

1. Заходим через проводник в папку c:\windows\system32
2. Кликаем правой кнопкой на файле C_1252.NLS и выбираете Unlocker, в появившемся окошке выбираете Переименовать. Вводите новое имя: C_1252bak.NLS (или какое понравится).
3. То же для файлов: C_1253.NLS, C_1254.NLS, C_1255.NLS (их все нужно сохранить на всякий случай).
4. Копируете в буфер файл C_1251.NLS, вставляете и переименовываете в C_1252.NLS. Так для всех остальных (C_1253.NLS, C_1254.NLS, C_1255.NLS).
5. Перегружаетесь.

Работает в Win7 x86 и Win8.1 x64.

Потом пробуете русские буковки в GX Works 2 на ST. Компиляция должна проходить успешно. До этого должны были быть вопросики, если использовать русские имена для переменных.

Решение проблем с кодировкой в Windows.

Прикрепленный файл  2014_11_20_13_25_58________________.png ( 117.81 килобайт ) Кол-во скачиваний: 33


Сообщение отредактировал uni - 20.11.2014 - 14:57
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
KAZAH
сообщение 21.11.2014 - 08:48
Сообщение #6


Маньяк
*****

Группа: Пользователи
Сообщений: 838
Регистрация: 27.07.2004
Из: Россия
Пользователь №: 48



Цитата(uni @ 19.11.2014 - 22:51) *
Доброго. Начал тут пробовать силы в ST и не могу найти нормального человеческого описания языка. Может у кого есть такое? Именно для FX семейства Mitsubishi, а не сферический конь в вакууме.

Для начала я хотел бы узнать можно ли в программе создать переменную с указанным адресом, т.е. псевдоним для имеющейся переменной (M8002 или D8120), а то мне неудобно делать инициализацию. Есть ли символы для однострочных комментариев, типа // в C++? Как же всё-таки описывать функции?

Код
(* Действия при загрузке. *)
IF M8002 THEN
    
    (* Выполняем инициализацию. *)
    Шаг := 0;
    
END_IF;

(* Автомат состояний. *)
CASE Шаг OF
    
    (* Инициализация. *)    
    0:
        (* Адрес прибора. *)
        Адрес := 0;    
        
        (* Доделать: Вставить табличку скоростей. *)
        
        (* Communication Format Register
        [ Регистр формата соединения ][LX3V]
                   00000000 - Initial Value *)
        D8120 := 2#10100111;
        (*         ||||||||
                   76543210
                   |||||||+- 0:    - Length (0 - 7 bits, 1 - 8 bits)
                   ||||||+-- 1: -+ - Parity (00 - none, 01 - odd, 11 - even)
                   |||||+--- 2: _|
                   ||||+---- 3:    - Stop bit (0 - 1 bit, 1 - 2 bits)
                   |||+----- 4: -+ - Baud rate
                   ||+------ 5:  |
                   |+------- 6:  |
                   +-------- 7: _|
                   *)        
            
        (* Переход на тест индикации. *)
        Шаг := 1;        
        
    (* Тест индикации. *)
    1:;
    
    
END_CASE;

есть мануалы на англицком по ST и в них подробно описывается процесс программерства для Q&L .мануалы sh080368eh & sh080366ej . это последние версии но если найдёте ранние релизы то сожете понять что к чему.


--------------------
Наши цели ясны, задачи определены. За работу, товарищи!
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 21.11.2014 - 10:31
Сообщение #7


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Спасибо, sh080366ej - именно то, что я искал. Наконец-то стало проясняться. В ST есть свои подводные камни, я смотрю. Нужно постоянно поначалу смотреть результат компиляции, чтобы точно знать во что превратится код.

Цитата
Для начала я хотел бы узнать можно ли в программе создать переменную с указанным адресом, т.е. псевдоним для имеющейся переменной (M8002 или D8120)

Да, можно. Встроенные адреса можно указать в глобальных метках.

Цитата
Есть ли символы для однострочных комментариев, типа // в C++?

Нет.

Мне пока не ясно как удобнее разделить программу на небольшие отдельные части. Сейчас я это делаю, используя КА и состояний, которые определяются числами, но эти магические числа иметь не удобно. К сожалению, в CASE элементах нельзя использовать именованные константы. Придётся делать IF ... ELSIF ... ELSIF ...

Прикрепленный файл  2014_11_21_11_32_28________________.png ( 122.76 килобайт ) Кол-во скачиваний: 29


Сообщение отредактировал uni - 21.11.2014 - 10:35
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 21.11.2014 - 11:56
Сообщение #8


Гуру
******

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



Цитата(uni @ 21.11.2014 - 12:31) *
Мне пока не ясно как удобнее разделить программу на небольшие отдельные части. Сейчас я это делаю, используя КА и состояний, которые определяются числами, но эти магические числа иметь не удобно. К сожалению, в CASE элементах нельзя использовать именованные константы. Придётся делать IF ... ELSIF ... ELSIF ...

Прикрепленный файл  2014_11_21_11_32_28________________.png ( 122.76 килобайт ) Кол-во скачиваний: 29


Подробить программу на куски можно закладывая эти куски в разные POU, либо оформляя эти куски в виде ФБ. Все это доступно при выборе формата проекта Structured.

P.S. Посмотрел итоговый код. Компилятор у ST, прям скажем, жуткий happy.gif

Сообщение отредактировал inntele - 21.11.2014 - 11:59


--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 21.11.2014 - 12:58
Сообщение #9


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Я не уверен, что китайский ПЛК эти разные POU поймёт. Дело в том, что я нашёл комбинацию действий в GX Works 2 и программу, которая заставляет плк слетать с катушек (превращает в кирпич). После этих действий он не выходит в ни в RUN, ни в STOP, а переключение режима вручную периодически приводит к произвольной индикации:
Прикрепленный файл  ______________1.jpg ( 449.85 килобайт ) Кол-во скачиваний: 28


На картинке видно, что подсветились даже те места, где нет входов (универсальный китайский подход). При этом выходы не срабатывают, ну и на входах ничего нет, естественно. Китайцам я отписал, кумекают. Плохо то, что программная модель плк вместе со всеми портами и пр. реализованы на одном мк (STM32F103VET6). USB-COM там софтовый и он отвалился сразу, также как и другие порты. Прошить мозги, видимо, можно будет только через специальный программатор, напрямую подключившись к мк.

У меня алгоритм сам по себе не сложный. Нужно считывать/изменять конфигурацию прибора при нажатии на разные кнопки. Думаю, что уложусь в не слишком большой текст на несколько экранов. Пока не могу привыкнуть к стилю написания на ST, он своеобразный.

П.С. Мне понравилось как можно записать тест индикации, это выглядит проще, чем графические изыски:
Код
(* Тест индикации. *)
ELSIF Шаг = ТЕСТ_ИНДИКАЦИИ THEN

    (* Зажигаем все выходы. *)
    MOV( TRUE , HFFFF , K4Y0 );  
    
    (* Задержка 2 сек. *)
    TON_1( IN:= TRUE, PT:= T#2s, Q:= btmp, ET:= ttmp );
        
    (* Гасим все выходы. *)
    MOV( btmp, H0 , K4Y0 );
    
    (* Переходим к опросу кнопок. *)
    MOV( btmp, ОПРОС_КНОПОК, Шаг );


Сообщение отредактировал uni - 21.11.2014 - 13:08
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 21.11.2014 - 13:13
Сообщение #10


Гуру
******

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



Цитата(uni @ 21.11.2014 - 14:58) *
Я не уверен, что китайский ПЛК эти разные POU поймёт.


ПЛК до абсолютно фонаря один POU или много, поскольку все POU существуют исключительно в пакете разработчика. Тогда как ПЛК работает с исполняемым кодом!!!

В макроассемблере то, что загружается в ПЛК всегда выглядит как:

- первая инструкция
...
- последняя инструкция
- END

либо

- первая инструкция
...
- последняя инструкция
FEND
- метка первой подпрограммы (прерывания)
...
- SRET (IRET)
...
- метка последней подпрограммы (прерывания)
...
- SRET (IRET)
END



--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
inntele
сообщение 21.11.2014 - 13:21
Сообщение #11


Гуру
******

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



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


--------------------
Мозг любого человека работает круглосуточно. Но мозг инженера отличается тем, что способен при этом проанализировать задачу, синтезировать несколько техничных ее решений, а затем выбрать из этих решений наилучшее.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 24.11.2014 - 22:30
Сообщение #12


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Китайцы обновили прошивку ПЛК и мы восстановили их работоспособность. Тем не менее они не решили проблемы заливки ST программы через GX Works 2. В конце появляется ошибка, которая переводит ПЛК в ERR. Эту проблему я обхожу путём считывания в LAD и перезаписывания обратно. Бедные китайцы пишут всё с использованием LAD. Я хочу попросить их допилить возможность нормальной заливки ST программы, ибо на паскале писать приятно, пусть даже и обрезанном.

Меня смущает только некоторая ограниченность программирования на ST в GX Works 2. Я не понимаю, зачем было ограничивать программиста и вместо текстового определения переменных, типов и прочего, я должен мышкой заполнять кучу таблиц? С одной стороны это вроде удобно, но с другой стороны это медвежья услуга. Я не могу иметь полной текстовой копии программы, так как переменные определены где-то в таблицах проекта.

Ещё мне пока не ясно могу ли я сделать так, чтобы переменные автоматически размещались не сверху вниз по адресам, а наоборот - снизу вверх. Непонятно зачем так сделано. Так вывих мозга можно получить. Если я использую команду RS и работаю с массивами, то мне нужно указывать последний элемент массива, так как это будет самый нижний адрес и RS инструкция заполнит его вверх правильно. Чтобы принимать пакет сразу в структуру мне пришлось определить её поля задом наперёд именно по причине странного размещения. Я ещё не проверял в работе эти конструкции, среда показывает адреса переменных после перекомпиляции.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 27.11.2014 - 17:33
Сообщение #13


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Ещё один вариант реализации языка ST. Приложу здесь для общего развития.

PLC programming according to the IEC 61 131-3 standard in the Mosaic environment ( 10th edition November 2007 ).

Прикрепленный файл  ST._________________________.pdf ( 816.55 килобайт ) Кол-во скачиваний: 46
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
uni
сообщение 28.11.2014 - 14:53
Сообщение #14


Читатель
*

Группа: Пользователи
Сообщений: 25
Регистрация: 14.11.2014
Из: Екатеринбург
Пользователь №: 10368



Я закончил написание своей программы на ST. Она заняла в общем 330 строк или 1014 шагов. Всё оформлено в виде одного POU. В сравнении с LAD (STL) и FBD программа для меня получилась куда понятнее, в скомпилированный результат даже не смотрел, ибо там жуткое спагетти. Теперь буду писать всё сразу на ST, жалко только, что он в GX Works 2 урезанный какой-то. Справку по функциям верстал даун, ибо разобрать картинки с параметрами там невозможно. Редактор кода тоже оставляет желать лучшего. Короче, минусов тоже полно, но оно хотя бы компилирует и это работает, к остальному привыкнуть можно.

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

Хотелось бы, конечно, иметь многие вещи из второго руководства по ST. Например, sizeof(), чтобы не было магической константы для размера структуры. Препроцессорные директивы тоже бы не помешали. Однострочных комментариев не хватает. В общем, убоги пока доступные возможности языка, но спасибо хотя бы за это.
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
KAZAH
сообщение 28.11.2014 - 15:47
Сообщение #15


Маньяк
*****

Группа: Пользователи
Сообщений: 838
Регистрация: 27.07.2004
Из: Россия
Пользователь №: 48



Цитата(uni @ 28.11.2014 - 13:53) *
Я закончил написание своей программы на ST. Она заняла в общем 330 строк или 1014 шагов. Всё оформлено в виде одного POU. В сравнении с LAD (STL) и FBD программа для меня получилась куда понятнее, в скомпилированный результат даже не смотрел, ибо там жуткое спагетти. Теперь буду писать всё сразу на ST, жалко только, что он в GX Works 2 урезанный какой-то. Справку по функциям верстал даун, ибо разобрать картинки с параметрами там невозможно. Редактор кода тоже оставляет желать лучшего. Короче, минусов тоже полно, но оно хотя бы компилирует и это работает, к остальному привыкнуть можно.

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

Хотелось бы, конечно, иметь многие вещи из второго руководства по ST. Например, sizeof(), чтобы не было магической константы для размера структуры. Препроцессорные директивы тоже бы не помешали. Однострочных комментариев не хватает. В общем, убоги пока доступные возможности языка, но спасибо хотя бы за это.

версия софта у вас какая?


--------------------
Наши цели ясны, задачи определены. За работу, товарищи!
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

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

 



- Текстовая версия Сейчас: 26.04.2024 - 18:37