

Странно попробую.D.i.M.K.i.N. писал(а):Разобрался.
Обнова не проходит, если открыт проект.



1. Сильно сложный код, и больше места занимает в памяти, плюс ко всему будет медленнее, а свойства блока будут вводить пользователя в замешательство. Но я не говорю что нельзя, я буду рад если кто сделает. Чтобы схема была более читаема, хочу добавить возможность использования небольших картинок ( текст либо картинка ) в названии блока.xkp писал(а):1. может есть смысл задуматься над универсальным генератором? а в его настройках уже делать что надо... пилу, синус, прямоугольник.
2. можно как то сделать что бы обязательные блоки, необходимые для других блоков, вносились в проект автоматически. например, береш блок "генератор" и автоматически в проекте появляется блок "счетчик миллисекунд".
Код: Выделить всё
#ifndef _FBD48_
#define _FBD48_ FBD48
#message define FBD48 generator pila
;Размер FBD блока
;1 байт -вход //In
;2 байта - время прирощения //параметры блока
;2 байта - минимальное значение //параметры блока
;2 байта - максимальное значение //параметры блока
;1 байт -выход //Out
;Оперативная память:
; 2 байта - текущее значение
; 2 байта - отсечка времени
FBD48_run:
ld Uz3L, X+ ;текущее значение Lw
ld Uz3H, X+ ;текущее значение Hw
ld Uz1L, X+ ;отсечка времени Lw
ld Uz1H, X+ ;отсечка времени Hw
sbiw XL, 4 ;Возвращаем указатель
rcall Read_cfg_Load_Uz2 ;вход
rcall Read_cfg ;время прирощения Lw
mov A, Addr_Data ;время прирощения Lw
rcall Read_cfg ;время прирощения Hg
mov B, Addr_Data ;время прирощения Hg
rcall Read_cfg ;минимальное значение Lw
mov C, Addr_Data ;минимальное значение Lw
rcall Read_cfg ;минимальное значение Hg
mov D, Addr_Data ;минимальное значение Hg
rcall Read_cfg ;максимальное значение Lw
mov E, Addr_Data ;максимальное значение Lw
rcall Read_cfg ;максимальное значение Hg
mov F, Addr_Data ;максимальное значение Hg
//***************** Отслеживаем сигнал **********************
sbrs Uz2L, 0 //Проверка состояния входа
rjmp FBD48_clear
rcall Timer_Diff //Вычисляем разницу времени
cp ZL, A //Сраниваем
cpc ZH, B //Сраниваем
brmi FBD46_end
//******************** Увеличение +1 ***********************
add Uz3L, One //Uzl3=Uz3+1
adc Uz3H, Zero //Uzl3=Uz3+1
//********** Сравниваем с максимальным **********************
cp E, Uz3L //Сраниваем максимальное значением
cpc F, Uz3H //Сраниваем максимальное значением
brpl FBD48_cutoff_time
FBD48_clear:
lds Uz3L, C //Минимальное состояние
lds Uz3H, D //Минимальное состояние
FBD48_cutoff_time:
lds Uz1L, TimerCounter0_DATA_RAM+1 //Отсечка времени
lds Uz1H, TimerCounter0_DATA_RAM+2 //Отсечка времени
FBD46_end:
st X+, Uz3L //сохраняем
st X+, Uz3H //сохраняем
st X+, Uz1L //сохраняем
st X+, Uz1H //сохраняем
rcall Read_cfg_Save_Uz3 //выводим состояние
ret
FBD48:
.db 8, 4 //Размер FBD блока, необходимая оперативная память
.dw FBD48_run, Init_default
#else
#error redeclared FBD48 __FILE__
#endif
Согласен, решается элементарно, но для программистов со стажем. А если писать для микроконтроллеров то это эще порты, прерывания, таймеры ... Новичок запутается и забросит микроконтроллеры.Мурик писал(а):Посмотрел видео....![]()
![]()
Данная задача решается элементарно через сдвиг и получится не только более быстрый и компактный код, но еще и намного нагляднее!
Подробно описать блоки, сколько входов\выходов, внутренние свойства, логика работы. Блоков работы со временем у меня 4 штуки из которых 3 таймера.ARV писал(а):Система все более и более приближается к классической FBD системе, используемой в ПЛК.
я бы рекомендовал вместо генераторов пилы и т.п. наворотов использовать блоки типа "запускаемый/автономный/перезапускаемый таймер" или "одновибратор".