Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы

Создаем ПЛК на базе IEC 61131

Непрочитано 03.08.2009, 21:16  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию

Сообщение от kos_ua
Что касается адаптации ПО под другие платформы то проблема остаётся в синтаксисе....
Пример: Прерывание таймера 8051 кристала
void TIMER1_INT(void) interrupt 1
{
MByte++;
if ((MByte & 0x01) && !(pFMByte & 0x01)) Time+=1;
if ((MByte & 0x02) && !(pFMByte & 0x02)) Int_T100ms();
if ((MByte & 0x0 && !(pFMByte & 0x0) Int_T1s();
pFMByte=MByte;
}
Заранее спасибо за коментарии.
Для IAR AVR
Код:
#pragma vector= TIMER0_OVF_vect
__interrupt void timer0_ovf(void)
	{
//обработчик прерывания
	}
Для HiTECH PICC 16 уточню и то же выложу
функции для задания разных периодов прерывания выложу попозже
Реклама:
picavr вне форума  
Непрочитано 03.08.2009, 21:25  
Mixer79
Частый гость
 
Регистрация: 22.08.2007
Сообщений: 43
Сказал спасибо: 3
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Mixer79 на пути к лучшему
По умолчанию

Кроме ограничения хода регулятора, можно добавить так же вход инверсии. Если обратную логику работы можно создать путем умножения коэффициента пропорциолналности на -1, то для работы с нормально закрытыми клапанами без инверсии не обойтись.

Про железо, я имел в виду преобразование выхода регулятора в аналоговый сигнал.

Прикрепленный файл: 6934615.zip
Mixer79 вне форума  
Непрочитано 28.08.2009, 12:12  
kos_ua
Прописка
 
Регистрация: 07.07.2005
Сообщений: 111
Сказал спасибо: 2
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
kos_ua на пути к лучшему
По умолчанию

Привет Всем....после небольшой паузы вкладываю продолжения софта ПЛК.
Появился у нас индикатор и кнопочки.
Кнопочки висят на адресах IB0, IB1 (Хинты подскажут).
Для работы с индикатором есть функции записи в буфер индикатора(строки реал интежер), и функция которая передаёт этот буфер в сам индикатор.

Так же попытался сделать что-то типа именованной связи между блоками(чтоб не было много линий)...к сетапу подкладываю демку...Заранее всем спасибо.

Прикрепленный файл: 3599150.rar
kos_ua вне форума  
Непрочитано 28.08.2009, 12:20  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию

Сообщение от kos_ua
Привет Всем....после небольшой паузы вкладываю продолжения софта ПЛК.
Привет. А сколько прерываний таймеров и какие периоды для этих таймеров требуются для обслуживания программы. Какие ещё прерывания используются. Готов по свободе поработать над кодом вызова прерываний и програмирования периодов таймеров под IAR AVR & HiTECH PIC16.

Для ТАЙМЕРА 0 мной уже написаны функции:
Код:
/*
	setintovf_tmr0();//пуск прерывания переполнения таймера0
	clrintovf_tmr0();//стоп прерывания переполнения таймера0
	setrising_tmr0();//установка срабатывания таймера0 по фронту
	setfaling_tmr0();//установка срабатывания таймера0 по спаду
	setinternal_tmr0();//HiTECH установка срабатывание таймера0 от внутренненго источника
	setexternal_tmr0();//HiTECH установка срабатывание таймера0 по внешнего источника
	clrflagovf_tmr0();//HiTECH сброс флага переполнения таймера0 (AVR-сброс автоматически)
//загрузка пределителя таймера0 и таймера0 высчитаными, значениями вручную
	load_pretmr0 (unsigned char temp);			//пределителя таймера0 char
	load_tmr0 (unsigned char temp);				//загрузка таймера0 char
//работают быстро,занимают мало места,высчитывают и устанавливают период таймера0 по константе period0tmr0-period7tmr0
	period0_pretmr0 ();//определение и загрузка пределителя таймера0 по period0tmr0 и fclc
	period0_tmr0 ();//определение и загрузка таймера0 по period0tmr0 и fclc
	period1_pretmr0 ();//определение и загрузка пределителя таймера0 по period1tmr0 и fclc
	period1_tmr0 ();//определение и загрузка таймера0 по period1tmr0 и fclc
	period2_pretmr0 ();//определение и загрузка пределителя таймера0 по period2tmr0 и fclc
	period2_tmr0 ();//определение и загрузка таймера0 по period2tmr0 и fclc
	period3_pretmr0 ();//определение и загрузка пределителя таймера0 по period3tmr0 и fclc
	period3_tmr0 ();//определение и загрузка таймера0 по period3tmr0 и fclc
	period4_pretmr0 ();//определение и загрузка пределителя таймера0 по period4tmr0 и fclc
	period4_tmr0 ();//определение и загрузка таймера0 по period4tmr0 и fclc
	period5_pretmr0 ();//определение и загрузка пределителя таймера0 по period5tmr0 и fclc
	period5_tmr0 ();//определение и загрузка таймера0 по period5tmr0 и fclc
	period6_pretmr0 ();//определение и загрузка пределителя таймера0 по period6tmr0 и fclc
	period6_tmr0 ();//определение и загрузка таймера0 по period6tmr0 и fclc
	period7_pretmr0 ();//определение и загрузка пределителя таймера0 по period7tmr0 и fclc
	period7_tmr0 ();//определение и загрузка таймера0 по period7tmr0 и fclc
//работает медленнее,занимает больше места,расчитывает и устанавливать периоды таймера0 по переменной, если функция не вызываются, закоментируйте их для уменьшения места в FLASH
//unsigned char calc_int_pretmr0 (unsigned int period_tmr0);//вычисление и загрузка пределителя таймера0 по UNSIGNED INT period_tmr0 и fclc
//unsigned char calc_int_tmr0 (unsigned int period_tmr0);//вычисление таймера0 по UNSIGNED INT period_tmr0 и fclc
//unsigned char calc_long_pretmr0 (unsigned long period_tmr0);//вычисление и загрузка пределителя таймера0 по UNSIGNED LONG period_tmr0 и fclc
//unsigned char calc_long_tmr0 (unsigned long period_tmr0);//вычисление таймера0 по UNSIGNED LONG period_tmr0 и fclc
*/
picavr вне форума  
Непрочитано 28.08.2009, 12:26  
kos_ua
Прописка
 
Регистрация: 07.07.2005
Сообщений: 111
Сказал спасибо: 2
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
kos_ua на пути к лучшему
По умолчанию

Сообщение от picavr
Сообщение от kos_ua
Привет Всем....после небольшой паузы вкладываю продолжения софта ПЛК.
Привет. А сколько прерываний таймеров и какие периоды для этих таймеров, требуется для обслуживания программы. Какие ещё прерывания используются. Готов по свободе поработать над кодом вызова прерываний и програмирования таймеров под IAR AVR & HiTECH PIC16.
Я использую всего одно прерывание таймера.

void TIMER1_INT(void) interrupt 1
{
MByte++;
if ((MByte & 0x01) && !(pFMByte & 0x01))
Time+=1;

if ((MByte & 0x02) && !(pFMByte & 0x02)) Int_T100ms();
if ((MByte & 0x0 && !(pFMByte & 0x0) Int_T1s();
pFMByte=MByte;
}

В прерывании я увеличиваю переменную Time, она мне нужна как RTC, ей я пользуюсь когда вызываю функцию IEC Timer.

Так же в прерывании таймера вызываются IEC подпрограммы Int_T100ms() и Int_T1s().
Вот в принципе и всё)))

Теперь что касается самих IEC Timers.
Я думаю что вы найдёте легко на них описание в промышленном стандарте. В кратце: существует 4 вида таймеров SP(Формирователь импульса), SE(формирователь удлиненного импульса), SD(задержка на включение), SF(задержка на отключение).
Принцып работы следующий: на вход таймеру даём 1 он записывает по фронту этого сигнала значение RTC и потом берёт и вычитает текущее значение RTC с записанным и сравнивает с заданием на время.
А далее смотрит какой тип таймера(SP SD SE SF) и формирует сигнал на выходе(0 или 1)...вот так)

