Самодиагностика конечных автоматов
Добавлено: 11 апр 2013, 11:26
Сделал таймер, который считает время нахождении в состоянии и пишет в память в зависимости от текущего номера состояния.
Полученные результаты можно использовать для создания фактической циклограммы работы механизмов, формирования аварийных сигналов.
Вот кусок программы (Микровин 4, СТЛ)
Полученные результаты можно использовать для создания фактической циклограммы работы механизмов, формирования аварийных сигналов.
Вот кусок программы (Микровин 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