PDA

Просмотр полной версии : Owen Logic ST язык программирования Structured Text



sot
27.12.2021, 09:42
Привет камрады!

ОБНОВИЛ ТЕМУ. 29/12/2021
получил на руки ИПП120 и приготовил для Вас новое видео с программой.
2 минуты наслаждения отсутствием логики. ;-)
здесь по ссылке видео и программа. безо всяких там модбасов и пр. чиста под ИПП.
https://dropmefiles.com/UQXP1
video:
https://youtu.be/0cBUJFjyAA0

Спасибо разработчикам овенлоджик за внедрение ST.
Однако, давайте ответим на 3 КЛЮЧЕВЫХ ВОПРОСА!!!

1. Важно!
как так вышло, что конструкция

if not isAnyVar then .... - не работает !!! не работает если мы ставим NOT , а работает:
if isAnyVar = false then ...

кто тестировал логические операции?

2. почему в функции нельзя использовать AND OR XOR NOT на UDINT?

3. почему нельзя вставлять функции в макросы?

Спасибо за внимание

PS. какой размер стека у функции?

Филоненко Владислав
27.12.2021, 09:55
Привет камрады!

Спасибо разработчикам овенлоджик за внедрение ST.
Однако, давайте ответим на 3 КЛЮЧЕВЫХ ВОПРОСА!!!

1. Важно!
как так вышло, что конструкция

if not isAnyVar then .... - не работает !!! не работает если мы ставим NOT , а работает:
if isAnyVar = false then ...

кто тестировал логические операции?

2. почему в функции нельзя использовать AND OR XOR NOT на UDINT?

Спасибо за внимание

PS. какой размер стека у функции?

1. В IF используется булевое значение для ветвления. Если делать NOT UDINT - получится UDINT. Надо конвертировать
2. Логические функции работают, приведите код где не работают.
4. Функции используют общий стек, расход стека рассчитывается и ограничивается свободными ресурсами ПР

Малышев Олег
27.12.2021, 09:55
1. А почему не использовать конверсию UDINT_BOOL_TO BOOL_TO_UDINT или нужен побитовый? Битовые операции тестировали много людей, в том числе и я.
2. Можно с конверсией. Или нужны побитовые?
3. Таких требований по этому не было. Имеет смысл написать.

Размер стека функции рассчитывается с учетом результатов промежуточных вычислений

игорь68
27.12.2021, 11:17
Лиха беда начало. Админы. Срочно отдельную ветку по ST. Иначе потом не возможно будет простым смертным на фб невозможно будет искать инфу в горах вопросов по ST

Filini
27.12.2021, 12:02
Лиха беда начало. Админы. Срочно отдельную ветку по ST. Иначе потом не возможно будет простым смертным на фб невозможно будет искать инфу в горах вопросов по ST

полностью согласен! Пока ST полностью не похоронили ПР от Овена.

sot
27.12.2021, 15:30
Товарищи, коллеги.
SOt не врёт - не умеет врать. Логика мать его ....

обновленное видео ссылка в первом сообщении
https://owen.ru/forum/showthread.php?t=35757&p=371593&viewfull=1#post371593

РЕАЛЬНО СУЩЕСТВУЕТ ПРОБЛЕМА С ЛОГИКОЙ.

смотрите.
https://dropmefiles.com/J0VMy
https://dropmefiles.com/X3PgS
video

Первая ссылка - программа.
вторая ссылка - видео.
в
Идея такая: в синтетическом тесте мы переключаем вход Var1 в состояние =4096 - это включает переменную Manual
Функция видит, что произошло переключение и замирает на функциональном режиме Mode = 1
Где ждёт пропадание сигнала Manual

Это НЕ работает на железе. к чему приложено видео.

Функция перескакивает на режим Mode = 2 - что означает, что конструкция
if not Manual then
cMode := 2;
end_if;

