nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 29 Mar 2024 00:00



Reply to topic  [ 38 posts ]  Go to page Previous  1, 2, 3
Контроллеры Siemens SIMATIC S7-300 
Author Message
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22417
Location: Silicon Valley
Reply with quote
Lavr wrote:
Электромонтёр wrote:
Сам по себе Siemens SIMATIC S7-300 стандартный промконтроллер и программируется на одном из пяти стандартных языков, чаще всего мне попадались LD - релейно-контактной логики, и ST - паскалеподобный недоязык программирования.

А вы не могли бы привести небольшой но понятный пример программирования на этом "паскалеподобном недоязыке"?

Или, возможно, коллега Icer может такой пример привести тут? :wink:
Icer wrote:
...вероятно из-за паскаля головного "моска").


На сименсовском языке ST называется SCL:
Quote:
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:
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

_________________
:dj: https://mastodon.social/@Shaos


12 Aug 2020 07:59
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
На сименсовском языке ST называется SCL:
Quote:
SCL — структурированный язык управления, по синтаксису близкий к Pascal;
Вот например: ...

Ну ты хотя бы кратко объяснил, что к чему... а то - непонятный программный кусок... :osad:

_________________
iLavr


12 Aug 2020 08:02
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22417
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
На сименсовском языке ST называется SCL:
Quote:
SCL — структурированный язык управления, по синтаксису близкий к Pascal;
Вот например: ...

Ну ты хотя бы кратко объяснил, что к чему... а то - непонятный программный кусок... :osad:

Да там вроде всё интуитивно понятно - читается как английский текст :)
Вот с отбивкой и комментами от меня:
Code:
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

_________________
:dj: https://mastodon.social/@Shaos


12 Aug 2020 08:13
Profile WWW
Fanat

Joined: 23 Feb 2018 22:20
Posts: 89
Reply with quote
Lavr wrote:
А вы не могли бы привести небольшой но понятный пример программирования на этом "паскалеподобном недоязыке"?


Не знаю, насколько понятный, но реальный, хоть и неудачный пример программы управления шаговым двигателем. СХЕМА - это второй файл проекта на релейно-контактной логике, вообще это мой первый опыт программирования ПЛК. Ну, программа пускателя с кнопками "пуск", "стоп" не считается, это некий "Hello World!".

Сперва идут переменные в отдельном окне (в скобках закомментированы и ненужны), во втором окне собственно тело программы.

Code:
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 не писал, мои немногочисленные проги для ПЛК писались чисто на релейке.


12 Aug 2020 08:24
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Спасибо за примеры, джентльмены! Живые примеры прочитать полезно, тем более я сам сторонник текстового программирования.

Я посмотрел - топик по Ladder Logic сам я и затеял, но такой уровень абстракции не по мне... :-?
Хотя всё, собственно, понятно там... :wink:

_________________
iLavr


12 Aug 2020 08:39
Profile
Fanat

Joined: 23 Feb 2018 22:20
Posts: 89
Reply with quote
Lavr wrote:
такой уровень абстракции не по мне...

Ну мне как электрику такой метод программирования наоборот удобен, программу пишешь, как схему рисуешь :) Инженерам удобно функциональными блоками программу рисовать :)
Это уж больше дело привычки.


12 Aug 2020 09:46
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22417
Location: Silicon Valley
Reply with quote
Электромонтёр wrote:
Lavr wrote:
такой уровень абстракции не по мне...

Ну мне как электрику такой метод программирования наоборот удобен, программу пишешь, как схему рисуешь :) Инженерам удобно функциональными блоками программу рисовать :)
Это уж больше дело привычки.

Да - мне больше FBD был по душе - я на нём нагородил алгоритмов противоаварийной автоматики для Сургутской ГРЭС-2 в своё время ;)

_________________
:dj: https://mastodon.social/@Shaos


12 Aug 2020 09:54
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Я, может, немного не в тему, но в своё время я изучал Win API на Visual C++ 1.0 от M$.
И там подробно с хорошими хелпами и примерами было расписано всё, как работает Венда...
И всё программирование было текстом.

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

_________________
iLavr


12 Aug 2020 10:11
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 38 posts ]  Go to page Previous  1, 2, 3

Who is online

Users browsing this forum: No registered users and 15 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.