Перейти к содержанию
    

Какая программно-аппаратная архитектура для умного дома самая лучшая?

35 minutes ago, syoma said:

В CODESYS Control for Raspberry Pi все, что я указал выше, работает прямо из коробки без необходимости докупки лицензий.

Эт все хрошо. 
Но K-Bus уже не будет и придется действительно полагаться на EtherCAT. 
Еще вопрос будет ли TCP MODBUS работать одновременно с EtherCAT (а modbus нужен обязательно).
Риски сбоев сильно возрастают и быстродействие снижается.
И не вижу чтобы CoDeSys для RPi давал патч для превращения линукса в RT, это настораживает. 
 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 minutes ago, AlexandrY said:


И не вижу чтобы CoDeSys для RPi давал патч для превращения линукса в RT, это настораживает. 
 
 

Вот наткулся.   https://forge.codesys.com/trg/raspberry-pi/wiki/Home/#realtime-patch

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, framer said:

Это патч для Rpi 2 / 3 а там, как известно, Ethernet сделан через ж..у USB 
Если связываться, то только с Rpi 4, поскольку риалтаймность Ethernet-а в такой системе становится критической.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AlexandrY said:

Еще вопрос будет ли TCP MODBUS работать одновременно с EtherCAT (а modbus нужен обязательно).

EtherCAT требует отдельного Ethernet порта. Ничего другого там быть не может. Для Modbus TCP надо просто отдельный USB Ethernet адаптер докупить.

1 hour ago, AlexandrY said:

И не вижу чтобы CoDeSys для RPi давал патч для превращения линукса в RT, это настораживает. 

На форуме Codesys есть инфа, как пропатчить линукс до RT. Большинству это не нужно, так как там и так уже достаточно хорошие цифры.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, syoma said:

EtherCAT требует отдельного Ethernet порта. Ничего другого там быть не может. Для Modbus TCP надо просто отдельный USB Ethernet адаптер докупить.

Ну не факт.
Есть же EtherCAT драйвера для обычных PC.
B по UDP можно EtherCAT транспортировать, как википедия вещает.  Кто его знает что там в линуксе нахимичено.
А отдельный  USB Ethernet обещает великий колхоз.  Понянет ли CoDeSys мапинг переменных из каплеров через такой интерфейс? 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я имел ввиду, что к тому порту, на котором будет EtherCAT, может быть подключен только EtherCAT Каплер и больше ничего туда не подключишь - то есть он будет зарезервирован только за EtherCATом.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел я как выглядит CODESYS Development System V3 
Уныло. Голая IDE.
Каталога оборудования нет, что с чем совместимо никакой информации. Остается только верить вашим словам что EtherCAT не может работать на одном интерфейсе с Ethernet UDP/TCP. 
На одни только опыты уйдет куча временги. Столько времени нет. 
Тот же KNX приобрел популярность, думаю, не потому что он такой протокол весь из себя замечательный, а потому что там есть всегда актуальный каталог и полный контроль совместимости.
Инсталяторы не теряются в догадках что с чем заработает.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 минуты назад, AlexandrY сказал:

Посмотрел я как выглядит CODESYS Development System V3 
Уныло. Голая IDE.
 

Таргеты целевых платформ распространяются производителями самих железок, как мне помнится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, AlexandrY said:

Посмотрел я как выглядит CODESYS Development System V3 
Уныло. Голая IDE.

А тот e!Cockpit не на V2.3 случайно построен? То еще большее уныние.

Quote

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

А как должно быть?

 

1 hour ago, AlexandrY said:

На одни только опыты уйдет куча временги. Столько времени нет. 

По поводу опытов - на ютубе есть полно туториалов по которым за 5 минут запускается своя программа на ST вместе с I/O. Как по мне, это стоит выделенного времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, syoma said:

А как должно быть?

По поводу опытов - на ютубе есть полно туториалов по которым за 5 минут запускается своя программа на ST вместе с I/O. Как по мне, это стоит выделенного времени.

Должно быть как-то так:
image.thumb.png.32f1eb7418f1348aa0f84e84cfa9f814.png

