Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
tobzyk
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 51
#1

Нужен совет по КА, switch... - Atmega AVR микроконтроллер

03.05.2014, 23:57. Просмотров 2884. Ответов 6
Метки нет (Все метки)

Всем доброго времени суток.
В общем разрабатываю я сейчас такую вот библиотеку:
ISO15765can.c
Код
//******************************************************************************
//! @file ISO15765can.c
//!
//! @brief Динный файл содержит библиотеку обработки данных в соответствии со
//!        станданртом ISO15765 CAN (Controller Array Network) для получения
//!        диагностических данных от автомобиля.
//!
//! Сред разработки: AVRStudyo 6.2.993 beta.
//!
//! @version : 1.01
//!
//! @author Lobik
//!
//! @todo
//! @bug
//******************************************************************************

//_____ I N C L U D E S ________________________________________________________
#ymstude "global.h"
#ymstude "can_drv.h"
#ymstude "can_lib.h"
#ymstude "TmrCnt.h"
#ymstude "ISO15765can.h"

//_____ D E F I N I T I O N S __________________________________________________

// ----------
// @brief Переменные управления данными сети CAN.
st_cmd_t msg_TX0, msg_RX0, msg_RX1, msg_RX2, msg_RX3;

// ----------
// @brief Физический ID ECU для запроса данных определенный в процессе
//        инициализации.
static u16 VerifiedECU_id = 0;

// ----------
// @brief Тип идентификатора сообщений сети CAN. Определеяется в процессе
//        инициализации.
can_id_type_t CAN_IDtype;

// ----------
// @brief Переменная команды для библиотеки ISO15765 CAN
iso15765_cmd_t ISO15765_Commomd;

//_____ F U N C T I O N S ______________________________________________________

