SPI или i2C ?

Обсуждаем контроллеры компании Atmel.
Ответить
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Сразу предупреждаю: протеус некорректно моделирует поведение регистров 74HC597, которые я рекомендовал вам для опроса дискретных входов - протеус не поддерживает корректно их каскадирование. один в протеусе нормально себя показывает, а цепочка из двух и более ведет себя, как один - первый. просто имейте ввиду.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

С 595 более мение научился работать , а вот может кто подсказать алгоритм на 597 , и их совместное использование с 595.
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

читайте даташит - там все сказано. алгоритм тот же: сначала защелкиваем данные со входов, затем подаем такты и последовательно принимаем. очень удобно применять SPI: MOSI для вывода в 595-е, MISO для ввода из 597-ых, все одновременно получается.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

А у кого какой опыт общение со сдвиговыми ригистрами? вариант общаться в виде 0b01100000 отпал сразу т.к это не читабельно.
с массивами тоже не получилось.
А вот 3 массива битовых полей я уже думаю что я почти дошел до правды.
код
Спойлер

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

#include <....>

#define SPI_PORT  PORTB
#define SPI_DDR    DDRB

#define SPI_MISO   PB4
#define SPI_MOSI   PB3
#define SPI_SCK    PB5
#define SPI_SS     PB2
#define AMOUNT_REGISTER_OUT 3
#define AMOUNT_REGISTER_IN 4


//структура выходов 3x8
typedef struct
{
	 unsigned DO0: 1;
	 unsigned DO1: 1;
	 unsigned DO2: 1;
	 unsigned DO3: 1;
	 unsigned DO4: 1;
	 unsigned DO5: 1;
	 unsigned DO6: 1;
	 unsigned DO7: 1;
}UnionBits;
UnionBits Register[AMOUNT_REGISTER_OUT];

/*инициализация SPI*/
void SPI_Init(void)
{
  /*настройка портов ввода-вывода*/
  SPI_DDR = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(0<<SPI_MISO);
  SPI_PORT = (1<<SPI_MOSI)|(1<<SPI_SCK)|(1<<SPI_SS)|(1<<SPI_MISO);
   
  /*разрешение spi,старший бит вперед,мастер, режим 0*/
  SPCR = (1<<SPE)|(0<<DORD)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA)|(1<<SPR1)|(0<<SPR0);
  SPSR = (0<<SPI2X);
}

/*отослать байт данных по SPI*/
void SPI_WriteByte(uint8_t data)
{
	SPI_PORT &= ~(1<<SPI_SS);
	SPDR = data;
	while(!(SPSR & (1<<SPIF)));
	SPI_PORT |= (1<<SPI_SS);
}

void SPI_UPDATA()
{
	for (uint8_t i=0;i<AMOUNT_REGISTER_OUT;i++)
	{
		SPI_WriteByte(Register[i].DO0);
		SPI_WriteByte(Register[i].DO1);
		//SPI_WriteByte(Register[i].DO2);
		//SPI_WriteByte(Register[i].DO3);
		//SPI_WriteByte(Register[i].DO4);
		//SPI_WriteByte(Register[i].DO5);
		//SPI_WriteByte(Register[i].DO6);
		//SPI_WriteByte(Register[i].DO7);
	}
}
int main(void)
{
	Register[0].DO0=1;
	Register[0].DO1=1;
	Register[1].DO0=1;
	Register[1].DO1=1;
	SPI_Init();
	SPI_UPDATA();
	while (true)
	{
	}
	return 0;
}
В общем хотелось бы сделать чтобы при изменение
Register[0].DO0=1\0
.
.
Register[2].DO7=1\0

В цикле while чтобы информация обновлялись и значения в регистрах.

Добавлено after 2 hours 15 minutes 20 seconds:
Поразмышляв пришел к данному решению , насколько оно правильно ?

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

struct UnionBits
{
	unsigned DO0: 1;
	unsigned DO1: 1;
	unsigned DO2: 1;
	unsigned DO3: 1;
	unsigned DO4: 1;
	unsigned DO5: 1;
	unsigned DO6: 1;
	unsigned DO7: 1;
};

union Byte {
	uint8_t ByteRegister;
	struct UnionBits Register;
};
union Byte One; //сдвиговый регистр 1
union Byte Two; //сдвиговый регистр 2
union Byte Three; //сдвиговый регистр 3
Для обращение к биту использовать :
One.Register.DO0
.
.
Three.Register.DO7

а для передачи в SPI_WriteByte , One.ByteRegister.
andrei23061996@gmail.com
.................................................................................................................
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Как по мне, так при большом количестве отдельных "управляемых" битов с ними надо работать или по принципу "все сделать так" или управлять индивидуально каждым по его "сквозному" номеру. Как, например, при вашем подходе с битовыми полями изменить состояние 13-го бита в последовательности из 32 битов? Как в цикле поменять уровни с 5-го по 21-й бит?

поэтому я в подобных случаях делаю функции get_bit, set_bit, clr_bit и rev_bit по такому типу:

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

// количество битов
#define BIT_CNT 32 
// массив байтов, хранящий биты 
static uint8_t bitfield[(BIT_CNT+7)/8];

// функция установки бита в 1 по его номеру
void set_bit(uint8_t bit){
   if(bit >= BIT_CNT) return; // ошибка - выход за количество битов
   bitfield[bit / 8] |= 1 << (bit % 8); // установка нужного бита
}
и потом уже манипулирую битами по их номеру.
да, получается не очень быстро, но универсально. а скорость манипулирования на практике не так уж и принципиальна
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Я не совсем понял приведенный пример выше, разве так не наглядней ?

К примеру для изменения 13того бита:
Мы обратися к 2ому регистру и биту DO4.
то есть:
Two.Register.DO4=1;

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

/*отослать байт данных по SPI*/
void SPI_WriteByte(uint8_t data)
{
	
	SPI_PORT &= ~(1<<SPI_SS);
	SPDR = data;
	while(!(SPSR & (1<<SPIF)));
	SPI_PORT |= (1<<SPI_SS);
}

struct UnionBits
{
	unsigned DO0: 1;
	unsigned DO1: 1;
	unsigned DO2: 1;
	unsigned DO3: 1;
	unsigned DO4: 1;
	unsigned DO5: 1;
	unsigned DO6: 1;
	unsigned DO7: 1;
};

union Byte {
	uint8_t ByteRegister;
	struct UnionBits Register;
};
union Byte One;
union Byte Two;
union Byte Three;

int main(void)
{
	One.Register.DO0=1;
	One.Register.DO1=0;
	One.Register.DO2=0;
	Two.Register.DO0=1;
	Two.Register.DO1=1;
	Two.Register.DO2=0;
	Three.Register.DO0=1;
	Three.Register.DO1=1;
	Three.Register.DO2=1;
	SPI_Init();
	
	SPI_WriteByte(One.ByteRegister);
	SPI_WriteByte(Two.ByteRegister);
	SPI_WriteByte(Three.ByteRegister);
	while (true)
	{
	}
	return 0;
}
Цель которую я при следую: )
Регистры будут управлять пневмоцилиндрами, на пневмоцилиндраx будут расположены герконы чтобы знать положение(исходное\Рабочие) .

Добавлено after 1 minute 55 seconds:
А пока попробую разобрать ваш пример )

Добавлено after 3 minutes 32 seconds:
Если честно то не понятно с первых строк(
Как массив может иметь (32+7)/8 количество ?
bitfield[(BIT_CNT+7)/8];
andrei23061996@gmail.com
.................................................................................................................
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

7seg писал(а):Я не совсем понял приведенный пример выше, разве так не наглядней ?
Я не знаю, какие задачи у вас конкретно стоят и как именно вы будете их решать, но попробую показать удобство моего подхода следующими примерами. Попробуйте решить вот такие задачи вашим способом и приведите код решения здесь, а потом я покажу вам своё решение этих задач - и сравним, что нагляднее.
1. Установить все биты в 1
2. установить все четные биты в 1, а нечетные в 0
3. Инвертировать состояние всех битов с 20-го по 30-й включительно
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

1. Установить все биты в 1
One.ByteRegister=0xff;
Two.ByteRegister=0xff;
Three.ByteRegister=0xff;
2 и 3 потрудней.

"Я не знаю, какие задачи"
Управление цилиндрами поочередно включая выключая(создавая процесс автоматизации)

Добавлено after 4 minutes 23 seconds:
Насчет
2. установить все четные биты в 1, а нечетные в 0
3. Инвертировать состояние всех битов с 20-го по 30-й включительно.
Наверно только в ручную указывая какие регистры вкл.
One.Register.DO0=1;
Two.Register.DO0=1;
Three.Register.DO0=1;

Добавлено after 22 minutes 5 seconds:
а как работает bitfield[bit / 8] |= 1 << (bit % 8);
Если при bit = 2 , деление bit / 8 будет = 0 , а остаток от деления bit % 8 = 25.
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

ок, понятно.
а теперь мой вариант

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

// 1 задача
for(uint8_t i=0; i<BIT_CNT; i++) set_bit(i);

// 2 задача
for(uint8_t i=0; i<BIT_CNT; i++)
   if(i & 1)
      clr_bit(i);
   else
      set_bit(i);

// 3 задача
for(uint8_t i=19; i < 30; i++) rev_bit(i);
что нагляднее?

Вы манипулируете какими-то регистрами-байтами, а я - битами. То есть у вас не работы с выходами, как с массивом, у меня - есть.
соответственно все манипуляции с битами будут делать точно так же, как и с массивами. Например, элементарно сделать "установить первые 3 бита в то же состояние, что и последние 3 бита" - делаться будет простым "копированием" значения битов...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

а как правильно поддерживать актуальную информацию на сдвиговых регистрах ?
то есть, у нас есть основная программа к примеру:

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

While(1)
{
Если (ВходнойБит1 == 1) то
    ВыходнойБит1=1
    Если (ВходнойБит2 ==1 и ВходнойБит1 !=0 )то
          ВыходнойБит2=1;
          ВыходнойБит3=1;
    Конец
Конец
}

Как правильно обновлять данные своевременно по SPI ?
Последний раз редактировалось 7seg Чт окт 26, 2017 09:00:02, всего редактировалось 1 раз.
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Т.к. регистры по SPI у вас соединены в цепочку и "частично" обновляться не могут, вы должны всегда обновлять состояние всех регистров. то есть вы всегда должны выводить по SPI весь массив bitfield (согласно моим идеям).

таким образом, алгоритм такой:
поменяли состояние хотя бы одного бита - вызвали функцию вывода всех битов. ничего не меняли - ничего не выводим.

Добавлено after 46 seconds:
P.S. Что и зачем вы написали на "псевдокоде" - я не понял.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

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

и программа получается что в каждой строчки основной программы нужно будет вызывать функцию SPI_WriteByte9); что получиться не совсем красиво.

Мб есть более элегантный способ обновлять значения IO ?
К примеру создать буфер который будет обновляться 100-200 раз в секунду.? и посылать\принимать значения по SPI .

Добавлено after 1 minute 7 seconds:
в псевдокоде и есть основная программа (алгоритм работы пневмоцилиндров)
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

7seg писал(а):и программа получается что в каждой строчки основной программы нужно будет вызывать функцию SPI_WriteByte9); что получиться не совсем красиво.
это вообще ни в какие ворота!
вот так должен быть построен главный цикл программы:

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

