[?]: Примеры задач с энкодером
Posted: Wed Jul 10, 2013 5:15 pm
может кто то написать пример программы работы энкодера на step 7. И вообще где можно посмотреть примеры программ.
Code: Select all
A(
O "M601"
O "M603"
)
A #azot_o
S "M1280"
AN #azot_o
R "M1280"
// Открытие
A "кн. управлен. с панели".COMANDO.c648
O
A "кн. управлен. с панели".COMANDO.c650
A "M1280"
= #AuxA //Открытие
// Закрытие
A "кн. управлен. с панели".COMANDO.c649
O
A "кн. управлен. с панели".COMANDO.c650
AN "M1280"
O
AN #ConMan //ручное управление
AN #ConAut //автоматическое управление
AN "M1280"
= #AuxB //Закрытие
//работа азот-инжектора
A #AuxA //открытие
S #out_azot //выход азот-инжектора
A #AuxB //закрытие
R #out_azot //выход азот-инжектора
A #out_azot
A "SQ205.4"
= "A331" // выход на азот инжектор
Code: Select all
//Function :
//This program scales a continuous counter.
//Typical application: FM350 encoder counter module use.
//
//Counter range: 0..2^32..0 and so on...
//Function result: delta space between two conter readings.
// Value is scaled into engineering units
VAR_INPUT
IN_ACTUAL_COUNTER_VALUE : DWORD ; //Actual counter value [pulses]
IN_ENC_SCAL_K : REAL ; //Encoder counter scaling factor [pulses/eng.unit]
IN_DELTA_POS_LIMIT : INT ; //Delta position limit [eng.units]
END_VAR
VAR_OUTPUT
OUT_DELTA_SPACE : INT ; //Delta space [eng.unit]
END_VAR
VAR_IN_OUT
IN_OUT_DELTA_POS_REM : REAL ; //Aux real used to save delta position reminder [eng.units]
IN_OUT_POSITION : INT ; //Position [engineering units]
IN_OUT_PREV_COUNTR_VALUE : DINT ; //Counter value at previous loop [pulses]
END_VAR
VAR_TEMP
TMP_DELTA_POS : DINT ; //Delta position between two samplings [eng.units]
TMP_DELTA_POS_LIMIT_P : DINT ; //Delta position limit + [eng.units]
TMP_DELTA_POS_LIMIT_N : DINT ; //Delta position limit - [eng.units]
TMP_AUX_REAL : REAL ; //Aux real
TMP_AUX_INT : INT ; //Aux integer
END_VAR
BEGIN
NETWORK
TITLE =DELTA SPACE CALCULATION AND SCALING
//ENCODER INPUT VARIABLE "IN_ACTUAL_COUNTER_VALUE" DATA STRUCTURE:
//MSW = Number of motor turns
//LSW = Actual motor angle position (0°->360° = 0 -> 65535 pulses)
// RAW DELTA
// RAW DELTA SPACE [pulses]
L #IN_ACTUAL_COUNTER_VALUE;
L #IN_OUT_PREV_COUNTR_VALUE;
-D ;
DTR ;
T #TMP_AUX_REAL;
L #IN_OUT_DELTA_POS_REM;
+R ;
// SCALED OUTPUT
L #IN_ENC_SCAL_K;
/R ;
TRUNC ;
T #TMP_DELTA_POS;
// COMPENSATION BY REMINDER SCALING
DTR ;
L #IN_ENC_SCAL_K;
*R ;
L #TMP_AUX_REAL;
TAK ;
-R ;
// REMINDERS UPDATE
L #IN_OUT_DELTA_POS_REM;
+R ;
T #IN_OUT_DELTA_POS_REM;
L #IN_ACTUAL_COUNTER_VALUE;
T #IN_OUT_PREV_COUNTR_VALUE;
NETWORK
TITLE =TEST OF DELTA POSITION LIMIT
A( ;
L #IN_DELTA_POS_LIMIT;
ITD ;
T #TMP_DELTA_POS_LIMIT_P;
SET ;
SAVE ;
CLR ;
A BR;
) ;
JNB _001;
L #TMP_DELTA_POS_LIMIT_P;
NEGD ;
T #TMP_DELTA_POS_LIMIT_N;
_001: NOP 0;
NETWORK
TITLE =TEST OF DELTA POSITION LIMIT
//IF delta position in one PLC loop > or < of safe delta position limit
//THEN delta position = 0
//
//If remote I/O is turned OFF the counter value goes to 0. In this case a dummy
//delta space may be detected. This limit is used to disregard this dummy delta
//space.
//Set the limit following this example:
//Eng. units: mm
//Max speed of equipment: 6000 mm/min (100 mm/sec)
//Plc loop = 20ms
//Max delta space in one plc loop: 100mm/s *0.02s = 2mm
//Safe limit to set: 4 mm (twice the max possible delta pulse)
A( ;
O( ;
L #TMP_DELTA_POS;
L #TMP_DELTA_POS_LIMIT_P;
>D ;
) ;
O( ;
L #TMP_DELTA_POS;
L #TMP_DELTA_POS_LIMIT_N;
<D ;
) ;
) ;
JNB _002;
L L#0;
T #TMP_DELTA_POS;
_002: NOP 0;
NETWORK
TITLE =POSITION COUNTER IN ENGINEERING UNITS (FUNCTION OUPUT)
//Remark: the position preset is done by the calling program
//0= replaced with TMP_DELTA_POS
L #IN_OUT_POSITION;
L 0;
+I ;
T #IN_OUT_POSITION;
NOP 0;
NETWORK
TITLE =DELTA SPACE IN ENGINEERING UNITS (FUNCTION OUPUT)
L #TMP_DELTA_POS;
T #OUT_DELTA_SPACE;
NOP 0;
NETWORK
TITLE =FUNCTION RETURN
SET ;
SAVE ;
END_FUNCTION