ПОМОГИТЕ С СИ ?

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 07 апр 2009, 07:51

и так есть код написанный в си блоке, это единственный блок в проекте, он реализовывает меню, я промолчу про реализацию например структуры _tO_dep_Str16ToEnd, мне искренее не понятно чем char* не угалил, и что это за странные кодовые изыски с операторами define что я у вас в либе разгребал.

прошу вас ответить лишь на несколько вопросов :

Первый , вот код :

Код: Выделить всё

#include <zilog.h>
#include "Menu.h"

//×òî þçàåì
static BYTE Menu=0;//Îñíîâíîå ìåíþ
static BYTE SubMenu=0;//Ïîäìåíþ
static bool Refresh=true;//Ïðèçíàê òîãî ÷òî ìåíþ íàäî îáíîâèòü

static BYTE Q[4];//Ìàññèâ äàííûõ î âûêëþ÷àòåëÿõ
static BYTE SelQMode=0;//ðåæèì âûáðàííîãî Q
const BYTE MaxQ=4;//Êîëâî âûêëþ÷àòåëåé
const BYTE MaxMenu=2;//Êîëâî ïóíêòîâ ìåíþ

_tO_dep_IntToStr16 txt1;//
_tO_dep_Str16ToEnd txt2;//

_tO_dep_ConKeyCode Key;
_tO_dep_ConRegister ConReg;

__STACKCHK

dep_ConRegister(&ConReg ,TRUE); //Õâàòàåì óïðàâëåíèå

dep_ConKeyCode(&Key);

switch (Menu)
{
 case 0: //Ãëàâíîå ìåíþ
 {
  if(!SubMenu)
  {
   //Èíèöèàëèçàöèÿ
   SubMenu=1;
   Refresh=true;
  }
  if(Key.code==29 && SubMenu>1)
  {
   //Â ëåâî
   SubMenu--;
   Refresh=true;
  }
  if(Key.code==31 && SubMenu<MaxMenu)
  {
   //Â ïðàâî
   SubMenu++;
   Refresh=true;
  }
  if(Key.code==28)
  {
   //Âõîäèì â ñìåíþ
   Menu=SubMenu;
   SubMenu=0;
   //Âû ÷èòûâàåì çíà÷åíèÿ íàñòðîåê âûêëþ÷àòåëåé
   
   SelQMode=Q[SubMenu];
   Refresh=true;
  }
  if(Key.code==33)
  {
   //Ýñêåéï
   Menu=MaxMenu;
  }
  if(Refresh)
  {
   //Îáíîâëÿåì ìåíþ
   dep_ConPutStr((STR16*)"ÏÔ-4 v3.5",0);
   switch (SubMenu)
   {
    case 1:dep_ConPutStr((STR16*)"Íàñòðîéêà ÿ÷ååê",1);break;
    case 2:dep_ConPutStr((STR16*)"Íàçàä",1);break;
   }
   Refresh=false;
  }
  break;
 }
 case 1://[Íàñòðîéêà ÿ÷ååê]
 {
  if(!SubMenu)
  {
   //èíèöèàëèçàöèÿ ìåíþ
   SubMenu=1;
   Refresh=true;
  }
  //Ïðîâåðêà êëàâèøü
  if(Key.code==27 && SubMenu>1)
  {
   //Ââåðõ
   SubMenu--;
   SelQMode=Q[SubMenu-1];
   Refresh=true;
  }
  if(Key.code==30 && SubMenu<MaxQ)
  {
   //Âíèç
   SubMenu++;
   SelQMode=Q[SubMenu-1];
   Refresh=true;
  }
  if(Key.code==29 && SelQMode>1)
  {
   //Â ëåâî
   SelQMode--;
   Refresh=true;
  }
  if(Key.code==31 && SelQMode<3)
  {
   //Â ïðàâî
   SelQMode++;
   Refresh=true;
  }
  if(Key.code==28)
  {
   //Ñîõðàíÿåì çíà÷åíèå
   Q[SubMenu-1]=SelQMode;
   Refresh=true;
  }
  if(Key.code==33)
  {
   //Ýñêåéï
   SubMenu=Menu;
   Menu=0;
  }
  if(Refresh)
  {
   //Ôîðìèðóåì íàçâàíèå âûêëþ÷àòåëÿ êîòîðûé íàñòðàèâàåì
   dep_IntToStr16(&txt1 ,SubMenu,FALSE,0);
   dep_Str16Add(&txt2 ,(STR16*)"Q",&txt1.out,(STR16*)" [X");
   dep_IntToStr16(&txt1 ,SubMenu+8,FALSE,0);
   dep_Str16Add(&txt2 ,&txt2.out,&txt1.out,(STR16*)"]");
   if(SelQMode!=Q[SubMenu-1])
   {
    //Åñëè ó íàñ íå ðàâíûé óñòàíîâëåííûå çíà÷åíèÿ, òî âûâîäèì ñ ïðàâà çâ¸çäî÷êó
    dep_Str16ToEnd(&txt2,&txt2.out,(STR16*)"<*>");
   }
   dep_ConPutStr(&txt2.out,0);
  
   //Ôîðèðóåì ñîñòîÿíèå âûêëþ÷àòåëÿ
   if(SelQMode<1 || SelQMode>3)
   {
    Q[SubMenu]=1;//Ìû íå ìîæåì îøèáàòüñÿ :)
    SelQMode=Q[SubMenu];
   }
   switch(SelQMode)
   {
    case 1:dep_ConPutStr((STR16*)"Íå èñïîëüçóåòñÿ",1);break;
    case 2:dep_ConPutStr((STR16*)"Äèñêðåòíûé",1);break;
    case 3:dep_ConPutStr((STR16*)"×òåíèå ñ ÓÇÀ",1);break;
   }
   Refresh=false;
  }
  break;
 }
 default ://Âûõîä
 {
  Menu=0;
  SubMenu=0;
  dep_ConEscape(TRUE);
  break;
 }
}