while(1){
   spi_io(); // одновременно вывели в регистры сигналы управления и считали регистры состояния
   do_main_work(); // анализ и принятие решения о новых состояниях регистров
}
и все дела
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Тогда еще более все запутанней (
Как писать алгоритм для автоматизации в do_main_work();
Так как он целиком будет зависть от Входных данных(герконов).
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

весь ваш алгоритм работает с массивами битов внутри функции do_main_work()
массив битов - это как бы кэш данных для внешних регистров, вы работаете с кэшем, а функция spi_io() этот кэш синхронизирует с внешними регистрами, т.е. считывает оттуда состояние датчиков в кэш и из кэша выводит состояние выходов.

что не понятно?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

После вызова функции spi_io(); я получу весь массив битов .А алгоритм в do_main_work();Пробежится по нему и завершится().
Немного не понятно как сделать синхронизацию. Чтобы при изменение бита в массиве внутри функции do_main_work() прошла синхронизация с настоящими IO.
К примеру включили Привод1(то есть установили бит в массиве =1) у него 2 геркона ,1 исходное положение 2ой рабочие.
И что бы включить Привод 2 нам надо дождаться чтобы геркон Привода1 сработал.
итд.

Добавлено after 2 minutes 42 seconds:
Хотя если обновление IO поставить в прерывания с большой частотой то у меня будут всегда "свежие данные."
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

блин, ну вы там в другой теме хвалились про С++17... ну не могу поверить, что вы не понимаете, как я предлагаю вам работать!

есть два массива битов: один хранит состояния входов, второй - выходов. spi_io использует первый для записи данных ИЗ внешних регистров, а второй - для вывода ВО внешние регистры. делает это одновременно, т.к. SPI работает одновременно на ввод и вывод разных данных. делает это быстро - пара десятков микросекунд. так как внешние регистры имеют входы синхронных защелок, то можно принять, что все состояния входов и выходов меняются одновременно.

основной алгоритм обработки использует данные из этих массивов. берет из "входного" состояние бита, анализирует и устанавливает, если надо, состояние бита в "выходном" массиве. так как анализ займет максимум 1 миллисекунду, ну даже пусть 10 миллисекунд, главный цикл будет прокручиваться 100 раз в секунду. то есть spi_io() тоже будет 100 раз в секунду вызываться. вам не достаточно такого быстродействия? фактически я даже не могу себе представить, что там за анализ надо делать, чтобы он длился 10 миллисекунд! за это время можно такого нагородить!!!

предполагаю, что на самом деле ваш анализ пролетит за 10-20 микросекунд, т.е. главный цикл будет крутиться в 1000 раз быстрее. по меркам любых приводных механизмов - это МГНОВЕННО.

вы всего этого не понимаете? тогда плюньте на свою разработку - не ваше это.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

Просто прошлый проект был на ОВЕН ПЛК похожий сделан ) там все немножко по другому(И как понял уже опираться на тот опыт не стоит по части программирования).
А вашу мысль я уловил.
Попробую составить схемку в протеусе на светиках+ переключательях.И прогнать в ней какой либо алгоритм.
andrei23061996@gmail.com
.................................................................................................................
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

7seg писал(а):там все немножко по другому
да точно так же там
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 303
Зарегистрирован: Ср май 03, 2017 03:22:26

Сообщение 7seg »

При работе в CodeSys не приходилось работать с битами. а обновление IO происходило на аппаратном уровне.
Мне просто пришлось только написать алгоритм.

Много кода: (пример программы)
Спойлер

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

PROGRAM PLC_PRG
VAR
	R15,R16,R17,R18,R19 :BOOL;
	aStop:INT:=1;
	iMod:INT:=0;
	iModIn : INT := 0;
	iModIn1 : INT := 0;
	iModIn2 : INT := 0;
	iModOut:INT:=0;
	iModViduv : INT:=0;
	iModPrivod: INT:=1;
	bCheckStart  : BOOL :=FALSE;
	tTON1,tTON1_1,tTON_B: TON ;
	d22: BOOL :=FALSE;d23: BOOL :=FALSE;d24: BOOL :=FALSE;d25: BOOL :=FALSE;
	d26: BOOL :=FALSE;d27: BOOL :=FALSE;d28: BOOL :=FALSE;d29: BOOL :=FALSE;d30: BOOL :=FALSE;
	d31: BOOL :=FALSE;d32: BOOL :=FALSE;d33: BOOL :=FALSE;d34: BOOL :=FALSE;d35: BOOL :=FALSE;
	T:TIME;
	bCheckIpPrivod: BOOL;
	bCheckIpOut: BOOL;
	bCheckIpViduv: BOOL;
	bCheckIpIn: BOOL;
	bDebug: BOOL;
	ObDNI: INT:=1;
	arr: ARRAY [1..15] OF INT:=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;
	d36: BOOL;
	iChekST: INT := 0;
	d37: BOOL;
	bDniDown: BOOL := 0;
	bDniTop: BOOL := 0;
	iM3: BOOL := 0;
	iM2: BOOL := 0;
	iM1: BOOL := 0;
	DebugStop: INT := 0;
	iModStopDebug: INT := 0;
	ReturnModChekFull: INT := 0;
	bChekR10: BOOL := FALSE;
	iOnePowerChek: INT := 0;
	BunkerFlag: BOOL := FALSE;
	iTEMP: BOOL := FALSE;
	StepFOR: INT := 1;
	StepiChek: INT := 1;
	StepShet: INT := 1;
	FlagPowerStopin: INT := 0;
END_VAR

