Вход

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



idimi0
12.03.2025, 17:56
Доброго дня! Планируется ли добавлять поддержку типов, определенных в подпунктах пункта 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 чуть более пёстрый синтаксис, но можно писать столь же эффективный и компактный код, если использовать структуры с битовыми полями и объединения; перечисляемые типы нужны сколько не для эффективности, а для повышения читабельности кода и его надежности.

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



#include <stdio.h>
#include <inttypes.h>

typedef struct {
_Bool S1: 1;
_Bool S2: 1;
_Bool S3: 1;
_Bool S4: 1;
_Bool S5: 1;
_Bool S6: 1;
_Bool S7: 1;
_Bool S8: 1;
} 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;
}





$ gcc ./main.c -std=c2x -Wall -Wextra -o main && ./main
sizeof(Input)=1 sizeof(State)=1
Input value = 192
State value = 2


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

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

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

Dimensy
12.03.2025, 19:10
Ну, так, вы получаете от модуля битовую маску, и общайтесь с ней через
82413

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

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

idimi0
13.03.2025, 14:04
Ну, так, вы получаете от модуля битовую маску, и общайтесь с ней через
82413

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

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

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

1exan
13.03.2025, 16:06
Доброго дня! Планируется ли добавлять поддержку типов, определенных в подпунктах пункта 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 там столько и занимает