AlexCrane такие блоки были от petera в FBD, а вот делали их на ST или нет, надо смотреть в теме.
Вид для печати
AlexCrane такие блоки были от petera в FBD, а вот делали их на ST или нет, надо смотреть в теме.
хотел бы больше типов переменных, напр int, array, режим эмуляции, так же и в ФБ
1. поиск и замена в редакторе ST
2. Запись чисел в шестнадцатеричном, двоичном виде.
3. Выполнение логических операций над числами udint (над целыми) числами
Спасибо большое
Для счастья не хватает использования без дополнительного ввода в функцию или функциональный блок (по заранее определённому имени) переменных из панели переменных(в том числе и сохраняемых и сетевых).
А для Полного счастья не хватает без дополнительного ввода - вывода в функцию или функциональный блок , входов и выходов которые можно было бы использовать в виде вызова функции (типа: bpo1:=out1(0); или bpi1:=in1(); in1 забирает значение со входа 1 , а out1(0) записывает 0 на выход 1 и возвращает код ошибки при записи) .
Ну вот мои скромные пожелания ! Тогда бы ST стал в ОЛ полнофункциональным языком , а сейчас он только пристройка (хоть и удобная) к FB.
"А в ST из МЭК 61131-3 есть такое? "
Есть.
Хотелось бы добавления битовых операций AND , XOR . OR . NOT над типом данных UDINT .
Есть такое, только не документировано:
Вложение 78371
Если это вы мне ,то спасибо конечно за ответ , но здесь тема про язык ST.
Почему же, очень даже документировано
Вложение 78375
А.. Ну тогда ждите. Может быть когда-нибудь.
Код:function function1: udint;
var_input
X1 : udint;
X2 : udint;
end_var
function1 := uAnd(X1, X2);
end_function
Код:function uAnd: udint;
var_input
X1 : udint;
X2 : udint;
end_var
uAnd.0 := X1.0 and X2.0;
uAnd.1 := X1.1 and X2.1;
uAnd.2 := X1.2 and X2.2;
uAnd.3 := X1.3 and X2.3;
uAnd.4 := X1.4 and X2.4;
uAnd.5 := X1.5 and X2.5;
uAnd.6 := X1.6 and X2.6;
uAnd.7 := X1.7 and X2.7;
uAnd.8 := X1.8 and X2.8;
uAnd.9 := X1.9 and X2.9;
uAnd.10 := X1.10 and X2.10;
uAnd.11 := X1.11 and X2.11;
uAnd.12 := X1.12 and X2.12;
uAnd.13 := X1.13 and X2.13;
uAnd.14 := X1.14 and X2.14;
uAnd.15 := X1.15 and X2.15;
uAnd.16 := X1.16 and X2.16;
uAnd.17 := X1.17 and X2.17;
uAnd.18 := X1.18 and X2.18;
uAnd.19 := X1.19 and X2.19;
uAnd.20 := X1.20 and X2.20;
uAnd.21 := X1.21 and X2.21;
uAnd.22 := X1.22 and X2.22;
uAnd.23 := X1.23 and X2.23;
uAnd.24 := X1.24 and X2.24;
uAnd.25 := X1.25 and X2.25;
uAnd.26 := X1.26 and X2.26;
uAnd.27 := X1.27 and X2.27;
uAnd.28 := X1.28 and X2.28;
uAnd.29 := X1.29 and X2.29;
uAnd.30 := X1.30 and X2.30;
uAnd.31 := X1.31 and X2.31;
end_function
Ещё раз спасибо за ответ с примером - (заменой полноценного AND, кстати по моим экспериментам такие замены работают раз в 30 медленнее полноценной реализации) но с реализацией замен у меня проблем нет , просто не плохо было бы ... полноценных AND OR XOR NOT.
==Код:function uAnd: udint;
var_input
X1 : udint;
X2 : udint;
end_var
uAnd.0 := X1.0 and X2.0;
...
много раз
...
uAnd.31 := X1.31 and X2.31;
end_function
или немного быстрее в некоторых случаяхКод:for i := 1 to 31 do
uAnd.31 := X1.0 and X2.0;
uAnd := shr(uAnd,1);
X1 := shr(X1,1);
X2 := shr(X2,1);
end_for
uAnd.31 := X1.0 and X2.0;
Код:M := 1;
while X1 <> 0 and X2 <> 0 do
if X1.0 and X2.0 then
uAnd := uAnd + M;
end_if
M1 := shl(M,1);
X1 := shr(X1,1);
X2 := shr(X2,1);
end_while
Ещё раз спасибо за ответ с примером - (заменой полноценного AND, кстати по моим экспериментам такие замены работают раз в 30 медленнее полноценной реализации) но с реализацией замен у меня проблем нет , просто не плохо было бы ... полноценных AND OR XOR NOT !
Для счастья не хватает использования без дополнительного ввода в функцию или функциональный блок (по заранее определённому имени) переменных из панели переменных(в том числе и сохраняемых(энергонезависимых) и сетевых).
А для Полного счастья не хватает без дополнительного ввода - вывода в функцию или функциональный блок , входов и выходов которые можно было бы использовать в виде вызова функции (типа: bpo1:=out1(0); или bpi1:=in1(); in1 забирает значение со входа 1 , а out1(0) записывает 0 на выход 1 и возвращает код ошибки при записи) .
Ну вот мои скромные пожелания ! Тогда бы ST стал в ОЛ полнофункциональным языком , а сейчас он только пристройка (хоть и удобная) к FB !
Для полного счастья что нужно - пальцы устанут стучать.
Судя по скорости обновления ОЛ-версии ST - где-то в 40х годах будут и логические с целыми в ST.
Но тем не менее уже сейчас большая разница с версиями "без ST"
А если парит какая то разница в скорости для некоторых хотелок, то проблема в архитектуре самого проекта
"пальцы устанут стучать" Стучите и будет вам счастье , стучащему отворят. "А если парит" - Надеюсь мы сюда не в баню ходим а смотрим для чего тема создавалась и поменьше спамим.
Имелось ввиду, что возможно в будущем, когда "пальцы устанут стучать" в ОЛ и будет добавлена такая возможность.
А сейчас для решения большинства задач с помощью ПР и текущей скорости более чем достаточно.
Поэтому нам не понятно для каких задач нужно такое быстродействие? И если оно действительно Вам необходимо ("парит"), то пересмотрите проект на предмет использования иного оборудования.
Я очень рад что вы с кем-то на пару смотрите для чего тема создавалась и меньше спамите. Такое редкость сейчас. Особенно про создание темы и чтение всей ветки.
А касаемо лично Вашего ключика к счастью - так часто требуется индексный доступ к входам/выходам? У Вас там релюшки сами прыгают с места на место?
Нам это кому , вам? Я про быстродействие не жаловался а констатировал факт если вы внимательно читали с начала о чем писалось . И вообще я не понимаю зачем вы это сюда мне написали ,подобное общение лучше в курилке устраивать , но я не курю. Так что желательно добавить реализацию AND OR XOR NOT для типа UDINT ну и по возможности динамически изменять номер бита в конструкции UDINT.N чтобы N перестала быть только константой.
Кто нибудь знает как написать функцию random на языке ST?
А может кто-нибудь объяснить как с помощью команды get_time() привязаться не к миллисекундам, а к секундам?
Буквально вчера для эмулятора модбас сервера придумывал... На аляпаскале:
Может на лоджике такое же возможно...Код:var
H, M, S, mS: Word;
I: Integer;
J: Integer;
begin
if (Reg_13= 0) and (J= 0) then
begin
J:= 1;
DecodeTime(Now,H,M,S,mS);
self:= H + 100 * M + S + mS;
end;
if (Reg_13<> 0) and (J= 1) then
begin
J:= 0;
end;
end;
Очень нравится ST и то что вы сделали. Хотелось бы менять размер шрифта (масштаб) в редакторе ST. Особенно на экране Full HD маловато.
Еще нет битовых операций, чтение бита, запись бита,...
Просматривал свои программы 2020 года и вижу небо и земля. Как намного легче стало с ST.
Спасибо разработчикам. В этом году приобрели несколько овенов. Сижу пишу в ST, просто сказка. почти как СИ.
не смог найти. просмотрел несколько раз. может не там смотрю. помогите плиз где это написаноВложение 80569
кроме этого.
после точки в переменной указывается бит
пример if (myVals.5) then или как там правильно проверять 5-й бит на true.. з.ы я про синтаксис, в ST не силен.
спасибо!!!!!!
Нигде не нашел "Таймер с задержкой включения" и выключения, нужны для последовательного запуска, например, двигателей.. В ST оказывается есть стандартные методы SYS.TON и SYS.TOF - просто офигеть :) Все в учебных целях.. Время в сек. только для контроля задержки
Функциональный блок:
function_block Timer_Delay_On (*Таймер с задержкой на вкл. 31.07.2026,Колледж АлтГУ*)
var_input
Start : bool := FALSE; (*Запуск*)
Delay_On_sec : udint; (*Задержка включения, сек.*)
Off_Reset : bool; (*Выключение и сброс таймера в 0 (высший приоритет)*)
end_var
var_output
Seconds : udint; (*Текущее значение в секундах*)
Power_On : bool; (*Включение исполнительного механизма*)
end_var
var
Timer_Internal : real; (*Внутренний счетчик в секундах*)
Current_Time : real; (*Отсчет времени при запуске*)
Last_Time : real; (*Текущее время*)
Delta_Time : real; (*Чистое время между включениями*)
Delay_On : SYS.TON; //Задержка на включение (стандартный метод ST)
end_var
Delay_On(I := Start, T := udint_to_time(Delay_On_sec * 1000));
Power_On := Delay_On.Q;
(*1. Время с момента включения, в миллисекундах)*)
Current_Time := udint_to_real(time_to_udint(get_time()));
(*2. Дельта времени (период повторного включения)*)
IF Last_Time = 0.0 THEN
Delta_Time := 0.0; (*Первый вызов - не учитываем*)
ELSE
Delta_Time := Current_Time - Last_Time;
END_IF
(*3. Запоминаем текущее время*)
Last_Time := Current_Time;
(*4. Аварийтное отключение и сброс таймера (высший приоритет)*)
IF Off_Reset THEN
Timer_Internal := 0.0;
Seconds := 0;
Power_On := false;
ELSE
(*5. Проверка условий для изменения счетчика*)
IF Start AND NOT Off_Reset THEN
Timer_Internal := Timer_Internal + Delta_Time / 1000; (* в секунды *)
(*6. Преобразование в целое число, секунды*)
Seconds := real_to_udint(Timer_Internal);
END_IF
END_IF
end_function_block
Если вы не нашли, то это не значит что их нет.
Тут есть не только все таймеры, но и примеры разных проектов
https://owen.ru/forum/showthread.php...l=1#post426133