Самодиагностика конечных автоматов

Автоматизация технологических процессов, системы управления, АСУ ТП, АСКУЭ, программирование ПЛК, человеко-машинный интерфейс, сетевое оборудование, протоколы
Ответить
Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Самодиагностика конечных автоматов

Сообщение Автоматизатор »

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

Вот кусок программы (Микровин 4, СТЛ)

Код: Выделить всё

SUBROUTINE_BLOCK M1_G1:SBR2
TITLE=Модуль 1. Головка 1
BEGIN
Network 1 // Таймер контроля времени нахождения в состоянии
// Таймер работает всегда. Сбрасывается в момент перехода в другое состояние. Насчитанное время сохраняется в ячейки памяти, соответсвтвующей текущему состоянию.
// Вычисление адреса ячейки производится так:
//  - Берем указатель на область памяти aM1_G1_0 ( М1. Г1. Время нахождения в стостоянии 0  - начало диапазона)
//  - Преобразуем номер текущего состояния aM1_G1 в двойное целое и умножаем на 2 байта - получаем смещение 
//  - Вычисляем указатель на область памяти для хранения времени нахождения в текущем состоянии (к указателю на начало диапазона добавляем смещение)
//  - Записываем текущее время по вычисленному адресу.
LD     SM0.0
LPS
TON    T105, 32000
MOVD   &VW200, AC1
ITD    VW50, AC0
AENO
*D     2, AC0
LRD
+D     AC0, AC1
LPP
MOVW   T105, *AC1




Network 2 // Сброс действий
// Сбрасываются все переменные данного автомата, которым присваивается 1 в сосостояниях
LD     SM0.0
R      V10.0, 80
R      V30.1, 6
Network 3 // Инициализация состояния М1. Г1
LD     SM0.1
O      I3.6
O      I4.0
O      V30.3
O      V30.6
MOVW   VW50, VW52
AENO
MOVW   0, VW50
AENO
R      T105, 1
Network 4 // Модуль 1. Головка 1. Отключена
LDN    I4.2
MOVW   VW50, VW52
AENO
MOVW   1, VW50
AENO
R      T105, 1
Network 5 // Переход к состоянию
LD     SM0.0
LPS
AW=    VW50, 0
JMP    0
LRD
AW=    VW50, 1
JMP    1
LRD
AW=    VW50, 2
JMP    2
LRD
AW=    VW50, 3
JMP    3
LRD
AW=    VW50, 4
JMP    4
LRD
AW=    VW50, 5
JMP    5
LRD
AW=    VW50, 6
JMP    6
LRD
AW=    VW50, 7
JMP    7
LRD
AW=    VW50, 8
JMP    8
LRD
AW=    VW50, 9
JMP    9
LRD
AW=    VW50, 10
JMP    10
LRD
AW=    VW50, 11
JMP    11
LRD
AW=    VW50, 12
JMP    12
LRD
AW=    VW50, 13
JMP    13
LRD
AW=    VW50, 14
JMP    14
LRD
AW=    VW50, 15
JMP    15
LRD
AW=    VW50, 16
JMP    16
LRD
AW=    VW50, 17
JMP    17
LRD
AW=    VW50, 18
JMP    18
LRD
AW=    VW50, 19
JMP    19
LPP
AW=    VW50, 20
JMP    20

Network 6 // aM1_G1=0 Общий стоп
LBL    0
Network 7 // Действие 0
// Выполняем действия, соответствующие текущему состоянию, с учетом блокировок
LD     SM0.0
=      V30.4
R      V30.0, 1
R      T104, 1
Network 8 // Переход 0 - 3
// Если есть условие перехода в другое состоние, то:
// - сохраняем номер текущего состояния в память предыдущего
// - текущему состоянию присваиваем новый номер
// - сбрасываем таймер контроля времени нахождения в состоянии
// - выходим из подпрограммы
LD     V20.0
LPS
MOVW   VW50, VW52
AENO
MOVW   3, VW50
AENO
R      T105, 1
LPP
CRET
Network 9 // Переход 0 - 2
// Если есть условие перехода в другое состоние, то:
// - сохраняем номер текущего состояния в память предыдущего
// - текущему состоянию присваиваем новый номер
// - сбрасываем таймер контроля времени нахождения в состоянии
// - выходим из подпрограммы
LDN    V20.0
MOVW   VW50, VW52
AENO
MOVW   2, VW50
AENO
R      T105, 1
Network 10 // Выход
LD     SM0.0
CRET
Network 11 // aM1_G1=1 Головка отключена
LBL    1
Network 12 // Действие 1
LD     SM0.0
=      V30.5
R      V30.0, 1
Network 13 // Переход 1 - 0
LD     I4.2
MOVW   VW50, VW52
AENO
MOVW   0, VW50
AENO
R      T105, 1
Network 14 // Выход
LD     SM0.0
CRET
Network 15 // aM1_G1=2 Нет исходного
LBL    2
Network 16 // Действие 2
// Выполняем действия, соответствующие текущему состоянию, с учетом блокировок
Network 17 // Переход 2 - 0
// Если есть условие перехода в другое состоние, то:
// - сохраняем номер текущего состояния в память предыдущего
// - текущему состоянию присваиваем новый номер
// - сбрасываем таймер контроля времени нахождения в состоянии
// - выходим из подпрограммы
LD     V20.0
MOVW   VW50, VW52
AENO
MOVW   0, VW50
AENO
R      T105, 1
Network 18 // Выход
LD     SM0.0
CRET

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Реализация параллельной работы механизмов

