Контроллеры Siemens SIMATIC S7-300

Печатные платы, программируемая логика, разработка и изготовление аппаратуры

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24088
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Контроллеры Siemens SIMATIC S7-300

Post by Shaos »

Lavr wrote:
Электромонтёр wrote:Сам по себе Siemens SIMATIC S7-300 стандартный промконтроллер и программируется на одном из пяти стандартных языков, чаще всего мне попадались LD - релейно-контактной логики, и ST - паскалеподобный недоязык программирования.
А вы не могли бы привести небольшой но понятный пример программирования на этом "паскалеподобном недоязыке"?

Или, возможно, коллега Icer может такой пример привести тут? :wink:
Icer wrote:...вероятно из-за паскаля головного "моска").
На сименсовском языке ST называется SCL:
SCL — структурированный язык управления, по синтаксису близкий к Pascal;
Вот пример функционального блока, написанного на SCL (an example of a 2-D interpolator):
https://support.industry.siemens.com/tf//WW/en/posts/scl-sample-program/92692?page=0&pageSize=10

Code: Select all

FUNCTION_BLOCK FBXXX
CONST
NUM_DATA_PTS := 12;
END_CONST

VAR_INPUT
X : REAL;
END_VAR

VAR_OUTPUT
Y : REAL;
END_VAR
VAR
TableData : STRUCT
XData : ARRAY [0..NUM_DATA_PTS - 1] OF REAL := 800, 900, 1000, 1100, 1150, 1200,
1250, 1300, 1350, 1400, 1450, 1500;
YData : ARRAY [0..NUM_DATA_PTS - 1] OF REAL := 0.553, 0.681, 0.786, 0.868, 0.901, 0.930,
0.953, 0.971, 0.986, 0.996, 1.000, 1.000;
END_STRUCT;
XIndex : INT;
END_VAR

BEGIN
IF X < TableData.XData[0] THEN
Y := TableData.YData[0];
ELSE
IF X > TableData.XData[NUM_DATA_PTS - 1] THEN
Y := TableData.YData[NUM_DATA_PTS - 1];
ELSE
XIndex := 1;
WHILE (XIndex < NUM_DATA_PTS) AND (X >= TableData.XData[XIndex]) DO
XIndex := XIndex + 1;
END_WHILE;
Y := ((X - TableData.XData[XIndex - 1]) *
(TableData.YData[XIndex] - TableData.YData[XIndex - 1]) /
(TableData.XData[XIndex] - TableData.XData[XIndex - 1]) +
TableData.YData[XIndex - 1]);
END_IF;
END_IF;
END_FUNCTION_BLOCK
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Контроллеры Siemens SIMATIC S7-300

Post by Lavr »

Shaos wrote:На сименсовском языке ST называется SCL:
SCL — структурированный язык управления, по синтаксису близкий к Pascal;
Вот например: ...
Ну ты хотя бы кратко объяснил, что к чему... а то - непонятный программный кусок... :osad:
iLavr
User avatar
Shaos
Admin
Posts: 24088
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Контроллеры Siemens SIMATIC S7-300

Post by Shaos »

Lavr wrote:
Shaos wrote:На сименсовском языке ST называется SCL:
SCL — структурированный язык управления, по синтаксису близкий к Pascal;
Вот например: ...
Ну ты хотя бы кратко объяснил, что к чему... а то - непонятный программный кусок... :osad:
Да там вроде всё интуитивно понятно - читается как английский текст :)
Вот с отбивкой и комментами от меня:

Code: Select all