(*************************************СЧЕТЧИК ЦИКЛОВ ВЫДУВА******************************************)
(*Остановка Узла загрузки за 15 циклов до окончания автоматического выдува заказа*)
IF( (MaxColichestvo-19) <= (ShetColichestvo) )THEN
	FlagPowerStopin:=1;
	pBunkerFlag:=0;
ELSE
	FlagPowerStopin:=0;
END_IF

(**ОБНУЛЕНИЕ СЧЕТА КОЛИЧИСТВА ВЫДУТЫХ ИЗДЕЛИЙ**)
IF ShetColichestvo=0 THEN
	PanelResetColichestvo:=0;
END_IF
IF PanelResetColichestvo = 1 THEN
	ShetColichestvo:=0;
END_IF

(**ЗАПИСЬ И ЗАГРУЗКА В ЕППРОМ**)
IF pMaxColichestvo = 0 THEN
	 pMaxColichestvo:= MaxColichestvo;
END_IF

IF MaxColichestvo <> pMaxColichestvo THEN
	MaxColichestvo:=pMaxColichestvo;
END_IF

(********)
pShetColichestvo:=ShetColichestvo;
(****)
IF pShetColichestvo=pMaxColichestvo THEN
	PanelFullChet:=TRUE;
ELSE
	PanelFullChet:=FALSE;
END_IF
(****)
IF PanelFullChet = TRUE THEN
	iChek:=0;
END_IF
(***************************************************************************************************************)
(****************************Пошаговое Отслежевание вкл.выкл авт.цикла ******************************)
(****************************Для Управлениие Бункером во время выдува*******************************)
CASE StepiChek OF
	1:
	IF iChek = 0 THEN
		StepiChek:=2;
	END_IF
	2:
	IF iChek=1 THEN
		CASE StepFOR OF
		1:
			iOnePowerChek:=1;
			StepFOR:=2;
		2:
			pBunkerFlag:=1;
			StepFOR:=3;
		END_CASE
	END_IF
	IF iChek=0 AND iOnePowerChek =1 THEN
		StepiChek:=3;
	END_IF
	3:
	IF iChek = 0 THEN
		StepFOR:=1;
		iOnePowerChek:=0;
		StepiChek:=4;
	END_IF
	4:
	IF iChek = 0 THEN
		StepiChek:=5;
	END_IF
	5:
	IF iChek=1 THEN
		CASE StepFOR OF
		1:
			iOnePowerChek:=1;
			StepFOR:=2;
		2:
			pBunkerFlag:=1;
			StepFOR:=3;
		END_CASE
	END_IF
	IF iChek=0 AND iOnePowerChek =1  THEN
		StepiChek:=6;
	END_IF
	6:
	IF iChek = 0 THEN
		StepFOR:=1;
		iOnePowerChek:=0;
		StepiChek:=1;
	END_IF
END_CASE
(**********************************************************************************************)
(********************************************условия*****************************************)
IF( StepiChek = 2 OR StepiChek = 5) AND iOnePowerChek = 1 THEN
	iTEMP:=TRUE;
ELSE
	iTEMP:=FALSE;
END_IF
IF iTEMP = TRUE THEN
	BunkerFlag:=1;
ELSE
	pBunkerFlag:=FALSE;  (***Обнулить Индикатор на панели *)
END_IF
IF pBunkerFlag = 1 AND iChek=1 THEN
	BunkerFlag:=1;
END_IF
IF iChek = 0 THEN
	BunkerFlag:=0;
END_IF
IF pBunkerFlag = 0 THEN
	BunkerFlag:=0;
END_IF
(************************************************************************************************)
iModSt:=1;(*Значения для включения выдува , используеться для отладки программы.*)
PanelD35:=d35;
PanelD34:=d34;
PanelD33:=d33;
PanelD32:=d32;
PanelD31:=d31;
PanelD30:=d30;
PanelD29:=d29;
PanelD28:=d28;
PanelD27:=d27;
PanelD26:=d26;
PanelD25:=d25;
PanelD24:=d24;
PanelD23:=d23;
PanelD22:=d22;
PanelD21:=d21;
PanelD20:=d20;
PanelD19:=d19;
PanelD18:=d18;
PanelD17:=d17;
PanelD16:=d16;
PanelD15:=d15;
PanelD11:=d11;
PanelD10:=d10;
PanelD9:=d09;
PanelD8:=d08;
PanelD7:=d07;
PanelD6:=d06;
PanelD5:=d05;
PanelD4:=d04;
PanelD3:=d03;
PanelD2:=d02;
PanelD1:=d01;
(*Проверка на закончиность цикла выдува*)
IF iModIn=0 AND iModIn1=0 AND iModIn2=0
	AND iModOut=0 AND iModViduv=0 AND iModPrivod=1 THEN
	ReturnModChekFull:=1;
ELSE
	ReturnModChekFull:=0;
END_IF
(*Условия Запуска Меню Отладки*)
IF PanelDebug = 1 AND iChekST = 1 THEN
	IF iModStopDebug = 0 THEN
		DebugStop:=1;
	ELSE
		DebugStop:=0;
		iModStopDebug:=0;
	END_IF
	iChek:=0; (*Обнуление флага АВт.Режима *)
(***************************РУЧНОЕ УПРАВЛЕНИЕ МОТОРАМИ ********************************)
	IF PanelMotor1 = 1 THEN
		iM1:=TRUE;
	ELSE
		iM1:=FALSE;
	END_IF
	IF PanelMotor2 = 1 THEN
		iM2:=TRUE;
	ELSE
		iM2:=FALSE;
	END_IF
	IF PanelMotor3 = 1 THEN
		iM3:=TRUE;
	ELSE
		iM3:=FALSE;
	END_IF
