Страница 978 из 1056 ПерваяПервая ... 4788789289689769779789799809881028 ... ПоследняяПоследняя
Показано с 9,771 по 9,780 из 10557

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

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

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    ....
    Переменные Float должны быть с чётными адресами, у вас все с нечётными, просто следите за этим, добавьте 2 байта в начале.
    Можно руками не добавлять 2 байта в начало. Само все автоматом выравняется до ближайшего четного адреса, просто нужно это (автосмещение) учитывать при назначении адресов соответствующим элементам на экране панели.
    Мой канал на ютубе
    https://www.youtube.com/c/ПетрАртюков
    Библиотека ГМ для СП300
    https://disk.yandex.com/d/gHLMhLi8x1_HBg

  2. #9772

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Код:
    struct_original_8AC  //РЭ
      SRD : array[1..8] of int;
      Read : array[1..8,1..3] of word;
    end_struct
    
    original_8AC at %... : struct_original_8AC;   //регистр 16#118 
    
    enum_status( //РЭ
      status_ok := 0,
      ..
      status_break := 16#F00D,
      ..
    );
    
    struct_ai
      status : enum_status;
      cyclic : word;
      value : real;
    end_struct
    
    ai : array[1..8] of struct_ai;
    p : pointer to dword;
    Код:
    for i := 1 to 8 do
      ai[i].status := original_8AC.SRD[i];
      ai[i].cyclic := original_8AC.Read[i,3];
      p := adr(ai[i].value);
      p^ := original_8AC.Read[i,1] * 16#10000 + original_8AC.Read[i,2];
    end_for

    Когда данные приходят от нескольких МВА, в String input очередность байт будет сначала по первому МВА и тд.?
    Чтобы мне получить я создаю тип:
    Код:
    TYPE AI :
    STRUCT
    	ai : ARRAY[1..8] OF struct_ai;
    END_STRUCT
    END_TYPE
    
    all_ai:ARRAY[1..10] OF AI;
    И в цикле заполняю all_ai поочереди элементами ai?

    Хотя проще наверное сделать на каждый МВА отдельный String input.
    Последний раз редактировалось senkos; 01.08.2023 в 11:29.

  3. #9773

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Когда данные приходят от нескольких МВА, в String input очередность байт будет сначала по первому МВА и тд.?
    И в цикле заполняю all_ai поочереди элементами ai?

    Хотя проще наверное сделать на каждый МВА отдельный String input.
    Просто так не получится, потому, что original_8AC AT %QB6.1.0.0 : struct_original_8AC; адрес жёстко прописан.
    А вам надо адрес менять, как у остальных String, которые надо добавить
    и ещё добавить UMD (универсал модбас девайс) с адресами как у модулей, в которые String и добавить.
    Последний раз редактировалось kondor3000; 01.08.2023 в 14:33.

  4. #9774

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Просто так не получится, потому, что original_8AC AT %QB6.1.0.0 : struct_original_8AC; адрес жёстко прописан.
    А вам надо адрес менять, как у остальных String, которые надо добавить
    и ещё добавить UMD (универсал модбас девайс) с адресами как у модулей, в которые String и добавить.
    Из-за строгой привязки к адресам пришлось таким костылем сделать:
    Создал 7шт UMD со String input.
    Код:
    VAR_GLOBAL
    	original_8AC1 AT %QB6.1.0.0	 : struct_original_8AC;
    	original_8AC2 AT %QB6.2.0.0	 : struct_original_8AC;
    	original_8AC3 AT %QB6.3.0.0	 : struct_original_8AC;
    	original_8AC4 AT %QB6.4.0.0	 : struct_original_8AC;
    	original_8AC5 AT %QB6.5.0.0	 : struct_original_8AC;
    	original_8AC6 AT %QB6.6.0.0	 : struct_original_8AC;
    	original_8AC7 AT %QB6.7.0.0	 : struct_original_8AC;
    END_VAR
    VAR
    	original_8AC : ARRAY[1..CountCompressors] OF struct_original_8AC;
    	all_ai	: ARRAY[1..CountCompressors] OF AI;
    END_VAR
    
    original_8AC[1] := original_8AC1;
    original_8AC[2] := original_8AC2;
    original_8AC[3] := original_8AC3;
    original_8AC[4] := original_8AC4;
    original_8AC[5] := original_8AC5;
    original_8AC[6] := original_8AC6;
    original_8AC[7] := original_8AC7;
    
    FOR k := 1 TO CountCompressors DO
    	FOR i := 1 TO 7 DO
    	 all_ai[k].ai[i].status := original_8AC[k].SRD[i];
    	  all_ai[k].ai[i].cyclic := original_8AC[k].Read[i,3];
    	  p := ADR(all_ai[k].ai[i].value);
    	  p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];
    	END_FOR
    END_FOR
    Подскажите пожалуйста можно ли константу вынести на уровень видимости GLOBAL?

  5. #9775

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Из-за строгой привязки к адресам пришлось таким костылем сделать:
    Создал 7шт UMD со String input.
    Подскажите пожалуйста можно ли константу вынести на уровень видимости GLOBAL?
    Там же в Глобальных
    VAR_GLOBAL CONSTANT

    END_VAR

  6. #9776

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение

    Я человек простой. Вижу цикличность - делаю массив
    Код:
    VAR_GLOBAL //этот то накой глобал ?
      original_8AC AT %QB6.1.0 : array[1..7] of struct_original_8AC;
     
    ---------
    for k := 1 to 7 do
      for i := 1 to 8 do
        all_ai[k,i].status := original_8AC[k].SRD[i];
        all_ai[k,i].cyclic := original_8AC[k].Read[i,3];
        p := adr(all_ai[k,i].value);
        p^ := original_8AC[k].Read[i,1] * 16#10000 + original_8AC[k].Read[i,2];
      end_for
    end_for
    //для ПЛК110-М02

    Можно ли в цикле обработать вот эту часть:
    Код:
    VAR_GLOBAL
    	original_8AC1 AT %QB6.1.0.0	 : struct_original_8AC;
    	original_8AC2 AT %QB6.2.0.0	 : struct_original_8AC;
    	original_8AC3 AT %QB6.3.0.0	 : struct_original_8AC;
    	original_8AC4 AT %QB6.4.0.0	 : struct_original_8AC;
    	original_8AC5 AT %QB6.5.0.0	 : struct_original_8AC;
    	original_8AC6 AT %QB6.6.0.0	 : struct_original_8AC;
    	original_8AC7 AT %QB6.7.0.0	 : struct_original_8AC;
    END_VAR
    Нельзя например как то использовать переменные в адресе %QB6.i.0.0
    Я просто не уловил пока разницы в вашем новом коде, извините, но ткните пожалуйста в суть.
    Вы сразу стали использовать двухмерный массив, но так как мне не очень удобно работать с ними, я создал объект AI, а массив его по сути реализует этот же двухмерный массив из ai. Шарпист я )) не могу без объектов ))
    Последний раз редактировалось senkos; 02.08.2023 в 10:16.

  7. #9777

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Можно ли в цикле обработать вот эту часть:
    Нельзя например как то использовать переменные в адресе %QB6.i.0.0
    Я просто не уловил пока разницы в вашем новом коде, извините, но ткните пожалуйста в суть.
    Вы сразу стали использовать двухмерный массив, но так как мне не очень удобно работать с ними, я создал объект AI, а массив его по сути реализует этот же двухмерный массив из ai. Шарпист я )) не могу без объектов ))
    Теперь используется только 1 адрес первого String АТ%QB6.1.0.0, он имеет длину 79 байт, у нас было original_8AC (SRD+Read) =64 байта, для выравнивания структуры добавлен x : string(15); //нужный мусор. Итого 79 байт.
    И чтение 2 original_8AC (SRD+Read ) начнётся с 0 регистра второго String, автоматически.
    То есть ваш костыль можно выкинуть и читать все 7 блоков или больше без проблем.
    Естественно UMD расположить по порядку адресов модулей и String, тоже будут по порядку, один за другим.
    Последний раз редактировалось kondor3000; 02.08.2023 в 14:29.

  8. #9778

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Теперь используется только 1 адрес первого String АТ%QB6.1.0.0, он имеет длину 79 байт, у нас было original_8AC (SRD+Read) =64 байта, для выравнивания структуры добавлен x : string(15); //нужный мусор. Итого 79 байт.
    И чтение 2 original_8AC (SRD+Read ) начнётся с 0 регистра второго String, автоматически.
    То есть ваш костыль можно выкинуть и читать все 7 блоков или больше без проблем.
    Естественно блоки расположить по порядку адресов и String, тоже будут по порядку, один за другим.
    Благодарю! Вот это обалденный паттерн, а есть какие книги или мануалы про это? Интересует что нужно изучить чтобы самостоятельно дойти до такого решения, так как на подсказках много не накодишь.

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    Теперь используется только 1 адрес первого String АТ%QB6.1.0.0
    Но UMD на каждое устройство создавать нужно со String input и адресом slave устройства?
    Последний раз редактировалось senkos; 02.08.2023 в 11:39.

  9. #9779

    По умолчанию

    Цитата Сообщение от senkos Посмотреть сообщение
    Благодарю! Вот это обалденный паттерн, а есть какие книги или мануалы про это? Интересует что нужно изучить чтобы самостоятельно дойти до такого решения, так как на подсказках много не накодишь.



    Но UMD на каждое устройство создавать нужно со String input и адресом slave устройства?
    Конечно нужно, только подряд. UMD расположить по порядку адресов модулей, например 16,17,18,19,20,21,22.
    Адреса String будут тоже по порядку.

    Чтобы дойти, надо знать структуру распределения памяти в ПЛК Овен или иметь большой опыт работы с данными ПЛК.
    Последний раз редактировалось kondor3000; 02.08.2023 в 14:33.

  10. #9780

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    Чуть ранее
    Код:
    struct_original_8AC //++
      command : dword; //6.1.0
      SRD : array[1..8] of int;
      Read : array[1..8,1..3] of word;
      x : string(15); //нужный мусор
    end_struct
    Для чего в структуре прописана переменная command : dword; //6.1.0 ? С ней получается уже не 79 байт, а 83.

Страница 978 из 1056 ПерваяПервая ... 4788789289689769779789799809881028 ... ПоследняяПоследняя

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

Ваши права

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