при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
#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;
}
Код: Выделить всё
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
Код: Выделить всё
// количество битов
#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); // установка нужного бита
}Код: Выделить всё
/*отослать байт данных по 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;
}
Я не знаю, какие задачи у вас конкретно стоят и как именно вы будете их решать, но попробую показать удобство моего подхода следующими примерами. Попробуйте решить вот такие задачи вашим способом и приведите код решения здесь, а потом я покажу вам своё решение этих задач - и сравним, что нагляднее.7seg писал(а):Я не совсем понял приведенный пример выше, разве так не наглядней ?
Код: Выделить всё
// 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);Код: Выделить всё
While(1)
{
Если (ВходнойБит1 == 1) то
ВыходнойБит1=1
Если (ВходнойБит2 ==1 и ВходнойБит1 !=0 )то
ВыходнойБит2=1;
ВыходнойБит3=1;
Конец
Конец
}это вообще ни в какие ворота!7seg писал(а):и программа получается что в каждой строчки основной программы нужно будет вызывать функцию SPI_WriteByte9); что получиться не совсем красиво.
Код: Выделить всё
while(1){
spi_io(); // одновременно вывели в регистры сигналы управления и считали регистры состояния
do_main_work(); // анализ и принятие решения о новых состояниях регистров
}да точно так же там7seg писал(а):там все немножко по другому
Код: Выделить всё
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