FUNCTION_BLOCK FBXXX // имя функционального блока
 CONST // блок констант
  NUM_DATA_PTS := 12;
 END_CONST // конец блока констант

 VAR_INPUT // блок входных переменных
  X : REAL; // входная переменная X с плавающей точкой
 END_VAR // конец блока входных переменных

 VAR_OUTPUT // блок выходных переменных
  Y : REAL; // выходная переменная X с плавающей точкой
 END_VAR // конец блока входных переменных

 VAR // блок внутренних переменных
  TableData : STRUCT // описание структуры TableData
   XData : ARRAY [0..NUM_DATA_PTS - 1] OF REAL := 800, 900, 1000, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500;
   YData : ARRAY [0..NUM_DATA_PTS - 1] OF REAL := 0.553, 0.681, 0.786, 0.868, 0.901, 0.930, 0.953, 0.971, 0.986, 0.996, 1.000, 1.000;
  END_STRUCT; // конец описания структуры
  XIndex : INT; // целочисленная переменная XIndex
 END_VAR // конец блока внутренних переменных

 BEGIN // начало программы
  IF X < TableData.XData[0] THEN
   Y := TableData.YData[0];
  ELSE
   IF X > TableData.XData[NUM_DATA_PTS - 1] THEN
    Y := TableData.YData[NUM_DATA_PTS - 1];
   ELSE
    XIndex := 1;
    WHILE (XIndex < NUM_DATA_PTS) AND (X >= TableData.XData[XIndex]) DO
     XIndex := XIndex + 1;
    END_WHILE;
    Y := ((X - TableData.XData[XIndex - 1]) *
      (TableData.YData[XIndex] - TableData.YData[XIndex - 1]) /
      (TableData.XData[XIndex] - TableData.XData[XIndex - 1]) +
      TableData.YData[XIndex - 1]);
   END_IF;
  END_IF;
END_FUNCTION_BLOCK // конец функционального блока
Далее этот функциональный блок можно использовать в других языках типа LD или FBD
Я тут за главного - если что шлите мыло на me собака shaos точка net
Электромонтёр
Fanat
Posts: 97
Joined: 23 Feb 2018 22:20

Re: Контроллеры Siemens SIMATIC S7-300

Post by Электромонтёр »

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 не писал, мои немногочисленные проги для ПЛК писались чисто на релейке.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Контроллеры Siemens SIMATIC S7-300

Post by Lavr »

Спасибо за примеры, джентльмены! Живые примеры прочитать полезно, тем более я сам сторонник текстового программирования.

Я посмотрел - топик по Ladder Logic сам я и затеял, но такой уровень абстракции не по мне... :-?
Хотя всё, собственно, понятно там... :wink:
iLavr
Электромонтёр
Fanat
Posts: 97
Joined: 23 Feb 2018 22:20

Re: Контроллеры Siemens SIMATIC S7-300

Post by Электромонтёр »

Lavr wrote:такой уровень абстракции не по мне...
Ну мне как электрику такой метод программирования наоборот удобен, программу пишешь, как схему рисуешь :) Инженерам удобно функциональными блоками программу рисовать :)
Это уж больше дело привычки.
User avatar
Shaos
Admin
Posts: 24088
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Контроллеры Siemens SIMATIC S7-300

Post by Shaos »

Электромонтёр wrote:
Lavr wrote:такой уровень абстракции не по мне...
Ну мне как электрику такой метод программирования наоборот удобен, программу пишешь, как схему рисуешь :) Инженерам удобно функциональными блоками программу рисовать :)
Это уж больше дело привычки.
Да - мне больше FBD был по душе - я на нём нагородил алгоритмов противоаварийной автоматики для Сургутской ГРЭС-2 в своё время ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Контроллеры Siemens SIMATIC S7-300

Post by Lavr »

Я, может, немного не в тему, но в своё время я изучал Win API на Visual C++ 1.0 от M$.
И там подробно с хорошими хелпами и примерами было расписано всё, как работает Венда...
И всё программирование было текстом.

А потом всякие "обёртки" начались, всё стали в "контейнеры" упрятывать, всякие Визарды пошли...
И всё становилось более непонятным и запутанным. :roll:
В итоге, сейчас вроде говорят, что под старшие Венды на Win API писать не рекомендуется... :-?
iLavr