e!COCKPIT сделан на CoDeSyS V3.5

А ST я даже не планирую изучать.
Берем диаграмму состояний, в данном случае круиз-контроль для управления скоростью 

image.thumb.png.e9ebe1c5fa3c2e1228b3786fb2dec263.png

и генерим из нее ST

Spoiler

CASE ssMethodType OF
    SS_INITIALIZE: 
        clockTickCounter := 0;
        is_Enable := c_Controller_IN_NO_ACTIVE_C;
        is_on := c_Controller_IN_NO_ACTIVE_C;
        is_Set_Point_Calculation := c_Controller_IN_NO_ACTIVE_C;
        temporalCounter_i1 := 0;
        is_active_c1_Controller := 0;
        set_speed := 0.0;
        active := FALSE;
        TargetSpeed := 0.0;
        UnitDelay_DSTATE := 0.0;
        c_DiscreteTimeIntegrator_IC := 1;
    SS_STEP: 
        tempInputSignal[0] := PLC_BOOL_TO_LREAL(in := (clockTickCounter < 1) AND (clockTickCounter >= 0));

        IF clockTickCounter >= 1 THEN 
            clockTickCounter := 0;
        ELSE 
            clockTickCounter := clockTickCounter + 1;
        END_IF;

        tempInputSignal[1] := Increment;
        tempInputSignal[2] := Increment;
        tempInputSignal[3] := Decrement;
        tempInputSignal[4] := Decrement;
        tempInputSignal[5] := Set;
        tempInputSignal[6] := Resume;

        FOR Ns := 0 TO 6 DO 
            i0_ZCFCN_d_ANY(u0 := EnableSetpoint_Trig_ZCE[Ns], u1 := tempInputSignal[Ns]);
            tempOutEvent[Ns] := i0_ZCFCN_d_ANY.y0;
            outState[Ns] := i0_ZCFCN_d_ANY.y1;
        END_FOR;

        tempOutEvent_0 := FALSE;

        FOR Ns := 0 TO 6 DO 
            EnableSetpoint_Trig_ZCE[Ns] := outState[Ns];
            tempOutEvent_0 := tempOutEvent_0 OR (tempOutEvent[Ns] <> 0);
        END_FOR;


        IF tempOutEvent_0 THEN 

            FOR Ns := 0 TO 6 DO 
                rtb_inputevents[Ns] := DINT_TO_SINT(tempOutEvent[Ns]);
            END_FOR;


            FOR Ns := 0 TO 6 DO 
                callChartStep := 0;

                IF (Ns = 0) AND (rtb_inputevents[0] = 1) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_Update;

                    IF temporalCounter_i1 < 10 THEN 
                        temporalCounter_i1 := UDINT_TO_USINT(USINT_TO_UDINT(temporalCounter_i1) + 1);
                    END_IF;

                END_IF;


                IF (Ns = 1) AND (rtb_inputevents[1] = 1) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_INC_BD;
                END_IF;


                IF (Ns = 2) AND (rtb_inputevents[2] = -1) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_INC_BU;
                END_IF;


                IF (Ns = 3) AND (rtb_inputevents[3] = 1) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_DEC_BD;
                END_IF;


                IF (Ns = 4) AND (rtb_inputevents[4] = -1) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_DEC_BU;
                END_IF;


                IF (Ns = 5) AND (rtb_inputevents[5] <> 0) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_Set;
                END_IF;


                IF (Ns = 6) AND (rtb_inputevents[6] <> 0) THEN 
                    callChartStep := 1;
                    sfEvent := Controller_event_Resume;
                END_IF;


                IF callChartStep = 1 THEN 

                    IF is_active_c1_Controller = 0 THEN 
                        is_active_c1_Controller := 1;
                        is_Set_Point_Calculation := Controller_IN_Hold;
                        is_Enable := Controller_IN_Off;
                    ELSE 

                        CASE is_Set_Point_Calculation OF
                            Controller_IN_Decrement: 

                                IF sfEvent = Controller_event_DEC_BU THEN 
                                    is_Set_Point_Calculation := Controller_IN_Hold;
                                ELSIF (sfEvent = Controller_event_Update) AND (temporalCounter_i1 = 10) THEN 
                                    TargetSpeed := TargetSpeed - 1.0;
                                END_IF;

                            Controller_IN_Hold: 

                                IF (sfEvent = Controller_event_DEC_BD) AND (is_on = Controller_IN_active) THEN 
                                    is_Set_Point_Calculation := Controller_IN_Decrement;
                                    temporalCounter_i1 := 0;
                                    TargetSpeed := TargetSpeed - 1.0;
                                ELSIF (sfEvent = Controller_event_INC_BD) AND (is_on = Controller_IN_active) THEN 
                                    is_Set_Point_Calculation := Controller_IN_Increment;
                                    temporalCounter_i1 := 0;
                                    TargetSpeed := TargetSpeed + 1.0;
                                ELSIF (sfEvent = Controller_event_Set) AND (Power <> 0.0) THEN 
                                    TargetSpeed := curr_speed;
                                    set_speed := curr_speed;
                                ELSIF ((sfEvent = Controller_event_Resume) AND (Power <> 0.0)) AND (set_speed > 0.0) THEN 
                                    TargetSpeed := set_speed;
                                END_IF;

                            ELSE
                                (* case IN_Increment: *)

                                IF sfEvent = Controller_event_INC_BU THEN 
                                    is_Set_Point_Calculation := Controller_IN_Hold;
                                ELSIF (sfEvent = Controller_event_Update) AND (temporalCounter_i1 = 10) THEN 
                                    TargetSpeed := TargetSpeed + 1.0;
                                END_IF;

                        END_CASE;


                        CASE is_Enable OF
                            Controller_IN_Off: 

                                IF Power <> 0.0 THEN 
                                    is_Enable := Controller_IN_on;
                                    is_on := Controller_IN_no_target;
                                END_IF;

                            ELSE
                                (* case IN_on: *)

                                IF Power = 0.0 THEN 
                                    active := FALSE;
                                    is_on := c_Controller_IN_NO_ACTIVE_C;
                                    is_Enable := Controller_IN_Off;
                                ELSE 

                                    CASE is_on OF
                                        Controller_IN_active: 

                                            IF brakeratio <> 0.0 THEN 
                                                active := FALSE;
                                                is_on := Controller_IN_override;
                                                TargetSpeed := 0.0;
                                            END_IF;

                                        Controller_IN_no_target: 

                                            IF sfEvent = Controller_event_Set THEN 
                                                is_on := Controller_IN_active;
                                                active := TRUE;
                                            END_IF;

                                        ELSE
                                            (* case IN_override: *)

                                            IF (sfEvent = Controller_event_Set) OR (sfEvent = Controller_event_Resume) THEN 
                                                is_on := Controller_IN_active;
                                                active := TRUE;
                                            END_IF;

                                    END_CASE;

                                END_IF;

                        END_CASE;

                    END_IF;

                END_IF;

            END_FOR;


            IF temporalCounter_i1 = 10 THEN 
                temporalCounter_i1 := 0;
            END_IF;

        END_IF;


        IF active THEN 

            IF  NOT PIDController_MODE THEN 
                UnitDelay_DSTATE := 0.0;
                c_DiscreteTimeIntegrator_IC := 1;
                PIDController_MODE := TRUE;
            END_IF;

            rtb_PulseGenerator := TargetSpeed - curr_speed;

            IF c_DiscreteTimeIntegrator_IC <> 0 THEN 
                c_DiscreteTimeIntegrator_DS := accl;
            END_IF;

            b_Sum := ((30.0 * rtb_PulseGenerator) + c_DiscreteTimeIntegrator_DS) + ((rtb_PulseGenerator - UnitDelay_DSTATE) * 30.0);
            UnitDelay_DSTATE := rtb_PulseGenerator;
            c_DiscreteTimeIntegrator_IC := 0;
            c_DiscreteTimeIntegrator_DS := ((10.0 * rtb_PulseGenerator) * 0.1) + c_DiscreteTimeIntegrator_DS;
            Throt_cmd := MAX(b_Sum, accl);
        ELSE 

            IF PIDController_MODE THEN 
                PIDController_MODE := FALSE;
            END_IF;

            Throt_cmd := accl;
        END_IF;

