А какие адреса регистров опрашиваете?
Возможно вам нужны адреса 0 и 1
Вид для печати
Да, на 1-15 бит адрес 0, для 16-31 адрес 1, пробовал добавлять еще 2 по 8bit, чтобы проверить 2 адрес, но результат не меняется.
Думал возможно проблема в настройке OPC, но и там вроде все нормально
Если у вас Holding регистры, то регистр 0 биты с 0 по 15, Вложение 88565
регистр 1 тоже биты с 0 по 15.
На скрине сделал по 10 бит в 0 и 1 регистре
А вот опрос для Coils, только адреса уже 0-15 и 16-31. Вложение 88566
На скрине сделал тоже по 10 бит
Добрый день.
Помогите сообразить!
Пишу свой код типа счетчика моточасов. Готовые решения не устраивают, поэтому не плюйтесь.
А вопрос в следующем. Необходимо сохранять счетчик при потере питания и соответственно восстанавливать данные после подачи питания. Для этого я, вне функционального блока создал энергонезависимую переменную. Вход куда я ее записываю, и выход который изменяет эту переменную. Но при старте программа не успевает перебросит данные с входа на выход и переменная обнуляется. Точнее если написать в начале кода (первой строкой Vaur OUT := Var IN) То она успевает перезаписать и все вроде нормально. Но если поместить ее строкой ниже или не дай бог засунуть в условие типа IF. то она конечно не успевает пере записаться и обнуляется.
Возможно я изобретаю велосипед, подскажите как реализовать правильно эту функцию.
И от сюда вытекает второй вопрос. В программе мне необходимо использовать 2 блока. 1 это инициализация (выполняется один раз при старте) и 2 в цикле. Я использовал оператор IF c защелкой. (решение мне самому не нравится). Сейчас играюсь с функциями WHILE и REPEAT UNTIL. мне кажется они более правильные.
Есть ли какие-то более гибкие и правильные реализации этих двух вопросов?
Але-ндр Варианты, как понял тебя я (я делал такой блок на FBD, и он отлично работает):
1. Да! В коде ST положение строк ВАЖНО. Потому что они выполняются сверху вниз.
И если тебе надо сначала получить данные из VAR_IN_OUT, а потом выдать - то строки поулчения должны быть выше.
2. Если писать счётчик часов на FBD, то можно объявить энергонезависимую переменную прям внутри макроса (я так и сделал).
3. WHILE - это цикл. Я не уверен, что он нужен в этом блоке.
Вложение 88613 Вложение 88614
ДА.
Как это не парадоксально. но вся программа у меня также написана на FBD и уже давно работает (больше 2 лет).
А тут решил ( как говорится) ради самоистязания (в свободное время) изучить ST, и переписать уже работающую программу. (на самом деле готовлю обновление).
По этому все вопросы исключительно по ST.
Самая большая проблема что я не смог найти данных о времени выполнения тех или иных функций (тайминги реального процессора) хотя в принципе они не критичны. Опытным путем определил что Vaur OUT := Var IN корректно работает в первых трех строках.
И до сих пор не разобрался в приоритетах выполнения (последовательности функциональных блоков).
Почему разбиваю выполнение на 2 блока? На самом деле это мая (в некотором смысле ) прихоть не хочу нагружать цикл тупым переписываниями 14 переменных одними и теми же данными, обычно они прописываются при инициализации. К сожалению при определении переменных им можно задавать только константы. На сколько я помню (могу ошибаться, не хочу лезть в справочник) на запись уходит 3 такта процессор (3х14=42) а на функцию IF около 10.