Доброго дня! Планируется ли добавлять поддержку типов, определенных в подпунктах пункта 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 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;
}
Как видите, структура позволяет обращаться в её данным двумя удобными способами: через битовые поля, что удобно в логических выражениях и целиком к блоку данных, что удобно при работе с протоколам обмена.PHP код:$ 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, что я привёл выше?


Ответить с цитированием
как-то проглядел этот момент.