END_CASE;

 

И больше об ST знать ничего не надо. 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, AlexandrY said:

Должно быть как-то так:

Очень похоже на то, что я видел в Codesys. Не вижу принципиальных отличий. Диаграмки и там наверняка построить можно. Каталог продукции тоже есть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 minutes ago, syoma said:

Очень похоже на то, что я видел в Codesys. Не вижу принципиальных отличий. Диаграмки и там наверняка построить можно. Каталог продукции тоже есть.

Диаграм нет, каталог какой-то есть, но скорее он просто включает модули поддерживаемые либами CoDeSys (но как-то странно отфильтрованные), но не по принципу совместимости между собой.

Кстати, интересная аналитика про умный дом с умными вещами сегодня проскочила на хабре - https://habr.com/ru/article/498102/ 
Оказывается большинство ждет нашествия умных розеток, выключателей и лампочек.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 4/23/2020 at 10:47 AM, AlexandrY said:

А ST я даже не планирую изучать.
Берем диаграмму состояний, в данном случае круиз-контроль для управления скоростью  

image.thumb.png.e9ebe1c5fa3c2e1228b3786fb2dec263.png

и генерим из нее ST

А я вот сегодня испытал Simulink Support Package for Raspberry Pi Hardware. В принципе прикольная штука - позволяет запускать Simulink модели прямо на малине без всяких других рантаймов. Есть встроенная поддержка MQTT. CAN попробую завтра. Жалко EtherCAT нет пока.

