Код:
CASE enc_nom OF
1 : enc_maska := 2#00001100; enc_sdvig := 2; enc_newState := ADR(g_enc2NewState); enc_prevState := ADR(g_enc2PrevState); enc_bitColor := BIT1; enc_tic := ADR(gr_Tik2);
2 : enc_maska := 2#00110000; enc_sdvig := 4; enc_newState := ADR(g_enc3NewState); enc_prevState := ADR(g_enc3PrevState); enc_bitColor := BIT2; enc_tic := ADR(gr_Tik3);
3 : enc_maska := 2#11000000; enc_sdvig := 6; enc_newState := ADR(g_enc4NewState); enc_prevState := ADR(g_enc4PrevState); enc_bitColor := BIT3; enc_tic := ADR(gr_Tik4);
ELSE
enc_maska := 2#00000011; enc_sdvig := 0; enc_newState := ADR(g_enc1NewState); enc_prevState := ADR(g_enc1PrevState); enc_bitColor := BIT0; enc_tic := ADR(gr_Tik1); enc_nom := 0;
END_CASE
enc_newState^ := in AND enc_maska; (* считали порт энкодера и выделили состояние энкодера *)
IF enc_sdvig <> 0 THEN enc_newState^ := SHR( enc_newState^, enc_sdvig ); END_IF
IF enc_newState^ <> enc_prevState^ THEN
IF enc_newState^ = 0 THEN
IF enc_prevState^ = 2 THEN bChObor[enc_nom] := bChObor[enc_nom] + 1; IF bChObor[enc_nom] * enc_tic^ > gr_maxZad THEN bChObor[enc_nom] := bChObor[enc_nom] - 1; END_IF
ELSIF enc_prevState^ = 1 THEN
bChObor[enc_nom] := bChObor[enc_nom] - 1;
IF bChObor[enc_nom] < 0 THEN bChObor[enc_nom] := 0; END_IF
END_IF
END_IF
enc_prevState^ := enc_newState^;
END_IF
enc_nom := enc_nom +1;