Онреализует меню ...
почему такая дикая тормознутость меню получается ?

как это поправить ?

Второй, как мне с си чтото записать в энергонезависимую память ?


Третий, как и где прописать пароли для дисплея для каждого юзера ???? ТОКА ПОДРОБНО ДЛЯ ДАУНА, в роле коева я побуду.

Четвёртая проблема, последняя

Как сделать так чтобы в конфигураторе, когда настраиваешь компонет перемнные прописывать которые мне нао, тоесть напримре если повесить на диаграмме компонент номер дискрета по имени, то потом еготам можно будет выбьрать, как такой фокус провернуть напримре с простым WORD таблицу у вас я вижу , а допереть как сунуть туда не могу.


Я очень убедительно, прошу вас ответить, я вам сёдня позвоню с утрица по москве , оборву все аськи, только ради бога помогите , надоело просить....


Ещё ДАЙТЕ SDK по всем функциям !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Надоел слипой кодинг!!!!!!!!!!!!!!!!!

Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 07 апр 2009, 07:54

Там где были сиволы "âûêëþ÷àòåëÿ êîòîðûé íàñòðàèâàåì"
Это значит что там были русские, уж не знаю на какой кодировке увас девелопер работает что так сбуфера ставится .... я думаю суть понятна

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 07 апр 2009, 13:11

Светлана писал(а):
Faster писал(а):И так я задавал несколькор разных вопрсов, но соеденить их в кучу не получилось ...

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


В Разработчике:
Создаете массив boolean массив сохраняемый в РПЗУ
Пишите текущее значение элементов в одни дискреты, читаете новые значения из других

В дисплее:
Добавляете элемент "Доступ"
Заводите одного пользователя
За этим элементом создаете раздел, например, "Настройки":
* выставляете четыре элемента "ЭлБазы" Дискрет: отображаете дискрет текущее значение, записываете в дискрет новое значение
* затем добавляете элемент "СистПар" "Сохранить в РПЗУ"
* к разделу "Настройки" даете доступ только одному пользователю


Вы эту задачу решаете или уже другую?
Эта задача решается примитивно существующими возможностями.
Далее по Вашим текущим вопросам

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 07 апр 2009, 14:01

В Дисплее есть Разделы - с их помощью можно меню делать.
Faster писал(а):почему такая дикая тормознутость меню получается ?
как это поправить ?

Такт алгоритма может быть уменьшить?
Faster писал(а):Второй, как мне с си чтото записать в энергонезависимую память ?

Надо определить переменную на панеле и установить ей свойство сохранять в ОЗУ - "Сохр. в ОЗУ" Это энергонезависимое ОЗУ, сохраняется после выключения питания контроллера.

Faster писал(а):Третий, как и где прописать пароли для дисплея для каждого юзера ???? ТОКА ПОДРОБНО ДЛЯ ДАУНА, в роле коева я побуду.

Пароли в конфигурации не задаются. По-умолчанию 000000. После входа пользователя в этом же пункте меню (Доступ) (нажать Enter и перебирать возможности) доступны "Закрыть" - закрыть доступ, "Сменить пароль" - изменение пароля.

Faster писал(а):Четвёртая проблема, последняя

Как сделать так чтобы в конфигураторе, когда настраиваешь компонет перемнные прописывать которые мне нао, тоесть напримре если повесить на диаграмме компонент номер дискрета по имени, то потом еготам можно будет выбьрать, как такой фокус провернуть напримре с простым WORD таблицу у вас я вижу , а допереть как сунуть туда не могу.

Конфигурация компонента Разработчика на пульт выставляется только одним образом - через класс "ПарАлг". Номера дискретов не предполагалось через пульт настраивать.

Попробую ещё раз:
1) в Дисплее настройте все, что надо видеть всем (можно с Разделами - это вложенные меню)
2) Затем добавьте элемент с классом "Доступ"
3) После него добавьте "Раздел" и запретите его даже читать всем пользователям кроме одного (для этого надо установить галочку "Доступ" - чтобы были видны поля "Запрет доступа") и всем установить "Ч" - запрет чтения, а одного пользователя оставьте пустого - ему будет доступно и чтение и изменение. Только после входа этого пользователя раздел будет виден и в нем можно менять данные.
4) в этот раздел настроек выводим, например, дискрет. На чтение дискрет 1, на запись дискрет 2. Через него будет вводится уставка. Желательно установить галочку в поле "Динамика", тогда если будет введено пользователем значение в дискрете взведется бит динамики.

В алгоритме определяете переменную (сохраняему в ОЗУ) - это Ваша уставка. Текущее значение переменной надо записать в дискрет1. Каждый такт читать (забирать) дискрет2, если пришел бит Динамики - значение дискрета записать в переменную уставки.

Faster? я правильно понимаю задачу или нет. Попробуйте сделать, как я Вам предлагаю. Для этого не требуется программировать дисплей в компоненте Разработчика. На конкретные вопросы отвечу.

Dino
Сообщения: 163
Зарегистрирован: 21 фев 2005, 13:18
Откуда: Компания ДЭП

Сообщение Dino » 08 апр 2009, 12:09

Faster писал(а):Компонент дисплей, это убогое решение для написания меню. на этоми точка.

Насчёт паролей, что за бред, а если я переливаю конфигу то они сбрасываются ?

Еть ли возможность задать пароли каким либодругим методом ?

При уменьшении такта алгоритма загрузка цп подпрыгивает, я час немнорго оптимизировал код, но всё ровно тормозно.

Про переменную вы меня немного не поняли , метод с динамикой я уже давноприменил , но у него есть ряд недостатков.

А теперь описываю подробно что мне надо... это не косается пульта это не косается памяти, это косается только алгоритма.


И так:
1. мне напдо создать в разработчике алгоритм
2. он должен использоваться как отдельный компонент
3. у неего должны настраиваться входящие дискреты и выходящий
это оказалосьпросто , в разработчике я из раздела фукции>глобальные базы-> номер дискрета / номер аналога/ номер счётчика , беру компонет кидаю его на диаграмму, и тогда когда я его компилирую и добавляю в конфигуратеоре в конфигурацию , если его выбрать на левой панели то с права появляется таблица в которой в соответствующей вкладлке дискреты /аналоги/счётчики будет список со всеми моими компонентами, причём их имена будут как в емтках !!!!!

таким образом я это могу реализовать выбор какие дискреты использовать моему алгоритму (счётчики или аналоги)

там же есть вкладки floats/words/ и кучя других!!!! Вот как мен их использовать ?, не знаю куда подробней описать

-------------

с жнерго независимой памятью я час поэксперементирую...
С уважением Климов Александр
Компания ДЭП
г. Москва
(495) 995-00-12 доб. 150

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 08 апр 2009, 12:23

Faster писал(а):А теперь описываю подробно что мне надо... это не косается пульта это не косается памяти, это косается только алгоритма.

И так:
1. мне напдо создать в разработчике алгоритм
2. он должен использоваться как отдельный компонент
3. у неего должны настраиваться входящие дискреты и выходящий
это оказалосьпросто , в разработчике я из раздела фукции>глобальные базы-> номер дискрета / номер аналога/ номер счётчика , беру компонет кидаю его на диаграмму, и тогда когда я его компилирую и добавляю в конфигуратеоре в конфигурацию , если его выбрать на левой панели то с права появляется таблица в которой в соответствующей вкладлке дискреты /аналоги/счётчики будет список со всеми моими компонентами, причём их имена будут как в емтках !!!!!

таким образом я это могу реализовать выбор какие дискреты использовать моему алгоритму (счётчики или аналоги)

там же есть вкладки floats/words/ и кучя других!!!! Вот как мен их использовать ?, не знаю куда подробней описать

Я правильно нашла вопрос?
В эти вкладки попадают глобальные переменные, у которых установлено свойство "Конфигурационная"

Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 09 апр 2009, 01:04