И самое главное - поддерживается External mode - можно отлаживать модели, когда они крутятся на целевой платформе. С PLC Coder такой фичи нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, syoma said:

А я вот сегодня испытал Simulink Support Package for Raspberry Pi Hardware. В принципе прикольная штука - позволяет запускать Simulink модели прямо на малине без всяких других рантаймов. Есть встроенная поддержка MQTT. CAN попробую завтра. Жалко EtherCAT нет пока.

И самое главное - поддерживается External mode - можно отлаживать модели, когда они крутятся на целевой платформе. С PLC Coder такой фичи нет.

Я бы не рассчитывал на External mode как на что-то серьезно полезное. 
Ему в мире микроконтроллеров и платформ с открытой средой исполнения есть достаточно заменителей. 
Например Micrium не далее как недавно сделал общественными  исходники своего uC/Probe. Это по сути конструктор довольно крутого HMI для Windows клиентов, там и MQTT есть, кстати. Естественно канал в Simulink там сделать тоже можно.

Или FreeMaster. Там уже готовые компоненты для Simulink-а есть.  Причем куча каналов доставки. Даже через SWD отладочного адаптера. 
Я давно работаю с моделями  Simulink на встроенных дивайсах через FreeMaster.
ПЛК  WAGO PFC200 есть открытые плаформы, туда тоже можно вставить исходники FreeMaster. 
Т.е. проблем наблюдать за моделью на целевой платформе в принципе нет.

Я в умном доме честно не нашел куда можно применить Raspberry Pi без очевидного оверхеда либо мисюзинга. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрался до выбора планшета. 

Нравится вот такой - https://www.amazon.com/dp/B0839NDRB2?tag=pulse2id1-20&linkCode=ogi&th=1
Имеет беспроводную зарядку,  работает от IKEA-вских  зарядников. 
Может в куче мест в  доме висеть, зарядки дешевые.   

От софта нужен только броузер, поскольку WEB сервер в самом PLC.
Но все же гложет мысль зачем тогда делают WEB панели?    
Количество пикселей минимальное, под каким-то линуксом, броузерный движок непонятный, требуют дыру в стене. 

Единственное что заметил: HMI сделанный  на базе броузера и  HTML в планшете заметно лагает. 
Т.е. мимолетно касаться планшета чтобы выполнить действи недостаточно, нужно всегда конкретно нажимать и ждать реакции.  
Вопрос: является ли это особеностью конкретного WEB сервера в PLC, или это врожденный порок планшетов с их сенсорным экраном и тормозным скриптовым движком.    


 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...