НЕ РАБОТАЕТ!!!!!
если написать
if Manual=false then

тогда всё ок!!!

ПОНИМАЕТЕ???

sot
27.12.2021, 15:33
1. А почему не использовать конверсию UDINT_BOOL_TO BOOL_TO_UDINT или нужен побитовый? Битовые операции тестировали много людей, в том числе и я.
2. Можно с конверсией. Или нужны побитовые?
3. Таких требований по этому не было. Имеет смысл написать.

Размер стека функции рассчитывается с учетом результатов промежуточных вычислений

1,2 нужно побитные операции с переменными любого разряда.
3. это странно,.. и это нужно. я бы не прочь размезать функции внутри самописных FB - это круто.

Стэк: - озвучьте все цифры. плиз. скока там вообще?

Вольд
27.12.2021, 15:34
Товарищи, коллеги.
SOt не врёт - не умеет врать. Логика мать его ....

РЕАЛЬНО СУЩЕСТВУЕТ ПРОБЛЕМА С ЛОГИКОЙ.

смотрите.
https://dropmefiles.com/J0VMy
https://dropmefiles.com/X3PgS
video

Первая ссылка - программа.
вторая ссылка - видео.
в
Идея такая: в синтетическом тесте мы переключаем вход Var1 в состояние =4096 - это включает переменную Manual
Функция видит, что произошло переключение и замирает на функциональном режиме Mode = 1
Где ждёт пропадание сигнала Manual

Это НЕ работает на железе. к чему приложено видео.

Функция перескакивает на режим Mode = 2 - что означает, что конструкция
if not Manual then
cMode := 2;
end_if;

НЕ РАБОТАЕТ!!!!!
если написать
if Manual=false then

тогда всё ок!!!

ПОНИМАЕТЕ???

Понимаем, что компилятор с ST пока сырой. Но паниковать не надо, разработчики все поправят.

sot
27.12.2021, 15:45
код привёл. я программирую с 1987 года.

sot
27.12.2021, 15:49
Вы посмотрели видео, увидели то о чём я говорю?

Я - за безопасность. АСУ ТП блин это же не айфон же ))

Ваш ответ не понятен. Вы - из среды разработчиков?

Каким образом в продакшен попал такой сырец???
я подставляюсь перед заказчиками - ищу проблему блин часами и на гарантирую работоспособность!
У меня фобия развилась на слово NOT.

что скажете?

Вольд
27.12.2021, 16:24
код привёл. я программирую с 1987 года.

А я еще раньше. ;)

Вольд
27.12.2021, 16:28
Вы посмотрели видео, увидели то о чём я говорю?

Я - за безопасность. АСУ ТП блин это же не айфон же ))

Ваш ответ не понятен. Вы - из среды разработчиков?

Каким образом в продакшен попал такой сырец???
я подставляюсь перед заказчиками - ищу проблему блин часами и на гарантирую работоспособность!
У меня фобия развилась на слово NOT. мать. блин.

что скажете?

Я такой же разработчик как и вы и то же жду ST в OL и многие ждут. ST в OL только появился, идет его тестирование. Прежде чем вычистят все ошибки пройдет не мало времени. Не надо пока закладываться на ST в текущих проектах.

kondor3000
27.12.2021, 16:39
Что вы тут базар развели, я уже всё протестировал давно. NOT надо писать (большими буквами), а не not. Всё работает, даже пример выкладывал.

UprZam :=(Kn AND Dv AND NOT UF AND NOT Zam) ;

После уже автомат состояний написал на IF ... THEN, тоже работает.

Вольд
27.12.2021, 16:42
Что вы тут базар развели, я уже всё протестировал давно. NOT надо писать (большими буквами), а не not. Всё работает, даже пример выкладывал.

Как все просто. ;)

sot
27.12.2021, 17:09
Что вы тут базар развели, я уже всё протестировал давно. NOT надо писать (большими буквами), а не not. Всё работает, даже пример выкладывал.

