Суббота, 21.06.2025, 06:36

Приветствую Вас Гость | RSS
Мой сайт
ГлавнаяРегистрацияВход
Меню сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Главная » 2015 » Ноябрь » 9 » СП270: полноценный Си : Си Atoi синтаксис
23:37
СП270: полноценный Си : Си Atoi синтаксис

Просмотр полной версии : СП270: полноценный Си

Yegor

24.01.2013, 08:05

Короче... В конфигураторе СП270 лежит полноценный си-компилятор вместе со стандартной библиотекой. Жутко интересно, насколько это работоспособно за пределами тех нескольких функций (http://www.owen.ru/forum/showthread.php?t=14173), которыми полуофициально ограничен API панели.

Устроено оно вот как... То, что называется в конфигураторе «Глобальная функция» это на самом деле вовсе не функция, а тело программы, где традиционно объявляют глобальные переменные. Остальные же «функции», которые можно самому добавить, уже действительно являются процедурами, и при компиляции они прикрепляются к «глобальной функции», после чего вся конструкция скармливается компилятору одним большим куском.

Давайте картинку нарисую:

http://s8.postimage.org/9udjti2v9/func1.png

Ну и, собственно, в подтверждение картинки вот основное содержимое временных папок перед отправкой компилятору:
#include "..\Include\Lib.h"
#include ".\Device.h"

extern void Func1();

const char* str = "Hello";
char buf[10];

void Func1()
{
FILE* w = fopen("file.txt", "w");
if (w != NULL)
{
fwrite(str, strlen(str), 1, w);
fclose(w);
}
w = fopen("file.txt", "r");
if (w != NULL)
{
fread(buf, strlen("Hello"), 1, w);
fclose(w);
}
}

#pragma arm section rodata = "FunTable"
void* const Funcs[] = {(void*)1, (void*)InitEnvironment, (void*)Func1};
#pragma arm section rodataВнизу можно наблюдать массив указателей на функции в секции FunTable. Вероятно, из этого массива и вызываются функции если они привязаны к какому-то элементу.

Так что поэксперериментируйте там. Только если из устройства кирпич сделаете, то на меня чур не обижаться.

Адрей

24.01.2013, 15:01

То, что называется в конфигураторе «Глобальная функция» это на самом деле вовсе не функция, а тело программы, где традиционно объявляют глобальные переменные. Остальные же «функции», которые можно самому добавить, уже действительно являются процедурами, и при компиляции они прикрепляются к «глобальной функции»,
Вот теперь с этого место по подробней. Желательно по подробней с примером по управлению простыми функциями из глобальный функции.
К примеру так.

DWORD Crc(BYTE* pBytes, int Length)
{
DWORD dwCrc = 0;

return dwCrc;
}

void CallFunction()
{
Func1();
}



Внутрь конечно лесть и менять ничего не стоит а то действительно кирпич получится.:)

Yegor

25.01.2013, 07:27

Вы же с Си знакомы? Вот вам иллюстрация:
/* В «глобальной функции» вы здесь.
Отсюда нельзя управлять. Тут объявляются/определяются
глобальные переменные и другие функции.
*/

int main()
{
// ... и вы не здесь, если что
printf("Hello world");
}Управление по-прежнему начинается из настоящих функций, которые вы добавляете вручную. Вашу Crc я бы как раз объявил/определил в этой глобальной секции, и она бы стала доступна во всех функциях.

Есть, впрочем, и аналог точки входа main() в этом колхозе, но он в файле Lib.h и называется InitEnvironment. Но пока голову этим забивать никому не буду.

Адрей

25.01.2013, 12:20

Вы же с Си знакомы?
Знаком поверхностно но не настолько углубленно.:)
По большому счету для СП270 с её производительностью
глобальная функция может и не пригодится. Просто хотел услышать ваше мнение о необходимости глобальной функции.

Yegor

25.01.2013, 12:45

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

Адрей

25.01.2013, 13:11

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

Да, вы правы, все зависит от поставленной задачи. И если процессов много и алгоритм управления однотипный то нам помогут глобальные переменные.

petera

26.01.2013, 08:14

