Russian Qt Forum
Октябрь 02, 2024, 11:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как создать класс с "меняющейся начинкой" ?  (Прочитано 19134 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #15 : Январь 19, 2009, 14:18 »

Цитировать
Но все же классы контейнеров являются не самоцелью, а частью решения. Например что межает заменить класс Registr на QVariant?

т.е имеете ввиду наследовать от QVariant ? или я чо - то не понял Улыбающийся ?

а  вообще-то первоначально класс выглядел так:

Код:
typedef enum TModbusRegisterType { rt0x, rt1x, rt3x, rt4x}


class TModbusRegister
{
public:
    TModbusRegister(TModbusRegisterType regtype);
    TModbusRegisterType getType();                                  //получить тип регистра
    quint16 getAddress();                                           //получить адрес регистра
    quint16 getValue();                                             //получить значение регистра
    void setAddress(quint16 regaddress);                            //установить адрес регистра
    void setValue(quint16 regvalue);                                //установить значение регистра !!!
private:
    TModbusRegisterType type_;
    quint16 address_;
    quint16 value_;
}
« Последнее редактирование: Январь 19, 2009, 14:23 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #16 : Январь 19, 2009, 14:21 »

Цитировать
В любой спешке виноваты блохи. Либо они на теле, либо в голове...
сие высказывание не несет полезной инфы! увы!
в принципе да.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #17 : Январь 19, 2009, 14:26 »

и если использовать QVariant - то переписать так наверное придется:

Код:
typedef enum TModbusRegisterType { rt0x, rt1x, rt3x, rt4x}


class TModbusRegister
{
public:
    TModbusRegister(TModbusRegisterType regtype);
    TModbusRegisterType getType();                                  //получить тип регистра
    quint16 getAddress();                                           //получить адрес регистра
    QVariant getValue();                                             //получить значение регистра !!!!!!!!!!!!!!!!!!
    void setAddress(quint16 regaddress);                            //установить адрес регистра
    void setValue(QVariant regvalue);                                //установить значение регистра !!!!!!!!!!!
private:
    TModbusRegisterType type_;
    quint16 address_;
    QVariant value_;                                                //!!!!!!!!!
}
Записан

ArchLinux x86_64 / Win10 64 bit
Dendy
Гость
« Ответ #18 : Январь 19, 2009, 14:29 »

В этом случае можно заменить value_ на QVariant. Но нужно понимать что это оверхед. Если в качестве значения не будут использоваться классы (а только bool, int, qint16 и т.п.) - вместо QVariant лучше использовать union:

Код:
class TModbusRegister
{
public:
    TModbusRegister(TModbusRegisterType regtype);
    TModbusRegisterType getType();                                  //получить тип регистра
    quint16 getAddress();                                           //получить адрес регистра
    quint16 getValue();                                             //получить значение регистра
    void setAddress(quint16 regaddress);                            //установить адрес регистра
    void setValue(quint16 regvalue);                                //установить значение регистра !!!
private:
    TModbusRegisterType type_;
    quint16 address_;
    union
    {
        bool boolValue_;
        qint16 int16Value_;
    };
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #19 : Январь 19, 2009, 14:36 »

Цитировать
В этом случае можно заменить value_ на QVariant. Но нужно понимать что это оверхед. Если в качестве значения не будут использоваться классы (а только bool, int, qint16 и т.п.) - вместо QVariant лучше использовать union:
дадада! никаких классов в качестве значений не будет!

но непонятно с юнионами... как будут выглядеть тогда ф-ции:
Код:
quint16 getValue(); 
и
Код:
void setValue(quint16 regvalue); 

Непонимающий
Записан

ArchLinux x86_64 / Win10 64 bit
Dendy
Гость
« Ответ #20 : Январь 19, 2009, 14:50 »

Почитайте про union в интернете.
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #21 : Январь 19, 2009, 15:03 »

но непонятно с юнионами... как будут выглядеть тогда ф-ции:
Тут (в сорцах) посмотри как сделано.
http://squirrel-lang.org/
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Tonal
Гость
« Ответ #22 : Январь 20, 2009, 09:47 »

Но все же классы контейнеров являются не самоцелью, а частью решения. Например что межает заменить класс Registr на QVariant?
Тут имелось в виду, что непонятно зачем тебе вообще понадобились такие классы?
Зачем нужны эти классы Registr? Что с их помощью ты делаешь?
Эмулятор процессора? Калькулятор? Интерпретатор своего мегаскрипта?

Если это не учебное задание, то вполне можно под подобные задачи найти какое-нибудь удобное решение а не кодировать всё с 0 не зная языка. Улыбающийся

Если же это таки задание - то имеет смысл разобраться и с объединениями и с шаблонами самостоятельно.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #23 : Январь 20, 2009, 10:17 »

Цитировать
Тут имелось в виду, что непонятно зачем тебе вообще понадобились такие классы?
Зачем нужны эти классы Registr? Что с их помощью ты делаешь?
Эмулятор процессора? Калькулятор? Интерпретатор своего мегаскрипта?

Улыбающийся см. http://ru.wikipedia.org/wiki/Modbus

я просто имею "творческий" порыв сделать хоть чо-то полезное в жизни! Улыбающийся а именно - эти все мои вопросы связаны с началом реализации мной некоего "велосипеда" SCADA системы Улыбающийся

кроме класса "регистр" - планирую сделать класс "контроллер" и потом класс "канал"...

т.е в канале имеются контроллеры  - а в контроллерах регистры!

структура такая:

модуль ---> канал1 ---> контроллер1 ---> регистры 4х
            |                   |--> контроллер2 ---> регистры 4х
            |                                                |--> регистры 3х
            |--> канал2 ---> контроллер1 ---> регистры 4х
...........................................................................................
...........................................................................................
...........................................................................................

и т.п.
 
это все реализация "модуля" Modbus !!!

1. регистры имеют разные типы: 0x,1x,3x,4x
2. контроллеры в принципе - один класс (тип)
3. каналы - тоже разные классы  (типы) : ModbusRTUMaster, ModbusRTUSlave,ModbusTCPMaster, ModbusTCPSlave

Улыбающийся

Цитировать
Если это не учебное задание, то вполне можно под подобные задачи найти какое-нибудь удобное решение а не кодировать всё с 0 не зная языка. Улыбающийся

да! кое чего не знаю! Улыбающийся но кодировать придется с 0 !
« Последнее редактирование: Январь 20, 2009, 10:20 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #24 : Январь 20, 2009, 10:19 »

я для модбаса классы не городил, неудобно, все эти хахаряхи лучше в БД держать.
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #25 : Январь 20, 2009, 10:25 »

Цитировать
я для модбаса классы не городил, неудобно, все эти хахаряхи лучше в БД держать.

идея такая:

1. в БД будет храниться конфигурация модуля, т.е каналов - контроллеров - регистров...
2. при инициализации модуля - он читает свою конфу из БД и в соответствии с ней создает в памяти соосветствующие структуры данных... (чтобы постоянно не считывать конфу из БД и не "шуршать" винтом - а держать в оперативе)
3. тек значения опрошенных регистров пишет в БД только при их изменении (стобы не шуршать "винтом") и т.п
Записан

ArchLinux x86_64 / Win10 64 bit
lenny
Гость
« Ответ #26 : Октябрь 13, 2011, 21:40 »

UP!!!
А велосипед готов?
Не получается работать с эмулятором MBTCPSlave, коннект устанавливается, а регистры не поменять, может MBTCPSlave косой или я MBAP написать не могу(остальное вроде по спецификации). Как через сокет мастер работает?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #27 : Октябрь 13, 2011, 22:04 »

Цитировать
UP!!!
А велосипед готов?
Не получается работать с эмулятором MBTCPSlave, коннект устанавливается, а регистры не поменять, может MBTCPSlave косой или я MBAP написать не могу(остальное вроде по спецификации). Как через сокет мастер работает?
Не, не готов. Я даж скромную библиотечку для последовательного порта еще не осилил, а уж было замахнулся на что-то большее Улыбающийся

Для эмуляции - есть хорошие утилитки (под винду) : Modsim32 и Modscan32, но их нада крякать Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
lenny
Гость
« Ответ #28 : Октябрь 13, 2011, 23:32 »

Вот к сожалению все их надо крякать.
Записан
lenny
Гость
« Ответ #29 : Октябрь 14, 2011, 11:10 »

Разобрался. Зачем они за эти программки деньги просят.
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.