UprZam :=(Kn AND Dv AND NOT UF AND NOT Zam) ;

После уже автомат состояний написал на IF ... THEN, тоже работает.

Кондор, респект!
(не могу проверить, заказ уже ушел)

Есть кто на форуме, кто подтвердит, что конструкции not Var и NOT Var - отличаются в исполнении ???
ПЛИЗ

sot
27.12.2021, 17:15
Давайте ещё одну тему.

Использование имён переменных.

Каким-то образом внутренние переменные функций попадают в общий стэк переменных и им вредят,

простая проверка - создать вход на рабочем поле с именем "А", и создать функцию, где на входе будет переменная именем "а"

после этого в проэкте начинается трэш.
Переменные все косячатся.

КУ?

sot
27.12.2021, 17:18
Я такой же разработчик как и вы и то же жду ST в OL и многие ждут. ST в OL только появился, идет его тестирование. Прежде чем вычистят все ошибки пройдет не мало времени. Не надо пока закладываться на ST в текущих проектах.

не согласен.
Я не бэта-тестер. мне за это не платят.
будут платить из овна - потестирую. имею навык.
иначе же - претензия, т.к. в хэлпе производитель написал, что язык соответствует ГОСТ ;-)

kondor3000
27.12.2021, 17:37
Кондор, респект!
(не могу проверить, заказ уже ушел)

Есть кто на форуме, кто подтвердит, что конструкции not Var и NOT Var - отличаются в исполнении ???
ПЛИЗ

Проверил и not в симуляции, работает тоже в IF ... THEN

sot
27.12.2021, 17:45
Проверил и not в симуляции, работает тоже в IF ... THEN

Товарищ, я не понял.
Прикол в том, что в симуляции оно работает и так и эдак.
А вот на железе - совсем не так.
см. видео в теме. я приложил и видео и проект для ИПП120.

Или же я тебя не так понял.

Вольд
27.12.2021, 18:08
Кондор, респект!
(не могу проверить, заказ уже ушел)

Есть кто на форуме, кто подтвердит, что конструкции not Var и NOT Var - отличаются в исполнении ???
ПЛИЗ

OL дает подсветку при вводе неверного кода на ST.

kondor3000
27.12.2021, 18:20
Товарищ, я не понял.
Прикол в том, что в симуляции оно работает и так и эдак.
А вот на железе - совсем не так.
см. видео в теме. я приложил и видео и проект для ИПП120.

Или же я тебя не так понял.

У вас ошибка в макросе ищите сами где, у меня в симуляции тоже 2 выдаёт, хотя вы пишите, что в симуляции всё работает.

Зачем вам вообще строка newMode := cMode * 65536 + w;
и SHR на выходе
если вы можете прямо выход задать 1 или 0. Сами себя запутали.
Макрос можно до 1 строки сократить. Без IF.. THEN вообще.

Например так:



function newMode: bool;
var_input
prevMode : uDint;
Manual,
Auto: bool;
end_var

newMode:= not Auto and manual;
end_function
А на выходе поставить преобразование в UDINT 58516

sot
28.12.2021, 03:11
У вас ошибка в макросе ищите сами где, у меня в симуляции тоже 2 выдаёт, хотя вы пишите, что в симуляции всё работает.

Зачем вам вообще строка newMode := cMode * 65536 + w;
и SHR на выходе
если вы можете прямо выход задать 1 или 0. Сами себя запутали.
Макрос можно до 1 строки сократить. Без IF.. THEN вообще.

Например так:



function newMode: bool;
var_input
prevMode : uDint;
Manual,
Auto: bool;
end_var

newMode:= not Auto and manual;
end_function
А на выходе поставить преобразование в UDINT 58516

Милый Кондор,
если ты не понял зачем я умножаю на 65536 и потом смещаю на 16 бит, то поучись заново, ок?