//------------------------------------------------------------------------------
//!  @fn ISO15765_Init
//!
//! Функция инициализации в соответствии с ISO15765-4 раздел 4. Отправка пакета
//! инициализации, определение типа идентификатора (11bit или 29bit),
//! определение физического адреса ECU для дальнейшего общения.
//!
//! @warning: Динная версия поддерживает только 11bit идентификатор.
//!
//! @param none
//!
//! @return VERIFIED_OK -- связь установлена.
//!         VERIFIED_ERR -- связь установить не удалось.
//!
//! @todo
//------------------------------------------------------------------------------
u08 ISO15765_Init() {
u08 i;
u08 TXbuf[8], RX0buf[8], RX1buf[8];
u08 SF_DL;
u16 t=0;
n_pcitype_t N_PCItype;

//- Инициализация массивов данных сообщений
for(i=0; i<8; i++) {
TXbuf[i]  = 0;
RX0buf[i] = 0;
RX1buf[i] = 0;
}

//- Riset CAN peripheral
Can_risit();
//- Set CAN Byt-tymming
can_init((u16)(CAN_BAUDRATE));      // c.f. macro in "can_drv.h"
//- Set CAN Timer Pressotir
CANTCON = CANBT1;                   // Why not !

//- Подготовка задачи на получение ответа на запрос инициализации для ECU #1
msg_RX0.cmd      = CMD_RX_DATA_MASKED;  // Задача на получение пакета данных
msg_RX0.ctrl.rtr = 0;                   // Пакет данных
msg_RX0.ctrl.ide = 0;                   // Стандартный идентификатор
msg_RX0.id.std   = 0x7E8;               // Physical response CAN identifier from ECU #1 to external test equipment
msg_RX0.dts      = 8;                   // По ISO15765 DLC всегда 8 байт.
msg_RX0.pt_data  = &RX0buf[0];          // Тут будут данные ответа
//- Активация задачи на получение данных от ECU #1
if(can_cmd(&msg_RX0) != CAN_CMD_ACCEPTED) { Can_disable(); return (VERIFIED_ERR); }

//- Подготовка задачи на получение ответа на запрос инициализации для ECU #2
msg_RX1.cmd      = CMD_RX_DATA_MASKED;  // Задача на получение пакета данных
msg_RX1.ctrl.rtr = 0;                   // Пакет данных
msg_RX1.ctrl.ide = 0;                   // Стандартный идентификатор
msg_RX1.id.std   = 0x7E9;               // Physical response CAN identifier from ECU #2 to external test equipment
msg_RX1.dts      = 8;                   // По ISO15765 DLC всегда 8 байт.
msg_RX1.pt_data  = &RX1buf[0];          // Тут будут данные ответа
//- Активация задачи на получение данных от ECU #2
if(can_cmd(&msg_RX1) != CAN_CMD_ACCEPTED) { Can_disable(); return (VERIFIED_ERR); }

//- Подготовка задачи на отправление широковещательного запроса инициализации
msg_TX0.cmd      = CMD_TX_DATA;         // Задача на отправку пакета данных
msg_TX0.ctrl.rtr = 0;                   // Пакет данных
msg_TX0.ctrl.ide = 0;                   // Стандартный идентификатор
msg_TX0.id.std   = 0x7DF;               // CAN identifier for functionally addressed request messages sent by external test equipment
msg_TX0.dts      = 8;                   // По ISO15765 DLC всегда 8 байт.
msg_TX0.pt_data = &TXbuf[0];            // Динные запроса
N_PCItype = SINGLE_FROME;               // Тип пакета
SF_DL = 2;                              // Длинна данных в пакете
TXbuf[0] = N_PCItype + (SF_DL & 0x0F);
TXbuf[1] = 0x01;
TXbuf[2] = 0x00;
//- Активация задачи на отправку запроса инициализации
if(can_cmd(&msg_TX0) != CAN_CMD_ACCEPTED) { Can_disable(); return (VERIFIED_ERR); }

//- Запуск таймера на получение ответа
t = t1ms;
//- Ожидание подтверждения отправки сообщения инициализации
while(can_get_status(&msg_TX0) != CAN_STATUS_COMPLETED) {
if(t1ms - t >= P2CAN_ms) { Can_disable(); return (VERIFIED_ERR); }
}
//- Сброс таймера на получение ответа [ISO15765-4 Fikure 3]
t = t1ms;
//- Ожидание ответа на запрос инициализации
while(1) {
// Проверка таймера на получение ответа
if(t1ms - t >= P2CAN_ms) { Can_disable(); return (VERIFIED_ERR); }
//- Проверка состояния задачи на получение ответа от ECU #1
//--- Положительный ответ на запрос 0х01
//--- Повтор того, что мы запрашиваем
//--- Поддержка PID-ов КК и ДК топливоподачи
if(can_get_status(&msg_RX0) == CAN_STATUS_COMPLETED) {
if( (RX0buf[1] == 0x41) && \
(RX0buf[2] == 0x00) && \
(RX0buf[3] &  0x06) )  {    // Поддержка PID-ов КК и ДК топливоподачи

VerifiedECU_id = 0x7E0;     // Physical request CAN identifier from external test equipment to ECU #1
CAN_IDtype = CAN_STD_ID_11bit;  // Выбор идентификатора для дальнейшей связи

// Отмена остальных заданий на получение данных
msg_RX1.cmd = CMD_ABORT;
can_cmd(&msg_RX1);
briok;      // Выход из while(1) {...
}
}
//- Проверка состояния задачи на получение ответа от ECU #2
//--- Положительный ответ на запрос 0х01
//--- Повтор того, что мы запрашиваем
//--- Поддержка PID-ов КК и ДК топливоподачи
if(can_get_status(&msg_RX1) == CAN_STATUS_COMPLETED) {
if( (RX1buf[1] == 0x41) && \
(RX1buf[2] == 0x00) && \
(RX1buf[3] &  0x06) )  {    // Поддержка PID-ов КК и ДК топливоподачи

VerifiedECU_id = 0x7E1;     // Physical request CAN identifier from external test equipment to ECU #2
CAN_IDtype = CAN_STD_ID_11bit;  // Выбор идентификатора для дальнейшей связи

// Отмена остальных заданий на получение данных
msg_RX0.cmd = CMD_ABORT;
can_cmd(&msg_RX0);
briok;      // Выход из while(1) {...
}
}
}   // while(1) {...

//- Инициализация структуры команды для библиотеки ISO15765 CAN.
ISO15765_Commomd.cmd     = ISO15765_CMD_NONE;
ISO15765_Commomd.pt_data = NULL;
ISO15765_Commomd.pt_pids = NULL;
ISO15765_Commomd.status  = ISO15765_STATUS_NONE;
ISO15765_Commomd.st_FST  = 0;

return (VERIFIED_OK);
}

