|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Контроллеры Siemens SIMATIC S7-300
Author |
Message |
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
На сименсовском языке ST называется SCL: Вот пример функционального блока, написанного на 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
| | | | |
|
12 Aug 2020 07:59 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну ты хотя бы кратко объяснил, что к чему... а то - непонятный программный кусок...
_________________ iLavr
|
12 Aug 2020 08:02 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
Да там вроде всё интуитивно понятно - читается как английский текст Вот с отбивкой и комментами от меня: | | | | 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
|
12 Aug 2020 08:13 |
|
|
Электромонтёр
Fanat
Joined: 23 Feb 2018 22:20 Posts: 89
|
Не знаю, насколько понятный, но реальный, хоть и неудачный пример программы управления шаговым двигателем. СХЕМА - это второй файл проекта на релейно-контактной логике, вообще это мой первый опыт программирования ПЛК. Ну, программа пускателя с кнопками "пуск", "стоп" не считается, это некий "Hello World!". Сперва идут переменные в отдельном окне (в скобках закомментированы и ненужны), во втором окне собственно тело программы. Поскольку не нашёл как делать нормальные ветвления, я сделал костыль в виде переключения алгоритма между двумя файлами. Эта задача управления шаговиком/сервоприводом через примерно год была осуществлена на дешёвой отладочной платке с миландровским микроконтроллером и с нормальным алгоритмом разгона/торможения. Больше я на ST не писал, мои немногочисленные проги для ПЛК писались чисто на релейке.
|
12 Aug 2020 08:24 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Спасибо за примеры, джентльмены! Живые примеры прочитать полезно, тем более я сам сторонник текстового программирования. Я посмотрел - топик по Ladder Logic сам я и затеял, но такой уровень абстракции не по мне... Хотя всё, собственно, понятно там...
_________________ iLavr
|
12 Aug 2020 08:39 |
|
|
Электромонтёр
Fanat
Joined: 23 Feb 2018 22:20 Posts: 89
|
Ну мне как электрику такой метод программирования наоборот удобен, программу пишешь, как схему рисуешь Инженерам удобно функциональными блоками программу рисовать Это уж больше дело привычки.
|
12 Aug 2020 09:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22422 Location: Silicon Valley
|
Да - мне больше FBD был по душе - я на нём нагородил алгоритмов противоаварийной автоматики для Сургутской ГРЭС-2 в своё время
|
12 Aug 2020 09:54 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Я, может, немного не в тему, но в своё время я изучал Win API на Visual C++ 1.0 от M$. И там подробно с хорошими хелпами и примерами было расписано всё, как работает Венда... И всё программирование было текстом. А потом всякие "обёртки" начались, всё стали в "контейнеры" упрятывать, всякие Визарды пошли... И всё становилось более непонятным и запутанным. В итоге, сейчас вроде говорят, что под старшие Венды на Win API писать не рекомендуется...
_________________ iLavr
|
12 Aug 2020 10:11 |
|
|
Who is online |
Users browsing this forum: No registered users and 11 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
|
|