По сути.
Мой алгоритм подразумевает цикличность программы исполнения, а не то говно, которое ты предоставил публике.

Ещё раз, для тех кто в танке!

ПОСМОТРИТЕ ВИДЕО и ПРОГРАММУ.
если в программе изменить строку
if not Manual then
на
if Manual=false then

то всё работает на железе.

АУ! РАЗРАБОТЧИКИ
ПРОКОММЕНТИРУЙТЕ!


case prevMode of
0:
if manual then
cMode := 1;
end_if;

1:
if not Manual then
cMode := 2;
end_if;

2: cMode := 2; //приехали
end_case;

sot
28.12.2021, 03:15
У вас ошибка в макросе ищите сами где, у меня в симуляции тоже 2 выдаёт, хотя вы пишите, что в симуляции всё работает.

Зачем вам вообще строка newMode := cMode * 65536 + w;
и SHR на выходе
если вы можете прямо выход задать 1 или 0. Сами себя запутали.
Макрос можно до 1 строки сократить. Без IF.. THEN вообще.

Например так:



function newMode: bool;
var_input
prevMode : uDint;
Manual,
Auto: bool;
end_var

newMode:= not Auto and manual;
end_function
А на выходе поставить преобразование в UDINT 58516

Кондор,
покажи как у тебя выдаёт 2 в симуляции на моей программе.
иначе - ты врёшь.

kondor3000
28.12.2021, 09:01
Кондор,
покажи как у тебя выдаёт 2 в симуляции на моей программе.
иначе - ты врёшь.
Во первых, я вам не тыкал, во вторых, вы даже свою программу не можете проверить, а утверждаете, что NOT не работает. Сделайте простой пример с одним IF , а не видео где у вас что то не так работает.
Как я проверял, подал на маску 4096, чтобы сработал выход isS_MANUAL, а потом подал 0, чтобы выход выключился,
и переменная Mode из 1 переключается в 2. Смотри скрин. 58529
В третьих, общение в подобном тоне считаю недопустимым. Можете продолжать писать гадости самому себе.

Филоненко Владислав
28.12.2021, 10:47
Кондор,
покажи как у тебя выдаёт 2 в симуляции на моей программе.
иначе - ты врёшь.

Итак. Код у Вас специфический т.к. NOT - побитовая операция, а автоприведение типов в данном случае не работает.
Рассмотрим поведение кода:

В случае IF NOT MANUAL THEN
Ни присваивания, ни приведения типов нет, т.е. идёт сравнение результата NOT MANUAL с нулём.
Результат NOT MANUAL - число UDINT.
Если MANUAL=0 - результат равен 0xFFFFFFFF
Если MANUAL=1 - результат равен 0xFFFFFFFE
если использовать (NOT MANUAL) в IF - всегда будет TRUE, т.к. FALSE =0, а TRUE - это любое значение, что не FALSE.

Вот и происходит такое поведение.

Что делать?
IF (NOT MANUAL=false) then

Ну Вы это и сами нашли.

Нам тоже есть что поправить чтобы среда предупреждала или сама приводила типы.

lagutin
28.12.2021, 14:17
если использовать (NOT MANUAL) в IF - всегда будет TRUE, т.к. FALSE =0, а TRUE - это любое значение, что не FALSE.

Теоретики уже все объяснили:). Я проверил на ПР и все действительно так. И разницы между NOT и not никакой.
Самое досадное, как по мне, что эмуляция не то что не сообщает об ошибке, она все отрабатывает как нужно. А ПР нет. Вот этот код всегда выдает 2
if manual then
function3 := 1;
end_if;
if NOT manual then
function3 := 2;
end_if;
Что очевидно из предыдущего поста. Но мы же привыкли писать !а в других языках. Так что многие попадут в эту ловушку NOT a, тем более, что симуляция отрабатывает все как надо. Хотя почему то не все привыкли, что функция в любом языке возвращает одно значение и требуют здесь возврата нескольких... Хотя можно вернуть массив и потом решить задачу его распаковки:confused:
А вот это условие ведь тоже не имеет смысла и всегда равно false? верно я понимаю???
IF (NOT MANUAL=false) then