Сообщение Михайло »

Неплохо бы для описания программы обозначить входы и выходы. Чтобы понять, какую инфу выдает программка, а какую потребляет.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Реализация параллельной работы механизмов

Сообщение Автоматизатор »

Я что то и не посмотрел, что в абсолютной адресации все. :)

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Реализация параллельной работы механизмов

Сообщение Автоматизатор »

Немного прокомментирую:
aM1_G1_0 - здесь хранится номер текущего состояния
aM1_G1_0 - здесь хранится время нахождения в текущем состоянии

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

Код: Выделить всё

SUBROUTINE_BLOCK M1_G1:SBR2
TITLE=Модуль 1. Головка 1
BEGIN
Network 1 // Таймер контроля времени нахождения в состоянии
Таймер работает всегда. Сбрасывается в момент перехода в другое состояние. Насчитанное время сохраняется в ячейки памяти, соответсвтвующей текущему состоянию.
// Вычисление адреса ячейки производится так:
//  - Берем указатель на область памяти aM1_G1_0 ( М1. Г1. Время нахождения в состоянии 0  - начало диапазона)
//  - Преобразуем номер текущего состояния aM1_G1 в двойное целое и умножаем на 2 байта - получаем смещение
//  - Вычисляем указатель на область памяти для хранения времени нахождения в текущем состоянии (к указателю на начало диапазона добавляем смещение)
//  - Записываем текущее время по вычисленному адресу.
LD     SM0.0
LPS
TON    T105, 32000                         // Таймер работает всегда. 
MOVD   &aM1_G1_0, AC1                // Берем указатель на область памяти aM1_G1_0
ITD    aM1_G1, AC0                         // Преобразуем номер текущего состояния aM1_G1 в DINT
AENO
*D     2, AC0                                    // умножаем на 2 байта - получаем смещение
LRD
+D     AC0, AC1                               // Вычисляем указатель на область памяти для хранения времени нахождения в текущем состоянии
LPP
MOVW   T105, *AC1                        // Записываем текущее время по вычисленному адресу

Network 2 // Сброс действий
// Сбрасываются все переменные данного автомата, которым присваивается 1 в сосостояниях
LD     SM0.0
R      V10.0, 80
R      V30.1, 6

Network 3 // Инициализация состояния М1. Г1
LD     SM0.1                                  // условия перехода в состояния СТОП (изменение режимов и т.п.)
O      I3.6
O      I4.0
O      V30.3
O      V30.6
MOVW   aM1_G1_0, pM1_G1_0      // сохранение предыдущего состояния
AENO
MOVW   0, aM1_G1_0
AENO
R      T105, 1                                // сброс таймера контроля нахождения в состоянии

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Самодиагностика конечных автоматов

Сообщение Михайло »

Автоматизатор писал(а):aM1_G1_0 - здесь хранится номер текущего состояния
aM1_G1_0 - здесь хранится время нахождения в текущем состоянии
Будь внимателен. Скидывай мне в личку правильный текст кода, я поправлю. Предлагаю aM1_G1 заменить (в целях удобочитаемости) заменить на имя State.

А если просто написать функцию OnChange, которая будет отслеживать изменение тэга состояния и сбрасывать таймер T105 при изменении? Принцип работы OnChange похож на функции детекторов фронта и спада. Сохраняем значение состояния в предыдущем программном цикле и сравниваем с текущим. Результат сравнения можно использовать для сброса таймера. Один раз этот код написать и больше нигде к таймеру уже обращаться не надо.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Реализация параллельной работы механизмов

Сообщение Автоматизатор »

Михайло писал(а):А если просто написать функцию OnChange, которая будет отслеживать изменение тэга состояния и сбрасывать таймер T105 при изменении?
Хорошая идея. Поправлю. Выложу

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Реализация параллельной работы механизмов

Сообщение Автоматизатор »

Поправил
OnChange.rar
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Автоматизатор
Профессионал
Сообщения: 993
Зарегистрирован: 09 окт 2012, 05:18

Re: Реализация параллельной работы механизмов

Сообщение Автоматизатор »

Вот скрин функции
OnChange.JPG
Таймер работает всегда. Сбрасывается в момент перехода в другое состояние. Насчитанное время сохраняется в ячейки памяти, соответсвтвующей текущему состоянию.

Если текущее состояние отличается от ранее сохраненного, значит состояние изменилось.
В этом случае:
- сохраняем старое состояние (mState) в памяти предыдущего состояния (pState)
- сохраняем текущее состояние (State) в памяти (mState)
- сбрасываем Timer (таймер контроля времени нахождения в состоянии)

Вычисление адреса ячейки производится так:
- Берем указатель на область памяти STATE (номер текущего состояния)
- Преобразуем номер текущего состояния STATE в двойное целое и умножаем на 2 байта - получаем смещение
- Вычисляем указатель на область памяти для хранения времени нахождения в текущем состоянии (к указателю на начало диапазона добавляем смещение)
- Записываем текущее время по вычисленному адресу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Михайло
Администратор
Сообщения: 4094
Зарегистрирован: 19 сен 2012, 19:16

Re: Самодиагностика конечных автоматов

Сообщение Михайло »

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

Ответить