Страница 987 из 1050 ПерваяПервая ... 4878879379779859869879889899971037 ... ПоследняяПоследняя
Показано с 9,861 по 9,870 из 10492

Тема: ВОПРОС-ОТВЕТ (отвечаем на простые вопросы от новичков)

  1. #9861

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Упаковка и распаковка это про создание WORD из двух BYTE и наоборот?

    А каким образом мне присвоить каждому выходу QB7.10 ... QB7.17 значения из COMPRESSORS[1]? Неужели вручную писать %QB7.10 := COMPRESSORS[1].bSignal12;...

    То есть как мне проитерировать выходы чтобы в цикле их заполнить?
    Или как привязать COMPRESSORS[1..7] OF COMPRESSOR к выходам QB7.xxx
    Упаковка и распаковка, как биты положить или вытащить из маски WORD

    Зачем это всё, ведь написали уже, делаете в слейве 2 байт 96 штук (или 4 байт - 48 штук) и по кладёте структуру по адресу 0 регистра.1 Пример программы.jpg
    В примере есть присвоение регистров из одной структуры в другую, пример упаковки бит в структуру

    Адреса в панели для структуры COMPRESSORS[1..7] :
    bSignal12:WORD; - адрес 4х 0 (биты - 4х0 бит 0, 4х0 бит 1, 4х0 бит 2 ........ 4х0 бит 15 )
    t_1st :INT; - адрес 4х 1
    t_2st :INT; - адрес 4х 2
    t_oil :INT; - адрес 4х 3
    P_1st:REAL; - адрес 4х 4
    P_2st:REAL; - адрес 4х 6
    P_oil :REAL; - адрес 4х 8
    P_water:REAL; - адрес 4х 10 и далее повторяются начиная с 4х 12 ( каждый адрес +12)
    Последний раз редактировалось kondor3000; 24.08.2023 в 23:48.

  2. #9862

    По умолчанию

    Благодарю Вас! Наконец то я врубился и нашел свою запарку.
    Я прописывал compressors AT %QB7.10 : ARRAY[1..7] OF COMPRESSOR; и мне выдавало ошибку не верный адрес, думал значит не катит этот метод присваивания.
    то есть %QB а нужно было %QW если все WORDы делать или %QD если все в DWORD, брал адрес подэлемента а не его переменной.

  3. #9863

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    делаете в слейве 2 байт 96 штук (или 4 байт - 48 штук)
    Scr-2.jpg
    Как вы рассчитали что нужно 48шт по 4BYTE? это 192 байта.
    Массив COMPRESSORS[1..7] занимает 168 байт, то есть можно было 42 по 4BYTE создать?

  4. #9864

    По умолчанию

    У меня compressors AT%QD14.1.0 : ARRAY [1..8] OF COMPRESSOR; это пример, по которому и считал

    Пересчитайте для своего COMPRESSORS[1..7]

  5. #9865

    По умолчанию

    Думаю правильно ли такой подход:
    всю логику обработки данных с каждого МВ я прописал внутри CASE и что то мне кажется что на обработку каждого канала не будет хватать времени или этот код внутри будет отработан синхронно и не переключится на опрос следующего МВ пока не завершится код до END_CASE?
    Код:
    IF last_error = 0 THEN
      k := DWORD_TO_INT( last_address - 15);
      CASE k OF 1..7:
          compressors[k].bSignal1 := 0;
    	IF  BIT_OF_BYTE(on_off, (k - 1)) = TRUE THEN (* Если компрессор включен то выполняем считывание и заполнение данными*)
          compressors[k].bSignal1 := 1;
    	    FOR i := 1 TO 8 DO (* Записываем данные по 8 каналам МВ*)
           	  all_ai[k].ai[i].status := original_8AC[k].SRD[i];
    	 	   p := ADR(all_ai[k].ai[i].value);
    	 	   p^ := 0;
    	 	   all_ai[k].ai[i].cyclic := 0;
    
    			IF original_8AC[k].SRD[i] = 0 THEN (* если статус измерения успешен*)
    		  		all_ai[k].ai[i].cyclic := original_8AC[k].Read[i,3];
    		 		 p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];
    
    					CASE i OF
    					1 : 	compressors[k].t_1st := REAL_TO_INT( all_ai[k].ai[i].value );
    					2 : 	compressors[k].t_2st := REAL_TO_INT (all_ai[k].ai[i].value );
    					3 : 	compressors[k].t_oil := REAL_TO_INT ( all_ai[k].ai[i].value );
    					4 : 	compressors[k].P_1st := all_ai[k].ai[i].value;
    					5 : 	compressors[k].P_2st := all_ai[k].ai[i].value;
    					6 : 	compressors[k].P_oil := all_ai[k].ai[i].value;
    					7 : 	compressors[k].P_water := all_ai[k].ai[i].value;
    					END_CASE;
    
    					IF compressors[k].t_1st  > ust_T1st THEN
    							compressors[k].bSignal2.0 := Alarm(k, temp_1st);
    					END_IF
    					IF compressors[k].t_2st  > ust_T2st THEN
    						compressors[k].bSignal2.1 := Alarm(k, temp_2st);
    					END_IF
    					IF compressors[k].t_oil  > ust_Toil THEN
    						compressors[k].bSignal2.2 := Alarm(k, temp_oil);
    					END_IF
    					IF compressors[k].P_1st  > ust_P1st THEN
    						compressors[k].bSignal2.3 := Alarm(k, davl_1st);
    					END_IF
    					IF compressors[k].P_2st  > ust_P2st THEN
    						compressors[k].bSignal2.4 := Alarm(k, davl_2st);
    					END_IF
    
    				(* Таймер при включении компрессора от сработки по нижнему давлению масла*)
    				TON_1( IN := BYTE_TO_BOOL( compressors[k].bSignal1), PT := timer_start );
    				IF TON_1.Q = TRUE THEN
    					IF compressors[k].P_oil  < ust_Poil_min  THEN
    						compressors[k].bSignal2.5 := Alarm(k, davl_oil_min);
    					END_IF
    				END_IF
    					IF  compressors[k].P_oil  > ust_Poil_max THEN
    						compressors[k].bSignal2.5 := Alarm(k, davl_oil_max);
    					END_IF
    					IF compressors[k].P_water  < ust_Pwater THEN
    						(* compressors[k].bSignal2.6 := Alarm(k, davl_water) *);
    					END_IF
    			END_IF
    	    END_FOR
    	END_IF
      END_CASE
    END_IF
    
    
    last_error := 0;

  6. #9866

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Думаю правильно ли такой подход:
    всю логику обработки данных с каждого МВ я прописал внутри CASE и что то мне кажется что на обработку каждого канала не будет хватать времени или этот код внутри будет отработан синхронно и не переключится на опрос следующего МВ пока не завершится код до END_CASE?
    Что такое BIT_OF_BYTE ? Вы хоть на ошибки код проверяйте, компиляция всё показывает


    А в эмуляции и проверить код можно.
    Последний раз редактировалось kondor3000; 25.08.2023 в 12:26.

  7. #9867

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Что такое BIT_OF_BYTE ? Вы хоть на ошибки код проверяйте, компиляция всё показывает
    А в эмуляции и проверить код можно.
    Всегда сначала компилирую и проверяю отсутствие ошибок (F11), ошибок нет в проекте, он работает и считывает все с МВ без эмуляции.

    BIT_OF_BYTE - это функция проверки в байте определенного бита.

    Не могу понять почему при запуске до нажатия Start в compressors[k].bSignal2 = 32 (должно же быть все 0 по битам), или это Retain уже переменная и ее нужно как то при запуске сбрасывать?
    Вложения Вложения
    Последний раз редактировалось senkos; 25.08.2023 в 13:21.

  8. #9868

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение

    Не могу понять почему при запуске до нажатия Start в compressors[k].bSignal2 = 32 (должно же быть все 0 по битам), или это Retain уже переменная и ее нужно как то при запуске сбрасывать?
    Просто нажмите сброс перед Стартом.
    Не на то вы смотрите, у вас при старте, неверный индекс массива. Зря вы CASE i OF вложили в цикл FOR
    Это надо было отдельно делать.
    Последний раз редактировалось kondor3000; 25.08.2023 в 13:55.

  9. #9869

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Просто нажмите сброс перед Стартом.
    Не на то вы смотрите, у вас при старте, неверный индекс массива. Зря вы CASE i OF вложили в цикл FOR
    Это надо было отдельно делать.
    Простите, но тут задается же изначально 1 (16-15)
    Код:
     k := DWORD_TO_INT( last_address - 15);
      CASE k OF 1..7:
    или вы про другой индекс?

  10. #9870

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Я же написал, Зря вы CASE i OF вложили в цикл FOR. Это надо было отдельно делать.
    И вкладывать надо наоборот
    удалил вообще весь код, нет ничего
    Запускаю, нажимаю Сброс и все так же compressors[1].bSignal2 = 32 и по датчикам так же хранятся данные с прошлых измерений в compressors[1].t_1st = 22 и по давлению тоже есть значение.
    Какой то шайтан, откуда приходит эта единичка в пятом бите bSignal2.
    И в 4BYTE выходах тоже есть данные, они по ходу и влияют, но откуда они там берутся
    Scr-3.jpg
    Последний раз редактировалось senkos; 25.08.2023 в 15:16.

Страница 987 из 1050 ПерваяПервая ... 4878879379779859869879889899971037 ... ПоследняяПоследняя

Метки этой темы

Ваши права

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