Lavr wrote:А вы не могли бы привести небольшой но понятный пример программирования на этом "паскалеподобном недоязыке"?
Не знаю, насколько понятный, но реальный, хоть и неудачный пример программы управления шаговым двигателем.
СХЕМА - это второй файл проекта на релейно-контактной логике, вообще это мой первый опыт программирования ПЛК. Ну, программа пускателя с кнопками "пуск", "стоп" не считается, это некий "Hello World!".
Сперва идут переменные в отдельном окне (в скобках закомментированы и ненужны), во втором окне собственно тело программы.
Code: Select all
PROGRAM PLC_PRG
VAR
(* A1: BOOL := 0; (*запуск цикла подачи*)
A2: BOOL := 0; (*цикл подачи*)
A3: BOOL := 0; (*система безопасности*)
A4: BOOL := 0; (*шаг подачи*)*)
A5: WORD := 0; (*число шагов подачи*)
A6: WORD := 0; (*счётчик шагов подачи*)
A8: WORD := 0; (*счётчик шагов замедления*)
A9: WORD := 1; (*направление замедления*)
A10: WORD := 0; (*счётчик замедлитель 1*)
A11: WORD :=0; (*счётчик замедлитель 2*)
(* A12: WORD := 0; (*счётчик шагов*)*)
(* A13: WORD := 0; (*число циклов*)*)
A14: WORD := 0; (*остаток шагов цикла*)
A15: BOOL :=0; (*указатель замедления*)
(* A16: BOOL :=0; (*указатель цикла*)*)
(* A17: BOOL := 0; (*ручная подача*)*)
A18: WORD := 0; (*замедление*)
A22: BOOL :=0; (*ручная подача*)
END_VAR
IF A2=FALSE THEN IF A19<10 THEN A19:=10; END_IF;
IF A19>3200 THEN A19:=3200; END_IF;
IF A7<1 THEN A7:=1; END_IF;
IF A7>5 THEN A7:=5; END_IF;
IF A12>400 THEN A12:=400; END_IF;
IF SPEED>5 THEN SPEED:=5; END_IF;
IF SPEED<1 THEN SPEED:=1; END_IF;
A18:=5-SPEED; END_IF;
IF ALARM=TRUE THEN CYCLE:=FALSE; A2:=FALSE; A16:=FALSE; A22:=FALSE; END_IF;
IF MOTOR=FALSE THEN CYCLE:=FALSE; A2:=FALSE; END_IF;
IF A13=0 THEN CYCLE:=FALSE; A25:=TRUE; CXEMA; RETURN; ELSE A25:=FALSE; IF METAL=FALSE THEN IF MODE=TRUE THEN CYCLE:=FALSE; END_IF; END_IF; END_IF;
IF A17=TRUE THEN IF A2=FALSE THEN A2:=A17; A4:=FALSE; A6:=1; A8:=25; A9:=1; A10:=0; A11:=0; A15:=FALSE; A22:=TRUE; END_IF; END_IF;
IF K3=FALSE THEN IF A16=TRUE THEN A16:=FALSE; IF MODE=TRUE THEN IF NO_MET=FALSE THEN A13:=A13-1; END_IF; ELSE CYCLE:=FALSE; END_IF; END_IF; END_IF;
IF A2=FALSE THEN A2:=A1; A5:=(A19*20/8)+(A19/30)+((A19/20)*A12/75); A4:=FALSE; A6:=A5; A8:=25; A9:=1; A10:=0; A11:=0; A15:=FALSE; CXEMA; RETURN; END_IF;
IF A3=TRUE THEN A2:=FALSE; CXEMA; RETURN; END_IF;
IF A4=FALSE THEN IF A10=0 THEN A4:=TRUE; A10:=A8+1; IF A11>0 THEN A11:=A11-1; ELSE A8:=A8-A9; IF A8>A18 THEN A11:=A7*(25-A8)/A8; END_IF;END_IF; CXEMA; RETURN; END_IF; END_IF;
IF A4=TRUE THEN IF A17=FALSE THEN A6:=A6-1; ELSE IF A8>A18 THEN A6:=A6+1; END_IF; END_IF; A4:=FALSE; END_IF;
IF A8=A18 THEN IF A15=FALSE THEN A9:=0; IF A22=FALSE THEN A14:=A5-A6; ELSE A14:=A6; END_IF; A15:=TRUE; END_IF; ELSE IF A22=FALSE THEN IF A6<A5/2 THEN A9:=65535; A15:=TRUE; END_IF; END_IF; END_IF;
IF A6<A14 THEN IF A17=FALSE THEN A9:=65535; END_IF; END_IF;
IF A6=0 THEN A2:=FALSE; IF A22=FALSE THEN A16:=TRUE; ELSE A22:=FALSE; END_IF; CXEMA; RETURN; END_IF;
IF A10>0 THEN A10:=A10-1; CXEMA; RETURN; END_IF;
IF A9<>0 THEN IF A11>0 THEN A11:=A11-1; ELSE A8:=A8-A9; IF A8>A18 THEN A11:=A7*(25-A8)/A8; END_IF; END_IF; END_IF;
CXEMA; RETURN;
Поскольку не нашёл как делать нормальные ветвления, я сделал костыль в виде переключения алгоритма между двумя файлами.
Эта задача управления шаговиком/сервоприводом через примерно год была осуществлена на дешёвой отладочной платке с миландровским микроконтроллером и с нормальным алгоритмом разгона/торможения.
Больше я на ST не писал, мои немногочисленные проги для ПЛК писались чисто на релейке.