Последний раз редактировалось mike-y-k; 14.04.2022 в 23:04. Причина: 6.6
kos_ua вне форума  
Непрочитано 28.08.2009, 12:38  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию

Сообщение от kos_ua
Я использую всего одно прерывание таймера.
А каков период срабатывания прерывания таймера?
Я имею в виду МОДУЛЬ ТАЙМЕРА в самом микроконтроллере, а не програмные таймеры в вашей прорамме. Что б написать функции задания периода вызова прерываний TIMER1 под AVR и PIC.

Сообщение от kos_ua
Так же в прерывании таймера вызываются IEC подпрограммы Int_T100ms() и Int_T1s().
Вот в принципе и всё)))
Пооонняяяяяяяяялллл.... это ваши внутрение функции обрабатываемые в прерывани таймера.
picavr вне форума  
Непрочитано 28.08.2009, 12:44  
kos_ua
Прописка
 
Регистрация: 07.07.2005
Сообщений: 111
Сказал спасибо: 2
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
kos_ua на пути к лучшему
По умолчанию

Сообщение от picavr
Сообщение от kos_ua
Я использую всего одно прерывание таймера.
Период срабатывания прерывания таймера?

Сообщение от kos_ua
Так же в прерывании таймера вызываются IEC подпрограммы Int_T100ms() и Int_T1s().
Вот в принципе и всё)))
Я так понял это просто задержки програмными циклами на 100 миллисекунд и 1 секунду?
Или задержки отрабатываются по таймеру?
Int_T100ms() и Int_T1s() это простые подпрограммы.
Прерывание по системному таймеру я настроил на 50мс.
То есть каждые 50мс вызывается этот обработчик.
Каждые 50 мс увеличивается RTC.
подпрограмма Int_T100ms() вызывается каждые 100мс
подпрограмма Int_T1s() вызывается каждые 1с.