Я правильно нашла вопрос?
В эти вкладки попадают глобальные переменные, у которых установлено свойство "Конфигурационная"



О_о ... как это понимать ?

Судя по всему Светдана, вы хотели сказать что это переменные обозначенные как конфигурационные ...


пополз потыкаюсь в этом направлении...

Кстати мнею не ускоряеся при уменьшении такта, или я гдето не там крутил его ?

Подскажите плиз где правельновыставить такт компонета чтобы увеличить скорость ?


Ещё, у меня конкретный вопрос если в алгоритме написана строчка
while (true);

То А9 намертво виснит даже с конфигуратора недоступен ... я шокирован так как у используемого вами микроконтроллера есть WtachDogTimer

Исходя из выше написаного , меня интересует зависший контроллер так намертво , при вставленной загрузочной сд карте будет с неё грузиться или нет ?

Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 09 апр 2009, 07:20

кинул на панель переменную , как не пытался но галочка "конфигурационная" не активна ...

опять в ступоре....

darner
Сообщения: 34
Зарегистрирован: 09 июл 2008, 17:40

Сообщение darner » 09 апр 2009, 08:59

Фастер тебе же написали "В эти вкладки попадают глобальные переменные, у которых установлено свойство "Конфигурационная"
ну че тут еще не понятного...возьми и почитай хелпа там же все написано про них..;)..не в обиду!
(просто создай глобальную переменную в файле глобальных переменных в разработчике и поставь галочку "конфигурационная".)

По счет охранного таймера..вот выдержка из хелпа:
"Загрузка процессора - Число от 0 до 100% показывает загрузку (занятость по времени) процессора. Для нормальной работы контроллера Decont-182 загрузка не должна превышать 90-95%. Если загрузка процессора будет 100% в течение 3-х минут, то сработает охранный таймер и произойдет рестарт контроллера. Из контроллера вычитывается только текущее значение параметра. Минимум и максимум загрузки формирует программа "Конфигуратор"."
Ты ждал 3 минуты? Если ждал, вопрос разработчикам!!!
Скока надо ждать после зависания контроллера??? Как работает этот таймер у А9???

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 09 апр 2009, 12:59

Такт компонента изменяется во вкладке "Main" параметр "Такт" (секунды float).

Охранный таймер в А9 работает так же как в D-182. Надо подождать, контроллер перестартует в минимальный режим. Грузиться с SD-карты будет. Одно из назначений SD - восстановление "убитых" контроллеров.

Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 11 апр 2009, 14:32

Динер мне не в падлу я те процетирую хелп копи пастом , или ты мне конкретно путь скажешь где эжто описно ?


повторяю у меня не выставляется галка конфигурацмионная, дайте пример блин проекта с ней
погляжу что не так ...



Я ПРОГРАММЕР с стажем ужеболее 15 лет и изыски типа блок схем, считаю как и весь мир извратом !


Динер пример в стцдию...

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 13 апр 2009, 11:17

Справка по Разработчику: прямо в корне раздел "Глобальные переменные" и ещё в разделе "Данные" пункт "Свойство данных".

Или поиск в справке по слову "конфигурационные"

Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 14 апр 2009, 03:07

Да дарнер дал пример ,в 3 минуты сделаный .. это лучше... дошло чтоих надло зпихивать в отдельный файл час подумаю как это прикрутить к моему меню...

ic_ahp
Сообщения: 36
Зарегистрирован: 10 июл 2006, 13:05

dep_ArrayIndex

Сообщение ic_ahp » 12 май 2009, 12:34

Можно ли тут привести вариант вызова функции dep_ArrayIndex из Си-блока? То ли лыжи не едут, то ли... еще что, но при добавлении блока dep_ArrayIndex в список используемых в код добавляется строка
(null) DTermBlock1;
о которую и спотыкается компилятор:

Код: Выделить всё

error: `null` undeclared (first use this function)
error: (Each undeclared identifier is reported only once for each function it appears in.)
error: expected `;` before "DTermBlock1"

P.S. А что, программисты в ДЭПе пошли настолько суровые, что решили, незачем в дистрибутив Разработчика вкладывать "Справку"? :)

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

dep_ArrayIndex

Сообщение Светлана » 12 май 2009, 13:35

ic_ahp писал(а):P.S. А что, программисты в ДЭПе пошли настолько суровые, что решили, незачем в дистрибутив Разработчика вкладывать "Справку"? :)

Да, справка потерялась(( Сейчас разберемся и dep_ArrayIndex посмотрим тоже.

darner
Сообщения: 34
Зарегистрирован: 09 июл 2008, 17:40

dep_ArrayIndex

Сообщение darner » 12 май 2009, 14:29

Светлана писал(а):...
Да, справка потерялась...


А что в этой справке что-то новое появилось за последние полгода обновлений Разрабочика?;)

Равиль
Сообщения: 58
Зарегистрирован: 08 фев 2005, 14:48

Сообщение Равиль » 12 май 2009, 17:43

не видел в Си dep_ArrayIndex

ic_ahp
Сообщения: 36
Зарегистрирован: 10 июл 2006, 13:05

Сообщение ic_ahp » 12 май 2009, 18:14

Равиль писал(а):не видел в Си dep_ArrayIndex

Равиль, уж если Вы не видели...
Так понимаю, это была шутка. Изначальный вопрос:
ic_ahp писал(а):Можно ли тут привести вариант вызова функции dep_ArrayIndex из Си-блока?

следует понимать: пример вызова стандартного блока dep_ArrayIndex из Си-блока.

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 12 май 2009, 18:49

Временно выложила справку по Разработчику в pub http://www.dep.ru/downloads/pub/Developer.chm

Вам нужно к элементу массива из Си-блока обратиться? Тогда посмотрите в справке "Описание пользовательских интерфейсов\Окна редактора\Работа с С-текстом" пункт "Генерация массивов".

Для переменных удобно использовать псевдонимы (задаются в диалоге "Свойства переменной"). Это замена автоимен (имя в исходном файле) типа DParam0.

Если задать для массива, например
"псевдоним #define" PP
"псевдоним массива" MyArr

тогда обращение к элементу массива: PP.ArrData[i] или MyArr[i]

Блок dep_ArrayIndex на Си не использовала.

ic_ahp
Сообщения: 36
Зарегистрирован: 10 июл 2006, 13:05

Сообщение ic_ahp » 12 май 2009, 18:58

Светлана писал(а):Вам нужно к элементу массива из Си-блока обратиться? Тогда посмотрите в справке "Описание пользовательских интерфейсов\Окна редактора\Работа с С-текстом" пункт "Генерация массивов".


Нужно обратиться к элементу массива, расположенного в глобальных переменных.

Faster
Сообщения: 653
Зарегистрирован: 11 июл 2007, 09:38

Сообщение Faster » 13 май 2009, 07:22

ic_ahp я вижу ещё один сишниГ пророс, предлагаю коалицию по разводу депа на СДК :)


а вообще дам те совет , я делаютак чтобы узнать как что уних работате делаютрэшпрогу в котоой чтото используюметодлом блоков, потом смотрю си код ...


конечно немного ужасно но всё же .... про масиивы я так и разобрался ...


а вообще у депа существует множество загадочных форматов STR16 меня просто паразил, да кстати так же ка ки структуры возвращаемые функциями чтения дискретов и счётчикоф....

а так же полное не использованеи стандартных типов ...

Светлана
Сообщения: 329
Зарегистрирован: 06 июн 2005, 15:27
Откуда: Компания ДЭП

Сообщение Светлана » 13 май 2009, 14:16

ic_ahp писал(а):Нужно обратиться к элементу массива, расположенного в глобальных переменных.

Тогда Вам подойдут рекомендации из моего сообщения выше. У Вас всё получилось?

ic_ahp
Сообщения: 36
Зарегистрирован: 10 июл 2006, 13:05

Сообщение ic_ahp » 13 май 2009, 18:04

Faster писал(а):а вообще дам те совет , я делаютак чтобы узнать как что уних работате делаютрэшпрогу в котоой чтото используюметодлом блоков, потом смотрю си код ...

Аналогично. Только суть в том, что из ФБД код выглядит так:

Код: Выделить всё

float DTermBlock1;

где DTermBlock1 и есть блок dep_ArrayIndex.
Но если в список используемых блоков в Си добавить dep_ArrayIndex, то генерируется следующий код:

Код: Выделить всё

(null) DTermBlock3;

Ошибку компилятора на эту строку я приводил выше.

Светлана писал(а):Тогда Вам подойдут рекомендации из моего сообщения выше. У Вас всё получилось?


Полагаю, что

Код: Выделить всё

DataItem = Glob1.DGlobItem0.ArrData[1];

то, что мне надо. Спасибо.
Кстати, а в документации на Разработчик где-то приведен список зарезервированных ключевых слов? Ибо я вчера немало времени убил на ошибку:
error: 'struct TDateTimeRec' has no member named 'internal'

Да, и еще просьба: сделайте подтверждение на удаление блока из списка используемых, а то одно неверное движение и приходится судорожно удалять все и заполнять заново (чтобы программу не исправлять).