aadomos70 - 2015-07-08

Осваиваем новый проект методом кидания в бассейн к крокодилам. На процессорной плате стоит Beck SC24 связанный с МК нижнего уровня по SPI (Slave). Обмен данными по инициативе нижнего уровня приходит 1 раз в секунду в объеме ~300 байт. Обменом занимается отдельная программа, в которой SPI работает по прерываниям, складывая байты в буфер, а потом после приема переносит их расшаренную область(по RTX_Publish(&GLD,"SHARED_DATA");) данных. В проекте Codesys программа использует эти данные для кучи тяжелых вычислений с плавающей точкой и результат складывает у себя, чтобы с верхнего уровня SCADA забрала их по Ethernet (через OPC). Так-же предусмотрена Web-визуализация, что-бы через браузер производить настройку системы.

 Проблемы: копирование всего блока данных из процесса SPI ~75 мкс. В Codesys SDK для переноса данных из / в SHARED_DATA предусмотрено 4 функции: RHIIOReadAllInputs,RHIIOReadInput, RHIIOWriteAllOutputs,RHIIOWriteOutput, две из них пишут / читают данные единым блоком, 2 - по одной переменной. В процессе работы наблюдается пересечение пачек запросов RHIIOReadInput и копирования из SPI, что приводит к замораживанию данных.

Оборудование: 
    - Beck IP chip SC24-IEC (v2.01)
    - Paradigm 7.00.054 + CLib 2.70
    - Исполнительная система в SC24:
        CoDeSys SOFTPLC Full RTS FOR IPC@CHIP RTOS SC23
            Copyright (c) 3S-Smart Software Solutions GmbH
        3S Kernel Version: 2.4.7.19
        Beck RTS Version : RTS_Full V1.41
        Date/Time build : Apr 12 2010/13:14:24
        OEM Impl.Version : TEST Controller

Задачи:
    20 Tasks:
    ID    92 cnt     0  AMXK prio=  0 stack= 1024 used=13% state=0002
    ID   444 cnt     0  NMI  prio=  1 stack= 1024 used= 3% state=0180
    ID   536 cnt     0  TCPT prio=  4 stack= 2048 used=30% state=0081
    ID   628 cnt    93  ETH0 prio=  5 stack= 3072 used=29% state=0004
    ID  1456 cnt     4  Ctrl prio=  5 stack= 4096 used= 5% state=0080
    ID   720 cnt     0  PPPC prio=  6 stack= 1536 used= 2% state=0080
    ID   812 cnt     1  CFGS prio=  7 stack= 1536 used=44% state=0008
    ID  1088 cnt     0  TELN prio= 11 stack= 1536 used=50% state=0008
    ID  1180 cnt     0  SSHD prio= 11 stack= 1024 used=36% state=0108
    ID   352 cnt     0  MTSK prio= 12 stack= 4000 used=46% state=0100
    ID  1272 cnt     3  DOS1 prio= 25 stack= n/a  used=n/a state=0180
    ID  1364 cnt     0  DOS2 prio= 30 stack= n/a  used=n/a state=0181
    ID   904 cnt     0  FTPS prio= 41 stack= 2000 used=49% state=0108
    ID   996 cnt     0  WEBS prio= 41 stack= 2048 used=34% state=0108
    ID  1732 cnt  2420  Meas prio= 45 stack= 8192 used=16% state=0108
    ID  1548 cnt     2  Fill prio= 46 stack= 8192 used=22% state=0108
    ID  1640 cnt  2747  Main prio= 47 stack= 8192 used=18% state=0100
    ID  1824 cnt   674  Inpu prio= 63 stack= 8192 used=10% state=0100
    ID  1916 cnt     0  tTSr prio= 66 stack= 8192 used=21% state=0108
    ID  2100 cnt   567  tTCl prio= 66 stack= 8192 used=21% state=0100

DOS1 - обмен по SPI;
DOS2 - исполнительная система;
Meas - считывание и обсчет данных; 
Fill - операции с файлами настроек;
Main - заполнение форм Web-визуализации (REAL -> STRING);

Inpu - ??? возможно считывание / запись данных из SHARED_DATA;
Ctrl - ???
tTSr - ???
tTCl - ???

ВОПРОСЫ:
- Как заставить систему использовать RHIIOReadAllInputs вместо надергивания по одной переменной;
- Beck RTOS явяется настоящей многозадачной вытесняющей ОСРВ?
- Процессы codesys выполняются так-же как и другие в системе (период / вытеснение)?
- Вычисления с REAL в задачах codesys имеет ограничения на параллельное использование
(для Paradigm указано что только однопоточное из-за soft interrupt).