Просмотр полной версии : СП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