(**********************РУЧНОЕ УПРАВЛЕНИЕ УЗЛОМ РАЗГРУЗКИ ****************************)
	IF bCheckIpPrivod=TRUE   AND bCheckIpViduv=TRUE AND bCheckIpIn=TRUE THEN
	(*Подвод2*)
	IF PanelR19 = 1 THEN
		IF R16=TRUE AND R17= FALSE AND R18=FALSE THEN
			IF R16=TRUE AND R18=FALSE AND d34=0 THEN
				R19:=TRUE;
			ELSE
				PanelR19:=0;
			END_IF
		ELSE
			R19:=TRUE;
		END_IF
	ELSE
		IF R16<>TRUE OR R19<>TRUE OR R17<>FALSE OR R18<>FALSE THEN
			R19:=FALSE;
		ELSE
			PanelR19:=1;
		END_IF
	END_IF
	(*ПЕРЕВОРОТ 2*)
	IF PanelR18 = 1 THEN
		IF R16<>TRUE OR R19<>TRUE OR R17<>FALSE OR R18<>FALSE THEN
			R18:=TRUE;
		ELSE
			PanelR18:=0;
		END_IF
	ELSE
		IF R16<>TRUE OR R19<>TRUE OR R17<>FALSE OR R18<>TRUE THEN
			R18:=FALSE;
		ELSE
			PanelR18:=1;
		END_IF
	END_IF
	(*ПОДЪЕМ2*)
	IF PanelR17 = 1 THEN
		R17:=TRUE;
	ELSE
		R17:=FALSE;
	END_IF
	(*ПОДХВАТ 2*)
	IF PanelR16 = 1 THEN
		R16:=TRUE;
	ELSE
		R16:=FALSE;
	END_IF
	ELSE
		PanelR16:=FALSE;
		PanelR17:=FALSE;
		PanelR18:=FALSE;
		PanelR19:=FALSE;
	END_IF
(**********************РУЧНОЕ УПРАВЛЕНИЕ УЗЛОМ ЗАГРУЗКИ ****************************)
	IF bCheckIpPrivod=TRUE  AND bCheckIpOut=TRUE AND bCheckIpViduv=TRUE THEN
	IF PanelR15 = 1 THEN
		R15:=TRUE;
	ELSE
		R15:=FALSE;
	END_IF
	IF PanelR14 = 1 THEN
		R14:=TRUE;
	ELSE
		R14:=FALSE;
	END_IF
	IF PanelR13 = 1 THEN
		R13:=TRUE;
	ELSE
		R13:=FALSE;
	END_IF
	(*Подвод 1*)
	IF PanelR12 = 1 THEN
		R12:=TRUE;
	ELSE
		R12:=FALSE;
	END_IF
	(*ПЕРЕВРОТ 1*)
	IF PanelR11 = 1 THEN
		IF (R15 <> TRUE OR R12<>TRUE) THEN
			IF R10<>TRUE OR R11<>FALSE OR R12<>TRUE THEN
				R11:=TRUE;
			END_IF
		ELSE
			IF R15=TRUE AND R12=TRUE AND R10=TRUE AND R11=FALSE THEN
				PanelR11:=0;
			END_IF
		END_IF
	ELSE
		IF R15<>TRUE OR R11<>TRUE OR R12<>TRUE OR R10<>FALSE THEN
		PanelR11:=0;
		IF R10<>TRUE OR R11<>TRUE OR R12<>TRUE THEN
			R11:=FALSE;
		END_IF
		ELSE
		PanelR11:=1;
		END_IF
	END_IF
	(*ПОДЪЕМ1*)
	IF PanelR10 = 1 THEN
		IF (R15<>TRUE) OR (R11=FALSE)THEN
			R10:=TRUE;
		ELSE
			PanelR10:=0;
		END_IF
	ELSE
		R10:= FALSE ;
		PanelR10:=0;
	END_IF
	(**ПОДХВАТЫ1**)
	IF PanelR9 = 1 THEN
		R09:=TRUE;
	ELSE
		R09:=FALSE;
		PanelR9:=0;
	END_IF
	ELSE
		PanelR9:=FALSE;
		PanelR10:=FALSE;
		PanelR11:=FALSE;
		PanelR12:=FALSE;
		PanelR13:=FALSE;
		PanelR14:=FALSE;
		PanelR15:=FALSE;
	END_IF
(**********************РУЧНОЕ УПРАВЛЕНИЕ УЗЛОМ ВЫДУВА+ПРИВОД ****************************)
	IF (bCheckIpIn=TRUE AND bCheckIpOut=TRUE) THEN
		IF PanelR8 = 1 THEN
			R08:=TRUE;
		ELSE
			R08:=FALSE;
		END_IF
		IF PanelR7 = 1 THEN
			R07:=TRUE;
		ELSE
			R07:=FALSE;
		END_IF
		IF (d05=0 AND d06=1)THEN
			IF PanelR6 = 1 THEN
				IF R03=TRUE THEN
					R06:=TRUE;
				END_IF
			ELSE
				R06:=FALSE;
			END_IF
		END_IF
		IF (d05=0 AND d06=1)THEN
			IF PanelR5 = 1 THEN
				R05:=TRUE;
			ELSE
				R05:=FALSE;
			END_IF
		END_IF
		IF PanelR4 = 1 THEN
			R04:=TRUE;
		ELSE
				R04:=FALSE;
		END_IF
		IF  PanelR3 = 1THEN
			R03:=TRUE;
		ELSE
			IF (d09=1 AND d10=0) AND d11=1 THEN
				R03:=FALSE;
			ELSE
				PanelR3:=1;
			END_IF
		END_IF
		IF ((d05=1 AND d06=0) OR (d01=1 AND d02=0)) THEN
			IF PanelR2 = 1 THEN
				R02:=TRUE;
			ELSE
				IF d01=1 AND d02=0 THEN
					R02:=FALSE;
				END_IF
			END_IF
		ELSE
			PanelR2:=0;
		END_IF
		IF PanelR1= 1   THEN
			R01:=TRUE;
		ELSE
			R01:=FALSE;
		END_IF
	ELSE
		PanelR1:=0;PanelR2:=0;PanelR3:=0;PanelR4:=0;PanelR5:=0;
		PanelR6:=0;PanelR7:=0;PanelR8:=0;
	END_IF