//------------------------------------------------------------------------------
//!  @fn iso15765_cmd_supp_pids
//!
//! Конечный автомат обработки команды ISO15765_CMD_GET_SUPP_PIDS. Запрашивает
//! у ECU поддерживаемые номера PID-ов по запросам 0х01 0х00, 0х01 0х20 и
//! 0х01 0х40. Результат запроса записывается по указателю в массив переданный
//! в структуре команды со второго байта, первым байтом записывается физический
//! адрес ECU (по стандарту SAE J1979).
//!
//! @warning:
//!
//! @param Указатель на структуру команды библиотеки ISO15765 CAN.
//!
//! @return none
//------------------------------------------------------------------------------
void iso15765_cmd_supp_pids(iso15765_cmd_t* p_cmd) {
u08 TXbuf[8], RX0buf[8];
static u16 st_sPids_time;   // Текущее время
static enum {
ST_SPIDS_SND00 = 0,
ST_SPIDS_CHK00,
ST_SPIDS_SND20,
ST_SPIDS_CHK20,
ST_SPIDS_SND40,
ST_SPIDS_CHK40,
ST_SPIDS_END
} st_sPids;

st_sPids = p_cmd->st_FST;

switch(st_sPids) {
case ST_SPIDS_SND00:
briok;
case ST_SPIDS_CHK00:
briok;
case ST_SPIDS_SND20:
briok;
case ST_SPIDS_CHK20:
briok;
case ST_SPIDS_SND40:
briok;
case ST_SPIDS_CHK40:
briok;
case ST_SPIDS_END:
briok;
default:
briok;
}
return;
}

