Например TDA7294

Форум РадиоКот • Просмотр темы - SPI или i2C ?
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 22:52:59

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 50 ]    , 2,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Вт окт 24, 2017 08:30:36 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Сразу предупреждаю: протеус некорректно моделирует поведение регистров 74HC597, которые я рекомендовал вам для опроса дискретных входов - протеус не поддерживает корректно их каскадирование. один в протеусе нормально себя показывает, а цепочка из двух и более ведет себя, как один - первый. просто имейте ввиду.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Вт окт 24, 2017 08:32:35 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
С 595 более мение научился работать , а вот может кто подсказать алгоритм на 597 , и их совместное использование с 595.

_________________
andrei23061996@gmail.com
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Вт окт 24, 2017 08:40:23 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
читайте даташит - там все сказано. алгоритм тот же: сначала защелкиваем данные со входов, затем подаем такты и последовательно принимаем. очень удобно применять SPI: MOSI для вывода в 595-е, MISO для ввода из 597-ых, все одновременно получается.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 06:36:13 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
А у кого какой опыт общение со сдвиговыми ригистрами? вариант общаться в виде 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
.................................................................................................................


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 06:37:59 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Как по мне, так при большом количестве отдельных "управляемых" битов с ними надо работать или по принципу "все сделать так" или управлять индивидуально каждым по его "сквозному" номеру. Как, например, при вашем подходе с битовыми полями изменить состояние 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); // установка нужного бита
}
и потом уже манипулирую битами по их номеру.
да, получается не очень быстро, но универсально. а скорость манипулирования на практике не так уж и принципиальна

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 07:40:48 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
Я не совсем понял приведенный пример выше, разве так не наглядней ?

К примеру для изменения 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
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 07:40:54 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
7seg писал(а):
Я не совсем понял приведенный пример выше, разве так не наглядней ?
Я не знаю, какие задачи у вас конкретно стоят и как именно вы будете их решать, но попробую показать удобство моего подхода следующими примерами. Попробуйте решить вот такие задачи вашим способом и приведите код решения здесь, а потом я покажу вам своё решение этих задач - и сравним, что нагляднее.
1. Установить все биты в 1
2. установить все четные биты в 1, а нечетные в 0
3. Инвертировать состояние всех битов с 20-го по 30-й включительно

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 08:16:45 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
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
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 08:20:32 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
ок, понятно.
а теперь мой вариант
Код:
// 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 бита" - делаться будет простым "копированием" значения битов...

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 08:44:14 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
а как правильно поддерживать актуальную информацию на сдвиговых регистрах ?
то есть, у нас есть основная программа к примеру:
Код:
While(1)
{
Если (ВходнойБит1 == 1) то
    ВыходнойБит1=1
    Если (ВходнойБит2 ==1 и ВходнойБит1 !=0 )то
          ВыходнойБит2=1;
          ВыходнойБит3=1;
    Конец
Конец
}



Как правильно обновлять данные своевременно по SPI ?

_________________
andrei23061996@gmail.com
.................................................................................................................


Последний раз редактировалось 7seg Чт окт 26, 2017 09:00:02, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 08:48:02 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Т.к. регистры по SPI у вас соединены в цепочку и "частично" обновляться не могут, вы должны всегда обновлять состояние всех регистров. то есть вы всегда должны выводить по SPI весь массив bitfield (согласно моим идеям).

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

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

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 08:59:08 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
Вся основная программа будет состоять из изменения регистров в определенном порядке ,
А каждый шаг основной программы будет проверять датчики и если условия соблюдены переходить дальше.

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

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

Добавлено after 1 minute 7 seconds:
в псевдокоде и есть основная программа (алгоритм работы пневмоцилиндров)

_________________
andrei23061996@gmail.com
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 09:18:47 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
7seg писал(а):
и программа получается что в каждой строчки основной программы нужно будет вызывать функцию SPI_WriteByte9); что получиться не совсем красиво.
это вообще ни в какие ворота!
вот так должен быть построен главный цикл программы:
Код:
while(1){
   spi_io(); // одновременно вывели в регистры сигналы управления и считали регистры состояния
   do_main_work(); // анализ и принятие решения о новых состояниях регистров
}
и все дела

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 09:27:27 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
Тогда еще более все запутанней (
Как писать алгоритм для автоматизации в do_main_work();
Так как он целиком будет зависть от Входных данных(герконов).

_________________
andrei23061996@gmail.com
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 09:30:30 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
весь ваш алгоритм работает с массивами битов внутри функции do_main_work()
массив битов - это как бы кэш данных для внешних регистров, вы работаете с кэшем, а функция spi_io() этот кэш синхронизирует с внешними регистрами, т.е. считывает оттуда состояние датчиков в кэш и из кэша выводит состояние выходов.

что не понятно?

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 09:46:53 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
После вызова функции 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
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 09:55:10 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
блин, ну вы там в другой теме хвалились про С++17... ну не могу поверить, что вы не понимаете, как я предлагаю вам работать!

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

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

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

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

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 10:04:11 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
Просто прошлый проект был на ОВЕН ПЛК похожий сделан ) там все немножко по другому(И как понял уже опираться на тот опыт не стоит по части программирования).
А вашу мысль я уловил.
Попробую составить схемку в протеусе на светиках+ переключательях.И прогнать в ней какой либо алгоритм.

_________________
andrei23061996@gmail.com
.................................................................................................................


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 10:16:08 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
7seg писал(а):
там все немножко по другому
да точно так же там

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: SPI или i2C ?
СообщениеДобавлено: Чт окт 26, 2017 10:43:50 
Потрогал лапой паяльник
Аватар пользователя

Карма: 3
Рейтинг сообщений: 3
Зарегистрирован: Ср май 03, 2017 03:22:26
Сообщений: 303
Рейтинг сообщения: 0
При работе в 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
.................................................................................................................


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 50 ]    , 2,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y