ELSE
	PanelR1:=0;PanelR2:=0;PanelR3:=0;PanelR4:=0;PanelR5:=0;
	PanelR6:=0;PanelR7:=0;PanelR8:=0;PanelR9:=0;PanelR10:=0;
	PanelR11:=0;PanelR12:=0;PanelR13:=0;PanelR14:=0;PanelR15:=0;
	PanelR16:=0;PanelR17:=0;PanelR18:=0;PanelR19:=0;
	PanelMotor1:=0;PanelMotor2:=0;PanelMotor3:=0;
	IF DebugStop = 1 AND iChek=0 AND ReturnModChekFull = 1 THEN
	(*DEBUG Стоп*)
	iM1:=FALSE;
	iM2:=FALSE;
	iM3:=FALSE;
	PanelMotor1:=0;
	PanelMotor2:=0;
	PanelMotor3:=0;
	R07:=FALSE;
	R08:=FALSE;
	R09:=FALSE;
	R13:=FALSE;
	R14:=FALSE;
	R15:=FALSE;
	tTON_B(IN:=FALSE);
	CASE iModStopDebug OF
	0:
	tTON1(IN:=FALSE);
	iModStopDebug:=1;
	1:
		tTON1(IN:=TRUE,PT:=T#400MS);
		IF tTON1.Q = TRUE THEN
			R04:=FALSE;
			R05:=FALSE;
			R06:=FALSE;
			R10:=FALSE;
			R11:=FALSE;
			R12:=FALSE;
			R16:=FALSE;
			iModStopDebug:=2;
		END_IF
	2:
		tTON1(IN:=FALSE); iModStopDebug:=3;
	3:	IF R06 = FALSE AND d11 = TRUE THEN
			tTON1(IN:=TRUE,PT:=T#700MS);
			IF tTON1.Q = TRUE THEN
				R03:=FALSE;
				R17:=FALSE;
				R19:=FALSE;
				iModStopDebug:=4;
			END_IF
		END_IF
	4:
		tTON1(IN:=FALSE); iModStopDebug:=5;
	5:
		tTON1(IN:=TRUE,PT:=T#400MS);
		IF tTON1.Q = TRUE THEN
			R01:=FALSE;
			R02:=FALSE;
			R18:=FALSE;
		END_IF
	END_CASE
	END_IF
END_IF
(*********************************************************************************************************)
(************************************Код для работы со временем выдува***************************)
tT1 :=REAL_TO_TIME(t1*1000);
tT2 :=REAL_TO_TIME(t2*1000);
tT3 :=REAL_TO_TIME(t3*1000);
tT4 :=REAL_TO_TIME(t4*1000);
IF t1=0 THEN
	t1:=st1;
	t2:=st2;
	t3:=st3;
	t4:=st4;
END_IF
IF t1>0 THEN
	st1:=t1;
	st2:=t2;
	st3:=t3;
	st4:=t4;
END_IF
pSumTime:=t1+t2+t3+t4;
(********************************************************************************************)
mo.11:=NOT iM1; (*Konveer*)
mo.12:=NOT iM2; (*Roliki*)
mo.13:=NOT iM3; (*Meshalka*)
IF iChek = 1 AND BunkerFlag=TRUE THEN
	IF aStop = 0 AND iChek=1 THEN
		iM2:=TRUE;
	ELSE
		iM2:=FALSE;
	END_IF
	IF bDniDown = FALSE THEN
		iM1:=TRUE;
	ELSE
		IF bDniDown=TRUE  THEN
			iM1:=FALSE;
		END_IF
	END_IF
	IF bDniTop = FALSE THEN
		tTON_B(IN:=FALSE);
		iM3:=TRUE;
	ELSE
		tTON_B  ( IN := TRUE ,  PT:=T#3s );
		IF tTON_B.ET >= T#2s THEN
			iM3:=FALSE;
		END_IF
	END_IF
ELSE
	IF (BunkerFlag=FALSE AND PanelDebug=0) OR  (FlagPowerStopin =1 AND PanelDebug=0 )THEN
		iM1:=FALSE;
		iM2:=FALSE;
		iM3:=FALSE;
	END_IF
END_IF
bDniTop:=mi1.1; (*DNI TOP*)
bDniDown:=mi.15;(*DNI DOWN*)
mi1.0;(*ERROR STOP*)
IF (mi1.0 = FALSE) THEN
	aStop:=1;
	iChekST:=0;
END_IF
IF (mi1.0 = TRUE) AND iChekST = 1 THEN
	aStop:=0;
END_IF

bCheckIpPrivod;
IF d01 AND d03 AND d05 = TRUE THEN
	bCheckIpPrivod:=TRUE;
	ELSE
	bCheckIpPrivod:=FALSE;
END_IF

bCheckIpViduv;
IF (d07 AND d09 AND d11) = TRUE THEN
	bCheckIpViduv:=TRUE;
ELSE
	bCheckIpViduv:=FALSE;
END_IF

bCheckIpIn;
IF d15 AND d17 AND d19 AND d21
	AND d25 AND d26 = TRUE THEN
	bCheckIpIn:=TRUE;
ELSE
	bCheckIpIn:=FALSE;
END_IF
bCheckIpOut;
IF d28 AND d30 AND d32 AND d34 = TRUE THEN
	bCheckIpOut:=TRUE;
ELSE
	bCheckIpOut:=FALSE;
END_IF

bCheckStart;
IF bCheckIpPrivod AND bCheckIpIn AND
	bCheckIpOut AND bCheckIpViduv = TRUE THEN
	bCheckStart:=TRUE;
ELSE
	bCheckStart:=FALSE;
END_IF


d22:=mi.0;d23:=mi.1;d24:=mi.2;
d25:=mi.3;d26:=mi.4;d27:=mi.5;
d28:=mi.6;d29:=mi.7;d30:=mi.8;
d31:=mi.9;d32:=mi.10;d33:=mi.11;
d34:=mi.12;d35:=mi.13;d36:=mi.14;
mo.0:=R15;mo.1:=R16;mo.2:=R17;
mo.3:=R18;mo.4:=R19;

T:= T#300ms;
CASE ObDNI OF
	1:
		IF R02=TRUE THEN
		ObDNI:=2;
		END_IF
	2:
		IF R02 = FALSE THEN ObDNI:=3; END_IF
	3:
		IF R02 = FALSE THEN
			IF d36 = TRUE THEN
				arr[1]:=arr[2];
				arr[2]:=arr[3];
				arr[3]:=arr[4];
				arr[4]:=arr[5];
				arr[5]:=arr[6];
				arr[6]:=arr[7];
				arr[7]:=arr[8];
				arr[8]:=arr[9];
				arr[9]:=arr[10];
				arr[10]:=arr[11];
				arr[11]:=arr[12];
				arr[12]:=arr[13];
				arr[13]:=arr[14];
				arr[14]:=arr[15];
				arr[15]:=1;
			ELSE
				arr[1]:=arr[2];
				arr[2]:=arr[3];
				arr[3]:=arr[4];
				arr[4]:=arr[5];
				arr[5]:=arr[6];
				arr[6]:=arr[7];
				arr[7]:=arr[8];
				arr[8]:=arr[9];
				arr[9]:=arr[10];
				arr[10]:=arr[11];
				arr[11]:=arr[12];
				arr[12]:=arr[13];
				arr[13]:=arr[14];
				arr[14]:=arr[15];
				arr[15]:=0;

			END_IF;
		END_IF
		ObDNI:=1;
END_CASE
IF iChek = 0 THEN
	iM1:=FALSE;
	iM2:=FALSE;
	iM3:=FALSE;
	IF iModPrivod=4 THEN
		iModPrivod:=1;
	END_IF
END_IF
(*Аварийный Стоп*)
IF aStop = 1 THEN
	PanelaStop:=TRUE;
ELSE
	PanelaStop:=FALSE;
END_IF
IF aStop  = 1 THEN
	iM1:=FALSE;
	iM2:=FALSE;
	iM3:=FALSE;
	PanelMotor1:=0;
	PanelMotor2:=0;
	PanelMotor3:=0;
	iModIn:= 0;
	iModIn1:= 0;
	iModIn2:= 0;
	iModOut:=0;
	iModViduv:=0;
	iModPrivod:=1;
	R07:=FALSE;
	R08:=FALSE;
	R09:=FALSE;
	R13:=FALSE;
	R14:=FALSE;
	R15:=FALSE;
	tTON_B(IN:=FALSE);
	CASE iMod OF
	0:
	tTON1(IN:=FALSE);
	iMod:=1;
	1:
		tTON1(IN:=TRUE,PT:=T#400MS);
		IF tTON1.Q = TRUE THEN
			R04:=FALSE;
			R05:=FALSE;
			R06:=FALSE;
			R10:=FALSE;
			R11:=FALSE;
			R12:=FALSE;
			R16:=FALSE;
			iMod:=2;
		END_IF
	2:
		tTON1(IN:=FALSE); iMod:=3;
	3:	IF R06 = FALSE AND d11 = TRUE THEN
			tTON1(IN:=TRUE,PT:=T#700MS);
			IF tTON1.Q = TRUE THEN
				R03:=FALSE;
				R17:=FALSE;
				R19:=FALSE;
				iMod:=4;
			END_IF
		END_IF
	4:
		tTON1(IN:=FALSE); iMod:=5;
	5:
		tTON1(IN:=TRUE,PT:=T#400MS);
		IF tTON1.Q = TRUE THEN
			R01:=FALSE;
			R02:=FALSE;
			R18:=FALSE;
			iMod:=6;
		END_IF
	6:
		tTON1(IN:=FALSE);
		IF iChek  = 0 AND PanelDebug = 0  THEN
			iChekST:=1;
		END_IF
	END_CASE
END_IF

IF aStop  = 0  THEN
	iMod:=0;
END_IF

CASE iModPrivod OF
1:
	IF (aStop=0 ) AND (bCheckStart = TRUE AND iChek = 1) AND ( iChekST= 1)THEN
		iModPrivod:=2;
	END_IF
2:
	IF iChek = 1 THEN
		iModPrivod:=3;
	END_IF
3:
	R01:=TRUE;
	IF R01 = TRUE THEN iModPrivod:=4; END_IF
4:
	IF d02 = TRUE AND d01 = FALSE THEN
		R02:= TRUE;
		IF R02=TRUE THEN iModPrivod:=5; END_IF
	END_IF
5 :
	IF d04 = TRUE AND d03 = FALSE THEN
		R03:= TRUE;
		IF R03=TRUE THEN
		iModViduv:=1;
		iModOut:=1;
		iModIn :=1;
		R01:=FALSE;
		iModPrivod:=6;
		END_IF
	END_IF
6 :
	IF R01 = FALSE AND d01 = TRUE THEN
		R02:=FALSE;
	END_IF
7 :
	R03:=FALSE;
	iModPrivod:=1;
END_CASE

CASE iModViduv OF
1:
	IF d06 = TRUE THEN
		R04:=TRUE;
		IF R04 = TRUE AND d08 = TRUE AND d07 = FALSE THEN
			  iModViduv:=2;
		END_IF
	END_IF
2:
	IF R04 = TRUE AND d08 = TRUE THEN
		R05:=TRUE;
		IF R05 = TRUE AND d10 = TRUE AND d09 = FALSE THEN
			  StepShet:=1;
			  iModViduv:=3;
			  tTON1_1 (IN := FALSE);
		END_IF
	END_IF
3:
	tTON1_1 (IN := TRUE, PT:=  tT1+tT2+tT3+tT4+T#1s);
	IF tTON1_1.ET >= T#0s THEN R06:=TRUE; END_IF
	IF tTON1_1.ET >= tT1 AND iModST =1 AND arr[1]=1 THEN R07:=TRUE; END_IF
	IF tTON1_1.ET >= tT2+tT1 AND iModST =1 AND  arr[1]=1THEN
		R08:=TRUE;
		CASE StepShet OF
		1:
		ShetColichestvo:=ShetColichestvo+1;
		StepShet:=2;
		END_CASE
	 END_IF
	IF tTON1_1.ET >= tT1+tT2+tT3  THEN
		R07:=FALSE;
		R08:=FALSE;
		IF tTON1_1.ET >= tT1+tT2+tT3+tT4  THEN
			R06:=FALSE;
		END_IF
		IF  R06 = FALSE THEN
			tTON1_1 (in:=FALSE);
			iModViduv:=4;
		END_IF
	END_IF
4:
	R05:=FALSE;
	IF R05 = FALSE AND d09 = TRUE THEN
		R04:=FALSE;
		iModViduv:=5;
	END_IF
5:
	IF d11 AND d07 = TRUE AND d08=FALSE THEN
		iModPrivod:=7;
		iModViduv:=0;
	END_IF
END_CASE

CASE iModOut OF
1:
	IF d06 = TRUE THEN
		R19:=TRUE;
		IF R19 = TRUE AND d35 = TRUE AND d34 = FALSE THEN
			  iModOut:=2;
		END_IF
	END_IF
2:
	R16:=TRUE;
	IF R16 = TRUE AND d29 = TRUE AND d28 = FALSE THEN
			 iModOut:=3;
	END_IF
3:
	R17:=TRUE;
	IF R17 = TRUE AND d31 = TRUE AND d30 = FALSE THEN
			 iModOut:=4;
	END_IF

4:
	R18:=TRUE;
	IF R18 = TRUE AND d33 = TRUE AND d32 = FALSE THEN
			 iModOut:=5;
	END_IF;
5:
	R19:=FALSE;
	IF R19 = FALSE  AND d34 = TRUE AND d35 = FALSE THEN
		R16:=FALSE;
		IF R16 = FALSE  AND d28 = TRUE AND d29 = FALSE THEN
			R17:=FALSE;
			R18:=FALSE;
			IF R17=FALSE  AND R18=FALSE THEN
				iModOut:=0;
			END_IF
		END_IF
	END_IF
END_CASE

CASE iModIn OF
1:
	IF d06 = TRUE AND FlagPowerStopin = 0 THEN
		R09:=TRUE;
		IF R09 = TRUE AND d16 = TRUE AND d15 = FALSE THEN
			  iModIn:=2;
		END_IF
	END_IF
2:
	R10:=TRUE;
	IF R10 = TRUE AND d17=FALSE AND d18=TRUE THEN
		iModIn:=3;
	END_IF
3:
	R11:=TRUE;
	IF R11 = TRUE AND d19 = FALSE AND d20 = TRUE THEN
	R14:=TRUE;
	END_IF
	IF R11=TRUE AND R14=TRUE AND d24=TRUE AND d20=TRUE THEN
		iModIn1:=1;
		iModIn2:=1;
		iModIn:=0;
	END_IF
END_CASE

CASE iModIn1 OF
1:
	IF R11= TRUE AND d20=TRUE THEN
		R12:=TRUE;
		IF R12=TRUE AND d21=FALSE AND d22=TRUE THEN
			iModIn1:=2;
		END_IF
	END_IF
2:
	R10:=FALSE;
	IF R10= FALSE AND d17=TRUE AND d18=FALSE THEN
		iModIn1:=3;
	END_IF
3:
	R15:=TRUE;
	IF R15=TRUE AND d26=FALSE AND d27=TRUE THEN
		iModIn1:=4;
	END_IF
4:
	R09:=FALSE;
	IF R09=FALSE AND d16=FALSE AND d15=TRUE THEN
		iModIn1:=5;
	END_IF
5:
	R15:=FALSE;
	IF R15=FALSE AND d27=FALSE AND d26=TRUE THEN
		iModIn1:=6;
	END_IF
6:
	R12:=FALSE;
	IF R12=FALSE AND d22=FALSE AND d21=TRUE THEN
		iModIn1:=7;
	END_IF
7:
	R11:=FALSE;
	IF R11=FALSE AND d20=FALSE AND d19=TRUE THEN
		iModIn1:=8;
	END_IF
8:
	iModIn1:=0;
END_CASE

CASE iModIn2 OF
1:
	R14:=TRUE;
	IF R14= TRUE AND d24=TRUE THEN
		iModIn2:=2;
	END_IF
2:
	R13:=TRUE;
	IF  R13=TRUE AND d23=TRUE THEN
		iModIn2:=3;
	END_IF
3:
	R14:=FALSE;
	R13:=FALSE;
	iModIn2:=0;
END_CASE
andrei23061996@gmail.com
.................................................................................................................
Ответить

Вернуться в «AVR»