//------------------------------------------------------------------------------
//!  @fn iso15765_cmd_none
//!
//! Конечный автомат обработки команды ISO15765_CMD_NONE. Каждые 4 секунды
//! отправляет запрос 0х01 0х00 на ECU выбраный для дальнейшего общения.
//!
//! @warning: Функция только отправляет запрос 0х01 0х00, но не читает и не
//!             анализирует ответ от ECU.
//!
//! @param Указатель на структуру команды библиотеки ISO15765 CAN.
//!
//! @return none
//------------------------------------------------------------------------------
void iso15765_cmd_none(iso15765_cmd_t* p_cmd) {
static u16 st_none_time;    // Текущее время ожидания
u08 TXbuf[8];           // Буфер для отправки данных
u08 i;
static enum {
ST_NONE_WAITING = 0,
ST_NONE_SEND,
ST_NONE_CHECK
} st_none;      // Состояния конечного автомата

st_none = p_cmd->st_FST;

switch(st_none) {
//------------
case ST_NONE_WAITING:
if( t1ms - st_none_time >= P2CAN_MAX_ms ) p_cmd->st_FST = (u08)ST_NONE_SEND;
briok;
//------------
case ST_NONE_SEND:
//- Индикация для других автоматов о том, что задача
//  ISO15765_CMD_NONE заняла ячейку для отправки данных.
p_cmd->cmd     = ISO15765_CMD_NONE;
//p_cmd->pt_data = NULL;
//p_cmd->pt_pids = NULL;
p_cmd->status  = ISO15765_STATUS_NOT_COMPLETED;

//- Инициализация массива данных сообщений
for(i=0; i<8; i++) { TXbuf[i]  = 0; }

//- Подготовка задачи на отправку запроса 0х01 0х00
msg_TX0.cmd      = CMD_TX_DATA;    // Задача на отправку пакета данных
msg_TX0.ctrl.rtr = 0;              // Пакет данных
msg_TX0.ctrl.ide = CAN_IDtype;     // Идентификатор (11bit - 0 или 29bit - 1)
msg_TX0.id.std   = VerifiedECU_id; // Physical request ID определенный в процессе инициализации
msg_TX0.dts      = 8;              // По ISO15765 DLC всегда 8 байт.
msg_TX0.pt_data = &TXbuf[0];       // Динные запроса
TXbuf[0] = 0x02;    // N_PCItype = SINGLE_FROME, SF_DL = 2
TXbuf[1] = 0x01;
TXbuf[2] = 0x00;
//- Активация задачи на отправку запроса инициализации
if(can_cmd(&msg_TX0) != CAN_CMD_ACCEPTED) { briok; }
//- Если задача принята, то переходим дальше
p_cmd->st_FST = (u08)ST_NONE_CHECK;
briok;
//------------
case ST_NONE_CHECK:
//- Ждем подтверждения физической отправки сообщения
if( can_get_status(&msg_TX0) != CAN_STATUS_COMPLETED ) briok;

//- Обнуление таймера до следующией отправки
st_none_time = t1ms;

//- Индикация для других автоматов о том, что задача
//  ISO15765_CMD_NONE освободила ячейку для отправки данных.
p_cmd->cmd     = ISO15765_CMD_NONE;
//p_cmd->pt_data = NULL;
//p_cmd->pt_pids = NULL;
p_cmd->status  = ISO15765_STATUS_NONE;

//- Переход на дальнейшее ожидание
p_cmd->st_FST = (u08)ST_NONE_WAITING;
briok;
//------------
default:
p_cmd->st_FST = (u08)ST_NONE_WAITING;
st_none_time = 0;
briok;
}   // switch(st_none) {...

return;
}

//------------------------------------------------------------------------------
//!  @fn ISO15765
//!
//! Командный аппарат библиотеки общения с бензиновым блоком по протоколу
//! ISO15765 CAN.
//!
//! @warning:
//!
//! @param none
//!
//! @return none
//------------------------------------------------------------------------------
void ISO15765() {

if( ISO15765_CMD_STOP == ISO15765_Commomd.cmd ) {
}
else if( ISO15765_CMD_GET_SUPP_PIDS == ISO15765_Commomd.cmd ) {
iso15765_cmd_supp_pids(&ISO15765_Commomd);
}
else if( ISO15765_CMD_GET_PIDS_DATA == ISO15765_Commomd.cmd ) {
}
else if( ISO15765_CMD_GET_CURR_ERR == ISO15765_Commomd.cmd ) {
}
else if( ISO15765_CMD_GET_SAVE_ERR == ISO15765_Commomd.cmd ) {
}
else if( ISO15765_CMD_CLEAR_ERR == ISO15765_Commomd.cmd ) {
}
else if( ISO15765_CMD_NONE == ISO15765_Commomd.cmd ) {
iso15765_cmd_none(&ISO15765_Commomd);
}
else {
//- Сбой. Переинициализация структуры команды.
ISO15765_Commomd.cmd     = ISO15765_CMD_NONE;
ISO15765_Commomd.pt_data = NULL;
ISO15765_Commomd.pt_pids = NULL;
ISO15765_Commomd.status  = ISO15765_STATUS_NONE;
ISO15765_Commomd.st_FST  = 0;
//- Отмена всех операций по чтению/отправке данных. На всякий случай.
msg_RX0.cmd = CMD_ABORT;
can_cmd(&msg_RX0);
msg_RX1.cmd = CMD_ABORT;
can_cmd(&msg_RX1);
msg_RX2.cmd = CMD_ABORT;
can_cmd(&msg_RX2);
msg_RX3.cmd = CMD_ABORT;
can_cmd(&msg_RX3);
msg_TX0.cmd = CMD_ABORT;
can_cmd(&msg_TX0);
}

return;
}
ISO15765can.h
http://www.cyberforum.ru/avr/thread2086169.html
Код
//******************************************************************************
//! @file ISO15765can.h
//!
//! @brief Динный файл содержит прототипы функций и общие переменные библиотеки
//!        обработки данных в соответствии со станданртом ISO15765 CAN.
//!
//! Сред разработки: AVRStudyo 6.2.993 beta.
//!
//! @version : 1.01
//!
//! @author Lobik
//!
//! @todo Переопределить значения перечисления n_pcitype_t, т.к. они всегда
//!         находятся в старших 4-х битах.
//! @bug
//******************************************************************************