Можно уменьшить прерывание по таймеру до 10 мс...точнее будет всё работать...но мне пока что это не надо)))...

[quote="picavr"]
Сообщение от kos_ua

Пооонняяяяяяяяялллл.... это ваши внутрение функции обрабатываемые в прерывани таймера.
Да это вызов функций....есть еще функция FreeScan...так вот она вызывается не в теле прерывания таймера а в теле main.

Последний раз редактировалось mike-y-k; 14.04.2022 в 23:05. Причина: 6.6
kos_ua вне форума  
Непрочитано 28.08.2009, 14:27  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию

Сообщение от kos_ua
Прерывание по системному таймеру я настроил на 50мс.
Ок. Напишу функции для таймера1 для задания периода и настройки прерывания таймера1 по переполнению.
И вызов прерывания таймера1. Под AVR и PIC/

А порты вы опрашиваете весь сразу.. или побитно?
Т.Е. читаете порт в регист и там отбрабатываете.. то же самое с выводом в порт?
Как это обрабатывается?

Интересуют те функции которые работают с модулями самого МК.

FreeScan... это обработка модулей контролера?
picavr вне форума  
Непрочитано 28.08.2009, 14:57  
kos_ua
Прописка
 
Регистрация: 07.07.2005
Сообщений: 111
Сказал спасибо: 2
Сказали Спасибо 12 раз(а) в 7 сообщении(ях)
kos_ua на пути к лучшему
По умолчанию

Сообщение от picavr
Сообщение от kos_ua
Прерывание по системному таймеру я настроил на 50мс.
Ок. Напишу функции для таймера1 для задания периода и настройки прерывания таймера1 по переполнению.
И вызов прерывания таймера1. Под AVR и PIC/

А порты вы опрашиваете весь сразу.. или побитно?
Т.Е. читаете порт в регист и там отбрабатываете.. то же самое с выводом в порт?
Как это обрабатывается?

Интересуют те функции которые работают с модулями самого МК.

FreeScan... это обработка модулей контролера?
FreeScan это подпрограмма.

//-------Функцию main------
void main(void)
{
initialize_system();
Int_OnStart(); // OnStartUp function
while(1)
{
IO_Input(); // Read from input
FreeCycle(); // Free Scan
IO_Output(); // Write to output
}
}

Теперь о функциях IO_Input() и IO_Output()
На данный момент они выглядят вот так:


void IO_Input(void) // Read Data from all modules
{
iI[0]=P1;
}


void IO_Output(void) // Write Data to all modules
{
P3=iQ[0];
}

Для того чтоб их написать надо знать железку к чему пишем
Если смотреть например CoDeSys то у них первое есть конфигуратор железа и второе на основе этого конфигуратора они вызывают функции IO_Output и в параметрах подставляют указатель на область памяти и размер в этой области...
Так что тут наверное надо отдельно вынести в ini фаил код данных функций чтобы каждый мог их для себя модифицировать....а программа просто тупо подключит эти функции как external.
Вот что я думаю по этому поводу.

И еще...если кто знает Делфи то могу скинуть исходник программы...может тогда дела пойдут быстрее)))

ЗЫ....Конечно всем не дам...только тем кто в теме)))

Я тут оптимизировал(подготовил) си код для разных процов...8051 АВР ПИК.

Поэтому выкладываю новую версию.

В итоге что получилось:
1. В теле основной программы находятся только вызовы функций которые мы нарисовали в редакторе.
2. В основной программе подключены два модуля(io.h, function.h).
3. io.h это модуль который надо менять в зависимости от применяемого контроллера и железа. function.h это модуль где лежат все функции которые мы можем использовать в нашем проекте(ПИД таймер счётчик тригер И ИЛИ и тд)
В прикреплённом файле setup.exe и эти два модуля.

Прикрепленный файл: 3715809.rar

Последний раз редактировалось mike-y-k; 14.04.2022 в 23:05. Причина: 6.6
kos_ua вне форума  
Непрочитано 01.09.2009, 14:23  
picavr
Почётный гражданин KAZUS.RUN
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,815
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Создаем ПЛК на базе IEC 61131

Сообщение от kos_ua Посмотреть сообщение
)))
Посмотрите почту, написал вам...
picavr вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Языки программирования IEC-6113-3(FBD, LD, IL и т.) VladG Информация по радиокомпонентам 0 18.08.2009 08:57
Ищу ПЛК (промышленный контроллер) c RS-232 и RS-485... LazarenkoAS2 Делимся опытом 44 19.10.2008 20:27
Графический ЖК индикатор на базе LC7981 Bear-ku Микроконтроллеры, АЦП, память и т.д 1 24.07.2008 08:29
Создаем лабораторный БП с цифровым управлением masterpc Источники питания и свет 60 02.04.2007 06:24
осциллограф на базе ПК SlavaS Измерительное оборудование 61 09.06.2005 20:04


Часовой пояс GMT +4, время: 13:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.