Dimensy
28.12.2021, 14:58
Результат NOT MANUAL - число UDINT.


Разъясните, пожалуйста: Manual - тип bool, а логическое выражение not Manual - udint?

lagutin
28.12.2021, 15:27
if (NOT manual) = udint_to_bool(1) then
Вот так компилятор пропускает. При попытке сравнить с числом -пишет о несоответствии типов. Выходит чтo bool....

Dimensy
28.12.2021, 15:32
Просто выражение A := not B в железе тоже ерунду выдает. Получается, что ПР воспринимает в ST тип bool как udint и соответственно обрабатывает, а лоджик обрабатывает bool как bool - вот и ерунда получается

lagutin
28.12.2021, 16:03
Но ведь как писали выше not Bool - всегда равно истина. Я вообще не понимаю как и где можно тогда применять NOT. Походу его вообще лучше не применять пока. А условия от греха подальше всегда писать полные = false, да и = true, на всякий случай.

keysansa
28.12.2021, 16:19
Но ведь как писали выше not Bool - всегда равно истина. Я вообще не понимаю как и где можно тогда применять NOT. Походу его вообще лучше не применять пока. А условия от греха подальше всегда писать полные = false, да и = true, на всякий случай.

Надо узнать, на каком языке пишется обработчик пользовательской программы. Это не 100%, но даст ясность. 0 в C тоже BOOL (FALSE).

keysansa
28.12.2021, 16:22
Что делать?
IF (NOT MANUAL=false) then

Ну Вы это и сами нашли.

Нам тоже есть что поправить чтобы среда предупреждала или сама приводила типы.


Результатом NOT (Manual = FALSE) является TRUE, при условии, что MANUAL = FALSE.

ЗЫ. Прошу прощения, не дочитал до конца. Вы правы.
Хочется только уточнить, что не сравнивается со значением, а анализируется флаг "ноля" в последней операции.

sot
29.12.2021, 04:30
Согласно стандарту IEC 61131-3, язык ST поддерживает весь необходимый набор типов данных.
Тип данных переменной определяет род информации, диапазон представлений и множество допустимых операций.

Тщательнее надо (с) Жванецкий :*)

sot
29.12.2021, 18:21
1. А почему не использовать конверсию UDINT_BOOL_TO BOOL_TO_UDINT или нужен побитовый? Битовые операции тестировали много людей, в том числе и я.
2. Можно с конверсией. Или нужны побитовые?
3. Таких требований по этому не было. Имеет смысл написать.

Размер стека функции рассчитывается с учетом результатов промежуточных вычислений

1. Выяснили, что реально не работает NOT isAnyBoolVar (bool), т.к. волшебным образом становится UDINT;
=> вывод - не работает в стандарте языка, исправление будет? или типа это фича?

2. приведите пример, где работает W := W shl 16; (w: uDint)
Я вас недопонял. Как с конверсией это сделать? Побитные операции на UDINT?

3. Да, очень очень надо функции в макросы.


PS. А есть форум (раздел), где пипками на базе ST мерятся? Типа я создал макрос, которого ещё никто не видел... и т.п..... ну макрос-то ещё никто не создал, но, ИМХО тема-то уже нужна :) лиха беда начало

sot
29.12.2021, 18:26
Результатом NOT (Manual = FALSE) является TRUE, при условии, что MANUAL = FALSE.

ЗЫ. Прошу прощения, не дочитал до конца. Вы правы.
Хочется только уточнить, что не сравнивается со значением, а анализируется флаг "ноля" в последней операции.

Товарищ,

NOT (FALSE = FALSE) => FALSE

или мы придумываем новые стандарты?