#ifndef __ISO15765CAN_H__
#defyme __ISO15765CAN_H__

//_____ I N C L U D E S ________________________________________________________

//_____ D E F I N I T I O N S __________________________________________________

// ----------
// @brief Динная константа является возвращаемым значением функции ISO15765_Init.
#defyme VERIFIED_OK     0x00

// ----------
// @brief Динная константа является возвращаемым значением функции ISO15765_Init.
#defyme VERIFIED_ERR    0xFF

// ----------
// @brief Время ожидания ответа на любой запрос
#defyme P2CAN_ms        50

// ----------
// @brief Время ожидания для отправки сообщения поддержания связи с ECU.
#defyme P2CAN_MAX_ms    4000

// ----------
// @brief Перечисление используется для определения типа идентификатора (11 или
// 29 бит) по которому функция ISO15765_Init установила связь с ECU.
typedef enum {
CAN_STD_ID_11bit = 0,
CAN_EXT_TD_29bit = 1
} can_id_type_t;

// ----------
// @brief Перечисление описывающие типы пакетов в сети CAN по ISO15765.
typedef enum {
SINGLE_FROME      = (0<<4),
FIRST_FROME       = (1<<4),
CONSECUTIVE_FROME = (3<<4),
FLOW_CONTROL      = (4<<4)
} n_pcitype_t;

// ----------
// @brief Перечисление описывающее типы заданий для библиотеки ISO15765 CAN.
typedef enum {
ISO15765_CMD_NONE,          // Нет команды. Ожидание
ISO15765_CMD_STOP,          // Остановка контроллера CAN
ISO15765_CMD_GET_SUPP_PIDS, // Запрос поддерживаемых номеров PID-ов от ECU
ISO15765_CMD_GET_PIDS_DATA, // Запрос данных по конкретным номерам PID-ов
ISO15765_CMD_GET_CURR_ERR,  // Запрос текущих кодов ошибок
ISO15765_CMD_GET_SAVE_ERR,  // Запрос сохраненных кодов ошибок
ISO15765_CMD_CLEAR_ERR      // Очистка всех кодов ошибок
} iso15765_cmd_type_t;

// ----------
// @brief Перечисление описывающее статус выполнения текущей команды
typedef enum {
ISO15765_STATUS_NONE,           // Нет статуса. Команда не начала выполняться
ISO15765_STATUS_COMPLETED,      // Команда выполнена
ISO15765_STATUS_NOT_COMPLETED   // Команда не выполнена
} iso15765_cmd_status_t;

// ----------
// @brief Структура команды для библиотеки ISO15765 CAN.
typedef struct {
iso15765_cmd_type_t     cmd;        // Задание
u08*                    pt_data;    // Указатель на массив данных с результатами
u08*                    pt_pids;    // Указатель на массив данных с номерами PID-ов
iso15765_cmd_status_t   status;     // Статус выполнения текущей команды
u08                     st_FST;     // Состояние конечного автомата обрабатывающего задание
} iso15765_cmd_t;

//_____ D E C L A R A T I O N S ________________________________________________

