Показано с 1 по 6 из 6

Тема: Типа данных в ST: пользовательские, перечислимые, структурированные и д.р.

  1. #1

    Exclamation Типа данных в ST: пользовательские, перечислимые, структурированные и д.р.

    Доброго дня! Планируется ли добавлять поддержку типов, определенных в подпунктах пункта 6.4 МЭК 61131-3-2016? Интересуют:
    6.4.4 Определенные пользователем типы данных
    6.4.4.2 Перечислимый тип данных
    6.4.4.6 Структурированный тип данных


    Этот интерес возник в ходе чтения вашей документации; заметил что во-первых этого нет, а во-вторых размеры типов указанные в OWENLogic.chm не совпадают с размерами указанными в пп. 6.4.2.1 ГОСТ Р МЭК 61131-3-2016
    Тип Bool должен занимать 1 бит, а не 4 байта. Не оправданно расходуется память устройства и сильно разряженные данные с бОльшей вероятностью не окажутся в самом быстром кэше процессора, что также негативно сказывается на быстродействии.


    Программируя "сырые" мироконтроллеры, удаётся упаковать в 32х битный int 32 логические переменные и очень даже читабельно к ним обращаться в коде. В языке ST чуть более пёстрый синтаксис, но можно писать столь же эффективный и компактный код, если использовать структуры с битовыми полями и объединения; перечисляемые типы нужны сколько не для эффективности, а для повышения читабельности кода и его надежности.

    Вот пример программы:

    PHP код:
    #include <stdio.h>
    #include <inttypes.h>

    typedef struct {
        
    _Bool S11;
        
    _Bool S21;
        
    _Bool S31;
        
    _Bool S41;
        
    _Bool S51;
        
    _Bool S61;
        
    _Bool S71;
        
    _Bool S81;
    KeyBits;

    typedef struct {
        
    union {
            
    KeyBits bits;
            
    uint8_t data;
        };
    MachineInput;

    typedef enum uint8_t {
        
    ST_ONE,
        
    ST_TWO,
        
    ST_THREE,
        
    ST_FOUR,
        
    ST_FIVE,
        
    ST_SIZE,
        
    ST_SEVEN,
        
    last_state
    eMachineState;

    int main (void) {
        
    MachineInput Input;
        
    eMachineState State ST_THREE;

        
    Input.data 0b10000000// = Rs485.ReadByte(address);
        
    Input.bits.S7 1;

        
    printf ("sizeof(Input)=%lu sizeof(State)=%lu\n"sizeof(Input), sizeof(State));
        
    printf ("Input value = %" PRIu8 "\n"Input.data);
        
    printf ("State value = %" PRIu8 "\n"State);

        return 
    0;

    PHP код:
    gcc ./main.-std=c2x -Wall -Wextra -o main && ./main 
    sizeof
    (Input)=1 sizeof(State)=1
    Input value 
    192
    State value 

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

    С учётом необходимости выравнивания по длине процессорного слова в реальных прошивках контроллеров размеры структур всё же подгоняются под длину слова, но для 8 битных МК пойдёт и так; все операции с такими типами данных будут делаться за один машинный такт.

    Мне бы очень хотелось используя модуль МВ110-24.32ДН получать от него 4 байта по сети, складывать их в структуру состоящей из объединения 32х логических переменных с одним UDINT и обращаться к битовым полям этой структуры не расходуя лишней памяти. Может быть есть пример, как это сделать также эффективно, как в примере на C, что я привёл выше?

  2. #2
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,908

    По умолчанию

    Ну, так, вы получаете от модуля битовую маску, и общайтесь с ней через
    Безымянный.png

    Насчет того, что bool занимает 4 байта - где вы это прочитали?

  3. #3
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,908

    По умолчанию

    Ну а что касается сложных типов данных - этого не будет, потому что ST на ПРке - это просто надстройка, более удобный способ реализации алгоритмов для макросов. Дай бог, чтобы завезли знаковый целый тип и побитовые логические операции

  4. #4

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Ну, так, вы получаете от модуля битовую маску, и общайтесь с ней через
    Безымянный.png

    Насчет того, что bool занимает 4 байта - где вы это прочитали?
    Спасибо за указание на пункт 12.1.1 в файле rp_owen_logic.pdf как-то проглядел этот момент.
    Необходимость в структурах и объединениях отпадает; остаётся лишь пожелание иметь перечисляемый тип, который бывает полезен при реализации логики работы станков-автоматов, которые переходят между несколькими состояниями при правильном срабатывании концевых выключателей и совершают аварийный ответ в безопасное положение при неправильном срабатывании концевых выключателей.

    То, что BOOL занимает 4 байта написано в пункте 12.3 файлика rp_owen_logic.pdf версии 1.98 от 01.2025; там все типы данных занимают 4 байта.
    В .chm файлике из дистрибутива программы указано аналогично - все типы по 4 байта.
    Последний раз редактировалось idimi0; 13.03.2025 в 14:06.

  5. #5
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,908

    По умолчанию

    В версии руководства 1.67 bool занимает 1 бит. Возможно, опечатались

  6. #6

    По умолчанию

    Цитата Сообщение от idimi0 Посмотреть сообщение
    Доброго дня! Планируется ли добавлять поддержку типов, определенных в подпунктах пункта 6.4 МЭК 61131-3-2016? Интересуют:
    6.4.4 Определенные пользователем типы данных
    6.4.4.2 Перечислимый тип данных
    6.4.4.6 Структурированный тип данных


    Этот интерес возник в ходе чтения вашей документации; заметил что во-первых этого нет, а во-вторых размеры типов указанные в OWENLogic.chm не совпадают с размерами указанными в пп. 6.4.2.1 ГОСТ Р МЭК 61131-3-2016
    Тип Bool должен занимать 1 бит, а не 4 байта. Не оправданно расходуется память устройства и сильно разряженные данные с бОльшей вероятностью не окажутся в самом быстром кэше процессора, что также негативно сказывается на быстродействии.

    ...
    Не знаю насчет 4 байт, но вообще минимально адресуемая ячейка памяти в том-же кодесисе, например - 1 байт, и переменная типа bool там столько и занимает

Похожие темы

  1. ТРМ133М и считывание типа данных Parpoint
    от Aleksey Belokon в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 18.12.2018, 11:51
  2. Размер структуры (типа данных)
    от izwerg в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 07.11.2017, 01:09
  3. Пользовательские ФБ, таймера в ST
    от Vitorgan в разделе Master SCADA 3
    Ответов: 0
    Последнее сообщение: 22.02.2016, 11:53
  4. Пользовательские функции modbus
    от dnsss в разделе ПЛК3xx (архив)
    Ответов: 0
    Последнее сообщение: 29.01.2015, 19:57
  5. Перечислимые в Отчете
    от evg3798 в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 25.03.2013, 16:53

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •