Просмотр полной версии : Owen Logic ST язык программирования Structured Text
Привет камрады!
ОБНОВИЛ ТЕМУ. 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. Таких требований по этому не было. Имеет смысл написать.
Размер стека функции рассчитывается с учетом результатов промежуточных вычислений
Лиха беда начало. Админы. Срочно отдельную ветку по ST. Иначе потом не возможно будет простым смертным на фб невозможно будет искать инфу в горах вопросов по ST
Лиха беда начало. Админы. Срочно отдельную ветку по ST. Иначе потом не возможно будет простым смертным на фб невозможно будет искать инфу в горах вопросов по ST
полностью согласен! Пока ST полностью не похоронили ПР от Овена.
Товарищи, коллеги.
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
тогда всё ок!!!
ПОНИМАЕТЕ???
1. А почему не использовать конверсию UDINT_BOOL_TO BOOL_TO_UDINT или нужен побитовый? Битовые операции тестировали много людей, в том числе и я.
2. Можно с конверсией. Или нужны побитовые?
3. Таких требований по этому не было. Имеет смысл написать.
Размер стека функции рассчитывается с учетом результатов промежуточных вычислений
1,2 нужно побитные операции с переменными любого разряда.
3. это странно,.. и это нужно. я бы не прочь размезать функции внутри самописных FB - это круто.
Стэк: - озвучьте все цифры. плиз. скока там вообще?
Товарищи, коллеги.
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 пока сырой. Но паниковать не надо, разработчики все поправят.
код привёл. я программирую с 1987 года.
Вы посмотрели видео, увидели то о чём я говорю?
Я - за безопасность. АСУ ТП блин это же не айфон же ))
Ваш ответ не понятен. Вы - из среды разработчиков?
Каким образом в продакшен попал такой сырец???
я подставляюсь перед заказчиками - ищу проблему блин часами и на гарантирую работоспособность!
У меня фобия развилась на слово NOT.
что скажете?
код привёл. я программирую с 1987 года.
А я еще раньше. ;)
Вы посмотрели видео, увидели то о чём я говорю?
Я - за безопасность. АСУ ТП блин это же не айфон же ))
Ваш ответ не понятен. Вы - из среды разработчиков?
Каким образом в продакшен попал такой сырец???
я подставляюсь перед заказчиками - ищу проблему блин часами и на гарантирую работоспособность!
У меня фобия развилась на слово 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, тоже работает.
Что вы тут базар развели, я уже всё протестировал давно. NOT надо писать (большими буквами), а не not. Всё работает, даже пример выкладывал.
Как все просто. ;)
Что вы тут базар развели, я уже всё протестировал давно. NOT надо писать (большими буквами), а не not. Всё работает, даже пример выкладывал.
UprZam :=(Kn AND Dv AND NOT UF AND NOT Zam) ;
После уже автомат состояний написал на IF ... THEN, тоже работает.
Кондор, респект!
(не могу проверить, заказ уже ушел)
Есть кто на форуме, кто подтвердит, что конструкции not Var и NOT Var - отличаются в исполнении ???
ПЛИЗ
Давайте ещё одну тему.
Использование имён переменных.
Каким-то образом внутренние переменные функций попадают в общий стэк переменных и им вредят,
простая проверка - создать вход на рабочем поле с именем "А", и создать функцию, где на входе будет переменная именем "а"
после этого в проэкте начинается трэш.
Переменные все косячатся.
КУ?
Я такой же разработчик как и вы и то же жду ST в OL и многие ждут. ST в OL только появился, идет его тестирование. Прежде чем вычистят все ошибки пройдет не мало времени. Не надо пока закладываться на ST в текущих проектах.
не согласен.
Я не бэта-тестер. мне за это не платят.
будут платить из овна - потестирую. имею навык.
иначе же - претензия, т.к. в хэлпе производитель написал, что язык соответствует ГОСТ ;-)
kondor3000
27.12.2021, 17:37
Кондор, респект!
(не могу проверить, заказ уже ушел)
Есть кто на форуме, кто подтвердит, что конструкции not Var и NOT Var - отличаются в исполнении ???
ПЛИЗ
Проверил и not в симуляции, работает тоже в IF ... THEN
Проверил и not в симуляции, работает тоже в IF ... THEN
Товарищ, я не понял.
Прикол в том, что в симуляции оно работает и так и эдак.
А вот на железе - совсем не так.
см. видео в теме. я приложил и видео и проект для ИПП120.
Или же я тебя не так понял.
Кондор, респект!
(не могу проверить, заказ уже ушел)
Есть кто на форуме, кто подтвердит, что конструкции 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
У вас ошибка в макросе ищите сами где, у меня в симуляции тоже 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;
У вас ошибка в макросе ищите сами где, у меня в симуляции тоже 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
Ну Вы это и сами нашли.
Нам тоже есть что поправить чтобы среда предупреждала или сама приводила типы.
если использовать (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
Результат NOT MANUAL - число UDINT.
Разъясните, пожалуйста: Manual - тип bool, а логическое выражение not Manual - udint?
if (NOT manual) = udint_to_bool(1) then
Вот так компилятор пропускает. При попытке сравнить с числом -пишет о несоответствии типов. Выходит чтo bool....
Просто выражение A := not B в железе тоже ерунду выдает. Получается, что ПР воспринимает в ST тип bool как udint и соответственно обрабатывает, а лоджик обрабатывает bool как bool - вот и ерунда получается
Но ведь как писали выше 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.
ЗЫ. Прошу прощения, не дочитал до конца. Вы правы.
Хочется только уточнить, что не сравнивается со значением, а анализируется флаг "ноля" в последней операции.
Согласно стандарту IEC 61131-3, язык ST поддерживает весь необходимый набор типов данных.
Тип данных переменной определяет род информации, диапазон представлений и множество допустимых операций.
Тщательнее надо (с) Жванецкий :*)
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 мерятся? Типа я создал макрос, которого ещё никто не видел... и т.п..... ну макрос-то ещё никто не создал, но, ИМХО тема-то уже нужна :) лиха беда начало
Результатом NOT (Manual = FALSE) является TRUE, при условии, что MANUAL = FALSE.
ЗЫ. Прошу прощения, не дочитал до конца. Вы правы.
Хочется только уточнить, что не сравнивается со значением, а анализируется флаг "ноля" в последней операции.
Товарищ,
NOT (FALSE = FALSE) => FALSE
или мы придумываем новые стандарты?
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot