LINUX.ORG.RU

Pure C добавить типы

 , iec61850,


1

1

Необходимо определить типы из ГОСТа 61850 такие как:

INT8
INT16
INT24
INT32
INT128
...
и например 
VISIBLE (максимальная длина должна определяться местом использования типа)

Каким образом это можно сделать?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

максимальная длина должна определяться местом использования типа

Вот с этого момента поподробней.

Y ★★
()
Ответ на: комментарий от splinter

Так поделись. От требований зависит же.

А по остальному — ifdef чтобы узнать архитектуру и typedef для определения типа.

Y ★★
()

На ум приходят только извращения. ;)

#include <stdint.h>

typedef int8_t    INT8;
typedef int16_t   INT16;
typedef struct {
    int8_t  hi;
    int16_t lo;
}   INT24;
typedef int32_t   INT32;
typedef struct {
    int64_t hi;
    int64_t lo;
}   INT128;
beastie ★★★★★
()
Ответ на: комментарий от beastie

На ум приходят только извращения. ;)

Эти варианты тоже в голову приходили.

Y ★★
()
Ответ на: комментарий от splinter

В виде 24 битного инта - наверняка. :) Как структура из трех чаров - возможно.

BRE ★★
()
Ответ на: комментарий от splinter
typedef char INT24[3];

И добавить пару макросов по вкусу. Типа INT24_TO_32/INT32_TO_24

anonymous
()
Ответ на: комментарий от prischeyadro

нету потому что они по правде находятся в stdint-gcc.h, а он отрабатывает только если:

#if __STDC_HOSTED__
# if defined __cplusplus && __cplusplus >= 201103L
#  undef __STDC_LIMIT_MACROS
#  define __STDC_LIMIT_MACROS
#  undef __STDC_CONSTANT_MACROS
#  define __STDC_CONSTANT_MACROS
# endif
# include_next <stdint.h>
#else
# include "stdint-gcc.h"
#endif

splinter ★★★★★
() автор топика
typedef int8_t INT8;
...
typedef Хрез_знает_что INT128;
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от beastie

Ты забыл выравнивание. Жопа может случиться.

Eddy_Em ☆☆☆☆☆
()

не лучший способ но как вариант для неприятных случаев

int8 char

остальное чего нет на текущей платформе как массивы чаров /8 длины.

печаль что свою арифметику и прочее через функции, а не через операторы

это не С++ где есть перегрузка операторов :(

qulinxao ★★☆
()
Ответ на: комментарий от splinter

судя по телепатии это максимальный апаратный целый тип на данной железке/софте.

т.е родной размер машиного слова для арифметики.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

в принципе я так и подозревал, если бы не несколько названий типов с подобной формулировкой.

splinter ★★★★★
() автор топика

Каким образом это можно сделать?

например в ASN.1 BER/DER...да и зачем, в указанном стандарте русским по белому написано, что это абстракция/инф.модель,а конкретная реализация из другой оперы. Эдакий вводный стандарт, чтобы было ясно о чём в дальнейшем пойдёт речь - должны быть производные стандарты и спецификации указывающие конкретные способы кодирования и протоколы.

MKuznetsov ★★★★★
()

INT8 int8_t

INT16 int16_t

INT24 int32_t

INT32 int32_t

INT128 struct { uint64_t high; uint64_t low; }

VISIBLE (максимальная длина должна определяться местом использования типа)

это уже надо подключать GMP и использовать длинную арифметику

Legioner ★★★★★
()

Ты собрался реализовывать стек протоколов МЭК 61850, хотя бы в части MMS. Сочувствую тебе.

Или твоя контора собирается воровать/покупать готовое решение?

Если второе, то в библиотеке готовой реализации должны быть все примитивы. Бери готовое. Вот хорошее место, откуда можно воровать чужой код http://libiec61850.com/. Это ссылка на open source проект по реализации МЭК 61850.

Описать типы на pure C не вижу проблем. Описывай все структурами. В структуре массив байтов или что ты там хочешь.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Я знаю о существовании этой библиотеки, мне нужны только типы и некоторые структуры для реализации своего домашнего проекта на кортекс-м4.

splinter ★★★★★
() автор топика
Ответ на: комментарий от beastie

ЕМНИП,

typedef struct {
    int64_t internal[2];
}   INT128;

правильнее, в противном случае, последовательность хранимых чисел не гарантирована

аналогично, инт24 надо делать через массив int8, но там ещё и выравнивание

next_time ★★★★★
()

VISIBLE (максимальная длина должна определяться местом использования типа)

пфффф

typedef struct {
   char* data;
   unsigned int size;
} VISIBLE;

add(VISIBLE x, long long ll);

...

VISIBLE x; x.size = 100; add(x, 3);

Примерно так.

next_time ★★★★★
()
Последнее исправление: next_time (всего исправлений: 1)
Ответ на: комментарий от splinter

мне нужны только типы и некоторые структуры для реализации своего домашнего проекта

Понятно, но если проект домашний, может стоит посмотреть в сторону протокола DNP 3.0. В отличии от МЭК 61850, стандарт DNP хоть не наркоманы писали.

pathfinder ★★★★
()
Ответ на: комментарий от splinter

по DNP еще меньше внятной информации, к тому же протокол не так распостранен как 61850.

Я так понимаю, с внятной информацией у тебя проблем нет и ты готов реализовывать 61850.

Не мог бы ты поделиться внятной информацией по сетевому стеку OSI? Я испытываю в этом большую потребность. А то у меня с тем, что ниже rfc1006 сильно плохо с нормальной инфой.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

я понимаю что это сарказм но не понимаю чем я его заслужил. Вопрос состоит не в том что использовать, а как реализовать некоторые типы и структуры в Pure C, оффтоп конечно но в Ade подобные вещи делаются на раз/два.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

я понимаю что это сарказм но не понимаю чем я его заслужил.

Это не сарказм, ты меня неправильно понял. Я действительно хотел бы получить больше материалов тем или иным образом, связанным с 61850. Я сам когда-то хотел реализовать протокол 61850, но, к своему стыду, нИасилил. :(

Запоролся в самом начале, на реализации сетевого стека OSI. Хорошей документации у меня нет, а то что есть, там можно мозги сломать.

Раз ты тоже собираешься иметь дело с 61850, возможно у тебя есть что-то хорошее в плане документации или других материалов информационного характера.

61850 ужасен внутри, но этот протокол берет на вооружение российская энергетика. Получается, что выбора особого нет, все придется иметь с ним дело.

pathfinder ★★★★
()

Что мешает использовать битовые поля?

unsigned int var:24;

energyclab
()
Ответ на: комментарий от pathfinder

но этот протокол берет на вооружение российская энергетика.

Ага. Протокол сурьезный. Вроде как все в XML-лах передается по сети. Нужен жииирный канал.. :)

Я в свое время отвертелся от него в пользу DNP3 (реализовывал частично некоторые запросы для некоторых пойнтов ввода/вывода, т.к. все реализовывать - это ппц.. ).

Но если ТС-у нужно для домашних целей - то зачем ему этот монстр 61850? Не проще ли выбрать что-нить попроще? (привет ModBus)

kuzulis ★★
()
Ответ на: комментарий от pathfinder

UPD: Где-то в сети есть софтина - симулятор протоколов (там и 61850 и 101/102/103/104 и DNP и прочее). Естественно, он триальный. В нем можно поразбираться как протоколы работают (поразбирать пакеты). Мы его пользовали. Но вот только не припомню как она называется (и не помню чтобы там 61850 был.. хотя..)..

kuzulis ★★
()
Ответ на: комментарий от kuzulis

Где-то в сети есть софтина - симулятор протоколов (там и 61850 и 101/102/103/104 и DNP и прочее)

Triangle protocol test harness.

и не помню чтобы там 61850 был.. хотя..

Там не был, но у этой же конторы есть отдельный продукт «IEC 61850 Test Suite».

Я угадал?

pathfinder ★★★★
()
Ответ на: комментарий от splinter

а как я тебе модбасом автотрансформатор опишу?

Гы. А что, подразумевается подключать твою поделку к всяким таким «энергетическим» железякам и мониторить их через SCADA?

На даче что-ли у тебя автотрансформатор стоит, и ты хочешь как энергетик из РДУ/МСК/РСК сидеть в кресле с плюшкой и кофиечком и смотреть сто там у тебя с автортансформатором на даче (не сперли ли цыгане и ни распилили на медь) ? :)

А серьезно - да нет проблем как в ModBus загонять параметры (напругу/тог/косинус-фи и прочие ништяки). В чем проблема то?

Ну, на крайкий случай можно взять IEC(МЭК) 101/104 протокол - он именно для энергетики тоже.

Зачем такие сложности? Оно того стоит? (я просто не представляю)

kuzulis ★★
()
Ответ на: комментарий от kuzulis

Еще вроде спеки на 61850/DNP закрытые (нужны денюжки чтобы купить), если не ошибаюсь. Мы их (на DNP3) доставали у какого-то парня, который нам их слил по-секрету :)

kuzulis ★★
()
Ответ на: комментарий от kuzulis

modbus не предоставляет метку времени, а для описания автотранстформатора в 61850 существует спец класс.

splinter ★★★★★
() автор топика
Ответ на: комментарий от splinter

modbus не предоставляет метку времени, а для описания автотранстформатора в 61850 существует спец класс.

А, ну, тут да - согласен. Но в Modbus можно добавить vendor-specific коды (никто не запрещает сделать расширение), но оно не стандартно.

Кроме того (если не ошибаюсь), в 61850 подразумевается, что синхронизацией/метками занимается некий низший «канальный» (или как его там) уровень, который должны поддерживать специальные роутеры (и другое оборудование) аппаратно, заточенные под это.

Хотя, могу ошибаться - давно я уже не сталкивался с 61850 (да и поверхностное знакомство с ним было).

Но зато IEC101/104/DNP имеют метки времени и всякие solicited/unsolicited сообщения, и полно спецификаций для них + можно скаду потом прикрутить если надо. :)

kuzulis ★★
()
Ответ на: комментарий от splinter

Ну я не знаю как поделиться ГОСТ рункт 5.5.2 «Базовые типы»

Я, конечно, не специалист, но читать вроде умею. Там описан абстрактный интерфейс услуг связи, и в его описании используются эти типа. Как из этого ГОСТа вытекает, что необходимо их определять в языке C, я не понимаю.

Если ты просто собрался реализовывать этот интерфейс, почему нельзя определить INT24 как int32_t?

proud_anon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.