После компиляции (F7) функций в папке "ARMTool" появляются папки вида "MacNNN"(NNN-номер) в которых находится 4 файла
-Device.h
-error.txt
-MacNNN.c
-MacNNN.o
Так проекта из примера http://www.owen.ru/forum/showpost.php?p=100775&postcount=1 у меня MacNNN.c

#include "..\Include\Lib.h"
#include ".\Device.h"
extern void Func1();
void Func1()
{
WORD a,b,c,max,min;// Прописываем переменные тип WORD
a=PSW[256];// Присваиваем переменной a значение регистра PSW256
b=PSW[257];// Присваиваем переменной b значение регистра PSW257
c=PSW[258];// Присваиваем переменной c значение регистра PSW258
if(a>b)//Условие сравнения
{max=a;min=b;}//выполнение условия если да
else
{max=b;min=a;}//выполнение условия если нет
if(max<c)
max=c;
if(min>c)
min=c;
PSW[259]=max;// запись максимального значения в регистр PSW259
PSW[260]=min;// запись минимального значения в регистр PSW260
}
#pragma arm section rodata = "FunTable"
void* const Funcs[] = {(void*)1, (void*)InitEnvironment, (void*)Func1};
#pragma arm section rodata

Yegor

26.01.2013, 09:44

После компиляции (F7) функций в папке "ARMTool" появляются папкиНа самом деле до компиляции. То есть по нажатию F7 создаются эти папки и уже оттуда файл .c идёт на компилятор. После компиляции там появляется файл .o — готовый к исполнению бинарник.

petera

26.01.2013, 10:20

А может в некоторых случаях ПЛК вообще не нужен? А достаточно СП270+ модули ввода/вывода?
Ведь и ПИД регулятор можно на Си написать.:)
И регулирование будет и архивирование есть, и графики (исторический и реального времени) есть, и журнал событий тоже есть.
Получается ПЛК лишнее передаточное (и не дешевое) звено?
ЗЫ. Забыл, что и сенсорный экран тоже есть.

Адрей

26.01.2013, 11:45

А может в некоторых случаях ПЛК вообще не нужен? А достаточно СП270+ модули ввода/вывода?
Ведь и ПИД регулятор можно на Си написать.:)
И регулирование будет и архивирование есть, и графики (исторический и реального времени) есть, и журнал событий тоже есть.
Получается ПЛК лишнее передаточное (и не дешевое) звено?
ЗЫ. Забыл, что и сенсорный экран тоже есть.

ПИД конечно организовать можно, но система получится менее устойчивая к отказам.
А вот если был мини ПИД у ОВЕН то они считались не плохо.

Про мини ПИД я уже говорил год назат меня там за критиковали. http://www.owen.ru/forum/showthread.php?t=11532

Адрей

26.01.2013, 13:52

Егор не подскажешь как из функции достучатся до функций вызова экрана и т.п где капать.

petera

26.01.2013, 15:47

ПИД конечно организовать можно, но система получится менее устойчивая к отказам.
А почему она должна быть менее устойчивой к отказам?
Надежность системы тем выше, чем меньше в ней компонентов.
А здесь целый ПЛК с кучей радиоэлементов изымается. Я не думаю, что ПЛК супер-пупер надежное устройство, такое же микропроцессорное устройство как и панель. Панель по своей сути то же контроллер и устроена так же, как и ПЛК -процессор, ОЗУ, ПЗУ, флеш, COM порты, только ПО для разработки прикладной программы разное.
ПЛК мог и не иметь внутри системы исполнения содесиса, а мог бы программироваться на Си. От этого он не стал бы менее или более надежным. Как была бы "железяка", такая бы и осталась -плата, реле, оптроны на входе, ОЗУ, ПЗУ, флеш, СОМ порты.
Так и для панели, в среде KEIL или IAR для АРМа делать прикладную программу. Только здесь нужны знание и опыт написания программ на Си.

Адрей

26.01.2013, 19:12

А почему она должна быть менее устойчивой к отказам?
Надежность системы тем выше, чем меньше в ней компонентов.

Во многом с вами согласен на счет компонентов и хлипких разъемов как в ПЛК. Устойчивость отказов панели будет выше в том случае когда будет решение серьезной проблемы.
В СП270 надо решить одну проблему, связано с опросом параметров через порт, отвалился модуль встал весь процесс. Вот как победим это, тогда можно и поговорить об регуляторах построеных на модулях В/В.

petera

26.01.2013, 21:55

Я же говорил, что "в некоторых случаях".
А на счет

В СП270 надо решить одну проблему, связано с опросом параметров через порт, отвалился модуль встал весь процесс. Вот как победим это, тогда можно и поговорить об регуляторах построеных на модулях В/В.
я с Вами полностью согласен, проблема "связано с опросом параметров через порт, отвалился модуль встал весь процесс" есть. Но эта проблема не только для СП270, а например тех же СПК207 или Модус.
Я и сам с опаской отношусь к конфигурации ПЛК+ модули дискретного ввода/вывода, если к модулям подключены датчики и исполнительные механизмы, хотя в этом случае выходы ПЛК могут быть использованы по крайней мере в тех цепях управления, которые могут обеспечить принудительный переход оборудования в безопасное состояние.
А было бы неплохо СП270=миниСПК207:)

Yegor

28.01.2013, 06:01

Егор не подскажешь как из функции достучатся до функций вызова экрана и т.п где капать.
WORD ScreenJump(WORD ScreenNo);
void OpenWindow(WORD winNo, WORD Window_X, WORD Window_Y );
void CloseWindow(WORD winNo );Копать от .\ARMTool\Include\Lib.h

Адрей

28.01.2013, 06:24

WORD ScreenJump(WORD ScreenNo);
void OpenWindow(WORD winNo, WORD Window_X, WORD Window_Y );
void CloseWindow(WORD winNo );Копать от .\ARMTool\Include\Lib.h
Большое спасибо!
Проверил производительность, впечатляет, запустил функцию длиною 70 строк программного регулятора, выполнила 150 раз за 3 секунды.

Anth

30.01.2013, 14:03

Подскажите, как на панели СП270 реализовать алгоритм преобразования десятичного числа в шестнадцатеричное.
Классические методы Си (atoi(itoa)) не работают.

petera

30.01.2013, 14:55

Подскажите, как на панели СП270 реализовать алгоритм преобразования десятичного числа в шестнадцатеричное.
Классические методы Си (atoi(itoa)) не работают.
Ой, что-то я подозреваю Вы про это http://www.owen.ru/forum/showpost.php?p=99756&postcount=1508

Anth

30.01.2013, 15:50

Нет, не совсем то, к сожалению, но я уже разобрался с этой проблемой. Лучше подскажите, есть ли где-нибудь полный список (описание) и синтаксис операторов Си, используемых в конфигураторе СП200?
Просто я раньше писал на Си в Keil uVision, и теперь немного теряюсь в новой для меня программе, особенно без толкового Help'а.
К примеру, как использовать функцию crc (для расчета контрольной суммы), есть операторы прямого преобразования типа переменных и т.д. и т.п.

skraev

30.01.2013, 19:56

к компа доступа нет

http://www.owen.ru/forum/showpost.php?p=8107&postcount=21

Yegor

31.01.2013, 08:32

Подскажите, как на панели СП270 реализовать алгоритм преобразования десятичного числа в шестнадцатеричное.
Классические методы Си (atoi(itoa)) не работают.sprintf/sscanf с шестнадцатеричным типом.
полный список (описание) и синтаксис операторов Си, используемых в конфигураторе СП200Функции смотрите в тех файлах, что включены в заголовке Lib.h. Операторы стандартные ANSI C.

DmitriiAnyushin

04.09.2015, 14:14

Подскажите пожалуйста, как я могу преобразовать число формата int в строковую переменную char (прим число 16 в текст 16)?
Могу ли я имея две переменные char объединить их в одну (Пример. символы "1" и "6", а в результате "16" )?
Спасибо!

Powered by vBulletin® Version 4.2.0 Copyright © 2015 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot

Просмотров: 539 | Добавил: supoinclus | Рейтинг: 0.0/0
Всего комментариев: 0
Вход на сайт

Поиск

Календарь
«  Ноябрь 2015  »
Пн Вт Ср Чт Пт Сб Вс
      1
2345678
9101112131415
16171819202122
23242526272829
30

Архив записей

Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz


  • Copyright MyCorp © 2025Бесплатный хостинг uCoz