Да, на 1-15 бит адрес 0, для 16-31 адрес 1, пробовал добавлять еще 2 по 8bit, чтобы проверить 2 адрес, но результат не меняется.
Думал возможно проблема в настройке OPC, но и там вроде все нормально
Если у вас Holding регистры, то регистр 0 биты с 0 по 15, 1 Биты в слейве.jpg
регистр 1 тоже биты с 0 по 15.
На скрине сделал по 10 бит в 0 и 1 регистре
Последний раз редактировалось kondor3000; 23.03.2026 в 17:31.
А вот опрос для Coils, только адреса уже 0-15 и 16-31. 1 Биты Coils.jpg
На скрине сделал тоже по 10 бит
Добрый день.
Помогите сообразить!
Пишу свой код типа счетчика моточасов. Готовые решения не устраивают, поэтому не плюйтесь.
А вопрос в следующем. Необходимо сохранять счетчик при потере питания и соответственно восстанавливать данные после подачи питания. Для этого я, вне функционального блока создал энергонезависимую переменную. Вход куда я ее записываю, и выход который изменяет эту переменную. Но при старте программа не успевает перебросит данные с входа на выход и переменная обнуляется. Точнее если написать в начале кода (первой строкой Vaur OUT := Var IN) То она успевает перезаписать и все вроде нормально. Но если поместить ее строкой ниже или не дай бог засунуть в условие типа IF. то она конечно не успевает пере записаться и обнуляется.
Возможно я изобретаю велосипед, подскажите как реализовать правильно эту функцию.
И от сюда вытекает второй вопрос. В программе мне необходимо использовать 2 блока. 1 это инициализация (выполняется один раз при старте) и 2 в цикле. Я использовал оператор IF c защелкой. (решение мне самому не нравится). Сейчас играюсь с функциями WHILE и REPEAT UNTIL. мне кажется они более правильные.
Есть ли какие-то более гибкие и правильные реализации этих двух вопросов?
Последний раз редактировалось Але-ндр; 26.03.2026 в 23:55.
Але-ндр Варианты, как понял тебя я (я делал такой блок на FBD, и он отлично работает):
1. Да! В коде ST положение строк ВАЖНО. Потому что они выполняются сверху вниз.
И если тебе надо сначала получить данные из VAR_IN_OUT, а потом выдать - то строки поулчения должны быть выше.
2. Если писать счётчик часов на FBD, то можно объявить энергонезависимую переменную прям внутри макроса (я так и сделал).
3. WHILE - это цикл. Я не уверен, что он нужен в этом блоке.
Clip_3.jpg Clip_4.jpg
Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab
ДА.
Как это не парадоксально. но вся программа у меня также написана на FBD и уже давно работает (больше 2 лет).
А тут решил ( как говорится) ради самоистязания (в свободное время) изучить ST, и переписать уже работающую программу. (на самом деле готовлю обновление).
По этому все вопросы исключительно по ST.
Самая большая проблема что я не смог найти данных о времени выполнения тех или иных функций (тайминги реального процессора) хотя в принципе они не критичны. Опытным путем определил что Vaur OUT := Var IN корректно работает в первых трех строках.
И до сих пор не разобрался в приоритетах выполнения (последовательности функциональных блоков).
Почему разбиваю выполнение на 2 блока? На самом деле это мая (в некотором смысле ) прихоть не хочу нагружать цикл тупым переписываниями 14 переменных одними и теми же данными, обычно они прописываются при инициализации. К сожалению при определении переменных им можно задавать только константы. На сколько я помню (могу ошибаться, не хочу лезть в справочник) на запись уходит 3 такта процессор (3х14=42) а на функцию IF около 10.
Последний раз редактировалось Але-ндр; Вчера в 00:54.