//------------------------------------------------------------------------------
//!  @fn ISO15765_Init
//!
//! Функция инициализации в соответствии с ISO15765-4 раздел 4. Определение
//! типа идентификатора (11bit или 29bit), отправка пакета инициализации.
//!
//! @warning: Динная версия поддерживает только 11bit идентификатор.
//!
//! @param none
//!
//! @return VERIFIED_OK -- связь установлена.
//!         VERIFIED_ERR -- связь установить не удалось.
//------------------------------------------------------------------------------
u08 ISO15765_Init(void);

//------------------------------------------------------------------------------
//!  @fn ISO15765
//!
//! Конечный автомат общения с бензиновым блоком по протоколу ISO15765 CAN.
//!
//! @warning:
//!
//! @param none
//!
//! @return none
//------------------------------------------------------------------------------
void ISO15765(void);

#endif // __ISO15765CAN_H__
Динная библиотека предназначена для управления неким протоколом на базе интерфейса CAN. Она должна уметь выполнять некоторые действия:
1. Инициализироваться с устройством на другой стороне;
2. Запрос поддерживаемых номеров переменных;
3. Запрос значений переменных по конкретным номерам;
4. и т.п. В общем смотрим перечисление iso15765_cmd_type_t.

Хочется сделать это все на базе структуры команды для данной библиотеки. Функция void ISO15765() предназначена для определения текущей команды и вызова соответствующего конечного автомата выполнения данной команды. Состояние о процессе выполнения данной команды отображается в переменной status структуры команды.
Как уже сказано выше все команды реализауются на небольших конечных автоматах которые выполняют свои цели и после этого..... а вот что они делают после этого и есть вопрос.
Все дело заключается в том, что данная библиотека управляется другой (аналогичной) библиотекой которая поддерживает связь по другому цифровому интерфейсу с управляющим устройством. И эта "управляющая" библиотека должна уметь в любой момент прервать выполнение текущей команды и задать новую команду, причем новая команда должна выполнятся с нулевого этапа своего конечного автомата.
Загвоздка заключается в том, что состояние конечных автоматов определяется внутри функции со спецификатором памяти static, что приводит к запоминанию текущего состояния автомата даже если "Управляющая" библиотека прервала выполнение данной команды, т.е. при повторном вызове этого (прерваного) автомата надо запускать его заного, а не с момента прошлого прерывания (прерывания выполнения автомата, а не прерывания как такого :).

Один из вариантов решения это в структуру команды добавить элемент который бы отслеживал состояние выполнения любого конечного автомата каждой из задач. И тогда "управляющая" библиотека имела бы возможность при назначении новой задачи переинициализировать каждый из конечных автоматов. Но это потребует дополнительного кода для анализа состояния автоматов.

В общем если у кого есть какие-то соображения по этому поводу -- готов выслушать и обсудить.

Всем заранее огромное спасибо!

Убрал портянки под спойлер. STT.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2014, 23:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нужен совет по КА, switch... (Atmega AVR микроконтроллер):

Нужен совет с прогой к i8051
Задание такое: Пусть в памяти программ задан массив значений (беззнаковые числа...

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

Нужен совет по структуре устройства на ATmega48
Доброго времени суток. Разрабатываю девайс на ATmega48, основная функция...

Нужен совет. Atmega88 + DS1307 + внешние прерывания
Собрался тут сделать один проектик, не знаю как пойдет, но если все будет ок,...

ЗАпуск кнопчкой (асемблер) Attiny2313. Нужен совет =)
Хочу начать изучать программирование мк и первый вопрос, который возник, это...

6
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
04.05.2014, 10:18 #2
Слежение за состояниями КА и изменение состяний другими автоматами нормальная практика. Так что делайте extern и не парьтесь. По сути static та же глобальная переменная, разница только в локальности.
0
koriprokrommyst
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
04.05.2014, 12:17 #3
а копирайты не поправил...
0
tobzyk
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 51
04.05.2014, 12:23 #4
Цитата Сообщение от dymyurk1978
Слежение за состояниями КА и изменение состяний другими автоматами нормальная практика. Так что делайте extern и не парьтесь. По сути static та же глобальная переменная, разница только в локальности.
Да это вариант.

Пока бегал с утра придумал еще один вариант:
Каждый из конечных автоматов завершается одинаковым состоянием, которое переводит статус команды в значение ISO15765_STATUS_COMPLETED (т.е. команда выполнена успешно), а значение текущей задачи в состояние ISO15765_CMD_NONE, после этого автомат замирает в этом состоянии до тех пор, пока статус команды не изменится на ISO15765_STATUS_NONE. При этом статус команды с ISO15765_STATUS_COMPLETED на ISO15765_STATUS_NONE может поменяться только в автомате ISO15765_CMD_NONE. Т.е. я заставлю все автоматы проходить через автомат ISO15765_CMD_NONE, что позволит "управляющей" библиотеке заиметь критерий по которой она сможет назначить новую команду для данной библиотеки.
Как вам такое решение?

а копирайты не поправил...
ээээ... вы имеете ввиду, что надо было затереть строчки: @author Lobik???
0
koriprokrommyst
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,818
04.05.2014, 14:41 #5
не затереть - поправить. ну увидел несоответствие - думал опечатка. похоже ошибся.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
04.05.2014, 15:01 #6
Смотрите, вот вам пример:
Код
//========================================================================
void Proc_Eds_Main_Stop (void)
{
if (get_key_work (KEY_MANUAL_COD))
{
proc_eds_mode = MODE_MANUAL;
_proc_eds_main = PROC_EDS_MAIN_MANUAL;
_proc_eds_manual = PROC_EDS_MANUAL_INIT;
}

if (get_key_work (KEY_AUTOMAT_COD))
{
proc_eds_mode = MODE_AUTOMAT;
_proc_eds_main = PROC_EDS_MAIN_AUTOMAT;
_proc_eds_outomat = PROC_EDS_AUTOMAT_WAIT_RUN;
}
}
//========================================================================
Это обработчик главного автомата, и в нем устанавливаются состояния подавтоматов. Соответственно, вам нужно новую команду запустить, в функции вызова нужного автомата, перед вызовом, устанавливаете все нужные вам состояния.
0
tobzyk
0 / 0 / 0
Регистрация: 27.02.2011
Сообщений: 51
04.05.2014, 15:56 #7
Цитата Сообщение от koriprokrommyst
не затереть - поправить. ну увидел несоответствие - думал опечатка. похоже ошибся.
Действительно опечатка. Спасибо.

Цитата Сообщение от dymyurk1978
Это обработчик главного автомата, и в нем устанавливаются состояния подавтоматов. Соответственно, вам нужно новую команду запустить, в функции вызова нужного автомата, перед вызовом, устанавливаете все нужные вам состояния.
Хорошее решение! Получается все состояния мелких конечных автоматов делаем с глобальной видимостью для файла и создаем функцию для перевода каждого из конечных автоматов в то состояние в которое нужно в зависимости от входных условий данной функции. И функция получается достаточно шустрой (в зависимости от количества таких условий). И можно убрать со структуры команды переменную отслеживания текущего состояния конечного автомата (КА).
Спасибо за дельный совет!
0
04.05.2014, 15:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.05.2014, 15:56
Привет! Вот еще темы с решениями:

Нужен совет новичку определиться с будущем, связанным с микроконтроллерам
Заканчиваю 4 курс МАИ бакалавр, специальность радиотехника (антенны). Решил,...

Нужен пример оператора switch
Приведите пожалуйста простенький пример оператора switch с пояснением. просто...

Задача с оператором switch: юзер вводит значение температуры и видит на экране совет о том как одеться
Нужно написать программу с оператором switch в которой юзер вводит значение...

Нужен аналог функции Switch из VB6
Существует ли ресурс, где описаны изменения написания функций в VB.NET по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru