Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 31

Тема: Упрощение функции...

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от feLoNy Посмотреть сообщение
    выдает ошибку - несоответсвие типов невозможно преобразовать BOOL в REAL. че-то я не догоняю как исправить...
    или задать константу
    Код:
    MRxhi: ARRAY[0..9] OF BYTE :=
                2#1000, 2#1100, 2#1110, 2#1111, 2#1111;
    прокатит???
    в итоге в array от 0..5 как я понял (догодался)
    код следующий
    Код:
    plcoutbits := MRxhi [TRUNC(pw1) MOD 1000/10];
    out1 := plcoutbits.0;
    out2 := plcoutbits.1;
    out3 := plcoutbits.2;
    out4 := plcoutbits.3;
    но ошибка та же
    как быть???
    Последний раз редактировалось feLoNy; 23.04.2015 в 12:44.

  2. #2

    По умолчанию

    Цитата Сообщение от feLoNy Посмотреть сообщение
    в итоге в array от 0..5 как я понял (догодался)
    код следующий
    Код:
    plcoutbits := MRxhi [TRUNC(pw1) MOD 1000/10];
    out1 := plcoutbits.0;
    out2 := plcoutbits.1;
    out3 := plcoutbits.2;
    out4 := plcoutbits.3;
    но ошибка та же
    как быть???
    Пока все молчат... Мысль следующая (не молчите, хочу мнения специалистов)
    Код:
    VAR
    	plcoutbits: BYTE;
    	plcout1: BOOL;
    	plcout2: BOOL;
    	plcout3: BOOL;
    	plcout4: BOOL;
    END_VAR
    VAR CONSTANT
    	MRxhi: ARRAY[0..5] OF BYTE :=
                2#1000, 2#1100, 2#1110, 2#1111, 2#1111;
    END_VAR
    plcoutbits := MRxhi [TRUNC(pw1) MOD 1000/10];
    IF plcoutbits.0 THEN
    out1:=1.0;
    ELSE
    out1:=0.0;
    END_IF
    
    IF plcoutbits.1 THEN
    out2:=1.0;
    ELSE
    out2:=0.0;
    END_IF
    
    IF plcoutbits.2 THEN
    out3:=1.0;
    ELSE
    out3:=0.0;
    END_IF
    
    IF plcoutbits.3 THEN
    out4:=1.0;
    ELSE
    out4:=0.0;
    END_IF
    Будет ли работать в реальности??? Или что то где то я ошибся??? Нет пока возможности проверить на живом ПЛК
    и вопрос:
    А как сравнивать байты?... Например нужно включить выход out5 при PWlo от 1 до 9 а при нуле выключить с задержкой через TOF
    актуален как никогда

  3. #3
    Пользователь Аватар для Василий Кашуба
    Регистрация
    20.11.2011
    Адрес
    Ставрополь
    Сообщений
    2,552

    По умолчанию

    Цитата Сообщение от feLoNy Посмотреть сообщение
    ...Будет ли работать в реальности??? Или что то где то я ошибся??? Нет пока возможности проверить на живом ПЛК
    и вопрос:
    А как сравнивать байты?... Например нужно включить выход out5 при PWlo от 1 до 9 а при нуле выключить с задержкой через TOF
    актуален как никогда
    Через ФБ ">" 0, включаете нужный выход через ФБ TOF и когда условие выполнятся не будет, он выключится.

  4. #4
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,154

    По умолчанию

    Цитата Сообщение от feLoNy Посмотреть сообщение
    выдает ошибку - несоответсвие типов невозможно преобразовать BOOL в REAL. че-то я не догоняю как исправить...
    Цитата Сообщение от feLoNy Посмотреть сообщение
    Это уже существует. Велосипед построен и не вариант уже играть с другими мощностями на выход. Пока в таком виде работает, но кучу всего ещё надо додумывать...
    out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!
    out4-out8 - 4 вентилятора которые включаются в зависимости от включенных выходов
    petera, чуть позже возьму бубен и буду стараться вызвать духов с тобой вместе :-D
    В любом варианте хоть с бубном, хоть без для "out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!"
    нужно добавить такой фрагмент
    Код:
    out1:=(TRUNC(pw1)/100)>=1;
    out2:=(TRUNC(pw1)/100)>=2;
    out3:=(TRUNC(pw1)/100)>=3;
    out4:=(TRUNC(pw1)/100)>=4;
    ou1, out2, out3 и out4 должны быть объявлены как BOOL, ведь я полагался на "out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!", т.е. это дискретные выходы.
    А Вы судя по ошибке "невозможно преобразовать BOOL в REAL" пытаетесь ou1, out2, out3 и out4 объявить как REAL.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  5. #5
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,154

    По умолчанию

    Цитата Сообщение от petera Посмотреть сообщение
    В любом варианте хоть с бубном, хоть без для "out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!"
    нужно добавить такой фрагмент
    Код:
    out1:=(TRUNC(pw1)/100)>=1;
    out2:=(TRUNC(pw1)/100)>=2;
    out3:=(TRUNC(pw1)/100)>=3;
    out4:=(TRUNC(pw1)/100)>=4;
    ou1, out2, out3 и out4 должны быть объявлены как BOOL, ведь я полагался на "out1-out4 - 4 "шага" по 100 кВт... Суммарная мощность 500 кВт!", т.е. это дискретные выходы.
    А Вы судя по ошибке "невозможно преобразовать BOOL в REAL" пытаетесь ou1, out2, out3 и out4 объявить как REAL.
    ЗЫ. Не заметил, что исходные данные были
    Цитата Сообщение от feLoNy Посмотреть сообщение
    Собственно вопрос в следующем: как упростить это:
    Код:
    (*
    mrout1:=TRUE; #1 кВт
    mrout2:=TRUE; #2 кВт
    mrout3:=TRUE; #2 кВт
    mrout4:=TRUE; #5 кВт
    mrout5:=TRUE; #10 кВт
    mrout6:=TRUE; #10 кВт
    mrout7:=TRUE; #20 кВт
    mrout8:=TRUE; #50 кВт
    out1:=1.0; #100 кВт
    out2:=1.0; #100 кВт
    out3:=1.0; #100 кВт
    out4:=1.0; #100 кВт
    out5:=1.0; #
    out6:=1.0; #
    out7:=1.0; #
    out8:=1.0; #
    *)
    Т.е. ПЛК 73/63?
    Тогда так нужно обойти ошибку
    Захват-1.png
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  6. #6
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    13,161

    По умолчанию

    Если я правильно понимаю, на выходах тэны (ну или иные нагреватели) и мощность каждого устройства ломает весь математический ряд, отсюда и своя система исчислений.

    Чтобы набрать 5 кВт надо подать 7 а не 4+1 ну и т.д. То есть надо привести соответствие некой величины к необходимой битовой маске на выходе.

  7. #7
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,154

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Если я правильно понимаю, на выходах тэны (ну или иные нагреватели) и мощность каждого устройства ломает весь математический ряд, отсюда и своя система исчислений.

    Чтобы набрать 5 кВт надо подать 7 а не 4+1 ну и т.д. То есть надо привести соответствие некой величины к необходимой битовой маске на выходе.
    Ну тогда так
    Код:
    VAR
        pw1: REAL;
        mrout1: BOOL;
        mrout2: BOOL;
        mrout3: BOOL;
        mrout4: BOOL;
        mrout5: BOOL;
        mrout6: BOOL;
        mrout7: BOOL;
        mrout8: BOOL;
        loPW1: INT;
        hiPW1: INT;
    END_VAR
    
    loPW1:=TRUNC(pw1) MOD 10;
    hiPW1:=(TRUNC(pw1) MOD 100)/10;
    (*включение выхода*)
    mrout1:=((loPW1 MOD 5)MOD 2)=1;
    mrout2:=(loPW1 MOD 5)>1;
    mrout3:=loPW1=9 OR loPW1=4;
    mrout4:=loPW1>=5;
    mrout5:=(hiPW1 MOD 5) =1 OR (hiPW1 MOD 5)>2;
    mrout6:=hiPW1>8 OR hiPW1=4;
    mrout7:=(hiPW1 MOD 5)>=2;
    mrout8:=hiPW1>=5;
    Захват-1.png

    ЗЫ. Ну если в посте #5 не нравится ряд мощностей для тэнов в двоичном формате, то можно двоично-десятичный применить
    Код:
    (*
    mrout1:=TRUE; #1 кВт
    mrout2:=TRUE; #2 кВт
    mrout3:=TRUE; #4 кВт
    mrout4:=TRUE; #8 кВт
    mrout5:=TRUE; #10 кВт
    mrout6:=TRUE; #20 кВт
    mrout7:=TRUE; #40 кВт
    mrout8:=TRUE; #80 кВт
    *)
    bPW1:=INT_TO_BCD(TRUNC(pw1));
    mrout1:=bPW1.0;
    mrout2:=bPW1.1;
    mrout3:=bPW1.2;
    mrout4:=bPW1.3;
    mrout5:=bPW1.4;
    mrout6:=bPW1.5;
    mrout7:=bPW1.6;
    mrout8:=bPW1.7;
    Вложения Вложения
    Последний раз редактировалось petera; 27.03.2015 в 10:46.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  8. #8
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Код:
    loPW1:=TRUNC(pw1) MOD 10;
    hiPW1:=(TRUNC(pw1) MOD 100)/10;
    (*включение выхода*)
    mrout1:=((loPW1 MOD 5)MOD 2)=1;
    mrout2:=(loPW1 MOD 5)>1;
    mrout3:=loPW1=9 OR loPW1=4;
    mrout4:=loPW1>=5;
    mrout5:=(hiPW1 MOD 5) =1 OR (hiPW1 MOD 5)>2;
    mrout6:=hiPW1>8 OR hiPW1=4;
    mrout7:=(hiPW1 MOD 5)>=2;
    mrout8:=hiPW1>=5;
    ... petera вызывает злых духов. mrout5 можно ещё упростить, наверное, лишь бы вселенная обратно в сингулярность не схлопнулась.

  9. #9
    Пользователь Аватар для petera
    Регистрация
    06.05.2011
    Адрес
    Минск
    Сообщений
    4,154

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    ... petera вызывает злых духов. mrout5 можно ещё упростить, наверное, лишь бы вселенная обратно в сингулярность не схлопнулась.
    Ну тогда без бубна
    В вашем варианте
    Код:
    VAR
        mrbits: BYTE;
        pw1: REAL;
        mrout1: BOOL;
        mrout2: BOOL;
        mrout3: BOOL;
        mrout4: BOOL;
        mrout5: BOOL;
        mrout6: BOOL;
        mrout7: BOOL;
        mrout8: BOOL;
    END_VAR
    VAR CONSTANT
        MRlo: ARRAY[0..9] OF BYTE :=
                2#00000000, 2#00000001, 2#00000010, 2#00000011, 2#00000110,
                2#00001000, 2#00001001, 2#00001010, 2#00001011, 2#00001110;
        MRhi:ARRAY[0..9] OF BYTE :=
                2#00000000, 2#00010000, 2#01000000, 2#01010000, 2#01110000,
                2#10000000, 2#10010000, 2#11000000, 2#11010000, 2#11110000;
    END_VAR
    mrbits := MRlo[TRUNC(pw1) MOD 10] + MRhi[(TRUNC(pw1) MOD 100)/10];
    mrout1 := mrbits.0;
    mrout2 := mrbits.1;
    mrout3 := mrbits.2;
    mrout4 := mrbits.3;
    mrout5 := mrbits.4;
    mrout6 := mrbits.5;
    mrout7 := mrbits.6;
    mrout8 := mrbits.7;
    Не 100 значений набивать, а всего 20. Вероятность ошибиться меньше, да и модифицировать константы проще, если "десятки" или "единицы" другие будут.
    Последний раз редактировалось petera; 27.03.2015 в 14:03.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Мой канал на РУТУБЕ
    https://rutube.ru/channel/23641433/
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  10. #10
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Да, так чистенько. Только комментарии добавить типа (* маска на единицы кВт *), (* маска на десятки кВт *) и + на OR заменить, чтобы при вероятной попытке что-то поменять две единицы на одной позиции бадабум какой-нибудь не устроили.

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Похожие темы

  1. Пользовательские функции modbus
    от dnsss в разделе ПЛК3xx (архив)
    Ответов: 0
    Последнее сообщение: 29.01.2015, 19:57
  2. Функции.
    от Jonikk в разделе Программируемые реле
    Ответов: 11
    Последнее сообщение: 13.09.2011, 17:57
  3. Функции
    от mettled в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 13.02.2008, 10:16

Ваши права

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